aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2018-09-10 16:32:55 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2018-09-10 16:32:55 +0000
commitdcaa814d350c5ee7deb2164502a24f2f698b9799 (patch)
tree9cb62373e6c424da021043a171564ced3bb19501
parent4aea2433fa04a7a86c8972869bd021b7a3622dc8 (diff)
downloadsrc-dcaa814d350c5ee7deb2164502a24f2f698b9799.tar.gz
src-dcaa814d350c5ee7deb2164502a24f2f698b9799.zip
Vendor import of Unbound 1.8.0.vendor/unbound/1.8.0
Notes
Notes: svn path=/vendor/unbound/dist/; revision=338566 svn path=/vendor/unbound/1.8.0/; revision=338567; tag=vendor/unbound/1.8.0
-rw-r--r--Makefile.in110
-rw-r--r--cachedb/cachedb.c1
-rwxr-xr-xconfigure316
-rw-r--r--configure.ac39
-rw-r--r--contrib/fastrpz.patch8
-rw-r--r--contrib/libunbound.pc.in3
-rw-r--r--contrib/unbound.service.in7
-rw-r--r--daemon/cachedump.c1
-rw-r--r--daemon/daemon.c41
-rw-r--r--daemon/daemon.h2
-rw-r--r--daemon/remote.c71
-rw-r--r--daemon/stats.c43
-rw-r--r--daemon/unbound.c7
-rw-r--r--daemon/worker.c166
-rw-r--r--dns64/dns64.c131
-rw-r--r--doc/Changelog249
-rw-r--r--doc/README4
-rw-r--r--doc/example.conf.in42
-rw-r--r--doc/libunbound.3.in4
-rw-r--r--doc/unbound-anchor.8.in7
-rw-r--r--doc/unbound-checkconf.8.in2
-rw-r--r--doc/unbound-control.8.in26
-rw-r--r--doc/unbound-host.1.in10
-rw-r--r--doc/unbound.8.in4
-rw-r--r--doc/unbound.conf.5.in103
-rw-r--r--edns-subnet/subnetmod.c12
-rw-r--r--edns-subnet/subnetmod.h4
-rw-r--r--ipsecmod/ipsecmod.c2
-rw-r--r--iterator/iter_delegpt.h2
-rw-r--r--iterator/iter_fwd.c7
-rw-r--r--iterator/iter_hints.c7
-rw-r--r--iterator/iter_utils.c26
-rw-r--r--iterator/iterator.c189
-rw-r--r--iterator/iterator.h3
-rw-r--r--libunbound/context.c34
-rw-r--r--libunbound/libworker.c58
-rw-r--r--libunbound/python/examples/dnssec_test.py1
-rw-r--r--libunbound/unbound-event.h2
-rw-r--r--libunbound/unbound.h13
-rw-r--r--libunbound/worker.h6
-rw-r--r--pythonmod/doc/examples/example6.rst61
-rw-r--r--pythonmod/examples/inplace_callbacks.py103
-rw-r--r--pythonmod/examples/resip.py20
-rw-r--r--pythonmod/interface.i17
-rw-r--r--pythonmod/pythonmod.h3
-rw-r--r--respip/respip.c5
-rw-r--r--services/authzone.c124
-rw-r--r--services/authzone.h20
-rw-r--r--services/cache/dns.c6
-rw-r--r--services/cache/dns.h12
-rw-r--r--services/cache/infra.c36
-rw-r--r--services/cache/rrset.c4
-rw-r--r--services/listen_dnsport.c15
-rw-r--r--services/listen_dnsport.h10
-rw-r--r--services/localzone.c128
-rw-r--r--services/mesh.c54
-rw-r--r--services/mesh.h10
-rw-r--r--services/outside_network.c66
-rw-r--r--sldns/rrdef.c7
-rw-r--r--sldns/rrdef.h4
-rw-r--r--smallapp/unbound-anchor.c66
-rw-r--r--smallapp/unbound-checkconf.c61
-rw-r--r--smallapp/unbound-control.c36
-rw-r--r--smallapp/unbound-host.c8
-rw-r--r--smallapp/worker_cb.c6
-rw-r--r--testcode/fake_event.c21
-rw-r--r--testcode/replay.h3
-rw-r--r--testcode/streamtcp.16
-rw-r--r--testcode/streamtcp.c26
-rw-r--r--testcode/unitauth.c16
-rw-r--r--testcode/unitldns.c20
-rw-r--r--testcode/unitmain.c3
-rw-r--r--testcode/unitmsgparse.c23
-rw-r--r--testcode/unitverify.c51
-rw-r--r--testdata/autotrust_init.rpl1
-rw-r--r--testdata/autotrust_init_ds.rpl1
-rw-r--r--testdata/autotrust_init_sigs.rpl1
-rw-r--r--testdata/autotrust_init_zsk.rpl1
-rw-r--r--testdata/black_data.rpl1
-rw-r--r--testdata/black_prime.rpl1
-rw-r--r--testdata/dlv_anchor.rpl1
-rw-r--r--testdata/dlv_ask_higher.rpl1
-rw-r--r--testdata/dlv_below_ta.rpl1
-rw-r--r--testdata/dlv_delegation.rpl1
-rw-r--r--testdata/dlv_insecure.rpl1
-rw-r--r--testdata/dlv_insecure_negcache.rpl1
-rw-r--r--testdata/dlv_remove_empty.rpl1
-rw-r--r--testdata/dlv_remove_nodel.rpl1
-rw-r--r--testdata/dlv_remove_pos.rpl1
-rw-r--r--testdata/dlv_unused.rpl1
-rw-r--r--testdata/dns64_lookup.rpl1
-rw-r--r--testdata/domain_insec_dlv.rpl1
-rw-r--r--testdata/edns_keepalive.rpl126
-rw-r--r--testdata/fetch_glue.rpl1
-rw-r--r--testdata/fetch_glue_cname.rpl1
-rw-r--r--testdata/fwd_cached.rpl2
-rw-r--r--testdata/fwd_compress_c00c.tdir/fwd_compress_c00c.conf1
-rw-r--r--testdata/ipsecmod_enabled.crpl1
-rw-r--r--testdata/ipsecmod_ignore_bogus_ipseckey.crpl1
-rw-r--r--testdata/ipsecmod_max_ttl.crpl1
-rw-r--r--testdata/ipsecmod_strict.crpl1
-rw-r--r--testdata/ipsecmod_whitelist.crpl1
-rw-r--r--testdata/iter_class_any.rpl1
-rw-r--r--testdata/iter_cycle_noh.rpl1
-rw-r--r--testdata/iter_dname_insec.rpl1
-rw-r--r--testdata/iter_domain_sale.rpl1
-rw-r--r--testdata/iter_domain_sale_nschange.rpl1
-rw-r--r--testdata/iter_emptydp.rpl1
-rw-r--r--testdata/iter_emptydp_for_glue.rpl1
-rw-r--r--testdata/iter_fwdfirst.rpl1
-rw-r--r--testdata/iter_fwdfirstequal.rpl1
-rw-r--r--testdata/iter_fwdstub.rpl1
-rw-r--r--testdata/iter_fwdstubroot.rpl1
-rw-r--r--testdata/iter_got6only.rpl1
-rw-r--r--testdata/iter_hint_lame.rpl1
-rw-r--r--testdata/iter_lame_noaa.rpl1
-rw-r--r--testdata/iter_lame_nosoa.rpl1
-rw-r--r--testdata/iter_mod.rpl1
-rw-r--r--testdata/iter_ns_badip.rpl1
-rw-r--r--testdata/iter_ns_spoof.rpl1
-rw-r--r--testdata/iter_pc_a.rpl1
-rw-r--r--testdata/iter_pc_aaaa.rpl1
-rw-r--r--testdata/iter_pcdiff.rpl1
-rw-r--r--testdata/iter_pcdirect.rpl1
-rw-r--r--testdata/iter_pcname.rpl1
-rw-r--r--testdata/iter_pcnamech.rpl1
-rw-r--r--testdata/iter_pcnamechrec.rpl1
-rw-r--r--testdata/iter_pcnamerec.rpl1
-rw-r--r--testdata/iter_pcttl.rpl1
-rw-r--r--testdata/iter_prefetch.rpl1
-rw-r--r--testdata/iter_prefetch_change.rpl1
-rw-r--r--testdata/iter_prefetch_change2.rpl1
-rw-r--r--testdata/iter_prefetch_childns.rpl1
-rw-r--r--testdata/iter_prefetch_fail.rpl1
-rw-r--r--testdata/iter_prefetch_ns.rpl1
-rw-r--r--testdata/iter_primenoglue.rpl1
-rw-r--r--testdata/iter_privaddr.rpl1
-rw-r--r--testdata/iter_ranoaa_lame.rpl1
-rw-r--r--testdata/iter_reclame_one.rpl1
-rw-r--r--testdata/iter_reclame_two.rpl1
-rw-r--r--testdata/iter_recurse.rpl1
-rw-r--r--testdata/iter_resolve.rpl1
-rw-r--r--testdata/iter_resolve_minimised.rpl1
-rw-r--r--testdata/iter_resolve_minimised_nx.rpl1
-rw-r--r--testdata/iter_resolve_minimised_refused.rpl1
-rw-r--r--testdata/iter_resolve_minimised_timeout.rpl1
-rw-r--r--testdata/iter_scrub_cname_an.rpl1
-rw-r--r--testdata/iter_scrub_dname_insec.rpl1
-rw-r--r--testdata/iter_scrub_dname_rev.rpl1
-rw-r--r--testdata/iter_scrub_dname_sec.rpl1
-rw-r--r--testdata/iter_soamin.rpl1
-rw-r--r--testdata/iter_stub_leak.rpl1
-rw-r--r--testdata/iter_stub_noroot.rpl1
-rw-r--r--testdata/iter_stubfirst.rpl1
-rw-r--r--testdata/iter_timeout_ra_aaaa.rpl1
-rw-r--r--testdata/pylib.tdir/pylib.lookup.conf14
-rwxr-xr-xtestdata/pylib.tdir/pylib.lookup.py151
-rw-r--r--testdata/pylib.tdir/pylib.post4
-rw-r--r--testdata/pylib.tdir/pylib.pre13
-rw-r--r--testdata/pylib.tdir/pylib.py159
-rw-r--r--testdata/pylib.tdir/pylib.test48
-rw-r--r--testdata/rrset_rettl.rpl2
-rw-r--r--testdata/rrset_untrusted.rpl2
-rw-r--r--testdata/rrset_updated.rpl2
-rw-r--r--testdata/subnet_cached.crpl1
-rw-r--r--testdata/subnet_max_source.crpl1
-rw-r--r--testdata/subnet_val_positive.crpl1
-rw-r--r--testdata/subnet_val_positive_client.crpl1
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.conf (renamed from testdata/pylib.tdir/pylib.conf)11
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.dsc16
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.post10
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.pre31
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.test42
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.testns42
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.conf16
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.dsc16
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.post10
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.pre31
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.test67
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.testns42
-rw-r--r--testdata/trust_cname_chain.rpl1
-rw-r--r--testdata/ttl_max.rpl1
-rw-r--r--testdata/ttl_min.rpl1
-rw-r--r--testdata/val_adbit.rpl1
-rw-r--r--testdata/val_adcopy.rpl1
-rw-r--r--testdata/val_ds_afterprime.rpl1
-rw-r--r--testdata/val_faildnskey_ok.rpl1
-rw-r--r--testdata/val_keyprefetch_verify.rpl1
-rw-r--r--testdata/val_noadwhennodo.rpl1
-rw-r--r--testdata/val_nsec3_b3_optout.rpl1
-rw-r--r--testdata/val_nsec3_b3_optout_negcache.rpl1
-rw-r--r--testdata/val_positive.rpl1
-rw-r--r--testdata/val_qds_badanc.rpl1
-rw-r--r--testdata/val_qds_oneanc.rpl1
-rw-r--r--testdata/val_qds_twoanc.rpl1
-rw-r--r--testdata/val_referd.rpl1
-rw-r--r--testdata/val_referglue.rpl1
-rw-r--r--testdata/val_rrsig.rpl1
-rw-r--r--testdata/val_spurious_ns.rpl1
-rw-r--r--testdata/val_stub_noroot.rpl1
-rw-r--r--testdata/val_ta_algo_dnskey.rpl1
-rw-r--r--testdata/val_ta_algo_dnskey_dp.rpl1
-rw-r--r--testdata/val_ta_algo_missing_dp.rpl1
-rw-r--r--testdata/val_twocname.rpl1
-rw-r--r--testdata/val_unalgo_anchor.rpl1
-rw-r--r--testdata/val_unalgo_dlv.rpl1
-rw-r--r--testdata/val_wild_pos.rpl1
-rw-r--r--testdata/views.rpl1
-rw-r--r--util/config_file.c69
-rw-r--r--util/config_file.h33
-rw-r--r--util/configlexer.c5469
-rw-r--r--util/configlexer.lex11
-rw-r--r--util/configparser.c3481
-rw-r--r--util/configparser.h900
-rw-r--r--util/configparser.y135
-rw-r--r--util/data/msgparse.h2
-rw-r--r--util/data/msgreply.c41
-rw-r--r--util/data/msgreply.h23
-rw-r--r--util/edns.c83
-rw-r--r--util/edns.h62
-rw-r--r--util/iana_ports.inc2
-rw-r--r--util/module.c10
-rw-r--r--util/module.h42
-rw-r--r--util/net_help.c2
-rw-r--r--util/netevent.c59
-rw-r--r--util/netevent.h15
-rw-r--r--util/rtt.c3
-rw-r--r--util/storage/slabhash.c13
-rw-r--r--util/storage/slabhash.h9
-rw-r--r--util/tcp_conn_limit.c194
-rw-r--r--util/tcp_conn_limit.h130
-rw-r--r--validator/autotrust.c2
-rw-r--r--validator/autotrust.h2
-rw-r--r--validator/val_kcache.c2
-rw-r--r--validator/validator.c35
-rw-r--r--winrc/service.conf16
-rw-r--r--winrc/setup.nsi4
237 files changed, 8968 insertions, 5663 deletions
diff --git a/Makefile.in b/Makefile.in
index 4bdb7059dc0b..e8494484e2dd 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -57,7 +57,7 @@ STRIP=@STRIP@
CC=@CC@
CPPFLAGS=-I. @CPPFLAGS@
PYTHON_CPPFLAGS=-I. @PYTHON_CPPFLAGS@
-CFLAGS=@CFLAGS@
+CFLAGS=-DSRCDIR=$(srcdir) @CFLAGS@
LDFLAGS=@LDFLAGS@
LIBS=@LIBS@
LIBOBJS=@LIBOBJS@
@@ -83,7 +83,7 @@ LINTFLAGS+=@NETBSD_LINTFLAGS@
# compat with OpenBSD
LINTFLAGS+="-Dsigset_t=long"
# FreeBSD
-LINTFLAGS+="-D__uint16_t=uint16_t" "-DEVP_PKEY_ASN1_METHOD=int" "-D_RuneLocale=int" "-D__va_list=va_list" "-D__uint32_t=uint32_t"
+LINTFLAGS+="-D__uint16_t=uint16_t" "-DEVP_PKEY_ASN1_METHOD=int" "-D_RuneLocale=int" "-D__va_list=va_list" "-D__uint32_t=uint32_t" "-D_Alignof(x)=x" "-D__aligned(x)=" "-D__requires_exclusive(x)=" "-D__requires_unlocked(x)=" "-D__locks_exclusive(x)=" "-D__trylocks_exclusive(x)=" "-D__unlocks(x)=" "-D__locks_shared(x)=" "-D__trylocks_shared(x)="
INSTALL=$(SHELL) $(srcdir)/install-sh
@@ -115,8 +115,9 @@ util/config_file.c util/configlexer.c util/configparser.c \
util/shm_side/shm_main.c services/authzone.c \
util/fptr_wlist.c util/locks.c util/log.c util/mini_event.c util/module.c \
util/netevent.c util/net_help.c util/random.c util/rbtree.c util/regional.c \
-util/rtt.c util/storage/dnstree.c util/storage/lookup3.c \
-util/storage/lruhash.c util/storage/slabhash.c util/timehist.c util/tube.c \
+util/rtt.c util/edns.c util/storage/dnstree.c util/storage/lookup3.c \
+util/storage/lruhash.c util/storage/slabhash.c util/tcp_conn_limit.c \
+util/timehist.c util/tube.c \
util/ub_event.c util/ub_event_pluggable.c util/winsock_event.c \
validator/autotrust.c validator/val_anchor.c validator/validator.c \
validator/val_kcache.c validator/val_kentry.c validator/val_neg.c \
@@ -131,9 +132,10 @@ as112.lo msgparse.lo msgreply.lo packed_rrset.lo iterator.lo iter_delegpt.lo \
iter_donotq.lo iter_fwd.lo iter_hints.lo iter_priv.lo iter_resptype.lo \
iter_scrub.lo iter_utils.lo localzone.lo mesh.lo modstack.lo view.lo \
outbound_list.lo alloc.lo config_file.lo configlexer.lo configparser.lo \
-fptr_wlist.lo locks.lo log.lo mini_event.lo module.lo net_help.lo \
+fptr_wlist.lo edns.lo locks.lo log.lo mini_event.lo module.lo net_help.lo \
random.lo rbtree.lo regional.lo rtt.lo dnstree.lo lookup3.lo lruhash.lo \
-slabhash.lo timehist.lo tube.lo winsock_event.lo autotrust.lo val_anchor.lo \
+slabhash.lo tcp_conn_limit.lo timehist.lo tube.lo winsock_event.lo \
+autotrust.lo val_anchor.lo \
validator.lo val_kcache.lo val_kentry.lo val_neg.lo val_nsec3.lo val_nsec.lo \
val_secalgo.lo val_sigcrypt.lo val_utils.lo dns64.lo cachedb.lo redis.lo authzone.lo \
$(SUBNET_OBJ) $(PYTHONMOD_OBJ) $(CHECKLOCK_OBJ) $(DNSTAP_OBJ) $(DNSCRYPT_OBJ) \
@@ -170,7 +172,8 @@ UNITTEST_OBJ_LINK=$(UNITTEST_OBJ) worker_cb.lo $(COMMON_OBJ) $(SLDNS_OBJ) \
$(COMPAT_OBJ)
DAEMON_SRC=daemon/acl_list.c daemon/cachedump.c daemon/daemon.c \
daemon/remote.c daemon/stats.c daemon/unbound.c daemon/worker.c @WIN_DAEMON_SRC@
-DAEMON_OBJ=acl_list.lo cachedump.lo daemon.lo shm_main.lo remote.lo stats.lo unbound.lo \
+DAEMON_OBJ=acl_list.lo cachedump.lo daemon.lo \
+shm_main.lo remote.lo stats.lo unbound.lo \
worker.lo @WIN_DAEMON_OBJ@
DAEMON_OBJ_LINK=$(DAEMON_OBJ) $(COMMON_OBJ_ALL_SYMBOLS) $(SLDNS_OBJ) \
$(COMPAT_OBJ) @WIN_DAEMON_OBJ_LINK@
@@ -190,7 +193,8 @@ UBANCHOR_OBJ=unbound-anchor.lo
UBANCHOR_OBJ_LINK=$(UBANCHOR_OBJ) parseutil.lo \
$(COMPAT_OBJ_WITHOUT_CTIME) @WIN_UBANCHOR_OBJ_LINK@
TESTBOUND_SRC=testcode/testbound.c testcode/testpkts.c \
-daemon/worker.c daemon/acl_list.c daemon/daemon.c daemon/stats.c \
+daemon/worker.c daemon/acl_list.c \
+daemon/daemon.c daemon/stats.c \
testcode/replay.c testcode/fake_event.c
TESTBOUND_OBJ=testbound.lo replay.lo fake_event.lo
TESTBOUND_OBJ_LINK=$(TESTBOUND_OBJ) testpkts.lo worker.lo acl_list.lo \
@@ -306,10 +310,11 @@ longcheck: longtest
test: unittest$(EXEEXT) testbound$(EXEEXT)
./unittest$(EXEEXT)
./testbound$(EXEEXT) -s
- for x in testdata/*.rpl; do echo -n "$$x "; if ./testbound$(EXEEXT) -p $$x >/dev/null 2>&1; then echo OK; else echo failed; exit 1; fi done
+ for x in $(srcdir)/testdata/*.rpl; do echo -n "$$x "; if ./testbound$(EXEEXT) -p $$x >/dev/null 2>&1; then echo OK; else echo failed; exit 1; fi done
@echo test OK
longtest: tests
+ if test ! $(srcdir)/testdata -ef ./testdata; then rm -rf testcode testdata; mkdir testcode testdata; cp -R $(srcdir)/testdata/*.sh $(srcdir)/testdata/*.tdir $(srcdir)/testdata/*.rpl $(srcdir)/testdata/*.crpl testdata; cp $(srcdir)/testcode/*.sh testcode; if test ! -d util; then mkdir util; fi; cp $(srcdir)/util/iana_ports.inc util; fi
if test -x "`which bash`"; then bash testcode/do-tests.sh; else sh testcode/do-tests.sh; fi
lib: libunbound.la unbound.h
@@ -587,7 +592,7 @@ iana_update:
DEPEND_TMP=depend1073.tmp
DEPEND_TMP2=depend1074.tmp
DEPEND_TARGET=Makefile
-DEPEND_TARGET2=Makefile.in
+DEPEND_TARGET2=$(srcdir)/Makefile.in
# actions: generate deplines from gcc,
# then, filter out home/xx, /usr/xx and /opt/xx lines (some cc already do this)
# then, remove empty " \" lines
@@ -595,7 +600,8 @@ DEPEND_TARGET2=Makefile.in
# then, remove srcdir from the (generated) parser and lexer.
# and mention the .lo
depend:
- (cd $(srcdir) ; $(CC) $(DEPFLAG) $(CPPFLAGS) $(CFLAGS) @PTHREAD_CFLAGS_ONLY@ $(ALL_SRC) $(COMPAT_SRC)) | \
+ (BUILDDIR=$$PWD; cd $(srcdir) ; $(CC) $(DEPFLAG) $(CPPFLAGS) $(CFLAGS) -I$$BUILDDIR @PTHREAD_CFLAGS_ONLY@ $(ALL_SRC) $(COMPAT_SRC)) | \
+ sed -e 's?'$$PWD'/config.h?config.h?g' | \
sed -e 's!'$$HOME'[^ ]* !!g' -e 's!'$$HOME'[^ ]*$$!!g' \
-e 's!/usr[^ ]* !!g' -e 's!/usr[^ ]*$$!!g' \
-e 's!/opt[^ ]* !!g' -e 's!/opt[^ ]*$$!!g' | \
@@ -763,7 +769,7 @@ mesh.lo mesh.o: $(srcdir)/services/mesh.c config.h $(srcdir)/services/mesh.h $(s
$(srcdir)/services/modstack.h $(srcdir)/services/outbound_list.h $(srcdir)/services/cache/dns.h \
$(srcdir)/util/net_help.h $(srcdir)/util/regional.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/timehist.h \
$(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/alloc.h $(srcdir)/util/config_file.h \
- $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/wire2str.h $(srcdir)/services/localzone.h \
+ $(srcdir)/util/edns.h $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/wire2str.h $(srcdir)/services/localzone.h \
$(srcdir)/util/storage/dnstree.h $(srcdir)/services/view.h $(srcdir)/util/data/dname.h $(srcdir)/respip/respip.h
modstack.lo modstack.o: $(srcdir)/services/modstack.c config.h $(srcdir)/services/modstack.h \
$(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
@@ -793,10 +799,11 @@ outside_network.lo outside_network.o: $(srcdir)/services/outside_network.c confi
$(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h \
$(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/lruhash.h \
$(srcdir)/util/storage/dnstree.h $(srcdir)/util/rtt.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
- $(srcdir)/sldns/rrdef.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h \
- $(srcdir)/util/random.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/module.h $(srcdir)/util/tube.h \
- $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h $(srcdir)/sldns/sbuffer.h $(srcdir)/dnstap/dnstap.h \
+ $(srcdir)/util/data/packed_rrset.h $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h \
+ $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h \
+ $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h $(srcdir)/util/random.h \
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h \
+ $(srcdir)/sldns/sbuffer.h $(srcdir)/dnstap/dnstap.h \
alloc.lo alloc.o: $(srcdir)/util/alloc.c config.h $(srcdir)/util/alloc.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/testcode/checklocks.h $(srcdir)/util/regional.h $(srcdir)/util/data/packed_rrset.h \
@@ -880,10 +887,11 @@ module.lo module.o: $(srcdir)/util/module.c config.h $(srcdir)/util/module.h $(s
$(srcdir)/sldns/rrdef.h $(srcdir)/sldns/wire2str.h
netevent.lo netevent.o: $(srcdir)/util/netevent.c config.h $(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
$(srcdir)/dnscrypt/cert.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/testcode/checklocks.h $(srcdir)/util/ub_event.h $(srcdir)/util/net_help.h $(srcdir)/util/fptr_wlist.h \
- $(srcdir)/util/storage/lruhash.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
- $(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/testcode/checklocks.h $(srcdir)/util/ub_event.h $(srcdir)/util/net_help.h \
+ $(srcdir)/util/tcp_conn_limit.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/module.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h \
$(srcdir)/services/modstack.h $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/str2wire.h $(srcdir)/dnstap/dnstap.h \
\
@@ -902,7 +910,15 @@ rbtree.lo rbtree.o: $(srcdir)/util/rbtree.c config.h $(srcdir)/util/log.h $(srcd
$(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
$(srcdir)/services/modstack.h
regional.lo regional.o: $(srcdir)/util/regional.c config.h $(srcdir)/util/log.h $(srcdir)/util/regional.h
-rtt.lo rtt.o: $(srcdir)/util/rtt.c config.h $(srcdir)/util/rtt.h
+rtt.lo rtt.o: $(srcdir)/util/rtt.c config.h $(srcdir)/util/rtt.h $(srcdir)/iterator/iterator.h \
+ $(srcdir)/services/outbound_list.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h
+edns.lo edns.o: $(srcdir)/util/edns.c config.h $(srcdir)/util/config_file.h $(srcdir)/util/netevent.h \
+ $(srcdir)/dnscrypt/dnscrypt.h $(srcdir)/dnscrypt/cert.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h $(srcdir)/util/regional.h \
+ $(srcdir)/util/data/msgparse.h $(srcdir)/util/storage/lruhash.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h
dnstree.lo dnstree.o: $(srcdir)/util/storage/dnstree.c config.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/util/rbtree.h $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
$(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h $(srcdir)/util/net_help.h
@@ -916,6 +932,12 @@ lruhash.lo lruhash.o: $(srcdir)/util/storage/lruhash.c config.h $(srcdir)/util/s
$(srcdir)/services/modstack.h
slabhash.lo slabhash.o: $(srcdir)/util/storage/slabhash.c config.h $(srcdir)/util/storage/slabhash.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h
+tcp_conn_limit.lo tcp_conn_limit.o: $(srcdir)/util/tcp_conn_limit.c config.h $(srcdir)/util/regional.h \
+ $(srcdir)/util/log.h $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/util/tcp_conn_limit.h \
+ $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/testcode/checklocks.h \
+ $(srcdir)/services/localzone.h $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/services/view.h $(srcdir)/sldns/str2wire.h
timehist.lo timehist.o: $(srcdir)/util/timehist.c config.h $(srcdir)/util/timehist.h $(srcdir)/util/log.h
tube.lo tube.o: $(srcdir)/util/tube.c config.h $(srcdir)/util/tube.h $(srcdir)/util/log.h $(srcdir)/util/net_help.h \
$(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
@@ -1030,7 +1052,8 @@ dns64.lo dns64.o: $(srcdir)/dns64/dns64.c config.h $(srcdir)/dns64/dns64.h $(src
$(srcdir)/util/storage/slabhash.h $(srcdir)/util/config_file.h $(srcdir)/util/fptr_wlist.h \
$(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
$(srcdir)/dnscrypt/cert.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
- $(srcdir)/services/modstack.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h
+ $(srcdir)/services/modstack.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h \
+ $(srcdir)/util/storage/dnstree.h $(srcdir)/util/data/dname.h $(srcdir)/sldns/str2wire.h
edns-subnet.lo edns-subnet.o: $(srcdir)/edns-subnet/edns-subnet.c config.h \
$(srcdir)/edns-subnet/edns-subnet.h $(srcdir)/util/net_help.h $(srcdir)/util/log.h
subnetmod.lo subnetmod.o: $(srcdir)/edns-subnet/subnetmod.c config.h $(srcdir)/edns-subnet/subnetmod.h \
@@ -1111,12 +1134,13 @@ unitmain.lo unitmain.o: $(srcdir)/testcode/unitmain.c config.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/sldns/keyraw.h \
$(srcdir)/util/log.h $(srcdir)/testcode/unitmain.h $(srcdir)/util/alloc.h $(srcdir)/util/locks.h \
$(srcdir)/testcode/checklocks.h $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h $(srcdir)/util/rtt.h \
- $(srcdir)/util/timehist.h $(srcdir)/libunbound/unbound.h $(srcdir)/services/cache/infra.h \
- $(srcdir)/util/storage/lruhash.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/util/timehist.h $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/libunbound/unbound.h \
+ $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
$(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
- $(srcdir)/dnscrypt/cert.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
- $(srcdir)/util/random.h $(srcdir)/respip/respip.h $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h \
- $(srcdir)/sldns/pkthdr.h $(srcdir)/services/localzone.h $(srcdir)/services/view.h
+ $(srcdir)/dnscrypt/cert.h $(srcdir)/util/random.h $(srcdir)/respip/respip.h $(srcdir)/services/localzone.h \
+ $(srcdir)/services/view.h
unitmsgparse.lo unitmsgparse.o: $(srcdir)/testcode/unitmsgparse.c config.h $(srcdir)/util/log.h \
$(srcdir)/testcode/unitmain.h $(srcdir)/util/data/msgparse.h $(srcdir)/util/storage/lruhash.h \
$(srcdir)/util/locks.h $(srcdir)/testcode/checklocks.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h \
@@ -1194,10 +1218,10 @@ daemon.lo daemon.o: $(srcdir)/daemon/daemon.c config.h \
$(srcdir)/daemon/remote.h \
$(srcdir)/daemon/acl_list.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/services/view.h \
$(srcdir)/util/config_file.h $(srcdir)/util/shm_side/shm_main.h $(srcdir)/util/storage/lookup3.h \
- $(srcdir)/util/storage/slabhash.h $(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/rrset.h \
- $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/services/localzone.h \
- $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h $(srcdir)/util/random.h $(srcdir)/util/tube.h \
- $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h $(srcdir)/respip/respip.h
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/util/tcp_conn_limit.h $(srcdir)/services/listen_dnsport.h \
+ $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h \
+ $(srcdir)/services/localzone.h $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h $(srcdir)/util/random.h \
+ $(srcdir)/util/tube.h $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h $(srcdir)/respip/respip.h
remote.lo remote.o: $(srcdir)/daemon/remote.c config.h \
$(srcdir)/daemon/remote.h \
$(srcdir)/daemon/worker.h $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h \
@@ -1256,10 +1280,10 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h $(srcdir)/util/log.h $(sr
$(srcdir)/services/outbound_list.h $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h \
$(srcdir)/util/rtt.h $(srcdir)/services/cache/dns.h $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h \
$(srcdir)/services/localzone.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h \
- $(srcdir)/validator/autotrust.h $(srcdir)/validator/val_anchor.h $(srcdir)/respip/respip.h \
- $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound-event.h $(srcdir)/libunbound/libworker.h \
- $(srcdir)/sldns/wire2str.h $(srcdir)/util/shm_side/shm_main.h
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/edns.h $(srcdir)/iterator/iter_fwd.h \
+ $(srcdir)/iterator/iter_hints.h $(srcdir)/validator/autotrust.h $(srcdir)/validator/val_anchor.h \
+ $(srcdir)/respip/respip.h $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound-event.h \
+ $(srcdir)/libunbound/libworker.h $(srcdir)/sldns/wire2str.h $(srcdir)/util/shm_side/shm_main.h
testbound.lo testbound.o: $(srcdir)/testcode/testbound.c config.h $(srcdir)/testcode/testpkts.h \
$(srcdir)/testcode/replay.h $(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
$(srcdir)/dnscrypt/cert.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
@@ -1290,10 +1314,10 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h $(srcdir)/util/log.h $(sr
$(srcdir)/services/outbound_list.h $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h \
$(srcdir)/util/rtt.h $(srcdir)/services/cache/dns.h $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h \
$(srcdir)/services/localzone.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h \
- $(srcdir)/validator/autotrust.h $(srcdir)/validator/val_anchor.h $(srcdir)/respip/respip.h \
- $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound-event.h $(srcdir)/libunbound/libworker.h \
- $(srcdir)/sldns/wire2str.h $(srcdir)/util/shm_side/shm_main.h
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/edns.h $(srcdir)/iterator/iter_fwd.h \
+ $(srcdir)/iterator/iter_hints.h $(srcdir)/validator/autotrust.h $(srcdir)/validator/val_anchor.h \
+ $(srcdir)/respip/respip.h $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound-event.h \
+ $(srcdir)/libunbound/libworker.h $(srcdir)/sldns/wire2str.h $(srcdir)/util/shm_side/shm_main.h
acl_list.lo acl_list.o: $(srcdir)/daemon/acl_list.c config.h $(srcdir)/daemon/acl_list.h \
$(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/services/view.h $(srcdir)/util/locks.h \
$(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h $(srcdir)/util/regional.h $(srcdir)/util/config_file.h \
@@ -1311,10 +1335,10 @@ daemon.lo daemon.o: $(srcdir)/daemon/daemon.c config.h \
$(srcdir)/daemon/remote.h \
$(srcdir)/daemon/acl_list.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/services/view.h \
$(srcdir)/util/config_file.h $(srcdir)/util/shm_side/shm_main.h $(srcdir)/util/storage/lookup3.h \
- $(srcdir)/util/storage/slabhash.h $(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/rrset.h \
- $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/services/localzone.h \
- $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h $(srcdir)/util/random.h $(srcdir)/util/tube.h \
- $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h $(srcdir)/respip/respip.h
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/util/tcp_conn_limit.h $(srcdir)/services/listen_dnsport.h \
+ $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h \
+ $(srcdir)/services/localzone.h $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h $(srcdir)/util/random.h \
+ $(srcdir)/util/tube.h $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h $(srcdir)/respip/respip.h
stats.lo stats.o: $(srcdir)/daemon/stats.c config.h $(srcdir)/daemon/stats.h $(srcdir)/util/timehist.h \
$(srcdir)/libunbound/unbound.h $(srcdir)/daemon/worker.h $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
diff --git a/cachedb/cachedb.c b/cachedb/cachedb.c
index a6a609dcb68d..5a179a2bb419 100644
--- a/cachedb/cachedb.c
+++ b/cachedb/cachedb.c
@@ -446,6 +446,7 @@ adjust_msg_ttl(struct dns_msg* msg, time_t adjust)
msg->rep->ttl -= adjust;
else msg->rep->ttl = 0;
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
for(i=0; i<msg->rep->rrset_count; i++) {
packed_rrset_ttl_subtract((struct packed_rrset_data*)msg->
diff --git a/configure b/configure
index 7163bb967733..d2bdbef84e7a 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for unbound 1.7.3.
+# Generated by GNU Autoconf 2.69 for unbound 1.8.0.
#
# Report bugs to <unbound-bugs@nlnetlabs.nl>.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='unbound'
PACKAGE_TARNAME='unbound'
-PACKAGE_VERSION='1.7.3'
-PACKAGE_STRING='unbound 1.7.3'
+PACKAGE_VERSION='1.8.0'
+PACKAGE_STRING='unbound 1.8.0'
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl'
PACKAGE_URL=''
@@ -670,9 +670,6 @@ SYSTEMD_DAEMON_LIBS
SYSTEMD_DAEMON_CFLAGS
SYSTEMD_LIBS
SYSTEMD_CFLAGS
-PKG_CONFIG_LIBDIR
-PKG_CONFIG_PATH
-PKG_CONFIG
staticexe
PC_LIBEVENT_DEPENDENCY
UNBOUND_EVENT_UNINSTALL
@@ -697,6 +694,9 @@ swig
SWIG_LIB
SWIG
PC_PY_DEPENDENCY
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
PY_MAJOR_VERSION
PYTHON_SITE_PKG
PYTHON_LDFLAGS
@@ -1440,7 +1440,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures unbound 1.7.3 to adapt to many kinds of systems.
+\`configure' configures unbound 1.8.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1505,7 +1505,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of unbound 1.7.3:";;
+ short | recursive ) echo "Configuration of unbound 1.8.0:";;
esac
cat <<\_ACEOF
@@ -1722,7 +1722,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-unbound configure 1.7.3
+unbound configure 1.8.0
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2431,7 +2431,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by unbound $as_me 1.7.3, which was
+It was created by unbound $as_me 1.8.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2781,14 +2781,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
UNBOUND_VERSION_MAJOR=1
-UNBOUND_VERSION_MINOR=7
+UNBOUND_VERSION_MINOR=8
-UNBOUND_VERSION_MICRO=3
+UNBOUND_VERSION_MICRO=0
-LIBUNBOUND_CURRENT=7
-LIBUNBOUND_REVISION=11
-LIBUNBOUND_AGE=5
+LIBUNBOUND_CURRENT=8
+LIBUNBOUND_REVISION=0
+LIBUNBOUND_AGE=0
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
# 1.0.2 had 0:14:0
@@ -2850,6 +2850,7 @@ LIBUNBOUND_AGE=5
# 1.7.1 had 7:9:5
# 1.7.2 had 7:10:5
# 1.7.3 had 7:11:5
+# 1.7.4 had 8:0:0 # changes the event callback function signature
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -6273,6 +6274,8 @@ fi
+
+
for ac_prog in flex lex
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -6432,6 +6435,7 @@ fi
rm -f conftest.l $LEX_OUTPUT_ROOT.c
fi
+if test "$LEX" != "" -a "$LEX" != ":"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yylex_destroy" >&5
$as_echo_n "checking for yylex_destroy... " >&6; }
@@ -6442,8 +6446,27 @@ $as_echo "#define LEX_HAS_YYLEX_DESTROY 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }; fi
+$as_echo "no" >&6; };
+ LEX=":"
+ fi
+
+fi
+if test "$LEX" != "" -a "$LEX" != ":"; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lex %option" >&5
+$as_echo_n "checking for lex %option... " >&6; }
+ if cat <<EOF | $LEX -t 2>&1 | grep yy_delete_buffer >/dev/null 2>&1; then
+%option nounput
+%%
+EOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; };
+ LEX=":"
+ fi
+fi
for ac_prog in 'bison -y' byacc
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -16929,7 +16952,136 @@ $as_echo "#define HAVE_PYTHON 1" >>confdefs.h
CPPFLAGS="$PYTHON_CPPFLAGS"
fi
ub_have_python=yes
- PC_PY_DEPENDENCY="python"
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=0.9.0
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ PKG_CONFIG=""
+ fi
+fi
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"python\${PY_MAJOR_VERSION}\"\""; } >&5
+ ($PKG_CONFIG --exists --print-errors ""python${PY_MAJOR_VERSION}"") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ PC_PY_DEPENDENCY="python${PY_MAJOR_VERSION}"
+else
+ PC_PY_DEPENDENCY="python"
+fi
# Check for SWIG
@@ -18870,10 +19022,10 @@ else
withval="no"
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libhiredis" >&5
-$as_echo_n "checking for libhiredis... " >&6; }
found_libhiredis="no"
if test x_$withval = x_yes -o x_$withval != x_no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libhiredis" >&5
+$as_echo_n "checking for libhiredis... " >&6; }
if test x_$withval = x_ -o x_$withval = x_yes; then
withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
fi
@@ -18959,126 +19111,6 @@ else
fi
have_systemd=no
-
-
-
-
-
-
-
-if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PKG_CONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $PKG_CONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-PKG_CONFIG=$ac_cv_path_PKG_CONFIG
-if test -n "$PKG_CONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
-$as_echo "$PKG_CONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_path_PKG_CONFIG"; then
- ac_pt_PKG_CONFIG=$PKG_CONFIG
- # Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $ac_pt_PKG_CONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
-if test -n "$ac_pt_PKG_CONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
-$as_echo "$ac_pt_PKG_CONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_pt_PKG_CONFIG" = x; then
- PKG_CONFIG=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- PKG_CONFIG=$ac_pt_PKG_CONFIG
- fi
-else
- PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
-fi
-
-fi
-if test -n "$PKG_CONFIG"; then
- _pkg_min_version=0.9.0
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
-$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
- if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- PKG_CONFIG=""
- fi
-fi
if test "x$enable_systemd" != xno; then :
@@ -21045,7 +21077,7 @@ _ACEOF
-version=1.7.3
+version=1.8.0
date=`date +'%b %e, %Y'`
@@ -21564,7 +21596,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by unbound $as_me 1.7.3, which was
+This file was extended by unbound $as_me 1.8.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -21630,7 +21662,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-unbound config.status 1.7.3
+unbound config.status 1.8.0
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 80fed29a7bc9..ca98b5459917 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,16 +10,16 @@ sinclude(dnscrypt/dnscrypt.m4)
# must be numbers. ac_defun because of later processing
m4_define([VERSION_MAJOR],[1])
-m4_define([VERSION_MINOR],[7])
-m4_define([VERSION_MICRO],[3])
+m4_define([VERSION_MINOR],[8])
+m4_define([VERSION_MICRO],[0])
AC_INIT(unbound, m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]), unbound-bugs@nlnetlabs.nl, unbound)
AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO])
-LIBUNBOUND_CURRENT=7
-LIBUNBOUND_REVISION=11
-LIBUNBOUND_AGE=5
+LIBUNBOUND_CURRENT=8
+LIBUNBOUND_REVISION=0
+LIBUNBOUND_AGE=0
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
# 1.0.2 had 0:14:0
@@ -81,6 +81,7 @@ LIBUNBOUND_AGE=5
# 1.7.1 had 7:9:5
# 1.7.2 had 7:10:5
# 1.7.3 had 7:11:5
+# 1.7.4 had 8:0:0 # changes the event callback function signature
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -323,11 +324,30 @@ AC_DEFUN([ACX_YYLEX_DESTROY], [
if echo %% | $LEX -t 2>&1 | grep yylex_destroy >/dev/null 2>&1; then
AC_DEFINE(LEX_HAS_YYLEX_DESTROY, 1, [if lex has yylex_destroy])
AC_MSG_RESULT(yes)
- else AC_MSG_RESULT(no); fi
+ else AC_MSG_RESULT(no);
+ LEX=":"
+ fi
+])
+
+AC_DEFUN([ACX_YYLEX_OPTION], [
+ AC_MSG_CHECKING([for lex %option])
+ if cat <<EOF | $LEX -t 2>&1 | grep yy_delete_buffer >/dev/null 2>&1; then
+%option nounput
+%%
+EOF
+ AC_MSG_RESULT(yes)
+ else AC_MSG_RESULT(no);
+ LEX=":"
+ fi
])
AC_PROG_LEX
+if test "$LEX" != "" -a "$LEX" != ":"; then
ACX_YYLEX_DESTROY
+fi
+if test "$LEX" != "" -a "$LEX" != ":"; then
+ACX_YYLEX_OPTION
+fi
AC_PROG_YACC
AC_CHECK_PROG(doxygen, doxygen, doxygen)
AC_CHECK_TOOL(STRIP, strip)
@@ -585,7 +605,10 @@ if test x_$ub_test_python != x_no; then
CPPFLAGS="$PYTHON_CPPFLAGS"
fi
ub_have_python=yes
- PC_PY_DEPENDENCY="python"
+ PKG_PROG_PKG_CONFIG
+ PKG_CHECK_EXISTS(["python${PY_MAJOR_VERSION}"],
+ [PC_PY_DEPENDENCY="python${PY_MAJOR_VERSION}"],
+ [PC_PY_DEPENDENCY="python"])
AC_SUBST(PC_PY_DEPENDENCY)
# Check for SWIG
@@ -1177,9 +1200,9 @@ AC_CHECK_DECLS([XML_StopParser], [], [], [AC_INCLUDES_DEFAULT
AC_ARG_WITH(libhiredis, AC_HELP_STRING([--with-libhiredis=path],
[specify explicit path for libhiredis.]),
[ ],[ withval="no" ])
-AC_MSG_CHECKING(for libhiredis)
found_libhiredis="no"
if test x_$withval = x_yes -o x_$withval != x_no; then
+ AC_MSG_CHECKING(for libhiredis)
if test x_$withval = x_ -o x_$withval = x_yes; then
withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
fi
diff --git a/contrib/fastrpz.patch b/contrib/fastrpz.patch
index d5edc322405c..b80eeb2bb927 100644
--- a/contrib/fastrpz.patch
+++ b/contrib/fastrpz.patch
@@ -274,10 +274,10 @@ Index: unbound-1.7.0~rc1/doc/unbound.conf.5.in
===================================================================
--- unbound-1.7.0~rc1.orig/doc/unbound.conf.5.in
+++ unbound-1.7.0~rc1/doc/unbound.conf.5.in
-@@ -1581,6 +1581,81 @@ It must be /96 or shorter. The default
- .B dns64\-synthall: \fI<yes or no>\fR
- Debug option, default no. If enabled, synthesize all AAAA records
- despite the presence of actual AAAA records.
+@@ -1705,6 +1705,81 @@ It must be /96 or shorter. The default
+ used by dns64 processing instead. Can be entered multiple times, list a
+ new domain for which it applies, one per line. Applies also to names
+ underneath the name given.
+.SS "Response Policy Zone Rewriting"
+.LP
+Response policy zone rewriting is controlled with the
diff --git a/contrib/libunbound.pc.in b/contrib/libunbound.pc.in
index 0cb9f875a7f2..810c571343a4 100644
--- a/contrib/libunbound.pc.in
+++ b/contrib/libunbound.pc.in
@@ -7,7 +7,8 @@ Name: unbound
Description: Library with validating, recursive, and caching DNS resolver
URL: http://www.unbound.net
Version: @PACKAGE_VERSION@
-Requires: @PC_LIBEVENT_DEPENDENCY@ @PC_PY_DEPENDENCY@
+Requires: libcrypto libssl @PC_LIBEVENT_DEPENDENCY@
+Requires.private: @PC_PY_DEPENDENCY@
Libs: -L${libdir} -lunbound -lssl -lcrypto
Libs.private: @SSLLIB@ @LIBS@
Cflags: -I${includedir}
diff --git a/contrib/unbound.service.in b/contrib/unbound.service.in
index b3856690a4ca..95976dd9425a 100644
--- a/contrib/unbound.service.in
+++ b/contrib/unbound.service.in
@@ -1,6 +1,9 @@
[Unit]
Description=Validating, recursive, and caching DNS resolver
Documentation=man:unbound(8)
+After=network.target
+Before=network-online.target nss-lookup.target
+Wants=nss-lookup.target
[Install]
WantedBy=multi-user.target
@@ -10,7 +13,7 @@ ExecReload=/bin/kill -HUP $MAINPID
ExecStart=@UNBOUND_SBIN_DIR@/unbound
NotifyAccess=main
Type=notify
-CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID CAP_SYS_CHROOT
+CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_SYS_RESOURCE
MemoryDenyWriteExecute=true
NoNewPrivileges=true
PrivateDevices=true
@@ -21,7 +24,7 @@ ProtectKernelModules=true
ProtectKernelTunables=true
ProtectSystem=strict
ReadWritePaths=@UNBOUND_SYSCONF_DIR@ @UNBOUND_LOCALSTATE_DIR@ /run @UNBOUND_RUN_DIR@
-RestrictAddressFamilies=AF_INET AF_UNIX
+RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
RestrictRealtime=true
SystemCallArchitectures=native
SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module mount @obsolete @resources
diff --git a/daemon/cachedump.c b/daemon/cachedump.c
index 5a72e9d1106f..b1ce53b596b6 100644
--- a/daemon/cachedump.c
+++ b/daemon/cachedump.c
@@ -653,6 +653,7 @@ load_msg(RES* ssl, sldns_buffer* buf, struct worker* worker)
rep.qdcount = (uint16_t)qdcount;
rep.ttl = (time_t)ttl;
rep.prefetch_ttl = PREFETCH_TTL_CALC(rep.ttl);
+ rep.serve_expired_ttl = rep.ttl + SERVE_EXPIRED_TTL;
rep.security = (enum sec_status)security;
if(an > RR_COUNT_MAX || ns > RR_COUNT_MAX || ar > RR_COUNT_MAX) {
log_warn("error too many rrsets");
diff --git a/daemon/daemon.c b/daemon/daemon.c
index 6820e1181451..a6bfe390271e 100644
--- a/daemon/daemon.c
+++ b/daemon/daemon.c
@@ -76,6 +76,7 @@
#include "util/shm_side/shm_main.h"
#include "util/storage/lookup3.h"
#include "util/storage/slabhash.h"
+#include "util/tcp_conn_limit.h"
#include "services/listen_dnsport.h"
#include "services/cache/rrset.h"
#include "services/cache/infra.h"
@@ -104,10 +105,8 @@ static int sig_record_reload = 0;
/** cleaner ssl memory freeup */
static void* comp_meth = NULL;
#endif
-#ifdef LEX_HAS_YYLEX_DESTROY
/** remove buffers for parsing and init */
int ub_c_lex_destroy(void);
-#endif
/** used when no other sighandling happens, so we don't die
* when multiple signals in quick succession are sent to us.
@@ -182,15 +181,8 @@ static void
signal_handling_playback(struct worker* wrk)
{
#ifdef SIGHUP
- if(sig_record_reload) {
-# ifdef HAVE_SYSTEMD
- sd_notify(0, "RELOADING=1");
-# endif
+ if(sig_record_reload)
worker_sighandler(SIGHUP, wrk);
-# ifdef HAVE_SYSTEMD
- sd_notify(0, "READY=1");
-# endif
- }
#endif
if(sig_record_quit)
worker_sighandler(SIGTERM, wrk);
@@ -279,11 +271,20 @@ daemon_init(void)
free(daemon);
return NULL;
}
+ daemon->tcl = tcl_list_create();
+ if(!daemon->tcl) {
+ acl_list_delete(daemon->acl);
+ edns_known_options_delete(daemon->env);
+ free(daemon->env);
+ free(daemon);
+ return NULL;
+ }
if(gettimeofday(&daemon->time_boot, NULL) < 0)
log_err("gettimeofday: %s", strerror(errno));
daemon->time_last_stat = daemon->time_boot;
if((daemon->env->auth_zones = auth_zones_create()) == 0) {
acl_list_delete(daemon->acl);
+ tcl_list_delete(daemon->tcl);
edns_known_options_delete(daemon->env);
free(daemon->env);
free(daemon);
@@ -584,6 +585,8 @@ daemon_fork(struct daemon* daemon)
if(!acl_list_apply_cfg(daemon->acl, daemon->cfg, daemon->views))
fatal_exit("Could not setup access control list");
+ if(!tcl_list_apply_cfg(daemon->tcl, daemon->cfg))
+ fatal_exit("Could not setup TCP connection limits");
if(daemon->cfg->dnscrypt) {
#ifdef USE_DNSCRYPT
daemon->dnscenv = dnsc_create();
@@ -657,12 +660,18 @@ daemon_fork(struct daemon* daemon)
/* Start resolver service on main thread. */
#ifdef HAVE_SYSTEMD
- sd_notify(0, "READY=1");
+ if(daemon->cfg->use_systemd)
+ sd_notify(0, "READY=1");
#endif
log_info("start of service (%s).", PACKAGE_STRING);
worker_work(daemon->workers[0]);
#ifdef HAVE_SYSTEMD
- sd_notify(0, "STOPPING=1");
+ if(daemon->cfg->use_systemd) {
+ if (daemon->workers[0]->need_to_exit)
+ sd_notify(0, "STOPPING=1");
+ else
+ sd_notify(0, "RELOADING=1");
+ }
#endif
log_info("service stopped (%s).", PACKAGE_STRING);
@@ -738,6 +747,7 @@ daemon_delete(struct daemon* daemon)
ub_randfree(daemon->rand);
alloc_clear(&daemon->superalloc);
acl_list_delete(daemon->acl);
+ tcl_list_delete(daemon->tcl);
free(daemon->chroot);
free(daemon->pidfile);
free(daemon->env);
@@ -746,10 +756,8 @@ daemon_delete(struct daemon* daemon)
SSL_CTX_free((SSL_CTX*)daemon->connect_sslctx);
#endif
free(daemon);
-#ifdef LEX_HAS_YYLEX_DESTROY
/* lex cleanup */
ub_c_lex_destroy();
-#endif
/* libcrypto cleanup */
#ifdef HAVE_SSL
# if defined(USE_GOST) && defined(HAVE_LDNS_KEY_EVP_UNLOAD_GOST)
@@ -800,9 +808,8 @@ void daemon_apply_cfg(struct daemon* daemon, struct config_file* cfg)
{
daemon->cfg = cfg;
config_apply(cfg);
- if(!daemon->env->msg_cache ||
- cfg->msg_cache_size != slabhash_get_size(daemon->env->msg_cache) ||
- cfg->msg_cache_slabs != daemon->env->msg_cache->size) {
+ if(!slabhash_is_size(daemon->env->msg_cache, cfg->msg_cache_size,
+ cfg->msg_cache_slabs)) {
slabhash_delete(daemon->env->msg_cache);
daemon->env->msg_cache = slabhash_create(cfg->msg_cache_slabs,
HASH_DEFAULT_STARTARRAY, cfg->msg_cache_size,
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 031e05da3433..5749dbef8fbf 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -113,6 +113,8 @@ struct daemon {
struct module_stack mods;
/** access control, which client IPs are allowed to connect */
struct acl_list* acl;
+ /** TCP connection limit, limit connections from client IPs */
+ struct tcl_list* tcl;
/** local authority zones */
struct local_zones* local_zones;
/** last time of statistics printout */
diff --git a/daemon/remote.c b/daemon/remote.c
index 011c55e659f2..91e5609f50f8 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -966,6 +966,8 @@ print_ext(RES* ssl, struct ub_stats_info* s)
(unsigned long)s->svr.qtcp)) return 0;
if(!ssl_printf(ssl, "num.query.tcpout"SQ"%lu\n",
(unsigned long)s->svr.qtcp_outgoing)) return 0;
+ if(!ssl_printf(ssl, "num.query.tls"SQ"%lu\n",
+ (unsigned long)s->svr.qtls)) return 0;
if(!ssl_printf(ssl, "num.query.ipv6"SQ"%lu\n",
(unsigned long)s->svr.qipv6)) return 0;
/* flags */
@@ -1050,6 +1052,12 @@ print_ext(RES* ssl, struct ub_stats_info* s)
(unsigned long)s->svr.num_query_authzone_up)) return 0;
if(!ssl_printf(ssl, "num.query.authzone.down"SQ"%lu\n",
(unsigned long)s->svr.num_query_authzone_down)) return 0;
+#ifdef CLIENT_SUBNET
+ if(!ssl_printf(ssl, "num.query.subnet"SQ"%lu\n",
+ (unsigned long)s->svr.num_query_subnet)) return 0;
+ if(!ssl_printf(ssl, "num.query.subnet_cache"SQ"%lu\n",
+ (unsigned long)s->svr.num_query_subnet_cache)) return 0;
+#endif /* CLIENT_SUBNET */
return 1;
}
@@ -1625,6 +1633,7 @@ zone_del_msg(struct lruhash_entry* e, void* arg)
if(d->ttl > inf->expired) {
d->ttl = inf->expired;
d->prefetch_ttl = inf->expired;
+ d->serve_expired_ttl = inf->expired;
inf->num_msgs++;
}
}
@@ -1948,6 +1957,11 @@ parse_delegpt(RES* ssl, char* args, uint8_t* nm, int allow_names)
return NULL;
}
} else {
+#ifndef HAVE_SSL_SET1_HOST
+ if(auth_name)
+ log_err("no name verification functionality in "
+ "ssl library, ignored name for %s", todo);
+#endif
/* add address */
if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0,
auth_name)) {
@@ -2416,6 +2430,57 @@ do_log_reopen(RES* ssl, struct worker* worker)
log_init(cfg->logfile, cfg->use_syslog, cfg->chrootdir);
}
+/** do the auth_zone_reload command */
+static void
+do_auth_zone_reload(RES* ssl, struct worker* worker, char* arg)
+{
+ size_t nmlen;
+ int nmlabs;
+ uint8_t* nm = NULL;
+ struct auth_zones* az = worker->env.auth_zones;
+ struct auth_zone* z = NULL;
+ if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
+ return;
+ if(az) {
+ lock_rw_rdlock(&az->lock);
+ z = auth_zone_find(az, nm, nmlen, LDNS_RR_CLASS_IN);
+ if(z) {
+ lock_rw_wrlock(&z->lock);
+ }
+ lock_rw_unlock(&az->lock);
+ }
+ free(nm);
+ if(!z) {
+ (void)ssl_printf(ssl, "error no auth-zone %s\n", arg);
+ return;
+ }
+ if(!auth_zone_read_zonefile(z)) {
+ lock_rw_unlock(&z->lock);
+ (void)ssl_printf(ssl, "error failed to read %s\n", arg);
+ return;
+ }
+ lock_rw_unlock(&z->lock);
+ send_ok(ssl);
+}
+
+/** do the auth_zone_transfer command */
+static void
+do_auth_zone_transfer(RES* ssl, struct worker* worker, char* arg)
+{
+ size_t nmlen;
+ int nmlabs;
+ uint8_t* nm = NULL;
+ struct auth_zones* az = worker->env.auth_zones;
+ if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
+ return;
+ if(!az || !auth_zones_startprobesequence(az, &worker->env, nm, nmlen,
+ LDNS_RR_CLASS_IN)) {
+ (void)ssl_printf(ssl, "error zone xfr task not found %s\n", arg);
+ return;
+ }
+ send_ok(ssl);
+}
+
/** do the set_option command */
static void
do_set_option(RES* ssl, struct worker* worker, char* arg)
@@ -2806,6 +2871,12 @@ execute_cmd(struct daemon_remote* rc, RES* ssl, char* cmd,
} else if(cmdcmp(p, "list_auth_zones", 15)) {
do_list_auth_zones(ssl, worker->env.auth_zones);
return;
+ } else if(cmdcmp(p, "auth_zone_reload", 16)) {
+ do_auth_zone_reload(ssl, worker, skipwhite(p+16));
+ return;
+ } else if(cmdcmp(p, "auth_zone_transfer", 18)) {
+ do_auth_zone_transfer(ssl, worker, skipwhite(p+18));
+ return;
} else if(cmdcmp(p, "stub_add", 8)) {
/* must always distribute this cmd */
if(rc) distribute_cmd(rc, ssl, cmd);
diff --git a/daemon/stats.c b/daemon/stats.c
index 6f4feaaad9d0..cff01d90342f 100644
--- a/daemon/stats.c
+++ b/daemon/stats.c
@@ -63,6 +63,9 @@
#include "services/authzone.h"
#include "validator/val_kcache.h"
#include "validator/val_neg.h"
+#ifdef CLIENT_SUBNET
+#include "edns-subnet/subnetmod.h"
+#endif
/** add timers and the values do not overflow or become negative */
static void
@@ -124,6 +127,33 @@ void server_stats_log(struct ub_server_stats* stats, struct worker* worker,
(unsigned)worker->env.mesh->stats_jostled);
}
+
+#ifdef CLIENT_SUBNET
+/** Set the EDNS Subnet stats. */
+static void
+set_subnet_stats(struct worker* worker, struct ub_server_stats* svr,
+ int reset)
+{
+ int m = modstack_find(&worker->env.mesh->mods, "subnet");
+ struct subnet_env* sne;
+ if(m == -1)
+ return;
+ sne = (struct subnet_env*)worker->env.modinfo[m];
+ if(reset && !worker->env.cfg->stat_cumulative) {
+ lock_rw_wrlock(&sne->biglock);
+ } else {
+ lock_rw_rdlock(&sne->biglock);
+ }
+ svr->num_query_subnet = (long long)(sne->num_msg_nocache + sne->num_msg_cache);
+ svr->num_query_subnet_cache = (long long)sne->num_msg_cache;
+ if(reset && !worker->env.cfg->stat_cumulative) {
+ sne->num_msg_cache = 0;
+ sne->num_msg_nocache = 0;
+ }
+ lock_rw_unlock(&sne->biglock);
+}
+#endif /* CLIENT_SUBNET */
+
/** Set the neg cache stats. */
static void
set_neg_cache_stats(struct worker* worker, struct ub_server_stats* svr,
@@ -301,6 +331,13 @@ server_stats_compile(struct worker* worker, struct ub_stats_info* s, int reset)
/* Set neg cache usage numbers */
set_neg_cache_stats(worker, &s->svr, reset);
+#ifdef CLIENT_SUBNET
+ /* EDNS Subnet usage numbers */
+ set_subnet_stats(worker, &s->svr, reset);
+#else
+ s->svr.num_query_subnet = 0;
+ s->svr.num_query_subnet_cache = 0;
+#endif
/* get tcp accept usage */
s->svr.tcp_accept_usage = 0;
@@ -374,6 +411,7 @@ void server_stats_add(struct ub_stats_info* total, struct ub_stats_info* a)
total->svr.qclass_big += a->svr.qclass_big;
total->svr.qtcp += a->svr.qtcp;
total->svr.qtcp_outgoing += a->svr.qtcp_outgoing;
+ total->svr.qtls += a->svr.qtls;
total->svr.qipv6 += a->svr.qipv6;
total->svr.qbit_QR += a->svr.qbit_QR;
total->svr.qbit_AA += a->svr.qbit_AA;
@@ -428,8 +466,11 @@ void server_stats_insquery(struct ub_server_stats* stats, struct comm_point* c,
stats->qclass[qclass]++;
else stats->qclass_big++;
stats->qopcode[ LDNS_OPCODE_WIRE(sldns_buffer_begin(c->buffer)) ]++;
- if(c->type != comm_udp)
+ if(c->type != comm_udp) {
stats->qtcp++;
+ if(c->ssl != NULL)
+ stats->qtls++;
+ }
if(repinfo && addr_is_ip6(&repinfo->addr, repinfo->addrlen))
stats->qipv6++;
if( (flags&BIT_QR) )
diff --git a/daemon/unbound.c b/daemon/unbound.c
index 138311013519..3f0f75a560c5 100644
--- a/daemon/unbound.c
+++ b/daemon/unbound.c
@@ -101,6 +101,7 @@ static void usage(void)
printf("-c file config file to read instead of %s\n", CONFIGFILE);
printf(" file format is described in unbound.conf(5).\n");
printf("-d do not fork into the background.\n");
+ printf("-p do not create a pidfile.\n");
printf("-v verbose (more times to increase verbosity)\n");
#ifdef UB_ON_WINDOWS
printf("-w opt windows option: \n");
@@ -626,8 +627,10 @@ run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode, const char*
fatal_exit("Could not alloc config defaults");
if(!config_read(cfg, cfgfile, daemon->chroot)) {
if(errno != ENOENT)
- fatal_exit("Could not read config file: %s",
- cfgfile);
+ fatal_exit("Could not read config file: %s."
+ " Maybe try unbound -dd, it stays on "
+ "the commandline to see more errors, "
+ "or unbound-checkconf", cfgfile);
log_warn("Continuing with default config settings");
}
apply_settings(daemon, cfg, cmdline_verbose, debug_mode, log_default_identity);
diff --git a/daemon/worker.c b/daemon/worker.c
index 44a989a4e945..9551c60f4a6a 100644
--- a/daemon/worker.c
+++ b/daemon/worker.c
@@ -66,6 +66,7 @@
#include "util/data/dname.h"
#include "util/fptr_wlist.h"
#include "util/tube.h"
+#include "util/edns.h"
#include "iterator/iter_fwd.h"
#include "iterator/iter_hints.h"
#include "validator/autotrust.h"
@@ -477,6 +478,7 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
* Then check if it needs validation, if so, this routine fails,
* so that iterator can prime and validator can verify rrsets.
*/
+ struct edns_data edns_bak;
uint16_t udpsize = edns->udp_size;
int secure = 0;
time_t timenow = *worker->env.now;
@@ -509,7 +511,7 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL,
- msg->rep, LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ msg->rep, LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad))
return 0;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
&msg->qinfo, id, flags, edns);
@@ -534,19 +536,22 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
}
}
/* return this delegation from the cache */
+ edns_bak = *edns;
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_cache_call(&worker->env, qinfo, NULL, msg->rep,
- (int)(flags&LDNS_RCODE_MASK), edns, worker->scratchpad))
+ (int)(flags&LDNS_RCODE_MASK), edns, repinfo, worker->scratchpad))
return 0;
msg->rep->flags |= BIT_QR|BIT_RA;
- if(!reply_info_answer_encode(&msg->qinfo, msg->rep, id, flags,
+ if(!apply_edns_options(edns, &edns_bak, worker->env.cfg,
+ repinfo->c, worker->scratchpad) ||
+ !reply_info_answer_encode(&msg->qinfo, msg->rep, id, flags,
repinfo->c->buffer, 0, 1, worker->scratchpad,
udpsize, edns, (int)(edns->bits & EDNS_DO), secure)) {
if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, NULL,
- LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad))
edns->opt_list = NULL;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
&msg->qinfo, id, flags, edns);
@@ -614,6 +619,7 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
struct reply_info* rep, uint16_t id, uint16_t flags,
struct comm_reply* repinfo, struct edns_data* edns)
{
+ struct edns_data edns_bak;
time_t timenow = *worker->env.now;
uint16_t udpsize = edns->udp_size;
struct reply_info* encode_rep = rep;
@@ -623,7 +629,9 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
&& worker->env.need_to_validate;
*partial_repp = NULL; /* avoid accidental further pass */
if(worker->env.cfg->serve_expired) {
- /* always lock rrsets, rep->ttl is ignored */
+ if(worker->env.cfg->serve_expired_ttl &&
+ rep->serve_expired_ttl < timenow)
+ return 0;
if(!rrset_array_lock(rep->ref, rep->rrset_count, 0))
return 0;
/* below, rrsets with ttl before timenow become TTL 0 in
@@ -667,7 +675,7 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, rep,
- LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad))
goto bail_out;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, id, flags, edns);
@@ -695,12 +703,13 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
}
} else secure = 0;
+ edns_bak = *edns;
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_cache_call(&worker->env, qinfo, NULL, rep,
- (int)(flags&LDNS_RCODE_MASK), edns, worker->scratchpad))
+ (int)(flags&LDNS_RCODE_MASK), edns, repinfo, worker->scratchpad))
goto bail_out;
*alias_rrset = NULL; /* avoid confusion if caller set it to non-NULL */
if(worker->daemon->use_response_ip && !partial_rep &&
@@ -728,11 +737,13 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
if(!*partial_repp)
goto bail_out;
}
- } else if(!reply_info_answer_encode(qinfo, encode_rep, id, flags,
+ } else if(!apply_edns_options(edns, &edns_bak, worker->env.cfg,
+ repinfo->c, worker->scratchpad) ||
+ !reply_info_answer_encode(qinfo, encode_rep, id, flags,
repinfo->c->buffer, timenow, 1, worker->scratchpad,
udpsize, edns, (int)(edns->bits & EDNS_DO), secure)) {
if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, NULL,
- LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad))
edns->opt_list = NULL;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, id, flags, edns);
@@ -779,10 +790,11 @@ reply_and_prefetch(struct worker* worker, struct query_info* qinfo,
* @param num: number of strings in array.
* @param edns: edns reply information.
* @param worker: worker with scratch region.
+ * @param repinfo: reply information for a communication point.
*/
static void
chaos_replystr(sldns_buffer* pkt, char** str, int num, struct edns_data* edns,
- struct worker* worker)
+ struct worker* worker, struct comm_reply* repinfo)
{
int i;
unsigned int rd = LDNS_RD_WIRE(sldns_buffer_begin(pkt));
@@ -815,7 +827,7 @@ chaos_replystr(sldns_buffer* pkt, char** str, int num, struct edns_data* edns,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_local_call(&worker->env, NULL, NULL, NULL,
- LDNS_RCODE_NOERROR, edns, worker->scratchpad))
+ LDNS_RCODE_NOERROR, edns, repinfo, worker->scratchpad))
edns->opt_list = NULL;
if(sldns_buffer_capacity(pkt) >=
sldns_buffer_limit(pkt)+calc_edns_field_size(edns))
@@ -825,9 +837,9 @@ chaos_replystr(sldns_buffer* pkt, char** str, int num, struct edns_data* edns,
/** Reply with one string */
static void
chaos_replyonestr(sldns_buffer* pkt, const char* str, struct edns_data* edns,
- struct worker* worker)
+ struct worker* worker, struct comm_reply* repinfo)
{
- chaos_replystr(pkt, (char**)&str, 1, edns, worker);
+ chaos_replystr(pkt, (char**)&str, 1, edns, worker, repinfo);
}
/**
@@ -835,9 +847,11 @@ chaos_replyonestr(sldns_buffer* pkt, const char* str, struct edns_data* edns,
* @param pkt: buffer
* @param edns: edns reply information.
* @param w: worker with scratch region.
+ * @param repinfo: reply information for a communication point.
*/
static void
-chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w)
+chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w,
+ struct comm_reply* repinfo)
{
#define TA_RESPONSE_MAX_TXT 16 /* max number of TXT records */
#define TA_RESPONSE_MAX_TAGS 32 /* max number of tags printed per zone */
@@ -848,7 +862,7 @@ chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w)
if(!w->env.need_to_validate) {
/* no validator module, reply no trustanchors */
- chaos_replystr(pkt, NULL, 0, edns, w);
+ chaos_replystr(pkt, NULL, 0, edns, w, repinfo);
return;
}
@@ -882,7 +896,7 @@ chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w)
}
lock_basic_unlock(&w->env.anchors->lock);
- chaos_replystr(pkt, str_array, num, edns, w);
+ chaos_replystr(pkt, str_array, num, edns, w, repinfo);
regional_free_all(w->scratchpad);
}
@@ -891,12 +905,13 @@ chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w)
* @param w: worker
* @param qinfo: query info. Pointer into packet buffer.
* @param edns: edns info from query.
+ * @param repinfo: reply information for a communication point.
* @param pkt: packet buffer.
* @return: true if a reply is to be sent.
*/
static int
-answer_chaos(struct worker* w, struct query_info* qinfo,
- struct edns_data* edns, sldns_buffer* pkt)
+answer_chaos(struct worker* w, struct query_info* qinfo,
+ struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* pkt)
{
struct config_file* cfg = w->env.cfg;
if(qinfo->qtype != LDNS_RR_TYPE_ANY && qinfo->qtype != LDNS_RR_TYPE_TXT)
@@ -912,13 +927,13 @@ answer_chaos(struct worker* w, struct query_info* qinfo,
char buf[MAXHOSTNAMELEN+1];
if (gethostname(buf, MAXHOSTNAMELEN) == 0) {
buf[MAXHOSTNAMELEN] = 0;
- chaos_replyonestr(pkt, buf, edns, w);
+ chaos_replyonestr(pkt, buf, edns, w, repinfo);
} else {
log_err("gethostname: %s", strerror(errno));
- chaos_replyonestr(pkt, "no hostname", edns, w);
+ chaos_replyonestr(pkt, "no hostname", edns, w, repinfo);
}
}
- else chaos_replyonestr(pkt, cfg->identity, edns, w);
+ else chaos_replyonestr(pkt, cfg->identity, edns, w, repinfo);
return 1;
}
if(query_dname_compare(qinfo->qname,
@@ -929,8 +944,8 @@ answer_chaos(struct worker* w, struct query_info* qinfo,
if(cfg->hide_version)
return 0;
if(cfg->version==NULL || cfg->version[0]==0)
- chaos_replyonestr(pkt, PACKAGE_STRING, edns, w);
- else chaos_replyonestr(pkt, cfg->version, edns, w);
+ chaos_replyonestr(pkt, PACKAGE_STRING, edns, w, repinfo);
+ else chaos_replyonestr(pkt, cfg->version, edns, w, repinfo);
return 1;
}
if(query_dname_compare(qinfo->qname,
@@ -938,7 +953,7 @@ answer_chaos(struct worker* w, struct query_info* qinfo,
{
if(cfg->hide_trustanchor)
return 0;
- chaos_trustanchor(pkt, edns, w);
+ chaos_trustanchor(pkt, edns, w, repinfo);
return 1;
}
@@ -1246,29 +1261,52 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
server_stats_insrcode(&worker->stats, c->buffer);
goto send_reply;
}
- if(edns.edns_present && edns.edns_version != 0) {
- edns.ext_rcode = (uint8_t)(EDNS_RCODE_BADVERS>>4);
- edns.edns_version = EDNS_ADVERTISED_VERSION;
- edns.udp_size = EDNS_ADVERTISED_SIZE;
- edns.bits &= EDNS_DO;
- edns.opt_list = NULL;
- verbose(VERB_ALGO, "query with bad edns version.");
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
- error_encode(c->buffer, EDNS_RCODE_BADVERS&0xf, &qinfo,
- *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
- sldns_buffer_read_u16_at(c->buffer, 2), NULL);
- if(sldns_buffer_capacity(c->buffer) >=
- sldns_buffer_limit(c->buffer)+calc_edns_field_size(&edns))
- attach_edns_record(c->buffer, &edns);
- regional_free_all(worker->scratchpad);
- goto send_reply;
- }
- if(edns.edns_present && edns.udp_size < NORMAL_UDP_SIZE &&
- worker->daemon->cfg->harden_short_bufsize) {
- verbose(VERB_QUERY, "worker request: EDNS bufsize %d ignored",
- (int)edns.udp_size);
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
- edns.udp_size = NORMAL_UDP_SIZE;
+ if(edns.edns_present) {
+ struct edns_option* edns_opt;
+ if(edns.edns_version != 0) {
+ edns.ext_rcode = (uint8_t)(EDNS_RCODE_BADVERS>>4);
+ edns.edns_version = EDNS_ADVERTISED_VERSION;
+ edns.udp_size = EDNS_ADVERTISED_SIZE;
+ edns.bits &= EDNS_DO;
+ edns.opt_list = NULL;
+ verbose(VERB_ALGO, "query with bad edns version.");
+ log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ error_encode(c->buffer, EDNS_RCODE_BADVERS&0xf, &qinfo,
+ *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
+ sldns_buffer_read_u16_at(c->buffer, 2), NULL);
+ if(sldns_buffer_capacity(c->buffer) >=
+ sldns_buffer_limit(c->buffer)+calc_edns_field_size(&edns))
+ attach_edns_record(c->buffer, &edns);
+ regional_free_all(worker->scratchpad);
+ goto send_reply;
+ }
+ if(edns.udp_size < NORMAL_UDP_SIZE &&
+ worker->daemon->cfg->harden_short_bufsize) {
+ verbose(VERB_QUERY, "worker request: EDNS bufsize %d ignored",
+ (int)edns.udp_size);
+ log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ edns.udp_size = NORMAL_UDP_SIZE;
+ }
+ if(c->type != comm_udp) {
+ edns_opt = edns_opt_list_find(edns.opt_list, LDNS_EDNS_KEEPALIVE);
+ if(edns_opt && edns_opt->opt_len > 0) {
+ edns.ext_rcode = 0;
+ edns.edns_version = EDNS_ADVERTISED_VERSION;
+ edns.udp_size = EDNS_ADVERTISED_SIZE;
+ edns.bits &= EDNS_DO;
+ edns.opt_list = NULL;
+ verbose(VERB_ALGO, "query with bad edns keepalive.");
+ log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ error_encode(c->buffer, LDNS_RCODE_FORMERR, &qinfo,
+ *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
+ sldns_buffer_read_u16_at(c->buffer, 2), NULL);
+ if(sldns_buffer_capacity(c->buffer) >=
+ sldns_buffer_limit(c->buffer)+calc_edns_field_size(&edns))
+ attach_edns_record(c->buffer, &edns);
+ regional_free_all(worker->scratchpad);
+ goto send_reply;
+ }
+ }
}
if(edns.udp_size > worker->daemon->cfg->max_udp_size &&
c->type == comm_udp) {
@@ -1298,7 +1336,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
if(c->type != comm_udp)
edns.udp_size = 65535; /* max size for TCP replies */
if(qinfo.qclass == LDNS_RR_CLASS_CH && answer_chaos(worker, &qinfo,
- &edns, c->buffer)) {
+ &edns, repinfo, c->buffer)) {
server_stats_insrcode(&worker->stats, c->buffer);
regional_free_all(worker->scratchpad);
goto send_reply;
@@ -1325,7 +1363,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
}
if(worker->env.auth_zones &&
auth_zones_answer(worker->env.auth_zones, &worker->env,
- &qinfo, &edns, c->buffer, worker->scratchpad)) {
+ &qinfo, &edns, repinfo, c->buffer, worker->scratchpad)) {
regional_free_all(worker->scratchpad);
if(sldns_buffer_limit(c->buffer) == 0) {
comm_point_drop_reply(repinfo);
@@ -1708,9 +1746,13 @@ worker_init(struct worker* worker, struct config_file *cfg,
worker->comsig = NULL;
}
worker->front = listen_create(worker->base, ports,
- cfg->msg_buffer_size, (int)cfg->incoming_num_tcp,
- worker->daemon->listen_sslctx, dtenv, worker_handle_request,
- worker);
+ cfg->msg_buffer_size, (int)cfg->incoming_num_tcp,
+ cfg->do_tcp_keepalive
+ ? cfg->tcp_keepalive_timeout
+ : cfg->tcp_idle_timeout,
+ worker->daemon->tcl,
+ worker->daemon->listen_sslctx,
+ dtenv, worker_handle_request, worker);
if(!worker->front) {
log_err("could not create listening sockets");
worker_delete(worker);
@@ -1972,22 +2014,22 @@ void libworker_handle_control_cmd(struct tube* ATTR_UNUSED(tube),
}
void libworker_fg_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
- sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
void libworker_bg_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
- sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
void libworker_event_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
- sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
@@ -2000,13 +2042,13 @@ int context_query_cmp(const void* ATTR_UNUSED(a), const void* ATTR_UNUSED(b))
int order_lock_cmp(const void* ATTR_UNUSED(e1), const void* ATTR_UNUSED(e2))
{
- log_assert(0);
- return 0;
+ log_assert(0);
+ return 0;
}
int codeline_cmp(const void* ATTR_UNUSED(a), const void* ATTR_UNUSED(b))
{
- log_assert(0);
- return 0;
+ log_assert(0);
+ return 0;
}
diff --git a/dns64/dns64.c b/dns64/dns64.c
index 7889d72e2299..eadfabb08c89 100644
--- a/dns64/dns64.c
+++ b/dns64/dns64.c
@@ -48,6 +48,9 @@
#include "util/fptr_wlist.h"
#include "util/net_help.h"
#include "util/regional.h"
+#include "util/storage/dnstree.h"
+#include "util/data/dname.h"
+#include "sldns/str2wire.h"
/******************************************************************************
* *
@@ -111,6 +114,11 @@ struct dns64_env {
* This is the CIDR length of the prefix. It needs to be between 0 and 96.
*/
int prefix_net;
+
+ /**
+ * Tree of names for which AAAA is ignored. always synthesize from A.
+ */
+ rbtree_type ignore_aaaa;
};
@@ -285,6 +293,40 @@ synthesize_aaaa(const uint8_t prefix_addr[16], int prefix_net,
******************************************************************************/
/**
+ * insert ignore_aaaa element into the tree
+ * @param dns64_env: module env.
+ * @param str: string with domain name.
+ * @return false on failure.
+ */
+static int
+dns64_insert_ignore_aaaa(struct dns64_env* dns64_env, char* str)
+{
+ /* parse and insert element */
+ struct name_tree_node* node;
+ node = (struct name_tree_node*)calloc(1, sizeof(*node));
+ if(!node) {
+ log_err("out of memory");
+ return 0;
+ }
+ node->name = sldns_str2wire_dname(str, &node->len);
+ if(!node->name) {
+ free(node);
+ log_err("cannot parse dns64-ignore-aaaa: %s", str);
+ return 0;
+ }
+ node->labs = dname_count_labels(node->name);
+ node->dclass = LDNS_RR_CLASS_IN;
+ if(!name_tree_insert(&dns64_env->ignore_aaaa, node,
+ node->name, node->len, node->labs, node->dclass)) {
+ /* ignore duplicate element */
+ free(node->name);
+ free(node);
+ return 1;
+ }
+ return 1;
+}
+
+/**
* This function applies the configuration found in the parsed configuration
* file \a cfg to this instance of the dns64 module. Currently only the DNS64
* prefix (a.k.a. Pref64) is configurable.
@@ -295,6 +337,7 @@ synthesize_aaaa(const uint8_t prefix_addr[16], int prefix_net,
static int
dns64_apply_cfg(struct dns64_env* dns64_env, struct config_file* cfg)
{
+ struct config_strlist* s;
verbose(VERB_ALGO, "dns64-prefix: %s", cfg->dns64_prefix);
if (!netblockstrtoaddr(cfg->dns64_prefix ? cfg->dns64_prefix :
DEFAULT_DNS64_PREFIX, 0, &dns64_env->prefix_addr,
@@ -311,6 +354,11 @@ dns64_apply_cfg(struct dns64_env* dns64_env, struct config_file* cfg)
cfg->dns64_prefix);
return 0;
}
+ for(s = cfg->dns64_ignore_aaaa; s; s = s->next) {
+ if(!dns64_insert_ignore_aaaa(dns64_env, s->str))
+ return 0;
+ }
+ name_tree_init_parents(&dns64_env->ignore_aaaa);
return 1;
}
@@ -329,7 +377,8 @@ dns64_init(struct module_env* env, int id)
log_err("malloc failure");
return 0;
}
- env->modinfo[id] = (void*)dns64_env;
+ env->modinfo[id] = (void*)dns64_env;
+ name_tree_init(&dns64_env->ignore_aaaa);
if (!dns64_apply_cfg(dns64_env, env->cfg)) {
log_err("dns64: could not apply configuration settings.");
return 0;
@@ -337,6 +386,16 @@ dns64_init(struct module_env* env, int id)
return 1;
}
+/** free ignore AAAA elements */
+static void
+free_ignore_aaaa_node(rbnode_type* node, void* ATTR_UNUSED(arg))
+{
+ struct name_tree_node* n = (struct name_tree_node*)node;
+ if(!n) return;
+ free(n->name);
+ free(n);
+}
+
/**
* Deinitializes this instance of the dns64 module.
*
@@ -346,8 +405,14 @@ dns64_init(struct module_env* env, int id)
void
dns64_deinit(struct module_env* env, int id)
{
+ struct dns64_env* dns64_env;
if (!env)
return;
+ dns64_env = (struct dns64_env*)env->modinfo[id];
+ if(dns64_env) {
+ traverse_postorder(&dns64_env->ignore_aaaa, free_ignore_aaaa_node,
+ NULL);
+ }
free(env->modinfo[id]);
env->modinfo[id] = NULL;
}
@@ -441,6 +506,25 @@ generate_type_A_query(struct module_qstate* qstate, int id)
}
/**
+ * See if query name is in the always synth config.
+ * The ignore-aaaa list has names for which the AAAA for the domain is
+ * ignored and the A is always used to create the answer.
+ * @param qstate: query state.
+ * @param id: module id.
+ * @return true if the name is covered by ignore-aaaa.
+ */
+static int
+dns64_always_synth_for_qname(struct module_qstate* qstate, int id)
+{
+ struct dns64_env* dns64_env = (struct dns64_env*)qstate->env->modinfo[id];
+ int labs = dname_count_labels(qstate->qinfo.qname);
+ struct name_tree_node* node = name_tree_lookup(&dns64_env->ignore_aaaa,
+ qstate->qinfo.qname, qstate->qinfo.qname_len, labs,
+ qstate->qinfo.qclass);
+ return (node != NULL);
+}
+
+/**
* Handles the "pass" event for a query. This event is received when a new query
* is received by this module. The query may have been generated internally by
* another module, in which case we don't want to do any special processing
@@ -468,6 +552,14 @@ handle_event_pass(struct module_qstate* qstate, int id)
&& qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA)
return generate_type_A_query(qstate, id);
+ if(dns64_always_synth_for_qname(qstate, id) &&
+ (uintptr_t)qstate->minfo[id] == DNS64_NEW_QUERY
+ && !(qstate->query_flags & BIT_CD)
+ && qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA) {
+ verbose(VERB_ALGO, "dns64: ignore-aaaa and synthesize anyway");
+ return generate_type_A_query(qstate, id);
+ }
+
/* We are finished when our sub-query is finished. */
if ((uintptr_t)qstate->minfo[id] == DNS64_SUBQUERY_FINISHED)
return module_finished;
@@ -501,17 +593,29 @@ handle_event_moddone(struct module_qstate* qstate, int id)
* synthesize in (sec 5.1.2 of RFC6147).
* - A successful AAAA query with an answer.
*/
- if ( (enum dns64_qstate)qstate->minfo[id] == DNS64_INTERNAL_QUERY
- || qstate->qinfo.qtype != LDNS_RR_TYPE_AAAA
- || (qstate->query_flags & BIT_CD)
- || (qstate->return_msg &&
+ if((enum dns64_qstate)qstate->minfo[id] != DNS64_INTERNAL_QUERY
+ && qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA
+ && !(qstate->query_flags & BIT_CD)
+ && !(qstate->return_msg &&
qstate->return_msg->rep &&
reply_find_answer_rrset(&qstate->qinfo,
qstate->return_msg->rep)))
- return module_finished;
+ /* not internal, type AAAA, not CD, and no answer RRset,
+ * So, this is a AAAA noerror/nodata answer */
+ return generate_type_A_query(qstate, id);
+
+ if((enum dns64_qstate)qstate->minfo[id] != DNS64_INTERNAL_QUERY
+ && qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA
+ && !(qstate->query_flags & BIT_CD)
+ && dns64_always_synth_for_qname(qstate, id)) {
+ /* if it is not internal, AAAA, not CD and listed domain,
+ * generate from A record and ignore AAAA */
+ verbose(VERB_ALGO, "dns64: ignore-aaaa and synthesize anyway");
+ return generate_type_A_query(qstate, id);
+ }
- /* So, this is a AAAA noerror/nodata answer */
- return generate_type_A_query(qstate, id);
+ /* do nothing */
+ return module_finished;
}
/**
@@ -677,8 +781,9 @@ dns64_adjust_a(int id, struct module_qstate* super, struct module_qstate* qstate
* Build the actual reply.
*/
cp = construct_reply_info_base(super->region, rep->flags, rep->qdcount,
- rep->ttl, rep->prefetch_ttl, rep->an_numrrsets, rep->ns_numrrsets,
- rep->ar_numrrsets, rep->rrset_count, rep->security);
+ rep->ttl, rep->prefetch_ttl, rep->serve_expired_ttl,
+ rep->an_numrrsets, rep->ns_numrrsets, rep->ar_numrrsets,
+ rep->rrset_count, rep->security);
if(!cp)
return;
@@ -705,6 +810,12 @@ dns64_adjust_a(int id, struct module_qstate* super, struct module_qstate* qstate
rrset_cache_remove(super->env->rrset_cache, dk->rk.dname,
dk->rk.dname_len, LDNS_RR_TYPE_AAAA,
LDNS_RR_CLASS_IN, 0);
+ /* Delete negative AAAA in msg cache for CNAMEs,
+ * stored by the iterator module */
+ if(i != 0) /* if not the first RR */
+ msg_cache_remove(super->env, dk->rk.dname,
+ dk->rk.dname_len, LDNS_RR_TYPE_AAAA,
+ LDNS_RR_CLASS_IN, 0);
} else {
dk->entry.hash = fk->entry.hash;
dk->rk.dname = (uint8_t*)regional_alloc_init(super->region,
diff --git a/doc/Changelog b/doc/Changelog
index 3d05ae53a1a5..7e81304f930f 100644
--- a/doc/Changelog
+++ b/doc/Changelog
@@ -1,14 +1,263 @@
+4 September 2018: Wouter
+ - Tag for 1.8.0rc1 release.
+
+31 August 2018: Wouter
+ - Disable minimal-responses in subnet unit tests.
+
+30 August 2018: Wouter
+ - Fix that a local-zone with a local-zone-type that is transparent
+ in a view with view-first, makes queries check for answers from the
+ local-zones defined outside of views.
+
+28 August 2018: Ralph
+ - Disable minimal-responses in ipsecmod unit tests.
+ - Added serve-expired-ttl and serve-expired-ttl-reset options.
+
+27 August 2018: Wouter
+ - Set defaults to yes for a number of options to increase speed and
+ resilience of the server. The so-reuseport, harden-below-nxdomain,
+ and minimal-responses options are enabled by default. They used
+ to be disabled by default, waiting to make sure they worked. They
+ are enabled by default now, and can be disabled explicitly by
+ setting them to "no" in the unbound.conf config file. The reuseport
+ and minimal options increases speed of the server, and should be
+ otherwise harmless. The harden-below-nxdomain option works well
+ together with the recently default enabled qname minimisation, this
+ causes more fetches to use information from the cache.
+ - next release is called 1.8.0.
+ - Fix lintflags for lint on FreeBSD.
+
+22 August 2018: George
+ - #4140: Expose repinfo (comm_reply) to the inplace_callbacks. This
+ gives access to reply information for the client's communication
+ point when the callback is called before the mesh state (modules).
+ Changes to C and Python's inplace_callback signatures were also
+ necessary.
+
+21 August 2018: Wouter
+ - log-local-actions: yes option for unbound.conf that logs all the
+ local zone actions, a patch from Saksham Manchanda (Secure64).
+ - #4146: num.query.subnet and num.query.subnet_cache counters.
+ - Fix only misc failure from log-servfail when val-log-level is not
+ enabled.
+
+17 August 2018: Ralph
+ - Fix classification for QTYPE=CNAME queries when QNAME minimisation is
+ enabled.
+
+17 August 2018: Wouter
+ - Set libunbound to increase current, because the libunbound change
+ to the event callback function signature. That needs programs,
+ that use it, to recompile against the new header definition.
+ - print servfail info to log as error.
+ - added more servfail printout statements, to the iterator.
+ - log-servfail: yes prints log lines that say why queries are
+ returning SERVFAIL to clients.
+
+16 August 2018: Wouter
+ - Fix warning on compile without threads.
+ - Fix contrib/fastrpz.patch.
+
+15 August 2018: Wouter
+ - Fix segfault in auth-zone read and reorder of RRSIGs.
+
+14 August 2018: Wouter
+ - Fix that printout of error for cycle targets is a verbosity 4
+ printout and does not wrongly print it is a memory error.
+ - Upgraded crosscompile script to include libunbound DLL in the
+ zipfile.
+
+10 August 2018: Wouter
+ - Fix #4144: dns64 module caches wrong (negative) information.
+
+9 August 2018: Wouter
+ - unbound-checkconf checks if modules exist and prints if they are
+ not compiled in the name of the wrong module.
+ - document --enable-subnet in doc/README.
+ - Patch for stub-no-cache and forward-no-cache options that disable
+ caching for the contents of that stub or forward, for when you
+ want immediate changes visible, from Bjoern A. Zeeb.
+
+7 August 2018: Ralph
+ - Make capsforid fallback QNAME minimisation aware.
+
+7 August 2018: Wouter
+ - Fix #4142: unbound.service.in: improvements and fixes.
+ Add unit dependency ordering (based on systemd-resolved).
+ Add 'CAP_SYS_RESOURCE' to 'CapabilityBoundingSet' (fixes warnings
+ about missing privileges during startup). Add 'AF_INET6' to
+ 'RestrictAddressFamilies' (without it IPV6 can't work). From
+ Guido Shanahan.
+ - Patch to implement tcp-connection-limit from Jim Hague (Sinodun).
+ This limits the number of simultaneous TCP client connections
+ from a nominated netblock.
+ - make depend, yacc, lex, doc, headers. And log the limit exceeded
+ message only on high verbosity, so as to not spam the logs when
+ it is busy.
+
+6 August 2018: Wouter
+ - Fix for #4136: Fix to unconditionally call destroy in daemon.c.
+
+3 August 2018: George
+ - Expose if a query (or a subquery) was ratelimited (not src IP
+ ratelimiting) to libunbound under 'ub_result.was_ratelimited'.
+ This also introduces a change to 'ub_event_callback_type' in
+ libunbound/unbound-event.h.
+ - Tidy pylib tests.
+
+3 August 2018: Wouter
+ - Revert previous change for #4136: because it introduces build
+ problems.
+ - New fix for #4136: This one ignores lex without without
+ yylex_destroy.
+
+1 August 2018: Wouter
+ - Fix to remove systemd sockaddr function check, that is not
+ always present. Make socket activation more lenient. But not
+ different when socket activation is not used.
+ - iana port list update.
+
+31 July 2018: Wouter
+ - Patches from Jim Hague (Sinodun) for EDNS KeepAlive.
+ - Sort out test runs when the build directory isn't the project
+ root directory.
+ - Add config tcp-idle-timeout (default 30s). This applies to
+ client connections only; the timeout on TCP connections upstream
+ is unaffected.
+ - Error if EDNS Keepalive received over UDP.
+ - Add edns-tcp-keepalive and edns-tcp-keepalive timeout options
+ and implement option in client responses.
+ - Correct and expand manual page entries for keepalive and idle timeout.
+ - Implement progressive backoff of TCP idle/keepalive timeout.
+ - Fix 'make depend' to work when build dir is not project root.
+ - Add delay parameter to streamtcp, -d secs.
+ To be used when testing idle timeout.
+ - From Wouter: make depend, the dependencies in the patches did not
+ apply cleanly. Also remade yacc and lex.
+ - Fix mesh.c incompatible pointer pass.
+ - Please doxygen so it passes.
+ - Fix #4139: Fix unbound-host leaks memory on ANY.
+
+30 July 2018: Wouter
+ - Fix #4136: insufficiency from mismatch of FLEX capability between
+ released tarball and build host.
+
+27 July 2018: Wouter
+ - Fix man page, say that chroot is enabled by default.
+
+26 July 2018: Wouter
+ - Fix #4135: 64-bit Windows Installer Creates Entries Under The
+ Wrong Registry Key, reported by Brian White.
+
+23 July 2018: Wouter
+ - Fix use-systemd readiness signalling, only when use-systemd is yes
+ and not in signal handler.
+
+20 July 2018: Wouter
+ - Fix #4130: print text describing -dd and unbound-checkconf on
+ config file read error at startup, the errors may have been moved
+ away by the startup process.
+ - Fix #4131: for solaris, error YY_CURRENT_BUFFER undeclared.
+
+19 July 2018: Wouter
+ - Fix #4129 unbound-control error message with wrong cert permissions
+ is too cryptic.
+
+17 July 2018: Wouter
+ - Fix #4127 unbound -h does not list -p help.
+ - Print error if SSL name verification configured but not available
+ in the ssl library.
+ - Fix that ratelimit and ip-ratelimit are applied after reload of
+ changed config file.
+ - Resize ratelimit and ip-ratelimit caches if changed on reload.
+
+16 July 2018: Wouter
+ - Fix qname minimisation NXDOMAIN validation lookup failures causing
+ error_supers assertion fails.
+ - Squelch can't bind socket errors with Permission denied unless
+ verbosity is 4 or higher, for UDP outgoing sockets.
+
+12 July 2018: Wouter
+ - Fix to improve systemd socket activation code file descriptor
+ assignment.
+ - Fix for 4126 that the #define for UNKNOWN_SERVER_NICENESS can be more
+ easily changed to adjust default rtt assumptions.
+
+10 July 2018: Wouter
+ - Note in documentation that the cert name match code needs
+ OpenSSL 1.1.0 or later to be enabled.
+
+6 July 2018: Wouter
+ - Fix documentation ambiguity for tls-win-cert in tls-upstream and
+ forward-tls-upstream docs.
+ - iana port update.
+ - Note RFC8162 support. SMIMEA record type can be read in by the
+ zone record parser.
+ - Fix round robin for failed addresses with prefer-ip6: yes
+
+4 July 2018: Wouter
+ - Fix #4112: Fix that unbound-anchor -f /etc/resolv.conf will not pass
+ if DNSSEC is not enabled. New option -R allows fallback from
+ resolv.conf to direct queries.
+
+3 July 2018: Wouter
+ - Better documentation for unblock-lan-zones and insecure-lan-zones
+ config statements.
+ - Fix permission denied printed for auth zone probe random port nrs.
+
+2 July 2018: Wouter
+ - Fix checking for libhiredis printout in configure output.
+ - Fix typo on man page in ip-address description.
+ - Update libunbound/python/examples/dnssec_test.py example code to
+ also set the 20326 trust anchor for the root in the example code.
+
+29 June 2018: Wouter
+ - dns64-ignore-aaaa: config option to list domain names for which the
+ existing AAAA is ignored and dns64 processing is used on the A
+ record.
+
+28 June 2018: Wouter
+ - num.queries.tls counter for queries over TLS.
+ - log port number with err_addr logs.
+
+27 June 2018: Wouter
+ - #4109: Fix that package config depends on python unconditionally.
+ - Patch, do not export python from pkg-config, from Petr Menšík.
+
+26 June 2018: Wouter
+ - Partial fix for permission denied on IPv6 address on FreeBSD.
+ - Fix that auth-zone master reply with current SOA serial does not
+ stop scan of masters for an updated zone.
+ - Fix that auth-zone does not start the wait timer without checking
+ if the wait timer has already been started.
+
+21 June 2018: Wouter
+ - #4108: systemd reload hang fix.
+ - Fix usage printout for unbound-host, hostname has to be last
+ argument on BSDs and Windows.
+
19 June 2018: Wouter
- Fix for unbound-control on Windows and set TCP socket parameters
more closely.
+ This fix is part of 1.7.3.
+ - Windows example service.conf edited with more windows specific
+ configuration.
- Fix windows unbound-control no cert bad file descriptor error.
+ This fix is part of 1.7.3.
18 June 2018: Wouter
- Fix that control-use-cert: no works for 127.0.0.1 to disable certs.
+ This fix is part of 1.7.3rc2.
- Fix unbound-checkconf for control-use-cert.
+ This fix is part of 1.7.3.
15 June 2018: Wouter
- tag for 1.7.3rc1.
+ - trunk has 1.7.4.
+ - unbound-control auth_zone_reload _zone_ option rereads the zonefile.
+ - unbound-control auth_zone_transfer _zone_ option starts the probe
+ sequence for a master to transfer the zone from and transfers when
+ a new zone version is available.
14 June 2018: Wouter
- #4103: Fix that auth-zone does not insist on SOA record first in
diff --git a/doc/README b/doc/README
index 5bd23fac67be..ae90773412ff 100644
--- a/doc/README
+++ b/doc/README
@@ -1,4 +1,4 @@
-README for Unbound 1.7.3
+README for Unbound 1.8.0
Copyright 2007 NLnet Labs
http://unbound.net
@@ -76,6 +76,8 @@ The DNSTAP code has BSD license in dnstap/dnstap.c.
Disable support for RSASHA256 and RSASHA512 crypto.
* --disable-gost
Disable support for GOST crypto, RFC 5933.
+ * --enable-subnet
+ Enable EDNS client subnet processing.
* 'make test' runs a series of self checks.
diff --git a/doc/example.conf.in b/doc/example.conf.in
index be83bdacc21c..fadfd9c6827b 100644
--- a/doc/example.conf.in
+++ b/doc/example.conf.in
@@ -1,7 +1,7 @@
#
# Example configuration file.
#
-# See unbound.conf(5) man page, version 1.7.3.
+# See unbound.conf(5) man page, version 1.8.0.
#
# this is a comment.
@@ -103,7 +103,7 @@ server:
# so-sndbuf: 0
# use SO_REUSEPORT to distribute queries over threads.
- # so-reuseport: no
+ # so-reuseport: yes
# use IP_TRANSPARENT so the interface: addresses can be non-local
# and you can config non-existing IPs that are going to work later on
@@ -212,6 +212,15 @@ server:
# Default is 0, system default MSS.
# outgoing-tcp-mss: 0
+ # Idle TCP timeout, connection closed in milliseconds
+ # tcp-idle-timeout: 30000
+
+ # Enable EDNS TCP keepalive option.
+ # edns-tcp-keepalive: no
+
+ # Timeout for EDNS TCP keepalive, in msec.
+ # edns-tcp-keepalive-timeout: 120000
+
# Use systemd socket activation for UDP, TCP, and control sockets.
# use-systemd: no
@@ -309,6 +318,13 @@ server:
# timetoresolve, fromcache and responsesize.
# log-replies: no
+ # log the local-zone actions, like local-zone type inform is enabled
+ # also for the other local zone types.
+ # log-local-actions: no
+
+ # print log lines that say why queries return SERVFAIL to clients.
+ # log-servfail: no
+
# the pid file. Can be an absolute path outside of chroot/work dir.
# pidfile: "@UNBOUND_PIDFILE@"
@@ -357,7 +373,7 @@ server:
# harden-dnssec-stripped: yes
# Harden against queries that fall under dnssec-signed nxdomain names.
- # harden-below-nxdomain: no
+ # harden-below-nxdomain: yes
# Harden the referral path by performing additional queries for
# infrastructure data. Validates the replies (if possible).
@@ -438,7 +454,7 @@ server:
# if yes, Unbound doesn't insert authority/additional sections
# into response messages when those sections are not required.
- # minimal-responses: no
+ # minimal-responses: yes
# true to disable DNSSEC lameness check in iterator.
# disable-dnssec-lame-check: no
@@ -527,6 +543,16 @@ server:
# Serve expired responses from cache, with TTL 0 in the response,
# and then attempt to fetch the data afresh.
# serve-expired: no
+ #
+ # Limit serving of expired responses to configured seconds after
+ # expiration. 0 disables the limit.
+ # serve-expired-ttl: 0
+ #
+ # Set the TTL of expired records to the serve-expired-ttl value after a
+ # failed attempt to retrieve the record from upstream. This makes sure
+ # that the expired records will be served as long as there are queries
+ # for it.
+ # serve-expired-ttl-reset: no
# Have the validator log failed validations for your diagnosis.
# 0: off. 1: A line per failed user query. 2: With reason and bad IP.
@@ -692,6 +718,9 @@ server:
# Enable dns64 in module-config. Used to synthesize IPv6 from IPv4.
# dns64-prefix: 64:ff9b::0/96
+ # DNS64 ignore AAAA records for these domains and use A instead.
+ # dns64-ignore-aaaa: "example.com"
+
# ratelimit for uncached, new queries, this limits recursion effort.
# ratelimiting is experimental, and may help against randomqueryflood.
# if 0(default) it is disabled, otherwise state qps allowed per zone.
@@ -725,6 +754,9 @@ server:
# 0 blocks when ip is ratelimited, otherwise let 1/xth traffic through
# ip-ratelimit-factor: 10
+ # Limit the number of connections simultaneous from a netblock
+ # tcp-connection-limit: 192.0.2.0/24 12
+
# what is considered a low rtt (ping time for upstream server), in msec
# low-rtt: 45
# select low rtt this many times out of 1000. 0 means the fast server
@@ -814,6 +846,7 @@ remote-control:
# stub-prime: no
# stub-first: no
# stub-tls-upstream: no
+# stub-no-cache: no
# stub-zone:
# name: "example.org"
# stub-host: ns.example.com.
@@ -830,6 +863,7 @@ remote-control:
# forward-addr: 192.0.2.73@5355 # forward to port 5355.
# forward-first: no
# forward-tls-upstream: no
+# forward-no-cache: no
# forward-zone:
# name: "example.org"
# forward-host: fwd.example.com
diff --git a/doc/libunbound.3.in b/doc/libunbound.3.in
index d4b0efd69a9d..9a2fff835601 100644
--- a/doc/libunbound.3.in
+++ b/doc/libunbound.3.in
@@ -1,4 +1,4 @@
-.TH "libunbound" "3" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "libunbound" "3" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" libunbound.3 -- unbound library functions manual
.\"
@@ -43,7 +43,7 @@
.B ub_ctx_zone_remove,
.B ub_ctx_data_add,
.B ub_ctx_data_remove
-\- Unbound DNS validating resolver 1.7.3 functions.
+\- Unbound DNS validating resolver 1.8.0 functions.
.SH "SYNOPSIS"
.B #include <unbound.h>
.LP
diff --git a/doc/unbound-anchor.8.in b/doc/unbound-anchor.8.in
index ca7cafa060ab..ece844deff37 100644
--- a/doc/unbound-anchor.8.in
+++ b/doc/unbound-anchor.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-anchor" "8" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound-anchor" "8" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound-anchor.8 -- unbound anchor maintenance utility manual
.\"
@@ -109,6 +109,11 @@ It does so, because the tool when used for bootstrapping the recursive
resolver, cannot use that recursive resolver itself because it is bootstrapping
that server.
.TP
+.B \-R
+Allow fallback from \-f resolv.conf file to direct root servers query.
+It allows you to prefer local resolvers, but fallback automatically
+to direct root query if they do not respond or do not support DNSSEC.
+.TP
.B \-v
More verbose. Once prints informational messages, multiple times may enable
large debug amounts (such as full certificates or byte\-dumps of downloaded
diff --git a/doc/unbound-checkconf.8.in b/doc/unbound-checkconf.8.in
index 9d35e64dbe08..1fa91d35d3c5 100644
--- a/doc/unbound-checkconf.8.in
+++ b/doc/unbound-checkconf.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-checkconf" "8" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound-checkconf" "8" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound-checkconf.8 -- unbound configuration checker manual
.\"
diff --git a/doc/unbound-control.8.in b/doc/unbound-control.8.in
index f3d9669f8160..596138470e53 100644
--- a/doc/unbound-control.8.in
+++ b/doc/unbound-control.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-control" "8" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound-control" "8" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound-control.8 -- unbound remote control manual
.\"
@@ -293,6 +293,18 @@ ips are dropped before checking the cache.
List the auth zones that are configured. Printed one per line with a
status, indicating if the zone is expired and current serial number.
.TP
+.B auth_zone_reload \fIzone\fR
+Reload the auth zone from zonefile. The zonefile is read in overwriting
+the current contents of the zone in memory. This changes the auth zone
+contents itself, not the cache contents. Such cache contents exists if
+you set unbound to validate with for-upstream yes and that can be cleared
+with \fBflush_zone\fR \fIzone\fR.
+.TP
+.B auth_zone_transfer \fIzone\fR
+Tranfer the auth zone from master. The auth zone probe sequence is started,
+where the masters are probed to see if they have an updated zone (with the SOA
+serial check). And then the zone is transferred for a newer zone version.
+.TP
.B view_list_local_zones \fIview\fR
\fIlist_local_zones\fR for given view.
.TP
@@ -515,6 +527,10 @@ Number of queries that were made using TCP towards the unbound server.
Number of queries that the unbound server made using TCP outgoing towards
other servers.
.TP
+.I num.query.tls
+Number of queries that were made using TLS towards the unbound server.
+These are also counted in num.query.tcp, because TLS uses TCP.
+.TP
.I num.query.ipv6
Number of queries that were made using IPv6 towards the unbound server.
.TP
@@ -625,6 +641,14 @@ answered using cached data.
The number of queries answered using cached NSEC records with NXDOMAIN RCODE.
These queries would otherwise have been sent to the internet, but are now
answered using cached data.
+.TP
+.I num.query.subnet
+Number of queries that got an answer that contained EDNS client subnet data.
+.TP
+.I num.query.subnet_cache
+Number of queries answered from the edns client subnet cache. These are
+counted as cachemiss by the main counters, but hit the client subnet
+specific cache, after getting processed by the edns client subnet module.
.SH "FILES"
.TP
.I @ub_conf_file@
diff --git a/doc/unbound-host.1.in b/doc/unbound-host.1.in
index ea95bd77e071..dacee3d13429 100644
--- a/doc/unbound-host.1.in
+++ b/doc/unbound-host.1.in
@@ -1,4 +1,4 @@
-.TH "unbound\-host" "1" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound\-host" "1" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound-host.1 -- unbound DNS lookup utility
.\"
@@ -12,20 +12,20 @@
\- unbound DNS lookup utility
.SH "SYNOPSIS"
.B unbound\-host
+.RB [ \-C
+.IR configfile ]
.RB [ \-vdhr46D ]
.RB [ \-c
.IR class ]
.RB [ \-t
.IR type ]
-.I hostname
.RB [ \-y
.IR key ]
.RB [ \-f
.IR keyfile ]
.RB [ \-F
.IR namedkeyfile ]
-.RB [ \-C
-.IR configfile ]
+.I hostname
.SH "DESCRIPTION"
.B Unbound\-host
uses the unbound validating resolver to query for the hostname and display
@@ -86,6 +86,8 @@ are read.
.B \-C \fIconfigfile
Uses the specified unbound.conf to prime
.IR libunbound (3).
+Pass it as first argument if you want to override some options from the
+config file with further arguments on the commandline.
.TP
.B \-r
Read /etc/resolv.conf, and use the forward DNS servers from there (those could
diff --git a/doc/unbound.8.in b/doc/unbound.8.in
index 5613ce30b20d..7062fb07eacb 100644
--- a/doc/unbound.8.in
+++ b/doc/unbound.8.in
@@ -1,4 +1,4 @@
-.TH "unbound" "8" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound" "8" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound.8 -- unbound manual
.\"
@@ -9,7 +9,7 @@
.\"
.SH "NAME"
.B unbound
-\- Unbound DNS validating resolver 1.7.3.
+\- Unbound DNS validating resolver 1.8.0.
.SH "SYNOPSIS"
.B unbound
.RB [ \-h ]
diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in
index 9167a5a10def..a3536a14a249 100644
--- a/doc/unbound.conf.5.in
+++ b/doc/unbound.conf.5.in
@@ -1,4 +1,4 @@
-.TH "unbound.conf" "5" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound.conf" "5" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound.conf.5 -- unbound.conf manual
.\"
@@ -121,7 +121,7 @@ interface and port number), if not specified the default port (from
\fBport\fR) is used.
.TP
.B ip\-address: \fI<ip address[@port]>
-Same as interface: (for easy of compatibility with nsd.conf).
+Same as interface: (for ease of compatibility with nsd.conf).
.TP
.B interface\-automatic: \fI<yes or no>
Detect source interface on UDP queries and copy them to replies. This
@@ -278,9 +278,9 @@ to so\-rcvbuf.
.B so\-reuseport: \fI<yes or no>
If yes, then open dedicated listening sockets for incoming queries for each
thread and try to set the SO_REUSEPORT socket option on each socket. May
-distribute incoming queries to threads more evenly. Default is no. On Linux
-it is supported in kernels >= 3.9. On other systems, FreeBSD, OSX it may
-also work. You can enable it (on any platform and kernel),
+distribute incoming queries to threads more evenly. Default is yes.
+On Linux it is supported in kernels >= 3.9. On other systems, FreeBSD, OSX
+it may also work. You can enable it (on any platform and kernel),
it then attempts to open the port and passes the option if it was available
at compile time, if that works it is used, if it fails, it continues
silently (unless verbosity 3) without the option.
@@ -389,6 +389,37 @@ Note that not all platform supports socket option to set MSS (TCP_MAXSEG).
Default is system default MSS determined by interface MTU and
negotiation between Unbound and other servers.
.TP
+.B tcp-idle-timeout: \fI<msec>\fR
+The period Unbound will wait for a query on a TCP connection.
+If this timeout expires Unbound closes the connection.
+This option defaults to 30000 milliseconds.
+When the number of free incoming TCP buffers falls below 50% of the
+total number configured, the option value used is progressively
+reduced, first to 1% of the configured value, then to 0.2% of the
+configured value if the number of free buffers falls below 35% of the
+total number configured, and finally to 0 if the number of free buffers
+falls below 20% of the total number configured. A minimum timeout of
+200 milliseconds is observed regardless of the option value used.
+.TP
+.B edns-tcp-keepalive: \fI<yes or no>\fR
+Enable or disable EDNS TCP Keepalive. Default is no.
+.TP
+.B edns-tcp-keepalive-timeout: \fI<msec>\fR
+The period Unbound will wait for a query on a TCP connection when
+EDNS TCP Keepalive is active. If this timeout expires Unbound closes
+the connection. If the client supports the EDNS TCP Keepalive option,
+Unbound sends the timeout value to the client to encourage it to
+close the connection before the server times out.
+This option defaults to 120000 milliseconds.
+When the number of free incoming TCP buffers falls below 50% of
+the total number configured, the advertised timeout is progressively
+reduced to 1% of the configured value, then to 0.2% of the configured
+value if the number of free buffers falls below 35% of the total number
+configured, and finally to 0 if the number of free buffers falls below
+20% of the total number configured.
+A minimum actual timeout of 200 milliseconds is observed regardless of the
+advertised timeout.
+.TP
.B tcp\-upstream: \fI<yes or no>
Enable or disable whether the upstream queries use TCP only for transport.
Default is no. Useful in tunneling scenarios.
@@ -403,7 +434,7 @@ Enabled or disable whether the upstream queries use TLS only for transport.
Default is no. Useful in tunneling scenarios. The TLS contains plain DNS in
TCP wireformat. The other server must support this (see
\fBtls\-service\-key\fR).
-If you enable this, also configure a tls\-cert\-bundle or use tls\-win\cert to
+If you enable this, also configure a tls\-cert\-bundle or use tls\-win\-cert to
load CA certs, otherwise the connections cannot be authenticated.
.TP
.B ssl\-upstream: \fI<yes or no>
@@ -466,6 +497,11 @@ Enable or disable whether the unbound server forks into the background as
a daemon. Set the value to \fIno\fR when unbound runs as systemd service.
Default is yes.
.TP
+.B tcp\-connection\-limit: \fI<IP netblock> <limit>
+Allow up to \fIlimit\R simultaneous TCP connections from the given netblock.
+When at the limit, further connections are accepted but closed immediately.
+This option is experimental at this time.
+.TP
.B access\-control: \fI<IP netblock> <action>
The netblock is given as an IP4 or IP6 address with /size appended for a
classless network block. The action can be \fIdeny\fR, \fIrefuse\fR,
@@ -557,8 +593,9 @@ to chroot and dropping permissions. This allows the pidfile to be
Additionally, unbound may need to access /dev/random (for entropy)
from inside the chroot.
.IP
-If given a chroot is done to the given directory. The default is
-"@UNBOUND_CHROOT_DIR@". If you give "" no chroot is performed.
+If given a chroot is done to the given directory. By default chroot is
+enabled and the default is "@UNBOUND_CHROOT_DIR@". If you give "" no
+chroot is performed.
.TP
.B username: \fI<name>
If given, after binding the port the user privileges are dropped. Default is
@@ -618,6 +655,16 @@ Default is no. Note that it takes time to print these
lines which makes the server (significantly) slower. Odd (nonprintable)
characters in names are printed as '?'.
.TP
+.B log\-local\-actions: \fI<yes or no>
+Print log lines to inform about local zone actions. These lines are like the
+local\-zone type inform prints out, but they are also printed for the other
+types of local zones.
+.TP
+.B log\-servfail: \fI<yes or no>
+Print log lines that say why queries return SERVFAIL to clients.
+This is separate from the verbosity debug logs, much smaller, and printed
+at the error level, not the info level of debug info from verbosity.
+.TP
.B pidfile: \fI<filename>
The process id is written to the file. Default is "@UNBOUND_PIDFILE@".
So,
@@ -700,7 +747,7 @@ noerror for empty nonterminals, hence this is possible. Very old software
might return nxdomain for empty nonterminals (that usually happen for reverse
IP address lookups), and thus may be incompatible with this. To try to avoid
this only DNSSEC-secure nxdomains are used, because the old software does not
-have DNSSEC. Default is off.
+have DNSSEC. Default is on.
The nxdomain must be secure, this means nsec3 with optout is insufficient.
.TP
.B harden\-referral\-path: \fI<yes or no>
@@ -814,9 +861,11 @@ from the query ID, for speed and thread safety). Default is no.
If yes, Unbound doesn't insert authority/additional sections into response
messages when those sections are not required. This reduces response
size significantly, and may avoid TCP fallback for some responses.
-This may cause a slight speedup. The default is no, because the DNS
+This may cause a slight speedup. The default is yes, even though the DNS
protocol RFCs mandate these sections, and the additional content could
-be of use and save roundtrips for clients.
+be of use and save roundtrips for clients. Because they are not used,
+and the saved roundtrips are easier saved with prefetch, whilst this is
+faster.
.TP
.B disable-dnssec-lame-check: \fI<yes or no>
If true, disables the DNSSEC lameness check in the iterator. This check
@@ -964,6 +1013,17 @@ If enabled, unbound attempts to serve old responses from cache with a
TTL of 0 in the response without waiting for the actual resolution to finish.
The actual resolution answer ends up in the cache later on. Default is "no".
.TP
+.B serve\-expired\-ttl: \fI<seconds>
+Limit serving of expired responses to configured seconds after expiration. 0
+disables the limit. This option only applies when \fBserve\-expired\fR is
+enabled. The default is 0.
+.TP
+.B serve\-expired\-ttl\-reset: \fI<yes or no>
+Set the TTL of expired records to the \fBserve\-expired\-ttl\fR value after a
+failed attempt to retrieve the record from upstream. This makes sure that the
+expired records will be served as long as there are queries for it. Default is
+"no".
+.TP
.B val\-nsec3\-keysize\-iterations: \fI<"list of values">
List of keysize and iteration count values, separated by spaces, surrounded
by quotes. Default is "1024 150 2048 500 4096 2500". This determines the
@@ -1012,7 +1072,7 @@ Number of bytes size of the aggressive negative cache. Default is 1 megabyte.
A plain number is in bytes, append 'k', 'm' or 'g' for kilobytes, megabytes
or gigabytes (1024*1024 bytes in a megabyte).
.TP
-.B unblock\-lan\-zones: \fI<yesno>
+.B unblock\-lan\-zones: \fI<yes or no>
Default is disabled. If enabled, then for private address space,
the reverse lookups are no longer filtered. This allows unbound when
running as dns service on a host where it provides service for that host,
@@ -1023,7 +1083,7 @@ as a (DHCP-) DNS network resolver for a group of machines, where such
lookups should be filtered (RFC compliance), this also stops potential
data leakage about the local network to the upstream DNS servers.
.TP
-.B insecure\-lan\-zones: \fI<yesno>
+.B insecure\-lan\-zones: \fI<yes or no>
Default is disabled. If enabled, then reverse lookups in private
address space are not validated. This is usually required whenever
\fIunblock\-lan\-zones\fR is used.
@@ -1470,6 +1530,10 @@ Default is no.
.TP
.B stub\-ssl\-upstream: \fI<yes or no>
Alternate syntax for \fBstub\-tls\-upstream\fR.
+.TP
+.B stub\-no\-cache: \fI<yes or no>
+Default is no. If enabled, data inside the stub is not cached. This is
+useful when you want immediate changes to be visible.
.SS "Forward Zone Options"
.LP
There may be multiple
@@ -1504,6 +1568,7 @@ the '@' and '#', the '@' comes first.
At high verbosity it logs the TLS certificate, with TLS enabled.
If you leave out the '#' and auth name from the forward\-addr, any
name is accepted. The cert must also match a CA from the tls\-cert\-bundle.
+The cert name match code needs OpenSSL 1.1.0 or later to be enabled.
.TP
.B forward\-first: \fI<yes or no>
If enabled, a query is attempted without the forward clause if it fails.
@@ -1514,11 +1579,15 @@ The default is no.
.B forward\-tls\-upstream: \fI<yes or no>
Enabled or disable whether the queries to this forwarder use TLS for transport.
Default is no.
-If you enable this, also configure a tls\-cert\-bundle or use tls\-win\cert to
+If you enable this, also configure a tls\-cert\-bundle or use tls\-win\-cert to
load CA certs, otherwise the connections cannot be authenticated.
.TP
.B forward\-ssl\-upstream: \fI<yes or no>
Alternate syntax for \fBforward\-tls\-upstream\fR.
+.TP
+.B forward\-no\-cache: \fI<yes or no>
+Default is no. If enabled, data inside the forward is not cached. This is
+useful when you want immediate changes to be visible.
.SS "Authority Zone Options"
.LP
Authority zones are configured with \fBauth\-zone:\fR, and each one must
@@ -1653,6 +1722,12 @@ It must be /96 or shorter. The default prefix is 64:ff9b::/96.
.B dns64\-synthall: \fI<yes or no>\fR
Debug option, default no. If enabled, synthesize all AAAA records
despite the presence of actual AAAA records.
+.TP
+.B dns64\-ignore\-aaaa: \fI<name>\fR
+List domain for which the AAAA records are ignored and the A record is
+used by dns64 processing instead. Can be entered multiple times, list a
+new domain for which it applies, one per line. Applies also to names
+underneath the name given.
.SS "DNSCrypt Options"
.LP
The
diff --git a/edns-subnet/subnetmod.c b/edns-subnet/subnetmod.c
index ae2523b86c23..1a5044e427cc 100644
--- a/edns-subnet/subnetmod.c
+++ b/edns-subnet/subnetmod.c
@@ -464,7 +464,12 @@ eval_response(struct module_qstate *qstate, int id, struct subnet_qstate *sq)
memset(c_out, 0, sizeof(*c_out));
- if (!qstate->return_msg) return module_error;
+ if (!qstate->return_msg) {
+ /* already an answer and its not a message, but retain
+ * the actual rcode, instead of module_error, so send
+ * module_finished */
+ return module_finished;
+ }
/* We have not asked for subnet data */
if (!sq->subnet_sent) {
@@ -511,6 +516,7 @@ eval_response(struct module_qstate *qstate, int id, struct subnet_qstate *sq)
lock_rw_wrlock(&sne->biglock);
update_cache(qstate, id);
+ sne->num_msg_nocache++;
lock_rw_unlock(&sne->biglock);
if (sq->subnet_downstream) {
@@ -693,6 +699,7 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
lock_rw_wrlock(&sne->biglock);
if (lookup_and_reply(qstate, id, sq)) {
+ sne->num_msg_cache++;
lock_rw_unlock(&sne->biglock);
verbose(VERB_QUERY, "subnet: answered from cache");
qstate->ext_state[id] = module_finished;
@@ -741,7 +748,8 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
/* Query handed back by next module, we have a 'final' answer */
if(sq && event == module_event_moddone) {
qstate->ext_state[id] = eval_response(qstate, id, sq);
- if(qstate->ext_state[id] == module_finished) {
+ if(qstate->ext_state[id] == module_finished &&
+ qstate->return_msg) {
ecs_opt_list_append(&sq->ecs_client_out,
&qstate->edns_opts_front_out, qstate);
}
diff --git a/edns-subnet/subnetmod.h b/edns-subnet/subnetmod.h
index c7f56327f9d2..f417a64a45b0 100644
--- a/edns-subnet/subnetmod.h
+++ b/edns-subnet/subnetmod.h
@@ -61,6 +61,10 @@ struct subnet_env {
/** allocation service */
struct alloc_cache alloc;
lock_rw_type biglock;
+ /** number of messages from cache */
+ size_t num_msg_cache;
+ /** number of messages not from cache */
+ size_t num_msg_nocache;
};
struct subnet_msg_cache_data {
diff --git a/ipsecmod/ipsecmod.c b/ipsecmod/ipsecmod.c
index 3e4ee6a53508..c8400c6333ee 100644
--- a/ipsecmod/ipsecmod.c
+++ b/ipsecmod/ipsecmod.c
@@ -341,6 +341,8 @@ ipsecmod_handle_query(struct module_qstate* qstate,
qstate->env->cfg->ipsecmod_max_ttl;
qstate->return_msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(
qstate->return_msg->rep->ttl);
+ qstate->return_msg->rep->serve_expired_ttl = qstate->return_msg->rep->ttl +
+ qstate->env->cfg->serve_expired_ttl;
}
}
}
diff --git a/iterator/iter_delegpt.h b/iterator/iter_delegpt.h
index 354bd6177380..6c088264588f 100644
--- a/iterator/iter_delegpt.h
+++ b/iterator/iter_delegpt.h
@@ -85,6 +85,8 @@ struct delegpt {
uint8_t ssl_upstream;
/** delegpt from authoritative zone that is locally hosted */
uint8_t auth_dp;
+ /*** no cache */
+ int no_cache;
};
/**
diff --git a/iterator/iter_fwd.c b/iterator/iter_fwd.c
index a44f54386dc4..4eb0eb718607 100644
--- a/iterator/iter_fwd.c
+++ b/iterator/iter_fwd.c
@@ -239,6 +239,11 @@ read_fwds_addr(struct config_stub* s, struct delegpt* dp)
s->name, p->str);
return 0;
}
+#ifndef HAVE_SSL_SET1_HOST
+ if(tls_auth_name)
+ log_err("no name verification functionality in "
+ "ssl library, ignored name for %s", p->str);
+#endif
if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0,
tls_auth_name)) {
log_err("out of memory");
@@ -267,6 +272,8 @@ read_forwards(struct iter_forwards* fwd, struct config_file* cfg)
* last resort will ask for parent-side NS record and thus
* fallback to the internet name servers on a failure */
dp->has_parent_side_NS = (uint8_t)!s->isfirst;
+ /* Do not cache if set. */
+ dp->no_cache = s->no_cache;
/* use SSL for queries to this forwarder */
dp->ssl_upstream = (uint8_t)s->ssl_upstream;
verbose(VERB_QUERY, "Forward zone server list:");
diff --git a/iterator/iter_hints.c b/iterator/iter_hints.c
index e8d09338e974..0b35a9d9e24f 100644
--- a/iterator/iter_hints.c
+++ b/iterator/iter_hints.c
@@ -252,6 +252,11 @@ read_stubs_addr(struct config_stub* s, struct delegpt* dp)
s->name, p->str);
return 0;
}
+#ifndef HAVE_SSL_SET1_HOST
+ if(auth_name)
+ log_err("no name verification functionality in "
+ "ssl library, ignored name for %s", p->str);
+#endif
if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0,
auth_name)) {
log_err("out of memory");
@@ -278,6 +283,8 @@ read_stubs(struct iter_hints* hints, struct config_file* cfg)
* last resort will ask for parent-side NS record and thus
* fallback to the internet name servers on a failure */
dp->has_parent_side_NS = (uint8_t)!s->isfirst;
+ /* Do not cache if set. */
+ dp->no_cache = s->no_cache;
/* ssl_upstream */
dp->ssl_upstream = (uint8_t)s->ssl_upstream;
delegpt_log(VERB_QUERY, dp);
diff --git a/iterator/iter_utils.c b/iterator/iter_utils.c
index 0a8f7700fcf0..90c8cf114e33 100644
--- a/iterator/iter_utils.c
+++ b/iterator/iter_utils.c
@@ -375,11 +375,34 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env,
int got_num6 = 0;
int low_rtt6 = 0;
int i;
+ int attempt = -1; /* filter to make sure addresses have
+ less attempts on them than the first, to force round
+ robin when all the IPv6 addresses fail */
+ int num4ok = 0; /* number ip4 at low attempt count */
+ int num4_lowrtt = 0;
prev = NULL;
a = dp->result_list;
for(i = 0; i < got_num; i++) {
swap_to_front = 0;
+ if(a->addr.ss_family != AF_INET6 && attempt == -1) {
+ /* if we only have ip4 at low attempt count,
+ * then ip6 is failing, and we need to
+ * select one of the remaining IPv4 addrs */
+ attempt = a->attempts;
+ num4ok++;
+ num4_lowrtt = a->sel_rtt;
+ } else if(a->addr.ss_family != AF_INET6 && attempt == a->attempts) {
+ num4ok++;
+ if(num4_lowrtt == 0 || a->sel_rtt < num4_lowrtt) {
+ num4_lowrtt = a->sel_rtt;
+ }
+ }
if(a->addr.ss_family == AF_INET6) {
+ if(attempt == -1) {
+ attempt = a->attempts;
+ } else if(a->attempts > attempt) {
+ break;
+ }
got_num6++;
swap_to_front = 1;
if(low_rtt6 == 0 || a->sel_rtt < low_rtt6) {
@@ -401,6 +424,9 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env,
if(got_num6 > 0) {
got_num = got_num6;
*selected_rtt = low_rtt6;
+ } else if(num4ok > 0) {
+ got_num = num4ok;
+ *selected_rtt = num4_lowrtt;
}
}
return got_num;
diff --git a/iterator/iterator.c b/iterator/iterator.c
index 58a9bff6634c..e99a559fae4d 100644
--- a/iterator/iterator.c
+++ b/iterator/iterator.c
@@ -230,11 +230,12 @@ error_supers(struct module_qstate* qstate, int id, struct module_qstate* super)
qstate->qinfo.qname, qstate->qinfo.qname_len);
if(!dpns) {
/* not interested */
+ /* this can happen, for eg. qname minimisation asked
+ * for an NXDOMAIN to be validated, and used qtype
+ * A for that, and the error of that, the name, is
+ * not listed in super_iq->dp */
verbose(VERB_ALGO, "subq error, but not interested");
log_query_info(VERB_ALGO, "superq", &super->qinfo);
- if(super_iq->dp)
- delegpt_log(VERB_ALGO, super_iq->dp);
- log_assert(0);
return;
} else {
/* see if the failure did get (parent-lame) info */
@@ -303,8 +304,20 @@ error_response_cache(struct module_qstate* qstate, int id, int rcode)
if((msg=msg_cache_lookup(qstate->env,
qstate->qinfo.qname, qstate->qinfo.qname_len,
qstate->qinfo.qtype, qstate->qinfo.qclass,
- qstate->query_flags, 0, 0))
+ qstate->query_flags, 0,
+ qstate->env->cfg->serve_expired_ttl_reset))
!= NULL) {
+ if(qstate->env->cfg->serve_expired_ttl_reset) {
+ struct reply_info* rep =
+ (struct reply_info*)msg->entry.data;
+ if(rep && *qstate->env->now +
+ qstate->env->cfg->serve_expired_ttl >
+ rep->serve_expired_ttl) {
+ rep->serve_expired_ttl =
+ *qstate->env->now +
+ qstate->env->cfg->serve_expired_ttl;
+ }
+ }
lock_rw_unlock(&msg->entry.lock);
return error_response(qstate, id, rcode);
}
@@ -318,6 +331,7 @@ error_response_cache(struct module_qstate* qstate, int id, int rcode)
err.qdcount = 1;
err.ttl = NORR_TTL;
err.prefetch_ttl = PREFETCH_TTL_CALC(err.ttl);
+ err.serve_expired_ttl = NORR_TTL;
/* do not waste time trying to validate this servfail */
err.security = sec_status_indeterminate;
verbose(VERB_ALGO, "store error response in message cache");
@@ -789,6 +803,7 @@ prime_stub(struct module_qstate* qstate, struct iter_qstate* iq, int id,
iq->dp = delegpt_copy(stub_dp, qstate->region);
if(!iq->dp) {
log_err("out of memory priming stub");
+ errinf(qstate, "malloc failure, priming stub");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return 1; /* return 1 to make module stop, with error */
}
@@ -807,6 +822,7 @@ prime_stub(struct module_qstate* qstate, struct iter_qstate* iq, int id,
LDNS_RR_TYPE_NS, qclass, qstate, id, iq,
QUERYTARGETS_STATE, PRIME_RESP_STATE, &subq, 0)) {
verbose(VERB_ALGO, "could not prime stub");
+ errinf(qstate, "could not generate lookup for stub prime");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return 1; /* return 1 to make module stop, with error */
}
@@ -822,6 +838,7 @@ prime_stub(struct module_qstate* qstate, struct iter_qstate* iq, int id,
fptr_ok(fptr_whitelist_modenv_kill_sub(
qstate->env->kill_sub));
(*qstate->env->kill_sub)(subq);
+ errinf(qstate, "malloc failure, in stub prime");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return 1; /* return 1 to make module stop, with error */
}
@@ -905,6 +922,7 @@ auth_zone_delegpt(struct module_qstate* qstate, struct iter_qstate* iq,
return 1; /* just fallback */
}
lock_rw_unlock(&z->lock);
+ errinf(qstate, "malloc failure");
return 0;
}
dp->name = regional_alloc_init(qstate->region,
@@ -916,6 +934,7 @@ auth_zone_delegpt(struct module_qstate* qstate, struct iter_qstate* iq,
return 1; /* just fallback */
}
lock_rw_unlock(&z->lock);
+ errinf(qstate, "malloc failure");
return 0;
}
dp->namelen = z->namelen;
@@ -1125,6 +1144,53 @@ forward_request(struct module_qstate* qstate, struct iter_qstate* iq)
return 1;
}
+static int
+iter_stub_fwd_no_cache(struct module_qstate *qstate, struct iter_qstate *iq)
+{
+ struct iter_hints_stub *stub;
+ struct delegpt *dp;
+
+ /* Check for stub. */
+ stub = hints_lookup_stub(qstate->env->hints, iq->qchase.qname,
+ iq->qchase.qclass, iq->dp);
+ dp = forwards_lookup(qstate->env->fwds, iq->qchase.qname, iq->qchase.qclass);
+
+ /* see if forward or stub is more pertinent */
+ if(stub && stub->dp && dp) {
+ if(dname_strict_subdomain(dp->name, dp->namelabs,
+ stub->dp->name, stub->dp->namelabs)) {
+ stub = NULL; /* ignore stub, forward is lower */
+ } else {
+ dp = NULL; /* ignore forward, stub is lower */
+ }
+ }
+
+ /* check stub */
+ if (stub != NULL && stub->dp != NULL) {
+ if(stub->dp->no_cache) {
+ char qname[255+1];
+ char dpname[255+1];
+ dname_str(iq->qchase.qname, qname);
+ dname_str(stub->dp->name, dpname);
+ verbose(VERB_ALGO, "stub for %s %s has no_cache", qname, dpname);
+ }
+ return (stub->dp->no_cache);
+ }
+
+ /* Check for forward. */
+ if (dp) {
+ if(dp->no_cache) {
+ char qname[255+1];
+ char dpname[255+1];
+ dname_str(iq->qchase.qname, qname);
+ dname_str(dp->name, dpname);
+ verbose(VERB_ALGO, "forward for %s %s has no_cache", qname, dpname);
+ }
+ return (dp->no_cache);
+ }
+ return 0;
+}
+
/**
* Process the initial part of the request handling. This state roughly
* corresponds to resolver algorithms steps 1 (find answer in cache) and 2
@@ -1159,6 +1225,10 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
if(iq->query_restart_count > MAX_RESTART_COUNT) {
verbose(VERB_QUERY, "request has exceeded the maximum number"
" of query restarts with %d", iq->query_restart_count);
+ errinf(qstate, "request has exceeded the maximum number "
+ "restarts (eg. indirections)");
+ if(iq->qchase.qname)
+ errinf_dname(qstate, "stop at", iq->qchase.qname);
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -1170,6 +1240,8 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
if(iq->depth > ie->max_dependency_depth) {
verbose(VERB_QUERY, "request has exceeded the maximum "
"dependency depth with depth of %d", iq->depth);
+ errinf(qstate, "request has exceeded the maximum dependency "
+ "depth (eg. nameserver lookup recursion)");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -1196,7 +1268,13 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
/* This either results in a query restart (CNAME cache response), a
* terminating response (ANSWER), or a cache miss (null). */
- if(qstate->blacklist) {
+ if (iter_stub_fwd_no_cache(qstate, iq)) {
+ /* Asked to not query cache. */
+ verbose(VERB_ALGO, "no-cache set, going to the network");
+ qstate->no_cache_lookup = 1;
+ qstate->no_cache_store = 1;
+ msg = NULL;
+ } else if(qstate->blacklist) {
/* if cache, or anything else, was blacklisted then
* getting older results from cache is a bad idea, no cache */
verbose(VERB_ALGO, "cache blacklisted, going to the network");
@@ -1240,9 +1318,12 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
verbose(VERB_ALGO, "returning CNAME response from "
"cache");
if(!handle_cname_response(qstate, iq, msg,
- &sname, &slen))
+ &sname, &slen)) {
+ errinf(qstate, "failed to prepend CNAME "
+ "components, malloc failure");
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
+ }
iq->qchase.qname = sname;
iq->qchase.qname_len = slen;
/* This *is* a query restart, even if it is a cheap
@@ -1260,6 +1341,8 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
/* if from cache, NULL, else insert 'cache IP' len=0 */
if(qstate->reply_origin)
sock_list_insert(&qstate->reply_origin, NULL, 0, qstate->region);
+ if(FLAGS_GET_RCODE(msg->rep->flags) == LDNS_RCODE_SERVFAIL)
+ errinf(qstate, "SERVFAIL in cache");
/* it is an answer, response, to final state */
verbose(VERB_ALGO, "returning answer from cache.");
iq->response = msg;
@@ -1271,6 +1354,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
{
if(!iq->dp) {
log_err("alloc failure for forward dp");
+ errinf(qstate, "malloc failure for forward zone");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
iq->refetch_glue = 0;
@@ -1290,6 +1374,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
if(iq->refetch_glue) {
if(!iq->dp) {
log_err("internal or malloc fail: no dp for refetch");
+ errinf(qstate, "malloc failure, for delegation info");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
delname = iq->dp->name;
@@ -1349,12 +1434,14 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
iq->qchase.qclass);
if(!iq->dp) {
log_err("internal error: no hints dp");
+ errinf(qstate, "no hints for this class");
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
iq->dp = delegpt_copy(iq->dp, qstate->region);
if(!iq->dp) {
log_err("out of memory in safety belt");
+ errinf(qstate, "malloc failure, in safety belt");
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
@@ -1398,6 +1485,9 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
log_nametypeclass(VERB_ALGO, "ratelimit exceeded with "
"delegation point", iq->dp->name,
LDNS_RR_TYPE_NS, LDNS_RR_CLASS_IN);
+ qstate->was_ratelimited = 1;
+ errinf(qstate, "query was ratelimited");
+ errinf_dname(qstate, "for zone", iq->dp->name);
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
}
@@ -1427,6 +1517,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
if(!iq->dp) {
log_err("out of memory in "
"stub/fwd fallback");
+ errinf(qstate, "malloc failure, for fallback to config");
return error_response(qstate,
id, LDNS_RCODE_SERVFAIL);
}
@@ -1435,6 +1526,9 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
verbose(VERB_ALGO, "useless dp "
"but cannot go up, servfail");
delegpt_log(VERB_ALGO, iq->dp);
+ errinf(qstate, "no useful nameservers, "
+ "and cannot go up");
+ errinf_dname(qstate, "for zone", iq->dp->name);
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
@@ -1454,6 +1548,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
iq->dp = delegpt_copy(iq->dp, qstate->region);
if(!iq->dp) {
log_err("out of memory in safety belt");
+ errinf(qstate, "malloc failure, in safety belt, for root");
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
@@ -1508,6 +1603,7 @@ processInitRequest2(struct module_qstate* qstate, struct iter_qstate* iq,
struct iter_hints_stub* stub;
if(!iq->dp) {
log_err("internal or malloc fail: no dp for refetch");
+ errinf(qstate, "malloc failure, no delegation info");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
/* Do not send queries above stub, do not set delname to dp if
@@ -1798,6 +1894,8 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
iq->qchase.qclass, NULL)) {
/* fail -- no more targets, no more hope of targets, no hope
* of a response. */
+ errinf(qstate, "all the configured stub or forward servers failed,");
+ errinf_dname(qstate, "at zone", iq->dp->name);
verbose(VERB_QUERY, "configured stub or forward servers failed -- returning SERVFAIL");
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -1857,6 +1955,8 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
int qs = 0;
verbose(VERB_ALGO, "try parent-side target name");
if(!query_for_targets(qstate, iq, ie, id, 1, &qs)) {
+ errinf(qstate, "could not fetch nameserver");
+ errinf_dname(qstate, "at zone", iq->dp->name);
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
iq->num_target_queries += qs;
@@ -1868,6 +1968,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
}
if(iq->depth == ie->max_dependency_depth) {
verbose(VERB_QUERY, "maxdepth and need more nameservers, fail");
+ errinf(qstate, "cannot fetch more nameservers because at max dependency depth");
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
if(iq->depth > 0 && iq->target_count &&
@@ -1876,6 +1977,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
dname_str(qstate->qinfo.qname, s);
verbose(VERB_QUERY, "request %s has exceeded the maximum "
"number of glue fetches %d", s, iq->target_count[1]);
+ errinf(qstate, "exceeded the maximum number of glue fetches");
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
/* mark cycle targets for parent-side lookups */
@@ -1901,9 +2003,11 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
/* Send the AAAA request. */
if(!generate_parentside_target_query(qstate, iq, id,
ns->name, ns->namelen,
- LDNS_RR_TYPE_AAAA, iq->qchase.qclass))
+ LDNS_RR_TYPE_AAAA, iq->qchase.qclass)) {
+ errinf_dname(qstate, "could not generate nameserver AAAA lookup for", ns->name);
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
+ }
ns->done_pside6 = 1;
query_count++;
}
@@ -1911,9 +2015,11 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
/* Send the A request. */
if(!generate_parentside_target_query(qstate, iq, id,
ns->name, ns->namelen,
- LDNS_RR_TYPE_A, iq->qchase.qclass))
+ LDNS_RR_TYPE_A, iq->qchase.qclass)) {
+ errinf_dname(qstate, "could not generate nameserver A lookup for", ns->name);
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
+ }
ns->done_pside4 = 1;
query_count++;
}
@@ -1934,6 +2040,8 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
iq->deleg_msg?iq->deleg_msg->rep:
(iq->response?iq->response->rep:NULL));
+ errinf(qstate, "all servers for this domain failed,");
+ errinf_dname(qstate, "at zone", iq->dp->name);
verbose(VERB_QUERY, "out of query targets -- returning SERVFAIL");
/* fail -- no more targets, no more hope of targets, no hope
* of a response. */
@@ -1967,6 +2075,7 @@ processDSNSFind(struct module_qstate* qstate, struct iter_qstate* iq, int id)
}
/* robustcheck for internal error: we are not underneath the dp */
if(!dname_subdomain_c(iq->dsns_point, iq->dp->name)) {
+ errinf_dname(qstate, "for DS query parent-child nameserver search the query is not under the zone", iq->dp->name);
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -1987,6 +2096,7 @@ processDSNSFind(struct module_qstate* qstate, struct iter_qstate* iq, int id)
if(!generate_sub_request(iq->dsns_point, iq->dsns_point_len,
LDNS_RR_TYPE_NS, iq->qchase.qclass, qstate, id, iq,
INIT_REQUEST_STATE, FINISHED_STATE, &subq, 0)) {
+ errinf_dname(qstate, "for DS query parent-child nameserver search, could not generate NS lookup for", iq->dsns_point);
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -2032,11 +2142,13 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
if(iq->referral_count > MAX_REFERRAL_COUNT) {
verbose(VERB_QUERY, "request has exceeded the maximum "
"number of referrrals with %d", iq->referral_count);
+ errinf(qstate, "exceeded the maximum of referrals");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
if(iq->sent_count > MAX_SENT_COUNT) {
verbose(VERB_QUERY, "request has exceeded the maximum "
"number of sends with %d", iq->sent_count);
+ errinf(qstate, "exceeded the maximum number of sends");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -2044,6 +2156,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
* or another failure occurred */
if(!iq->dp) {
verbose(VERB_QUERY, "Failed to get a delegation, giving up");
+ errinf(qstate, "failed to get a delegation (eg. prime failure)");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
if(!ie->supports_ipv6)
@@ -2203,6 +2316,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
* no internet fallback */
verbose(VERB_ALGO, "auth zone lookup failed, no fallback,"
" servfail");
+ errinf(qstate, "auth zone lookup failed, fallback is off");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
if(iq->dp && iq->dp->auth_dp) {
@@ -2228,6 +2342,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
int extra = 0;
size_t naddr, nres, navail;
if(!query_for_targets(qstate, iq, ie, id, -1, &extra)) {
+ errinf(qstate, "could not fetch nameservers for 0x20 fallback");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
iq->num_target_queries += extra;
@@ -2308,6 +2423,8 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
"missing target");
if(!query_for_targets(qstate, iq, ie, id,
1, &qs)) {
+ errinf(qstate, "could not fetch nameserver");
+ errinf_dname(qstate, "at zone", iq->dp->name);
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
@@ -2378,6 +2495,9 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
ie->num_queries_ratelimited++;
lock_basic_unlock(&ie->queries_ratelimit_lock);
verbose(VERB_ALGO, "query exceeded ratelimits");
+ qstate->was_ratelimited = 1;
+ errinf_dname(qstate, "exceeded ratelimit for zone",
+ iq->dp->name);
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
}
@@ -2542,6 +2662,15 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
/* DNAME to a subdomain loop; do not recurse */
type = RESPONSE_TYPE_ANSWER;
}
+ } else if(type == RESPONSE_TYPE_CNAME &&
+ iq->qchase.qtype == LDNS_RR_TYPE_CNAME &&
+ iq->minimisation_state == MINIMISE_STATE &&
+ query_dname_compare(iq->qchase.qname, iq->qinfo_out.qname) == 0) {
+ /* The minimised query for full QTYPE and hidden QTYPE can be
+ * classified as CNAME response type, even when the original
+ * QTYPE=CNAME. This should be treated as answer response type.
+ */
+ type = RESPONSE_TYPE_ANSWER;
}
/* handle each of the type cases */
@@ -2690,11 +2819,15 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
iq->dp = delegpt_from_message(iq->response, qstate->region);
if (qstate->env->cfg->qname_minimisation)
iq->minimisation_state = INIT_MINIMISE_STATE;
- if(!iq->dp)
+ if(!iq->dp) {
+ errinf(qstate, "malloc failure, for delegation point");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+ }
if(!cache_fill_missing(qstate->env, iq->qchase.qclass,
- qstate->region, iq->dp))
+ qstate->region, iq->dp)) {
+ errinf(qstate, "malloc failure, copy extra info into delegation point");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+ }
if(iq->store_parent_NS && query_dname_compare(iq->dp->name,
iq->store_parent_NS->name) == 0)
iter_merge_retry_counts(iq->dp, iq->store_parent_NS);
@@ -2756,8 +2889,10 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
}
/* Process the CNAME response. */
if(!handle_cname_response(qstate, iq, iq->response,
- &sname, &snamelen))
+ &sname, &snamelen)) {
+ errinf(qstate, "malloc failure, CNAME info");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+ }
/* cache the CNAME response under the current query */
/* NOTE : set referral=1, so that rrsets get stored but not
* the partial query answer (CNAME only). */
@@ -2858,6 +2993,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
iq->dp->name, iq->dp->namelen, qstate->qinfo.qclass)) {
verbose(VERB_ALGO, "auth zone response bad, and no"
" fallback possible, servfail");
+ errinf_dname(qstate, "reponse is bad, no fallback, "
+ "for auth zone", iq->dp->name);
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
verbose(VERB_ALGO, "auth zone response was bad, "
@@ -2948,6 +3085,8 @@ processPrimeResponse(struct module_qstate* qstate, int id)
qstate->return_rcode = LDNS_RCODE_NOERROR;
qstate->return_msg = iq->response;
} else {
+ errinf(qstate, "prime response did not get an answer");
+ errinf_dname(qstate, "for", qstate->qinfo.qname);
qstate->return_rcode = LDNS_RCODE_SERVFAIL;
qstate->return_msg = NULL;
}
@@ -3091,6 +3230,7 @@ processDSNSResponse(struct module_qstate* qstate, int id,
foriq->dp = delegpt_from_message(qstate->return_msg, forq->region);
if(!foriq->dp) {
log_err("out of memory in dsns dp alloc");
+ errinf(qstate, "malloc failure, in DS search");
return; /* dp==NULL in QUERYTARGETS makes SERVFAIL */
}
/* success, go query the querytargets in the new dp (and go down) */
@@ -3191,6 +3331,8 @@ processClassResponse(struct module_qstate* qstate, int id,
to->rep->ttl = from->rep->ttl;
if(from->rep->prefetch_ttl < to->rep->prefetch_ttl)
to->rep->prefetch_ttl = from->rep->prefetch_ttl;
+ if(from->rep->serve_expired_ttl < to->rep->serve_expired_ttl)
+ to->rep->serve_expired_ttl = from->rep->serve_expired_ttl;
}
/* are we done? */
foriq->num_current_queries --;
@@ -3229,6 +3371,8 @@ processCollectClass(struct module_qstate* qstate, int id)
c, qstate, id, iq, INIT_REQUEST_STATE,
FINISHED_STATE, &subq,
(int)!(qstate->query_flags&BIT_CD))) {
+ errinf(qstate, "could not generate class ANY"
+ " lookup query");
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
@@ -3275,6 +3419,7 @@ processFinished(struct module_qstate* qstate, struct iter_qstate* iq,
(iq->response?iq->response->rep:NULL));
if(!iq->response) {
verbose(VERB_ALGO, "No response is set, servfail");
+ errinf(qstate, "(no response found at query finish)");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -3445,6 +3590,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
iq->caps_server = 0;
iq->caps_reply = NULL;
iq->caps_response = NULL;
+ iq->caps_minimisation_state = DONOT_MINIMISE_STATE;
iq->state = QUERYTARGETS_STATE;
iq->num_current_queries--;
/* need fresh attempts for the 0x20 fallback, if
@@ -3459,6 +3605,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
|| !qstate->reply) {
log_err("Bad event combined with response");
outbound_list_remove(&iq->outlist, outbound);
+ errinf(qstate, "module iterator received wrong internal event with a response message");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return;
}
@@ -3511,6 +3658,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
iq->caps_server = 0;
iq->caps_reply = NULL;
iq->caps_response = NULL;
+ iq->caps_minimisation_state = DONOT_MINIMISE_STATE;
iq->state = QUERYTARGETS_STATE;
iq->num_current_queries--;
verbose(VERB_DETAIL, "Capsforid: scrub failed, starting fallback with no response");
@@ -3530,15 +3678,30 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
iq->response->rep);
if(event == module_event_capsfail || iq->caps_fallback) {
+ if(qstate->env->cfg->qname_minimisation &&
+ iq->minimisation_state != DONOT_MINIMISE_STATE) {
+ /* Skip QNAME minimisation for next query, since that
+ * one has to match the current query. */
+ iq->minimisation_state = SKIP_MINIMISE_STATE;
+ }
/* for fallback we care about main answer, not additionals */
/* removing that makes comparison more likely to succeed */
caps_strip_reply(iq->response->rep);
+
+ if(iq->caps_fallback &&
+ iq->caps_minimisation_state != iq->minimisation_state) {
+ /* QNAME minimisation state has changed, restart caps
+ * fallback. */
+ iq->caps_fallback = 0;
+ }
+
if(!iq->caps_fallback) {
/* start fallback */
iq->caps_fallback = 1;
iq->caps_server = 0;
iq->caps_reply = iq->response->rep;
iq->caps_response = iq->response;
+ iq->caps_minimisation_state = iq->minimisation_state;
iq->state = QUERYTARGETS_STATE;
iq->num_current_queries--;
verbose(VERB_DETAIL, "Capsforid: starting fallback");
@@ -3570,6 +3733,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
verbose(VERB_DETAIL, "Capsforid fallback: "
"getting different replies, failed");
outbound_list_remove(&iq->outlist, outbound);
+ errinf(qstate, "0x20 failed, then got different replies in fallback");
(void)error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
return;
@@ -3608,6 +3772,7 @@ iter_operate(struct module_qstate* qstate, enum module_ev event, int id,
if((event == module_event_new || event == module_event_pass) &&
iq == NULL) {
if(!iter_new(qstate, id)) {
+ errinf(qstate, "malloc failure, new iterator module allocation");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return;
}
@@ -3625,11 +3790,13 @@ iter_operate(struct module_qstate* qstate, enum module_ev event, int id,
}
if(event == module_event_error) {
verbose(VERB_ALGO, "got called with event error, giving up");
+ errinf(qstate, "iterator module got the error event");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return;
}
log_err("bad event for iterator");
+ errinf(qstate, "iterator module received wrong event");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
diff --git a/iterator/iterator.h b/iterator/iterator.h
index 67ffeb147631..57cb7c4c474e 100644
--- a/iterator/iterator.h
+++ b/iterator/iterator.h
@@ -371,6 +371,9 @@ struct iter_qstate {
/** QNAME minimisation state, RFC7816 */
enum minimisation_state minimisation_state;
+ /** State for capsfail: QNAME minimisation state for comparisons. */
+ enum minimisation_state caps_minimisation_state;
+
/**
* The query info that is sent upstream. Will be a subset of qchase
* when qname minimisation is enabled.
diff --git a/libunbound/context.c b/libunbound/context.c
index 6ac8086bf672..9a35ce56f30f 100644
--- a/libunbound/context.c
+++ b/libunbound/context.c
@@ -71,9 +71,8 @@ context_finalize(struct ub_ctx* ctx)
return UB_INITFAIL;
if(!auth_zones_apply_cfg(ctx->env->auth_zones, cfg, 1))
return UB_INITFAIL;
- if(!ctx->env->msg_cache ||
- cfg->msg_cache_size != slabhash_get_size(ctx->env->msg_cache) ||
- cfg->msg_cache_slabs != ctx->env->msg_cache->size) {
+ if(!slabhash_is_size(ctx->env->msg_cache, cfg->msg_cache_size,
+ cfg->msg_cache_slabs)) {
slabhash_delete(ctx->env->msg_cache);
ctx->env->msg_cache = slabhash_create(cfg->msg_cache_slabs,
HASH_DEFAULT_STARTARRAY, cfg->msg_cache_size,
@@ -294,26 +293,29 @@ context_serialize_answer(struct ctx_query* q, int err, sldns_buffer* pkt,
* o uint32 id
* o uint32 error_code
* o uint32 msg_security
+ * o uint32 was_ratelimited
* o uint32 length of why_bogus string (+1 for eos); 0 absent.
* o why_bogus_string
* o the remainder is the answer msg from resolver lookup.
* remainder can be length 0.
*/
+ size_t size_of_uint32s = 6 * sizeof(uint32_t);
size_t pkt_len = pkt?sldns_buffer_remaining(pkt):0;
size_t wlen = (pkt&&q->res->why_bogus)?strlen(q->res->why_bogus)+1:0;
uint8_t* p;
- *len = sizeof(uint32_t)*5 + pkt_len + wlen;
+ *len = size_of_uint32s + pkt_len + wlen;
p = (uint8_t*)malloc(*len);
if(!p) return NULL;
sldns_write_uint32(p, UB_LIBCMD_ANSWER);
sldns_write_uint32(p+sizeof(uint32_t), (uint32_t)q->querynum);
sldns_write_uint32(p+2*sizeof(uint32_t), (uint32_t)err);
sldns_write_uint32(p+3*sizeof(uint32_t), (uint32_t)q->msg_security);
- sldns_write_uint32(p+4*sizeof(uint32_t), (uint32_t)wlen);
+ sldns_write_uint32(p+4*sizeof(uint32_t), (uint32_t)q->res->was_ratelimited);
+ sldns_write_uint32(p+5*sizeof(uint32_t), (uint32_t)wlen);
if(wlen > 0)
- memmove(p+5*sizeof(uint32_t), q->res->why_bogus, wlen);
+ memmove(p+size_of_uint32s, q->res->why_bogus, wlen);
if(pkt_len > 0)
- memmove(p+5*sizeof(uint32_t)+wlen,
+ memmove(p+size_of_uint32s+wlen,
sldns_buffer_begin(pkt), pkt_len);
return p;
}
@@ -322,21 +324,23 @@ struct ctx_query*
context_deserialize_answer(struct ub_ctx* ctx,
uint8_t* p, uint32_t len, int* err)
{
+ size_t size_of_uint32s = 6 * sizeof(uint32_t);
struct ctx_query* q = NULL ;
int id;
size_t wlen;
- if(len < 5*sizeof(uint32_t)) return NULL;
+ if(len < size_of_uint32s) return NULL;
log_assert( sldns_read_uint32(p) == UB_LIBCMD_ANSWER);
id = (int)sldns_read_uint32(p+sizeof(uint32_t));
q = (struct ctx_query*)rbtree_search(&ctx->queries, &id);
if(!q) return NULL;
*err = (int)sldns_read_uint32(p+2*sizeof(uint32_t));
q->msg_security = sldns_read_uint32(p+3*sizeof(uint32_t));
- wlen = (size_t)sldns_read_uint32(p+4*sizeof(uint32_t));
- if(len > 5*sizeof(uint32_t) && wlen > 0) {
- if(len >= 5*sizeof(uint32_t)+wlen)
+ q->res->was_ratelimited = (int)sldns_read_uint32(p+4*sizeof(uint32_t));
+ wlen = (size_t)sldns_read_uint32(p+5*sizeof(uint32_t));
+ if(len > size_of_uint32s && wlen > 0) {
+ if(len >= size_of_uint32s+wlen)
q->res->why_bogus = (char*)memdup(
- p+5*sizeof(uint32_t), wlen);
+ p+size_of_uint32s, wlen);
if(!q->res->why_bogus) {
/* pass malloc failure to the user callback */
q->msg_len = 0;
@@ -345,9 +349,9 @@ context_deserialize_answer(struct ub_ctx* ctx,
}
q->res->why_bogus[wlen-1] = 0; /* zero terminated for sure */
}
- if(len > 5*sizeof(uint32_t)+wlen) {
- q->msg_len = len - 5*sizeof(uint32_t) - wlen;
- q->msg = (uint8_t*)memdup(p+5*sizeof(uint32_t)+wlen,
+ if(len > size_of_uint32s+wlen) {
+ q->msg_len = len - size_of_uint32s - wlen;
+ q->msg = (uint8_t*)memdup(p+size_of_uint32s+wlen,
q->msg_len);
if(!q->msg) {
/* pass malloc failure to the user callback */
diff --git a/libunbound/libworker.c b/libunbound/libworker.c
index 3dcaa7818f7d..05006a0ec44c 100644
--- a/libunbound/libworker.c
+++ b/libunbound/libworker.c
@@ -521,8 +521,9 @@ libworker_enter_result(struct ub_result* res, sldns_buffer* buf,
/** fillup fg results */
static void
libworker_fillup_fg(struct ctx_query* q, int rcode, sldns_buffer* buf,
- enum sec_status s, char* why_bogus)
+ enum sec_status s, char* why_bogus, int was_ratelimited)
{
+ q->res->was_ratelimited = was_ratelimited;
if(why_bogus)
q->res->why_bogus = strdup(why_bogus);
if(rcode != 0) {
@@ -546,13 +547,13 @@ libworker_fillup_fg(struct ctx_query* q, int rcode, sldns_buffer* buf,
void
libworker_fg_done_cb(void* arg, int rcode, sldns_buffer* buf, enum sec_status s,
- char* why_bogus)
+ char* why_bogus, int was_ratelimited)
{
struct ctx_query* q = (struct ctx_query*)arg;
/* fg query is done; exit comm base */
comm_base_exit(q->w->base);
- libworker_fillup_fg(q, rcode, buf, s, why_bogus);
+ libworker_fillup_fg(q, rcode, buf, s, why_bogus, was_ratelimited);
}
/** setup qinfo and edns */
@@ -603,16 +604,16 @@ int libworker_fg(struct ub_ctx* ctx, struct ctx_query* q)
NULL, 0, NULL, 0, NULL)) {
regional_free_all(w->env->scratch);
libworker_fillup_fg(q, LDNS_RCODE_NOERROR,
- w->back->udp_buff, sec_status_insecure, NULL);
+ w->back->udp_buff, sec_status_insecure, NULL, 0);
libworker_delete(w);
free(qinfo.qname);
return UB_NOERROR;
}
if(ctx->env->auth_zones && auth_zones_answer(ctx->env->auth_zones,
- w->env, &qinfo, &edns, w->back->udp_buff, w->env->scratch)) {
+ w->env, &qinfo, &edns, NULL, w->back->udp_buff, w->env->scratch)) {
regional_free_all(w->env->scratch);
libworker_fillup_fg(q, LDNS_RCODE_NOERROR,
- w->back->udp_buff, sec_status_insecure, NULL);
+ w->back->udp_buff, sec_status_insecure, NULL, 0);
libworker_delete(w);
free(qinfo.qname);
return UB_NOERROR;
@@ -634,7 +635,7 @@ int libworker_fg(struct ub_ctx* ctx, struct ctx_query* q)
void
libworker_event_done_cb(void* arg, int rcode, sldns_buffer* buf,
- enum sec_status s, char* why_bogus)
+ enum sec_status s, char* why_bogus, int was_ratelimited)
{
struct ctx_query* q = (struct ctx_query*)arg;
ub_event_callback_type cb = q->cb_event;
@@ -657,7 +658,7 @@ libworker_event_done_cb(void* arg, int rcode, sldns_buffer* buf,
else if(s == sec_status_secure)
sec = 2;
(*cb)(cb_arg, rcode, (void*)sldns_buffer_begin(buf),
- (int)sldns_buffer_limit(buf), sec, why_bogus);
+ (int)sldns_buffer_limit(buf), sec, why_bogus, was_ratelimited);
}
}
@@ -684,15 +685,15 @@ int libworker_attach_mesh(struct ub_ctx* ctx, struct ctx_query* q,
regional_free_all(w->env->scratch);
free(qinfo.qname);
libworker_event_done_cb(q, LDNS_RCODE_NOERROR,
- w->back->udp_buff, sec_status_insecure, NULL);
+ w->back->udp_buff, sec_status_insecure, NULL, 0);
return UB_NOERROR;
}
if(ctx->env->auth_zones && auth_zones_answer(ctx->env->auth_zones,
- w->env, &qinfo, &edns, w->back->udp_buff, w->env->scratch)) {
+ w->env, &qinfo, &edns, NULL, w->back->udp_buff, w->env->scratch)) {
regional_free_all(w->env->scratch);
free(qinfo.qname);
libworker_event_done_cb(q, LDNS_RCODE_NOERROR,
- w->back->udp_buff, sec_status_insecure, NULL);
+ w->back->udp_buff, sec_status_insecure, NULL, 0);
return UB_NOERROR;
}
/* process new query */
@@ -710,7 +711,7 @@ int libworker_attach_mesh(struct ub_ctx* ctx, struct ctx_query* q,
/** add result to the bg worker result queue */
static void
add_bg_result(struct libworker* w, struct ctx_query* q, sldns_buffer* pkt,
- int err, char* reason)
+ int err, char* reason, int was_ratelimited)
{
uint8_t* msg = NULL;
uint32_t len = 0;
@@ -724,19 +725,23 @@ add_bg_result(struct libworker* w, struct ctx_query* q, sldns_buffer* pkt,
lock_basic_lock(&w->ctx->cfglock);
if(reason)
q->res->why_bogus = strdup(reason);
+ q->res->was_ratelimited = was_ratelimited;
if(pkt) {
q->msg_len = sldns_buffer_remaining(pkt);
q->msg = memdup(sldns_buffer_begin(pkt), q->msg_len);
- if(!q->msg)
- msg = context_serialize_answer(q, UB_NOMEM,
- NULL, &len);
- else msg = context_serialize_answer(q, err,
- NULL, &len);
- } else msg = context_serialize_answer(q, err, NULL, &len);
+ if(!q->msg) {
+ msg = context_serialize_answer(q, UB_NOMEM, NULL, &len);
+ } else {
+ msg = context_serialize_answer(q, err, NULL, &len);
+ }
+ } else {
+ msg = context_serialize_answer(q, err, NULL, &len);
+ }
lock_basic_unlock(&w->ctx->cfglock);
} else {
if(reason)
q->res->why_bogus = strdup(reason);
+ q->res->was_ratelimited = was_ratelimited;
msg = context_serialize_answer(q, err, pkt, &len);
(void)rbtree_delete(&w->ctx->queries, q->node.key);
w->ctx->num_async--;
@@ -755,7 +760,7 @@ add_bg_result(struct libworker* w, struct ctx_query* q, sldns_buffer* pkt,
void
libworker_bg_done_cb(void* arg, int rcode, sldns_buffer* buf, enum sec_status s,
- char* why_bogus)
+ char* why_bogus, int was_ratelimited)
{
struct ctx_query* q = (struct ctx_query*)arg;
@@ -773,12 +778,13 @@ libworker_bg_done_cb(void* arg, int rcode, sldns_buffer* buf, enum sec_status s,
return;
}
q->msg_security = s;
- if(!buf)
+ if(!buf) {
buf = q->w->env->scratch_buffer;
+ }
if(rcode != 0) {
error_encode(buf, rcode, NULL, 0, BIT_RD, NULL);
}
- add_bg_result(q->w, q, buf, UB_NOERROR, why_bogus);
+ add_bg_result(q->w, q, buf, UB_NOERROR, why_bogus, was_ratelimited);
}
@@ -803,7 +809,7 @@ handle_newq(struct libworker* w, uint8_t* buf, uint32_t len)
return;
}
if(!setup_qinfo_edns(w, q, &qinfo, &edns)) {
- add_bg_result(w, q, NULL, UB_SYNTAX, NULL);
+ add_bg_result(w, q, NULL, UB_SYNTAX, NULL, 0);
return;
}
qid = 0;
@@ -816,15 +822,15 @@ handle_newq(struct libworker* w, uint8_t* buf, uint32_t len)
NULL, 0, NULL, 0, NULL)) {
regional_free_all(w->env->scratch);
q->msg_security = sec_status_insecure;
- add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL);
+ add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL, 0);
free(qinfo.qname);
return;
}
if(w->ctx->env->auth_zones && auth_zones_answer(w->ctx->env->auth_zones,
- w->env, &qinfo, &edns, w->back->udp_buff, w->env->scratch)) {
+ w->env, &qinfo, &edns, NULL, w->back->udp_buff, w->env->scratch)) {
regional_free_all(w->env->scratch);
q->msg_security = sec_status_insecure;
- add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL);
+ add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL, 0);
free(qinfo.qname);
return;
}
@@ -832,7 +838,7 @@ handle_newq(struct libworker* w, uint8_t* buf, uint32_t len)
/* process new query */
if(!mesh_new_callback(w->env->mesh, &qinfo, qflags, &edns,
w->back->udp_buff, qid, libworker_bg_done_cb, q)) {
- add_bg_result(w, q, NULL, UB_NOMEM, NULL);
+ add_bg_result(w, q, NULL, UB_NOMEM, NULL, 0);
}
free(qinfo.qname);
}
diff --git a/libunbound/python/examples/dnssec_test.py b/libunbound/python/examples/dnssec_test.py
index 430e51a8068a..b76c0437e3f6 100644
--- a/libunbound/python/examples/dnssec_test.py
+++ b/libunbound/python/examples/dnssec_test.py
@@ -29,6 +29,7 @@ def dnssecParse(domain, rrType=RR_TYPE_A):
resolver = ub_ctx()
resolver.add_ta(". IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5")
+resolver.add_ta(". IN DS 20326 8 2 E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D")
dnssecParse("nic.cz")
dnssecParse("nonexistent-domain-blablabla.cz")
diff --git a/libunbound/unbound-event.h b/libunbound/unbound-event.h
index d5f0b1a36fe7..4d694b8b4c5d 100644
--- a/libunbound/unbound-event.h
+++ b/libunbound/unbound-event.h
@@ -170,7 +170,7 @@ struct ub_event {
struct ub_event_vmt* vmt;
};
-typedef void (*ub_event_callback_type)(void*, int, void*, int, int, char*);
+typedef void (*ub_event_callback_type)(void*, int, void*, int, int, char*, int);
/**
* Create a resolving and validation context.
diff --git a/libunbound/unbound.h b/libunbound/unbound.h
index fbd69cab0e71..90766b062363 100644
--- a/libunbound/unbound.h
+++ b/libunbound/unbound.h
@@ -204,6 +204,12 @@ struct ub_result {
char* why_bogus;
/**
+ * If the query or one of its subqueries was ratelimited. Useful if
+ * ratelimiting is enabled and answer is SERVFAIL.
+ */
+ int was_ratelimited;
+
+ /**
* TTL for the result, in seconds. If the security is bogus, then
* you also cannot trust this value.
*/
@@ -674,6 +680,8 @@ struct ub_server_stats {
long long qtcp;
/** number of outgoing queries over TCP */
long long qtcp_outgoing;
+ /** number of queries over (DNS over) TLS */
+ long long qtls;
/** number of queries over IPv6 */
long long qipv6;
/** number of queries with QR bit */
@@ -757,6 +765,11 @@ struct ub_server_stats {
/** number of times neg cache records were used to generate NXDOMAIN
* responses. */
long long num_neg_cache_nxdomain;
+ /** number of queries answered from edns-subnet specific data */
+ long long num_query_subnet;
+ /** number of queries answered from edns-subnet specific data, and
+ * the answer was from the edns-subnet cache. */
+ long long num_query_subnet_cache;
};
/**
diff --git a/libunbound/worker.h b/libunbound/worker.h
index 7d2ede04ed09..fe1d51878a89 100644
--- a/libunbound/worker.h
+++ b/libunbound/worker.h
@@ -89,15 +89,15 @@ void libworker_handle_control_cmd(struct tube* tube, uint8_t* msg, size_t len,
/** mesh callback with fg results */
void libworker_fg_done_cb(void* arg, int rcode, sldns_buffer* buf,
- enum sec_status s, char* why_bogus);
+ enum sec_status s, char* why_bogus, int was_ratelimited);
/** mesh callback with bg results */
void libworker_bg_done_cb(void* arg, int rcode, sldns_buffer* buf,
- enum sec_status s, char* why_bogus);
+ enum sec_status s, char* why_bogus, int was_ratelimited);
/** mesh callback with event results */
void libworker_event_done_cb(void* arg, int rcode, struct sldns_buffer* buf,
- enum sec_status s, char* why_bogus);
+ enum sec_status s, char* why_bogus, int was_ratelimited);
/**
* Worker signal handler function. User argument is the worker itself.
diff --git a/pythonmod/doc/examples/example6.rst b/pythonmod/doc/examples/example6.rst
index eb3254022946..d294fb8be618 100644
--- a/pythonmod/doc/examples/example6.rst
+++ b/pythonmod/doc/examples/example6.rst
@@ -40,9 +40,12 @@ The callback function's prototype is the following:
.. code-block:: python
- def inplace_reply_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
- """Function that will be registered as an inplace callback function.
+ def inplace_reply_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering with a resolved query.
+
:param qinfo: query_info struct;
:param qstate: module qstate. It contains the available opt_lists; It
SHOULD NOT be altered;
@@ -54,7 +57,13 @@ The callback function's prototype is the following:
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh states.
+
:return: True on success, False on failure.
+
"""
.. note:: The function's name is irrelevant.
@@ -76,9 +85,12 @@ The callback function's prototype is the following:
.. code-block:: python
- def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
- """Function that will be registered as an inplace callback function.
+ def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering from the cache.
+
:param qinfo: query_info struct;
:param qstate: module qstate. None;
:param rep: reply_info struct;
@@ -90,7 +102,17 @@ The callback function's prototype is the following:
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
+
+ For demonstration purposes we want to see if EDNS option 65002 is present
+ and reply with a new value.
+
"""
.. note:: The function's name is irrelevant.
@@ -112,9 +134,12 @@ The callback function's prototype is the following:
.. code-block:: python
- def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
- """Function that will be registered as an inplace callback function.
+ def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering from local data.
+
:param qinfo: query_info struct;
:param qstate: module qstate. None;
:param rep: reply_info struct;
@@ -126,7 +151,14 @@ The callback function's prototype is the following:
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
+
"""
.. note:: The function's name is irrelevant.
@@ -148,9 +180,12 @@ The callback function's prototype is the following:
.. code-block:: python
- def inplace_servfail_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
- """Function that will be registered as an inplace callback function.
+ def inplace_servfail_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering with SERVFAIL.
+
:param qinfo: query_info struct;
:param qstate: module qstate. If not None the relevant opt_lists are
available here;
@@ -163,7 +198,17 @@ The callback function's prototype is the following:
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
+
+ For demonstration purposes we want to reply with an empty EDNS code '65003'
+ and log the IP address(es) of the client(s).
+
"""
.. note:: The function's name is irrelevant.
diff --git a/pythonmod/examples/inplace_callbacks.py b/pythonmod/examples/inplace_callbacks.py
index 02ee56e36e21..e47fc8292be2 100644
--- a/pythonmod/examples/inplace_callbacks.py
+++ b/pythonmod/examples/inplace_callbacks.py
@@ -6,18 +6,18 @@
Copyright (c) 2016, NLnet Labs.
This software is open source.
-
+
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 organization nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
@@ -43,6 +43,8 @@
# This query returns SERVFAIL as the txt record of bogus.nlnetlabs.nl is
# intentionally bogus. The reply will contain an empty EDNS option
# with option code 65003.
+# Unbound will also log the source address(es) of the client(s) that made
+# the request.
# (unbound needs to be validating for this example to work)
# Useful functions:
@@ -70,9 +72,11 @@
def inplace_reply_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
- region):
- """Function that will be registered as an inplace callback function.
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering with a resolved query.
+
:param qinfo: query_info struct;
:param qstate: module qstate. It contains the available opt_lists; It
SHOULD NOT be altered;
@@ -84,16 +88,25 @@ def inplace_reply_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
+
"""
log_info("python: called back while replying.")
return True
def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
- region):
- """Function that will be registered as an inplace callback function.
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering from the cache.
+
:param qinfo: query_info struct;
:param qstate: module qstate. None;
:param rep: reply_info struct;
@@ -105,10 +118,17 @@ def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
For demonstration purposes we want to see if EDNS option 65002 is present
and reply with a new value.
+
"""
log_info("python: called back while answering from cache.")
# Inspect the incoming EDNS options.
@@ -134,9 +154,11 @@ def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
- region):
- """Function that will be registered as an inplace callback function.
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering from local data.
+
:param qinfo: query_info struct;
:param qstate: module qstate. None;
:param rep: reply_info struct;
@@ -148,7 +170,14 @@ def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
+
"""
log_info("python: called back while replying with local data or chaos"
" reply.")
@@ -156,9 +185,11 @@ def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
def inplace_servfail_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
- region):
- """Function that will be registered as an inplace callback function.
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering with SERVFAIL.
+
:param qinfo: query_info struct;
:param qstate: module qstate. If not None the relevant opt_lists are
available here;
@@ -171,23 +202,62 @@ def inplace_servfail_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
- For demonstration purposes we want to reply with an empty EDNS code '65003'.
+ For demonstration purposes we want to reply with an empty EDNS code '65003'
+ and log the IP address(es) of the client(s).
+
"""
log_info("python: called back while servfail.")
+ # Append the example ENDS option
b = bytearray.fromhex("")
edns_opt_list_append(opt_list_out, 65003, b, region)
+
+ # Log the client(s) IP address(es)
+ comm_reply = kwargs['repinfo']
+ if comm_reply:
+ # If it is not None this callback was called before the query reached
+ # the mesh states(modules). There is only one client associated with
+ # this query.
+ addr = comm_reply.addr
+ port = comm_reply.port
+ addr_family = comm_reply.family
+ log_info("python: Client IP: {}({}), port: {}"
+ "".format(addr, addr_family, port))
+ else:
+ # If it is not None this callback was called while the query is in the
+ # mesh states(modules). In this case they may be multiple clients
+ # waiting for this query.
+ # The following code is the same as with the resip.py example.
+ rl = qstate.mesh_info.reply_list
+ while (rl):
+ if rl.query_reply:
+ q = rl.query_reply
+ log_info("python: Client IP: {}({}), port: {}"
+ "".format(q.addr, q.family, q.port))
+ rl = rl.next
+
+
return True
def init_standard(id, env):
- """New version of the init function.
+ """
+ New version of the init function.
+
The function's signature is the same as the C counterpart and allows for
extra functionality during init.
+
..note:: This function is preferred by unbound over the old init function.
..note:: The previously accessible configuration options can now be found in
env.cgf.
+
"""
log_info("python: inited script {}".format(env.cfg.python_script))
@@ -215,11 +285,14 @@ def init_standard(id, env):
def init(id, cfg):
- """Previous version init function.
+ """
+ Previous version of the init function.
+
..note:: This function is still supported for backwards compatibility when
the init_standard function is missing. When init_standard is
present this function SHOULD be omitted to avoid confusion to the
reader.
+
"""
return True
diff --git a/pythonmod/examples/resip.py b/pythonmod/examples/resip.py
index 6bcac7252cd2..4a9f24fc6448 100644
--- a/pythonmod/examples/resip.py
+++ b/pythonmod/examples/resip.py
@@ -47,7 +47,7 @@ def deinit(id): return True
def inform_super(id, qstate, superqstate, qdata): return True
def operate(id, event, qstate, qdata):
- print "Operate", event,"state:",qstate
+ print("Operate {} state: {}".format(event, qstate))
# Please note that if this module blocks, by moving to the validator
# to validate or iterator to lookup or spawn a subquery to look up,
@@ -61,14 +61,14 @@ def operate(id, event, qstate, qdata):
msg = DNSMessage(qstate.qinfo.qname_str, RR_TYPE_TXT, RR_CLASS_IN, PKT_QR | PKT_RA | PKT_AA)
#append RR
if (qstate.qinfo.qtype == RR_TYPE_TXT) or (qstate.qinfo.qtype == RR_TYPE_ANY):
- rl = qstate.mesh_info.reply_list
- while (rl):
- if rl.query_reply:
- q = rl.query_reply
- # The TTL of 0 is mandatory, otherwise it ends up in
- # the cache, and is returned to other IP addresses.
- msg.answer.append("%s 0 IN TXT \"%s %d (%s)\"" % (qstate.qinfo.qname_str, q.addr,q.port,q.family))
- rl = rl.next
+ rl = qstate.mesh_info.reply_list
+ while (rl):
+ if rl.query_reply:
+ q = rl.query_reply
+ # The TTL of 0 is mandatory, otherwise it ends up in
+ # the cache, and is returned to other IP addresses.
+ msg.answer.append("%s 0 IN TXT \"%s %d (%s)\"" % (qstate.qinfo.qname_str, q.addr,q.port,q.family))
+ rl = rl.next
#set qstate.return_msg
if not msg.set_return_msg(qstate):
@@ -90,7 +90,7 @@ def operate(id, event, qstate, qdata):
log_info("pythonmod: iterator module done")
qstate.ext_state[id] = MODULE_FINISHED
return True
-
+
log_err("pythonmod: bad event")
qstate.ext_state[id] = MODULE_ERROR
return True
diff --git a/pythonmod/interface.i b/pythonmod/interface.i
index df06d1064b04..96accb69cca6 100644
--- a/pythonmod/interface.i
+++ b/pythonmod/interface.i
@@ -1365,11 +1365,12 @@ int edns_opt_list_append(struct edns_option** list, uint16_t code, size_t len,
int python_inplace_cb_reply_generic(struct query_info* qinfo,
struct module_qstate* qstate, struct reply_info* rep, int rcode,
struct edns_data* edns, struct edns_option** opt_list_out,
- struct regional* region, int id, void* python_callback)
+ struct comm_reply* repinfo, struct regional* region, int id,
+ void* python_callback)
{
PyObject *func, *py_edns, *py_qstate, *py_opt_list_out, *py_qinfo;
- PyObject *py_rep, *py_region;
- PyObject *result;
+ PyObject *py_rep, *py_repinfo, *py_region;
+ PyObject *py_args, *py_kwargs, *result;
int res = 0;
PyGILState_STATE gstate = PyGILState_Ensure();
@@ -1381,15 +1382,21 @@ int edns_opt_list_append(struct edns_option** list, uint16_t code, size_t len,
SWIGTYPE_p_p_edns_option, 0);
py_qinfo = SWIG_NewPointerObj((void*) qinfo, SWIGTYPE_p_query_info, 0);
py_rep = SWIG_NewPointerObj((void*) rep, SWIGTYPE_p_reply_info, 0);
+ py_repinfo = SWIG_NewPointerObj((void*) repinfo, SWIGTYPE_p_comm_reply, 0);
py_region = SWIG_NewPointerObj((void*) region, SWIGTYPE_p_regional, 0);
- result = PyObject_CallFunction(func, "OOOiOOO", py_qinfo, py_qstate,
- py_rep, rcode, py_edns, py_opt_list_out, py_region);
+ py_args = Py_BuildValue("(OOOiOOO)", py_qinfo, py_qstate, py_rep,
+ rcode, py_edns, py_opt_list_out, py_region);
+ py_kwargs = Py_BuildValue("{s:O}", "repinfo", py_repinfo);
+ result = PyObject_Call(func, py_args, py_kwargs);
Py_XDECREF(py_edns);
Py_XDECREF(py_qstate);
Py_XDECREF(py_opt_list_out);
Py_XDECREF(py_qinfo);
Py_XDECREF(py_rep);
+ Py_XDECREF(py_repinfo);
Py_XDECREF(py_region);
+ Py_XDECREF(py_args);
+ Py_XDECREF(py_kwargs);
if (result) {
res = PyInt_AsLong(result);
}
diff --git a/pythonmod/pythonmod.h b/pythonmod/pythonmod.h
index 7c7c0e751c30..991ae51a20a7 100644
--- a/pythonmod/pythonmod.h
+++ b/pythonmod/pythonmod.h
@@ -72,5 +72,6 @@ size_t pythonmod_get_mem(struct module_env* env, int id);
int python_inplace_cb_reply_generic(struct query_info* qinfo,
struct module_qstate* qstate, struct reply_info* rep, int rcode,
struct edns_data* edns, struct edns_option** opt_list_out,
- struct regional* region, int id, void* python_callback);
+ struct comm_reply* repinfo, struct regional* region, int id,
+ void* python_callback);
#endif /* PYTHONMOD_H */
diff --git a/respip/respip.c b/respip/respip.c
index 2e9313f271bb..135c45fe53c6 100644
--- a/respip/respip.c
+++ b/respip/respip.c
@@ -611,8 +611,9 @@ make_new_reply_info(const struct reply_info* rep, struct regional* region,
* EDNS0 OPT RR in the additional section appended on sending it out),
* so the total number of RRsets is an_numrrsets. */
new_rep = construct_reply_info_base(region, rep->flags,
- rep->qdcount, rep->ttl, rep->prefetch_ttl, an_numrrsets,
- 0, 0, an_numrrsets, sec_status_insecure);
+ rep->qdcount, rep->ttl, rep->prefetch_ttl,
+ rep->serve_expired_ttl, an_numrrsets, 0, 0, an_numrrsets,
+ sec_status_insecure);
if(!new_rep)
return NULL;
if(!reply_info_alloc_rrset_keys(new_rep, NULL, region))
diff --git a/services/authzone.c b/services/authzone.c
index f1ca2a2b0552..fe56c9f81b65 100644
--- a/services/authzone.c
+++ b/services/authzone.c
@@ -185,11 +185,13 @@ msg_ttl(struct dns_msg* msg)
if(msg->rep->rrset_count == 1) {
msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[0]);
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
} else if(get_rrset_ttl(msg->rep->rrsets[msg->rep->rrset_count-1]) <
msg->rep->ttl) {
msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[
msg->rep->rrset_count-1]);
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
}
}
@@ -1014,7 +1016,8 @@ rrset_moveover_rrsigs(struct auth_data* node, uint16_t rr_type,
}
/* copy base values */
memcpy(sigd, sigold, sizeof(struct packed_rrset_data));
- sigd->rrsig_count -= sigs;
+ /* in sigd the RRSIGs are stored in the base of the RR, in count */
+ sigd->count -= sigs;
/* setup rr_len */
sigd->rr_len = (size_t*)((uint8_t*)sigd +
sizeof(struct packed_rrset_data));
@@ -2284,6 +2287,7 @@ az_add_negative_soa(struct auth_zone* z, struct regional* region,
d->rr_ttl[0] = (time_t)minimum;
msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[0]);
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
return 1;
}
@@ -3168,8 +3172,8 @@ int auth_zones_lookup(struct auth_zones* az, struct query_info* qinfo,
/** encode auth answer */
static void
auth_answer_encode(struct query_info* qinfo, struct module_env* env,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- struct dns_msg* msg)
+ struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* buf,
+ struct regional* temp, struct dns_msg* msg)
{
uint16_t udpsize;
udpsize = edns->udp_size;
@@ -3179,7 +3183,7 @@ auth_answer_encode(struct query_info* qinfo, struct module_env* env,
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_local_call(env, qinfo, NULL, msg->rep,
- (int)FLAGS_GET_RCODE(msg->rep->flags), edns, temp)
+ (int)FLAGS_GET_RCODE(msg->rep->flags), edns, repinfo, temp)
|| !reply_info_answer_encode(qinfo, msg->rep,
*(uint16_t*)sldns_buffer_begin(buf),
sldns_buffer_read_u16_at(buf, 2),
@@ -3194,8 +3198,8 @@ auth_answer_encode(struct query_info* qinfo, struct module_env* env,
/** encode auth error answer */
static void
auth_error_encode(struct query_info* qinfo, struct module_env* env,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- int rcode)
+ struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* buf,
+ struct regional* temp, int rcode)
{
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
@@ -3203,7 +3207,7 @@ auth_error_encode(struct query_info* qinfo, struct module_env* env,
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_local_call(env, qinfo, NULL, NULL,
- rcode, edns, temp))
+ rcode, edns, repinfo, temp))
edns->opt_list = NULL;
error_encode(buf, rcode|BIT_AA, qinfo,
*(uint16_t*)sldns_buffer_begin(buf),
@@ -3211,8 +3215,8 @@ auth_error_encode(struct query_info* qinfo, struct module_env* env,
}
int auth_zones_answer(struct auth_zones* az, struct module_env* env,
- struct query_info* qinfo, struct edns_data* edns, struct sldns_buffer* buf,
- struct regional* temp)
+ struct query_info* qinfo, struct edns_data* edns,
+ struct comm_reply* repinfo, struct sldns_buffer* buf, struct regional* temp)
{
struct dns_msg* msg = NULL;
struct auth_zone* z;
@@ -3260,9 +3264,9 @@ int auth_zones_answer(struct auth_zones* az, struct module_env* env,
/* encode answer */
if(!r)
- auth_error_encode(qinfo, env, edns, buf, temp,
+ auth_error_encode(qinfo, env, edns, repinfo, buf, temp,
LDNS_RCODE_SERVFAIL);
- else auth_answer_encode(qinfo, env, edns, buf, temp, msg);
+ else auth_answer_encode(qinfo, env, edns, repinfo, buf, temp, msg);
return 1;
}
@@ -3470,6 +3474,23 @@ int auth_zones_notify(struct auth_zones* az, struct module_env* env,
return 1;
}
+int auth_zones_startprobesequence(struct auth_zones* az,
+ struct module_env* env, uint8_t* nm, size_t nmlen, uint16_t dclass)
+{
+ struct auth_xfer* xfr;
+ lock_rw_rdlock(&az->lock);
+ xfr = auth_xfer_find(az, nm, nmlen, dclass);
+ if(!xfr) {
+ lock_rw_unlock(&az->lock);
+ return 0;
+ }
+ lock_basic_lock(&xfr->lock);
+ lock_rw_unlock(&az->lock);
+
+ xfr_process_notify(xfr, env, 0, 0, NULL);
+ return 1;
+}
+
/** set a zone expired */
static void
auth_xfer_set_expired(struct auth_xfer* xfr, struct module_env* env,
@@ -5073,7 +5094,8 @@ xfr_transfer_nexttarget_or_end(struct auth_xfer* xfr, struct module_env* env)
xfr_transfer_disown(xfr);
/* pick up the nextprobe task and wait */
- xfr_set_timeout(xfr, env, 1, 0);
+ if(xfr->task_nextprobe->worker == NULL)
+ xfr_set_timeout(xfr, env, 1, 0);
lock_basic_unlock(&xfr->lock);
}
@@ -5132,7 +5154,8 @@ xfr_master_add_addrs(struct auth_master* m, struct ub_packed_rrset_key* rrset,
/** callback for task_transfer lookup of host name, of A or AAAA */
void auth_xfer_transfer_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
- enum sec_status ATTR_UNUSED(sec), char* ATTR_UNUSED(why_bogus))
+ enum sec_status ATTR_UNUSED(sec), char* ATTR_UNUSED(why_bogus),
+ int ATTR_UNUSED(was_ratelimited))
{
struct auth_xfer* xfr = (struct auth_xfer*)arg;
struct module_env* env;
@@ -5530,7 +5553,8 @@ process_list_end_transfer(struct auth_xfer* xfr, struct module_env* env)
return;
} else {
/* pick up the nextprobe task and wait (normail wait time) */
- xfr_set_timeout(xfr, env, 0, 0);
+ if(xfr->task_nextprobe->worker == NULL)
+ xfr_set_timeout(xfr, env, 0, 0);
}
lock_basic_unlock(&xfr->lock);
return;
@@ -5871,29 +5895,35 @@ auth_xfer_probe_udp_callback(struct comm_point* c, void* arg, int err,
return 0;
}
+ /* other tasks are running, we don't do this anymore */
+ xfr_probe_disown(xfr);
+ lock_basic_unlock(&xfr->lock);
+ /* return, we don't sent a reply to this udp packet,
+ * and we setup the tasks to do next */
+ return 0;
} else {
- /* if zone not updated, start the wait timer again */
- verbose(VERB_ALGO, "auth_zone unchanged, new lease, wait");
- if(xfr->have_zone)
- xfr->lease_time = *env->now;
- if(xfr->task_nextprobe->worker == NULL)
- xfr_set_timeout(xfr, env, 0, 0);
+ verbose(VERB_ALGO, "auth_zone master reports unchanged soa serial");
+ /* we if cannot find updates amongst the
+ * masters, this means we then have a new lease
+ * on the zone */
+ xfr->task_probe->have_new_lease = 1;
+ }
+ } else {
+ if(verbosity >= VERB_ALGO) {
+ char buf[256];
+ dname_str(xfr->name, buf);
+ verbose(VERB_ALGO, "auth zone %s: bad reply to soa probe", buf);
}
- /* other tasks are running, we don't do this anymore */
- xfr_probe_disown(xfr);
- lock_basic_unlock(&xfr->lock);
- /* return, we don't sent a reply to this udp packet,
- * and we setup the tasks to do next */
- return 0;
}
- }
- if(verbosity >= VERB_ALGO) {
- char buf[256];
- dname_str(xfr->name, buf);
- verbose(VERB_ALGO, "auth zone %s: soa probe failed", buf);
+ } else {
+ if(verbosity >= VERB_ALGO) {
+ char buf[256];
+ dname_str(xfr->name, buf);
+ verbose(VERB_ALGO, "auth zone %s: soa probe failed", buf);
+ }
}
- /* failed lookup */
+ /* failed lookup or not an update */
/* delete commpoint so a new one is created, with a fresh port nr */
comm_point_delete(xfr->task_probe->cp);
xfr->task_probe->cp = NULL;
@@ -5996,7 +6026,8 @@ xfr_probe_send_or_end(struct auth_xfer* xfr, struct module_env* env)
/* only wanted lookups for copy, stop probe and start wait */
xfr->task_probe->only_lookup = 0;
xfr_probe_disown(xfr);
- xfr_set_timeout(xfr, env, 0, 0);
+ if(xfr->task_nextprobe->worker == NULL)
+ xfr_set_timeout(xfr, env, 0, 0);
lock_basic_unlock(&xfr->lock);
return;
}
@@ -6012,18 +6043,31 @@ xfr_probe_send_or_end(struct auth_xfer* xfr, struct module_env* env)
xfr_probe_nextmaster(xfr);
}
- /* we failed to send this as well, move to the wait task,
- * use the shorter retry timeout */
- xfr_probe_disown(xfr);
+ /* done with probe sequence, wait */
+ if(xfr->task_probe->have_new_lease) {
+ /* if zone not updated, start the wait timer again */
+ verbose(VERB_ALGO, "auth_zone unchanged, new lease, wait");
+ xfr_probe_disown(xfr);
+ if(xfr->have_zone)
+ xfr->lease_time = *env->now;
+ if(xfr->task_nextprobe->worker == NULL)
+ xfr_set_timeout(xfr, env, 0, 0);
+ } else {
+ /* we failed to send this as well, move to the wait task,
+ * use the shorter retry timeout */
+ xfr_probe_disown(xfr);
+ /* pick up the nextprobe task and wait */
+ if(xfr->task_nextprobe->worker == NULL)
+ xfr_set_timeout(xfr, env, 1, 0);
+ }
- /* pick up the nextprobe task and wait */
- xfr_set_timeout(xfr, env, 1, 0);
lock_basic_unlock(&xfr->lock);
}
/** callback for task_probe lookup of host name, of A or AAAA */
void auth_xfer_probe_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
- enum sec_status ATTR_UNUSED(sec), char* ATTR_UNUSED(why_bogus))
+ enum sec_status ATTR_UNUSED(sec), char* ATTR_UNUSED(why_bogus),
+ int ATTR_UNUSED(was_ratelimited))
{
struct auth_xfer* xfr = (struct auth_xfer*)arg;
struct module_env* env;
@@ -6151,6 +6195,8 @@ xfr_start_probe(struct auth_xfer* xfr, struct module_env* env,
xfr->task_probe->cp = NULL;
/* start the task */
+ /* have not seen a new lease yet, this scan */
+ xfr->task_probe->have_new_lease = 0;
/* if this was a timeout, no specific first master to scan */
/* otherwise, spec is nonNULL the notified master, scan
* first and also transfer first from it */
diff --git a/services/authzone.h b/services/authzone.h
index 4e06c0654d99..8c636eaa446c 100644
--- a/services/authzone.h
+++ b/services/authzone.h
@@ -309,6 +309,9 @@ struct auth_probe {
/** we only want to do lookups for making config work (for notify),
* don't proceed with UDP SOA probe queries */
int only_lookup;
+ /** we have seen a new lease this scan, because one of the masters
+ * replied with the current SOA serial version */
+ int have_new_lease;
/** once notified, or the timeout has been reached. a scan starts. */
/** the scan specific target (notify source), or NULL if none */
@@ -509,12 +512,13 @@ int auth_zones_lookup(struct auth_zones* az, struct query_info* qinfo,
* @param qinfo: query info (parsed).
* @param edns: edns info (parsed).
* @param buf: buffer with query ID and flags, also for reply.
+ * @param repinfo: reply information for a communication point.
* @param temp: temporary storage region.
* @return false if not answered
*/
int auth_zones_answer(struct auth_zones* az, struct module_env* env,
- struct query_info* qinfo, struct edns_data* edns, struct sldns_buffer* buf,
- struct regional* temp);
+ struct query_info* qinfo, struct edns_data* edns,
+ struct comm_reply* repinfo, struct sldns_buffer* buf, struct regional* temp);
/**
* Find the auth zone that is above the given qname.
@@ -588,6 +592,12 @@ int auth_zones_notify(struct auth_zones* az, struct module_env* env,
* returns 0 if no soa record in the notify */
int auth_zone_parse_notify_serial(struct sldns_buffer* pkt, uint32_t *serial);
+/** for the zone and if not already going, starts the probe sequence.
+ * false if zone cannot be found. This is like a notify arrived and was
+ * accepted for that zone. */
+int auth_zones_startprobesequence(struct auth_zones* az,
+ struct module_env* env, uint8_t* nm, size_t nmlen, uint16_t dclass);
+
/** read auth zone from zonefile. caller must lock zone. false on failure */
int auth_zone_read_zonefile(struct auth_zone* z);
@@ -637,10 +647,12 @@ int auth_xfer_transfer_http_callback(struct comm_point* c, void* arg, int err,
void auth_xfer_probe_timer_callback(void* arg);
/** mesh callback for task_probe on lookup of host names */
void auth_xfer_probe_lookup_callback(void* arg, int rcode,
- struct sldns_buffer* buf, enum sec_status sec, char* why_bogus);
+ struct sldns_buffer* buf, enum sec_status sec, char* why_bogus,
+ int was_ratelimited);
/** mesh callback for task_transfer on lookup of host names */
void auth_xfer_transfer_lookup_callback(void* arg, int rcode,
- struct sldns_buffer* buf, enum sec_status sec, char* why_bogus);
+ struct sldns_buffer* buf, enum sec_status sec, char* why_bogus,
+ int was_ratelimited);
/*
* Compares two 32-bit serial numbers as defined in RFC1982. Returns
diff --git a/services/cache/dns.c b/services/cache/dns.c
index 35adc35b57ee..01c9a8c5c10a 100644
--- a/services/cache/dns.c
+++ b/services/cache/dns.c
@@ -109,7 +109,7 @@ store_rrsets(struct module_env* env, struct reply_info* rep, time_t now,
}
/** delete message from message cache */
-static void
+void
msg_cache_remove(struct module_env* env, uint8_t* qname, size_t qnamelen,
uint16_t qtype, uint16_t qclass, uint16_t flags)
{
@@ -547,6 +547,7 @@ tomsg(struct module_env* env, struct query_info* q, struct reply_info* r,
if(r->prefetch_ttl > now)
msg->rep->prefetch_ttl = r->prefetch_ttl - now;
else msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
msg->rep->security = r->security;
msg->rep->an_numrrsets = r->an_numrrsets;
msg->rep->ns_numrrsets = r->ns_numrrsets;
@@ -601,6 +602,7 @@ rrset_msg(struct ub_packed_rrset_key* rrset, struct regional* region,
msg->rep->qdcount = 1;
msg->rep->ttl = d->ttl - now;
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
msg->rep->security = sec_status_unchecked;
msg->rep->an_numrrsets = 1;
msg->rep->ns_numrrsets = 0;
@@ -638,6 +640,7 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct regional* region,
msg->rep->qdcount = 1;
msg->rep->ttl = d->ttl - now;
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
msg->rep->security = sec_status_unchecked;
msg->rep->an_numrrsets = 1;
msg->rep->ns_numrrsets = 0;
@@ -696,6 +699,7 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct regional* region,
newd->rr_ttl[0] = newd->ttl;
msg->rep->ttl = newd->ttl;
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(newd->ttl);
+ msg->rep->serve_expired_ttl = newd->ttl + SERVE_EXPIRED_TTL;
sldns_write_uint16(newd->rr_data[0], newlen);
memmove(newd->rr_data[0] + sizeof(uint16_t), newname, newlen);
msg->rep->an_numrrsets ++;
diff --git a/services/cache/dns.h b/services/cache/dns.h
index 78f81e799522..19d0d9f992d1 100644
--- a/services/cache/dns.h
+++ b/services/cache/dns.h
@@ -238,4 +238,16 @@ struct msgreply_entry* msg_cache_lookup(struct module_env* env,
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
uint16_t flags, time_t now, int wr);
+/**
+ * Remove entry from the message cache. For unwanted entries.
+ * @param env: with message cache.
+ * @param qname: query name, in wireformat
+ * @param qnamelen: length of qname, including terminating 0.
+ * @param qtype: query type, host order.
+ * @param qclass: query class, host order.
+ * @param flags: flags
+ */
+void msg_cache_remove(struct module_env* env, uint8_t* qname, size_t qnamelen,
+ uint16_t qtype, uint16_t qclass, uint16_t flags);
+
#endif /* SERVICES_CACHE_DNS_H */
diff --git a/services/cache/infra.c b/services/cache/infra.c
index f4320306daa2..6f8fea6ad826 100644
--- a/services/cache/infra.c
+++ b/services/cache/infra.c
@@ -215,6 +215,18 @@ static int infra_ratelimit_cfg_insert(struct infra_cache* infra,
return 1;
}
+/** setup domain limits tree (0 on failure) */
+static int
+setup_domain_limits(struct infra_cache* infra, struct config_file* cfg)
+{
+ name_tree_init(&infra->domain_limits);
+ if(!infra_ratelimit_cfg_insert(infra, cfg)) {
+ return 0;
+ }
+ name_tree_init_parents(&infra->domain_limits);
+ return 1;
+}
+
struct infra_cache*
infra_create(struct config_file* cfg)
{
@@ -230,7 +242,6 @@ infra_create(struct config_file* cfg)
return NULL;
}
infra->host_ttl = cfg->host_ttl;
- name_tree_init(&infra->domain_limits);
infra_dp_ratelimit = cfg->ratelimit;
infra->domain_rates = slabhash_create(cfg->ratelimit_slabs,
INFRA_HOST_STARTSIZE, cfg->ratelimit_size,
@@ -241,11 +252,10 @@ infra_create(struct config_file* cfg)
return NULL;
}
/* insert config data into ratelimits */
- if(!infra_ratelimit_cfg_insert(infra, cfg)) {
+ if(!setup_domain_limits(infra, cfg)) {
infra_delete(infra);
return NULL;
}
- name_tree_init_parents(&infra->domain_limits);
infra_ip_ratelimit = cfg->ip_ratelimit;
infra->client_ip_rates = slabhash_create(cfg->ip_ratelimit_slabs,
INFRA_HOST_STARTSIZE, cfg->ip_ratelimit_size, &ip_rate_sizefunc,
@@ -285,12 +295,28 @@ infra_adjust(struct infra_cache* infra, struct config_file* cfg)
if(!infra)
return infra_create(cfg);
infra->host_ttl = cfg->host_ttl;
+ infra_dp_ratelimit = cfg->ratelimit;
+ infra_ip_ratelimit = cfg->ip_ratelimit;
maxmem = cfg->infra_cache_numhosts * (sizeof(struct infra_key)+
sizeof(struct infra_data)+INFRA_BYTES_NAME);
- if(maxmem != slabhash_get_size(infra->hosts) ||
- cfg->infra_cache_slabs != infra->hosts->size) {
+ /* divide cachesize by slabs and multiply by slabs, because if the
+ * cachesize is not an even multiple of slabs, that is the resulting
+ * size of the slabhash */
+ if(!slabhash_is_size(infra->hosts, maxmem, cfg->infra_cache_slabs) ||
+ !slabhash_is_size(infra->domain_rates, cfg->ratelimit_size,
+ cfg->ratelimit_slabs) ||
+ !slabhash_is_size(infra->client_ip_rates, cfg->ip_ratelimit_size,
+ cfg->ip_ratelimit_slabs)) {
infra_delete(infra);
infra = infra_create(cfg);
+ } else {
+ /* reapply domain limits */
+ traverse_postorder(&infra->domain_limits, domain_limit_free,
+ NULL);
+ if(!setup_domain_limits(infra, cfg)) {
+ infra_delete(infra);
+ return NULL;
+ }
}
return infra;
}
diff --git a/services/cache/rrset.c b/services/cache/rrset.c
index 26c1aeb91c62..8c0251bcb939 100644
--- a/services/cache/rrset.c
+++ b/services/cache/rrset.c
@@ -81,8 +81,8 @@ void rrset_cache_delete(struct rrset_cache* r)
struct rrset_cache* rrset_cache_adjust(struct rrset_cache *r,
struct config_file* cfg, struct alloc_cache* alloc)
{
- if(!r || !cfg || cfg->rrset_cache_slabs != r->table.size ||
- cfg->rrset_cache_size != slabhash_get_size(&r->table))
+ if(!r || !cfg || !slabhash_is_size(&r->table, cfg->rrset_cache_size,
+ cfg->rrset_cache_slabs))
{
rrset_cache_delete(r);
r = rrset_cache_create(cfg, alloc);
diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c
index 248cad3665b0..458bf6f513f2 100644
--- a/services/listen_dnsport.c
+++ b/services/listen_dnsport.c
@@ -564,7 +564,8 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
/* detect freebsd jail with no ipv6 permission */
if(family==AF_INET6 && errno==EINVAL)
*noproto = 1;
- else if(errno != EADDRINUSE) {
+ else if(errno != EADDRINUSE &&
+ !(errno == EACCES && verbosity < 4 && !listen)) {
log_err_addr("can't bind socket", strerror(errno),
(struct sockaddr_storage*)addr, addrlen);
}
@@ -572,7 +573,8 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
close(s);
#else /* USE_WINSOCK */
if(WSAGetLastError() != WSAEADDRINUSE &&
- WSAGetLastError() != WSAEADDRNOTAVAIL) {
+ WSAGetLastError() != WSAEADDRNOTAVAIL &&
+ !(WSAGetLastError() == WSAEACCES && verbosity < 4 && !listen)) {
log_err_addr("can't bind socket",
wsa_strerror(WSAGetLastError()),
(struct sockaddr_storage*)addr, addrlen);
@@ -1216,7 +1218,8 @@ listen_cp_insert(struct comm_point* c, struct listen_dnsport* front)
struct listen_dnsport*
listen_create(struct comm_base* base, struct listen_port* ports,
- size_t bufsize, int tcp_accept_count, void* sslctx,
+ size_t bufsize, int tcp_accept_count, int tcp_idle_timeout,
+ struct tcl_list* tcp_conn_limit, void* sslctx,
struct dt_env* dtenv, comm_point_callback_type* cb, void *cb_arg)
{
struct listen_dnsport* front = (struct listen_dnsport*)
@@ -1243,10 +1246,12 @@ listen_create(struct comm_base* base, struct listen_port* ports,
else if(ports->ftype == listen_type_tcp ||
ports->ftype == listen_type_tcp_dnscrypt)
cp = comm_point_create_tcp(base, ports->fd,
- tcp_accept_count, bufsize, cb, cb_arg);
+ tcp_accept_count, tcp_idle_timeout,
+ tcp_conn_limit, bufsize, cb, cb_arg);
else if(ports->ftype == listen_type_ssl) {
cp = comm_point_create_tcp(base, ports->fd,
- tcp_accept_count, bufsize, cb, cb_arg);
+ tcp_accept_count, tcp_idle_timeout,
+ tcp_conn_limit, bufsize, cb, cb_arg);
cp->ssl = sslctx;
} else if(ports->ftype == listen_type_udpancil ||
ports->ftype == listen_type_udpancil_dnscrypt)
diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h
index fac0f7970924..46b432d4b934 100644
--- a/services/listen_dnsport.h
+++ b/services/listen_dnsport.h
@@ -47,6 +47,7 @@ struct listen_list;
struct config_file;
struct addrinfo;
struct sldns_buffer;
+struct tcl_list;
/**
* Listening for queries structure.
@@ -137,6 +138,8 @@ void listening_ports_free(struct listen_port* list);
* @param bufsize: size of datagram buffer.
* @param tcp_accept_count: max number of simultaneous TCP connections
* from clients.
+ * @param tcp_idle_timeout: idle timeout for TCP connections in msec.
+ * @param tcp_conn_limit: TCP connection limit info.
* @param sslctx: nonNULL if ssl context.
* @param dtenv: nonNULL if dnstap enabled.
* @param cb: callback function when a request arrives. It is passed
@@ -145,9 +148,10 @@ void listening_ports_free(struct listen_port* list);
* @return: the malloced listening structure, ready for use. NULL on error.
*/
struct listen_dnsport* listen_create(struct comm_base* base,
- struct listen_port* ports, size_t bufsize, int tcp_accept_count,
- void* sslctx, struct dt_env *dtenv, comm_point_callback_type* cb,
- void* cb_arg);
+ struct listen_port* ports, size_t bufsize,
+ int tcp_accept_count, int tcp_idle_timeout,
+ struct tcl_list* tcp_conn_limit, void* sslctx,
+ struct dt_env *dtenv, comm_point_callback_type* cb, void* cb_arg);
/**
* delete the listening structure
diff --git a/services/localzone.c b/services/localzone.c
index 0f608170c850..902a29f21d48 100644
--- a/services/localzone.c
+++ b/services/localzone.c
@@ -1146,8 +1146,9 @@ void local_zones_print(struct local_zones* zones)
/** encode answer consisting of 1 rrset */
static int
local_encode(struct query_info* qinfo, struct module_env* env,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- struct ub_packed_rrset_key* rrset, int ansec, int rcode)
+ struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* buf,
+ struct regional* temp, struct ub_packed_rrset_key* rrset, int ansec,
+ int rcode)
{
struct reply_info rep;
uint16_t udpsize;
@@ -1165,23 +1166,22 @@ local_encode(struct query_info* qinfo, struct module_env* env,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
- if(!inplace_cb_reply_local_call(env, qinfo, NULL, &rep, rcode, edns, temp)
- || !reply_info_answer_encode(qinfo, &rep,
- *(uint16_t*)sldns_buffer_begin(buf),
- sldns_buffer_read_u16_at(buf, 2),
- buf, 0, 0, temp, udpsize, edns,
- (int)(edns->bits&EDNS_DO), 0))
+ if(!inplace_cb_reply_local_call(env, qinfo, NULL, &rep, rcode, edns,
+ repinfo, temp) || !reply_info_answer_encode(qinfo, &rep,
+ *(uint16_t*)sldns_buffer_begin(buf), sldns_buffer_read_u16_at(buf, 2),
+ buf, 0, 0, temp, udpsize, edns, (int)(edns->bits&EDNS_DO), 0)) {
error_encode(buf, (LDNS_RCODE_SERVFAIL|BIT_AA), qinfo,
*(uint16_t*)sldns_buffer_begin(buf),
sldns_buffer_read_u16_at(buf, 2), edns);
+ }
return 1;
}
/** encode local error answer */
static void
local_error_encode(struct query_info* qinfo, struct module_env* env,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- int rcode, int r)
+ struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* buf,
+ struct regional* temp, int rcode, int r)
{
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
@@ -1189,7 +1189,7 @@ local_error_encode(struct query_info* qinfo, struct module_env* env,
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_local_call(env, qinfo, NULL, NULL,
- rcode, edns, temp))
+ rcode, edns, repinfo, temp))
edns->opt_list = NULL;
error_encode(buf, r, qinfo, *(uint16_t*)sldns_buffer_begin(buf),
sldns_buffer_read_u16_at(buf, 2), edns);
@@ -1310,7 +1310,8 @@ find_tag_datas(struct query_info* qinfo, struct config_strlist* list,
/** answer local data match */
static int
local_data_answer(struct local_zone* z, struct module_env* env,
- struct query_info* qinfo, struct edns_data* edns, sldns_buffer* buf,
+ struct query_info* qinfo, struct edns_data* edns,
+ struct comm_reply* repinfo, sldns_buffer* buf,
struct regional* temp, int labs, struct local_data** ldp,
enum localzone_type lz_type, int tag, struct config_strlist** tag_datas,
size_t tag_datas_size, char** tagname, int num_tags)
@@ -1339,7 +1340,7 @@ local_data_answer(struct local_zone* z, struct module_env* env,
* chain. */
if(qinfo->local_alias)
return 1;
- return local_encode(qinfo, env, edns, buf, temp,
+ return local_encode(qinfo, env, edns, repinfo, buf, temp,
&r, 1, LDNS_RCODE_NOERROR);
}
}
@@ -1374,29 +1375,60 @@ local_data_answer(struct local_zone* z, struct module_env* env,
struct ub_packed_rrset_key r = *lr->rrset;
r.rk.dname = qinfo->qname;
r.rk.dname_len = qinfo->qname_len;
- return local_encode(qinfo, env, edns, buf, temp, &r, 1,
+ return local_encode(qinfo, env, edns, repinfo, buf, temp, &r, 1,
LDNS_RCODE_NOERROR);
}
- return local_encode(qinfo, env, edns, buf, temp, lr->rrset, 1,
+ return local_encode(qinfo, env, edns, repinfo, buf, temp, lr->rrset, 1,
LDNS_RCODE_NOERROR);
}
+/**
+ * See if the local zone does not cover the name, eg. the name is not
+ * in the zone and the zone is transparent */
+static int
+local_zone_does_not_cover(struct local_zone* z, struct query_info* qinfo,
+ int labs)
+{
+ struct local_data key;
+ struct local_data* ld = NULL;
+ struct local_rrset* lr = NULL;
+ if(z->type == local_zone_always_transparent)
+ return 1;
+ if(z->type != local_zone_transparent
+ && z->type != local_zone_typetransparent
+ && z->type != local_zone_inform)
+ return 0;
+ key.node.key = &key;
+ key.name = qinfo->qname;
+ key.namelen = qinfo->qname_len;
+ key.namelabs = labs;
+ ld = (struct local_data*)rbtree_search(&z->data, &key.node);
+ if(z->type == local_zone_transparent || z->type == local_zone_inform)
+ return (ld == NULL);
+ if(ld)
+ lr = local_data_find_type(ld, qinfo->qtype, 1);
+ /* local_zone_typetransparent */
+ return (lr == NULL);
+}
+
/**
- * answer in case where no exact match is found
- * @param z: zone for query
- * @param env: module environment
- * @param qinfo: query
- * @param edns: edns from query
+ * Answer in case where no exact match is found.
+ * @param z: zone for query.
+ * @param env: module environment.
+ * @param qinfo: query.
+ * @param edns: edns from query.
+ * @param repinfo: source address for checks. may be NULL.
* @param buf: buffer for answer.
- * @param temp: temp region for encoding
+ * @param temp: temp region for encoding.
* @param ld: local data, if NULL, no such name exists in localdata.
- * @param lz_type: type of the local zone
+ * @param lz_type: type of the local zone.
* @return 1 if a reply is to be sent, 0 if not.
*/
static int
lz_zone_answer(struct local_zone* z, struct module_env* env,
- struct query_info* qinfo, struct edns_data* edns, sldns_buffer* buf,
- struct regional* temp, struct local_data* ld, enum localzone_type lz_type)
+ struct query_info* qinfo, struct edns_data* edns,
+ struct comm_reply* repinfo, sldns_buffer* buf, struct regional* temp,
+ struct local_data* ld, enum localzone_type lz_type)
{
if(lz_type == local_zone_deny || lz_type == local_zone_inform_deny) {
/** no reply at all, signal caller by clearing buffer. */
@@ -1405,7 +1437,7 @@ lz_zone_answer(struct local_zone* z, struct module_env* env,
return 1;
} else if(lz_type == local_zone_refuse
|| lz_type == local_zone_always_refuse) {
- local_error_encode(qinfo, env, edns, buf, temp,
+ local_error_encode(qinfo, env, edns, repinfo, buf, temp,
LDNS_RCODE_REFUSED, (LDNS_RCODE_REFUSED|BIT_AA));
return 1;
} else if(lz_type == local_zone_static ||
@@ -1421,9 +1453,9 @@ lz_zone_answer(struct local_zone* z, struct module_env* env,
int rcode = (ld || lz_type == local_zone_redirect)?
LDNS_RCODE_NOERROR:LDNS_RCODE_NXDOMAIN;
if(z->soa)
- return local_encode(qinfo, env, edns, buf, temp,
+ return local_encode(qinfo, env, edns, repinfo, buf, temp,
z->soa, 0, rcode);
- local_error_encode(qinfo, env, edns, buf, temp, rcode,
+ local_error_encode(qinfo, env, edns, repinfo, buf, temp, rcode,
(rcode|BIT_AA));
return 1;
} else if(lz_type == local_zone_typetransparent
@@ -1438,9 +1470,9 @@ lz_zone_answer(struct local_zone* z, struct module_env* env,
if(ld && ld->rrsets) {
int rcode = LDNS_RCODE_NOERROR;
if(z->soa)
- return local_encode(qinfo, env, edns, buf, temp,
+ return local_encode(qinfo, env, edns, repinfo, buf, temp,
z->soa, 0, rcode);
- local_error_encode(qinfo, env, edns, buf, temp, rcode,
+ local_error_encode(qinfo, env, edns, repinfo, buf, temp, rcode,
(rcode|BIT_AA));
return 1;
}
@@ -1459,7 +1491,7 @@ lz_inform_print(struct local_zone* z, struct query_info* qinfo,
uint16_t port = ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port);
dname_str(z->name, zname);
addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip));
- snprintf(txt, sizeof(txt), "%s inform %s@%u", zname, ip,
+ snprintf(txt, sizeof(txt), "%s %s %s@%u", zname, local_zone_type2str(z->type), ip,
(unsigned)port);
log_nametypeclass(0, txt, qinfo->qname, qinfo->qtype, qinfo->qclass);
}
@@ -1543,10 +1575,6 @@ local_zones_answer(struct local_zones* zones, struct module_env* env,
(z = local_zones_lookup(view->local_zones,
qinfo->qname, qinfo->qname_len, labs,
qinfo->qclass, qinfo->qtype))) {
- if(z->type != local_zone_noview)
- verbose(VERB_ALGO,
- "using localzone from view: %s",
- view->name);
lock_rw_rdlock(&z->lock);
lzt = z->type;
}
@@ -1554,10 +1582,24 @@ local_zones_answer(struct local_zones* zones, struct module_env* env,
lock_rw_unlock(&z->lock);
z = NULL;
}
+ if(z && (lzt == local_zone_transparent ||
+ lzt == local_zone_typetransparent ||
+ lzt == local_zone_inform ||
+ lzt == local_zone_always_transparent) &&
+ local_zone_does_not_cover(z, qinfo, labs)) {
+ lock_rw_unlock(&z->lock);
+ z = NULL;
+ }
if(view->local_zones && !z && !view->isfirst){
lock_rw_unlock(&view->lock);
return 0;
}
+ if(z && verbosity >= VERB_ALGO) {
+ char zname[255+1];
+ dname_str(z->name, zname);
+ verbose(VERB_ALGO, "using localzone %s %s from view %s",
+ zname, local_zone_type2str(lzt), view->name);
+ }
lock_rw_unlock(&view->lock);
}
if(!z) {
@@ -1570,27 +1612,33 @@ local_zones_answer(struct local_zones* zones, struct module_env* env,
return 0;
}
lock_rw_rdlock(&z->lock);
-
lzt = lz_type(taglist, taglen, z->taglist, z->taglen,
tagactions, tagactionssize, z->type, repinfo,
z->override_tree, &tag, tagname, num_tags);
lock_rw_unlock(&zones->lock);
+ if(z && verbosity >= VERB_ALGO) {
+ char zname[255+1];
+ dname_str(z->name, zname);
+ verbose(VERB_ALGO, "using localzone %s %s", zname,
+ local_zone_type2str(lzt));
+ }
}
- if((lzt == local_zone_inform || lzt == local_zone_inform_deny)
- && repinfo)
+ if((env->cfg->log_local_actions ||
+ lzt == local_zone_inform || lzt == local_zone_inform_deny)
+ && repinfo)
lz_inform_print(z, qinfo, repinfo);
if(lzt != local_zone_always_refuse
&& lzt != local_zone_always_transparent
&& lzt != local_zone_always_nxdomain
- && local_data_answer(z, env, qinfo, edns, buf, temp, labs, &ld, lzt,
- tag, tag_datas, tag_datas_size, tagname, num_tags)) {
+ && local_data_answer(z, env, qinfo, edns, repinfo, buf, temp, labs,
+ &ld, lzt, tag, tag_datas, tag_datas_size, tagname, num_tags)) {
lock_rw_unlock(&z->lock);
/* We should tell the caller that encode is deferred if we found
* a local alias. */
return !qinfo->local_alias;
}
- r = lz_zone_answer(z, env, qinfo, edns, buf, temp, ld, lzt);
+ r = lz_zone_answer(z, env, qinfo, edns, repinfo, buf, temp, ld, lzt);
lock_rw_unlock(&z->lock);
return r && !qinfo->local_alias; /* see above */
}
diff --git a/services/mesh.c b/services/mesh.c
index 41aba74ab260..c6bb9ef2bc63 100644
--- a/services/mesh.c
+++ b/services/mesh.c
@@ -55,6 +55,7 @@
#include "util/fptr_wlist.h"
#include "util/alloc.h"
#include "util/config_file.h"
+#include "util/edns.h"
#include "sldns/sbuffer.h"
#include "sldns/wire2str.h"
#include "services/localzone.h"
@@ -385,7 +386,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
if(!s) {
log_err("mesh_state_create: out of memory; SERVFAIL");
if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, NULL, NULL,
- LDNS_RCODE_SERVFAIL, edns, mesh->env->scratch))
+ LDNS_RCODE_SERVFAIL, edns, rep, mesh->env->scratch))
edns->opt_list = NULL;
error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, qid, qflags, edns);
@@ -401,7 +402,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
if(!s->s.edns_opts_front_in) {
log_err("mesh_state_create: out of memory; SERVFAIL");
if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, NULL,
- NULL, LDNS_RCODE_SERVFAIL, edns, mesh->env->scratch))
+ NULL, LDNS_RCODE_SERVFAIL, edns, rep, mesh->env->scratch))
edns->opt_list = NULL;
error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, qid, qflags, edns);
@@ -429,7 +430,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
if(!mesh_state_add_reply(s, edns, rep, qid, qflags, qinfo)) {
log_err("mesh_new_client: out of memory; SERVFAIL");
if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, &s->s,
- NULL, LDNS_RCODE_SERVFAIL, edns, mesh->env->scratch))
+ NULL, LDNS_RCODE_SERVFAIL, edns, rep, mesh->env->scratch))
edns->opt_list = NULL;
error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, qid, qflags, edns);
@@ -631,8 +632,8 @@ void mesh_report_reply(struct mesh_area* mesh, struct outbound_entry* e,
mesh_run(mesh, e->qstate->mesh_info, event, e);
}
-struct mesh_state*
-mesh_state_create(struct module_env* env, struct query_info* qinfo,
+struct mesh_state*
+mesh_state_create(struct module_env* env, struct query_info* qinfo,
struct respip_client_info* cinfo, uint16_t qflags, int prime,
int valrec)
{
@@ -693,6 +694,7 @@ mesh_state_create(struct module_env* env, struct query_info* qinfo,
mstate->s.no_cache_lookup = 0;
mstate->s.no_cache_store = 0;
mstate->s.need_refetch = 0;
+ mstate->s.was_ratelimited = 0;
/* init modules */
for(i=0; i<env->mesh->mods.num; i++) {
@@ -740,7 +742,7 @@ mesh_state_cleanup(struct mesh_state* mstate)
mstate->cb_list = cb->next;
fptr_ok(fptr_whitelist_mesh_cb(cb->cb));
(*cb->cb)(cb->cb_arg, LDNS_RCODE_SERVFAIL, NULL,
- sec_status_unchecked, NULL);
+ sec_status_unchecked, NULL, 0);
mesh->num_reply_addrs--;
}
}
@@ -968,7 +970,8 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
{
int secure;
char* reason = NULL;
- /* bogus messages are not made into servfail, sec_status passed
+ int was_ratelimited = m->s.was_ratelimited;
+ /* bogus messages are not made into servfail, sec_status passed
* to the callback function */
if(rep && rep->security == sec_status_secure)
secure = 1;
@@ -977,22 +980,23 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
rcode = LDNS_RCODE_SERVFAIL;
if(!rcode && (rep->security == sec_status_bogus ||
rep->security == sec_status_secure_sentinel_fail)) {
- if(!(reason = errinf_to_str(&m->s)))
+ if(!(reason = errinf_to_str_bogus(&m->s)))
rcode = LDNS_RCODE_SERVFAIL;
}
/* send the reply */
if(rcode) {
if(rcode == LDNS_RCODE_SERVFAIL) {
if(!inplace_cb_reply_servfail_call(m->s.env, &m->s.qinfo, &m->s,
- rep, rcode, &r->edns, m->s.region))
+ rep, rcode, &r->edns, NULL, m->s.region))
r->edns.opt_list = NULL;
} else {
if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep, rcode,
- &r->edns, m->s.region))
+ &r->edns, NULL, m->s.region))
r->edns.opt_list = NULL;
}
fptr_ok(fptr_whitelist_mesh_cb(r->cb));
- (*r->cb)(r->cb_arg, rcode, r->buf, sec_status_unchecked, NULL);
+ (*r->cb)(r->cb_arg, rcode, r->buf, sec_status_unchecked, NULL,
+ was_ratelimited);
} else {
size_t udp_size = r->edns.udp_size;
sldns_buffer_clear(r->buf);
@@ -1002,7 +1006,7 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
r->edns.bits &= EDNS_DO;
if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep,
- LDNS_RCODE_NOERROR, &r->edns, m->s.region) ||
+ LDNS_RCODE_NOERROR, &r->edns, NULL, m->s.region) ||
!reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
r->qflags, r->buf, 0, 1,
m->s.env->scratch, udp_size, &r->edns,
@@ -1010,11 +1014,11 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
{
fptr_ok(fptr_whitelist_mesh_cb(r->cb));
(*r->cb)(r->cb_arg, LDNS_RCODE_SERVFAIL, r->buf,
- sec_status_unchecked, NULL);
+ sec_status_unchecked, NULL, 0);
} else {
fptr_ok(fptr_whitelist_mesh_cb(r->cb));
(*r->cb)(r->cb_arg, LDNS_RCODE_NOERROR, r->buf,
- rep->security, reason);
+ rep->security, reason, was_ratelimited);
}
}
free(reason);
@@ -1080,11 +1084,11 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
m->s.qinfo.local_alias = r->local_alias;
if(rcode == LDNS_RCODE_SERVFAIL) {
if(!inplace_cb_reply_servfail_call(m->s.env, &m->s.qinfo, &m->s,
- rep, rcode, &r->edns, m->s.region))
+ rep, rcode, &r->edns, NULL, m->s.region))
r->edns.opt_list = NULL;
} else {
if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep, rcode,
- &r->edns, m->s.region))
+ &r->edns, NULL, m->s.region))
r->edns.opt_list = NULL;
}
error_encode(r->query_reply.c->buffer, rcode, &m->s.qinfo,
@@ -1099,14 +1103,17 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
m->s.qinfo.qname = r->qname;
m->s.qinfo.local_alias = r->local_alias;
if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep,
- LDNS_RCODE_NOERROR, &r->edns, m->s.region) ||
+ LDNS_RCODE_NOERROR, &r->edns, NULL, m->s.region) ||
+ !apply_edns_options(&r->edns, &edns_bak,
+ m->s.env->cfg, r->query_reply.c,
+ m->s.region) ||
!reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
r->qflags, r->query_reply.c->buffer, 0, 1,
m->s.env->scratch, udp_size, &r->edns,
(int)(r->edns.bits & EDNS_DO), secure))
{
if(!inplace_cb_reply_servfail_call(m->s.env, &m->s.qinfo, &m->s,
- rep, LDNS_RCODE_SERVFAIL, &r->edns, m->s.region))
+ rep, LDNS_RCODE_SERVFAIL, &r->edns, NULL, m->s.region))
r->edns.opt_list = NULL;
error_encode(r->query_reply.c->buffer,
LDNS_RCODE_SERVFAIL, &m->s.qinfo, r->qid,
@@ -1148,6 +1155,15 @@ void mesh_query_done(struct mesh_state* mstate)
struct mesh_cb* c;
struct reply_info* rep = (mstate->s.return_msg?
mstate->s.return_msg->rep:NULL);
+ if((mstate->s.return_rcode == LDNS_RCODE_SERVFAIL ||
+ (rep && FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_SERVFAIL))
+ && mstate->s.env->cfg->log_servfail
+ && !mstate->s.env->cfg->val_log_squelch) {
+ char* err = errinf_to_str_servfail(&mstate->s);
+ if(err)
+ log_err("%s", err);
+ free(err);
+ }
for(r = mstate->reply_list; r; r = r->next) {
/* if a response-ip address block has been stored the
* information should be logged for each client. */
@@ -1197,6 +1213,8 @@ void mesh_walk_supers(struct mesh_area* mesh, struct mesh_state* mstate)
mesh->mods.mod[ref->s->s.curmod]->inform_super));
(*mesh->mods.mod[ref->s->s.curmod]->inform_super)(&mstate->s,
ref->s->s.curmod, &ref->s->s);
+ /* copy state that is always relevant to super */
+ copy_state_to_super(&mstate->s, ref->s->s.curmod, &ref->s->s);
}
}
diff --git a/services/mesh.h b/services/mesh.h
index 67749accb35a..b4ce03e7e2a0 100644
--- a/services/mesh.h
+++ b/services/mesh.h
@@ -223,10 +223,11 @@ struct mesh_reply {
/**
* Mesh result callback func.
- * called as func(cb_arg, rcode, buffer_with_reply, security, why_bogus);
+ * called as func(cb_arg, rcode, buffer_with_reply, security, why_bogus,
+ * was_ratelimited);
*/
-typedef void (*mesh_cb_func_type)(void*, int, struct sldns_buffer*, enum sec_status,
- char*);
+typedef void (*mesh_cb_func_type)(void* cb_arg, int rcode, struct sldns_buffer*,
+ enum sec_status, char* why_bogus, int was_ratelimited);
/**
* Callback to result routine
@@ -242,9 +243,8 @@ struct mesh_cb {
uint16_t qflags;
/** buffer for reply */
struct sldns_buffer* buf;
-
/** callback routine for results. if rcode != 0 buf has message.
- * called as cb(cb_arg, rcode, buf, sec_state);
+ * called as cb(cb_arg, rcode, buf, sec_state, why_bogus, was_ratelimited);
*/
mesh_cb_func_type cb;
/** user arg for callback */
diff --git a/services/outside_network.c b/services/outside_network.c
index 5700ef8a95e5..87c88349b3f8 100644
--- a/services/outside_network.c
+++ b/services/outside_network.c
@@ -48,6 +48,7 @@
#include "services/outside_network.h"
#include "services/listen_dnsport.h"
#include "services/cache/infra.h"
+#include "iterator/iterator.h"
#include "util/data/msgparse.h"
#include "util/data/msgreply.h"
#include "util/data/msgencode.h"
@@ -1036,6 +1037,8 @@ udp_sockport(struct sockaddr_storage* addr, socklen_t addrlen, int pfxlen,
int freebind = 0;
struct sockaddr_in6 sa = *(struct sockaddr_in6*)addr;
sa.sin6_port = (in_port_t)htons((uint16_t)port);
+ sa.sin6_flowinfo = 0;
+ sa.sin6_scope_id = 0;
if(pfxlen != 0) {
freebind = 1;
sai6_putrandom(&sa, pfxlen, rnd);
@@ -1882,7 +1885,7 @@ serviced_tcp_send(struct serviced_query* sq, sldns_buffer* buff)
sq->last_sent_time = *sq->outnet->now_tv;
if(sq->tcp_upstream || sq->ssl_upstream) {
timeout = rtt;
- if(rtt >= 376 && rtt < TCP_AUTH_QUERY_TIMEOUT)
+ if(rtt >= UNKNOWN_SERVER_NICENESS && rtt < TCP_AUTH_QUERY_TIMEOUT)
timeout = TCP_AUTH_QUERY_TIMEOUT;
} else {
timeout = TCP_AUTH_QUERY_TIMEOUT;
@@ -2190,39 +2193,48 @@ fd_for_dest(struct outside_network* outnet, struct sockaddr_storage* to_addr,
{
struct sockaddr_storage* addr;
socklen_t addrlen;
- int i;
- int try;
-
- /* select interface */
- if(addr_is_ip6(to_addr, to_addrlen)) {
- if(outnet->num_ip6 == 0) {
- char to[64];
- addr_to_str(to_addr, to_addrlen, to, sizeof(to));
- verbose(VERB_QUERY, "need ipv6 to send, but no ipv6 outgoing interfaces, for %s", to);
- return -1;
- }
- i = ub_random_max(outnet->rnd, outnet->num_ip6);
- addr = &outnet->ip6_ifs[i].addr;
- addrlen = outnet->ip6_ifs[i].addrlen;
- } else {
- if(outnet->num_ip4 == 0) {
- char to[64];
- addr_to_str(to_addr, to_addrlen, to, sizeof(to));
- verbose(VERB_QUERY, "need ipv4 to send, but no ipv4 outgoing interfaces, for %s", to);
- return -1;
- }
- i = ub_random_max(outnet->rnd, outnet->num_ip4);
- addr = &outnet->ip4_ifs[i].addr;
- addrlen = outnet->ip4_ifs[i].addrlen;
- }
+ int i, try, pnum;
+ struct port_if* pif;
/* create fd */
for(try = 0; try<1000; try++) {
+ int port = 0;
int freebind = 0;
int noproto = 0;
int inuse = 0;
- int port = ub_random(outnet->rnd)&0xffff;
int fd = -1;
+
+ /* select interface */
+ if(addr_is_ip6(to_addr, to_addrlen)) {
+ if(outnet->num_ip6 == 0) {
+ char to[64];
+ addr_to_str(to_addr, to_addrlen, to, sizeof(to));
+ verbose(VERB_QUERY, "need ipv6 to send, but no ipv6 outgoing interfaces, for %s", to);
+ return -1;
+ }
+ i = ub_random_max(outnet->rnd, outnet->num_ip6);
+ pif = &outnet->ip6_ifs[i];
+ } else {
+ if(outnet->num_ip4 == 0) {
+ char to[64];
+ addr_to_str(to_addr, to_addrlen, to, sizeof(to));
+ verbose(VERB_QUERY, "need ipv4 to send, but no ipv4 outgoing interfaces, for %s", to);
+ return -1;
+ }
+ i = ub_random_max(outnet->rnd, outnet->num_ip4);
+ pif = &outnet->ip4_ifs[i];
+ }
+ addr = &pif->addr;
+ addrlen = pif->addrlen;
+ pnum = ub_random_max(outnet->rnd, pif->avail_total);
+ if(pnum < pif->inuse) {
+ /* port already open */
+ port = pif->out[pnum]->number;
+ } else {
+ /* unused ports in start part of array */
+ port = pif->avail_ports[pnum - pif->inuse];
+ }
+
if(addr_is_ip6(to_addr, to_addrlen)) {
struct sockaddr_in6 sa = *(struct sockaddr_in6*)addr;
sa.sin6_port = (in_port_t)htons((uint16_t)port);
diff --git a/sldns/rrdef.c b/sldns/rrdef.c
index 644762f59f4a..b365a4a8ec3a 100644
--- a/sldns/rrdef.c
+++ b/sldns/rrdef.c
@@ -341,12 +341,9 @@ static sldns_rr_descriptor rdata_field_descriptors[] = {
{LDNS_RR_TYPE_NSEC3PARAM, "NSEC3PARAM", 4, 4, type_nsec3param_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
/* 52 */
{LDNS_RR_TYPE_TLSA, "TLSA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
- /*53 */
-#ifdef DRAFT_RRTYPES
+ /* 53 */
{LDNS_RR_TYPE_SMIMEA, "SMIMEA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
-#else
-{LDNS_RR_TYPE_NULL, "TYPE53", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
-#endif
+ /* 54 */
{LDNS_RR_TYPE_NULL, "TYPE54", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
/* 55
* Hip ends with 0 or more Rendezvous Servers represented as dname's.
diff --git a/sldns/rrdef.h b/sldns/rrdef.h
index 0446687bd339..4e7fef5745f2 100644
--- a/sldns/rrdef.h
+++ b/sldns/rrdef.h
@@ -182,9 +182,7 @@ enum sldns_enum_rr_type
LDNS_RR_TYPE_NSEC3PARAM = 51, /* RFC 5155 */
LDNS_RR_TYPE_NSEC3PARAMS = 51,
LDNS_RR_TYPE_TLSA = 52, /* RFC 6698 */
- LDNS_RR_TYPE_SMIMEA = 53, /* draft-ietf-dane-smime, TLSA-like but may
- be extended */
-
+ LDNS_RR_TYPE_SMIMEA = 53, /* RFC 8162 */
LDNS_RR_TYPE_HIP = 55, /* RFC 5205 */
/** draft-reid-dnsext-zs */
diff --git a/smallapp/unbound-anchor.c b/smallapp/unbound-anchor.c
index b30091088008..f398509018d9 100644
--- a/smallapp/unbound-anchor.c
+++ b/smallapp/unbound-anchor.c
@@ -192,9 +192,10 @@ usage(void)
printf("-n name signer's subject emailAddress, default %s\n", P7SIGNER);
printf("-4 work using IPv4 only\n");
printf("-6 work using IPv6 only\n");
- printf("-f resolv.conf use given resolv.conf to resolve -u name\n");
- printf("-r root.hints use given root.hints to resolve -u name\n"
+ printf("-f resolv.conf use given resolv.conf\n");
+ printf("-r root.hints use given root.hints\n"
" builtin root hints are used by default\n");
+ printf("-R fallback from -f to root query on error\n");
printf("-v more verbose\n");
printf("-C conf debug, read config\n");
printf("-P port use port for https connect, default 443\n");
@@ -1920,8 +1921,7 @@ static int
do_certupdate(const char* root_anchor_file, const char* root_cert_file,
const char* urlname, const char* xmlname, const char* p7sname,
const char* p7signer, const char* res_conf, const char* root_hints,
- const char* debugconf, int ip4only, int ip6only, int port,
- struct ub_result* dnskey)
+ const char* debugconf, int ip4only, int ip6only, int port)
{
STACK_OF(X509)* cert;
BIO *xml, *p7s;
@@ -1961,7 +1961,6 @@ do_certupdate(const char* root_anchor_file, const char* root_cert_file,
#ifndef S_SPLINT_S
sk_X509_pop_free(cert, X509_free);
#endif
- ub_resolve_free(dnskey);
ip_list_free(ip_list);
return 1;
}
@@ -2199,16 +2198,33 @@ probe_date_allows_certupdate(const char* root_anchor_file)
return 0;
}
+static struct ub_result *
+fetch_root_key(const char* root_anchor_file, const char* res_conf,
+ const char* root_hints, const char* debugconf,
+ int ip4only, int ip6only)
+{
+ struct ub_ctx* ctx;
+ struct ub_result* dnskey;
+
+ ctx = create_unbound_context(res_conf, root_hints, debugconf,
+ ip4only, ip6only);
+ add_5011_probe_root(ctx, root_anchor_file);
+ dnskey = prime_root_key(ctx);
+ ub_ctx_delete(ctx);
+ return dnskey;
+}
+
/** perform the unbound-anchor work */
static int
do_root_update_work(const char* root_anchor_file, const char* root_cert_file,
const char* urlname, const char* xmlname, const char* p7sname,
const char* p7signer, const char* res_conf, const char* root_hints,
- const char* debugconf, int ip4only, int ip6only, int force, int port)
+ const char* debugconf, int ip4only, int ip6only, int force,
+ int res_conf_fallback, int port)
{
- struct ub_ctx* ctx;
struct ub_result* dnskey;
int used_builtin = 0;
+ int rcode;
/* see if builtin rootanchor needs to be provided, or if
* rootanchor is 'revoked-trust-point' */
@@ -2217,12 +2233,22 @@ do_root_update_work(const char* root_anchor_file, const char* root_cert_file,
/* make unbound context with 5011-probe for root anchor,
* and probe . DNSKEY */
- ctx = create_unbound_context(res_conf, root_hints, debugconf,
- ip4only, ip6only);
- add_5011_probe_root(ctx, root_anchor_file);
- dnskey = prime_root_key(ctx);
- ub_ctx_delete(ctx);
-
+ dnskey = fetch_root_key(root_anchor_file, res_conf,
+ root_hints, debugconf, ip4only, ip6only);
+ rcode = dnskey->rcode;
+
+ if (res_conf_fallback && res_conf && !dnskey->secure) {
+ if (verb) printf("%s failed, retrying direct\n", res_conf);
+ ub_resolve_free(dnskey);
+ /* try direct query without res_conf */
+ dnskey = fetch_root_key(root_anchor_file, NULL,
+ root_hints, debugconf, ip4only, ip6only);
+ if (rcode != 0 && dnskey->rcode == 0) {
+ res_conf = NULL;
+ rcode = 0;
+ }
+ }
+
/* if secure: exit */
if(dnskey->secure && !force) {
if(verb) printf("success: the anchor is ok\n");
@@ -2230,18 +2256,18 @@ do_root_update_work(const char* root_anchor_file, const char* root_cert_file,
return used_builtin;
}
if(force && verb) printf("debug cert update forced\n");
+ ub_resolve_free(dnskey);
/* if not (and NOERROR): check date and do certupdate */
- if((dnskey->rcode == 0 &&
+ if((rcode == 0 &&
probe_date_allows_certupdate(root_anchor_file)) || force) {
if(do_certupdate(root_anchor_file, root_cert_file, urlname,
xmlname, p7sname, p7signer, res_conf, root_hints,
- debugconf, ip4only, ip6only, port, dnskey))
+ debugconf, ip4only, ip6only, port))
return 1;
return used_builtin;
}
if(verb) printf("fail: the anchor is NOT ok and could not be fixed\n");
- ub_resolve_free(dnskey);
return used_builtin;
}
@@ -2264,8 +2290,9 @@ int main(int argc, char* argv[])
const char* root_hints = NULL;
const char* debugconf = NULL;
int dolist=0, ip4only=0, ip6only=0, force=0, port = HTTPS_PORT;
+ int res_conf_fallback = 0;
/* parse the options */
- while( (c=getopt(argc, argv, "46C:FP:a:c:f:hln:r:s:u:vx:")) != -1) {
+ while( (c=getopt(argc, argv, "46C:FRP:a:c:f:hln:r:s:u:vx:")) != -1) {
switch(c) {
case 'l':
dolist = 1;
@@ -2300,6 +2327,9 @@ int main(int argc, char* argv[])
case 'r':
root_hints = optarg;
break;
+ case 'R':
+ res_conf_fallback = 1;
+ break;
case 'C':
debugconf = optarg;
break;
@@ -2346,5 +2376,5 @@ int main(int argc, char* argv[])
return do_root_update_work(root_anchor_file, root_cert_file, urlname,
xmlname, p7sname, p7signer, res_conf, root_hints, debugconf,
- ip4only, ip6only, force, port);
+ ip4only, ip6only, force, res_conf_fallback, port);
}
diff --git a/smallapp/unbound-checkconf.c b/smallapp/unbound-checkconf.c
index 37ba9eab31a1..ea46479172c0 100644
--- a/smallapp/unbound-checkconf.c
+++ b/smallapp/unbound-checkconf.c
@@ -43,6 +43,7 @@
*/
#include "config.h"
+#include <ctype.h>
#include "util/log.h"
#include "util/config_file.h"
#include "util/module.h"
@@ -252,6 +253,23 @@ aclchecks(struct config_file* cfg)
}
}
+/** check tcp connection limit ips */
+static void
+tcpconnlimitchecks(struct config_file* cfg)
+{
+ int d;
+ struct sockaddr_storage a;
+ socklen_t alen;
+ struct config_str2list* tcl;
+ for(tcl=cfg->tcp_connection_limits; tcl; tcl = tcl->next) {
+ if(!netblockstrtoaddr(tcl->str, UNBOUND_DNS_PORT, &a, &alen,
+ &d)) {
+ fatal_exit("cannot parse tcp connection limit address %s %s",
+ tcl->str, tcl->str2);
+ }
+ }
+}
+
/** true if fname is a file */
static int
is_file(const char* fname)
@@ -373,6 +391,44 @@ ecs_conf_checks(struct config_file* cfg)
}
#endif /* CLIENT_SUBNET */
+/** check that the modules exist, are compiled in */
+static void
+check_modules_exist(const char* module_conf)
+{
+ const char** names = module_list_avail();
+ const char* s = module_conf;
+ while(*s) {
+ int i = 0;
+ int is_ok = 0;
+ while(*s && isspace((unsigned char)*s))
+ s++;
+ if(!*s) break;
+ while(names[i]) {
+ if(strncmp(names[i], s, strlen(names[i])) == 0) {
+ is_ok = 1;
+ break;
+ }
+ i++;
+ }
+ if(is_ok == 0) {
+ char n[64];
+ size_t j;
+ n[0]=0;
+ n[sizeof(n)-1]=0;
+ for(j=0; j<sizeof(n)-1; j++) {
+ if(!s[j] || isspace((unsigned char)s[j])) {
+ n[j] = 0;
+ break;
+ }
+ n[j] = s[j];
+ }
+ fatal_exit("module_conf lists module '%s' but that "
+ "module is not available.", n);
+ }
+ s += strlen(names[i]);
+ }
+}
+
/** check configuration for errors */
static void
morechecks(struct config_file* cfg, const char* fname)
@@ -381,6 +437,7 @@ morechecks(struct config_file* cfg, const char* fname)
warn_hosts("forward-host", cfg->forwards);
interfacechecks(cfg);
aclchecks(cfg);
+ tcpconnlimitchecks(cfg);
if(cfg->verbosity < 0)
fatal_exit("verbosity value < 0");
@@ -465,6 +522,9 @@ morechecks(struct config_file* cfg, const char* fname)
free(cfg->chrootdir);
cfg->chrootdir = NULL;
+ /* check that the modules listed in module_conf exist */
+ check_modules_exist(cfg->module_conf);
+
/* There should be no reason for 'respip' module not to work with
* dns64, but it's not explicitly confirmed, so the combination is
* excluded below. It's simply unknown yet for the combination of
@@ -511,7 +571,6 @@ morechecks(struct config_file* cfg, const char* fname)
#if defined(WITH_PYTHONMODULE) && defined(CLIENT_SUBNET)
&& strcmp(cfg->module_conf, "python subnetcache iterator") != 0
&& strcmp(cfg->module_conf, "subnetcache python iterator") != 0
- && strcmp(cfg->module_conf, "subnetcache validator iterator") != 0
&& strcmp(cfg->module_conf, "python subnetcache validator iterator") != 0
&& strcmp(cfg->module_conf, "subnetcache python validator iterator") != 0
&& strcmp(cfg->module_conf, "subnetcache validator python iterator") != 0
diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c
index d16541779190..9e4c006f3b5d 100644
--- a/smallapp/unbound-control.c
+++ b/smallapp/unbound-control.c
@@ -143,6 +143,8 @@ usage(void)
printf(" ip_ratelimit_list [+a] list ratelimited ip addresses\n");
printf(" +a list all, also not ratelimited\n");
printf(" list_auth_zones list auth zones\n");
+ printf(" auth_zone_reload zone reload auth zone from zonefile\n");
+ printf(" auth_zone_transfer zone transfer auth zone from master\n");
printf(" view_list_local_zones view list local-zones in view\n");
printf(" view_list_local_data view list local-data RRs in view\n");
printf(" view_local_zone view name type add local-zone in view\n");
@@ -319,6 +321,7 @@ static void print_extended(struct ub_stats_info* s)
/* transport */
PR_UL("num.query.tcp", s->svr.qtcp);
PR_UL("num.query.tcpout", s->svr.qtcp_outgoing);
+ PR_UL("num.query.tls", s->svr.qtls);
PR_UL("num.query.ipv6", s->svr.qipv6);
/* flags */
@@ -371,6 +374,10 @@ static void print_extended(struct ub_stats_info* s)
#endif /* USE_DNSCRYPT */
PR_UL("num.query.authzone.up", s->svr.num_query_authzone_up);
PR_UL("num.query.authzone.down", s->svr.num_query_authzone_down);
+#ifdef CLIENT_SUBNET
+ PR_UL("num.query.subnet", s->svr.num_query_subnet);
+ PR_UL("num.query.subnet_cache", s->svr.num_query_subnet_cache);
+#endif
}
/** print statistics out of memory structures */
@@ -444,6 +451,22 @@ static void ssl_err(const char* s)
exit(1);
}
+/** exit with ssl error related to a file path */
+static void ssl_path_err(const char* s, const char *path)
+{
+ unsigned long err;
+ err = ERR_peek_error();
+ if (ERR_GET_LIB(err) == ERR_LIB_SYS &&
+ (ERR_GET_FUNC(err) == SYS_F_FOPEN ||
+ ERR_GET_FUNC(err) == SYS_F_FREAD) ) {
+ fprintf(stderr, "error: %s\n%s: %s\n",
+ s, path, ERR_reason_error_string(err));
+ exit(1);
+ } else {
+ ssl_err(s);
+ }
+}
+
/** setup SSL context */
static SSL_CTX*
setup_ctx(struct config_file* cfg)
@@ -467,12 +490,15 @@ setup_ctx(struct config_file* cfg)
if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
!= SSL_OP_NO_SSLv3)
ssl_err("could not set SSL_OP_NO_SSLv3");
- if(!SSL_CTX_use_certificate_chain_file(ctx,c_cert) ||
- !SSL_CTX_use_PrivateKey_file(ctx,c_key,SSL_FILETYPE_PEM)
- || !SSL_CTX_check_private_key(ctx))
- ssl_err("Error setting up SSL_CTX client key and cert");
+ if(!SSL_CTX_use_certificate_chain_file(ctx,c_cert))
+ ssl_path_err("Error setting up SSL_CTX client cert", c_cert);
+ if (!SSL_CTX_use_PrivateKey_file(ctx,c_key,SSL_FILETYPE_PEM))
+ ssl_path_err("Error setting up SSL_CTX client key", c_key);
+ if (!SSL_CTX_check_private_key(ctx))
+ ssl_err("Error setting up SSL_CTX client key");
if (SSL_CTX_load_verify_locations(ctx, s_cert, NULL) != 1)
- ssl_err("Error setting up SSL_CTX verify, server cert");
+ ssl_path_err("Error setting up SSL_CTX verify, server cert",
+ s_cert);
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
free(s_cert);
diff --git a/smallapp/unbound-host.c b/smallapp/unbound-host.c
index cd1ffe3351d2..f02511fe5613 100644
--- a/smallapp/unbound-host.c
+++ b/smallapp/unbound-host.c
@@ -82,9 +82,8 @@ static int verb = 0;
static void
usage(void)
{
- printf("Usage: unbound-host [-vdhr46] [-c class] [-t type] hostname\n");
- printf(" [-y key] [-f keyfile] [-F namedkeyfile]\n");
- printf(" [-C configfile]\n");
+ printf("Usage: unbound-host [-C configfile] [-vdhr46] [-c class] [-t type]\n");
+ printf(" [-y key] [-f keyfile] [-F namedkeyfile] hostname\n");
printf(" Queries the DNS for information.\n");
printf(" The hostname is looked up for IP4, IP6 and mail.\n");
printf(" If an ip-address is given a reverse lookup is done.\n");
@@ -98,6 +97,8 @@ usage(void)
printf(" -f keyfile read trust anchors from file, with lines as -y.\n");
printf(" -F keyfile read named.conf-style trust anchors.\n");
printf(" -C config use the specified unbound.conf (none read by default)\n");
+ printf(" pass as first argument if you want to override some\n");
+ printf(" options with further arguments\n");
printf(" -r read forwarder information from /etc/resolv.conf\n");
printf(" breaks validation if the forwarder does not do DNSSEC.\n");
printf(" -v be more verbose, shows nodata and security.\n");
@@ -339,6 +340,7 @@ pretty_output(char* q, int t, int c, struct ub_result* result, int docname)
exit(1);
}
printf("%s\n", s);
+ free(s);
} else printf(" has no %s record", tstr);
printf(" %s\n", secstatus);
}
diff --git a/smallapp/worker_cb.c b/smallapp/worker_cb.c
index dda94cc670cf..6c3bd0049082 100644
--- a/smallapp/worker_cb.c
+++ b/smallapp/worker_cb.c
@@ -168,21 +168,21 @@ void libworker_handle_control_cmd(struct tube* ATTR_UNUSED(tube),
void libworker_fg_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
struct sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
void libworker_bg_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
struct sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
void libworker_event_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
struct sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
diff --git a/testcode/fake_event.c b/testcode/fake_event.c
index 80e3685c09ef..777ed7355ed7 100644
--- a/testcode/fake_event.c
+++ b/testcode/fake_event.c
@@ -374,8 +374,11 @@ answer_callback_from_entry(struct replay_runtime* runtime,
c.fd = -1;
c.buffer = sldns_buffer_new(runtime->bufsize);
c.type = comm_udp;
- if(pend->transport == transport_tcp)
+ if(pend->transport == transport_tcp) {
c.type = comm_tcp;
+ c.tcp_timeout_msec = 30000;
+ c.tcp_keepalive = runtime->tcp_seen_keepalive;
+ }
fill_buffer_with_reply(c.buffer, entry, pend->pkt, pend->pkt_len,
pend->tcp_pkt_counter);
repinfo.c = &c;
@@ -423,6 +426,8 @@ answer_check_it(struct replay_runtime* runtime)
else runtime->answer_list = ans->next;
if(!ans->next)
runtime->answer_last = prev;
+ if(ans->repinfo.c->tcp_keepalive)
+ runtime->tcp_seen_keepalive = 1;
delete_replay_answer(ans);
return;
} else {
@@ -452,9 +457,12 @@ fake_front_query(struct replay_runtime* runtime, struct replay_moment *todo)
repinfo.c->fd = -1;
repinfo.c->ev = (struct internal_event*)runtime;
repinfo.c->buffer = sldns_buffer_new(runtime->bufsize);
- if(todo->match->match_transport == transport_tcp)
+ if(todo->match->match_transport == transport_tcp) {
repinfo.c->type = comm_tcp;
- else repinfo.c->type = comm_udp;
+ repinfo.c->tcp_timeout_msec = 30000;
+ repinfo.c->tcp_keepalive = runtime->tcp_seen_keepalive;
+ } else
+ repinfo.c->type = comm_udp;
fill_buffer_with_reply(repinfo.c->buffer, todo->match, NULL, 0, 0);
log_info("testbound: incoming QUERY");
log_pkt("query pkt", todo->match->reply_list->reply_pkt,
@@ -488,8 +496,11 @@ fake_pending_callback(struct replay_runtime* runtime,
cb = p->callback;
c.buffer = sldns_buffer_new(runtime->bufsize);
c.type = comm_udp;
- if(p->transport == transport_tcp)
+ if(p->transport == transport_tcp) {
c.type = comm_tcp;
+ c.tcp_timeout_msec = 30000;
+ c.tcp_keepalive = runtime->tcp_seen_keepalive;
+ }
if(todo->evt_type == repevt_back_reply && todo->match) {
fill_buffer_with_reply(c.buffer, todo->match, p->pkt,
p->pkt_len, p->tcp_pkt_counter);
@@ -856,6 +867,8 @@ run_scenario(struct replay_runtime* runtime)
struct listen_dnsport*
listen_create(struct comm_base* base, struct listen_port* ATTR_UNUSED(ports),
size_t bufsize, int ATTR_UNUSED(tcp_accept_count),
+ int ATTR_UNUSED(tcp_idle_timeout),
+ struct tcl_list* ATTR_UNUSED(tcp_conn_limit),
void* ATTR_UNUSED(sslctx), struct dt_env* ATTR_UNUSED(dtenv),
comm_point_callback_type* cb, void* cb_arg)
{
diff --git a/testcode/replay.h b/testcode/replay.h
index 81f0a2c275b2..0cce0b490105 100644
--- a/testcode/replay.h
+++ b/testcode/replay.h
@@ -303,6 +303,9 @@ struct replay_runtime {
/** the current time in microseconds */
struct timeval now_tv;
+ /** has TCP connection seen a keepalive? */
+ int tcp_seen_keepalive;
+
/** signal handler callback */
void (*sig_cb)(int, void*);
/** signal handler user arg */
diff --git a/testcode/streamtcp.1 b/testcode/streamtcp.1
index 7c738d9d278c..526c8e1699d4 100644
--- a/testcode/streamtcp.1
+++ b/testcode/streamtcp.1
@@ -12,6 +12,8 @@
.RB [ \-unsh ]
.RB [ \-f
.IR ipaddr[@port] ]
+.RB [ \-d
+.IR secs ]
.I name
.I type
.I class
@@ -50,6 +52,10 @@ Print program usage.
.TP
.B \-f \fIipaddr[@port]
Specify the server to send the queries to. If not specified localhost (127.0.0.1) is used.
+.TP
+.B \-d \fIsecs
+Delay after the connection before sending query. This tests the timeout
+on the other side, eg. if shorter the connection is closed.
.SH "EXAMPLES"
.LP
Some examples of use.
diff --git a/testcode/streamtcp.c b/testcode/streamtcp.c
index 0a636395fd35..497e3d2888fe 100644
--- a/testcode/streamtcp.c
+++ b/testcode/streamtcp.c
@@ -44,6 +44,8 @@
#include <getopt.h>
#endif
#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
#include "util/locks.h"
#include "util/log.h"
#include "util/net_help.h"
@@ -71,6 +73,7 @@ static void usage(char* argv[])
printf("-f server what ipaddr@portnr to send the queries to\n");
printf("-u use UDP. No retries are attempted.\n");
printf("-n do not wait for an answer.\n");
+ printf("-d secs delay after connection before sending query\n");
printf("-s use ssl\n");
printf("-h this help text\n");
exit(1);
@@ -275,7 +278,8 @@ static int get_random(void)
/** send the TCP queries and print answers */
static void
-send_em(const char* svr, int udp, int usessl, int noanswer, int num, char** qs)
+send_em(const char* svr, int udp, int usessl, int noanswer, int delay,
+ int num, char** qs)
{
sldns_buffer* buf = sldns_buffer_new(65553);
int fd = open_svr(svr, udp);
@@ -310,6 +314,13 @@ send_em(const char* svr, int udp, int usessl, int noanswer, int num, char** qs)
}
}
for(i=0; i<num; i+=3) {
+ if (delay != 0) {
+#ifdef HAVE_SLEEP
+ sleep((unsigned)delay);
+#else
+ Sleep(delay*1000);
+#endif
+ }
printf("\nNext query is %s %s %s\n", qs[i], qs[i+1], qs[i+2]);
write_q(fd, udp, ssl, buf, (uint16_t)get_random(), qs[i],
qs[i+1], qs[i+2]);
@@ -358,6 +369,7 @@ int main(int argc, char** argv)
int udp = 0;
int noanswer = 0;
int usessl = 0;
+ int delay = 0;
#ifdef USE_WINSOCK
WSADATA wsa_data;
@@ -382,7 +394,7 @@ int main(int argc, char** argv)
if(argc == 1) {
usage(argv);
}
- while( (c=getopt(argc, argv, "f:hnsu")) != -1) {
+ while( (c=getopt(argc, argv, "f:hnsud:")) != -1) {
switch(c) {
case 'f':
svr = optarg;
@@ -396,6 +408,14 @@ int main(int argc, char** argv)
case 's':
usessl = 1;
break;
+ case 'd':
+ if(atoi(optarg)==0 && strcmp(optarg,"0")!=0) {
+ printf("error parsing delay, "
+ "number expected: %s\n", optarg);
+ return 1;
+ }
+ delay = atoi(optarg);
+ break;
case 'h':
case '?':
default:
@@ -426,7 +446,7 @@ int main(int argc, char** argv)
(void)OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS, NULL);
#endif
}
- send_em(svr, udp, usessl, noanswer, argc, argv);
+ send_em(svr, udp, usessl, noanswer, delay, argc, argv);
checklock_stop();
#ifdef USE_WINSOCK
WSACleanup();
diff --git a/testcode/unitauth.c b/testcode/unitauth.c
index 4b538ef62687..c162e7ef9648 100644
--- a/testcode/unitauth.c
+++ b/testcode/unitauth.c
@@ -111,8 +111,9 @@ static const char* zone_example_com =
/* just an RRSIG rrset with nothing else, 2 rrsigs */
"z5.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
"z5.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 12345 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
-#if 0 /* comparison of file does not work on this part because duplicates */
+#if 1 /* comparison of file does not work on this part because duplicates */
/* are removed and the rrsets are reordered */
+"end_of_check.z6.example.com. 3600 IN A 10.0.0.10\n"
/* first rrsig, then A record */
"z6.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
"z6.example.com. 3600 IN A 10.0.0.10\n"
@@ -131,6 +132,12 @@ static const char* zone_example_com =
"z9.example.com. 3600 IN A 10.0.0.10\n"
"z9.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
"z9.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
+/* different covered types, first RRSIGs then, RRs, then another RRSIG */
+"zz10.example.com. 3600 IN RRSIG AAAA 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
+"zz10.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
+"zz10.example.com. 3600 IN A 10.0.0.10\n"
+"zz10.example.com. 3600 IN RRSIG CNAME 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
+"zz10.example.com. 3600 IN AAAA ::11\n"
#endif /* if0 for duplicates and reordering */
;
@@ -550,11 +557,16 @@ checkfile(char* f1, char *f2)
cp2 = fgets(buf2, (int)sizeof(buf2), i2);
if((!cp1 && !feof(i1)) || (!cp2 && !feof(i2)))
fatal_exit("fgets failed: %s", strerror(errno));
+ if(strncmp(buf1, "end_of_check", 12) == 0) {
+ fclose(i1);
+ fclose(i2);
+ return;
+ }
if(strcmp(buf1, buf2) != 0) {
log_info("in files %s and %s:%d", f1, f2, line);
log_info("'%s'", buf1);
log_info("'%s'", buf2);
- fatal_exit("files are not eqaul");
+ fatal_exit("files are not equal");
}
}
unit_assert(feof(i1) && feof(i2));
diff --git a/testcode/unitldns.c b/testcode/unitldns.c
index e27e46eaa926..66f75617037d 100644
--- a/testcode/unitldns.c
+++ b/testcode/unitldns.c
@@ -199,15 +199,25 @@ rr_test_file(const char* input, const char* check)
free(back);
}
+#define xstr(s) str(s)
+#define str(s) #s
+
+#define SRCDIRSTR xstr(SRCDIR)
+
/** read rrs to and from string, to and from wireformat */
static void
rr_tests(void)
{
- rr_test_file("testdata/test_ldnsrr.1", "testdata/test_ldnsrr.c1");
- rr_test_file("testdata/test_ldnsrr.2", "testdata/test_ldnsrr.c2");
- rr_test_file("testdata/test_ldnsrr.3", "testdata/test_ldnsrr.c3");
- rr_test_file("testdata/test_ldnsrr.4", "testdata/test_ldnsrr.c4");
- rr_test_file("testdata/test_ldnsrr.5", "testdata/test_ldnsrr.c5");
+ rr_test_file(SRCDIRSTR "/testdata/test_ldnsrr.1",
+ SRCDIRSTR "/testdata/test_ldnsrr.c1");
+ rr_test_file(SRCDIRSTR "/testdata/test_ldnsrr.2",
+ SRCDIRSTR "/testdata/test_ldnsrr.c2");
+ rr_test_file(SRCDIRSTR "/testdata/test_ldnsrr.3",
+ SRCDIRSTR "/testdata/test_ldnsrr.c3");
+ rr_test_file(SRCDIRSTR "/testdata/test_ldnsrr.4",
+ SRCDIRSTR "/testdata/test_ldnsrr.c4");
+ rr_test_file(SRCDIRSTR "/testdata/test_ldnsrr.5",
+ SRCDIRSTR "/testdata/test_ldnsrr.c5");
}
void
diff --git a/testcode/unitmain.c b/testcode/unitmain.c
index fecde80cc3d1..e28be8c833af 100644
--- a/testcode/unitmain.c
+++ b/testcode/unitmain.c
@@ -404,12 +404,13 @@ config_tag_test(void)
#include "util/rtt.h"
#include "util/timehist.h"
+#include "iterator/iterator.h"
#include "libunbound/unbound.h"
/** test RTT code */
static void
rtt_test(void)
{
- int init = 376;
+ int init = UNKNOWN_SERVER_NICENESS;
int i;
struct rtt_info r;
unit_show_func("util/rtt.c", "rtt_timeout");
diff --git a/testcode/unitmsgparse.c b/testcode/unitmsgparse.c
index 627d10b78ec3..c0b38bac76e4 100644
--- a/testcode/unitmsgparse.c
+++ b/testcode/unitmsgparse.c
@@ -495,6 +495,11 @@ testfromdrillfile(sldns_buffer* pkt, struct alloc_cache* alloc,
fclose(in);
}
+#define xstr(s) str(s)
+#define str(s) #s
+
+#define SRCDIRSTR xstr(SRCDIR)
+
void msgparse_test(void)
{
time_t origttl = MAX_NEG_TTL;
@@ -509,27 +514,27 @@ void msgparse_test(void)
unit_show_feature("message parse");
simpletest(pkt, &alloc, out);
/* plain hex dumps, like pcat */
- testfromfile(pkt, &alloc, out, "testdata/test_packets.1");
- testfromfile(pkt, &alloc, out, "testdata/test_packets.2");
- testfromfile(pkt, &alloc, out, "testdata/test_packets.3");
+ testfromfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.1");
+ testfromfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.2");
+ testfromfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.3");
/* like from drill -w - */
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.4");
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.5");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.4");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.5");
matches_nolocation = 1; /* RR order not important for the next test */
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.6");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.6");
check_rrsigs = 1;
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.7");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.7");
check_rrsigs = 0;
matches_nolocation = 0;
check_formerr_gone = 1;
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.8");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.8");
check_formerr_gone = 0;
check_rrsigs = 1;
check_nosameness = 1;
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.9");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.9");
check_nosameness = 0;
check_rrsigs = 0;
diff --git a/testcode/unitverify.c b/testcode/unitverify.c
index 95676e104905..9e101324960e 100644
--- a/testcode/unitverify.c
+++ b/testcode/unitverify.c
@@ -497,65 +497,70 @@ nsec3_hash_test(const char* fname)
sldns_buffer_free(buf);
}
+#define xstr(s) str(s)
+#define str(s) #s
+
+#define SRCDIRSTR xstr(SRCDIR)
+
void
verify_test(void)
{
unit_show_feature("signature verify");
#ifdef USE_SHA1
- verifytest_file("testdata/test_signatures.1", "20070818005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.1", "20070818005004");
#endif
#if defined(USE_DSA) && defined(USE_SHA1)
- verifytest_file("testdata/test_signatures.2", "20080414005004");
- verifytest_file("testdata/test_signatures.3", "20080416005004");
- verifytest_file("testdata/test_signatures.4", "20080416005004");
- verifytest_file("testdata/test_signatures.5", "20080416005004");
- verifytest_file("testdata/test_signatures.6", "20080416005004");
- verifytest_file("testdata/test_signatures.7", "20070829144150");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.2", "20080414005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.3", "20080416005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.4", "20080416005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.5", "20080416005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.6", "20080416005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.7", "20070829144150");
#endif /* USE_DSA */
#ifdef USE_SHA1
- verifytest_file("testdata/test_signatures.8", "20070829144150");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.8", "20070829144150");
#endif
#if (defined(HAVE_EVP_SHA256) || defined(HAVE_NSS) || defined(HAVE_NETTLE)) && defined(USE_SHA2)
- verifytest_file("testdata/test_sigs.rsasha256", "20070829144150");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.rsasha256", "20070829144150");
# ifdef USE_SHA1
- verifytest_file("testdata/test_sigs.sha1_and_256", "20070829144150");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.sha1_and_256", "20070829144150");
# endif
- verifytest_file("testdata/test_sigs.rsasha256_draft", "20090101000000");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.rsasha256_draft", "20090101000000");
#endif
#if (defined(HAVE_EVP_SHA512) || defined(HAVE_NSS) || defined(HAVE_NETTLE)) && defined(USE_SHA2)
- verifytest_file("testdata/test_sigs.rsasha512_draft", "20070829144150");
- verifytest_file("testdata/test_signatures.9", "20171215000000");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.rsasha512_draft", "20070829144150");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.9", "20171215000000");
#endif
#ifdef USE_SHA1
- verifytest_file("testdata/test_sigs.hinfo", "20090107100022");
- verifytest_file("testdata/test_sigs.revoked", "20080414005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.hinfo", "20090107100022");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.revoked", "20080414005004");
#endif
#ifdef USE_GOST
if(sldns_key_EVP_load_gost_id())
- verifytest_file("testdata/test_sigs.gost", "20090807060504");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.gost", "20090807060504");
else printf("Warning: skipped GOST, openssl does not provide gost.\n");
#endif
#ifdef USE_ECDSA
/* test for support in case we use libNSS and ECC is removed */
if(dnskey_algo_id_is_supported(LDNS_ECDSAP256SHA256)) {
- verifytest_file("testdata/test_sigs.ecdsa_p256", "20100908100439");
- verifytest_file("testdata/test_sigs.ecdsa_p384", "20100908100439");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.ecdsa_p256", "20100908100439");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.ecdsa_p384", "20100908100439");
}
- dstest_file("testdata/test_ds.sha384");
+ dstest_file(SRCDIRSTR "/testdata/test_ds.sha384");
#endif
#ifdef USE_ED25519
if(dnskey_algo_id_is_supported(LDNS_ED25519)) {
- verifytest_file("testdata/test_sigs.ed25519", "20170530140439");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.ed25519", "20170530140439");
}
#endif
#ifdef USE_ED448
if(dnskey_algo_id_is_supported(LDNS_ED448)) {
- verifytest_file("testdata/test_sigs.ed448", "20180408143630");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.ed448", "20180408143630");
}
#endif
#ifdef USE_SHA1
- dstest_file("testdata/test_ds.sha1");
+ dstest_file(SRCDIRSTR "/testdata/test_ds.sha1");
#endif
nsectest();
- nsec3_hash_test("testdata/test_nsec3_hash.1");
+ nsec3_hash_test(SRCDIRSTR "/testdata/test_nsec3_hash.1");
}
diff --git a/testdata/autotrust_init.rpl b/testdata/autotrust_init.rpl
index c6bde72ac48b..d722273e0a99 100644
--- a/testdata/autotrust_init.rpl
+++ b/testdata/autotrust_init.rpl
@@ -4,6 +4,7 @@ server:
log-time-ascii: yes
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/autotrust_init_ds.rpl b/testdata/autotrust_init_ds.rpl
index 37a168a1a0ab..ad4019ebec6e 100644
--- a/testdata/autotrust_init_ds.rpl
+++ b/testdata/autotrust_init_ds.rpl
@@ -4,6 +4,7 @@ server:
log-time-ascii: yes
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/autotrust_init_sigs.rpl b/testdata/autotrust_init_sigs.rpl
index fe5eeb0d6509..d5d52f473869 100644
--- a/testdata/autotrust_init_sigs.rpl
+++ b/testdata/autotrust_init_sigs.rpl
@@ -4,6 +4,7 @@ server:
log-time-ascii: yes
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/autotrust_init_zsk.rpl b/testdata/autotrust_init_zsk.rpl
index b807f8ebe046..56a5bc0b3feb 100644
--- a/testdata/autotrust_init_zsk.rpl
+++ b/testdata/autotrust_init_zsk.rpl
@@ -4,6 +4,7 @@ server:
log-time-ascii: yes
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/black_data.rpl b/testdata/black_data.rpl
index 04304d352cf8..de6f57ec1158 100644
--- a/testdata/black_data.rpl
+++ b/testdata/black_data.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/black_prime.rpl b/testdata/black_prime.rpl
index 2cbcc160658a..7e73f32f39ab 100644
--- a/testdata/black_prime.rpl
+++ b/testdata/black_prime.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_anchor.rpl b/testdata/dlv_anchor.rpl
index 445da0a84ea7..81547454eff6 100644
--- a/testdata/dlv_anchor.rpl
+++ b/testdata/dlv_anchor.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_ask_higher.rpl b/testdata/dlv_ask_higher.rpl
index 9f9331080e27..51ac3d24aaee 100644
--- a/testdata/dlv_ask_higher.rpl
+++ b/testdata/dlv_ask_higher.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_below_ta.rpl b/testdata/dlv_below_ta.rpl
index 6f72f261c390..f5d630dfb2d7 100644
--- a/testdata/dlv_below_ta.rpl
+++ b/testdata/dlv_below_ta.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_delegation.rpl b/testdata/dlv_delegation.rpl
index 1eada40649f7..53074c8e257f 100644
--- a/testdata/dlv_delegation.rpl
+++ b/testdata/dlv_delegation.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_insecure.rpl b/testdata/dlv_insecure.rpl
index 94ba865d8703..e6515a9fb6ec 100644
--- a/testdata/dlv_insecure.rpl
+++ b/testdata/dlv_insecure.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_insecure_negcache.rpl b/testdata/dlv_insecure_negcache.rpl
index b91105160ad2..8408870b9969 100644
--- a/testdata/dlv_insecure_negcache.rpl
+++ b/testdata/dlv_insecure_negcache.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_remove_empty.rpl b/testdata/dlv_remove_empty.rpl
index 2e9b4bcf6638..11b825bc2621 100644
--- a/testdata/dlv_remove_empty.rpl
+++ b/testdata/dlv_remove_empty.rpl
@@ -5,6 +5,7 @@ server:
val-override-date: "20070916134226"
target-fetch-policy: "0 0 0 0 0"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_remove_nodel.rpl b/testdata/dlv_remove_nodel.rpl
index 1f2d94721abd..1abe5a32f37a 100644
--- a/testdata/dlv_remove_nodel.rpl
+++ b/testdata/dlv_remove_nodel.rpl
@@ -6,6 +6,7 @@ server:
val-override-date: "20070916134226"
target-fetch-policy: "0 0 0 0 0"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_remove_pos.rpl b/testdata/dlv_remove_pos.rpl
index fe2d7fee79d1..892ffa3c0c47 100644
--- a/testdata/dlv_remove_pos.rpl
+++ b/testdata/dlv_remove_pos.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_unused.rpl b/testdata/dlv_unused.rpl
index 386755835128..aa7d04c1eab4 100644
--- a/testdata/dlv_unused.rpl
+++ b/testdata/dlv_unused.rpl
@@ -7,6 +7,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dns64_lookup.rpl b/testdata/dns64_lookup.rpl
index e24622c0d4b5..898d0d01ad16 100644
--- a/testdata/dns64_lookup.rpl
+++ b/testdata/dns64_lookup.rpl
@@ -4,6 +4,7 @@ server:
qname-minimisation: "no"
module-config: "dns64 validator iterator"
dns64-prefix: 64:ff9b::0/96
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/domain_insec_dlv.rpl b/testdata/domain_insec_dlv.rpl
index 8c89a70d33ba..c8bd98344d30 100644
--- a/testdata/domain_insec_dlv.rpl
+++ b/testdata/domain_insec_dlv.rpl
@@ -5,6 +5,7 @@ server:
domain-insecure: "example.net"
val-override-date: "20070916134226"
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/edns_keepalive.rpl b/testdata/edns_keepalive.rpl
new file mode 100644
index 000000000000..9d00b6cf762a
--- /dev/null
+++ b/testdata/edns_keepalive.rpl
@@ -0,0 +1,126 @@
+server:
+ verbosity: 3
+ edns-tcp-keepalive: yes
+ edns-tcp-keepalive-timeout: 30000 # Hardwired to this in fake_event.c
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN TCP Keepalive
+
+RANGE_BEGIN 0 100
+
+ ADDRESS 193.0.14.129
+
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ . IN NS
+ SECTION ANSWER
+ . IN NS K.ROOT-SERVERS.NET.
+ SECTION ADDITIONAL
+ K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ ENTRY_END
+
+RANGE_END
+
+;; ----------------------------------------
+
+STEP 1 QUERY
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY RD
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ 00 0b ; Opcode 11
+ 00 02 ; Length 2
+ 00 ff ; Timeout
+ HEX_EDNSDATA_END
+ ENTRY_END
+
+STEP 10 CHECK_ANSWER
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY RD FORMERR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ ; Empty
+ HEX_EDNSDATA_END
+ ENTRY_END
+
+STEP 20 QUERY
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY RD
+ SECTION QUESTION
+ . IN NS
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ 00 0b ; Opcode 11
+ 00 00 ; Length 0
+ HEX_EDNSDATA_END
+ ENTRY_END
+
+STEP 30 CHECK_ANSWER
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY QR RD RA NOERROR
+ SECTION QUESTION
+ . IN NS
+ SECTION ANSWER
+ . IN NS K.ROOT-SERVERS.NET.
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ 00 0b ; Opcode 11
+ 00 02 ; Length 2
+ 01 2c ; 30s = 300 10th secs
+ HEX_EDNSDATA_END
+ K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ ENTRY_END
+
+; Check that a subsequent query on the connection without keepalive will
+; generate a keepalive reply because we've already seen one.
+
+STEP 40 QUERY
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY RD
+ SECTION QUESTION
+ . IN NS
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ ; Empty
+ HEX_EDNSDATA_END
+ ENTRY_END
+
+STEP 50 CHECK_ANSWER
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY QR RD RA NOERROR
+ SECTION QUESTION
+ . IN NS
+ SECTION ANSWER
+ . IN NS K.ROOT-SERVERS.NET.
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ 00 0b ; Opcode 11
+ 00 02 ; Length 2
+ 01 2c ; 30s = 300 10th secs
+ HEX_EDNSDATA_END
+ K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/fetch_glue.rpl b/testdata/fetch_glue.rpl
index 3ecc28abf71c..3e9f64f8d1b0 100644
--- a/testdata/fetch_glue.rpl
+++ b/testdata/fetch_glue.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/fetch_glue_cname.rpl b/testdata/fetch_glue_cname.rpl
index e8158f9f07b2..4a86afa50f65 100644
--- a/testdata/fetch_glue_cname.rpl
+++ b/testdata/fetch_glue_cname.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/fwd_cached.rpl b/testdata/fwd_cached.rpl
index 23b4a08a2282..2d6b0c2b8cbe 100644
--- a/testdata/fwd_cached.rpl
+++ b/testdata/fwd_cached.rpl
@@ -1,5 +1,7 @@
; This is a comment.
; config options go here.
+server:
+ minimal-responses: no
forward-zone: name: "." forward-addr: 216.0.0.1
CONFIG_END
diff --git a/testdata/fwd_compress_c00c.tdir/fwd_compress_c00c.conf b/testdata/fwd_compress_c00c.tdir/fwd_compress_c00c.conf
index 39bd9f5cb23d..08e9d643274c 100644
--- a/testdata/fwd_compress_c00c.tdir/fwd_compress_c00c.conf
+++ b/testdata/fwd_compress_c00c.tdir/fwd_compress_c00c.conf
@@ -9,6 +9,7 @@ server:
chroot: ""
username: ""
do-not-query-localhost: no
+ minimal-responses: no
forward-zone:
name: "."
forward-addr: "127.0.0.1@@TOPORT@"
diff --git a/testdata/ipsecmod_enabled.crpl b/testdata/ipsecmod_enabled.crpl
index 501f18be4857..449842961de1 100644
--- a/testdata/ipsecmod_enabled.crpl
+++ b/testdata/ipsecmod_enabled.crpl
@@ -10,6 +10,7 @@ server:
ipsecmod-max-ttl: 200
ipsecmod-enabled: no
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/ipsecmod_ignore_bogus_ipseckey.crpl b/testdata/ipsecmod_ignore_bogus_ipseckey.crpl
index d62dfafd2d1c..a605c344581b 100644
--- a/testdata/ipsecmod_ignore_bogus_ipseckey.crpl
+++ b/testdata/ipsecmod_ignore_bogus_ipseckey.crpl
@@ -17,6 +17,7 @@ server:
ipsecmod-max-ttl: 200
ipsecmod-ignore-bogus: yes
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/ipsecmod_max_ttl.crpl b/testdata/ipsecmod_max_ttl.crpl
index 50d4adf64e89..592bae046360 100644
--- a/testdata/ipsecmod_max_ttl.crpl
+++ b/testdata/ipsecmod_max_ttl.crpl
@@ -9,6 +9,7 @@ server:
ipsecmod-strict: no
ipsecmod-max-ttl: 200
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/ipsecmod_strict.crpl b/testdata/ipsecmod_strict.crpl
index 13d8e0e4bd5d..f74e308bde44 100644
--- a/testdata/ipsecmod_strict.crpl
+++ b/testdata/ipsecmod_strict.crpl
@@ -9,6 +9,7 @@ server:
ipsecmod-strict: yes
ipsecmod-max-ttl: 200
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/ipsecmod_whitelist.crpl b/testdata/ipsecmod_whitelist.crpl
index d916b0050e4d..34108f3b1161 100644
--- a/testdata/ipsecmod_whitelist.crpl
+++ b/testdata/ipsecmod_whitelist.crpl
@@ -10,6 +10,7 @@ server:
ipsecmod-max-ttl: 200
ipsecmod-whitelist: white.example.com
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_class_any.rpl b/testdata/iter_class_any.rpl
index a4ea822fdba0..6fb296e99d00 100644
--- a/testdata/iter_class_any.rpl
+++ b/testdata/iter_class_any.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_cycle_noh.rpl b/testdata/iter_cycle_noh.rpl
index 6c2982adc94e..eee26ca70d15 100644
--- a/testdata/iter_cycle_noh.rpl
+++ b/testdata/iter_cycle_noh.rpl
@@ -3,6 +3,7 @@ server:
harden-glue: "no"
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_dname_insec.rpl b/testdata/iter_dname_insec.rpl
index 791e3848572a..ce593ba5c20a 100644
--- a/testdata/iter_dname_insec.rpl
+++ b/testdata/iter_dname_insec.rpl
@@ -3,6 +3,7 @@ server:
harden-referral-path: no
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_domain_sale.rpl b/testdata/iter_domain_sale.rpl
index ff612780a8c8..be05e2f4363d 100644
--- a/testdata/iter_domain_sale.rpl
+++ b/testdata/iter_domain_sale.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_domain_sale_nschange.rpl b/testdata/iter_domain_sale_nschange.rpl
index bc396f67c6f3..5af54efb9855 100644
--- a/testdata/iter_domain_sale_nschange.rpl
+++ b/testdata/iter_domain_sale_nschange.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_emptydp.rpl b/testdata/iter_emptydp.rpl
index f61b3064dddb..82ddccfade66 100644
--- a/testdata/iter_emptydp.rpl
+++ b/testdata/iter_emptydp.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_emptydp_for_glue.rpl b/testdata/iter_emptydp_for_glue.rpl
index 33951e790a70..2e7db65e1402 100644
--- a/testdata/iter_emptydp_for_glue.rpl
+++ b/testdata/iter_emptydp_for_glue.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_fwdfirst.rpl b/testdata/iter_fwdfirst.rpl
index 5154babb348b..0f8a85f5ae03 100644
--- a/testdata/iter_fwdfirst.rpl
+++ b/testdata/iter_fwdfirst.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_fwdfirstequal.rpl b/testdata/iter_fwdfirstequal.rpl
index d8da470cf542..dc648143ce66 100644
--- a/testdata/iter_fwdfirstequal.rpl
+++ b/testdata/iter_fwdfirstequal.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_fwdstub.rpl b/testdata/iter_fwdstub.rpl
index 06a8789b721b..ad5b57cb7690 100644
--- a/testdata/iter_fwdstub.rpl
+++ b/testdata/iter_fwdstub.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_fwdstubroot.rpl b/testdata/iter_fwdstubroot.rpl
index e43584cbef17..fa930430d7f5 100644
--- a/testdata/iter_fwdstubroot.rpl
+++ b/testdata/iter_fwdstubroot.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_got6only.rpl b/testdata/iter_got6only.rpl
index 7363a48b7d52..15522843903b 100644
--- a/testdata/iter_got6only.rpl
+++ b/testdata/iter_got6only.rpl
@@ -3,6 +3,7 @@ server:
do-ip6: no
target-fetch-policy: "0 0 0 0 0 "
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/iter_hint_lame.rpl b/testdata/iter_hint_lame.rpl
index e9ffbce64c7b..2fb6dde72d91 100644
--- a/testdata/iter_hint_lame.rpl
+++ b/testdata/iter_hint_lame.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_lame_noaa.rpl b/testdata/iter_lame_noaa.rpl
index 18d326b77967..7a6eb1b30536 100644
--- a/testdata/iter_lame_noaa.rpl
+++ b/testdata/iter_lame_noaa.rpl
@@ -3,6 +3,7 @@ server:
harden-referral-path: no
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_lame_nosoa.rpl b/testdata/iter_lame_nosoa.rpl
index 903bb29bc99f..4914f7461f5f 100644
--- a/testdata/iter_lame_nosoa.rpl
+++ b/testdata/iter_lame_nosoa.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_mod.rpl b/testdata/iter_mod.rpl
index c57e2328ab78..35b3a5af6a5c 100644
--- a/testdata/iter_mod.rpl
+++ b/testdata/iter_mod.rpl
@@ -3,6 +3,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
module-config: "iterator"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_ns_badip.rpl b/testdata/iter_ns_badip.rpl
index 6ce2b14d47b5..ad266c64d117 100644
--- a/testdata/iter_ns_badip.rpl
+++ b/testdata/iter_ns_badip.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "3 2 1 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_ns_spoof.rpl b/testdata/iter_ns_spoof.rpl
index 1679ce724c7a..f6745763532f 100644
--- a/testdata/iter_ns_spoof.rpl
+++ b/testdata/iter_ns_spoof.rpl
@@ -3,6 +3,7 @@ server:
harden-referral-path: yes
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/iter_pc_a.rpl b/testdata/iter_pc_a.rpl
index 985345c15360..d9add0056fea 100644
--- a/testdata/iter_pc_a.rpl
+++ b/testdata/iter_pc_a.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pc_aaaa.rpl b/testdata/iter_pc_aaaa.rpl
index 20e1a787f402..a28354306aca 100644
--- a/testdata/iter_pc_aaaa.rpl
+++ b/testdata/iter_pc_aaaa.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcdiff.rpl b/testdata/iter_pcdiff.rpl
index 18b984c16797..57fb109afa5e 100644
--- a/testdata/iter_pcdiff.rpl
+++ b/testdata/iter_pcdiff.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcdirect.rpl b/testdata/iter_pcdirect.rpl
index 0a4487fd86c7..0bd5dfe78355 100644
--- a/testdata/iter_pcdirect.rpl
+++ b/testdata/iter_pcdirect.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcname.rpl b/testdata/iter_pcname.rpl
index 037b6426f4d2..e17c9102c86a 100644
--- a/testdata/iter_pcname.rpl
+++ b/testdata/iter_pcname.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcnamech.rpl b/testdata/iter_pcnamech.rpl
index a979101d9547..1aba95b07aa7 100644
--- a/testdata/iter_pcnamech.rpl
+++ b/testdata/iter_pcnamech.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcnamechrec.rpl b/testdata/iter_pcnamechrec.rpl
index f4c0197ba908..90745fcf3eb2 100644
--- a/testdata/iter_pcnamechrec.rpl
+++ b/testdata/iter_pcnamechrec.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcnamerec.rpl b/testdata/iter_pcnamerec.rpl
index ecc03d353501..faee6d029acd 100644
--- a/testdata/iter_pcnamerec.rpl
+++ b/testdata/iter_pcnamerec.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcttl.rpl b/testdata/iter_pcttl.rpl
index 41d94bc4234d..413f8cb88b09 100644
--- a/testdata/iter_pcttl.rpl
+++ b/testdata/iter_pcttl.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
do-ip6: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch.rpl b/testdata/iter_prefetch.rpl
index feb6b81e8673..bad92dc575dd 100644
--- a/testdata/iter_prefetch.rpl
+++ b/testdata/iter_prefetch.rpl
@@ -3,6 +3,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch_change.rpl b/testdata/iter_prefetch_change.rpl
index 2ed70cdadf8f..007025ad010c 100644
--- a/testdata/iter_prefetch_change.rpl
+++ b/testdata/iter_prefetch_change.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch_change2.rpl b/testdata/iter_prefetch_change2.rpl
index 93196d555f72..7a8370ff61bb 100644
--- a/testdata/iter_prefetch_change2.rpl
+++ b/testdata/iter_prefetch_change2.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch_childns.rpl b/testdata/iter_prefetch_childns.rpl
index 869aaa40c95c..00a91fcde1a5 100644
--- a/testdata/iter_prefetch_childns.rpl
+++ b/testdata/iter_prefetch_childns.rpl
@@ -3,6 +3,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch_fail.rpl b/testdata/iter_prefetch_fail.rpl
index 2f7f9942510d..1d92a4c1c462 100644
--- a/testdata/iter_prefetch_fail.rpl
+++ b/testdata/iter_prefetch_fail.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch_ns.rpl b/testdata/iter_prefetch_ns.rpl
index f99fb80dcf5a..93af216387ae 100644
--- a/testdata/iter_prefetch_ns.rpl
+++ b/testdata/iter_prefetch_ns.rpl
@@ -3,6 +3,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_primenoglue.rpl b/testdata/iter_primenoglue.rpl
index 0d6adefc591e..a75ed82ddce2 100644
--- a/testdata/iter_primenoglue.rpl
+++ b/testdata/iter_primenoglue.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_privaddr.rpl b/testdata/iter_privaddr.rpl
index 2361af6536c8..93a2a147d1eb 100644
--- a/testdata/iter_privaddr.rpl
+++ b/testdata/iter_privaddr.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
private-address: 10.0.0.0/8
private-address: 172.16.0.0/12
diff --git a/testdata/iter_ranoaa_lame.rpl b/testdata/iter_ranoaa_lame.rpl
index d2db84a8e097..efb38a5907ec 100644
--- a/testdata/iter_ranoaa_lame.rpl
+++ b/testdata/iter_ranoaa_lame.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_reclame_one.rpl b/testdata/iter_reclame_one.rpl
index fe15b256ce39..4df9b6594fe4 100644
--- a/testdata/iter_reclame_one.rpl
+++ b/testdata/iter_reclame_one.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_reclame_two.rpl b/testdata/iter_reclame_two.rpl
index 3b7dfd65cbe0..f30edd941472 100644
--- a/testdata/iter_reclame_two.rpl
+++ b/testdata/iter_reclame_two.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_recurse.rpl b/testdata/iter_recurse.rpl
index ab62e1ae5d5f..181af11079f5 100644
--- a/testdata/iter_recurse.rpl
+++ b/testdata/iter_recurse.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_resolve.rpl b/testdata/iter_resolve.rpl
index cab3887f77b9..ed051ff24eff 100644
--- a/testdata/iter_resolve.rpl
+++ b/testdata/iter_resolve.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_resolve_minimised.rpl b/testdata/iter_resolve_minimised.rpl
index ab3c6e9e7121..2c6f9ccf5f93 100644
--- a/testdata/iter_resolve_minimised.rpl
+++ b/testdata/iter_resolve_minimised.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_resolve_minimised_nx.rpl b/testdata/iter_resolve_minimised_nx.rpl
index cb877bc250b4..74e612ccb951 100644
--- a/testdata/iter_resolve_minimised_nx.rpl
+++ b/testdata/iter_resolve_minimised_nx.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_resolve_minimised_refused.rpl b/testdata/iter_resolve_minimised_refused.rpl
index 82852a4380cd..66e8e631e200 100644
--- a/testdata/iter_resolve_minimised_refused.rpl
+++ b/testdata/iter_resolve_minimised_refused.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_resolve_minimised_timeout.rpl b/testdata/iter_resolve_minimised_timeout.rpl
index 2a166aff0e71..86b93216075b 100644
--- a/testdata/iter_resolve_minimised_timeout.rpl
+++ b/testdata/iter_resolve_minimised_timeout.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_scrub_cname_an.rpl b/testdata/iter_scrub_cname_an.rpl
index 54a98c63bf34..9c5060af7913 100644
--- a/testdata/iter_scrub_cname_an.rpl
+++ b/testdata/iter_scrub_cname_an.rpl
@@ -3,6 +3,7 @@ server:
harden-referral-path: no
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_scrub_dname_insec.rpl b/testdata/iter_scrub_dname_insec.rpl
index a2972202c626..921abe628f7f 100644
--- a/testdata/iter_scrub_dname_insec.rpl
+++ b/testdata/iter_scrub_dname_insec.rpl
@@ -3,6 +3,7 @@ server:
harden-referral-path: no
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_scrub_dname_rev.rpl b/testdata/iter_scrub_dname_rev.rpl
index b7e3ee2d0fb1..3e649f936186 100644
--- a/testdata/iter_scrub_dname_rev.rpl
+++ b/testdata/iter_scrub_dname_rev.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_scrub_dname_sec.rpl b/testdata/iter_scrub_dname_sec.rpl
index 1b9153ba74a5..4597cdf982cd 100644
--- a/testdata/iter_scrub_dname_sec.rpl
+++ b/testdata/iter_scrub_dname_sec.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_soamin.rpl b/testdata/iter_soamin.rpl
index 42eb80827d61..7e902601b006 100644
--- a/testdata/iter_soamin.rpl
+++ b/testdata/iter_soamin.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_stub_leak.rpl b/testdata/iter_stub_leak.rpl
index e5c6200060a0..388344ce5ef0 100644
--- a/testdata/iter_stub_leak.rpl
+++ b/testdata/iter_stub_leak.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_stub_noroot.rpl b/testdata/iter_stub_noroot.rpl
index 0bc1ff5d2031..ef306bd428c4 100644
--- a/testdata/iter_stub_noroot.rpl
+++ b/testdata/iter_stub_noroot.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_stubfirst.rpl b/testdata/iter_stubfirst.rpl
index 6245a4f09a1e..1a7112de4517 100644
--- a/testdata/iter_stubfirst.rpl
+++ b/testdata/iter_stubfirst.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_timeout_ra_aaaa.rpl b/testdata/iter_timeout_ra_aaaa.rpl
index 9b06aea90992..126867ba4a4a 100644
--- a/testdata/iter_timeout_ra_aaaa.rpl
+++ b/testdata/iter_timeout_ra_aaaa.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/pylib.tdir/pylib.lookup.conf b/testdata/pylib.tdir/pylib.lookup.conf
new file mode 100644
index 000000000000..3f4a8d26dfb1
--- /dev/null
+++ b/testdata/pylib.tdir/pylib.lookup.conf
@@ -0,0 +1,14 @@
+server:
+ verbosity: 2
+ use-syslog: no
+ directory: ""
+ pidfile: "unbound.pid"
+ chroot: ""
+ username: ""
+ do-not-query-localhost: no
+ module-config: "validator iterator"
+
+stub-zone:
+ name: "example.com."
+ stub-addr: "127.0.0.1@@TOPORT@"
+
diff --git a/testdata/pylib.tdir/pylib.lookup.py b/testdata/pylib.tdir/pylib.lookup.py
index 1c829bc7054d..5f69c58abd18 100755
--- a/testdata/pylib.tdir/pylib.lookup.py
+++ b/testdata/pylib.tdir/pylib.lookup.py
@@ -1,24 +1,141 @@
#!/usr/bin/env python
-'''
-Test for unbound lookup.
-BSD licensed.
-'''
+#
+# Test for pyunbound lookup.
+# BSD licensed.
+#
+import sys
+import time
+
import unbound
-ctx = unbound.ub_ctx()
-status = ctx.config("ub.conf")
-if status != 0:
- print "read config failed ", status
- exit(1)
+qname = "www.example.com"
+qtype = unbound.RR_TYPE_A
+qclass = unbound.RR_CLASS_IN
+
+def create_context(config_file="ub.lookup.conf", async=False):
+ """
+ Create an unbound context to use for testing.
+
+ """
+ ctx = unbound.ub_ctx()
+ status = ctx.config(config_file)
+ if status != 0:
+ print("read config failed with status: {}".format(status))
+ sys.exit(1)
+ ctx.set_async(async)
+ return ctx
+
+
+def callback(data, status, result):
+ """
+ Callback for background workers.
+
+ """
+ if status == 0:
+ data['rcode'] = result.rcode
+ data['secure'] = result.secure
+ if result.havedata:
+ data['data'] = result.data
+ data['was_ratelimited'] = result.was_ratelimited
+ data['done'] = True
+
+
+def test_resolve(ctx):
+ """
+ Test resolving a domain with a foreground worker.
+
+ """
+ status, result = ctx.resolve(qname, qtype, qclass)
+ if status == 0 and result.havedata:
+ print("Resolve: {}".format(result.data.address_list))
+ else:
+ print("Failed resolve with: {}".format(status))
+
+
+def test_async_resolve(ctx):
+ """
+ Test resolving a domain with a background worker.
+
+ """
+ cb_data = dict(done=False)
+ retval, async_id = ctx.resolve_async(qname, cb_data, callback, qtype, qclass)
+ while retval == 0 and not cb_data['done']:
+ time.sleep(0.1)
+ retval = ctx.process()
+
+ if cb_data.get('data'):
+ print("Async resolve: {}".format(cb_data['data'].address_list))
+ else:
+ print("Failed async resolve with: {}".format(retval))
+
+
+def test_ratelimit_fg_on(ctx):
+ """
+ Test resolving a ratelimited domain with a foreground worker.
+
+ """
+ ctx.set_option("ratelimit:", "1")
+ ctx.set_option("ratelimit-factor:", "0")
+ status, result = ctx.resolve(qname, qtype, qclass)
+ if status == 0 and result.was_ratelimited:
+ print("Ratelimit-fg-on: pass")
+ else:
+ print("Failed ratelimit-fg-on with: {}".format(status))
+
+
+def test_ratelimit_fg_off(ctx):
+ """
+ Test resolving a non-ratelimited domain with a foreground worker.
+
+ """
+ status, result = ctx.resolve(qname, qtype, qclass)
+ if status == 0 and result.havedata:
+ print("Ratelimit-fg-off: {}".format(result.data.address_list))
+ else:
+ print("Failed ratelimit-fg-off with: {}".format(status))
+
+
+def test_ratelimit_bg_on(ctx):
+ """
+ Test resolving a ratelimited domain with a background worker.
+
+ """
+ ctx.set_option("ratelimit:", "1")
+ ctx.set_option("ratelimit-factor:", "0")
+ cb_data = dict(done=False)
+ retval, async_id = ctx.resolve_async(qname, cb_data, callback, qtype, qclass)
+ while retval == 0 and not cb_data['done']:
+ time.sleep(0.1)
+ retval = ctx.process()
+
+ if cb_data.get('was_ratelimited'):
+ print("Ratelimit-bg-on: pass")
+ else:
+ print("Failed ratelimit-bg-on with: {}".format(status))
+
+
+def test_ratelimit_bg_off(ctx):
+ """
+ Test resolving a non-ratelimited domain with a background worker.
+
+ """
+ cb_data = dict(done=False)
+ retval, async_id = ctx.resolve_async(qname, cb_data, callback, qtype, qclass)
+ while retval == 0 and not cb_data['done']:
+ time.sleep(0.1)
+ retval = ctx.process()
-print "config created"
+ if cb_data.get('data'):
+ print("Ratelimit-bg-off: {}".format(cb_data['data'].address_list))
+ else:
+ print("Failed ratelimit-bg-off with: {}".format(status))
-status, result = ctx.resolve("www.example.com", unbound.RR_TYPE_A, unbound.RR_CLASS_IN);
-if status == 0 and result.havedata:
- print "Result: ", result.data.address_list
-else:
- print "Failed ", status, " and data ", result
-ctx = None
+test_resolve(create_context())
+test_async_resolve(create_context(async=True))
+test_ratelimit_fg_on(create_context())
+test_ratelimit_fg_off(create_context())
+test_ratelimit_bg_on(create_context(async=True))
+test_ratelimit_bg_off(create_context(async=True))
-exit(0)
+sys.exit(0)
diff --git a/testdata/pylib.tdir/pylib.post b/testdata/pylib.tdir/pylib.post
index 26db7e80eee9..875e06d0ae34 100644
--- a/testdata/pylib.tdir/pylib.post
+++ b/testdata/pylib.tdir/pylib.post
@@ -10,9 +10,9 @@ PRE="../.."
. ../common.sh
# if no python; exit
if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then
- echo "have python module"
+ echo "have pyunbound"
else
- echo "no python module"
+ echo "no pyunbound"
exit 0
fi
diff --git a/testdata/pylib.tdir/pylib.pre b/testdata/pylib.tdir/pylib.pre
index 01ca2b896280..30e0059064ab 100644
--- a/testdata/pylib.tdir/pylib.pre
+++ b/testdata/pylib.tdir/pylib.pre
@@ -8,13 +8,16 @@ PRE="../.."
. ../common.sh
# if no python; exit
if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then
- echo "have python module"
+ echo "have pyunbound"
else
- echo "no python module"
+ echo "no pyunbound"
exit 0
fi
-# get module python local
-cp $PRE/pythonmod/unboundmodule.py .
+
+# Copy the required libraries
+cp $PRE/libunbound/python/unbound.py .
+cp $PRE/.libs/_unbound* .
+cp $PRE/.libs/libunbound* .
get_random_port 2
UNBOUND_PORT=$RND_PORT
@@ -29,7 +32,7 @@ FWD_PID=$!
echo "FWD_PID=$FWD_PID" >> .tpkg.var.test
# modify config file
-sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' < pylib.conf > ub.conf
+sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' < pylib.lookup.conf > ub.lookup.conf
cat .tpkg.var.test
wait_ldns_testns_up fwd.log
diff --git a/testdata/pylib.tdir/pylib.py b/testdata/pylib.tdir/pylib.py
deleted file mode 100644
index 3f6fed1c696b..000000000000
--- a/testdata/pylib.tdir/pylib.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# -*- coding: utf-8 -*-
-'''
- ubmodule-msg.py: simple response packet logger
-
- Authors: Zdenek Vasicek (vasicek AT fit.vutbr.cz)
- Marek Vavrusa (xvavru00 AT stud.fit.vutbr.cz)
-
- Copyright (c) 2008. All rights reserved.
-
- This software is open source.
-
- 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.
-
- 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 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.
-
- Modified for unit test by Wouter Wijngaards, NLnet Labs, 2009.
-'''
-import os
-
-def init(id, cfg):
- log_info("pythonmod: init called, module id is %d port: %d script: %s" % (id, cfg.port, cfg.python_script))
- return True
-
-def deinit(id):
- log_info("pythonmod: deinit called, module id is %d" % id)
- return True
-
-def inform_super(id, qstate, superqstate, qdata):
- return True
-
-def setTTL(qstate, ttl):
- """Sets return_msg TTL and all the RRs TTL"""
- if qstate.return_msg:
- qstate.return_msg.rep.ttl = ttl
- if (qstate.return_msg.rep):
- for i in range(0,qstate.return_msg.rep.rrset_count):
- d = qstate.return_msg.rep.rrsets[i].entry.data
- for j in range(0,d.count+d.rrsig_count):
- d.rr_ttl[j] = ttl
-
-def dataHex(data, prefix=""):
- res = ""
- for i in range(0, (len(data)+15)/16):
- res += "%s0x%02X | " % (prefix, i*16)
- d = map(lambda x:ord(x), data[i*16:i*16+17])
- for ch in d:
- res += "%02X " % ch
- for i in range(0,17-len(d)):
- res += " "
- res += "| "
- for ch in d:
- if (ch < 32) or (ch > 127):
- res += ". "
- else:
- res += "%c " % ch
- res += "\n"
- return res
-
-def printReturnMsg(qstate):
- print "Return MSG rep :: flags: %04X, QDcount: %d, Security:%d, TTL=%d" % (qstate.return_msg.rep.flags, qstate.return_msg.rep.qdcount,qstate.return_msg.rep.security, qstate.return_msg.rep.ttl)
- print " qinfo :: qname:",qstate.return_msg.qinfo.qname_list, qstate.return_msg.qinfo.qname_str, "type:",qstate.return_msg.qinfo.qtype_str, "class:",qstate.return_msg.qinfo.qclass_str
- if (qstate.return_msg.rep):
- print "RRSets:",qstate.return_msg.rep.rrset_count
- prevkey = None
- for i in range(0,qstate.return_msg.rep.rrset_count):
- r = qstate.return_msg.rep.rrsets[i]
- rk = r.rk
- print i,":",rk.dname_list, rk.dname_str, "flags: %04X" % rk.flags,
- print "type:",rk.type_str,"(%d)" % ntohs(rk.type), "class:",rk.rrset_class_str,"(%d)" % ntohs(rk.rrset_class)
-
- d = r.entry.data
- print " RRDatas:",d.count+d.rrsig_count
- for j in range(0,d.count+d.rrsig_count):
- print " ",j,":","TTL=",d.rr_ttl[j],"RR data:"
- print dataHex(d.rr_data[j]," ")
-
-
-def operate(id, event, qstate, qdata):
- log_info("pythonmod: operate called, id: %d, event:%s" % (id, strmodulevent(event)))
- #print "pythonmod: per query data", qdata
-
- print "Query:", ''.join(map(lambda x:chr(max(32,ord(x))),qstate.qinfo.qname)), qstate.qinfo.qname_list, qstate.qinfo.qname_str,
- print "Type:",qstate.qinfo.qtype_str,"(%d)" % qstate.qinfo.qtype,
- print "Class:",qstate.qinfo.qclass_str,"(%d)" % qstate.qinfo.qclass
- print
-
- if (event == MODULE_EVENT_NEW or event == MODULE_EVENT_PASS) and (qstate.qinfo.qname_str.endswith("www2.example.com.")):
- print qstate.qinfo.qname_str
-
- qstate.ext_state[id] = MODULE_FINISHED
-
- msg = DNSMessage(qstate.qinfo.qname_str, RR_TYPE_A, RR_CLASS_IN, PKT_QR | PKT_RA | PKT_AA) #, 300)
- #msg.authority.append("xxx.seznam.cz. 10 IN A 192.168.1.1")
- #msg.additional.append("yyy.seznam.cz. 10 IN A 1.1.1.2.")
-
- # answer can be returned to the client without further checking.
-
- if qstate.qinfo.qtype == RR_TYPE_A:
- msg.answer.append("%s 10 IN A 192.168.1.1" % qstate.qinfo.qname_str)
- if (qstate.qinfo.qtype == RR_TYPE_SRV) or (qstate.qinfo.qtype == RR_TYPE_ANY):
- msg.answer.append("%s 10 IN SRV 0 0 80 neinfo.example.com." % qstate.qinfo.qname_str)
- if (qstate.qinfo.qtype == RR_TYPE_TXT) or (qstate.qinfo.qtype == RR_TYPE_ANY):
- msg.answer.append("%s 10 IN TXT path=/" % qstate.qinfo.qname_str)
-
- if not msg.set_return_msg(qstate):
- qstate.ext_state[id] = MODULE_ERROR
- return True
-
- #qstate.return_msg.rep.security = 2 #pokud nebude nasledovat validator, je zapotrebi nastavit security, aby nebyl paket zahozen v mesh_send_reply
- printReturnMsg(qstate)
-
- #Authoritative result can't be stored in cache
- #if (not storeQueryInCache(qstate, qstate.return_msg.qinfo, qstate.return_msg.rep, 0)):
- # print "Can't store in cache"
- # qstate.ext_state[id] = MODULE_ERROR
- # return False
- #print "Store OK"
-
- qstate.return_rcode = RCODE_NOERROR
- return True
-
- if event == MODULE_EVENT_NEW:
- qstate.ext_state[id] = MODULE_WAIT_MODULE
- return True
-
- if event == MODULE_EVENT_MODDONE:
- log_info("pythonmod: previous module done")
- qstate.ext_state[id] = MODULE_FINISHED
- return True
-
- if event == MODULE_EVENT_PASS:
- log_info("pythonmod: event_pass")
- qstate.ext_state[id] = MODULE_WAIT_MODULE
- return True
-
- log_err("pythonmod: BAD event")
- qstate.ext_state[id] = MODULE_ERROR
- return True
-
-log_info("pythonmod: script loaded.")
diff --git a/testdata/pylib.tdir/pylib.test b/testdata/pylib.tdir/pylib.test
index 96a846403c15..9456691aa6e1 100644
--- a/testdata/pylib.tdir/pylib.test
+++ b/testdata/pylib.tdir/pylib.test
@@ -6,9 +6,9 @@
PRE="../.."
if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then
- echo "have python module"
+ echo "have pyunbound"
else
- echo "no python module"
+ echo "no pyunbound"
exit 0
fi
@@ -19,22 +19,50 @@ fi
#echo export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:../../.libs:."
#export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:../../.libs:."
-cp $PRE/libunbound/python/unbound.py .
-cp $PRE/.libs/_unbound* .
-cp $PRE/.libs/libunbound* .
-
# do the test
echo "> pylib.lookup.py www.example.com."
./pylib.lookup.py www.example.com. | tee outfile
echo "> cat logfiles"
-cat fwd.log
+cat fwd.log
echo "> check answer"
-if grep "10.20.30.40" outfile; then
- echo "OK"
+if grep "Resolve: \[.\?10.20.30.40.\?\]" outfile; then
+ :
else
- echo "Not OK"
+ echo "Not OK (resolve)"
exit 1
fi
+if grep "Async resolve: \[.\?10.20.30.40.\?\]" outfile; then
+ :
+else
+ echo "Not OK (async resolve)"
+ exit 1
+fi
+if grep "Ratelimit-fg-on: pass" outfile; then
+ :
+else
+ echo "Not OK (ratelimit-fg-on)"
+ exit 1
+fi
+if grep "Ratelimit-fg-off: \[.\?10.20.30.40.\?\]" outfile; then
+ :
+else
+ echo "Not OK (ratelimit-fg-off)"
+ exit 1
+fi
+if grep "Ratelimit-bg-on: pass" outfile; then
+ :
+else
+ echo "Not OK (ratelimit-bg-on)"
+ exit 1
+fi
+if grep "Ratelimit-bg-off: \[.\?10.20.30.40.\?\]" outfile; then
+ :
+else
+ echo "Not OK (ratelimit-bg-off)"
+ exit 1
+fi
+
+echo "OK"
exit 0
diff --git a/testdata/rrset_rettl.rpl b/testdata/rrset_rettl.rpl
index 2ae64e9476bb..55dd62386e28 100644
--- a/testdata/rrset_rettl.rpl
+++ b/testdata/rrset_rettl.rpl
@@ -1,5 +1,7 @@
; This is a comment.
; config options go here.
+server:
+ minimal-responses: no
forward-zone: name: "." forward-addr: 216.0.0.1
CONFIG_END
diff --git a/testdata/rrset_untrusted.rpl b/testdata/rrset_untrusted.rpl
index 232554872b4a..6370ebf49bf9 100644
--- a/testdata/rrset_untrusted.rpl
+++ b/testdata/rrset_untrusted.rpl
@@ -1,5 +1,7 @@
; This is a comment.
; config options go here.
+server:
+ minimal-responses: no
forward-zone: name: "." forward-addr: 216.0.0.1
CONFIG_END
diff --git a/testdata/rrset_updated.rpl b/testdata/rrset_updated.rpl
index 4e877df11472..d36ab8cc88a7 100644
--- a/testdata/rrset_updated.rpl
+++ b/testdata/rrset_updated.rpl
@@ -1,5 +1,7 @@
; This is a comment.
; config options go here.
+server:
+ minimal-responses: no
forward-zone: name: "." forward-addr: 216.0.0.1
CONFIG_END
diff --git a/testdata/subnet_cached.crpl b/testdata/subnet_cached.crpl
index 3d4fd9a961b8..a0d89af51c1e 100644
--- a/testdata/subnet_cached.crpl
+++ b/testdata/subnet_cached.crpl
@@ -12,6 +12,7 @@ server:
verbosity: 3
access-control: 127.0.0.1 allow_snoop
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/subnet_max_source.crpl b/testdata/subnet_max_source.crpl
index aae1f1af2e5d..e1c6cf5f99f7 100644
--- a/testdata/subnet_max_source.crpl
+++ b/testdata/subnet_max_source.crpl
@@ -10,6 +10,7 @@ server:
module-config: "subnetcache validator iterator"
verbosity: 3
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/subnet_val_positive.crpl b/testdata/subnet_val_positive.crpl
index ef33531d2a32..afec59933d91 100644
--- a/testdata/subnet_val_positive.crpl
+++ b/testdata/subnet_val_positive.crpl
@@ -10,6 +10,7 @@ server:
module-config: "subnetcache validator iterator"
verbosity: 3
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/subnet_val_positive_client.crpl b/testdata/subnet_val_positive_client.crpl
index dcd3a87199b2..e631a64e6a29 100644
--- a/testdata/subnet_val_positive_client.crpl
+++ b/testdata/subnet_val_positive_client.crpl
@@ -11,6 +11,7 @@ server:
module-config: "subnetcache validator iterator"
verbosity: 3
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/pylib.tdir/pylib.conf b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.conf
index 82fa27a68196..4d4f71dc5297 100644
--- a/testdata/pylib.tdir/pylib.conf
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.conf
@@ -1,19 +1,16 @@
server:
verbosity: 2
# num-threads: 1
- #port: @PORT@
+ interface: 127.0.0.1
+ port: @PORT@
use-syslog: no
- directory: ""
+ directory: .
pidfile: "unbound.pid"
chroot: ""
username: ""
do-not-query-localhost: no
- module-config: "validator iterator"
-
-#python:
- #python-script: "pylib.py"
+ tcp-connection-limit: 0.0.0.0/0 0
forward-zone:
name: "."
forward-addr: "127.0.0.1@@TOPORT@"
-
diff --git a/testdata/tcp_conn_limit.tdir/tcp_conn_limit.dsc b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.dsc
new file mode 100644
index 000000000000..2bc5196db2d8
--- /dev/null
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.dsc
@@ -0,0 +1,16 @@
+BaseName: tcp_conn_limit
+Version: 1.0
+Description: Test tcp-connection-limit setting.
+CreationDate: Fri Aug 3 17:18:00 BST 2018
+Maintainer: dr. J. Hague
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre: tcp_conn_limit.pre
+Post: tcp_conn_limit.post
+Test: tcp_conn_limit.test
+AuxFiles:
+Passed:
+Failure:
diff --git a/testdata/tcp_conn_limit.tdir/tcp_conn_limit.post b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.post
new file mode 100644
index 000000000000..1cd215e2df00
--- /dev/null
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.post
@@ -0,0 +1,10 @@
+# #-- tcp_conn_limit.post --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# source the test var file when it's there
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+#
+# do your teardown here
+. ../common.sh
+kill_pid $FWD_PID
+kill_pid $UNBOUND_PID
diff --git a/testdata/tcp_conn_limit.tdir/tcp_conn_limit.pre b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.pre
new file mode 100644
index 000000000000..f4382f000e3b
--- /dev/null
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.pre
@@ -0,0 +1,31 @@
+# #-- tcp_conn_limit.pre--#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+. ../common.sh
+get_random_port 2
+UNBOUND_PORT=$RND_PORT
+FWD_PORT=$(($RND_PORT + 1))
+echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test
+echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test
+
+# start forwarder
+get_ldns_testns
+$LDNS_TESTNS -p $FWD_PORT tcp_conn_limit.testns >fwd.log 2>&1 &
+FWD_PID=$!
+echo "FWD_PID=$FWD_PID" >> .tpkg.var.test
+
+# make config file
+sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' < tcp_conn_limit.conf > ub.conf
+# start unbound in the background
+PRE="../.."
+$PRE/unbound -d -c ub.conf >unbound.log 2>&1 &
+UNBOUND_PID=$!
+echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test
+
+cat .tpkg.var.test
+wait_ldns_testns_up fwd.log
+wait_unbound_up unbound.log
+
diff --git a/testdata/tcp_conn_limit.tdir/tcp_conn_limit.test b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.test
new file mode 100644
index 000000000000..a2e1dac889e3
--- /dev/null
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.test
@@ -0,0 +1,42 @@
+# #-- tcp_conn_limit.test --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+
+# Set unbound to limit all IPv4 addresses to 0 connections.
+# Make sure TCP connection fails.
+
+
+if uname | grep MINGW >/dev/null; then
+ echo "no job control in shell on windows. end test"
+ exit 0
+fi
+
+PRE="../.."
+. ../common.sh
+get_make
+(cd $PRE; $MAKE streamtcp)
+
+# test query should fail.
+echo "> query www.example.com."
+$PRE/streamtcp -f 127.0.0.1@$UNBOUND_PORT www.example.com. A IN >outfile 2>&1
+if test "$?" -eq 0; then
+ echo "exit status OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat fwd.log
+ cat unbound.log
+ echo "Not OK"
+ exit 1
+else
+ echo "exit status not OK"
+fi
+echo "> cat logfiles"
+cat outfile
+cat fwd.log
+cat unbound.log
+echo "OK"
+
+exit 0
diff --git a/testdata/tcp_conn_limit.tdir/tcp_conn_limit.testns b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.testns
new file mode 100644
index 000000000000..14647723fca5
--- /dev/null
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.testns
@@ -0,0 +1,42 @@
+; nameserver test file
+$ORIGIN example.com.
+$TTL 3600
+
+ENTRY_BEGIN
+MATCH UDP opcode qtype qname
+REPLY QR AA NOERROR TC
+ADJUST copy_id
+SECTION QUESTION
+www IN A
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH TCP opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id sleep=2
+SECTION QUESTION
+www IN A
+SECTION ANSWER
+www IN A 10.20.30.40
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www2 IN A
+SECTION ANSWER
+www2 IN A 10.20.30.42
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www3 IN A
+SECTION ANSWER
+www3 IN A 10.20.30.43
+ENTRY_END
+
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.conf b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.conf
new file mode 100644
index 000000000000..df769aa1d857
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.conf
@@ -0,0 +1,16 @@
+server:
+ verbosity: 2
+ # num-threads: 1
+ interface: 127.0.0.1
+ port: @PORT@
+ use-syslog: no
+ directory: .
+ pidfile: "unbound.pid"
+ chroot: ""
+ username: ""
+ do-not-query-localhost: no
+ tcp-idle-timeout: 2000
+
+forward-zone:
+ name: "."
+ forward-addr: "127.0.0.1@@TOPORT@"
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.dsc b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.dsc
new file mode 100644
index 000000000000..44edd5245d18
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.dsc
@@ -0,0 +1,16 @@
+BaseName: tcp_idle_timeout
+Version: 1.0
+Description: Test tcp-idle-timeout setting.
+CreationDate: Thu Jul 12 13:55:00 BST 2018
+Maintainer: dr. J. Hague
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre: tcp_idle_timeout.pre
+Post: tcp_idle_timeout.post
+Test: tcp_idle_timeout.test
+AuxFiles:
+Passed:
+Failure:
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.post b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.post
new file mode 100644
index 000000000000..e8513460c537
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.post
@@ -0,0 +1,10 @@
+# #-- tcp_idle_timeout.post --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# source the test var file when it's there
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+#
+# do your teardown here
+. ../common.sh
+kill_pid $FWD_PID
+kill_pid $UNBOUND_PID
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.pre b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.pre
new file mode 100644
index 000000000000..d36319de58ee
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.pre
@@ -0,0 +1,31 @@
+# #-- tcp_idle_timeout.pre--#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+. ../common.sh
+get_random_port 2
+UNBOUND_PORT=$RND_PORT
+FWD_PORT=$(($RND_PORT + 1))
+echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test
+echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test
+
+# start forwarder
+get_ldns_testns
+$LDNS_TESTNS -p $FWD_PORT tcp_idle_timeout.testns >fwd.log 2>&1 &
+FWD_PID=$!
+echo "FWD_PID=$FWD_PID" >> .tpkg.var.test
+
+# make config file
+sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' < tcp_idle_timeout.conf > ub.conf
+# start unbound in the background
+PRE="../.."
+$PRE/unbound -d -c ub.conf >unbound.log 2>&1 &
+UNBOUND_PID=$!
+echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test
+
+cat .tpkg.var.test
+wait_ldns_testns_up fwd.log
+wait_unbound_up unbound.log
+
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.test b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.test
new file mode 100644
index 000000000000..2ae8c4fa8d2e
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.test
@@ -0,0 +1,67 @@
+# #-- tcp_idle_timeout.test --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+
+# Run up unbound with a 2s idle timeout. Try a normal TCP query, check it works, and then check that a connection with a 4s send delay fails.
+
+
+if uname | grep MINGW >/dev/null; then
+ echo "no job control in shell on windows. end test"
+ exit 0
+fi
+
+PRE="../.."
+. ../common.sh
+get_make
+(cd $PRE; $MAKE streamtcp)
+
+# first test a single TCP query with no delay.
+echo "> query www.example.com."
+$PRE/streamtcp -f 127.0.0.1@$UNBOUND_PORT www.example.com. A IN >outfile 2>&1
+if test "$?" -ne 0; then
+ echo "exit status not OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat fwd.log
+ cat unbound.log
+ echo "Not OK"
+ exit 1
+else
+ echo "exit status OK"
+fi
+echo "> cat logfiles"
+cat outfile
+cat fwd.log
+cat unbound.log
+echo "> check answer"
+if grep "10.20.30.40" outfile; then
+ echo "OK"
+else
+ echo "Not OK"
+ exit 1
+fi
+
+# now test query with delay should fail.
+echo "> query www.example.com."
+$PRE/streamtcp -d 4 -f 127.0.0.1@$UNBOUND_PORT www.example.com. A IN >outfile 2>&1
+if test "$?" -eq 0; then
+ echo "exit status OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat fwd.log
+ cat unbound.log
+ echo "Not OK"
+ exit 1
+else
+ echo "exit status not OK"
+fi
+echo "> cat logfiles"
+cat outfile
+cat fwd.log
+cat unbound.log
+echo "OK"
+
+exit 0
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.testns b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.testns
new file mode 100644
index 000000000000..14647723fca5
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.testns
@@ -0,0 +1,42 @@
+; nameserver test file
+$ORIGIN example.com.
+$TTL 3600
+
+ENTRY_BEGIN
+MATCH UDP opcode qtype qname
+REPLY QR AA NOERROR TC
+ADJUST copy_id
+SECTION QUESTION
+www IN A
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH TCP opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id sleep=2
+SECTION QUESTION
+www IN A
+SECTION ANSWER
+www IN A 10.20.30.40
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www2 IN A
+SECTION ANSWER
+www2 IN A 10.20.30.42
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www3 IN A
+SECTION ANSWER
+www3 IN A 10.20.30.43
+ENTRY_END
+
diff --git a/testdata/trust_cname_chain.rpl b/testdata/trust_cname_chain.rpl
index e4d2d2a99b7b..f8415ba23ce6 100644
--- a/testdata/trust_cname_chain.rpl
+++ b/testdata/trust_cname_chain.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/ttl_max.rpl b/testdata/ttl_max.rpl
index 1faa05453d36..17eaca26c548 100644
--- a/testdata/ttl_max.rpl
+++ b/testdata/ttl_max.rpl
@@ -3,6 +3,7 @@ server:
access-control: 127.0.0.1 allow_snoop
cache-max-ttl: 10
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/ttl_min.rpl b/testdata/ttl_min.rpl
index b965fdbeab64..3c79ff5ed666 100644
--- a/testdata/ttl_min.rpl
+++ b/testdata/ttl_min.rpl
@@ -3,6 +3,7 @@ server:
access-control: 127.0.0.1 allow_snoop
cache-min-ttl: 10
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_adbit.rpl b/testdata/val_adbit.rpl
index f8f44fcff679..7ce62de77e31 100644
--- a/testdata/val_adbit.rpl
+++ b/testdata/val_adbit.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_adcopy.rpl b/testdata/val_adcopy.rpl
index beb952356fb7..604fd57f2043 100644
--- a/testdata/val_adcopy.rpl
+++ b/testdata/val_adcopy.rpl
@@ -6,6 +6,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_ds_afterprime.rpl b/testdata/val_ds_afterprime.rpl
index 50c28aae6f0b..3b1c0d614ba3 100644
--- a/testdata/val_ds_afterprime.rpl
+++ b/testdata/val_ds_afterprime.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_faildnskey_ok.rpl b/testdata/val_faildnskey_ok.rpl
index c191859b2079..d3ac00c47d15 100644
--- a/testdata/val_faildnskey_ok.rpl
+++ b/testdata/val_faildnskey_ok.rpl
@@ -7,6 +7,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_keyprefetch_verify.rpl b/testdata/val_keyprefetch_verify.rpl
index f55bd7945fe5..f2050fb7fe13 100644
--- a/testdata/val_keyprefetch_verify.rpl
+++ b/testdata/val_keyprefetch_verify.rpl
@@ -9,6 +9,7 @@ server:
prefetch: yes
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_noadwhennodo.rpl b/testdata/val_noadwhennodo.rpl
index c4b9afd75053..46e1bad5a60d 100644
--- a/testdata/val_noadwhennodo.rpl
+++ b/testdata/val_noadwhennodo.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_nsec3_b3_optout.rpl b/testdata/val_nsec3_b3_optout.rpl
index 41e2e38933f7..0b0569201e5f 100644
--- a/testdata/val_nsec3_b3_optout.rpl
+++ b/testdata/val_nsec3_b3_optout.rpl
@@ -6,6 +6,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_nsec3_b3_optout_negcache.rpl b/testdata/val_nsec3_b3_optout_negcache.rpl
index e2897e53ffa4..f8ef6f87df90 100644
--- a/testdata/val_nsec3_b3_optout_negcache.rpl
+++ b/testdata/val_nsec3_b3_optout_negcache.rpl
@@ -6,6 +6,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_positive.rpl b/testdata/val_positive.rpl
index bef91f6df650..daaf36089c09 100644
--- a/testdata/val_positive.rpl
+++ b/testdata/val_positive.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_qds_badanc.rpl b/testdata/val_qds_badanc.rpl
index 5c9f75660d7b..dc686153f406 100644
--- a/testdata/val_qds_badanc.rpl
+++ b/testdata/val_qds_badanc.rpl
@@ -6,6 +6,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_qds_oneanc.rpl b/testdata/val_qds_oneanc.rpl
index c742cfad3d8b..f21ab422b47a 100644
--- a/testdata/val_qds_oneanc.rpl
+++ b/testdata/val_qds_oneanc.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_qds_twoanc.rpl b/testdata/val_qds_twoanc.rpl
index dc66388f82d6..4e4f2e732b64 100644
--- a/testdata/val_qds_twoanc.rpl
+++ b/testdata/val_qds_twoanc.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_referd.rpl b/testdata/val_referd.rpl
index dfc82e1cfd22..d475f835eb20 100644
--- a/testdata/val_referd.rpl
+++ b/testdata/val_referd.rpl
@@ -9,6 +9,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_referglue.rpl b/testdata/val_referglue.rpl
index a9714d1c8040..dd7e7de91b25 100644
--- a/testdata/val_referglue.rpl
+++ b/testdata/val_referglue.rpl
@@ -9,6 +9,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_rrsig.rpl b/testdata/val_rrsig.rpl
index d9684e497e45..0b672e0f2cba 100644
--- a/testdata/val_rrsig.rpl
+++ b/testdata/val_rrsig.rpl
@@ -6,6 +6,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_spurious_ns.rpl b/testdata/val_spurious_ns.rpl
index 0f9d8431007a..cb0a6e529987 100644
--- a/testdata/val_spurious_ns.rpl
+++ b/testdata/val_spurious_ns.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_stub_noroot.rpl b/testdata/val_stub_noroot.rpl
index 07fb0e376e05..4235bcc5213b 100644
--- a/testdata/val_stub_noroot.rpl
+++ b/testdata/val_stub_noroot.rpl
@@ -7,6 +7,7 @@ server:
dlv-anchor: "dlv.isc.org. IN DNSKEY 257 3 5 AQPQ41chR9DEHt/aIzIFAqanbDlRflJoRs5yz1jFsoRIT7dWf0r+PeDuewdxkszNH6wnU4QL8pfKFRh5PIYVBLK3"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_ta_algo_dnskey.rpl b/testdata/val_ta_algo_dnskey.rpl
index a1f1ed5d0a22..03bac83aaa43 100644
--- a/testdata/val_ta_algo_dnskey.rpl
+++ b/testdata/val_ta_algo_dnskey.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_ta_algo_dnskey_dp.rpl b/testdata/val_ta_algo_dnskey_dp.rpl
index 1dd48bfb27e0..2b3609be8e19 100644
--- a/testdata/val_ta_algo_dnskey_dp.rpl
+++ b/testdata/val_ta_algo_dnskey_dp.rpl
@@ -9,6 +9,7 @@ server:
harden-algo-downgrade: no
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_ta_algo_missing_dp.rpl b/testdata/val_ta_algo_missing_dp.rpl
index 4709407ed050..dc55a09da44a 100644
--- a/testdata/val_ta_algo_missing_dp.rpl
+++ b/testdata/val_ta_algo_missing_dp.rpl
@@ -10,6 +10,7 @@ server:
harden-algo-downgrade: no
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_twocname.rpl b/testdata/val_twocname.rpl
index 6756787b9bfc..d8e8cf3165da 100644
--- a/testdata/val_twocname.rpl
+++ b/testdata/val_twocname.rpl
@@ -4,6 +4,7 @@ server:
val-override-date: "20091116100204"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
forward-zone:
name: "."
diff --git a/testdata/val_unalgo_anchor.rpl b/testdata/val_unalgo_anchor.rpl
index 24dcbaf92a75..fbbf288a5ff1 100644
--- a/testdata/val_unalgo_anchor.rpl
+++ b/testdata/val_unalgo_anchor.rpl
@@ -6,6 +6,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_unalgo_dlv.rpl b/testdata/val_unalgo_dlv.rpl
index e78226fc8094..142beae8d10b 100644
--- a/testdata/val_unalgo_dlv.rpl
+++ b/testdata/val_unalgo_dlv.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_wild_pos.rpl b/testdata/val_wild_pos.rpl
index 2fc3847e8065..624d8e07bf92 100644
--- a/testdata/val_wild_pos.rpl
+++ b/testdata/val_wild_pos.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/views.rpl b/testdata/views.rpl
index 5573cd83cfaf..6a9052fbe2cd 100644
--- a/testdata/views.rpl
+++ b/testdata/views.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
access-control: 10.10.10.0/24 allow
access-control-view: 10.10.10.10/32 "view1"
diff --git a/util/config_file.c b/util/config_file.c
index b06176053c60..5dffa37ebb5a 100644
--- a/util/config_file.c
+++ b/util/config_file.c
@@ -104,6 +104,9 @@ config_create(void)
cfg->udp_upstream_without_downstream = 0;
cfg->tcp_mss = 0;
cfg->outgoing_tcp_mss = 0;
+ cfg->tcp_idle_timeout = 30 * 1000; /* 30s in millisecs */
+ cfg->do_tcp_keepalive = 0;
+ cfg->tcp_keepalive_timeout = 120 * 1000; /* 120s in millisecs */
cfg->ssl_service_key = NULL;
cfg->ssl_service_pem = NULL;
cfg->ssl_port = UNBOUND_DNS_OVER_TLS_PORT;
@@ -115,6 +118,8 @@ config_create(void)
cfg->log_time_ascii = 0;
cfg->log_queries = 0;
cfg->log_replies = 0;
+ cfg->log_local_actions = 0;
+ cfg->log_servfail = 0;
#ifndef USE_WINSOCK
# ifdef USE_MINI_EVENT
/* select max 1024 sockets */
@@ -172,7 +177,7 @@ config_create(void)
cfg->if_automatic = 0;
cfg->so_rcvbuf = 0;
cfg->so_sndbuf = 0;
- cfg->so_reuseport = 0;
+ cfg->so_reuseport = 1;
cfg->ip_transparent = 0;
cfg->ip_freebind = 0;
cfg->num_ifs = 0;
@@ -192,11 +197,12 @@ config_create(void)
#endif
cfg->views = NULL;
cfg->acls = NULL;
+ cfg->tcp_connection_limits = NULL;
cfg->harden_short_bufsize = 0;
cfg->harden_large_queries = 0;
cfg->harden_glue = 1;
cfg->harden_dnssec_stripped = 1;
- cfg->harden_below_nxdomain = 0;
+ cfg->harden_below_nxdomain = 1;
cfg->harden_referral_path = 0;
cfg->harden_algo_downgrade = 0;
cfg->use_caps_bits_for_id = 0;
@@ -228,6 +234,8 @@ config_create(void)
cfg->aggressive_nsec = 0;
cfg->ignore_cd = 0;
cfg->serve_expired = 0;
+ cfg->serve_expired_ttl = 0;
+ cfg->serve_expired_ttl_reset = 0;
cfg->add_holddown = 30*24*3600;
cfg->del_holddown = 30*24*3600;
cfg->keep_missing = 366*24*3600; /* one year plus a little leeway */
@@ -248,7 +256,7 @@ config_create(void)
cfg->control_ifs.last = NULL;
cfg->control_port = UNBOUND_CONTROL_PORT;
cfg->control_use_cert = 1;
- cfg->minimal_responses = 0;
+ cfg->minimal_responses = 1;
cfg->rrset_roundrobin = 0;
cfg->max_udp_size = 4096;
if(!(cfg->server_key_file = strdup(RUN_DIR"/unbound_server.key")))
@@ -338,6 +346,7 @@ struct config_file* config_create_forlib(void)
forward nameserver running on localhost */
cfg->val_log_level = 2; /* to fill why_bogus with */
cfg->val_log_squelch = 1;
+ cfg->minimal_responses = 0;
return cfg;
}
@@ -455,6 +464,9 @@ int config_set_option(struct config_file* cfg, const char* opt,
udp_upstream_without_downstream)
else S_NUMBER_NONZERO("tcp-mss:", tcp_mss)
else S_NUMBER_NONZERO("outgoing-tcp-mss:", outgoing_tcp_mss)
+ else S_NUMBER_NONZERO("tcp-idle-timeout:", tcp_idle_timeout)
+ else S_YNO("edns-tcp-keepalive:", do_tcp_keepalive)
+ else S_NUMBER_NONZERO("edns-tcp-keepalive-timeout:", tcp_keepalive_timeout)
else S_YNO("ssl-upstream:", ssl_upstream)
else S_STR("ssl-service-key:", ssl_service_key)
else S_STR("ssl-service-pem:", ssl_service_pem)
@@ -540,10 +552,15 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_YNO("val-log-squelch:", val_log_squelch)
else S_YNO("log-queries:", log_queries)
else S_YNO("log-replies:", log_replies)
+ else S_YNO("log-local-actions:", log_local_actions)
+ else S_YNO("log-servfail:", log_servfail)
else S_YNO("val-permissive-mode:", val_permissive_mode)
else S_YNO("aggressive-nsec:", aggressive_nsec)
else S_YNO("ignore-cd-flag:", ignore_cd)
else S_YNO("serve-expired:", serve_expired)
+ else if(strcmp(opt, "serve_expired_ttl:") == 0)
+ { IS_NUMBER_OR_ZERO; cfg->serve_expired_ttl = atoi(val); SERVE_EXPIRED_TTL=(time_t)cfg->serve_expired_ttl;}
+ else S_YNO("serve-expired-ttl-reset:", serve_expired_ttl_reset)
else S_STR("val-nsec3-keysize-iterations:", val_nsec3_key_iterations)
else S_UNSIGNED_OR_ZERO("add-holddown:", add_holddown)
else S_UNSIGNED_OR_ZERO("del-holddown:", del_holddown)
@@ -878,6 +895,9 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_YNO(opt, "udp-upstream-without-downstream", udp_upstream_without_downstream)
else O_DEC(opt, "tcp-mss", tcp_mss)
else O_DEC(opt, "outgoing-tcp-mss", outgoing_tcp_mss)
+ else O_DEC(opt, "tcp-idle-timeout", tcp_idle_timeout)
+ else O_YNO(opt, "edns-tcp-keepalive", do_tcp_keepalive)
+ else O_DEC(opt, "edns-tcp-keepalive-timeout", tcp_keepalive_timeout)
else O_YNO(opt, "ssl-upstream", ssl_upstream)
else O_STR(opt, "ssl-service-key", ssl_service_key)
else O_STR(opt, "ssl-service-pem", ssl_service_pem)
@@ -893,6 +913,8 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_STR(opt, "logfile", logfile)
else O_YNO(opt, "log-queries", log_queries)
else O_YNO(opt, "log-replies", log_replies)
+ else O_YNO(opt, "log-local-actions", log_local_actions)
+ else O_YNO(opt, "log-servfail", log_servfail)
else O_STR(opt, "pidfile", pidfile)
else O_YNO(opt, "hide-identity", hide_identity)
else O_YNO(opt, "hide-version", hide_version)
@@ -920,6 +942,8 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_YNO(opt, "aggressive-nsec", aggressive_nsec)
else O_YNO(opt, "ignore-cd-flag", ignore_cd)
else O_YNO(opt, "serve-expired", serve_expired)
+ else O_DEC(opt, "serve-expired-ttl", serve_expired_ttl)
+ else O_YNO(opt, "serve-expired-ttl-reset", serve_expired_ttl_reset)
else O_STR(opt, "val-nsec3-keysize-iterations",val_nsec3_key_iterations)
else O_UNS(opt, "add-holddown", add_holddown)
else O_UNS(opt, "del-holddown", del_holddown)
@@ -936,6 +960,7 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_STR(opt, "control-cert-file", control_cert_file)
else O_LST(opt, "root-hints", root_hints)
else O_LS2(opt, "access-control", acls)
+ else O_LS2(opt, "tcp-connection-limit", tcp_connection_limits)
else O_LST(opt, "do-not-query-address", donotqueryaddrs)
else O_LST(opt, "private-address", private_address)
else O_LST(opt, "private-domain", private_domain)
@@ -1338,6 +1363,7 @@ config_delete(struct config_file* cfg)
free(cfg->dlv_anchor_file);
config_delstrlist(cfg->dlv_anchor_list);
config_deldblstrlist(cfg->acls);
+ config_deldblstrlist(cfg->tcp_connection_limits);
free(cfg->val_nsec3_key_iterations);
config_deldblstrlist(cfg->local_zones);
config_delstrlist(cfg->local_zones_nodefault);
@@ -1355,6 +1381,7 @@ config_delete(struct config_file* cfg)
free(cfg->control_key_file);
free(cfg->control_cert_file);
free(cfg->dns64_prefix);
+ config_delstrlist(cfg->dns64_ignore_aaaa);
free(cfg->dnstap_socket_path);
free(cfg->dnstap_identity);
free(cfg->dnstap_version);
@@ -1840,6 +1867,7 @@ config_apply(struct config_file* config)
{
MAX_TTL = (time_t)config->max_ttl;
MIN_TTL = (time_t)config->min_ttl;
+ SERVE_EXPIRED_TTL = (time_t)config->serve_expired_ttl;
MAX_NEG_TTL = (time_t)config->max_negative_ttl;
RTT_MIN_TIMEOUT = config->infra_cache_min_rtt;
EDNS_ADVERTISED_SIZE = (uint16_t)config->edns_buffer_size;
@@ -2178,7 +2206,7 @@ void w_config_adjust_directory(struct config_file* cfg)
void errinf(struct module_qstate* qstate, const char* str)
{
struct config_strlist* p;
- if(qstate->env->cfg->val_log_level < 2 || !str)
+ if((qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail) || !str)
return;
p = (struct config_strlist*)regional_alloc(qstate->region, sizeof(*p));
if(!p) {
@@ -2203,7 +2231,7 @@ void errinf(struct module_qstate* qstate, const char* str)
void errinf_origin(struct module_qstate* qstate, struct sock_list *origin)
{
struct sock_list* p;
- if(qstate->env->cfg->val_log_level < 2)
+ if(qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail)
return;
for(p=origin; p; p=p->next) {
char buf[256];
@@ -2220,7 +2248,7 @@ void errinf_origin(struct module_qstate* qstate, struct sock_list *origin)
}
}
-char* errinf_to_str(struct module_qstate* qstate)
+char* errinf_to_str_bogus(struct module_qstate* qstate)
{
char buf[20480];
char* p = buf;
@@ -2245,12 +2273,37 @@ char* errinf_to_str(struct module_qstate* qstate)
return p;
}
+char* errinf_to_str_servfail(struct module_qstate* qstate)
+{
+ char buf[20480];
+ char* p = buf;
+ size_t left = sizeof(buf);
+ struct config_strlist* s;
+ char dname[LDNS_MAX_DOMAINLEN+1];
+ char t[16], c[16];
+ sldns_wire2str_type_buf(qstate->qinfo.qtype, t, sizeof(t));
+ sldns_wire2str_class_buf(qstate->qinfo.qclass, c, sizeof(c));
+ dname_str(qstate->qinfo.qname, dname);
+ snprintf(p, left, "SERVFAIL <%s %s %s>:", dname, t, c);
+ left -= strlen(p); p += strlen(p);
+ if(!qstate->errinf)
+ snprintf(p, left, " misc failure");
+ else for(s=qstate->errinf; s; s=s->next) {
+ snprintf(p, left, " %s", s->str);
+ left -= strlen(p); p += strlen(p);
+ }
+ p = strdup(buf);
+ if(!p)
+ log_err("malloc failure in errinf_to_str");
+ return p;
+}
+
void errinf_rrset(struct module_qstate* qstate, struct ub_packed_rrset_key *rr)
{
char buf[1024];
char dname[LDNS_MAX_DOMAINLEN+1];
char t[16], c[16];
- if(qstate->env->cfg->val_log_level < 2 || !rr)
+ if((qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail) || !rr)
return;
sldns_wire2str_type_buf(ntohs(rr->rk.type), t, sizeof(t));
sldns_wire2str_class_buf(ntohs(rr->rk.rrset_class), c, sizeof(c));
@@ -2263,7 +2316,7 @@ void errinf_dname(struct module_qstate* qstate, const char* str, uint8_t* dname)
{
char b[1024];
char buf[LDNS_MAX_DOMAINLEN+1];
- if(qstate->env->cfg->val_log_level < 2 || !str || !dname)
+ if((qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail) || !str || !dname)
return;
dname_str(dname, buf);
snprintf(b, sizeof(b), "%s %s", str, buf);
diff --git a/util/config_file.h b/util/config_file.h
index 4206eb9a2a51..d1bce1b69be4 100644
--- a/util/config_file.h
+++ b/util/config_file.h
@@ -99,6 +99,12 @@ struct config_file {
int tcp_mss;
/** maximum segment size of tcp socket for outgoing queries */
int outgoing_tcp_mss;
+ /** tcp idle timeout, in msec */
+ int tcp_idle_timeout;
+ /** do edns tcp keepalive */
+ int do_tcp_keepalive;
+ /** tcp keepalive timeout, in msec */
+ int tcp_keepalive_timeout;
/** private key file for dnstcp-ssl service (enabled if not NULL) */
char* ssl_service_key;
@@ -214,6 +220,9 @@ struct config_file {
/** use default localhost donotqueryaddr entries */
int donotquery_localhost;
+ /** list of tcp connection limitss, linked list */
+ struct config_str2list* tcp_connection_limits;
+
/** harden against very small edns buffer sizes */
int harden_short_bufsize;
/** harden against very large query sizes */
@@ -268,6 +277,10 @@ struct config_file {
int log_queries;
/** log replies with one line per reply */
int log_replies;
+ /** log every local-zone hit **/
+ int log_local_actions;
+ /** log servfails with a reason */
+ int log_servfail;
/** log identity to report */
char* log_identity;
@@ -326,6 +339,10 @@ struct config_file {
int ignore_cd;
/** serve expired entries and prefetch them */
int serve_expired;
+ /** serve expired entries until TTL after expiration */
+ int serve_expired_ttl;
+ /** reset serve expired TTL after failed update attempt */
+ int serve_expired_ttl_reset;
/** nsec3 maximum iterations per key size, string */
char* val_nsec3_key_iterations;
/** autotrust add holddown time, in seconds */
@@ -419,6 +436,8 @@ struct config_file {
/* Synthetize all AAAA record despite the presence of an authoritative one */
int dns64_synthall;
+ /** ignore AAAAs for these domain names and use A record anyway */
+ struct config_strlist* dns64_ignore_aaaa;
/** true to enable dnstap support */
int dnstap;
@@ -561,6 +580,8 @@ struct config_stub {
int isfirst;
/** use SSL for queries to this stub */
int ssl_upstream;
+ /*** no cache */
+ int no_cache;
};
/**
@@ -1065,12 +1086,20 @@ void errinf_dname(struct module_qstate* qstate, const char* str,
uint8_t* dname);
/**
- * Create error info in string
+ * Create error info in string. For validation failures.
+ * @param qstate: query state.
+ * @return string or NULL on malloc failure (already logged).
+ * This string is malloced and has to be freed by caller.
+ */
+char* errinf_to_str_bogus(struct module_qstate* qstate);
+
+/**
+ * Create error info in string. For other servfails.
* @param qstate: query state.
* @return string or NULL on malloc failure (already logged).
* This string is malloced and has to be freed by caller.
*/
-char* errinf_to_str(struct module_qstate* qstate);
+char* errinf_to_str_servfail(struct module_qstate* qstate);
/**
* Used during options parsing
diff --git a/util/configlexer.c b/util/configlexer.c
index f6a453899977..7f388eaec38e 100644
--- a/util/configlexer.c
+++ b/util/configlexer.c
@@ -363,8 +363,8 @@ static void yynoreturn yy_fatal_error (yyconst char* msg );
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 267
-#define YY_END_OF_BUFFER 268
+#define YY_NUM_RULES 278
+#define YY_END_OF_BUFFER 279
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -372,298 +372,310 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[2632] =
+static yyconst flex_int16_t yy_accept[2750] =
{ 0,
- 1, 1, 249, 249, 253, 253, 257, 257, 261, 261,
- 1, 1, 268, 265, 1, 247, 247, 266, 2, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 266, 249, 250, 250, 251, 266, 253, 254, 254,
- 255, 266, 260, 257, 258, 258, 259, 266, 261, 262,
- 262, 263, 266, 264, 248, 2, 252, 264, 266, 265,
- 0, 1, 2, 2, 2, 2, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 249,
- 0, 253, 0, 260, 0, 257, 261, 0, 264, 0,
- 2, 2, 264, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 264, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 104, 265, 265, 265, 265, 265, 265, 265, 264, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 88, 265, 265, 265, 265,
- 265, 265, 8, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 109, 265, 264, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 264, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 48, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 193,
- 265, 14, 15, 265, 18, 17, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 103, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 179, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 3, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 264, 265, 265, 265, 265, 265, 265, 265,
- 241, 265, 265, 240, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 256, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 51, 265, 217, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 52,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 168, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 20, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 124, 265, 265, 256, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 223, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 143, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 123, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 86, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 28, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 29, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 49, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 102, 265, 265, 265, 265, 265, 101, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 50, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 144, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 39, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 208, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 43,
- 265, 44, 265, 265, 265, 265, 89, 265, 90, 265,
-
- 265, 265, 87, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 7, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 186, 265, 265, 265, 265, 126,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 40, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 160,
- 265, 159, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 16, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 53, 265, 265, 265,
- 265, 265, 265, 265, 265, 167, 265, 265, 265, 265,
- 265, 92, 91, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 154, 265,
- 265, 265, 265, 265, 265, 265, 265, 110, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 71, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 75, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 47, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 157, 158, 265, 218, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 6, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 221,
- 265, 265, 265, 242, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 37,
- 265, 265, 265, 265, 265, 265, 265, 265, 150, 265,
- 265, 265, 105, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 172, 265, 151, 265, 265, 184, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 38, 265, 265, 265, 265,
- 265, 265, 107, 96, 265, 97, 265, 265, 95, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 121, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 207,
- 265, 265, 265, 265, 265, 265, 265, 265, 152, 265,
- 265, 265, 265, 265, 155, 265, 265, 265, 183, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 85, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 45, 265, 265, 265, 22, 265,
- 265, 265, 265, 265, 19, 265, 265, 265, 265, 23,
- 32, 265, 131, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 60, 62, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 225, 265, 265, 265, 194,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 98, 265, 265, 265, 265,
- 265, 265, 265, 265, 120, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 236, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 125, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 178,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 245, 265,
- 265, 265, 265, 265, 265, 265, 265, 142, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 137,
- 265, 145, 265, 265, 265, 265, 265, 113, 265, 265,
- 265, 265, 265, 81, 265, 265, 265, 265, 170, 265,
- 265, 265, 265, 265, 185, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 199, 265, 265,
- 265, 265, 265, 265, 106, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 141, 265, 265, 265, 265, 265,
-
- 63, 64, 265, 265, 265, 265, 265, 46, 265, 265,
- 265, 265, 265, 70, 146, 265, 161, 265, 187, 156,
- 219, 265, 265, 265, 56, 265, 148, 265, 265, 265,
- 265, 265, 9, 265, 265, 265, 84, 265, 265, 265,
- 265, 212, 265, 265, 265, 169, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 140, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 127, 224, 265, 265, 265,
-
- 265, 198, 265, 265, 265, 265, 265, 265, 265, 265,
- 180, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 239, 265, 147, 265,
- 265, 265, 55, 57, 265, 265, 265, 265, 265, 265,
- 265, 83, 265, 265, 265, 265, 210, 265, 265, 265,
- 220, 265, 265, 265, 265, 265, 265, 174, 30, 24,
- 26, 265, 265, 265, 265, 265, 265, 31, 25, 27,
- 265, 265, 265, 265, 265, 265, 80, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 176, 173, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 54,
- 265, 108, 265, 265, 265, 265, 265, 265, 265, 265,
- 122, 13, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 234, 265, 237, 265, 265, 265, 265, 265, 265,
- 12, 265, 265, 21, 265, 265, 265, 216, 265, 265,
- 265, 222, 265, 58, 265, 182, 265, 175, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 136, 135, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 177, 171, 265, 265, 265,
-
- 226, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 65, 265, 265, 265, 211, 265, 265,
- 265, 265, 265, 181, 265, 265, 265, 265, 265, 265,
- 265, 265, 243, 244, 133, 59, 265, 265, 265, 93,
- 94, 265, 265, 128, 265, 130, 265, 162, 265, 265,
- 265, 134, 265, 265, 188, 265, 265, 265, 265, 265,
- 265, 265, 115, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 195, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 163,
-
- 265, 265, 209, 265, 238, 265, 265, 265, 41, 265,
- 265, 265, 265, 4, 265, 265, 114, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 191,
- 33, 34, 265, 265, 265, 265, 265, 265, 265, 227,
- 265, 265, 265, 265, 265, 265, 197, 265, 265, 166,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 68,
- 265, 42, 215, 265, 192, 265, 265, 11, 265, 265,
- 265, 265, 265, 265, 164, 72, 36, 265, 265, 265,
- 265, 265, 265, 139, 265, 265, 265, 265, 265, 117,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 196,
-
- 111, 265, 99, 100, 265, 265, 265, 74, 78, 73,
- 265, 66, 265, 265, 265, 10, 265, 265, 265, 213,
- 265, 35, 265, 265, 265, 138, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 79, 77, 265, 67, 235, 265, 265,
- 265, 153, 265, 265, 165, 265, 265, 265, 265, 265,
- 265, 129, 61, 265, 265, 265, 265, 265, 228, 265,
- 265, 265, 265, 265, 265, 265, 112, 76, 118, 119,
- 69, 265, 214, 132, 265, 265, 265, 265, 190, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 82, 265, 189, 265, 206, 232, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 5, 265, 265, 265, 233,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 116, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 149, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 229, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 246,
-
- 265, 265, 202, 265, 265, 265, 265, 265, 230, 265,
- 265, 265, 265, 265, 265, 231, 265, 265, 265, 200,
- 265, 203, 204, 265, 265, 265, 265, 265, 201, 205,
- 0
+ 1, 1, 260, 260, 264, 264, 268, 268, 272, 272,
+ 1, 1, 279, 276, 1, 258, 258, 277, 2, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 277, 260, 261, 261, 262, 277, 264, 265, 265,
+ 266, 277, 271, 268, 269, 269, 270, 277, 272, 273,
+ 273, 274, 277, 275, 259, 2, 263, 275, 277, 276,
+ 0, 1, 2, 2, 2, 2, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 260,
+ 0, 264, 0, 271, 0, 268, 272, 0, 275, 0,
+ 2, 2, 275, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 275, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 109, 276, 276, 276, 276, 276, 276, 276, 275, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 91, 276, 276,
+ 276, 276, 276, 276, 8, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 114, 276, 275,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 275, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 51, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 203, 276, 14, 15, 276, 18, 17, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 108, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 188, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 3, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 275,
+ 276, 276, 276, 276, 276, 276, 276, 251, 276, 276,
+ 250, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 267, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 54, 276, 227, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 55, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 177, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 20, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 129, 276, 276, 267,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 233, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 150, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 128, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 89, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 31, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 32, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 52, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 107, 276, 276, 276, 276, 276,
+
+ 106, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 53, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 151, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 42, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 218, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 46, 276, 47, 276,
+ 276, 276, 276, 92, 276, 93, 276, 276, 276, 276,
+ 90, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 7, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 196, 276, 276, 276, 276, 131,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 43, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 169, 276, 168, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 16, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 56, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 176, 276, 276, 276, 276, 276, 95, 276, 94, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 161, 276, 276, 276,
+ 276, 276, 276, 276, 276, 115, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 74, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 78, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 50, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 164, 165, 276, 276,
+ 228, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 6, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 231, 276, 276, 276, 252, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 40, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 157, 276, 276, 276, 110, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 181,
+ 276, 158, 276, 276, 276, 193, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 41, 276, 276, 276, 276, 276, 276, 276,
+ 112, 100, 276, 101, 276, 276, 276, 99, 276, 276,
+ 276, 276, 276, 276, 276, 276, 126, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 217, 276,
+ 276, 276, 276, 276, 276, 276, 276, 159, 276, 276,
+ 276, 276, 276, 162, 276, 167, 276, 276, 276, 192,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 88, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 48, 276, 276, 276, 25,
+ 276, 276, 276, 276, 276, 276, 276, 276, 19, 276,
+ 276, 276, 276, 26, 35, 276, 136, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 63, 65, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 235, 276, 276, 276, 204, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 102, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 125, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 246, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 130, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 187, 276, 276,
+ 276, 276, 276, 276, 276, 276, 255, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 147, 276, 276, 276,
+ 276, 276, 276, 276, 96, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 142, 276, 152, 276, 276, 276, 276, 276, 118,
+ 276, 276, 276, 276, 276, 84, 276, 276, 276, 276,
+ 179, 276, 276, 276, 276, 276, 276, 194, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 209, 276, 276, 276, 276, 276, 276, 276, 111, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 146,
+ 276, 276, 276, 276, 276, 66, 67, 276, 276, 276,
+ 276, 276, 49, 276, 276, 276, 276, 276, 73, 153,
+ 276, 170, 276, 197, 276, 163, 229, 276, 276, 276,
+
+ 59, 276, 155, 276, 276, 276, 276, 276, 9, 276,
+ 276, 276, 87, 276, 276, 276, 276, 222, 276, 276,
+ 276, 178, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 145, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 132, 276, 234, 276, 276, 276,
+ 276, 208, 276, 276, 276, 276, 276, 276, 276, 276,
+ 189, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 249, 276,
+ 154, 276, 276, 276, 276, 58, 60, 276, 276, 276,
+ 276, 276, 276, 276, 86, 276, 276, 276, 276, 220,
+ 276, 276, 276, 230, 276, 276, 276, 276, 276, 276,
+ 276, 183, 33, 27, 29, 276, 276, 276, 276, 276,
+ 276, 276, 276, 34, 28, 30, 276, 276, 276, 276,
+ 276, 276, 83, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 185, 182, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 57, 276, 276, 113,
+ 103, 276, 276, 276, 276, 276, 276, 276, 276, 127,
+ 13, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 244, 276, 247, 276, 276, 276, 276, 276, 276, 276,
+ 12, 276, 276, 21, 276, 276, 276, 226, 276, 276,
+ 276, 232, 276, 61, 276, 191, 276, 276, 184, 276,
+ 276, 276, 276, 276, 276, 22, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 141, 140, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 186, 180,
+ 276, 195, 276, 276, 236, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 68, 276,
+ 276, 276, 221, 276, 276, 276, 276, 166, 276, 190,
+ 276, 276, 276, 276, 276, 276, 276, 276, 253, 254,
+ 138, 62, 276, 276, 148, 276, 276, 97, 98, 276,
+ 276, 276, 133, 276, 135, 276, 171, 276, 276, 276,
+ 139, 276, 276, 198, 276, 276, 276, 276, 276, 276,
+ 276, 120, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 205, 276, 276, 276, 23, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 172, 276, 276, 219, 276, 248, 276, 276, 276, 44,
+ 276, 276, 276, 276, 4, 276, 276, 119, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 201, 36, 37, 276, 276, 276, 276, 276,
+ 276, 276, 237, 276, 276, 276, 276, 276, 276, 207,
+ 276, 276, 276, 175, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 71, 276, 45, 225, 276, 202, 276,
+ 276, 11, 276, 276, 276, 276, 276, 276, 276, 173,
+ 75, 276, 39, 276, 276, 276, 276, 276, 276, 144,
+ 276, 276, 276, 276, 276, 122, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 206, 116, 276, 276, 104,
+ 105, 276, 276, 276, 77, 81, 76, 276, 69, 276,
+ 276, 276, 10, 276, 276, 276, 223, 276, 276, 257,
+ 38, 276, 276, 276, 143, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 82, 80, 276, 70, 245, 276, 276,
+ 276, 160, 276, 276, 276, 174, 276, 276, 276, 276,
+ 276, 276, 134, 64, 276, 276, 276, 276, 276, 238,
+ 276, 276, 276, 276, 276, 276, 276, 117, 276, 79,
+ 123, 124, 72, 276, 224, 276, 137, 276, 276, 276,
+
+ 276, 200, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 149, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 85, 276, 199, 276,
+ 216, 242, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 5, 276, 276, 276, 243, 276, 276, 276,
+ 276, 276, 276, 276, 276, 24, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 121,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 156,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 239,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 256, 276, 276,
+ 212, 276, 276, 276, 276, 276, 240, 276, 276, 276,
+ 276, 276, 276, 241, 276, 276, 276, 210, 276, 213,
+ 214, 276, 276, 276, 276, 276, 211, 215, 0
} ;
static yyconst YY_CHAR yy_ec[256] =
@@ -709,15 +721,15 @@ static yyconst YY_CHAR yy_meta[67] =
1, 1, 1, 1, 1, 1
} ;
-static yyconst flex_uint16_t yy_base[2646] =
+static yyconst flex_uint16_t yy_base[2764] =
{ 0,
0, 0, 64, 67, 70, 72, 78, 84, 89, 92,
- 131, 137, 352, 307, 96, 7504, 7504, 7504, 109, 171,
+ 131, 137, 352, 307, 96, 7896, 7896, 7896, 109, 171,
85, 142, 215, 83, 117, 152, 207, 50, 110, 75,
167, 231, 112, 275, 121, 259, 323, 243, 291, 320,
- 170, 368, 289, 7504, 7504, 7504, 104, 288, 7504, 7504,
- 7504, 147, 286, 289, 7504, 7504, 7504, 305, 239, 7504,
- 7504, 7504, 160, 210, 7504, 372, 7504, 177, 382, 201,
+ 170, 368, 289, 7896, 7896, 7896, 104, 288, 7896, 7896,
+ 7896, 147, 286, 289, 7896, 7896, 7896, 305, 239, 7896,
+ 7896, 7896, 160, 210, 7896, 372, 7896, 177, 382, 201,
386, 115, 0, 390, 0, 0, 160, 162, 199, 204,
188, 169, 303, 222, 256, 248, 377, 369, 254, 226,
313, 271, 365, 382, 296, 327, 391, 392, 384, 420,
@@ -741,565 +753,591 @@ static yyconst flex_uint16_t yy_base[2646] =
873, 893, 892, 899, 903, 909, 173, 900, 920, 922,
895, 916, 930, 935, 915, 898, 926, 946, 932, 948,
953, 950, 951, 936, 947, 943, 958, 967, 973, 966,
- 982, 970, 989, 981, 998, 975, 977, 1002, 994, 1018,
- 1003, 992, 1015, 1019, 1021, 1029, 1048, 712, 1028, 1049,
-
- 1037, 1044, 1061, 1057, 1054, 1071, 1058, 1055, 1062, 1064,
- 1075, 1077, 1099, 1085, 1098, 1111, 1102, 1104, 1113, 1094,
- 1125, 1124, 1122, 1132, 1126, 1174, 1134, 1135, 1142, 1151,
- 7504, 1169, 1153, 1223, 1143, 1173, 1191, 1181, 1184, 1194,
- 1192, 1218, 1209, 1203, 1097, 1196, 1162, 1252, 1183, 1221,
- 1224, 1231, 1254, 1234, 1236, 1240, 1245, 1261, 1279, 1253,
- 1266, 1265, 1291, 1274, 1269, 1283, 1281, 1296, 1273, 1309,
- 1302, 1292, 1300, 1293, 1310, 1322, 1305, 1330, 1329, 1336,
- 1320, 1325, 1347, 1350, 1334, 1348, 1358, 1351, 1360, 1357,
- 1366, 1355, 1372, 1362, 1374, 1381, 1384, 1378, 1382, 1392,
-
- 1403, 1387, 1397, 1391, 1415, 7504, 1419, 1401, 1405, 1417,
- 1418, 1409, 7504, 1432, 1431, 1427, 1440, 1428, 1461, 1455,
- 1443, 1458, 1467, 1453, 1468, 1479, 1449, 1476, 1464, 1462,
- 1488, 1494, 1487, 1496, 1489, 1485, 1532, 1498, 1490, 1514,
- 1516, 1517, 1512, 1529, 1519, 1528, 1568, 1526, 1547, 1556,
- 1565, 1545, 1579, 1567, 1559, 1569, 1562, 1577, 1583, 1578,
- 1593, 1575, 1595, 7504, 1604, 1614, 1480, 1607, 1606, 1597,
- 1609, 1610, 1611, 1626, 1622, 1640, 1624, 1627, 1649, 1643,
- 1652, 1646, 1657, 1648, 1656, 1662, 1675, 1650, 1686, 1682,
- 1671, 1672, 1669, 1674, 1678, 1673, 1676, 1699, 1687, 1700,
-
- 1707, 1688, 1693, 1713, 1721, 1715, 1705, 1720, 1709, 1733,
- 1736, 1716, 1746, 1735, 1744, 1737, 1756, 1760, 1752, 1759,
- 1764, 1742, 1767, 1773, 1779, 1785, 1780, 1762, 1793, 1783,
- 1680, 1786, 1789, 1797, 1813, 1808, 1812, 1816, 1822, 1810,
- 1804, 1826, 1824, 1838, 1831, 1839, 1852, 1835, 1837, 1840,
- 1843, 1849, 1854, 1864, 1870, 1862, 1866, 1867, 1885, 1881,
- 1876, 1890, 1879, 1900, 1886, 1889, 1893, 1891, 1894, 1918,
- 1915, 1908, 1912, 1913, 1921, 1928, 1931, 1917, 1927, 1948,
- 1929, 1935, 1949, 1942, 1950, 1965, 1968, 1959, 1960, 1976,
- 1969, 1963, 1970, 1977, 1995, 1994, 1997, 2008, 1988, 2007,
-
- 1980, 2003, 2009, 2011, 2015, 2016, 2021, 2012, 2022, 2036,
- 2040, 2034, 2032, 2056, 2037, 2053, 7504, 2041, 2061, 2046,
- 2067, 2058, 2059, 2074, 2064, 2078, 2075, 2083, 2126, 7504,
- 2080, 7504, 7504, 2089, 7504, 7504, 2081, 2107, 2105, 2114,
- 2119, 2101, 2110, 2123, 2084, 2175, 2139, 2133, 2141, 2136,
- 2122, 2129, 2157, 2168, 2158, 2188, 2178, 2171, 2185, 2195,
- 2180, 2199, 2204, 2203, 2206, 2205, 2210, 2212, 2214, 2216,
- 2217, 2231, 2242, 2251, 7504, 2243, 2172, 2252, 2246, 2247,
- 2254, 2256, 2239, 2255, 2258, 2240, 2268, 2263, 2269, 2276,
- 2274, 7504, 2279, 2285, 2292, 2289, 2299, 2295, 2291, 2282,
-
- 2309, 2296, 2312, 2308, 2306, 2337, 7504, 2326, 2314, 2322,
- 2341, 2324, 2327, 2332, 2334, 2342, 2351, 2359, 2353, 2357,
- 2368, 2354, 2369, 2378, 2379, 2382, 2374, 2390, 2380, 2391,
- 2375, 2393, 2396, 2402, 2415, 2405, 2419, 2404, 2403, 2421,
- 2423, 2418, 2435, 2442, 2431, 2426, 2438, 2452, 2437, 2454,
- 2449, 2465, 2456, 2458, 2455, 2471, 2453, 2468, 2469, 2484,
- 7504, 2463, 2477, 7504, 2485, 2486, 2532, 2492, 2502, 2494,
- 2497, 2513, 2512, 2518, 2511, 2531, 2528, 2547, 2545, 2552,
- 2556, 2549, 2544, 2559, 2483, 2571, 2577, 1152, 2586, 2566,
- 2564, 2613, 2583, 2584, 2588, 2591, 2596, 2615, 2599, 2611,
-
- 2608, 2609, 2617, 2641, 7504, 2604, 2634, 2624, 2636, 2655,
- 2648, 2638, 2647, 2658, 2646, 2663, 2660, 2652, 2672, 2661,
- 2664, 2666, 2683, 2688, 2700, 7504, 2685, 7504, 2689, 2687,
- 2684, 2694, 2712, 2713, 2715, 2698, 2721, 2705, 2710, 7504,
- 2719, 2731, 2737, 2740, 2739, 2732, 2733, 2742, 2746, 2759,
- 2736, 2762, 2768, 2754, 2767, 2769, 2760, 2779, 2780, 2765,
- 7504, 2787, 2781, 2794, 2795, 2791, 2796, 2792, 2806, 2798,
- 2807, 2808, 2802, 2818, 2822, 2825, 2833, 7504, 2813, 2819,
- 2846, 2844, 2841, 2829, 2845, 2851, 2852, 2843, 2855, 2856,
- 2864, 2865, 2857, 2869, 2866, 2872, 2875, 1093, 2877, 2888,
-
- 2879, 2876, 7504, 2881, 2905, 61, 2896, 2894, 2899, 2912,
- 2907, 2918, 2913, 2924, 2925, 2926, 2927, 2930, 2928, 2932,
- 2936, 2934, 2945, 2940, 2950, 2951, 2948, 2952, 2953, 2975,
- 2962, 2980, 7504, 2983, 2990, 2979, 2973, 2998, 2997, 3007,
- 3000, 3010, 3013, 3011, 7504, 3004, 3014, 3024, 3028, 3031,
- 3027, 3032, 3034, 3037, 3050, 3041, 3040, 3051, 3045, 3055,
- 3063, 3068, 3061, 3064, 3076, 7504, 2993, 3072, 3079, 3074,
- 3093, 3077, 3107, 3090, 3091, 3102, 3118, 3142, 3113, 3121,
- 3127, 3132, 3136, 3122, 3139, 3157, 3163, 3167, 3153, 3166,
- 3171, 3169, 3168, 3129, 3140, 3174, 3177, 3205, 3184, 1434,
-
- 3204, 7504, 3203, 3201, 3191, 3208, 3227, 3202, 3228, 3212,
- 3211, 3218, 3230, 3232, 3242, 3253, 3247, 3254, 3244, 3241,
- 3260, 3270, 3257, 3273, 3275, 7504, 3276, 3281, 3282, 3278,
- 3271, 3294, 3290, 3289, 3293, 3296, 3292, 3302, 3306, 3309,
- 7504, 3321, 3320, 3322, 3318, 3330, 3338, 3331, 3328, 3334,
- 3337, 3347, 7504, 3336, 3355, 3351, 3371, 3359, 3350, 3361,
- 3375, 3364, 7504, 3365, 3353, 3386, 3394, 3373, 7504, 3395,
- 3387, 3377, 3381, 3391, 3392, 3408, 3396, 3390, 3411, 3420,
- 3426, 3404, 3428, 7504, 3421, 3444, 3432, 3422, 3431, 3435,
- 3446, 3458, 3449, 3455, 3470, 3471, 3468, 3462, 3457, 3474,
-
- 3482, 3476, 3480, 7504, 3472, 3493, 3503, 3501, 3497, 3498,
- 3506, 3507, 3502, 3508, 3521, 3520, 3532, 3533, 3541, 3531,
- 3542, 3553, 3547, 3550, 3534, 3552, 3485, 3570, 3571, 3574,
- 7504, 3585, 3582, 3578, 3573, 3576, 3577, 3581, 3593, 3596,
- 3598, 3602, 3597, 3603, 3631, 3632, 3608, 3617, 3618, 3620,
- 3621, 3624, 3645, 3626, 3627, 3644, 3661, 3638, 3643, 3648,
- 3655, 3664, 3659, 3666, 3675, 3682, 3671, 3660, 3687, 3686,
- 3684, 3691, 3693, 3719, 7504, 3699, 3701, 3695, 3707, 3729,
- 3727, 3730, 3733, 3736, 3724, 3731, 3741, 3746, 3739, 7504,
- 3751, 7504, 3726, 3750, 3771, 3775, 7504, 3779, 7504, 3780,
-
- 3765, 3767, 7504, 3782, 3786, 3774, 3763, 3788, 3790, 3777,
- 3804, 3778, 3796, 3807, 3820, 3811, 3800, 3824, 3809, 3831,
- 3813, 3822, 3837, 3823, 3834, 7504, 3843, 3827, 3830, 3854,
- 3849, 3840, 3876, 3870, 3858, 3859, 3871, 3882, 3864, 3881,
- 3888, 3894, 3892, 3899, 7504, 3902, 3895, 3898, 3907, 7504,
- 3872, 3923, 3926, 3904, 3910, 3915, 3929, 3934, 3921, 3938,
- 3946, 3941, 3942, 3954, 3961, 3945, 3968, 3951, 3974, 3976,
- 3962, 3969, 3965, 3980, 3985, 3989, 3991, 3995, 3992, 3988,
- 4001, 4008, 4009, 4002, 3997, 4003, 4007, 4025, 4019, 4024,
- 4018, 4022, 4033, 4029, 4034, 7504, 4040, 4045, 4049, 4056,
-
- 4044, 4048, 4050, 4060, 4064, 4070, 4061, 4081, 4080, 7504,
- 4079, 7504, 4077, 4098, 4103, 4106, 4110, 4100, 4092, 4117,
- 4108, 4105, 4112, 4133, 4107, 4120, 4128, 4126, 4135, 4132,
- 4138, 4140, 4149, 7504, 4139, 4136, 4167, 4155, 4165, 4173,
- 4169, 4177, 4172, 4166, 4185, 4207, 7504, 4192, 4213, 4191,
- 4210, 4220, 4216, 4225, 4217, 7504, 4202, 4212, 4229, 4214,
- 4242, 7504, 7504, 4219, 4236, 4249, 4246, 4244, 4247, 4233,
- 4253, 4215, 4250, 4248, 4270, 4237, 4263, 4269, 7504, 4281,
- 4271, 4285, 4294, 4295, 4296, 4293, 4280, 7504, 4277, 4305,
- 4290, 4312, 4306, 4311, 4317, 4308, 4322, 4328, 4318, 4321,
-
- 4348, 4335, 4332, 4351, 4346, 4353, 4354, 7504, 4355, 4361,
- 4363, 4359, 4364, 4362, 4349, 4372, 4377, 4382, 4374, 4376,
- 4390, 4392, 4403, 4396, 4393, 4399, 4410, 4416, 4404, 4409,
- 4419, 4422, 4432, 4415, 4438, 4427, 4444, 4429, 4436, 4448,
- 4449, 4463, 4458, 7504, 4467, 4446, 4472, 4443, 4466, 4478,
- 4480, 4477, 4497, 4459, 4492, 4487, 4493, 7504, 4502, 4501,
- 4496, 4506, 4503, 4494, 4522, 4507, 4505, 4535, 4520, 4540,
- 4528, 4529, 4549, 4552, 7504, 7504, 4554, 7504, 4555, 4538,
- 4557, 4545, 4562, 4561, 4566, 4573, 4568, 4582, 7504, 4575,
- 4576, 4579, 4578, 4588, 4609, 4608, 4605, 4602, 4593, 4595,
-
- 4604, 4615, 4606, 4601, 4622, 4635, 4619, 4629, 4643, 7504,
- 4628, 4633, 4638, 7504, 4640, 4630, 4658, 4660, 4668, 4672,
- 4662, 4677, 4661, 4667, 4686, 4687, 4688, 4684, 4691, 4689,
- 4701, 4697, 4698, 4726, 4715, 4727, 4703, 4711, 4732, 7504,
- 4719, 4733, 4724, 4716, 4740, 4725, 4745, 4743, 7504, 4749,
- 4738, 4764, 7504, 4759, 4765, 4748, 4771, 4753, 4750, 4772,
- 4774, 4775, 4776, 7504, 4782, 7504, 4780, 4792, 7504, 4799,
- 4801, 4789, 4790, 4788, 4815, 4817, 4818, 4803, 4816, 4809,
- 4810, 4828, 4830, 4838, 4834, 7504, 4852, 4833, 4849, 4854,
- 4855, 4856, 7504, 7504, 4839, 7504, 4857, 4861, 7504, 4859,
-
- 4875, 4876, 4870, 4871, 4866, 4892, 4897, 7504, 4899, 4888,
- 4909, 4898, 4890, 4900, 4901, 4917, 4894, 4903, 4935, 7504,
- 4922, 4919, 4923, 4925, 4928, 4950, 4946, 4937, 7504, 4955,
- 4959, 4945, 4962, 4958, 7504, 4970, 4964, 4969, 7504, 4981,
- 4966, 4973, 4978, 5000, 4996, 5004, 4989, 4991, 5017, 5008,
- 5006, 5012, 7504, 5005, 5016, 5014, 5036, 5027, 5025, 5022,
- 5043, 5051, 5050, 5055, 5044, 5059, 5061, 5064, 5067, 5063,
- 5047, 5081, 5075, 5085, 7504, 5086, 5091, 5094, 7504, 5088,
- 5087, 5092, 5102, 5089, 7504, 5115, 5118, 5104, 5112, 7504,
- 7504, 5116, 7504, 5132, 5123, 5125, 5126, 5139, 5133, 5147,
-
- 5141, 5136, 5154, 5159, 5157, 5176, 5166, 5174, 5169, 5171,
- 5160, 7504, 7504, 5177, 5187, 5181, 5189, 5191, 5182, 5193,
- 5200, 5205, 5212, 5217, 5228, 7504, 5220, 5206, 5221, 7504,
- 5209, 5230, 5218, 5216, 5237, 5232, 5238, 5246, 5252, 5245,
- 5258, 5240, 5251, 5269, 5271, 7504, 5257, 5261, 5259, 5265,
- 5272, 5273, 5283, 5281, 7504, 5290, 5304, 5303, 5298, 5299,
- 5301, 5318, 5312, 5315, 5308, 5307, 5326, 5339, 5336, 5332,
- 7504, 5338, 5329, 5335, 5340, 5344, 5357, 5341, 5358, 5354,
- 5361, 5369, 5373, 5363, 5364, 7504, 5375, 5374, 5367, 5389,
- 5379, 5387, 5392, 5402, 5398, 5390, 5396, 5407, 5405, 7504,
-
- 5388, 5404, 5406, 5424, 5412, 5422, 5425, 5429, 7504, 5437,
- 5423, 5435, 5432, 5431, 5459, 5438, 5461, 7504, 5454, 5467,
- 5470, 5451, 5464, 5458, 5478, 5484, 5487, 5480, 5485, 5491,
- 5473, 5488, 5499, 5500, 5504, 5511, 5503, 5526, 5525, 7504,
- 5512, 7504, 5515, 5533, 5538, 5536, 5521, 7504, 5530, 5539,
- 5549, 5535, 5558, 7504, 5542, 5559, 5556, 5562, 7504, 5576,
- 5573, 5560, 5572, 5588, 7504, 5590, 5589, 5586, 5598, 5600,
- 5596, 5583, 5603, 5602, 5594, 5593, 5621, 7504, 5605, 5623,
- 5628, 5629, 5613, 5638, 7504, 5617, 5625, 5632, 5639, 5627,
- 5652, 5656, 5661, 5644, 7504, 5659, 5653, 5668, 5669, 5674,
-
- 7504, 7504, 5664, 5680, 5679, 5666, 5686, 7504, 5693, 5673,
- 5698, 5690, 5702, 7504, 7504, 5699, 7504, 5694, 7504, 7504,
- 7504, 5713, 5717, 5715, 7504, 5716, 7504, 5703, 5726, 5707,
- 5706, 5730, 7504, 5729, 5719, 5732, 7504, 5738, 5741, 5733,
- 5737, 7504, 5761, 5744, 5749, 7504, 5765, 5769, 5768, 5772,
- 5778, 5756, 5771, 5776, 5782, 5784, 5786, 5787, 5779, 5783,
- 5788, 5816, 5807, 5804, 5802, 5821, 5822, 5811, 5818, 5812,
- 5806, 5827, 5810, 5835, 5831, 5815, 5836, 5842, 5837, 5846,
- 5864, 5857, 5859, 5862, 7504, 5852, 5849, 5858, 5869, 5876,
- 5873, 5875, 5894, 5895, 5905, 7504, 7504, 5908, 5892, 5900,
-
- 5893, 7504, 5896, 5897, 5891, 5914, 5917, 5925, 5928, 5929,
- 7504, 5931, 5938, 5948, 5932, 5933, 5942, 5939, 5944, 5952,
- 5964, 5963, 5967, 5968, 5969, 5965, 5971, 5966, 5979, 5981,
- 5994, 5995, 5997, 5988, 6002, 6003, 7504, 5998, 7504, 5996,
- 6013, 6015, 7504, 7504, 6016, 6032, 6018, 6022, 6020, 6019,
- 6044, 7504, 6024, 6046, 6052, 6040, 7504, 6049, 6054, 6055,
- 7504, 6045, 6056, 6051, 6058, 6063, 6086, 7504, 7504, 7504,
- 7504, 6087, 6067, 6078, 6079, 6084, 6083, 7504, 7504, 7504,
- 6094, 6090, 6095, 6101, 6105, 6115, 7504, 6114, 6103, 6107,
- 6118, 6137, 6138, 6136, 6135, 6126, 6128, 6152, 6149, 6147,
-
- 6142, 6153, 6159, 6161, 7504, 7504, 6155, 6163, 6177, 6173,
- 6182, 6188, 6185, 6186, 6183, 6179, 6190, 6196, 6195, 7504,
- 6199, 7504, 6203, 6206, 6209, 6218, 6215, 6223, 6219, 6228,
- 7504, 7504, 6221, 6229, 6225, 6239, 6234, 6248, 6245, 6241,
- 6243, 7504, 6250, 7504, 6254, 6259, 6278, 6269, 6271, 6277,
- 7504, 6276, 6270, 7504, 6284, 6280, 6287, 7504, 6290, 6293,
- 6295, 7504, 6299, 7504, 6300, 7504, 6296, 7504, 6304, 6307,
- 6313, 6319, 6322, 6310, 6330, 6331, 6333, 6321, 6338, 6323,
- 6339, 6344, 6342, 6343, 7504, 7504, 6361, 6349, 6355, 6357,
- 6356, 6359, 6354, 6360, 6367, 7504, 7504, 6368, 6370, 6382,
-
- 7504, 6365, 6393, 6397, 6398, 6383, 6391, 6394, 6407, 6400,
- 6405, 6410, 6421, 6425, 6430, 6432, 6420, 6434, 6423, 6418,
- 6442, 6435, 6445, 7504, 6454, 6461, 6449, 7504, 6468, 6466,
- 6474, 6470, 6471, 7504, 6459, 6479, 6481, 6478, 6469, 6515,
- 6476, 6490, 7504, 7504, 7504, 7504, 6509, 6504, 6506, 7504,
- 7504, 6494, 6500, 7504, 6510, 7504, 6502, 7504, 6525, 6527,
- 6526, 7504, 6529, 6537, 7504, 6524, 6532, 6539, 6549, 6540,
- 6544, 6543, 7504, 6574, 6567, 6568, 6577, 6561, 6557, 6575,
- 6564, 6586, 6571, 6583, 7504, 6570, 6588, 6592, 6595, 6598,
- 6610, 6609, 6601, 6593, 6613, 6619, 6600, 6629, 6615, 7504,
-
- 6631, 6632, 7504, 6622, 7504, 6633, 6636, 6642, 7504, 6650,
- 6635, 6641, 6638, 7504, 6653, 6658, 7504, 6644, 6667, 6673,
- 6676, 6669, 6663, 6670, 6674, 6682, 6687, 6685, 6691, 7504,
- 7504, 7504, 6694, 6684, 6680, 6698, 6705, 6722, 6709, 7504,
- 6715, 6718, 6707, 6729, 6721, 6728, 7504, 6730, 6724, 7504,
- 6737, 6740, 6736, 6732, 6747, 6744, 6758, 6760, 6756, 7504,
- 6762, 7504, 7504, 6750, 7504, 6753, 6771, 7504, 6776, 6764,
- 6766, 6773, 6781, 6779, 7504, 7504, 7504, 6790, 6780, 6797,
- 6787, 6801, 6799, 7504, 6792, 6796, 6805, 6803, 6814, 7504,
- 6817, 6808, 6809, 6813, 6828, 6818, 6831, 6830, 6845, 7504,
-
- 7504, 6839, 7504, 7504, 6838, 6853, 6858, 7504, 7504, 7504,
- 6863, 7504, 6864, 6869, 6866, 7504, 6871, 6856, 6865, 7504,
- 6881, 7504, 6875, 6880, 6872, 7504, 6876, 6886, 6899, 6888,
- 6904, 6890, 6907, 6911, 6924, 6915, 6891, 6910, 6908, 6928,
- 6931, 6921, 6930, 7504, 7504, 6941, 7504, 7504, 6944, 6945,
- 6946, 7504, 6950, 6949, 7504, 6953, 6939, 6952, 6960, 6947,
- 6965, 7504, 7504, 6951, 6967, 6956, 6974, 6966, 7504, 6987,
- 7000, 6971, 6994, 6986, 6988, 6991, 7504, 7504, 7504, 7504,
- 7504, 7001, 7504, 7504, 6993, 7015, 6983, 7008, 7504, 7002,
- 7012, 7031, 7035, 7026, 7039, 7011, 7028, 7027, 7032, 7044,
-
- 7046, 7050, 7051, 7056, 7067, 7057, 7059, 7079, 7080, 7062,
- 7071, 7082, 7088, 7090, 7074, 7087, 7105, 7096, 7104, 7092,
- 7504, 7098, 7504, 7103, 7504, 7504, 7116, 7123, 7119, 7109,
- 7138, 7139, 7130, 7122, 7126, 7504, 7132, 7133, 7137, 7504,
- 7136, 7153, 7142, 7154, 7157, 7159, 7168, 7171, 7164, 7174,
- 7175, 7172, 7192, 7188, 7185, 7191, 7201, 7194, 7197, 7202,
- 7208, 7504, 7210, 7203, 7204, 7217, 7220, 7215, 7224, 7219,
- 7225, 7504, 7227, 7246, 7240, 7229, 7238, 7237, 7259, 7256,
- 7249, 7504, 7242, 7270, 7272, 7273, 7277, 7275, 7283, 7284,
- 7279, 7287, 7294, 7281, 7286, 7302, 7297, 7307, 7306, 7504,
-
- 7315, 7308, 7504, 7317, 7321, 7313, 7318, 7330, 7504, 7328,
- 7319, 7341, 7346, 7350, 7344, 7504, 7356, 7361, 7355, 7504,
- 7358, 7504, 7504, 7364, 7348, 7353, 7366, 7370, 7504, 7504,
- 7504, 7412, 7419, 7426, 7433, 7440, 83, 7447, 7454, 7461,
- 7468, 7475, 7482, 7489, 7496
+ 982, 970, 989, 981, 998, 975, 977, 1002, 994, 1025,
+ 1003, 1004, 1014, 1032, 1011, 1028, 1054, 712, 1020, 1046,
+
+ 1033, 1049, 1059, 1027, 1060, 1073, 1062, 1083, 1067, 1072,
+ 1076, 1082, 1087, 1078, 1102, 1113, 1106, 1115, 1114, 1108,
+ 1129, 1103, 1133, 1131, 1152, 1200, 1137, 1141, 1139, 1153,
+ 7896, 1166, 1156, 1249, 1163, 1177, 1207, 1110, 1187, 1172,
+ 1183, 1197, 1190, 1220, 1205, 1202, 1212, 1250, 1217, 1235,
+ 1239, 1242, 1266, 1245, 1243, 1253, 1262, 1269, 1280, 1272,
+ 1278, 1298, 1310, 1284, 1286, 1290, 1300, 1316, 1308, 1315,
+ 1321, 1305, 1324, 1326, 1338, 1346, 1345, 1351, 1353, 1349,
+ 1333, 1343, 1363, 1370, 1372, 1367, 1361, 1373, 1393, 1379,
+ 1401, 1380, 1399, 1390, 1388, 1406, 1407, 1413, 1311, 1396,
+
+ 1400, 1419, 1417, 1423, 1430, 1420, 1436, 7896, 1451, 1432,
+ 1434, 1445, 1440, 1443, 7896, 1456, 1446, 1457, 1461, 1468,
+ 1470, 1480, 1472, 1481, 1495, 1482, 1488, 1499, 1496, 1500,
+ 1484, 1493, 1520, 1516, 1513, 1525, 1515, 1519, 1565, 1529,
+ 1535, 1532, 1526, 1551, 1556, 1563, 1555, 1569, 1559, 1580,
+ 1604, 1587, 1602, 1590, 1612, 1594, 1614, 1607, 1608, 1611,
+ 1542, 1601, 1628, 1616, 1629, 1630, 1638, 7896, 1642, 1650,
+ 1632, 1646, 1647, 1649, 1652, 1655, 1665, 1657, 1667, 1684,
+ 1679, 1663, 1669, 1688, 1672, 1689, 1695, 1676, 1697, 1705,
+ 1714, 1693, 1717, 1713, 1704, 1719, 1710, 1721, 1734, 1743,
+
+ 1718, 1744, 1737, 1732, 1741, 1752, 1731, 1746, 1758, 1748,
+ 1759, 1766, 1767, 1760, 1761, 1778, 1777, 1794, 1782, 1795,
+ 1785, 1793, 1808, 1787, 1804, 1820, 1807, 1814, 1822, 1827,
+ 1833, 1834, 1829, 1824, 1825, 1850, 1837, 1858, 1853, 1851,
+ 1856, 1875, 1865, 1870, 1876, 1869, 1863, 1872, 1892, 1883,
+ 1896, 1890, 1899, 1912, 1898, 1901, 1902, 1910, 1897, 1900,
+ 1913, 1929, 1935, 1930, 1928, 1951, 1943, 1925, 1952, 1934,
+ 1956, 1945, 1946, 1948, 1949, 1962, 1961, 1975, 1971, 1972,
+ 1976, 1977, 1985, 1990, 1940, 1992, 1988, 1989, 1991, 2003,
+ 2002, 2004, 2018, 2019, 2012, 2024, 2037, 2021, 2017, 2045,
+
+ 2027, 2039, 2029, 2052, 2055, 2054, 2057, 2066, 2056, 2068,
+ 2064, 2076, 2069, 2080, 2089, 2096, 2093, 2095, 2101, 2091,
+ 2098, 2087, 2104, 2129, 2113, 2118, 7896, 2115, 2116, 2121,
+ 2128, 2135, 2126, 2151, 2142, 2145, 2131, 2139, 2140, 2187,
+ 7896, 2148, 7896, 7896, 2153, 7896, 7896, 2174, 2167, 2168,
+ 2177, 2185, 2188, 2191, 2193, 2178, 2190, 2236, 2217, 2203,
+ 2214, 2220, 2239, 2231, 2246, 2234, 2241, 2249, 2247, 2257,
+ 2266, 2276, 2273, 2267, 2284, 2269, 2272, 2282, 2294, 2277,
+ 2283, 2300, 2296, 2308, 2280, 2321, 2306, 2330, 7896, 2327,
+ 2313, 2336, 2331, 2333, 2329, 2335, 2324, 2340, 2348, 2319,
+
+ 2344, 2341, 2365, 2354, 2357, 7896, 2369, 2370, 2375, 2374,
+ 2382, 2381, 2377, 2362, 2389, 2384, 2396, 2410, 2371, 2417,
+ 7896, 2422, 2394, 2404, 2427, 2408, 2413, 2414, 2416, 2430,
+ 2436, 2435, 2440, 2449, 2453, 2455, 2457, 2451, 2459, 2465,
+ 2460, 2476, 2475, 2463, 2479, 2484, 2485, 2467, 2487, 2498,
+ 2495, 2518, 2497, 2523, 2515, 2501, 2521, 2494, 2508, 2526,
+ 2528, 2534, 2512, 2525, 2545, 2531, 2543, 2544, 2554, 2549,
+ 2548, 2565, 2566, 2552, 2553, 2572, 2564, 7896, 2558, 2570,
+ 7896, 2568, 2581, 2627, 2586, 2594, 2591, 2592, 2608, 2607,
+ 2610, 2615, 2614, 2631, 2626, 2619, 2637, 2651, 2655, 2647,
+
+ 2641, 2657, 2663, 2650, 2677, 2673, 993, 2681, 2667, 2674,
+ 2719, 2668, 2694, 2683, 2679, 2684, 2704, 2695, 2688, 2713,
+ 2715, 2714, 2724, 7896, 2710, 2740, 2729, 2722, 2749, 2752,
+ 2731, 2744, 2754, 2758, 2769, 2759, 2764, 2773, 2762, 2779,
+ 2767, 2776, 2789, 2790, 2786, 2802, 7896, 2791, 7896, 2794,
+ 2785, 2805, 2809, 2806, 2817, 2825, 2818, 2836, 2833, 2826,
+ 7896, 2831, 2846, 2855, 2840, 2828, 2841, 2844, 2852, 2857,
+ 2853, 2858, 2880, 2873, 2860, 2885, 2886, 2877, 2889, 2892,
+ 2883, 7896, 2896, 2882, 2900, 2901, 2911, 2905, 2908, 2912,
+ 2913, 2917, 2910, 2940, 2921, 2950, 2951, 2942, 2944, 2954,
+
+ 2955, 7896, 2938, 2946, 2957, 2960, 2953, 2961, 2965, 2969,
+ 2964, 2967, 2978, 3002, 3003, 2986, 2995, 3004, 2988, 2994,
+ 2997, 1124, 2992, 3005, 2999, 2998, 7896, 3019, 3016, 61,
+ 3006, 3024, 3028, 3037, 3035, 3048, 3029, 3057, 3058, 3054,
+ 3061, 3055, 3056, 3064, 3067, 3053, 3073, 3082, 3081, 3074,
+ 3077, 3084, 3085, 3087, 3100, 3090, 3126, 7896, 3120, 3117,
+ 3125, 3114, 3133, 3116, 3129, 3119, 3135, 3152, 3139, 3149,
+ 7896, 3164, 3165, 3151, 3169, 3176, 3166, 3158, 3167, 3185,
+ 3178, 3172, 3179, 3196, 3191, 3194, 3193, 3213, 3201, 3202,
+ 3205, 3217, 7896, 3112, 3220, 3228, 3221, 3240, 3212, 3259,
+
+ 3231, 3242, 3244, 3261, 3285, 3247, 3255, 3238, 3269, 3268,
+ 3283, 3280, 3274, 3297, 3310, 3312, 3300, 3289, 3306, 3317,
+ 3314, 3316, 3319, 3323, 3321, 3341, 3364, 3358, 1768, 3336,
+ 7896, 3348, 3339, 3338, 3360, 3362, 3349, 3365, 3363, 3379,
+ 3374, 3375, 3387, 3385, 3398, 3396, 3404, 3390, 3391, 3414,
+ 3424, 3412, 3428, 3430, 7896, 3426, 3431, 3415, 3433, 3418,
+ 3444, 3446, 3443, 3441, 3445, 3449, 3457, 3461, 3458, 3474,
+ 3460, 3465, 7896, 3480, 3476, 3485, 3487, 3492, 3493, 3499,
+ 3484, 3503, 3506, 3505, 7896, 3455, 3504, 3510, 3521, 3514,
+ 3516, 3517, 3534, 3519, 7896, 3527, 3526, 3543, 3556, 3546,
+
+ 7896, 3561, 3544, 3540, 3545, 3551, 3541, 3562, 3555, 3568,
+ 3576, 3572, 3569, 3574, 3595, 7896, 3579, 3610, 3589, 3599,
+ 3601, 3603, 3596, 3614, 3634, 3616, 3619, 3585, 3627, 3636,
+ 3621, 3623, 3635, 3646, 3637, 3652, 3645, 7896, 3654, 3659,
+ 3669, 3667, 3672, 3656, 3586, 3673, 3674, 3689, 3691, 3692,
+ 3686, 3682, 3681, 3716, 3704, 3701, 3723, 3696, 3719, 3708,
+ 3731, 3732, 3744, 3739, 3741, 7896, 3726, 3743, 3745, 3737,
+ 3746, 3750, 3768, 3756, 3758, 3753, 3771, 3772, 3770, 3796,
+ 3806, 3773, 3803, 3788, 3790, 3785, 3791, 3799, 3811, 3784,
+ 3798, 3795, 3821, 3813, 3816, 3820, 3823, 3825, 3818, 3828,
+
+ 3838, 3856, 3855, 3848, 3861, 3859, 3863, 3865, 3868, 3866,
+ 3894, 7896, 3876, 3874, 3882, 3883, 3870, 3893, 3906, 3903,
+ 3908, 3895, 3901, 3897, 3923, 3914, 7896, 3918, 7896, 3910,
+ 3927, 3942, 3952, 7896, 3948, 7896, 3946, 3951, 3937, 3939,
+ 7896, 3954, 3940, 3947, 3961, 3950, 3964, 3963, 3970, 3975,
+ 3979, 3974, 3995, 3986, 3998, 3989, 4005, 4006, 3987, 4008,
+ 3997, 4017, 4011, 4020, 4013, 7896, 4029, 4023, 4034, 4032,
+ 4035, 4033, 4042, 4059, 4045, 4047, 4044, 4068, 4057, 4061,
+ 4076, 4062, 4078, 4087, 7896, 4069, 4093, 4080, 4091, 7896,
+ 4096, 4082, 4110, 4112, 4088, 4103, 4104, 4114, 4115, 4120,
+
+ 4107, 4146, 4140, 4131, 4141, 4148, 4130, 4142, 4156, 4157,
+ 4159, 4165, 4169, 4158, 4143, 4175, 4170, 4178, 4183, 4200,
+ 4198, 4204, 4184, 4201, 4209, 4208, 4196, 4192, 4195, 4202,
+ 4210, 4220, 4225, 4223, 4226, 4228, 4230, 4233, 7896, 4245,
+ 4229, 4253, 4260, 4247, 4250, 4239, 4251, 4259, 4252, 4275,
+ 4288, 4276, 7896, 4278, 7896, 4274, 4280, 4284, 4304, 4294,
+ 4305, 4312, 4301, 4303, 4311, 4302, 4325, 4317, 4328, 4333,
+ 4351, 4323, 4327, 4335, 4338, 4339, 4341, 4346, 7896, 4345,
+ 4359, 4375, 4355, 4372, 4374, 4390, 4380, 4369, 4367, 4382,
+ 4395, 7896, 4396, 4398, 4393, 4412, 4418, 4416, 4429, 4420,
+
+ 7896, 4408, 4417, 4434, 4423, 4437, 7896, 4422, 7896, 4414,
+ 4432, 4444, 4445, 4449, 4453, 4455, 4456, 4447, 4464, 4448,
+ 4467, 4465, 4473, 4492, 4472, 4480, 7896, 4490, 4481, 4499,
+ 4497, 4500, 4504, 4507, 4483, 7896, 4508, 4514, 4518, 4526,
+ 4520, 4521, 4528, 4533, 4532, 4534, 4530, 4531, 4525, 4550,
+ 4536, 4564, 4556, 4565, 4572, 7896, 4569, 4566, 4584, 4580,
+ 4573, 4586, 4579, 4567, 4576, 4590, 4592, 4599, 4596, 4606,
+ 4601, 4615, 4612, 4602, 4609, 4627, 4635, 4617, 4631, 4625,
+ 4626, 4653, 4639, 4656, 4657, 4643, 4659, 4668, 4651, 4654,
+ 4660, 4667, 4679, 4661, 7896, 4681, 4674, 4684, 4678, 4682,
+
+ 4689, 4696, 4698, 4701, 4680, 4690, 4709, 4702, 7896, 4726,
+ 4704, 4730, 4723, 4724, 4738, 4735, 4728, 4725, 4743, 4737,
+ 4753, 4740, 4747, 4755, 4758, 4752, 7896, 7896, 4768, 4767,
+ 7896, 4775, 4765, 4777, 4773, 4771, 4780, 4782, 4790, 4793,
+ 4785, 7896, 4805, 4798, 4794, 4799, 4802, 4827, 4823, 4825,
+ 4815, 4811, 4817, 4822, 4837, 4821, 4829, 4842, 4832, 4833,
+ 4847, 4861, 7896, 4848, 4852, 4857, 7896, 4858, 4869, 4870,
+ 4874, 4878, 4882, 4891, 4887, 4885, 4897, 4888, 4896, 4899,
+ 4895, 4910, 4912, 4894, 4926, 4924, 4920, 4930, 4932, 4940,
+ 4946, 4947, 4922, 4933, 4955, 7896, 4944, 4957, 4950, 4939,
+
+ 4970, 4954, 4973, 4966, 7896, 4967, 4968, 4975, 7896, 4982,
+ 4989, 4969, 4986, 4972, 5003, 4995, 4999, 5002, 5006, 7896,
+ 5005, 7896, 5017, 5009, 5022, 7896, 5012, 5013, 5029, 5011,
+ 5018, 5036, 5038, 5046, 5033, 5048, 5037, 5039, 5063, 5054,
+ 5074, 5062, 7896, 5071, 5060, 5068, 5087, 5070, 5080, 5089,
+ 7896, 7896, 5091, 7896, 5090, 5084, 5096, 7896, 5094, 5099,
+ 5101, 5105, 5107, 5123, 5124, 5129, 7896, 5126, 5111, 5140,
+ 5121, 5134, 5132, 5135, 5142, 5119, 5148, 5159, 7896, 5146,
+ 5158, 5176, 5161, 5157, 5180, 5182, 5169, 7896, 5186, 5192,
+ 5181, 5190, 5193, 7896, 5202, 7896, 5203, 5213, 5221, 7896,
+
+ 5201, 5224, 5205, 5228, 5232, 5230, 5236, 5219, 5227, 5248,
+ 5239, 5240, 5257, 7896, 5250, 5256, 5245, 5272, 5261, 5258,
+ 5254, 5274, 5280, 5286, 5287, 5277, 5290, 5292, 5299, 5303,
+ 5296, 5301, 5332, 5324, 5319, 7896, 5325, 5329, 5335, 7896,
+ 5323, 5318, 5341, 5326, 5330, 5327, 5352, 5354, 7896, 5360,
+ 5361, 5350, 5371, 7896, 7896, 5378, 7896, 5368, 5362, 5365,
+ 5377, 5381, 5383, 5382, 5386, 5387, 5411, 5389, 5407, 5427,
+ 5424, 5428, 5422, 5418, 5410, 7896, 7896, 5431, 5435, 5432,
+ 5439, 5442, 5444, 5446, 5433, 5460, 5447, 5440, 5467, 5449,
+ 7896, 5474, 5459, 5476, 7896, 5457, 5484, 5458, 5475, 5488,
+
+ 5477, 5494, 5496, 5508, 5498, 5492, 5500, 5502, 5509, 5525,
+ 5518, 7896, 5523, 5515, 5519, 5520, 5524, 5535, 5539, 5532,
+ 5542, 7896, 5541, 5549, 5561, 5559, 5553, 5565, 5573, 5577,
+ 5579, 5569, 5576, 5581, 5586, 5585, 5588, 7896, 5592, 5587,
+ 5590, 5606, 5602, 5621, 5604, 5626, 5609, 5628, 5615, 5632,
+ 5635, 5624, 5620, 7896, 5636, 5640, 5625, 5643, 5631, 5650,
+ 5657, 5645, 5664, 5655, 5654, 5659, 5675, 7896, 5665, 5666,
+ 5679, 5676, 5690, 5681, 5682, 5683, 7896, 5695, 5684, 5692,
+ 5701, 5687, 5717, 5711, 5721, 5709, 7896, 5722, 5725, 5727,
+ 5708, 5724, 5741, 5738, 7896, 5748, 5750, 5731, 5505, 5742,
+
+ 5744, 5761, 5747, 5754, 5769, 5770, 5774, 5775, 5771, 5781,
+ 5782, 7896, 5780, 7896, 5794, 5790, 5792, 5813, 5804, 7896,
+ 5807, 5809, 5815, 5801, 5811, 7896, 5817, 5819, 5818, 5827,
+ 7896, 5834, 5843, 5838, 5845, 5832, 5854, 7896, 5863, 5864,
+ 5866, 5873, 5874, 5876, 5865, 5877, 5868, 5869, 5870, 5885,
+ 7896, 5884, 5896, 5887, 5897, 5900, 5898, 5904, 7896, 5912,
+ 5901, 5910, 5905, 5916, 5913, 5929, 5927, 5932, 5923, 7896,
+ 5926, 5944, 5956, 5947, 5950, 7896, 7896, 5948, 5957, 5960,
+ 5940, 5969, 7896, 5968, 5978, 5974, 5964, 5971, 7896, 7896,
+ 5981, 7896, 5976, 7896, 5988, 7896, 7896, 5987, 5995, 6004,
+
+ 7896, 6006, 7896, 5983, 6008, 5996, 5989, 6013, 7896, 5998,
+ 6014, 6020, 7896, 6015, 6033, 6016, 6022, 7896, 6030, 6027,
+ 6032, 7896, 6047, 6052, 6051, 6053, 6060, 6041, 6049, 6045,
+ 6061, 6067, 6069, 6070, 6071, 6072, 6068, 6080, 6090, 6088,
+ 6089, 6082, 6087, 6104, 6105, 6106, 6098, 6112, 6108, 6114,
+ 6116, 6118, 6122, 6115, 6126, 6130, 6127, 6131, 6142, 6135,
+ 6151, 6144, 6149, 7896, 6148, 6146, 6147, 6169, 6167, 6175,
+ 6179, 6185, 6188, 6189, 7896, 6191, 7896, 6197, 6182, 6193,
+ 6186, 7896, 6183, 6196, 6199, 6202, 6219, 6213, 6216, 6235,
+ 7896, 6237, 6217, 6229, 6242, 6245, 6232, 6240, 6244, 6253,
+
+ 6252, 6255, 6259, 6257, 6247, 6254, 6117, 6265, 6272, 6269,
+ 6284, 6271, 6274, 6285, 6302, 6293, 6303, 6306, 7896, 6300,
+ 7896, 6298, 6309, 6315, 6318, 7896, 7896, 6320, 6321, 6322,
+ 6311, 6323, 6339, 6348, 7896, 6329, 6350, 6343, 6345, 7896,
+ 6349, 6353, 6357, 7896, 6347, 6360, 6363, 6361, 6378, 6377,
+ 6365, 7896, 7896, 7896, 7896, 6390, 6371, 6381, 6384, 6386,
+ 6392, 6399, 6387, 7896, 7896, 7896, 6398, 6409, 6407, 6419,
+ 6413, 6425, 7896, 6416, 6410, 6430, 6426, 6438, 6444, 6440,
+ 6443, 6437, 6445, 6450, 6446, 6460, 6454, 6471, 6456, 6466,
+ 7896, 7896, 6467, 6479, 6481, 6491, 6487, 6490, 6494, 6493,
+
+ 6496, 6500, 6489, 6502, 6507, 6503, 7896, 6508, 6522, 7896,
+ 7896, 6521, 6527, 6520, 6528, 6524, 6534, 6544, 6537, 7896,
+ 7896, 6531, 6536, 6547, 6557, 6548, 6553, 6554, 6576, 6559,
+ 7896, 6564, 7896, 6565, 6583, 6582, 6593, 6590, 6589, 6594,
+ 7896, 6586, 6588, 7896, 6596, 6584, 6592, 7896, 6603, 6602,
+ 6608, 7896, 6618, 7896, 6632, 7896, 6613, 6641, 7896, 6617,
+ 6638, 6642, 6643, 6644, 6635, 7896, 6628, 6649, 6650, 6652,
+ 6657, 6653, 6636, 6668, 6661, 6658, 6663, 7896, 7896, 6691,
+ 6660, 6669, 6673, 6686, 6702, 6676, 6694, 6704, 7896, 7896,
+ 6700, 7896, 6699, 6703, 7896, 6687, 6708, 6719, 6717, 6697,
+
+ 6720, 6727, 6723, 6724, 6744, 6753, 6738, 6754, 6758, 6760,
+ 6765, 6729, 6764, 6756, 6747, 6768, 6770, 6774, 7896, 6762,
+ 6772, 6780, 7896, 6778, 6799, 6808, 6804, 7896, 6801, 7896,
+ 6793, 6812, 6814, 6807, 6800, 6819, 6817, 6813, 7896, 7896,
+ 7896, 7896, 6823, 6829, 7896, 6839, 6840, 7896, 7896, 6826,
+ 6845, 6835, 7896, 6846, 7896, 6838, 7896, 6856, 6862, 6860,
+ 7896, 6865, 6867, 7896, 6864, 6876, 6877, 6875, 6873, 6880,
+ 6896, 7896, 6885, 6900, 6903, 6906, 6891, 6889, 6912, 6895,
+ 6919, 6904, 6915, 7896, 6922, 6923, 6925, 7896, 6921, 6930,
+ 6934, 6949, 6942, 6939, 6935, 6950, 6959, 6957, 6960, 6944,
+
+ 7896, 6967, 6973, 7896, 6968, 7896, 6975, 6972, 6974, 7896,
+ 6992, 6976, 6970, 6985, 7896, 6997, 6991, 7896, 7002, 6986,
+ 7009, 7011, 6994, 7026, 7013, 7010, 7020, 7015, 7023, 7017,
+ 7025, 7032, 7896, 7896, 7896, 7034, 7031, 7053, 7056, 7059,
+ 7068, 7047, 7896, 7064, 7066, 7048, 7073, 7070, 7076, 7896,
+ 7077, 7063, 7072, 7896, 7079, 7084, 7080, 7091, 7096, 7102,
+ 7110, 7113, 7111, 7896, 7117, 7896, 7896, 7100, 7896, 7098,
+ 7121, 7896, 7124, 7112, 7114, 7127, 7130, 7123, 7128, 7896,
+ 7896, 7131, 7896, 7135, 7138, 7150, 7148, 7159, 7161, 7896,
+ 7144, 7147, 7163, 7158, 7172, 7896, 7165, 7157, 7160, 7162,
+
+ 7183, 7186, 7194, 7177, 7191, 7896, 7896, 7188, 7193, 7896,
+ 7896, 7214, 7216, 7213, 7896, 7896, 7896, 7219, 7896, 7222,
+ 7228, 7220, 7896, 7230, 7218, 7223, 7896, 7226, 7232, 7896,
+ 7896, 7227, 7238, 7233, 7896, 7244, 7243, 7255, 7266, 7267,
+ 7253, 7269, 7264, 7277, 7283, 7259, 7270, 7260, 7287, 7293,
+ 7280, 7288, 7297, 7896, 7896, 7290, 7896, 7896, 7305, 7306,
+ 7309, 7896, 7304, 7316, 7301, 7896, 7318, 7307, 7311, 7326,
+ 7315, 7335, 7896, 7896, 7319, 7336, 7325, 7340, 7329, 7896,
+ 7352, 7349, 7344, 7354, 7342, 7357, 7356, 7896, 7350, 7896,
+ 7896, 7896, 7896, 7367, 7896, 7360, 7896, 7366, 7369, 7371,
+
+ 7376, 7896, 7378, 7384, 7399, 7405, 7393, 7409, 7400, 7387,
+ 7394, 7403, 7398, 7414, 7417, 7422, 7896, 7431, 7424, 7434,
+ 7447, 7451, 7448, 7453, 7435, 7437, 7456, 7450, 7458, 7441,
+ 7461, 7465, 7473, 7469, 7467, 7472, 7896, 7480, 7896, 7479,
+ 7896, 7896, 7471, 7500, 7494, 7485, 7478, 7513, 7496, 7498,
+ 7490, 7515, 7896, 7499, 7506, 7526, 7896, 7512, 7529, 7516,
+ 7528, 7531, 7533, 7540, 7543, 7896, 7536, 7546, 7549, 7559,
+ 7555, 7550, 7561, 7569, 7575, 7568, 7588, 7579, 7585, 7896,
+ 7586, 7570, 7591, 7581, 7601, 7599, 7602, 7592, 7603, 7896,
+ 7609, 7625, 7617, 7614, 7616, 7611, 7638, 7618, 7627, 7896,
+
+ 7629, 7641, 7644, 7645, 7652, 7654, 7650, 7651, 7658, 7669,
+ 7673, 7676, 7680, 7681, 7664, 7684, 7679, 7896, 7692, 7685,
+ 7896, 7690, 7694, 7686, 7701, 7708, 7896, 7718, 7710, 7711,
+ 7722, 7724, 7726, 7896, 7727, 7734, 7732, 7896, 7735, 7896,
+ 7896, 7736, 7725, 7745, 7742, 7743, 7896, 7896, 7896, 7804,
+ 7811, 7818, 7825, 7832, 83, 7839, 7846, 7853, 7860, 7867,
+ 7874, 7881, 7888
} ;
-static yyconst flex_int16_t yy_def[2646] =
+static yyconst flex_int16_t yy_def[2764] =
{ 0,
- 2631, 1, 2632, 2632, 2633, 2633, 2634, 2634, 2635, 2635,
- 2636, 2636, 2631, 2637, 2631, 2631, 2631, 2631, 2638, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2639, 2631, 2631, 2631, 2639, 2640, 2631, 2631,
- 2631, 2640, 2641, 2631, 2631, 2631, 2631, 2641, 2642, 2631,
- 2631, 2631, 2642, 2643, 2631, 2644, 2631, 2643, 2643, 2637,
- 2637, 2631, 2645, 2638, 2645, 2638, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2639,
- 2639, 2640, 2640, 2641, 2641, 2631, 2642, 2642, 2643, 2643,
- 2644, 2644, 2643, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2643, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2643, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2643, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2643, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2631, 2637, 2631, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2643, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2631, 2637, 2637, 2643, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2637, 2637, 2637, 2637, 2631, 2637, 2631, 2637,
-
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2631, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2631, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2631, 2637, 2631, 2637, 2637, 2631, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2631,
- 2631, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
-
- 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2631, 2631, 2637, 2631, 2637, 2631, 2631,
- 2631, 2637, 2637, 2637, 2631, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2631, 2637, 2637, 2637,
-
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2631, 2637,
- 2637, 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2631, 2631,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2631, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2631, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2631, 2637, 2631, 2637, 2631, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2631, 2637, 2637, 2637,
-
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2631, 2631, 2631, 2637, 2637, 2637, 2631,
- 2631, 2637, 2637, 2631, 2637, 2631, 2637, 2631, 2637, 2637,
- 2637, 2631, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
-
- 2637, 2637, 2631, 2637, 2631, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2631, 2637, 2631, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2631, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
-
- 2631, 2637, 2631, 2631, 2637, 2637, 2637, 2631, 2631, 2631,
- 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631,
- 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2631, 2637, 2631, 2631, 2637, 2637,
- 2637, 2631, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2631, 2631, 2631,
- 2631, 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2631, 2637, 2631, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
-
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631,
- 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2631,
- 0, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631
+ 2749, 1, 2750, 2750, 2751, 2751, 2752, 2752, 2753, 2753,
+ 2754, 2754, 2749, 2755, 2749, 2749, 2749, 2749, 2756, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2757, 2749, 2749, 2749, 2757, 2758, 2749, 2749,
+ 2749, 2758, 2759, 2749, 2749, 2749, 2749, 2759, 2760, 2749,
+ 2749, 2749, 2760, 2761, 2749, 2762, 2749, 2761, 2761, 2755,
+ 2755, 2749, 2763, 2756, 2763, 2756, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2757,
+ 2757, 2758, 2758, 2759, 2759, 2749, 2760, 2760, 2761, 2761,
+ 2762, 2762, 2761, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2761, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2761, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2761,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2761, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2749, 2749, 2755, 2749, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2761,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2761,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2749, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2749, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2749, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2749, 2755, 2755, 2755, 2749,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2749, 2749, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2749, 2749,
+ 2755, 2749, 2755, 2749, 2755, 2749, 2749, 2755, 2755, 2755,
+
+ 2749, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2749, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2749, 2749, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2749, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2749,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2749, 2755, 2749, 2755, 2749, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2749,
+ 2755, 2749, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2749, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2749,
+ 2749, 2749, 2755, 2755, 2749, 2755, 2755, 2749, 2749, 2755,
+ 2755, 2755, 2749, 2755, 2749, 2755, 2749, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2749, 2755, 2755, 2749, 2755, 2749, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2749, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2749, 2749, 2755, 2749, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2749, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2749, 2749, 2755, 2755, 2749,
+ 2749, 2755, 2755, 2755, 2749, 2749, 2749, 2755, 2749, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2749,
+ 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2749, 2755, 2749, 2749, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2749, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2749,
+ 2749, 2749, 2749, 2755, 2749, 2755, 2749, 2755, 2755, 2755,
+
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2749, 2755,
+ 2749, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2749,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2749, 2749, 0, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749
} ;
-static yyconst flex_uint16_t yy_nxt[7571] =
+static yyconst flex_uint16_t yy_nxt[7963] =
{ 0,
14, 15, 16, 17, 18, 19, 18, 14, 14, 14,
14, 14, 18, 20, 21, 22, 23, 24, 25, 14,
@@ -1339,52 +1377,52 @@ static yyconst flex_uint16_t yy_nxt[7571] =
171, 134, 135, 114, 173, 145, 177, 143, 141, 115,
71, 161, 116, 136, 132, 71, 198, 137, 172, 117,
123, 138, 71, 124, 133, 160, 71, 256, 134, 135,
- 125, 2631, 71, 177, 126, 127, 71, 178, 161, 71,
- 136, 2631, 71, 198, 137, 172, 71, 123, 138, 70,
+ 125, 2749, 71, 177, 126, 127, 71, 178, 161, 71,
+ 136, 2749, 71, 198, 137, 172, 71, 123, 138, 70,
124, 70, 70, 75, 70, 75, 75, 125, 75, 71,
70, 126, 127, 149, 178, 149, 149, 70, 149, 70,
70, 75, 70, 75, 75, 165, 75, 174, 70, 167,
- 168, 166, 75, 2631, 71, 175, 176, 179, 71, 180,
- 181, 152, 2631, 2631, 2631, 186, 71, 188, 2631, 197,
- 2631, 71, 165, 71, 174, 71, 167, 168, 166, 76,
+ 168, 166, 75, 2749, 71, 175, 176, 179, 71, 180,
+ 181, 152, 2749, 2749, 2749, 186, 71, 188, 2749, 197,
+ 2749, 71, 165, 71, 174, 71, 167, 168, 166, 76,
71, 71, 175, 176, 179, 182, 180, 181, 183, 187,
194, 189, 71, 196, 188, 195, 197, 71, 71, 191,
- 199, 184, 185, 192, 200, 2631, 71, 201, 2631, 71,
- 2631, 190, 182, 71, 71, 183, 187, 194, 189, 193,
+ 199, 184, 185, 192, 200, 2749, 71, 201, 2749, 71,
+ 2749, 190, 182, 71, 71, 183, 187, 194, 189, 193,
196, 71, 195, 71, 71, 202, 191, 199, 184, 185,
192, 200, 71, 203, 201, 204, 205, 206, 190, 209,
- 208, 207, 71, 210, 214, 71, 193, 71, 2631, 215,
+ 208, 207, 71, 210, 214, 71, 193, 71, 2749, 215,
- 71, 2631, 202, 222, 331, 2631, 71, 71, 71, 71,
+ 71, 2749, 202, 222, 331, 2749, 71, 71, 71, 71,
203, 219, 204, 205, 206, 71, 209, 208, 207, 211,
210, 214, 221, 223, 216, 71, 215, 224, 212, 71,
222, 71, 225, 226, 213, 217, 71, 71, 219, 218,
- 2631, 71, 71, 71, 229, 228, 211, 227, 71, 221,
+ 2749, 71, 71, 71, 229, 228, 211, 227, 71, 221,
223, 216, 231, 71, 224, 212, 71, 236, 232, 225,
226, 213, 217, 233, 234, 230, 218, 71, 239, 71,
- 71, 229, 228, 71, 227, 235, 2631, 2631, 71, 231,
- 71, 2631, 240, 2631, 236, 232, 2631, 237, 2631, 2631,
+ 71, 229, 228, 71, 227, 235, 2749, 2749, 71, 231,
+ 71, 2749, 240, 2749, 236, 232, 2749, 237, 2749, 2749,
233, 234, 230, 144, 238, 144, 144, 71, 144, 245,
71, 149, 235, 149, 149, 75, 149, 75, 75, 240,
75, 150, 242, 241, 237, 71, 71, 246, 243, 247,
- 248, 238, 71, 2631, 71, 244, 245, 71, 249, 252,
+ 248, 238, 71, 2749, 71, 244, 245, 71, 249, 252,
251, 250, 71, 255, 288, 253, 71, 71, 71, 242,
241, 254, 292, 152, 246, 243, 247, 248, 71, 257,
71, 267, 244, 258, 268, 249, 265, 251, 250, 71,
255, 71, 253, 71, 266, 272, 71, 270, 254, 269,
- 259, 2631, 71, 71, 71, 2631, 71, 71, 267, 273,
- 258, 268, 71, 265, 71, 278, 316, 2631, 71, 274,
- 2631, 266, 272, 275, 71, 271, 269, 259, 260, 71,
+ 259, 2749, 71, 71, 71, 2749, 71, 71, 267, 273,
+ 258, 268, 71, 265, 71, 278, 316, 2749, 71, 274,
+ 2749, 266, 272, 275, 71, 271, 269, 259, 260, 71,
289, 71, 71, 261, 276, 71, 273, 277, 262, 71,
279, 280, 278, 316, 263, 264, 274, 290, 285, 71,
- 275, 71, 271, 2631, 406, 260, 71, 289, 291, 294,
+ 275, 71, 271, 2749, 408, 260, 71, 289, 291, 294,
261, 276, 71, 71, 277, 262, 286, 279, 280, 281,
71, 263, 264, 71, 282, 285, 287, 293, 298, 71,
295, 71, 297, 296, 71, 291, 283, 71, 284, 71,
- 299, 71, 300, 286, 302, 71, 281, 2631, 71, 301,
+ 299, 71, 300, 286, 302, 71, 281, 2749, 71, 301,
71, 282, 303, 287, 293, 298, 305, 295, 71, 304,
296, 307, 306, 283, 71, 284, 71, 71, 308, 71,
309, 302, 71, 71, 71, 310, 301, 71, 311, 303,
@@ -1400,742 +1438,786 @@ static yyconst flex_uint16_t yy_nxt[7571] =
340, 343, 71, 71, 71, 71, 71, 335, 71, 337,
333, 341, 344, 347, 348, 349, 71, 350, 351, 353,
- 2631, 352, 2631, 71, 336, 368, 342, 340, 343, 71,
- 71, 71, 71, 354, 356, 71, 71, 357, 2631, 344,
+ 2749, 352, 2749, 71, 336, 368, 342, 340, 343, 71,
+ 71, 71, 71, 354, 356, 71, 71, 357, 2749, 344,
347, 348, 358, 363, 350, 351, 353, 71, 352, 355,
360, 71, 71, 361, 71, 362, 367, 71, 71, 71,
- 354, 356, 71, 364, 357, 365, 371, 2631, 71, 358,
+ 354, 356, 71, 364, 357, 365, 371, 2749, 71, 358,
363, 366, 369, 370, 71, 71, 355, 360, 376, 71,
361, 71, 362, 367, 372, 71, 374, 375, 377, 71,
364, 71, 365, 371, 71, 71, 379, 378, 366, 369,
381, 373, 71, 380, 390, 71, 71, 71, 382, 71,
71, 372, 71, 374, 375, 377, 383, 71, 384, 389,
- 385, 2631, 386, 379, 378, 71, 71, 381, 373, 71,
- 380, 387, 71, 388, 71, 382, 71, 391, 392, 2631,
- 71, 71, 398, 383, 397, 384, 389, 385, 71, 386,
- 2631, 71, 399, 71, 400, 2631, 2631, 71, 387, 393,
- 388, 71, 71, 407, 391, 392, 402, 394, 395, 398,
- 396, 397, 401, 403, 71, 2631, 2631, 71, 71, 399,
- 71, 400, 404, 405, 410, 411, 393, 71, 71, 413,
- 407, 414, 417, 402, 394, 395, 71, 396, 408, 401,
- 403, 409, 412, 71, 415, 416, 418, 71, 71, 404,
- 405, 410, 411, 71, 71, 419, 71, 71, 414, 417,
-
- 71, 71, 1057, 71, 421, 408, 422, 420, 409, 412,
- 71, 415, 416, 418, 71, 424, 71, 423, 425, 426,
- 431, 427, 419, 2631, 71, 2631, 2631, 428, 429, 437,
- 430, 421, 71, 71, 420, 472, 71, 71, 71, 2631,
- 432, 71, 424, 71, 423, 436, 426, 431, 427, 438,
- 71, 439, 71, 433, 428, 429, 434, 430, 435, 440,
- 946, 71, 472, 71, 71, 71, 447, 432, 448, 449,
- 461, 71, 436, 71, 71, 2631, 438, 450, 439, 453,
- 433, 71, 71, 434, 451, 435, 440, 441, 474, 442,
- 71, 71, 71, 447, 462, 448, 449, 461, 463, 465,
-
- 452, 71, 443, 464, 450, 444, 453, 445, 71, 446,
- 471, 451, 71, 71, 441, 474, 442, 466, 477, 468,
- 71, 462, 71, 150, 2631, 467, 465, 452, 473, 443,
- 71, 71, 444, 71, 445, 71, 446, 454, 455, 469,
- 470, 2631, 71, 483, 466, 477, 468, 456, 71, 457,
- 458, 459, 467, 478, 460, 473, 479, 71, 480, 475,
- 71, 482, 71, 71, 454, 455, 469, 470, 476, 485,
- 71, 481, 484, 71, 456, 71, 457, 458, 459, 71,
- 478, 460, 490, 479, 71, 480, 487, 486, 482, 498,
- 488, 71, 71, 71, 489, 476, 485, 494, 481, 484,
-
- 71, 491, 492, 2631, 71, 71, 493, 496, 71, 490,
- 497, 495, 71, 71, 486, 501, 498, 488, 71, 502,
- 71, 489, 71, 504, 494, 499, 509, 513, 503, 2631,
- 71, 71, 71, 493, 496, 71, 505, 497, 495, 71,
- 500, 71, 501, 506, 71, 511, 502, 510, 71, 71,
- 504, 517, 499, 509, 507, 503, 508, 512, 514, 71,
- 2631, 71, 524, 505, 71, 515, 516, 500, 71, 71,
- 506, 519, 511, 71, 510, 71, 520, 521, 517, 523,
- 518, 507, 522, 508, 512, 514, 71, 71, 525, 71,
- 71, 527, 515, 516, 71, 526, 71, 71, 519, 71,
-
- 534, 71, 528, 520, 521, 71, 523, 518, 529, 522,
- 530, 71, 531, 71, 535, 525, 532, 71, 527, 533,
- 71, 71, 526, 71, 536, 540, 71, 534, 537, 528,
- 71, 71, 538, 543, 539, 529, 71, 530, 541, 531,
- 71, 535, 71, 532, 71, 1168, 533, 548, 71, 549,
- 542, 536, 540, 547, 71, 537, 71, 71, 71, 538,
- 543, 539, 544, 546, 545, 541, 71, 71, 550, 552,
- 71, 71, 551, 71, 555, 560, 549, 542, 553, 71,
- 547, 554, 71, 557, 2631, 556, 558, 606, 71, 544,
- 546, 545, 71, 561, 71, 563, 552, 71, 562, 551,
-
- 71, 71, 560, 71, 564, 553, 71, 71, 554, 559,
- 557, 565, 556, 567, 566, 71, 569, 568, 71, 71,
- 561, 578, 563, 2631, 71, 562, 71, 71, 71, 71,
- 577, 564, 580, 71, 581, 71, 559, 71, 565, 582,
- 567, 566, 579, 569, 568, 570, 583, 584, 578, 585,
- 571, 71, 572, 71, 588, 71, 71, 577, 71, 580,
- 573, 581, 589, 574, 575, 71, 582, 71, 71, 579,
- 576, 71, 570, 583, 584, 586, 585, 571, 591, 572,
- 2631, 588, 592, 595, 71, 587, 71, 573, 590, 589,
- 574, 575, 593, 597, 594, 71, 596, 576, 71, 600,
-
- 599, 71, 602, 2631, 71, 591, 71, 71, 71, 592,
- 595, 598, 587, 603, 71, 590, 71, 71, 71, 593,
- 597, 594, 71, 596, 601, 604, 600, 599, 609, 602,
- 605, 607, 71, 608, 71, 610, 71, 611, 598, 617,
- 603, 612, 613, 71, 616, 71, 71, 614, 71, 71,
- 71, 601, 604, 150, 615, 609, 618, 605, 607, 620,
- 608, 71, 610, 71, 611, 71, 71, 619, 612, 613,
- 621, 616, 622, 624, 614, 623, 634, 625, 628, 71,
- 637, 615, 71, 632, 633, 71, 635, 71, 71, 71,
- 636, 71, 675, 629, 619, 71, 71, 621, 630, 622,
-
- 624, 71, 623, 626, 625, 628, 627, 631, 71, 638,
- 71, 71, 71, 71, 71, 71, 639, 71, 640, 71,
- 641, 71, 642, 643, 644, 71, 71, 71, 646, 645,
- 626, 647, 71, 627, 631, 648, 638, 649, 71, 71,
- 651, 650, 653, 639, 71, 640, 71, 641, 71, 642,
- 643, 644, 71, 652, 71, 71, 645, 658, 647, 71,
- 71, 654, 648, 665, 649, 657, 655, 659, 650, 653,
- 656, 664, 71, 660, 71, 71, 71, 661, 662, 2631,
- 652, 71, 666, 71, 658, 71, 663, 672, 654, 667,
- 665, 71, 657, 655, 659, 71, 669, 656, 71, 71,
-
- 660, 71, 670, 71, 661, 662, 71, 676, 671, 666,
- 673, 668, 71, 663, 672, 674, 667, 677, 71, 71,
- 679, 678, 71, 669, 71, 71, 680, 681, 71, 670,
- 685, 682, 71, 686, 676, 671, 71, 673, 668, 683,
- 684, 687, 674, 71, 677, 688, 689, 71, 678, 71,
- 697, 71, 71, 680, 681, 71, 690, 685, 682, 691,
- 693, 71, 694, 71, 692, 71, 683, 684, 687, 703,
- 71, 695, 696, 689, 71, 699, 71, 71, 71, 71,
- 698, 700, 71, 690, 705, 701, 2631, 693, 71, 694,
- 704, 71, 706, 71, 708, 2631, 2631, 707, 695, 696,
-
- 702, 71, 699, 71, 710, 71, 71, 698, 700, 71,
- 711, 705, 701, 709, 712, 71, 713, 704, 71, 714,
- 71, 708, 716, 715, 71, 71, 717, 702, 71, 71,
- 71, 710, 71, 71, 718, 720, 719, 711, 725, 71,
- 709, 712, 721, 713, 722, 723, 714, 71, 726, 716,
- 715, 71, 71, 717, 71, 724, 71, 71, 727, 729,
- 71, 718, 720, 719, 728, 730, 71, 71, 71, 721,
- 71, 722, 723, 732, 71, 726, 733, 2631, 734, 731,
- 2631, 71, 724, 737, 735, 727, 729, 71, 71, 71,
- 736, 728, 730, 738, 740, 741, 742, 739, 71, 71,
-
- 732, 749, 71, 733, 71, 734, 731, 71, 71, 71,
- 737, 735, 743, 744, 745, 71, 71, 736, 747, 71,
- 738, 740, 741, 742, 739, 746, 748, 71, 749, 750,
- 751, 754, 753, 71, 71, 752, 71, 755, 756, 743,
- 744, 745, 71, 757, 761, 747, 71, 71, 71, 764,
- 71, 71, 746, 748, 150, 71, 750, 751, 754, 753,
- 71, 71, 752, 758, 755, 756, 759, 760, 767, 762,
- 757, 71, 766, 71, 765, 71, 71, 763, 768, 71,
- 71, 772, 770, 769, 773, 71, 2631, 2631, 2631, 771,
- 758, 792, 71, 759, 760, 71, 762, 71, 71, 766,
-
- 71, 765, 784, 71, 763, 768, 71, 782, 774, 770,
- 769, 773, 775, 71, 71, 776, 771, 71, 783, 71,
- 71, 786, 71, 71, 789, 785, 2631, 787, 71, 784,
- 2631, 2631, 788, 2631, 782, 774, 790, 804, 2631, 775,
- 71, 805, 776, 777, 71, 783, 71, 778, 786, 71,
- 779, 789, 785, 71, 787, 791, 800, 780, 71, 788,
- 781, 71, 71, 790, 804, 71, 801, 2631, 71, 2631,
- 777, 802, 71, 803, 778, 71, 806, 779, 71, 830,
- 71, 807, 791, 800, 780, 808, 811, 781, 793, 794,
- 2631, 795, 2631, 801, 796, 810, 71, 71, 802, 797,
-
- 803, 809, 812, 806, 814, 798, 799, 71, 807, 813,
- 71, 71, 808, 811, 71, 793, 794, 71, 795, 71,
- 816, 796, 810, 820, 71, 819, 797, 71, 809, 812,
- 815, 814, 798, 799, 71, 817, 813, 818, 71, 821,
- 822, 824, 71, 71, 71, 71, 823, 816, 825, 71,
- 820, 71, 819, 71, 826, 71, 71, 815, 827, 831,
- 829, 832, 817, 828, 818, 833, 821, 822, 824, 836,
- 71, 839, 837, 823, 834, 825, 835, 838, 71, 71,
- 840, 71, 71, 843, 841, 71, 71, 829, 832, 842,
- 71, 71, 833, 71, 71, 71, 836, 71, 839, 837,
-
- 845, 834, 71, 835, 838, 844, 846, 71, 71, 847,
- 848, 841, 850, 71, 849, 71, 842, 851, 71, 852,
- 2631, 71, 853, 854, 71, 2631, 861, 845, 71, 856,
- 71, 71, 844, 846, 71, 71, 847, 848, 71, 850,
- 860, 849, 857, 855, 851, 71, 852, 71, 71, 853,
- 854, 71, 858, 71, 2631, 862, 856, 864, 863, 865,
- 859, 71, 2631, 71, 866, 71, 71, 860, 867, 857,
- 855, 71, 869, 71, 868, 870, 71, 2631, 874, 858,
- 71, 71, 862, 871, 864, 863, 865, 859, 872, 873,
- 71, 866, 71, 71, 878, 867, 71, 877, 71, 869,
-
- 875, 868, 870, 885, 876, 874, 879, 71, 71, 883,
- 871, 880, 881, 71, 71, 872, 873, 71, 71, 71,
- 890, 71, 887, 882, 877, 884, 889, 875, 886, 71,
- 71, 876, 71, 879, 891, 71, 883, 888, 880, 881,
- 894, 71, 71, 71, 71, 892, 898, 890, 896, 897,
- 882, 895, 884, 893, 71, 886, 899, 71, 71, 901,
- 71, 891, 71, 900, 888, 71, 903, 894, 906, 902,
- 71, 908, 892, 898, 71, 896, 71, 71, 895, 904,
- 893, 71, 905, 899, 909, 907, 912, 910, 71, 2631,
- 900, 71, 71, 71, 71, 150, 902, 71, 908, 914,
-
- 911, 943, 71, 915, 71, 924, 904, 71, 71, 905,
- 71, 909, 907, 912, 910, 913, 71, 916, 925, 917,
- 2631, 926, 71, 71, 71, 71, 914, 911, 943, 928,
- 915, 71, 924, 71, 927, 930, 71, 931, 932, 929,
- 2631, 71, 913, 933, 916, 925, 917, 918, 926, 919,
- 71, 71, 71, 920, 934, 921, 928, 71, 2631, 2631,
- 922, 927, 930, 935, 931, 923, 929, 71, 2631, 937,
- 71, 71, 936, 939, 918, 940, 919, 941, 944, 938,
- 920, 934, 921, 71, 71, 942, 71, 922, 71, 945,
- 935, 71, 923, 947, 949, 71, 937, 948, 71, 936,
-
- 939, 957, 940, 71, 941, 71, 938, 956, 2631, 960,
- 71, 968, 942, 2631, 958, 959, 71, 2631, 2631, 962,
- 2631, 949, 71, 71, 948, 71, 950, 71, 957, 966,
- 71, 951, 961, 952, 956, 71, 960, 963, 71, 964,
- 965, 958, 959, 71, 953, 954, 962, 71, 71, 969,
- 71, 955, 71, 950, 71, 970, 71, 967, 951, 961,
- 952, 971, 972, 71, 963, 973, 964, 965, 975, 974,
- 978, 953, 954, 71, 977, 71, 969, 71, 955, 976,
- 71, 979, 970, 980, 967, 71, 71, 71, 971, 981,
- 983, 71, 973, 982, 71, 975, 974, 71, 984, 71,
-
- 71, 977, 71, 71, 985, 71, 976, 987, 979, 986,
- 980, 71, 998, 988, 991, 989, 981, 983, 990, 996,
- 982, 992, 71, 71, 71, 984, 71, 71, 71, 993,
- 994, 985, 995, 71, 997, 999, 986, 71, 1001, 71,
- 988, 991, 989, 1002, 71, 990, 996, 1000, 992, 71,
- 1003, 71, 71, 1004, 71, 1005, 993, 994, 71, 995,
- 71, 997, 999, 1008, 1007, 1006, 1011, 1009, 1012, 1013,
- 71, 71, 71, 1010, 1000, 71, 71, 1003, 71, 71,
- 1004, 71, 1005, 1014, 1016, 71, 1017, 1015, 1018, 1021,
- 1008, 1007, 1006, 71, 1009, 1012, 1019, 1020, 71, 71,
-
- 1010, 71, 1025, 1026, 71, 1022, 71, 71, 71, 1023,
- 1014, 1016, 1024, 1017, 1015, 1018, 1021, 1027, 71, 71,
- 71, 1029, 1028, 1019, 1020, 1034, 71, 1033, 1030, 1035,
- 71, 71, 1022, 71, 71, 71, 1023, 71, 1031, 1024,
- 1032, 71, 1036, 1038, 1027, 71, 71, 71, 1029, 1028,
- 1037, 1039, 71, 1040, 1033, 1030, 1041, 71, 71, 1043,
- 1044, 71, 1042, 1049, 71, 1031, 1045, 1032, 71, 1036,
- 1038, 1050, 71, 1047, 1052, 1046, 2631, 1037, 1039, 1048,
- 71, 1053, 71, 71, 71, 71, 1043, 1044, 2631, 1042,
- 71, 71, 1051, 1045, 71, 71, 71, 1054, 1055, 1056,
-
- 1047, 1052, 1046, 71, 71, 71, 1048, 1058, 71, 1059,
- 1060, 71, 1062, 1061, 71, 71, 71, 1063, 71, 1051,
- 71, 1065, 1064, 1066, 1054, 1055, 1056, 71, 1068, 1067,
- 1069, 1071, 1072, 71, 1058, 71, 1059, 1060, 71, 1062,
- 1061, 1074, 2631, 1073, 71, 1070, 71, 1075, 1065, 1064,
- 1066, 71, 71, 1078, 1076, 1068, 1067, 71, 1077, 1081,
- 1084, 1079, 2631, 71, 71, 71, 71, 71, 1074, 71,
- 1073, 71, 1070, 71, 1075, 71, 1080, 1082, 1085, 71,
- 1078, 1076, 1083, 1086, 71, 1077, 1081, 71, 1079, 71,
- 71, 71, 71, 1087, 1088, 2631, 1093, 1089, 1095, 1096,
-
- 1124, 71, 2631, 1080, 1082, 1085, 1090, 1094, 1091, 1083,
- 1086, 1092, 71, 1097, 71, 2631, 1104, 1100, 71, 71,
- 1087, 1088, 71, 1093, 1089, 1095, 1096, 1098, 1099, 71,
- 1102, 1105, 71, 1090, 1094, 1091, 71, 71, 1092, 71,
- 1097, 1101, 1103, 71, 1100, 1107, 71, 1108, 1109, 71,
- 71, 2631, 71, 71, 1098, 1099, 1106, 1102, 1105, 1110,
- 1114, 1112, 2631, 71, 1115, 1111, 71, 71, 1101, 1103,
- 71, 71, 1107, 71, 1108, 1109, 71, 1113, 1117, 71,
- 71, 1119, 1116, 1106, 71, 1118, 1110, 1114, 1112, 71,
- 71, 1115, 1111, 1121, 71, 1120, 1122, 1123, 1125, 1126,
-
- 71, 1129, 71, 71, 1113, 1117, 1127, 71, 1119, 1116,
- 1128, 71, 1118, 71, 1130, 71, 71, 1133, 71, 1131,
- 1121, 1132, 1120, 1122, 1123, 1125, 1126, 1134, 1129, 71,
- 71, 1135, 71, 1127, 1144, 2631, 1158, 1128, 1142, 2631,
- 2631, 71, 1143, 1147, 1133, 1145, 71, 1159, 1132, 2631,
- 2631, 2631, 71, 1146, 1134, 2631, 1148, 71, 1135, 1136,
- 71, 71, 1137, 1138, 2631, 1142, 71, 1139, 71, 1143,
- 1147, 71, 1145, 1140, 1149, 71, 1150, 1141, 71, 71,
- 1146, 71, 1151, 1148, 1152, 1153, 1136, 1154, 1155, 1137,
- 1138, 1160, 71, 1161, 1139, 1156, 71, 1167, 1157, 2631,
-
- 1140, 1149, 71, 1150, 1141, 71, 71, 71, 71, 1151,
- 71, 1152, 1153, 71, 1154, 1155, 71, 2631, 1160, 1170,
- 1161, 1172, 1156, 71, 1167, 1157, 1162, 1169, 1171, 1173,
- 71, 1163, 1179, 1164, 1174, 1165, 1176, 1166, 1178, 1175,
- 71, 71, 71, 71, 71, 1177, 1170, 71, 1172, 1180,
- 71, 71, 1182, 1162, 1169, 1171, 1173, 71, 1163, 1179,
- 1164, 1181, 1165, 1176, 1166, 1178, 71, 71, 1183, 71,
- 1184, 71, 1177, 1185, 1187, 1186, 1180, 1189, 1188, 1182,
- 71, 71, 1190, 71, 1191, 1192, 71, 2631, 1181, 1193,
- 1197, 1194, 71, 71, 2631, 1183, 71, 1184, 1195, 71,
-
- 1185, 1187, 1186, 1198, 1189, 1188, 1199, 1200, 1203, 71,
- 71, 1191, 71, 1196, 71, 71, 1193, 71, 1194, 1205,
- 71, 71, 1201, 1207, 1204, 1195, 1202, 1206, 71, 71,
- 1198, 71, 71, 71, 1200, 71, 1208, 1209, 1211, 1210,
- 1196, 71, 2631, 1219, 1214, 71, 1205, 1212, 71, 1201,
- 1207, 1204, 1216, 1202, 1206, 1213, 1217, 71, 1215, 71,
- 71, 71, 1220, 1208, 1209, 1211, 1210, 71, 1221, 71,
- 71, 1214, 1218, 71, 1212, 71, 71, 71, 1222, 1216,
- 1223, 1224, 1213, 1217, 1225, 1215, 71, 1226, 1229, 71,
- 71, 1232, 71, 1230, 71, 1221, 1227, 1228, 71, 1218,
-
- 71, 1231, 1233, 71, 71, 1237, 2631, 1223, 1224, 1236,
- 71, 1225, 71, 1234, 71, 1229, 71, 1238, 1232, 1235,
- 71, 1240, 1239, 1227, 1228, 71, 71, 1242, 1241, 71,
- 71, 71, 1237, 71, 71, 71, 1236, 1244, 1245, 1246,
- 1234, 1243, 1252, 71, 1238, 1247, 1235, 71, 1240, 1239,
- 71, 1249, 1248, 1251, 1242, 1241, 1250, 1253, 2631, 71,
- 71, 71, 1254, 1259, 1244, 71, 1246, 71, 1243, 1252,
- 71, 71, 1247, 1255, 71, 1257, 1256, 1261, 1258, 1248,
- 1251, 1260, 2631, 71, 1253, 71, 2631, 1262, 71, 1254,
- 1259, 1263, 1292, 1264, 71, 1265, 71, 71, 1270, 1267,
-
- 1255, 71, 1257, 1256, 1266, 1258, 1268, 71, 1260, 71,
- 71, 71, 1269, 71, 1262, 71, 1272, 1273, 1263, 71,
- 1264, 71, 1265, 1271, 71, 1270, 1267, 1274, 1278, 1275,
- 1276, 1266, 71, 1268, 2631, 1279, 71, 71, 1277, 1269,
- 71, 71, 71, 1272, 1273, 71, 71, 71, 1280, 1282,
- 1271, 1281, 1283, 2631, 1274, 1278, 1275, 1276, 1284, 71,
- 71, 1285, 1279, 1286, 2631, 1277, 1287, 1290, 1289, 1291,
- 71, 71, 71, 71, 1288, 1280, 1282, 1293, 1281, 1283,
- 71, 71, 2631, 2631, 1294, 1284, 71, 1295, 1285, 71,
- 1286, 71, 71, 1287, 1290, 1289, 1291, 1296, 1297, 1298,
-
- 1302, 1288, 1300, 1299, 1301, 2631, 1303, 2631, 2631, 71,
- 71, 1294, 71, 71, 1295, 71, 71, 71, 1305, 1306,
- 71, 71, 2631, 1307, 71, 1297, 1298, 1302, 1304, 1300,
- 1299, 1301, 71, 1303, 1308, 71, 71, 71, 1309, 1311,
- 1313, 71, 71, 1310, 1312, 1305, 1306, 71, 1314, 1315,
- 1307, 1316, 1319, 1317, 1318, 1304, 71, 71, 1321, 71,
- 71, 1308, 1322, 71, 1320, 71, 71, 1313, 1323, 1324,
- 71, 71, 1334, 2631, 1325, 1314, 1315, 71, 1316, 1326,
- 1317, 1318, 71, 71, 71, 1321, 1327, 71, 1331, 1322,
- 1328, 1320, 1329, 1330, 71, 1333, 1324, 1332, 71, 71,
-
- 71, 1325, 1336, 71, 1335, 71, 1326, 2631, 2631, 1337,
- 71, 2631, 1338, 1327, 71, 1331, 1343, 1328, 1339, 1329,
- 1330, 71, 1333, 71, 1332, 71, 71, 1345, 1344, 1336,
- 71, 1335, 71, 1340, 71, 1346, 1337, 1341, 71, 1338,
- 71, 1347, 2631, 1343, 1348, 1339, 71, 1349, 2631, 1350,
- 1342, 1356, 1351, 1355, 1345, 1344, 1352, 2631, 71, 1358,
- 1340, 1353, 1346, 71, 1341, 71, 71, 1359, 71, 71,
- 71, 1348, 71, 1354, 1349, 71, 1350, 1342, 71, 1351,
- 71, 1357, 1361, 1352, 1360, 71, 1358, 2631, 1353, 71,
- 71, 1362, 1363, 1364, 1359, 1365, 1369, 1366, 2631, 1367,
-
- 1354, 1368, 71, 1371, 71, 1370, 71, 1372, 1357, 1375,
- 71, 1360, 1379, 71, 71, 1374, 71, 71, 71, 71,
- 1364, 71, 1365, 1369, 1366, 71, 1367, 71, 1368, 71,
- 1371, 1373, 1370, 1376, 1372, 71, 1375, 1377, 1378, 71,
- 1380, 1381, 1374, 71, 1382, 1384, 71, 1383, 71, 2631,
- 71, 1387, 71, 1385, 1386, 1388, 1390, 1389, 1373, 71,
- 1376, 71, 71, 71, 1377, 1378, 71, 1380, 1381, 71,
- 71, 1382, 1384, 71, 1383, 1393, 71, 1394, 1387, 71,
- 1385, 1386, 71, 1390, 1389, 1391, 1392, 1396, 71, 1395,
- 1397, 1398, 1399, 71, 2631, 1402, 1401, 71, 71, 1400,
-
- 2631, 1404, 1393, 71, 1394, 1403, 1406, 1408, 1411, 71,
- 71, 71, 1391, 1392, 1396, 71, 1395, 1397, 1398, 1399,
- 71, 71, 1402, 1401, 1405, 1410, 1400, 71, 1407, 1409,
- 1414, 71, 1403, 71, 71, 1411, 1412, 71, 71, 1413,
- 1415, 71, 1416, 71, 1417, 1419, 71, 1418, 1424, 71,
- 2631, 1405, 1410, 2631, 71, 1407, 1409, 1414, 1430, 1425,
- 71, 1421, 71, 1412, 1422, 71, 1413, 1415, 71, 1416,
- 1420, 1417, 1419, 71, 1418, 1426, 1423, 71, 1427, 1433,
- 71, 71, 1428, 1429, 71, 71, 1425, 1431, 1421, 1432,
- 71, 1422, 2631, 71, 1434, 1435, 1438, 1420, 1439, 1441,
-
- 71, 71, 1426, 1423, 71, 1427, 1433, 71, 71, 1428,
- 1429, 1436, 1440, 71, 1431, 71, 1432, 1437, 1443, 71,
- 1444, 1434, 1435, 1442, 71, 1453, 1445, 71, 71, 1447,
- 71, 71, 1446, 1449, 71, 1448, 71, 2631, 1436, 1440,
- 71, 71, 71, 1451, 1437, 1443, 71, 71, 71, 1452,
- 1442, 1450, 1458, 1445, 1454, 1456, 1447, 71, 71, 1446,
- 1449, 71, 1448, 71, 71, 1455, 1460, 1457, 71, 1461,
- 1451, 1462, 71, 71, 1463, 2631, 1452, 1459, 1450, 71,
- 1468, 1454, 1456, 71, 71, 1466, 1464, 71, 71, 71,
- 1465, 2631, 1455, 1460, 1457, 71, 1461, 1467, 1462, 71,
-
- 71, 1463, 1469, 71, 1459, 1470, 1472, 1468, 1471, 71,
- 1475, 1473, 1466, 1464, 1474, 1476, 71, 1465, 71, 71,
- 71, 1477, 1478, 1480, 1467, 1479, 1483, 1488, 1487, 1469,
- 2631, 71, 1470, 1472, 1481, 1471, 1482, 71, 1473, 71,
- 1489, 1474, 71, 1484, 71, 71, 71, 71, 1477, 71,
- 1480, 71, 1479, 1483, 1485, 1487, 71, 1486, 1490, 71,
- 1491, 1481, 1492, 1482, 1493, 71, 1497, 71, 1494, 2631,
- 1484, 71, 71, 1495, 71, 71, 1496, 71, 71, 71,
- 1498, 1485, 1502, 1499, 1486, 1490, 1500, 1491, 71, 1492,
- 1501, 1493, 2631, 1497, 71, 1494, 1503, 2631, 1504, 1507,
-
- 1495, 1505, 1506, 1496, 71, 71, 71, 1498, 71, 1502,
- 1499, 71, 71, 1500, 1509, 1508, 71, 1501, 1511, 1510,
- 1512, 1513, 1514, 1503, 71, 1504, 1507, 1515, 1505, 1506,
- 71, 71, 1517, 1516, 1519, 1518, 1521, 2631, 1520, 1522,
- 1531, 71, 1508, 2631, 1537, 1511, 71, 1533, 1513, 71,
- 1525, 71, 71, 71, 71, 71, 71, 1523, 71, 71,
- 1516, 1519, 1518, 1524, 71, 1520, 1522, 1526, 71, 1527,
- 1529, 1528, 71, 1530, 1533, 71, 71, 1525, 1532, 1535,
- 1534, 71, 2631, 71, 1523, 71, 71, 71, 71, 71,
- 1524, 1538, 71, 1540, 1526, 1536, 1527, 1529, 1528, 1539,
-
- 1530, 1542, 71, 1541, 1548, 1532, 1535, 1534, 71, 71,
- 71, 1543, 1544, 1545, 1546, 1547, 71, 1549, 1538, 71,
- 71, 1550, 1536, 1553, 71, 2631, 1539, 1555, 1542, 71,
- 1541, 1548, 71, 71, 71, 71, 1551, 1552, 1543, 1544,
- 1545, 1546, 1547, 1554, 71, 71, 1556, 71, 1550, 1558,
- 71, 71, 1557, 1559, 1555, 1560, 71, 71, 1564, 1561,
- 71, 71, 1562, 1551, 1552, 2631, 1566, 71, 1565, 1563,
- 1554, 71, 1567, 1556, 71, 1569, 1558, 1572, 1571, 1557,
- 1559, 1573, 1568, 1570, 2631, 71, 1561, 71, 71, 1562,
- 71, 1577, 71, 71, 71, 1565, 1563, 1578, 71, 1567,
-
- 71, 71, 71, 71, 1572, 1571, 1574, 1575, 1573, 1568,
- 1570, 71, 1576, 71, 1579, 71, 71, 1582, 1577, 1580,
- 1581, 71, 1586, 1587, 1578, 1584, 1585, 1593, 2631, 71,
- 1583, 71, 71, 1574, 1575, 71, 1591, 1588, 71, 1576,
- 1589, 1579, 71, 71, 1582, 1592, 1580, 1581, 71, 71,
- 1594, 1590, 1584, 1585, 71, 71, 1596, 1583, 71, 1595,
- 1599, 71, 1597, 1591, 1588, 1600, 71, 1589, 71, 1598,
- 1601, 71, 1592, 1602, 1603, 71, 1604, 71, 1590, 1605,
- 1606, 1607, 71, 71, 1610, 71, 1595, 71, 71, 1597,
- 1608, 1615, 1600, 1609, 1617, 2631, 1598, 71, 71, 2631,
-
- 1602, 1625, 71, 1604, 2631, 71, 71, 1606, 1607, 1619,
- 1622, 71, 2631, 2631, 1620, 2631, 71, 71, 1615, 71,
- 1609, 1611, 1612, 1613, 1616, 1618, 71, 1621, 1614, 1623,
- 1624, 71, 71, 71, 2631, 71, 71, 1622, 1628, 1627,
- 71, 71, 71, 1626, 71, 71, 71, 1629, 1611, 1612,
- 1613, 1616, 1618, 1631, 1621, 1614, 1623, 1624, 1630, 71,
- 1632, 71, 1634, 1633, 1635, 1628, 1627, 71, 71, 1639,
- 1626, 1638, 1640, 2631, 71, 1636, 1637, 71, 2631, 71,
- 1631, 1641, 1642, 1648, 71, 1630, 1644, 1632, 71, 1634,
- 1633, 71, 1647, 71, 71, 1651, 71, 1650, 1638, 1640,
-
- 71, 71, 1636, 1637, 1643, 71, 1645, 71, 1641, 1642,
- 1646, 1649, 71, 1644, 71, 71, 1652, 71, 71, 1647,
- 1653, 71, 1654, 1655, 1650, 1656, 1657, 71, 1658, 2631,
- 1659, 1643, 71, 1645, 71, 1662, 1660, 1646, 1649, 1661,
- 71, 71, 1663, 71, 71, 71, 1672, 71, 71, 1654,
- 1655, 1664, 1656, 1657, 71, 1658, 1665, 1659, 71, 1666,
- 1668, 71, 1662, 1660, 1669, 1670, 1661, 71, 71, 71,
- 2631, 1671, 71, 1672, 71, 1667, 1673, 71, 1664, 71,
- 1675, 1674, 71, 1665, 2631, 1677, 1666, 1668, 1676, 1679,
- 1678, 1669, 1670, 1681, 1680, 1684, 1685, 71, 1671, 71,
-
- 71, 71, 1667, 1673, 1686, 1687, 71, 71, 1674, 1690,
- 1691, 71, 1677, 2631, 2631, 1676, 71, 1678, 1682, 1683,
- 1681, 1680, 1694, 71, 1688, 71, 71, 71, 71, 1689,
- 71, 1686, 1687, 1692, 1695, 1697, 71, 71, 1693, 1698,
- 71, 1696, 71, 1699, 2631, 1682, 1683, 1703, 1701, 1700,
- 71, 1688, 1705, 1702, 71, 71, 1689, 1715, 71, 1704,
- 1712, 2631, 1697, 71, 71, 71, 71, 1706, 1696, 1708,
- 1699, 71, 71, 1707, 1710, 1701, 1700, 71, 1711, 71,
- 1702, 1709, 71, 1713, 71, 1714, 1704, 71, 71, 71,
- 1716, 1717, 71, 1718, 1706, 1721, 1708, 1719, 71, 1720,
-
- 1707, 1710, 1726, 71, 71, 1711, 1725, 2631, 1709, 1727,
- 71, 71, 1714, 71, 71, 71, 1722, 1716, 1717, 71,
- 1718, 71, 1721, 1723, 1719, 1724, 1720, 71, 71, 71,
- 1730, 71, 1728, 1725, 1729, 1731, 1727, 1732, 71, 1733,
- 71, 1734, 71, 1722, 1735, 1737, 2631, 1736, 71, 71,
- 1723, 1746, 1724, 2631, 71, 71, 71, 71, 2631, 1728,
- 1738, 1729, 1731, 1741, 1732, 1739, 1733, 71, 1734, 71,
- 1742, 1735, 71, 71, 1736, 1743, 1740, 71, 71, 1744,
- 1754, 1745, 2631, 1751, 1753, 1747, 1749, 1738, 71, 1748,
- 1741, 71, 1739, 71, 71, 71, 71, 1742, 71, 1752,
-
- 71, 1750, 1743, 1740, 1755, 71, 1744, 1754, 1745, 71,
- 71, 1753, 1747, 1749, 71, 71, 1748, 1756, 1757, 1760,
- 1758, 2631, 1759, 1761, 1762, 1763, 1752, 71, 1750, 71,
- 1766, 71, 1765, 71, 2631, 1771, 71, 71, 71, 71,
- 71, 1764, 71, 1770, 1756, 1757, 1760, 1758, 71, 1759,
- 1761, 1762, 1763, 1767, 1769, 1772, 71, 1766, 71, 1765,
- 1773, 71, 71, 1775, 71, 1774, 1768, 71, 1764, 1776,
- 1770, 2631, 1777, 1778, 71, 1779, 71, 1781, 1786, 1780,
- 1767, 1769, 1772, 1784, 71, 71, 2631, 1773, 1783, 71,
- 1775, 1782, 1774, 1768, 71, 1788, 1776, 71, 71, 1777,
-
- 1778, 71, 1779, 71, 1781, 71, 1780, 1785, 71, 71,
- 1784, 1787, 71, 1790, 1789, 1783, 2631, 71, 1782, 1792,
- 71, 1791, 1788, 1793, 1794, 1795, 1800, 2631, 71, 1804,
- 71, 1796, 1797, 2631, 1785, 71, 1798, 2631, 1787, 71,
- 1790, 1789, 1799, 71, 71, 71, 1792, 71, 1791, 1801,
- 1793, 71, 1795, 71, 1802, 71, 71, 1803, 1796, 1797,
- 1805, 71, 2631, 1798, 71, 1806, 71, 1809, 1810, 1799,
- 1807, 2631, 1811, 2631, 1812, 71, 1801, 1816, 1808, 2631,
- 1817, 1802, 71, 71, 1803, 1813, 71, 1805, 1814, 71,
- 71, 1815, 1806, 1818, 71, 1810, 1819, 1807, 71, 1811,
-
- 71, 1812, 71, 71, 1816, 1808, 71, 1817, 1822, 1820,
- 1821, 1823, 1813, 1824, 71, 1814, 2631, 1828, 1815, 1825,
- 71, 1831, 1826, 1819, 71, 71, 71, 71, 71, 1832,
- 71, 71, 1827, 71, 1833, 1822, 1820, 1821, 1823, 1829,
- 1824, 71, 1830, 71, 1828, 1840, 1825, 1834, 1831, 1826,
- 1835, 71, 1837, 1842, 71, 71, 1832, 71, 1836, 1827,
- 1839, 1833, 71, 1838, 71, 71, 1829, 1843, 1841, 1830,
- 1844, 71, 71, 1849, 1834, 71, 1845, 1835, 71, 1837,
- 71, 1850, 1846, 1847, 1851, 1836, 71, 1839, 1848, 1854,
- 1838, 1852, 1853, 71, 1843, 1841, 71, 1844, 71, 71,
-
- 1855, 1859, 1858, 1845, 1860, 71, 1861, 1863, 71, 1846,
- 71, 1851, 2631, 71, 1856, 71, 71, 2631, 1852, 1853,
- 71, 71, 1864, 1862, 1865, 1857, 71, 1855, 71, 1858,
- 71, 1860, 71, 1861, 1866, 1867, 1868, 1870, 1869, 71,
- 2631, 1856, 2631, 1874, 71, 71, 1871, 1872, 71, 1864,
- 1862, 71, 1857, 1873, 1875, 71, 71, 71, 1878, 71,
- 71, 1866, 1876, 1868, 1870, 1869, 1877, 71, 1879, 71,
- 1874, 71, 1880, 1871, 1872, 1881, 71, 71, 1882, 71,
- 1873, 1875, 1883, 1885, 71, 71, 1884, 2631, 1886, 1876,
- 71, 71, 1887, 1877, 1888, 1879, 71, 71, 71, 1880,
-
- 71, 1889, 1881, 1890, 71, 1882, 1891, 1892, 71, 1883,
- 71, 71, 71, 1884, 1893, 1886, 1895, 1894, 1896, 1887,
- 71, 1888, 71, 1897, 1901, 1898, 1899, 1902, 1889, 71,
- 1890, 1900, 1904, 1891, 1892, 1903, 2631, 71, 71, 1905,
- 71, 1893, 71, 71, 1894, 1896, 71, 71, 1908, 1909,
- 1897, 71, 1898, 1899, 71, 1910, 1914, 71, 1900, 1904,
- 1906, 1911, 1903, 1907, 1913, 71, 1905, 1912, 71, 1915,
- 1917, 71, 1916, 1919, 71, 71, 1909, 71, 71, 71,
- 71, 1920, 1910, 71, 1918, 1921, 1925, 1906, 1911, 1922,
- 1907, 1913, 1924, 71, 1912, 1923, 71, 71, 1926, 1916,
-
- 71, 1927, 71, 71, 2631, 1929, 71, 1930, 71, 1928,
- 1933, 1918, 71, 71, 71, 1931, 1922, 1937, 71, 1924,
- 1938, 1934, 1923, 1935, 1942, 1926, 71, 71, 71, 71,
- 1932, 71, 1929, 1940, 1930, 71, 1928, 71, 1936, 1939,
- 1941, 71, 1931, 71, 71, 71, 71, 1938, 1934, 1946,
- 1935, 71, 1944, 1943, 1948, 1947, 1945, 1932, 1949, 1952,
- 1940, 71, 71, 71, 71, 1936, 1939, 1941, 71, 1950,
- 71, 71, 1951, 2631, 71, 1953, 71, 71, 1954, 1944,
- 1943, 1948, 1947, 1945, 1955, 1949, 1952, 1956, 1957, 1958,
- 71, 1959, 1964, 71, 2631, 1960, 1950, 71, 71, 1951,
-
- 71, 1961, 1953, 71, 1962, 1954, 71, 1963, 1965, 71,
- 1966, 1955, 71, 1967, 1956, 1957, 1958, 71, 1959, 71,
- 1968, 1969, 1960, 71, 71, 1970, 71, 71, 1961, 1972,
- 71, 1962, 1971, 1973, 1963, 1965, 1976, 1966, 71, 71,
- 1967, 1974, 71, 71, 1975, 1978, 1977, 1968, 1969, 1979,
- 71, 71, 1970, 1981, 71, 1982, 1972, 1980, 1983, 1971,
- 71, 1985, 1986, 1976, 71, 71, 1988, 1984, 1974, 71,
- 2631, 1975, 71, 1977, 71, 71, 1979, 71, 71, 1987,
- 1981, 71, 1982, 1990, 1980, 1983, 1991, 1989, 71, 1986,
- 1993, 1992, 1994, 1988, 1984, 71, 1995, 71, 71, 71,
-
- 1996, 71, 1997, 1999, 1998, 2000, 1987, 2001, 2002, 2003,
- 1990, 71, 71, 1991, 1989, 71, 2004, 1993, 1992, 1994,
- 2006, 2009, 71, 1995, 2007, 71, 2005, 71, 71, 71,
- 1999, 1998, 71, 71, 2008, 71, 2003, 71, 2010, 71,
- 2011, 71, 71, 2004, 71, 2013, 2012, 2006, 2009, 2015,
- 2631, 2007, 71, 2005, 2014, 2018, 71, 2016, 2017, 2019,
- 71, 2008, 71, 2021, 71, 2010, 71, 71, 71, 2020,
- 2025, 71, 2013, 2012, 2023, 2026, 2015, 71, 71, 2022,
- 2035, 2014, 2018, 71, 2016, 2017, 2019, 2024, 2028, 2027,
- 2029, 71, 71, 2030, 2031, 71, 2020, 2025, 71, 2033,
-
- 71, 2023, 2037, 71, 2032, 71, 2022, 71, 71, 2034,
- 2045, 2039, 71, 71, 2024, 2028, 2027, 2029, 71, 71,
- 2030, 2031, 2036, 2038, 2040, 71, 2033, 2043, 2044, 71,
- 2041, 2032, 71, 71, 2042, 2047, 2034, 71, 71, 2046,
- 2048, 71, 71, 2051, 2052, 71, 71, 2049, 2054, 2036,
- 2038, 2040, 71, 2631, 71, 71, 71, 2041, 71, 2053,
- 2050, 2042, 2047, 2055, 2056, 71, 2046, 2048, 71, 71,
- 2051, 71, 71, 2057, 2049, 2058, 71, 71, 2060, 2059,
- 71, 2061, 2065, 71, 2631, 2062, 2053, 2050, 71, 2063,
- 2055, 2056, 2064, 2067, 2068, 71, 2069, 2066, 2070, 2071,
-
- 71, 2074, 2058, 2072, 71, 2060, 2059, 71, 71, 2065,
- 71, 71, 2062, 2073, 2078, 71, 2063, 71, 71, 2064,
- 2067, 71, 71, 71, 2066, 71, 71, 71, 2074, 2075,
- 2072, 2076, 2077, 2079, 2080, 2081, 2083, 2082, 2084, 2631,
- 2073, 71, 2086, 71, 2085, 71, 71, 2087, 2631, 71,
- 71, 71, 2088, 2089, 71, 71, 2075, 71, 2076, 2077,
- 71, 71, 2081, 2083, 2082, 2084, 71, 2091, 2090, 2086,
- 71, 2085, 2093, 2092, 71, 71, 71, 2094, 2095, 2088,
- 2089, 71, 2098, 2099, 2101, 71, 2096, 2631, 71, 2097,
- 2103, 71, 2104, 2100, 2091, 2090, 71, 71, 71, 2093,
-
- 2092, 71, 2102, 71, 2094, 2095, 2105, 2106, 71, 2098,
- 2099, 2101, 71, 2096, 71, 71, 2097, 2103, 2107, 2104,
- 2100, 2108, 2109, 2110, 2111, 2114, 2631, 2113, 2112, 2102,
- 71, 71, 71, 71, 71, 71, 71, 2631, 2116, 71,
- 2631, 2631, 2119, 2120, 71, 2107, 2115, 71, 2108, 2109,
- 2110, 2111, 2114, 71, 2113, 2112, 71, 2117, 2118, 2121,
- 2122, 2125, 2123, 2124, 71, 2116, 2126, 71, 71, 2119,
- 71, 71, 71, 2115, 2127, 2631, 2133, 71, 71, 2131,
- 2132, 71, 2128, 71, 2117, 2118, 2121, 71, 2125, 2123,
- 2124, 71, 2129, 2126, 2130, 2134, 2137, 2136, 2135, 2631,
-
- 2142, 2127, 71, 71, 71, 71, 71, 71, 71, 2128,
- 71, 2141, 2140, 2138, 2631, 2144, 2143, 2146, 71, 2129,
- 71, 2130, 2134, 2137, 2136, 2135, 2139, 71, 2631, 2145,
- 2151, 2154, 2631, 71, 71, 71, 71, 71, 2141, 2140,
- 2138, 71, 71, 2143, 2146, 2147, 2148, 2150, 2149, 2152,
- 2153, 2156, 71, 2139, 71, 71, 2145, 71, 71, 71,
- 2155, 71, 2157, 71, 2158, 2159, 2631, 2162, 2164, 2163,
- 2166, 71, 2147, 2148, 2150, 2149, 2152, 2153, 2156, 71,
- 2167, 2160, 2165, 71, 71, 71, 2161, 2155, 71, 2157,
- 71, 71, 2159, 71, 71, 71, 2163, 71, 2168, 2631,
-
- 2169, 2170, 71, 2171, 2172, 2173, 71, 2167, 2160, 2165,
- 2174, 2175, 2177, 2161, 2631, 2631, 2176, 71, 71, 2631,
- 2182, 2178, 71, 71, 2183, 71, 71, 2169, 2170, 71,
- 2171, 2172, 2173, 71, 71, 2180, 2179, 2174, 2175, 2177,
- 71, 2181, 71, 2176, 71, 2184, 71, 2182, 2178, 2185,
- 2186, 2183, 2188, 71, 71, 2187, 2189, 71, 2190, 2191,
- 2193, 2631, 2180, 2179, 2631, 71, 2192, 71, 2181, 2194,
- 2195, 2196, 2184, 2197, 71, 71, 71, 71, 2199, 2188,
- 2198, 71, 2187, 2189, 2200, 2190, 71, 2193, 71, 2201,
- 2202, 71, 71, 2192, 71, 2204, 2194, 2195, 71, 2203,
-
- 71, 2205, 71, 2206, 2207, 2199, 2208, 2198, 2631, 2631,
- 2209, 2631, 71, 2210, 2212, 2631, 71, 2202, 71, 2211,
- 2213, 71, 71, 2214, 71, 71, 2203, 71, 2205, 71,
- 2206, 2207, 2219, 2208, 71, 71, 2217, 2209, 71, 2215,
- 2210, 2212, 71, 2216, 2218, 71, 2211, 2213, 71, 2220,
- 2214, 2224, 2221, 2228, 71, 2631, 2223, 71, 71, 2219,
- 71, 2222, 71, 2217, 71, 2225, 2215, 71, 71, 2226,
- 2216, 2218, 2227, 71, 2229, 2232, 2220, 2230, 71, 2221,
- 71, 2234, 71, 2223, 71, 2233, 2231, 71, 2222, 71,
- 2631, 2235, 2225, 71, 2236, 2238, 2226, 2237, 71, 2227,
-
- 2239, 2229, 2232, 2242, 2230, 2243, 2240, 2244, 71, 71,
- 71, 2245, 2246, 2231, 2241, 71, 71, 71, 2235, 71,
- 2249, 2236, 2238, 71, 2237, 2250, 71, 2239, 2247, 71,
- 2242, 2251, 71, 2240, 71, 71, 2248, 2252, 71, 71,
- 2253, 2241, 2254, 71, 2255, 2256, 71, 2249, 2257, 71,
- 2258, 2261, 71, 2259, 2262, 2247, 2631, 2631, 71, 2263,
- 71, 71, 71, 2248, 2252, 2260, 2270, 2253, 2264, 71,
- 71, 2255, 71, 2265, 2269, 2257, 2272, 71, 71, 2273,
- 2259, 71, 71, 71, 2266, 2274, 2263, 2267, 71, 2268,
- 2275, 2271, 2260, 71, 71, 71, 71, 2276, 71, 71,
-
- 71, 2269, 2277, 2272, 71, 2631, 71, 71, 2278, 71,
- 2631, 2266, 2274, 2282, 2267, 2281, 2268, 2275, 2271, 2285,
- 2284, 71, 71, 2283, 2276, 2287, 2279, 2280, 2631, 2277,
- 71, 2286, 71, 71, 2289, 2278, 71, 71, 2290, 71,
- 2282, 2288, 2281, 2291, 71, 2292, 71, 2284, 2293, 71,
- 2283, 2294, 2287, 2279, 2280, 2295, 2296, 71, 2286, 71,
- 71, 2289, 71, 2297, 71, 2290, 2300, 2298, 2288, 71,
- 2291, 71, 2292, 71, 71, 2293, 2301, 2299, 2294, 2302,
- 2303, 71, 2295, 2296, 71, 2304, 2305, 2306, 71, 2308,
- 2297, 2309, 2307, 71, 2298, 2631, 2312, 2310, 71, 2311,
-
- 71, 2315, 2631, 2301, 2299, 71, 2302, 71, 71, 71,
- 71, 2316, 2304, 71, 2306, 71, 2308, 71, 71, 2307,
- 71, 2317, 2313, 2312, 2310, 2318, 2311, 2314, 2315, 71,
- 2319, 2320, 2321, 71, 2322, 2323, 2330, 2631, 2316, 71,
- 2325, 71, 2324, 71, 2331, 71, 2327, 2326, 71, 71,
- 2328, 2332, 2318, 2329, 71, 2631, 2631, 2319, 2320, 2321,
- 2336, 2322, 2323, 71, 71, 71, 71, 2325, 71, 2324,
- 2333, 71, 2334, 2327, 2326, 2335, 71, 2328, 71, 71,
- 2329, 2337, 71, 71, 2338, 2339, 2631, 2336, 71, 2340,
- 2342, 2341, 2343, 2345, 2344, 2347, 71, 2333, 2631, 2334,
-
- 71, 2348, 2335, 71, 2350, 2631, 71, 71, 2346, 71,
- 71, 2338, 2339, 71, 71, 2349, 71, 2342, 2341, 2343,
- 2351, 2344, 71, 2352, 2356, 71, 2353, 71, 2348, 2355,
- 2354, 71, 71, 2357, 71, 2346, 2358, 71, 2359, 71,
- 71, 2360, 2349, 2362, 2363, 2365, 2361, 2351, 71, 71,
- 2352, 2356, 71, 2353, 71, 2364, 2355, 2354, 71, 2367,
- 2357, 71, 2368, 2358, 2366, 2359, 2372, 2369, 71, 2371,
- 71, 71, 71, 2361, 71, 71, 2370, 71, 2374, 2375,
- 71, 71, 2364, 71, 2373, 2376, 2367, 2389, 2377, 71,
- 2379, 2366, 71, 2372, 2369, 2380, 2371, 71, 2382, 2384,
-
- 2385, 2381, 71, 2370, 2386, 2374, 71, 2378, 71, 71,
- 2390, 2373, 71, 71, 2383, 71, 2388, 2379, 2387, 71,
- 2391, 71, 2380, 71, 71, 2382, 71, 2385, 2381, 2392,
- 71, 2386, 2394, 71, 2378, 2395, 2397, 71, 2396, 2393,
- 2400, 2383, 2401, 2388, 71, 2387, 71, 2391, 71, 2403,
- 2398, 2399, 2404, 2405, 71, 2402, 2408, 71, 2406, 2394,
- 71, 71, 2395, 71, 2407, 2396, 2393, 71, 71, 71,
- 2409, 71, 2410, 2411, 2412, 71, 71, 2398, 2399, 71,
- 2405, 2413, 2402, 71, 2415, 2406, 71, 2414, 2416, 71,
- 2417, 2407, 71, 2420, 2419, 71, 2421, 71, 2418, 71,
-
- 2411, 71, 2422, 71, 2424, 71, 2423, 2425, 2413, 2631,
- 71, 2415, 71, 2426, 2414, 71, 2427, 2417, 71, 71,
- 71, 2419, 2430, 2421, 2428, 2418, 71, 2431, 2429, 71,
- 2631, 71, 2432, 2423, 2425, 71, 71, 2433, 71, 2434,
- 71, 2435, 71, 2427, 71, 2436, 2438, 71, 71, 2430,
- 2444, 2428, 71, 71, 2431, 2429, 71, 71, 2437, 2432,
- 2439, 2440, 2442, 2441, 2433, 2445, 2434, 71, 2435, 71,
- 71, 2443, 2436, 2438, 2446, 2447, 2448, 71, 71, 2449,
- 2450, 2631, 2451, 2452, 71, 2437, 2453, 2439, 2440, 2442,
- 2441, 2454, 71, 2455, 2456, 71, 2457, 71, 2443, 2458,
-
- 2462, 2446, 71, 71, 71, 71, 2459, 2460, 71, 2451,
- 71, 71, 2461, 2453, 71, 71, 2463, 2464, 2454, 71,
- 71, 2456, 2470, 2457, 2465, 71, 2458, 71, 2471, 71,
- 71, 2468, 2466, 2459, 2460, 2467, 2469, 2472, 71, 2461,
- 2631, 2473, 2477, 71, 2464, 2474, 71, 71, 2475, 71,
- 71, 2465, 2476, 2478, 71, 2471, 2479, 2480, 2481, 2466,
- 71, 2483, 2467, 71, 2472, 2484, 2485, 71, 2473, 71,
- 71, 2482, 2474, 2487, 2488, 2475, 2486, 2489, 71, 2476,
- 71, 2490, 2491, 71, 71, 71, 71, 2493, 71, 71,
- 71, 71, 71, 2485, 2492, 71, 2494, 2497, 2482, 71,
-
- 2487, 2488, 2495, 2486, 71, 71, 71, 2496, 2490, 2491,
- 71, 2498, 2631, 71, 2493, 2505, 2502, 2499, 2500, 2501,
- 2631, 2492, 71, 2494, 2497, 71, 71, 71, 2503, 2495,
- 71, 2504, 71, 71, 2506, 2508, 2513, 2507, 2498, 71,
- 71, 71, 2505, 2502, 2499, 2500, 2501, 71, 2509, 2510,
- 71, 71, 2512, 2511, 71, 2503, 2631, 2515, 2504, 2514,
- 2516, 2506, 2508, 2513, 2507, 71, 71, 71, 2521, 2523,
- 71, 71, 2524, 2518, 71, 2509, 2510, 2520, 71, 2512,
- 2511, 2517, 2519, 71, 2515, 71, 2514, 2516, 2522, 71,
- 71, 2525, 2526, 2527, 2631, 71, 71, 2529, 71, 2524,
-
- 2518, 71, 2631, 2528, 2520, 2530, 71, 2531, 2517, 2519,
- 71, 2532, 2534, 71, 2533, 2522, 2536, 2631, 71, 71,
- 2527, 71, 2535, 2537, 2529, 2538, 71, 71, 2540, 71,
- 2528, 71, 2530, 2539, 2531, 71, 2541, 71, 2532, 2542,
- 2543, 2533, 71, 71, 71, 2544, 2545, 2547, 71, 2535,
- 2537, 2631, 2538, 2551, 2631, 71, 2546, 2548, 71, 2550,
- 2539, 71, 71, 2541, 2549, 71, 2542, 2543, 2552, 71,
- 2553, 71, 71, 2554, 2547, 71, 71, 71, 71, 2555,
- 2551, 71, 2556, 2546, 2548, 2558, 2550, 2562, 2559, 2563,
- 2557, 2549, 71, 71, 2560, 2552, 71, 2553, 71, 2564,
-
- 2554, 2565, 2566, 71, 2570, 2561, 2555, 71, 2567, 2556,
- 71, 71, 2558, 71, 71, 2559, 2563, 2557, 2568, 2571,
- 2572, 2560, 2578, 2575, 71, 2569, 2573, 71, 2565, 2566,
- 71, 71, 2561, 71, 2574, 2567, 71, 2631, 2581, 2582,
- 71, 71, 71, 71, 2580, 2568, 2571, 71, 2576, 71,
- 2575, 2577, 2569, 2573, 71, 2579, 71, 2585, 71, 71,
- 2586, 2574, 2588, 71, 71, 2581, 71, 2583, 71, 2587,
- 2584, 2580, 2589, 2590, 2591, 2576, 71, 71, 2577, 71,
- 2592, 71, 2579, 2593, 2585, 71, 2595, 2586, 71, 2588,
- 2596, 2600, 2597, 2603, 2583, 71, 2587, 2584, 71, 2589,
-
- 2590, 2591, 2598, 2594, 2601, 2604, 2631, 2592, 2602, 71,
- 2593, 71, 71, 2595, 71, 2599, 71, 2596, 71, 2597,
- 71, 2605, 71, 71, 2607, 71, 71, 2609, 2606, 2598,
- 2594, 2601, 2604, 71, 2611, 2602, 71, 2608, 2612, 2610,
- 2616, 71, 2599, 2615, 2613, 71, 71, 71, 2605, 2614,
- 2617, 2607, 71, 2631, 71, 2606, 71, 71, 71, 2619,
- 71, 2611, 2620, 2621, 2608, 2612, 2610, 71, 2622, 71,
- 2615, 2613, 2618, 2623, 2624, 2625, 2614, 2617, 2629, 2627,
- 71, 2626, 2630, 71, 2628, 71, 2619, 71, 2631, 71,
- 2621, 2631, 71, 2631, 71, 71, 2631, 71, 2631, 2618,
-
- 71, 2624, 2625, 71, 2631, 71, 2627, 2631, 2626, 71,
- 2631, 2628, 43, 43, 43, 43, 43, 43, 43, 48,
- 48, 48, 48, 48, 48, 48, 53, 53, 53, 53,
- 53, 53, 53, 59, 59, 59, 59, 59, 59, 59,
- 64, 64, 64, 64, 64, 64, 64, 74, 74, 2631,
- 74, 74, 74, 74, 140, 140, 2631, 2631, 2631, 140,
- 140, 142, 142, 2631, 2631, 142, 2631, 142, 144, 2631,
- 2631, 2631, 2631, 2631, 144, 147, 147, 2631, 2631, 2631,
- 147, 147, 149, 2631, 2631, 2631, 2631, 2631, 149, 151,
- 151, 2631, 151, 151, 151, 151, 75, 75, 2631, 75,
-
- 75, 75, 75, 13, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631
+ 385, 972, 386, 379, 378, 71, 71, 381, 373, 71,
+ 380, 387, 71, 388, 71, 382, 71, 391, 392, 2749,
+ 71, 71, 2749, 383, 399, 384, 389, 385, 71, 386,
+ 2749, 401, 71, 71, 400, 409, 404, 71, 387, 415,
+ 388, 71, 71, 71, 391, 392, 393, 402, 2749, 394,
+ 71, 399, 405, 71, 395, 396, 397, 398, 401, 71,
+ 412, 400, 409, 404, 71, 403, 71, 71, 406, 407,
+ 413, 71, 71, 393, 402, 410, 394, 416, 411, 405,
+ 414, 395, 396, 397, 398, 71, 417, 412, 71, 418,
+ 2749, 420, 403, 71, 424, 406, 407, 413, 71, 71,
+
+ 419, 71, 410, 421, 416, 411, 71, 414, 422, 423,
+ 425, 71, 71, 417, 2749, 71, 418, 71, 420, 426,
+ 427, 71, 71, 428, 438, 2749, 71, 419, 469, 431,
+ 421, 432, 429, 1089, 433, 422, 423, 425, 430, 2749,
+ 439, 71, 71, 2749, 434, 71, 426, 71, 440, 71,
+ 428, 438, 71, 71, 71, 469, 431, 435, 432, 429,
+ 436, 433, 437, 71, 2749, 430, 453, 441, 71, 451,
+ 71, 434, 71, 442, 452, 440, 71, 443, 71, 454,
+ 71, 455, 457, 2749, 435, 444, 2749, 436, 2749, 437,
+ 465, 71, 71, 453, 441, 71, 451, 456, 466, 2749,
+
+ 442, 452, 71, 471, 443, 71, 454, 2749, 455, 457,
+ 472, 71, 444, 445, 467, 446, 71, 465, 473, 468,
+ 470, 474, 71, 2749, 456, 466, 150, 475, 447, 71,
+ 471, 448, 2749, 449, 477, 450, 71, 472, 478, 71,
+ 445, 71, 446, 476, 71, 473, 71, 470, 474, 2749,
+ 487, 71, 481, 2749, 2749, 447, 71, 479, 448, 71,
+ 449, 477, 450, 458, 459, 478, 480, 482, 2749, 484,
+ 476, 483, 486, 460, 71, 461, 462, 463, 71, 481,
+ 464, 71, 71, 485, 71, 488, 489, 491, 71, 71,
+ 458, 459, 71, 480, 482, 490, 484, 2749, 483, 486,
+
+ 460, 71, 461, 462, 463, 71, 493, 464, 71, 492,
+ 485, 71, 488, 489, 498, 494, 497, 71, 499, 71,
+ 495, 496, 490, 71, 503, 71, 500, 2749, 2749, 71,
+ 501, 504, 507, 493, 506, 536, 492, 71, 2749, 71,
+ 518, 498, 494, 497, 71, 499, 505, 71, 502, 71,
+ 71, 503, 508, 500, 71, 71, 509, 501, 504, 507,
+ 71, 506, 536, 71, 510, 71, 514, 511, 515, 516,
+ 517, 2749, 71, 505, 524, 502, 519, 71, 512, 508,
+ 513, 520, 71, 509, 71, 71, 521, 529, 71, 522,
+ 71, 510, 71, 514, 511, 515, 516, 517, 525, 523,
+
+ 71, 524, 71, 519, 527, 512, 71, 513, 520, 71,
+ 526, 71, 71, 521, 528, 530, 522, 531, 71, 71,
+ 2749, 532, 2749, 533, 534, 525, 523, 71, 537, 71,
+ 538, 527, 71, 540, 535, 71, 541, 526, 71, 71,
+ 71, 528, 530, 539, 531, 71, 71, 542, 532, 544,
+ 533, 534, 71, 543, 547, 537, 71, 538, 71, 71,
+ 540, 535, 71, 541, 545, 546, 548, 550, 555, 71,
+ 539, 71, 549, 71, 542, 71, 544, 557, 553, 71,
+ 543, 547, 71, 554, 71, 71, 551, 2749, 552, 556,
+ 71, 545, 546, 548, 550, 71, 71, 558, 559, 549,
+
+ 71, 560, 562, 564, 561, 553, 565, 71, 2749, 71,
+ 554, 71, 2749, 551, 563, 552, 556, 568, 569, 71,
+ 71, 71, 567, 71, 558, 559, 570, 71, 560, 566,
+ 564, 561, 71, 572, 71, 71, 571, 2749, 71, 71,
+ 573, 563, 574, 575, 568, 569, 2749, 2749, 587, 567,
+ 576, 2749, 71, 570, 71, 71, 566, 588, 71, 71,
+ 572, 585, 586, 571, 71, 71, 2749, 573, 71, 574,
+ 575, 71, 590, 607, 71, 587, 2749, 576, 577, 589,
+ 591, 71, 592, 578, 588, 579, 593, 594, 585, 586,
+ 71, 580, 2749, 581, 71, 71, 582, 583, 71, 590,
+
+ 607, 595, 71, 584, 71, 577, 589, 591, 71, 592,
+ 578, 596, 579, 593, 594, 598, 2749, 599, 580, 71,
+ 581, 597, 600, 582, 583, 601, 71, 603, 595, 71,
+ 584, 602, 605, 71, 604, 608, 2749, 610, 606, 616,
+ 71, 71, 598, 71, 599, 609, 71, 71, 597, 600,
+ 71, 71, 601, 71, 603, 71, 613, 612, 602, 605,
+ 611, 604, 608, 614, 610, 606, 615, 71, 71, 71,
+ 617, 71, 609, 623, 618, 627, 628, 71, 620, 630,
+ 619, 71, 621, 613, 612, 71, 71, 611, 71, 150,
+ 614, 71, 624, 615, 71, 622, 71, 617, 625, 626,
+
+ 623, 618, 71, 633, 71, 620, 71, 619, 71, 621,
+ 632, 71, 629, 631, 634, 71, 643, 645, 71, 624,
+ 635, 639, 622, 71, 640, 625, 626, 71, 71, 641,
+ 633, 644, 71, 646, 71, 636, 71, 632, 642, 629,
+ 631, 634, 637, 71, 71, 638, 647, 635, 639, 71,
+ 648, 649, 71, 71, 651, 658, 71, 71, 71, 650,
+ 71, 653, 636, 652, 2749, 642, 655, 654, 663, 637,
+ 71, 71, 638, 71, 657, 659, 71, 656, 649, 1205,
+ 71, 651, 71, 71, 661, 71, 650, 71, 653, 2749,
+ 652, 71, 662, 655, 654, 664, 660, 71, 71, 71,
+
+ 71, 657, 659, 665, 656, 71, 71, 71, 670, 666,
+ 672, 661, 669, 674, 667, 671, 71, 71, 668, 662,
+ 2749, 71, 664, 660, 71, 673, 71, 676, 677, 678,
+ 665, 675, 71, 71, 71, 670, 666, 672, 679, 669,
+ 674, 667, 671, 71, 681, 668, 71, 71, 682, 2749,
+ 686, 683, 673, 71, 685, 677, 678, 684, 675, 71,
+ 680, 71, 2749, 71, 71, 679, 71, 687, 71, 688,
+ 689, 681, 71, 71, 690, 682, 71, 686, 683, 691,
+ 692, 685, 693, 694, 684, 695, 697, 680, 2749, 71,
+ 71, 696, 71, 698, 687, 71, 688, 71, 699, 700,
+
+ 701, 690, 71, 702, 71, 703, 691, 692, 71, 71,
+ 694, 71, 695, 697, 71, 71, 704, 711, 696, 705,
+ 698, 713, 71, 707, 706, 699, 708, 701, 712, 71,
+ 714, 71, 703, 709, 710, 71, 71, 71, 71, 71,
+ 71, 71, 717, 704, 715, 719, 2749, 740, 713, 71,
+ 707, 71, 71, 708, 718, 712, 722, 714, 720, 716,
+ 709, 710, 723, 721, 71, 725, 724, 71, 71, 71,
+ 726, 715, 719, 71, 71, 727, 728, 732, 729, 71,
+ 730, 718, 71, 722, 71, 71, 716, 71, 71, 723,
+ 71, 71, 725, 724, 731, 71, 733, 726, 734, 735,
+
+ 71, 71, 727, 728, 732, 729, 736, 730, 737, 738,
+ 71, 71, 742, 2749, 71, 71, 71, 739, 741, 745,
+ 743, 731, 744, 733, 71, 734, 735, 71, 71, 71,
+ 71, 71, 746, 736, 747, 737, 738, 751, 750, 742,
+ 754, 71, 71, 71, 739, 741, 745, 743, 748, 744,
+ 749, 71, 753, 752, 758, 756, 71, 71, 71, 746,
+ 71, 747, 755, 71, 751, 750, 71, 754, 71, 2749,
+ 757, 759, 760, 761, 762, 748, 71, 749, 71, 753,
+ 752, 758, 756, 763, 71, 766, 764, 765, 2749, 755,
+ 768, 71, 2749, 71, 71, 71, 71, 757, 759, 760,
+
+ 761, 762, 767, 71, 769, 71, 770, 71, 71, 772,
+ 763, 771, 766, 764, 765, 71, 778, 768, 775, 71,
+ 777, 773, 774, 784, 776, 781, 71, 2749, 150, 767,
+ 71, 769, 71, 770, 71, 71, 772, 71, 771, 782,
+ 71, 2749, 779, 71, 786, 775, 783, 777, 773, 774,
+ 780, 776, 71, 785, 71, 71, 788, 71, 789, 787,
+ 71, 792, 790, 2749, 791, 71, 782, 71, 71, 779,
+ 71, 786, 794, 783, 71, 800, 793, 780, 71, 71,
+ 785, 71, 801, 788, 71, 803, 787, 71, 792, 790,
+ 71, 791, 71, 805, 2749, 802, 804, 811, 806, 794,
+
+ 2749, 807, 800, 793, 795, 2749, 71, 71, 796, 801,
+ 810, 797, 803, 71, 808, 2749, 71, 71, 798, 809,
+ 805, 799, 802, 804, 71, 806, 71, 71, 807, 71,
+ 71, 795, 71, 2749, 819, 796, 820, 810, 797, 2749,
+ 2749, 808, 71, 824, 821, 798, 809, 826, 799, 812,
+ 813, 2749, 814, 71, 823, 815, 71, 822, 2749, 71,
+ 816, 819, 828, 820, 829, 825, 817, 818, 827, 2749,
+ 71, 821, 830, 71, 826, 71, 812, 813, 71, 814,
+ 71, 823, 815, 831, 822, 71, 71, 816, 71, 828,
+ 832, 829, 825, 817, 818, 827, 71, 833, 834, 830,
+
+ 835, 836, 838, 837, 840, 71, 71, 839, 71, 841,
+ 831, 71, 71, 842, 845, 71, 71, 832, 847, 71,
+ 851, 71, 71, 71, 833, 834, 843, 835, 836, 838,
+ 837, 840, 844, 71, 839, 71, 841, 848, 846, 71,
+ 842, 845, 849, 852, 850, 71, 853, 71, 2749, 855,
+ 860, 854, 71, 843, 857, 856, 861, 858, 71, 844,
+ 71, 864, 862, 71, 2749, 846, 71, 859, 71, 71,
+ 71, 850, 71, 853, 71, 71, 855, 860, 854, 71,
+ 71, 857, 856, 71, 858, 863, 2749, 71, 865, 862,
+ 866, 867, 868, 71, 859, 869, 71, 870, 871, 873,
+
+ 2749, 71, 874, 872, 71, 2749, 882, 878, 71, 71,
+ 71, 875, 863, 71, 71, 865, 71, 866, 867, 868,
+ 71, 71, 869, 71, 870, 871, 873, 876, 71, 874,
+ 872, 877, 879, 71, 878, 71, 881, 883, 875, 2749,
+ 880, 885, 2749, 71, 884, 886, 887, 71, 2749, 71,
+ 888, 891, 71, 71, 876, 71, 71, 890, 877, 879,
+ 894, 71, 889, 881, 883, 2749, 71, 880, 885, 71,
+ 892, 884, 886, 887, 71, 71, 895, 888, 891, 71,
+ 893, 896, 897, 899, 890, 898, 900, 902, 71, 889,
+ 71, 2749, 71, 901, 71, 903, 71, 892, 71, 71,
+
+ 904, 907, 71, 895, 71, 909, 71, 893, 896, 897,
+ 899, 918, 898, 900, 71, 71, 905, 906, 71, 908,
+ 901, 910, 903, 71, 71, 911, 71, 904, 907, 912,
+ 913, 914, 915, 71, 71, 921, 71, 71, 918, 920,
+ 71, 919, 923, 905, 906, 916, 908, 71, 910, 922,
+ 924, 71, 925, 917, 71, 927, 912, 71, 914, 915,
+ 71, 930, 71, 926, 71, 71, 920, 71, 919, 923,
+ 71, 929, 916, 71, 928, 931, 922, 924, 2749, 933,
+ 917, 932, 71, 71, 71, 935, 934, 71, 150, 936,
+ 926, 71, 71, 71, 938, 937, 939, 71, 929, 948,
+
+ 940, 928, 931, 71, 71, 71, 933, 71, 932, 71,
+ 949, 71, 935, 934, 941, 2749, 936, 2749, 950, 2749,
+ 71, 938, 937, 939, 952, 71, 948, 940, 2749, 951,
+ 71, 71, 955, 71, 953, 960, 954, 949, 957, 2749,
+ 956, 941, 942, 958, 943, 950, 71, 71, 944, 71,
+ 945, 952, 959, 71, 71, 946, 951, 969, 71, 955,
+ 947, 953, 960, 954, 961, 71, 71, 956, 962, 942,
+ 71, 943, 964, 965, 966, 944, 71, 945, 963, 959,
+ 71, 968, 946, 967, 970, 971, 71, 947, 973, 71,
+ 71, 961, 983, 2749, 71, 962, 71, 987, 974, 964,
+
+ 965, 966, 71, 986, 975, 963, 71, 71, 968, 985,
+ 967, 984, 71, 71, 990, 989, 71, 995, 71, 983,
+ 71, 988, 71, 71, 987, 974, 993, 71, 2749, 2749,
+ 986, 975, 976, 71, 71, 2749, 985, 977, 984, 978,
+ 994, 990, 989, 71, 991, 979, 992, 998, 988, 71,
+ 980, 981, 71, 71, 71, 996, 999, 982, 71, 976,
+ 997, 71, 1001, 71, 977, 1002, 978, 994, 71, 1000,
+ 71, 991, 979, 992, 998, 1003, 1005, 980, 981, 71,
+ 1006, 2749, 996, 71, 982, 2749, 1004, 997, 71, 1001,
+ 1008, 71, 1002, 71, 1009, 1007, 1000, 71, 71, 1011,
+
+ 1012, 71, 1003, 71, 1015, 1010, 71, 1006, 71, 1016,
+ 1013, 1014, 71, 1004, 2749, 71, 1019, 1008, 71, 1017,
+ 1018, 1009, 1007, 1022, 71, 71, 1011, 1012, 71, 71,
+ 71, 1015, 1010, 71, 1023, 1020, 1021, 1013, 1014, 1025,
+ 1027, 71, 1024, 1019, 71, 71, 1017, 1018, 71, 1026,
+ 1022, 1028, 2749, 1030, 1035, 1034, 71, 71, 1031, 1029,
+ 1040, 1023, 1020, 1021, 71, 71, 1025, 71, 1032, 1024,
+ 71, 1033, 71, 1036, 1037, 71, 1026, 1038, 1028, 71,
+ 71, 1035, 1034, 71, 1039, 71, 1029, 1042, 1043, 2749,
+ 1041, 71, 71, 1044, 71, 1032, 71, 71, 1033, 71,
+
+ 1036, 1037, 1045, 1046, 1038, 1047, 1048, 1050, 1054, 1049,
+ 1052, 1039, 71, 2749, 1051, 1043, 71, 1041, 1053, 71,
+ 1044, 71, 71, 1055, 71, 71, 1056, 1058, 71, 1045,
+ 1046, 71, 1047, 1048, 1050, 71, 1049, 1052, 1057, 71,
+ 71, 1051, 1061, 1059, 71, 1053, 1063, 71, 1060, 71,
+ 71, 71, 71, 1056, 1058, 1062, 71, 1064, 1065, 1066,
+ 71, 1067, 1069, 2749, 1072, 1057, 2749, 2749, 1070, 1061,
+ 1059, 1068, 1073, 1063, 1074, 1060, 2749, 71, 1071, 71,
+ 1076, 71, 1062, 71, 1077, 71, 1066, 1078, 1067, 71,
+ 71, 1075, 71, 71, 71, 1070, 71, 1079, 1068, 71,
+
+ 71, 1074, 1080, 71, 71, 1071, 71, 1076, 71, 1081,
+ 1082, 1077, 1084, 1083, 1078, 2749, 1085, 71, 1075, 1086,
+ 1087, 1088, 1090, 2749, 1079, 71, 1091, 71, 1095, 1080,
+ 1092, 71, 1096, 71, 71, 1093, 71, 71, 71, 1084,
+ 1083, 71, 71, 71, 71, 71, 1086, 1087, 1088, 1090,
+ 1094, 1097, 1098, 1091, 1099, 71, 1100, 1092, 71, 1096,
+ 1101, 1102, 1093, 71, 1103, 1104, 2749, 71, 71, 2749,
+ 2749, 1105, 1107, 2749, 71, 1106, 71, 1094, 1097, 1098,
+ 1111, 1099, 1108, 1100, 1110, 2749, 2749, 71, 1102, 1116,
+ 1109, 2749, 71, 71, 71, 71, 71, 71, 1105, 1107,
+
+ 71, 1113, 1106, 71, 1112, 1115, 71, 1111, 1114, 1108,
+ 1117, 1110, 71, 71, 1119, 1118, 71, 1109, 1120, 1159,
+ 71, 71, 1121, 71, 71, 2749, 71, 2749, 1113, 71,
+ 2749, 1112, 1115, 1126, 1127, 1114, 1133, 1117, 2749, 71,
+ 1129, 1119, 1118, 1122, 1128, 1120, 1131, 2749, 1130, 1121,
+ 1132, 71, 1123, 71, 1124, 71, 71, 1125, 71, 71,
+ 1126, 1127, 1136, 1133, 71, 71, 1134, 1129, 71, 1135,
+ 1122, 1128, 71, 1131, 71, 1130, 1138, 1132, 71, 1123,
+ 1137, 1124, 1139, 1140, 1125, 1144, 1141, 1143, 71, 1136,
+ 71, 71, 1142, 1134, 1145, 2749, 1135, 71, 1149, 1148,
+
+ 2749, 2749, 1147, 71, 71, 71, 71, 1137, 71, 1139,
+ 1140, 71, 1144, 1141, 1143, 71, 1146, 71, 71, 1142,
+ 1150, 1145, 1151, 1153, 71, 1149, 1148, 1152, 1155, 1147,
+ 71, 1154, 71, 71, 1156, 71, 1164, 1157, 1158, 2749,
+ 71, 71, 2749, 1146, 71, 1179, 1160, 1150, 1161, 1151,
+ 1153, 71, 71, 1162, 1152, 1155, 71, 1163, 1154, 71,
+ 71, 1156, 1167, 1164, 1157, 1158, 1165, 71, 1168, 1169,
+ 71, 1166, 1177, 1160, 1170, 1161, 1178, 71, 2749, 71,
+ 1162, 71, 1180, 71, 1163, 1181, 71, 1183, 2749, 1167,
+ 2749, 1184, 2749, 2749, 71, 1168, 1169, 2749, 71, 1177,
+
+ 71, 1170, 1171, 1178, 1182, 1172, 1173, 71, 71, 1180,
+ 1174, 2749, 1181, 71, 1185, 1188, 1175, 1189, 1184, 71,
+ 1176, 1190, 71, 1186, 71, 1187, 1195, 1191, 71, 1171,
+ 1196, 1182, 1172, 1173, 1192, 2749, 71, 1174, 1197, 71,
+ 1193, 1185, 1188, 1175, 1189, 71, 1194, 1176, 1190, 71,
+ 1186, 71, 1187, 71, 1191, 71, 71, 1198, 71, 1206,
+ 71, 1192, 71, 2749, 1207, 1197, 1208, 1193, 1209, 1211,
+ 2749, 1204, 2749, 1194, 1212, 71, 2749, 71, 71, 2749,
+ 71, 1210, 1214, 1213, 1198, 1199, 1206, 71, 71, 1215,
+ 1200, 1207, 1201, 1208, 1202, 1209, 1203, 71, 1204, 71,
+
+ 1216, 71, 71, 71, 71, 1217, 1218, 1219, 1210, 1214,
+ 1213, 1220, 1199, 71, 71, 1221, 1215, 1200, 71, 1201,
+ 1224, 1202, 1222, 1203, 71, 1223, 71, 1216, 1225, 71,
+ 71, 1226, 1217, 1218, 1219, 71, 1227, 71, 1220, 1228,
+ 1229, 1231, 1221, 71, 1230, 1234, 1233, 1224, 1232, 1222,
+ 1235, 71, 1223, 71, 71, 1225, 1236, 71, 1226, 1237,
+ 1238, 1241, 1259, 71, 2749, 71, 1228, 71, 1231, 71,
+ 71, 1230, 71, 1233, 1239, 1232, 1243, 1235, 1240, 1247,
+ 71, 1246, 71, 71, 71, 71, 1237, 1238, 71, 1242,
+ 1244, 1245, 2749, 1249, 71, 1248, 71, 71, 2749, 71,
+
+ 71, 1239, 1250, 1243, 71, 1240, 1247, 1251, 1246, 1252,
+ 1253, 1260, 1254, 71, 1255, 71, 1242, 1244, 1245, 71,
+ 1249, 1256, 1248, 71, 71, 1257, 71, 1261, 1262, 1250,
+ 1258, 71, 71, 2749, 1251, 1263, 1252, 1253, 71, 1254,
+ 1265, 1255, 71, 71, 71, 71, 1266, 1264, 1256, 71,
+ 1270, 1267, 1257, 71, 1261, 71, 71, 1258, 71, 1268,
+ 71, 1269, 1263, 1271, 1272, 71, 71, 1265, 1273, 1277,
+ 1274, 1279, 1276, 71, 1264, 1280, 1275, 1278, 1267, 71,
+ 71, 1285, 71, 71, 71, 71, 1268, 1281, 1269, 1284,
+ 71, 1272, 1302, 1318, 71, 71, 1277, 1274, 1279, 1276,
+
+ 71, 71, 1280, 1275, 1278, 1282, 1283, 71, 71, 1286,
+ 1288, 71, 1287, 71, 1281, 71, 1284, 1289, 71, 1291,
+ 1292, 1293, 1290, 1295, 71, 71, 2749, 2749, 71, 1294,
+ 1300, 2749, 1282, 1283, 71, 71, 1286, 1288, 71, 1287,
+ 71, 1296, 71, 1303, 1297, 1301, 1291, 1292, 1293, 71,
+ 1295, 1298, 1305, 71, 1299, 71, 1294, 1300, 71, 1304,
+ 71, 1306, 71, 1308, 2749, 1307, 71, 1309, 1296, 1310,
+ 1303, 1297, 1301, 71, 71, 71, 71, 1311, 1298, 1305,
+ 1312, 1299, 1314, 1315, 71, 71, 1304, 1317, 1306, 1313,
+ 1308, 71, 1307, 71, 1309, 71, 1310, 1319, 71, 1325,
+
+ 1326, 2749, 1316, 2749, 1311, 1320, 71, 1312, 71, 1314,
+ 1315, 71, 71, 71, 1317, 1321, 1313, 1324, 1322, 1323,
+ 71, 71, 1329, 1331, 1319, 71, 1325, 1326, 71, 1316,
+ 71, 71, 1320, 1327, 1328, 71, 1330, 1332, 1339, 1335,
+ 71, 1333, 1321, 71, 1324, 1322, 1323, 71, 1334, 1329,
+ 1331, 1336, 1337, 2749, 1338, 71, 2749, 2749, 71, 1340,
+ 1327, 1328, 71, 1330, 1332, 71, 1341, 1342, 1333, 1346,
+ 71, 71, 1343, 1348, 2749, 1334, 71, 1344, 71, 1337,
+ 71, 1338, 71, 71, 71, 71, 1340, 1345, 1349, 71,
+ 1347, 1364, 71, 1341, 1342, 71, 1346, 71, 1350, 1343,
+
+ 1348, 1351, 2749, 1352, 1344, 1356, 1360, 71, 1353, 71,
+ 71, 71, 71, 1354, 1345, 1349, 1357, 1347, 1355, 1358,
+ 1368, 1359, 1361, 71, 71, 1350, 1366, 71, 1351, 71,
+ 71, 1362, 1356, 1360, 71, 71, 1365, 71, 71, 1367,
+ 2749, 1363, 71, 1357, 1373, 71, 1358, 1369, 1359, 1361,
+ 71, 1370, 71, 1366, 1371, 71, 1372, 71, 1362, 71,
+ 71, 1374, 71, 1365, 71, 1375, 1367, 71, 1363, 1376,
+ 1377, 1373, 1378, 1379, 1369, 2749, 1380, 71, 1370, 1381,
+ 2749, 1371, 1392, 1372, 2749, 2749, 2749, 71, 1374, 1383,
+ 1382, 1384, 1375, 1388, 71, 71, 1376, 1377, 71, 1378,
+
+ 71, 1389, 71, 1380, 71, 71, 1381, 71, 1385, 71,
+ 1393, 1391, 1386, 71, 1390, 71, 1383, 1382, 1384, 1395,
+ 1388, 71, 71, 1394, 1396, 1387, 1401, 1397, 1389, 1399,
+ 1400, 1398, 71, 71, 71, 1385, 71, 1393, 1391, 1386,
+ 71, 1390, 71, 1403, 1404, 71, 1395, 71, 1402, 71,
+ 1394, 1396, 1387, 71, 1397, 1405, 1399, 71, 1398, 1406,
+ 1407, 1408, 71, 1409, 2749, 1410, 71, 1411, 1414, 1412,
+ 1403, 1404, 1413, 2749, 1415, 1402, 71, 1416, 71, 71,
+ 1418, 71, 1405, 1419, 2749, 71, 71, 71, 1408, 71,
+ 71, 71, 1410, 71, 1411, 1414, 1412, 1417, 2749, 1413,
+
+ 71, 1415, 71, 71, 1416, 1420, 1421, 1418, 1423, 71,
+ 1419, 1422, 1424, 71, 71, 1425, 1426, 1427, 71, 1429,
+ 2749, 1430, 1428, 2749, 1417, 71, 71, 1433, 71, 2749,
+ 1435, 1431, 1420, 1421, 71, 1423, 71, 71, 1422, 1424,
+ 1432, 1436, 1425, 1426, 71, 71, 1429, 71, 1430, 1428,
+ 71, 1434, 71, 1437, 1433, 1443, 71, 1435, 1431, 71,
+ 1438, 1441, 71, 1439, 1440, 1447, 2749, 1432, 71, 1452,
+ 1442, 71, 71, 71, 71, 1450, 1444, 1445, 1434, 1446,
+ 1437, 71, 1443, 71, 71, 1448, 71, 1438, 1441, 1449,
+ 1439, 1440, 1447, 1451, 1454, 1455, 71, 1442, 71, 2749,
+
+ 71, 71, 1450, 1444, 1445, 1456, 1446, 71, 71, 1458,
+ 1453, 1457, 1448, 1459, 1463, 71, 1449, 71, 1460, 71,
+ 1451, 71, 1455, 1461, 2749, 1462, 71, 71, 1467, 1466,
+ 71, 1465, 71, 1464, 2749, 71, 1458, 1453, 1457, 1469,
+ 1459, 1463, 71, 71, 1468, 1460, 71, 1473, 1474, 71,
+ 1461, 71, 1462, 71, 71, 1467, 1466, 1478, 1465, 71,
+ 1464, 1470, 1475, 1479, 1471, 1476, 1469, 1477, 2749, 71,
+ 71, 1468, 1481, 1485, 1480, 1474, 1472, 2749, 1482, 71,
+ 71, 71, 71, 1484, 1478, 71, 1483, 71, 1470, 1475,
+ 1489, 1471, 1476, 1488, 1477, 71, 71, 71, 71, 1481,
+
+ 1485, 1480, 1487, 1472, 71, 1482, 1486, 1490, 71, 71,
+ 1484, 1492, 2749, 1483, 71, 1491, 2749, 71, 1494, 1493,
+ 1488, 1495, 71, 71, 1498, 1496, 1497, 1499, 1500, 1487,
+ 1504, 71, 2749, 1486, 71, 71, 1501, 71, 2749, 71,
+ 71, 71, 1491, 71, 1502, 1494, 1493, 71, 71, 71,
+ 1503, 1498, 1496, 1497, 1499, 1500, 1507, 1509, 1505, 71,
+ 1506, 1510, 71, 1501, 71, 71, 1508, 71, 71, 71,
+ 1511, 1502, 71, 1512, 1513, 1515, 1514, 1503, 71, 1518,
+ 1517, 1516, 2749, 1507, 71, 1505, 71, 1506, 1510, 71,
+ 71, 71, 71, 1508, 1519, 1526, 1527, 1511, 71, 71,
+
+ 1512, 1513, 1515, 1514, 1522, 1523, 1518, 1517, 1516, 1520,
+ 1524, 1525, 1521, 71, 71, 71, 1528, 71, 1529, 71,
+ 1530, 1519, 1526, 71, 1531, 2749, 1532, 71, 1534, 2749,
+ 1535, 1522, 1523, 71, 1533, 1542, 1520, 1524, 1525, 1521,
+ 71, 71, 71, 71, 71, 1529, 1536, 1530, 1537, 1538,
+ 71, 71, 1539, 1532, 1540, 1534, 71, 1535, 1541, 1543,
+ 1544, 1533, 71, 2749, 71, 1546, 71, 71, 1545, 1547,
+ 1548, 2749, 71, 1536, 71, 1537, 1538, 71, 71, 1539,
+ 71, 1540, 1549, 1552, 71, 71, 1543, 1544, 1551, 1550,
+ 71, 1554, 1546, 1553, 71, 1545, 1547, 1548, 71, 1559,
+
+ 1560, 1557, 1562, 1555, 1558, 1565, 71, 1563, 71, 1549,
+ 1552, 71, 1561, 71, 71, 1551, 1550, 1556, 1554, 71,
+ 1553, 71, 1564, 1566, 1567, 1568, 1559, 1560, 1557, 71,
+ 1555, 1558, 71, 1569, 71, 71, 1570, 71, 1571, 1561,
+ 1572, 1574, 1578, 1573, 1556, 1579, 2749, 71, 1575, 1564,
+ 1566, 71, 1576, 71, 1587, 71, 71, 71, 1577, 71,
+ 1569, 71, 71, 1580, 1581, 1571, 1582, 1572, 71, 1578,
+ 1573, 71, 1579, 71, 1583, 1575, 71, 2749, 1584, 1576,
+ 1589, 1585, 1586, 71, 71, 1577, 71, 71, 71, 1588,
+ 1580, 1581, 71, 1582, 71, 71, 1591, 1590, 1592, 1593,
+
+ 1594, 1583, 1596, 71, 71, 1584, 71, 1589, 1585, 1586,
+ 1595, 71, 71, 1597, 1599, 1598, 1588, 1600, 1603, 71,
+ 71, 1601, 71, 1591, 1590, 1592, 1605, 1594, 1602, 71,
+ 2749, 71, 1616, 1609, 2749, 1604, 71, 1595, 71, 71,
+ 1597, 1599, 1598, 71, 1600, 1603, 71, 71, 1601, 1606,
+ 1607, 1608, 1611, 71, 1610, 1602, 1612, 71, 1613, 71,
+ 71, 1614, 1604, 1615, 71, 71, 1618, 71, 1620, 71,
+ 71, 71, 71, 71, 1617, 71, 1606, 1607, 1608, 1611,
+ 1621, 1610, 1619, 1612, 1622, 1613, 1623, 1624, 1614, 71,
+ 1615, 1625, 1626, 1618, 1629, 71, 2749, 1627, 2749, 1630,
+
+ 1628, 1617, 2749, 71, 71, 71, 71, 1621, 71, 1619,
+ 1631, 71, 71, 1623, 1624, 71, 1634, 1635, 71, 71,
+ 1632, 1629, 1633, 71, 1627, 71, 1630, 1628, 1637, 71,
+ 1636, 71, 1638, 1639, 1641, 71, 1642, 1631, 71, 1643,
+ 71, 71, 1644, 1634, 1635, 71, 1640, 1632, 71, 1633,
+ 1645, 71, 1650, 1647, 71, 1637, 71, 1636, 1648, 1638,
+ 1639, 1641, 1646, 1642, 71, 71, 71, 1649, 1651, 1652,
+ 71, 1654, 1658, 1640, 71, 1653, 1661, 1645, 71, 1650,
+ 1647, 1655, 71, 1659, 1656, 1648, 1660, 1657, 1662, 1646,
+ 71, 1664, 71, 71, 1649, 71, 71, 1666, 71, 71,
+
+ 71, 1667, 1653, 1661, 1663, 1669, 71, 71, 1655, 1668,
+ 1659, 1656, 1674, 71, 1657, 1665, 1676, 71, 71, 71,
+ 71, 71, 1675, 71, 1666, 1670, 1671, 1672, 71, 71,
+ 1680, 1663, 1673, 1678, 1677, 71, 1668, 71, 1679, 1674,
+ 71, 71, 1665, 71, 1681, 1684, 1682, 2749, 71, 1675,
+ 2749, 1683, 1670, 1671, 1672, 1688, 1685, 1680, 1687, 1673,
+ 1686, 1677, 71, 71, 71, 71, 1690, 71, 1693, 71,
+ 1694, 1681, 1691, 1682, 71, 1689, 71, 71, 1683, 71,
+ 1696, 1692, 71, 1685, 1695, 1687, 71, 1686, 1697, 1700,
+ 1702, 71, 71, 1690, 71, 1693, 1698, 71, 1699, 1691,
+
+ 1701, 1703, 1689, 1705, 71, 1709, 71, 71, 1692, 1712,
+ 71, 1695, 71, 1707, 71, 1697, 71, 1702, 1711, 71,
+ 1704, 71, 1708, 1698, 71, 1699, 1710, 1701, 1703, 71,
+ 1705, 1706, 71, 71, 1713, 1714, 1716, 71, 71, 1724,
+ 1707, 71, 1715, 1717, 71, 1711, 1719, 1704, 1718, 1708,
+ 71, 1721, 1720, 1710, 71, 1723, 71, 2749, 1706, 2749,
+ 71, 71, 71, 1716, 71, 1725, 71, 1722, 71, 1715,
+ 1717, 71, 71, 1719, 1726, 1718, 71, 1727, 1721, 1720,
+ 1729, 71, 1723, 1730, 1731, 1733, 71, 71, 1734, 1732,
+ 1736, 71, 1725, 1728, 1722, 1735, 71, 71, 1737, 1740,
+
+ 71, 1726, 1746, 2749, 1727, 1743, 1749, 1729, 71, 71,
+ 1730, 1731, 1733, 71, 1738, 1734, 1732, 71, 1741, 1739,
+ 1728, 71, 1735, 1742, 71, 1737, 71, 71, 1744, 1748,
+ 71, 1745, 1743, 71, 71, 71, 71, 1747, 71, 1750,
+ 1751, 1738, 1754, 1752, 1755, 1741, 1739, 1756, 1753, 71,
+ 1742, 71, 1757, 1758, 1759, 1744, 1748, 1761, 1745, 71,
+ 1760, 71, 1762, 71, 1747, 71, 1750, 1751, 1763, 71,
+ 1752, 71, 71, 1764, 1765, 1753, 1766, 1767, 71, 71,
+ 1769, 1776, 2749, 71, 1761, 71, 71, 1760, 1768, 71,
+ 1770, 1771, 1773, 71, 71, 1763, 71, 1774, 1777, 1772,
+
+ 1764, 1765, 1775, 1766, 1778, 71, 71, 71, 71, 71,
+ 1779, 71, 71, 1780, 71, 1768, 1781, 1770, 1771, 1773,
+ 1782, 71, 1784, 1791, 1774, 71, 1772, 1783, 71, 1775,
+ 2749, 1778, 1785, 1786, 71, 1787, 1788, 1789, 71, 1792,
+ 1780, 71, 71, 1781, 71, 71, 1790, 1782, 71, 1784,
+ 71, 71, 71, 1793, 1783, 1794, 71, 71, 1795, 1785,
+ 1786, 71, 1787, 1788, 1789, 1796, 1792, 1798, 71, 1797,
+ 1799, 1801, 71, 1790, 2749, 71, 71, 71, 71, 1800,
+ 1793, 1802, 1794, 2749, 1804, 71, 2749, 71, 1803, 1807,
+ 1806, 1809, 1796, 71, 1798, 1805, 1797, 1799, 1801, 71,
+
+ 1808, 71, 71, 1812, 1810, 1813, 1800, 71, 1818, 71,
+ 71, 1804, 1814, 71, 1811, 1803, 1807, 1806, 1809, 71,
+ 1820, 1816, 1805, 71, 1815, 1817, 71, 1808, 71, 71,
+ 71, 1810, 1813, 71, 1819, 71, 1822, 1821, 71, 1814,
+ 71, 1811, 1827, 1825, 71, 1824, 71, 1820, 1816, 1823,
+ 71, 1815, 1817, 1826, 2749, 2749, 1829, 1832, 71, 1830,
+ 71, 1819, 71, 71, 1821, 71, 1831, 1828, 71, 1827,
+ 1825, 71, 1824, 71, 71, 1833, 1823, 1834, 1836, 71,
+ 1826, 71, 1837, 1829, 1832, 71, 1830, 71, 1838, 1840,
+ 1835, 1839, 2749, 1831, 1828, 1841, 71, 71, 71, 1842,
+
+ 71, 1843, 1833, 1844, 1834, 1836, 1845, 1847, 71, 1837,
+ 2749, 1846, 1848, 2749, 2749, 71, 1840, 1835, 1839, 71,
+ 71, 71, 1841, 1849, 1850, 71, 1842, 1853, 1843, 71,
+ 1844, 71, 71, 1845, 1847, 1852, 1854, 1851, 1846, 1848,
+ 71, 71, 71, 1855, 71, 1856, 1857, 1858, 2749, 1860,
+ 1849, 1850, 71, 1859, 1853, 1862, 1863, 1868, 71, 1861,
+ 71, 1872, 1852, 71, 1851, 1864, 71, 71, 2749, 71,
+ 1855, 71, 1856, 1857, 1858, 71, 1860, 1865, 71, 71,
+ 1859, 1866, 1867, 1863, 71, 1869, 1861, 71, 1870, 71,
+ 1871, 1873, 1864, 71, 1874, 71, 71, 71, 2749, 1877,
+
+ 71, 1878, 2749, 1879, 1865, 1880, 1875, 2749, 1866, 1867,
+ 1884, 71, 1869, 71, 1876, 1870, 71, 1871, 1873, 71,
+ 1881, 1874, 2749, 2749, 1882, 71, 71, 1883, 1878, 71,
+ 1879, 71, 1880, 1875, 1885, 71, 2749, 1884, 71, 1886,
+ 71, 1876, 71, 1889, 1887, 1888, 1891, 1881, 1893, 1890,
+ 1894, 1882, 1892, 1895, 1883, 1898, 1896, 71, 71, 2749,
+ 1897, 1885, 71, 71, 71, 71, 71, 1903, 71, 71,
+ 1889, 71, 1888, 1891, 71, 1893, 1890, 1894, 1899, 1892,
+ 71, 1900, 1898, 1896, 1901, 1902, 1907, 1897, 1904, 71,
+ 2749, 71, 1909, 71, 1903, 1912, 1905, 1908, 1914, 71,
+
+ 71, 71, 1911, 1913, 71, 1899, 1917, 71, 1900, 1906,
+ 71, 1901, 1902, 1907, 1910, 1904, 71, 71, 1915, 1909,
+ 71, 71, 71, 1905, 1908, 71, 71, 1916, 71, 1911,
+ 1913, 1921, 1918, 1917, 1919, 1922, 1906, 1923, 1924, 1920,
+ 1935, 1910, 1925, 1926, 2749, 1915, 71, 2749, 1927, 71,
+ 71, 1931, 1938, 1930, 1916, 1932, 1940, 71, 2749, 1918,
+ 1937, 71, 1928, 71, 1923, 1924, 71, 71, 1933, 1925,
+ 71, 71, 71, 1929, 71, 1927, 1934, 1936, 71, 71,
+ 1930, 71, 1932, 71, 1939, 71, 71, 1937, 71, 1928,
+ 1941, 1942, 1943, 1946, 1944, 1933, 71, 71, 71, 71,
+
+ 1929, 1945, 1947, 1934, 1936, 1948, 71, 1949, 1951, 1954,
+ 2749, 1939, 2041, 71, 71, 71, 71, 1941, 1942, 1943,
+ 1946, 1944, 1950, 71, 1952, 1953, 1956, 71, 1945, 1947,
+ 1959, 71, 1948, 71, 1949, 71, 1954, 71, 1955, 71,
+ 1957, 71, 1958, 1960, 71, 2749, 1961, 71, 71, 1950,
+ 1962, 1952, 1953, 1956, 71, 1963, 1967, 71, 71, 71,
+ 1964, 1970, 71, 71, 71, 1955, 1965, 1957, 1969, 1958,
+ 1960, 71, 1966, 1961, 71, 1968, 1971, 1962, 71, 1973,
+ 71, 71, 1963, 1967, 1972, 2749, 1975, 1964, 71, 1976,
+ 1974, 1977, 71, 1965, 1980, 1969, 1978, 1983, 71, 1966,
+
+ 71, 1979, 1968, 1971, 71, 1984, 1973, 1981, 71, 1985,
+ 1982, 1972, 71, 1975, 1989, 71, 71, 1974, 71, 1986,
+ 71, 1980, 1987, 1978, 71, 71, 71, 71, 1979, 71,
+ 1988, 71, 1984, 1990, 1981, 1991, 1985, 1982, 1992, 1993,
+ 1994, 71, 1995, 71, 1996, 71, 1986, 1997, 71, 1987,
+ 1998, 1999, 2001, 2000, 71, 2003, 2002, 1988, 2007, 71,
+ 71, 2004, 1991, 71, 71, 71, 1993, 71, 2005, 1995,
+ 71, 71, 2006, 2008, 71, 71, 2009, 1998, 1999, 71,
+ 2000, 2011, 71, 2002, 71, 2007, 2010, 2013, 2004, 71,
+ 2012, 2749, 2017, 71, 71, 2005, 71, 2014, 71, 2006,
+
+ 2008, 2015, 2018, 71, 71, 71, 2016, 2022, 2011, 2020,
+ 2021, 2024, 2019, 2010, 71, 71, 2023, 2012, 71, 2017,
+ 71, 71, 71, 71, 2014, 2026, 71, 2025, 2015, 71,
+ 2027, 71, 2028, 2016, 71, 2029, 2020, 2021, 2024, 2019,
+ 71, 2030, 2032, 2023, 2033, 2034, 2031, 71, 71, 2035,
+ 71, 2043, 2026, 2749, 2025, 2037, 71, 2027, 2040, 2028,
+ 71, 71, 2029, 71, 71, 2038, 71, 2039, 2030, 2032,
+ 71, 2033, 2034, 2031, 2036, 2042, 2035, 71, 2044, 2046,
+ 71, 71, 2037, 71, 2045, 2040, 71, 71, 2052, 71,
+ 2047, 2048, 2038, 71, 2039, 2049, 2050, 2051, 2053, 2057,
+
+ 71, 2036, 2042, 2056, 2749, 2044, 2046, 2749, 71, 71,
+ 71, 2045, 2054, 71, 71, 2055, 2749, 2047, 2048, 71,
+ 71, 71, 2049, 2050, 2051, 2053, 2058, 2064, 2065, 71,
+ 2056, 71, 2066, 71, 2059, 2062, 2060, 2063, 2061, 2054,
+ 71, 2067, 2055, 71, 2075, 2069, 71, 2068, 71, 2071,
+ 71, 2070, 71, 2058, 71, 2065, 71, 71, 71, 2066,
+ 2072, 2059, 2062, 2060, 2063, 2061, 71, 2076, 2067, 2074,
+ 2073, 71, 2069, 71, 2068, 2077, 2071, 71, 2070, 2078,
+ 2080, 2081, 71, 2079, 71, 2749, 2749, 2072, 2082, 2749,
+ 2084, 2083, 2085, 71, 2076, 2086, 2074, 2073, 2088, 2091,
+
+ 2089, 2087, 71, 71, 71, 71, 2078, 71, 71, 71,
+ 2079, 2090, 71, 71, 2092, 71, 71, 2084, 2083, 2085,
+ 2095, 2093, 2086, 71, 71, 2088, 71, 2089, 2087, 2096,
+ 2094, 2099, 2100, 2097, 2103, 71, 71, 71, 2090, 71,
+ 71, 2092, 2098, 71, 71, 2101, 2102, 2095, 2093, 71,
+ 2104, 71, 71, 2105, 2106, 71, 2096, 2094, 2099, 2100,
+ 2097, 2107, 71, 2108, 2110, 71, 71, 2109, 71, 2098,
+ 2112, 71, 2101, 2102, 2111, 2113, 2119, 2104, 2114, 71,
+ 2105, 2106, 2115, 71, 2116, 2117, 71, 71, 2107, 71,
+ 2128, 2110, 2120, 2121, 2109, 71, 71, 2112, 2118, 71,
+
+ 2749, 2111, 2113, 71, 2124, 2114, 2122, 71, 71, 2115,
+ 71, 2116, 2125, 71, 2123, 71, 2126, 71, 2127, 2120,
+ 71, 2129, 71, 2131, 2130, 2118, 71, 71, 71, 2133,
+ 2132, 2124, 2135, 2122, 71, 71, 2136, 71, 2134, 2125,
+ 2137, 2123, 2140, 71, 2749, 71, 2138, 71, 2129, 2139,
+ 2131, 2130, 71, 71, 71, 71, 2133, 2132, 2141, 71,
+ 2143, 71, 2142, 2136, 2144, 2134, 71, 2148, 2145, 71,
+ 2146, 71, 71, 2138, 2147, 2149, 2139, 2150, 2151, 2152,
+ 71, 2153, 2154, 2155, 71, 2141, 71, 2143, 71, 2142,
+ 71, 71, 71, 2158, 2148, 2145, 2156, 2146, 2157, 71,
+
+ 71, 2147, 2149, 2159, 2150, 2151, 71, 71, 71, 71,
+ 71, 71, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 71,
+ 2158, 71, 2167, 2156, 2222, 2157, 71, 71, 71, 71,
+ 2159, 2168, 2169, 2171, 2173, 2749, 2174, 71, 2749, 2160,
+ 2161, 2162, 2163, 71, 71, 71, 2170, 71, 2180, 2167,
+ 2172, 71, 2177, 71, 71, 71, 71, 71, 2168, 2169,
+ 2171, 71, 2176, 2174, 2175, 71, 71, 2178, 2179, 71,
+ 71, 2182, 2181, 2170, 71, 2180, 2183, 2172, 2184, 2177,
+ 2185, 71, 2186, 71, 2187, 71, 71, 71, 71, 2176,
+ 71, 2175, 2189, 2188, 2178, 2179, 2190, 2191, 2182, 2181,
+
+ 2192, 2749, 2193, 2183, 2194, 2184, 71, 2185, 71, 2186,
+ 2195, 2187, 2196, 2749, 71, 2199, 2197, 2198, 71, 2189,
+ 2188, 71, 71, 2190, 71, 71, 2200, 71, 71, 2193,
+ 71, 2194, 71, 2201, 2202, 71, 71, 2195, 71, 2196,
+ 2203, 71, 2199, 2197, 2198, 2204, 2205, 2749, 2206, 2207,
+ 2209, 2208, 71, 2200, 2210, 71, 71, 2211, 71, 2220,
+ 2201, 2202, 2212, 2214, 2749, 2749, 2221, 2203, 71, 2749,
+ 2213, 71, 2204, 2205, 71, 2206, 71, 2209, 2208, 71,
+ 2215, 71, 2216, 71, 71, 2217, 71, 2218, 2219, 2212,
+ 2214, 71, 71, 71, 71, 2223, 71, 2213, 71, 2224,
+
+ 2225, 2226, 2229, 2227, 71, 2231, 2228, 2215, 71, 2216,
+ 71, 71, 2217, 71, 2218, 2219, 2230, 2232, 2233, 2235,
+ 2749, 2749, 2223, 71, 71, 2749, 2224, 2225, 2226, 2229,
+ 2227, 2234, 71, 2228, 2241, 2749, 2240, 71, 2242, 71,
+ 2236, 71, 71, 2230, 2232, 71, 2235, 2237, 71, 2238,
+ 71, 2244, 2239, 2243, 71, 2248, 2246, 71, 2234, 71,
+ 71, 71, 71, 2240, 2245, 2242, 2247, 2236, 71, 2252,
+ 2249, 2253, 2254, 2256, 2237, 2749, 2238, 2259, 71, 2239,
+ 2243, 2250, 71, 2246, 71, 2251, 71, 71, 71, 71,
+ 2749, 2245, 71, 2247, 2255, 2257, 71, 2249, 2253, 71,
+
+ 71, 2258, 71, 2260, 71, 2261, 2262, 2264, 2250, 2263,
+ 71, 2266, 2251, 2265, 2267, 2268, 71, 71, 2749, 2749,
+ 71, 2255, 2257, 71, 2270, 71, 71, 2275, 2258, 71,
+ 2260, 71, 2261, 2262, 2264, 2269, 2263, 71, 71, 2271,
+ 2265, 2267, 2268, 2274, 2272, 2273, 71, 2276, 71, 71,
+ 2278, 2270, 71, 2277, 2275, 71, 2279, 2284, 71, 2280,
+ 2281, 2749, 2269, 2285, 71, 71, 2271, 2282, 2289, 71,
+ 2274, 2272, 2273, 2286, 2276, 2283, 71, 71, 2290, 71,
+ 2277, 2287, 71, 71, 71, 71, 2280, 2281, 2288, 71,
+ 2285, 2292, 2291, 71, 2282, 71, 2293, 2749, 2294, 71,
+
+ 2286, 2298, 2283, 2295, 2296, 71, 71, 2297, 2287, 2299,
+ 71, 2749, 2749, 2300, 2749, 2288, 2302, 2749, 71, 2291,
+ 71, 2301, 2303, 2293, 2304, 2306, 71, 2305, 71, 71,
+ 71, 2296, 71, 71, 2297, 71, 2299, 2307, 2308, 71,
+ 2300, 71, 71, 2302, 2309, 2312, 71, 71, 2301, 2303,
+ 2310, 2304, 2306, 2311, 2305, 2313, 2749, 2314, 2315, 71,
+ 71, 71, 2316, 71, 2307, 2308, 71, 71, 2317, 2319,
+ 71, 2309, 2312, 71, 2321, 71, 71, 2310, 2318, 2320,
+ 2311, 2322, 2313, 71, 2314, 2315, 71, 71, 2323, 2316,
+ 2324, 2325, 71, 71, 2328, 2317, 71, 2326, 71, 2327,
+
+ 2329, 2321, 2330, 71, 71, 2318, 2320, 2333, 2322, 2331,
+ 2336, 2332, 2335, 2334, 2339, 71, 2338, 2324, 2325, 2337,
+ 2340, 71, 71, 71, 2326, 71, 2327, 71, 71, 71,
+ 2341, 71, 71, 71, 2333, 71, 2331, 2336, 2332, 2335,
+ 2334, 71, 71, 2338, 2342, 2343, 2337, 71, 2344, 2346,
+ 2749, 2347, 71, 2345, 2348, 2349, 71, 71, 2352, 2350,
+ 2351, 2353, 2749, 2354, 2355, 2357, 2358, 71, 2360, 2749,
+ 2361, 71, 2343, 2749, 71, 71, 2346, 71, 2347, 2362,
+ 71, 71, 71, 71, 2356, 2352, 2350, 2351, 71, 71,
+ 2354, 71, 71, 2358, 2359, 2365, 71, 71, 2363, 71,
+
+ 71, 2366, 71, 2364, 2368, 2367, 2362, 71, 71, 2369,
+ 2371, 2356, 71, 2370, 2749, 71, 2372, 2373, 2375, 2374,
+ 2749, 2359, 2365, 2377, 2376, 71, 71, 2381, 2366, 2749,
+ 71, 2368, 2367, 71, 2380, 2384, 71, 2371, 71, 71,
+ 2370, 71, 71, 71, 2373, 2375, 2374, 71, 2378, 2379,
+ 2377, 2376, 2382, 2383, 2381, 2385, 71, 2394, 71, 71,
+ 2387, 2380, 71, 71, 2386, 2388, 71, 2390, 71, 2389,
+ 2749, 2391, 2749, 2392, 2401, 2378, 2379, 71, 2393, 2382,
+ 2383, 2395, 2385, 71, 2394, 2397, 71, 2402, 2396, 2398,
+ 2404, 2386, 71, 71, 2390, 71, 2389, 71, 2391, 71,
+
+ 2392, 71, 2399, 71, 71, 2393, 2400, 71, 2395, 71,
+ 2403, 71, 2397, 71, 2402, 2396, 2398, 71, 2405, 71,
+ 2406, 2407, 2408, 2409, 2410, 2749, 2414, 2413, 2412, 2399,
+ 2411, 2415, 71, 2400, 2417, 2418, 2749, 2403, 71, 71,
+ 71, 2749, 2416, 71, 2749, 2405, 71, 71, 2407, 2408,
+ 2409, 71, 71, 71, 2413, 2412, 71, 2411, 71, 2419,
+ 2420, 2417, 71, 2422, 2421, 71, 2423, 2424, 71, 2416,
+ 2425, 2426, 2749, 2427, 71, 2428, 2433, 71, 71, 71,
+ 2431, 2429, 2430, 2432, 71, 71, 2419, 2420, 2434, 2435,
+ 2422, 2421, 2440, 2423, 2424, 71, 2436, 2425, 2426, 71,
+
+ 2427, 71, 2428, 71, 71, 2437, 71, 2431, 2429, 2430,
+ 2432, 2438, 71, 2439, 71, 71, 71, 2441, 2443, 71,
+ 2442, 2444, 2445, 2436, 71, 2447, 2448, 2450, 71, 2446,
+ 71, 2749, 2437, 2454, 71, 71, 2749, 2749, 2438, 71,
+ 2439, 2449, 71, 71, 2441, 71, 2749, 2442, 2444, 2445,
+ 2452, 71, 2447, 2451, 71, 2455, 2446, 2453, 71, 2456,
+ 71, 71, 71, 2458, 71, 2457, 2460, 2459, 2449, 71,
+ 2461, 2749, 2464, 71, 71, 2465, 2462, 2452, 71, 2466,
+ 2451, 71, 2455, 71, 2453, 2467, 2456, 2469, 71, 71,
+ 2458, 2471, 2457, 2460, 2459, 2463, 71, 2461, 71, 71,
+
+ 2470, 2468, 2465, 2462, 2472, 2474, 71, 71, 2473, 71,
+ 2476, 71, 71, 71, 71, 71, 2475, 2477, 2471, 2478,
+ 2479, 2480, 2463, 2481, 71, 71, 2482, 2470, 2468, 2490,
+ 71, 71, 2474, 71, 2485, 2473, 71, 2476, 2483, 2488,
+ 2491, 71, 2486, 2475, 2477, 2492, 2478, 2479, 71, 71,
+ 71, 2487, 71, 2482, 71, 2489, 71, 2484, 2493, 71,
+ 2495, 2485, 71, 2494, 71, 71, 2488, 2491, 2496, 2486,
+ 71, 71, 2492, 71, 2497, 2498, 2749, 2499, 2487, 2502,
+ 2503, 2500, 2489, 2501, 2484, 2493, 71, 71, 2506, 2507,
+ 2494, 2510, 71, 2509, 2508, 71, 2511, 2512, 71, 2504,
+
+ 2505, 2497, 71, 71, 2499, 71, 2502, 71, 2500, 71,
+ 2501, 71, 71, 2514, 2515, 71, 71, 2513, 71, 71,
+ 2509, 2508, 2516, 71, 2512, 2517, 2504, 2505, 2518, 2519,
+ 71, 2520, 2521, 2749, 2522, 71, 2523, 71, 2524, 71,
+ 2514, 71, 2527, 2530, 2513, 2529, 2525, 2531, 2526, 71,
+ 71, 71, 71, 71, 2528, 2518, 71, 2533, 2520, 2521,
+ 71, 2522, 71, 71, 2532, 2524, 71, 71, 2534, 71,
+ 71, 2535, 2529, 2525, 71, 2526, 2537, 71, 2536, 2538,
+ 2539, 2528, 2540, 71, 2749, 2542, 71, 71, 2543, 71,
+ 2541, 2532, 2544, 2749, 2545, 2534, 71, 71, 71, 71,
+
+ 71, 71, 71, 2537, 71, 2536, 2538, 2539, 2551, 2540,
+ 2550, 71, 2542, 2546, 2547, 2543, 71, 2541, 2553, 2544,
+ 2552, 2545, 71, 2548, 2549, 71, 2554, 71, 2555, 2556,
+ 71, 2557, 71, 71, 2558, 2551, 2561, 2550, 2559, 2560,
+ 2546, 2547, 2562, 2565, 2566, 2553, 2567, 2552, 2563, 2564,
+ 2548, 2549, 71, 71, 2568, 71, 2556, 71, 71, 71,
+ 2569, 71, 71, 2561, 2571, 71, 71, 71, 2572, 71,
+ 2565, 71, 71, 2567, 2570, 2563, 2564, 71, 2573, 2574,
+ 2575, 2568, 71, 71, 2579, 2577, 2576, 2569, 2578, 2580,
+ 2581, 2571, 71, 2584, 71, 2572, 2582, 2583, 71, 71,
+
+ 2588, 2570, 2590, 71, 2585, 71, 71, 2575, 71, 71,
+ 2586, 2587, 2577, 2576, 2589, 2578, 71, 2591, 2592, 71,
+ 2584, 2593, 71, 2582, 2583, 2594, 71, 71, 2595, 71,
+ 2597, 2585, 71, 2596, 2598, 2599, 71, 2586, 2587, 2600,
+ 71, 2589, 2601, 71, 71, 71, 71, 2602, 71, 2603,
+ 71, 2604, 2594, 2606, 71, 71, 2609, 71, 71, 2607,
+ 2596, 2598, 2599, 2605, 71, 71, 2600, 2608, 71, 2601,
+ 2610, 2611, 2617, 2612, 71, 71, 2603, 2615, 2604, 71,
+ 2606, 71, 2616, 71, 2614, 2619, 2607, 2613, 71, 71,
+ 2605, 71, 2749, 71, 2608, 71, 71, 2610, 2611, 71,
+
+ 2612, 2618, 2621, 2620, 2615, 71, 71, 2623, 71, 2616,
+ 71, 2614, 2619, 2622, 2613, 71, 2624, 71, 2629, 2625,
+ 2626, 2749, 2627, 71, 2630, 2628, 71, 2749, 2618, 2621,
+ 2620, 2631, 71, 71, 2623, 2632, 2637, 71, 71, 71,
+ 2622, 2633, 71, 2624, 71, 2629, 2625, 2626, 71, 2627,
+ 2634, 2630, 2628, 71, 2635, 2638, 71, 2636, 2631, 2639,
+ 2641, 71, 2632, 71, 2640, 2642, 2643, 2646, 2633, 2644,
+ 71, 2645, 2650, 71, 71, 2647, 71, 2634, 2648, 2653,
+ 71, 2635, 2638, 2657, 2636, 2661, 71, 71, 2649, 71,
+ 71, 2640, 71, 2643, 2646, 71, 2644, 71, 2645, 2651,
+
+ 71, 2652, 2647, 2654, 71, 2648, 71, 2655, 71, 2656,
+ 71, 71, 71, 2658, 2659, 2649, 2660, 71, 71, 71,
+ 2662, 2665, 2663, 2664, 71, 2749, 2651, 2666, 2652, 71,
+ 2654, 2667, 2668, 71, 2655, 71, 2656, 71, 71, 71,
+ 2658, 2659, 2669, 2660, 2670, 71, 2671, 2672, 2665, 2663,
+ 2664, 71, 71, 2673, 71, 71, 2674, 2676, 2667, 2668,
+ 2677, 2680, 2682, 2683, 2675, 71, 2678, 71, 71, 2669,
+ 71, 2670, 71, 2671, 2672, 71, 2681, 2679, 2684, 71,
+ 2673, 2749, 71, 2674, 2676, 71, 2685, 2677, 71, 71,
+ 2683, 2675, 2686, 2678, 71, 2688, 2689, 2690, 71, 2687,
+
+ 71, 2692, 2691, 2681, 2679, 2684, 2696, 71, 71, 71,
+ 2693, 2749, 2694, 2685, 71, 2749, 2699, 2698, 71, 2686,
+ 71, 2700, 2749, 2689, 71, 71, 2687, 71, 2692, 2691,
+ 71, 71, 2695, 2697, 2703, 2708, 2706, 2693, 71, 2694,
+ 71, 71, 71, 2699, 2698, 2704, 2701, 2705, 71, 2702,
+ 71, 2707, 2709, 71, 2711, 71, 71, 71, 2713, 2695,
+ 2697, 2703, 2708, 2706, 71, 2714, 71, 2710, 71, 2716,
+ 2718, 2715, 2704, 2701, 2705, 2712, 2702, 71, 2707, 2709,
+ 71, 2711, 2717, 71, 71, 2713, 2719, 2720, 2721, 71,
+ 71, 71, 2714, 71, 2710, 2724, 2716, 71, 2715, 2722,
+
+ 2723, 2725, 2712, 71, 2727, 2749, 2749, 2729, 71, 2717,
+ 2726, 2730, 71, 2719, 2720, 71, 2728, 2731, 71, 71,
+ 71, 2733, 2724, 71, 71, 71, 2722, 2723, 2725, 71,
+ 2734, 71, 2732, 71, 2729, 2737, 2738, 2726, 2730, 2740,
+ 71, 2735, 2736, 2728, 2731, 2739, 2741, 71, 2733, 71,
+ 71, 2742, 2743, 2744, 2747, 2748, 2745, 71, 2749, 2732,
+ 2749, 71, 2737, 71, 71, 71, 71, 2749, 2735, 2736,
+ 2749, 71, 2739, 71, 71, 71, 2746, 2749, 2742, 2743,
+ 2744, 71, 71, 2745, 71, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+
+ 2749, 2749, 2749, 2746, 43, 43, 43, 43, 43, 43,
+ 43, 48, 48, 48, 48, 48, 48, 48, 53, 53,
+ 53, 53, 53, 53, 53, 59, 59, 59, 59, 59,
+ 59, 59, 64, 64, 64, 64, 64, 64, 64, 74,
+ 74, 2749, 74, 74, 74, 74, 140, 140, 2749, 2749,
+ 2749, 140, 140, 142, 142, 2749, 2749, 142, 2749, 142,
+ 144, 2749, 2749, 2749, 2749, 2749, 144, 147, 147, 2749,
+ 2749, 2749, 147, 147, 149, 2749, 2749, 2749, 2749, 2749,
+ 149, 151, 151, 2749, 151, 151, 151, 151, 75, 75,
+ 2749, 75, 75, 75, 75, 13, 2749, 2749, 2749, 2749,
+
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749
} ;
-static yyconst flex_int16_t yy_chk[7571] =
+static yyconst flex_int16_t yy_chk[7963] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -2145,10 +2227,10 @@ static yyconst flex_int16_t yy_chk[7571] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 3, 3, 3, 4,
4, 4, 5, 5, 6, 6, 5, 28, 6, 7,
- 7, 7, 7, 2637, 7, 8, 8, 8, 8, 28,
+ 7, 7, 7, 2755, 7, 8, 8, 8, 8, 28,
8, 9, 9, 9, 10, 10, 10, 15, 21, 24,
- 906, 15, 30, 3, 28, 149, 4, 47, 47, 5,
+ 930, 15, 30, 3, 28, 149, 4, 47, 47, 5,
19, 6, 19, 19, 30, 19, 72, 7, 147, 24,
72, 19, 24, 8, 21, 21, 24, 29, 9, 30,
25, 10, 11, 11, 11, 11, 11, 11, 12, 12,
@@ -2247,728 +2329,772 @@ static yyconst flex_int16_t yy_chk[7571] =
278, 270, 276, 277, 287, 268, 275, 270, 279, 272,
273, 270, 271, 271, 272, 274, 280, 277, 281, 286,
- 282, 0, 283, 276, 275, 280, 278, 278, 270, 282,
+ 282, 807, 283, 276, 275, 280, 278, 278, 270, 282,
277, 284, 279, 285, 286, 279, 287, 288, 289, 0,
- 284, 281, 292, 280, 291, 281, 286, 282, 283, 283,
- 0, 292, 293, 289, 294, 0, 0, 285, 284, 290,
- 285, 288, 291, 299, 288, 289, 295, 290, 290, 292,
- 290, 291, 294, 296, 293, 0, 0, 290, 294, 293,
- 295, 294, 297, 297, 301, 302, 290, 299, 296, 304,
- 299, 305, 308, 295, 290, 290, 301, 290, 300, 294,
- 296, 300, 303, 302, 306, 307, 309, 297, 300, 297,
- 297, 301, 302, 305, 308, 310, 304, 307, 305, 308,
-
- 303, 309, 898, 310, 312, 300, 313, 311, 300, 303,
- 306, 306, 307, 309, 311, 315, 312, 314, 316, 317,
- 320, 318, 310, 0, 314, 0, 0, 318, 319, 323,
- 319, 312, 898, 320, 311, 345, 345, 315, 313, 0,
- 321, 317, 315, 318, 314, 322, 317, 320, 318, 324,
- 316, 325, 319, 321, 318, 319, 321, 319, 321, 325,
- 788, 323, 345, 322, 321, 325, 327, 321, 328, 329,
- 335, 324, 322, 327, 328, 0, 324, 330, 325, 333,
- 321, 329, 335, 321, 332, 321, 325, 326, 347, 326,
- 330, 788, 333, 327, 336, 328, 329, 335, 337, 338,
-
- 332, 347, 326, 337, 330, 326, 333, 326, 332, 326,
- 344, 332, 336, 326, 326, 347, 326, 339, 349, 341,
- 338, 336, 349, 339, 0, 340, 338, 332, 346, 326,
- 337, 341, 326, 340, 326, 346, 326, 334, 334, 342,
- 343, 0, 344, 355, 339, 349, 341, 334, 343, 334,
- 334, 334, 340, 350, 334, 346, 351, 342, 352, 348,
- 350, 354, 334, 351, 334, 334, 342, 343, 348, 357,
- 352, 353, 356, 354, 334, 355, 334, 334, 334, 356,
- 350, 334, 362, 351, 357, 352, 359, 358, 354, 369,
- 360, 348, 360, 353, 361, 348, 357, 365, 353, 356,
-
- 358, 363, 363, 0, 362, 361, 364, 367, 365, 362,
- 368, 366, 369, 364, 358, 371, 369, 360, 359, 372,
- 367, 361, 366, 374, 365, 370, 377, 381, 373, 0,
- 363, 372, 374, 364, 367, 368, 375, 368, 366, 373,
- 370, 371, 371, 376, 377, 379, 372, 378, 370, 375,
- 374, 385, 370, 377, 376, 373, 376, 380, 382, 381,
- 0, 376, 392, 375, 382, 383, 384, 370, 379, 378,
- 376, 387, 379, 385, 378, 380, 388, 389, 385, 391,
- 386, 376, 390, 376, 380, 382, 383, 386, 393, 384,
- 388, 395, 383, 384, 392, 394, 390, 387, 387, 389,
-
- 402, 394, 396, 388, 389, 391, 391, 386, 397, 390,
- 398, 393, 399, 395, 403, 393, 400, 398, 395, 401,
- 396, 399, 394, 397, 404, 409, 402, 402, 405, 396,
- 404, 400, 407, 412, 408, 397, 403, 398, 410, 399,
- 408, 403, 401, 400, 409, 1000, 401, 417, 412, 418,
- 411, 404, 409, 416, 405, 405, 410, 411, 407, 407,
- 412, 408, 414, 415, 414, 410, 416, 418, 419, 421,
- 415, 414, 420, 1000, 423, 427, 418, 411, 422, 417,
- 416, 422, 421, 425, 0, 424, 426, 467, 427, 414,
- 415, 414, 424, 428, 420, 430, 421, 422, 429, 420,
-
- 419, 430, 427, 429, 431, 422, 423, 425, 422, 426,
- 425, 432, 424, 434, 433, 428, 436, 435, 426, 467,
- 428, 439, 430, 0, 436, 429, 433, 431, 435, 439,
- 438, 431, 441, 432, 442, 434, 426, 438, 432, 443,
- 434, 433, 440, 436, 435, 437, 444, 445, 439, 446,
- 437, 443, 437, 440, 448, 441, 442, 438, 445, 441,
- 437, 442, 449, 437, 437, 448, 443, 446, 444, 440,
- 437, 437, 437, 444, 445, 447, 446, 437, 451, 437,
- 0, 448, 452, 455, 452, 447, 449, 437, 450, 449,
- 437, 437, 453, 457, 454, 450, 456, 437, 455, 460,
-
- 459, 457, 462, 0, 451, 451, 454, 447, 456, 452,
- 455, 458, 447, 463, 462, 450, 458, 460, 453, 453,
- 457, 454, 459, 456, 461, 465, 460, 459, 470, 462,
- 466, 468, 461, 469, 463, 471, 470, 472, 458, 478,
- 463, 473, 474, 465, 477, 469, 468, 475, 471, 472,
- 473, 461, 465, 466, 476, 470, 479, 466, 468, 481,
- 469, 475, 471, 477, 472, 474, 478, 480, 473, 474,
- 482, 477, 483, 485, 475, 484, 493, 486, 488, 476,
- 496, 476, 480, 491, 492, 482, 494, 484, 479, 488,
- 495, 481, 531, 489, 480, 485, 483, 482, 489, 483,
-
- 485, 486, 484, 487, 486, 488, 487, 490, 493, 497,
- 491, 492, 496, 494, 487, 497, 498, 495, 499, 531,
- 500, 490, 501, 502, 503, 489, 499, 502, 505, 504,
- 487, 506, 503, 487, 490, 507, 497, 508, 498, 500,
- 510, 509, 512, 498, 507, 499, 501, 500, 509, 501,
- 502, 503, 504, 511, 506, 512, 504, 515, 506, 508,
- 505, 513, 507, 522, 508, 514, 513, 516, 509, 512,
- 513, 521, 510, 517, 514, 511, 516, 518, 519, 0,
- 511, 522, 523, 515, 515, 513, 520, 528, 513, 524,
- 522, 519, 514, 513, 516, 517, 525, 513, 520, 518,
-
- 517, 528, 526, 521, 518, 519, 523, 532, 527, 523,
- 529, 524, 524, 520, 528, 530, 524, 533, 525, 527,
- 535, 534, 530, 525, 526, 532, 536, 537, 533, 526,
- 541, 538, 529, 542, 532, 527, 534, 529, 524, 539,
- 540, 543, 530, 541, 533, 544, 545, 536, 534, 540,
- 551, 537, 535, 536, 537, 538, 546, 541, 538, 547,
- 548, 539, 549, 543, 547, 542, 539, 540, 543, 556,
- 545, 550, 550, 545, 548, 553, 549, 544, 546, 550,
- 552, 554, 551, 546, 558, 555, 0, 548, 552, 549,
- 557, 547, 559, 553, 560, 0, 0, 559, 550, 550,
-
- 555, 556, 553, 554, 562, 557, 558, 552, 554, 555,
- 563, 558, 555, 561, 564, 561, 565, 557, 563, 566,
- 560, 560, 568, 567, 559, 565, 569, 555, 566, 562,
- 568, 562, 567, 569, 570, 572, 571, 563, 577, 564,
- 561, 564, 573, 565, 574, 575, 566, 572, 578, 568,
- 567, 573, 574, 569, 571, 576, 578, 570, 579, 581,
- 575, 570, 572, 571, 580, 582, 579, 576, 581, 573,
- 577, 574, 575, 584, 582, 578, 585, 0, 586, 583,
- 0, 584, 576, 589, 587, 579, 581, 580, 583, 585,
- 588, 580, 582, 590, 592, 593, 594, 591, 588, 589,
-
- 584, 601, 592, 585, 586, 586, 583, 587, 591, 593,
- 589, 587, 595, 596, 597, 590, 594, 588, 599, 601,
- 590, 592, 593, 594, 591, 598, 600, 599, 601, 602,
- 603, 606, 605, 596, 595, 604, 597, 607, 608, 595,
- 596, 597, 602, 609, 613, 599, 600, 598, 603, 615,
- 604, 608, 598, 600, 605, 606, 602, 603, 606, 605,
- 607, 609, 604, 610, 607, 608, 611, 612, 619, 614,
- 609, 613, 618, 612, 616, 610, 615, 614, 620, 611,
- 618, 624, 622, 621, 625, 620, 0, 0, 0, 623,
- 610, 645, 616, 611, 612, 614, 614, 622, 623, 618,
-
- 619, 616, 637, 625, 614, 620, 621, 631, 626, 622,
- 621, 625, 627, 624, 627, 628, 623, 626, 634, 631,
- 637, 639, 628, 645, 642, 638, 0, 640, 634, 637,
- 0, 0, 641, 0, 631, 626, 643, 651, 0, 627,
- 642, 652, 628, 629, 639, 634, 638, 629, 639, 643,
- 629, 642, 638, 640, 640, 644, 647, 629, 641, 641,
- 629, 651, 644, 643, 651, 629, 648, 0, 652, 0,
- 629, 649, 648, 650, 629, 650, 653, 629, 647, 677,
- 649, 654, 644, 647, 629, 655, 658, 629, 646, 646,
- 0, 646, 0, 648, 646, 657, 653, 655, 649, 646,
-
- 650, 656, 659, 653, 661, 646, 646, 654, 654, 660,
- 658, 677, 655, 658, 646, 646, 646, 657, 646, 661,
- 663, 646, 657, 667, 659, 666, 646, 656, 656, 659,
- 662, 661, 646, 646, 660, 664, 660, 665, 662, 668,
- 669, 671, 664, 663, 666, 665, 670, 663, 672, 667,
- 667, 668, 666, 669, 673, 670, 671, 662, 674, 678,
- 676, 679, 664, 674, 665, 680, 668, 669, 671, 683,
- 672, 686, 684, 670, 681, 672, 682, 685, 683, 686,
- 687, 673, 676, 690, 688, 679, 680, 676, 679, 689,
- 674, 678, 680, 681, 684, 682, 683, 685, 686, 684,
-
- 693, 681, 688, 682, 685, 691, 694, 687, 689, 695,
- 696, 688, 698, 691, 697, 690, 689, 699, 693, 700,
- 0, 700, 701, 702, 694, 0, 709, 693, 696, 704,
- 699, 695, 691, 694, 698, 702, 695, 696, 697, 698,
- 708, 697, 705, 703, 699, 705, 700, 704, 701, 701,
- 702, 703, 706, 709, 0, 710, 704, 712, 711, 713,
- 706, 710, 0, 712, 714, 708, 713, 708, 715, 705,
- 703, 714, 717, 715, 716, 718, 706, 0, 722, 706,
- 711, 716, 710, 719, 712, 711, 713, 706, 720, 721,
- 717, 714, 719, 722, 726, 715, 720, 725, 718, 717,
-
- 723, 716, 718, 733, 724, 722, 727, 721, 723, 731,
- 719, 728, 729, 727, 731, 720, 721, 724, 725, 729,
- 738, 726, 735, 730, 725, 732, 737, 723, 734, 728,
- 730, 724, 732, 727, 739, 733, 731, 736, 728, 729,
- 741, 734, 739, 738, 736, 740, 745, 738, 743, 744,
- 730, 742, 732, 740, 735, 734, 746, 742, 737, 748,
- 740, 739, 741, 747, 736, 746, 750, 741, 753, 749,
- 745, 755, 740, 745, 743, 743, 749, 747, 742, 751,
- 740, 744, 752, 746, 756, 754, 759, 757, 751, 0,
- 747, 748, 757, 750, 755, 753, 749, 754, 755, 762,
-
- 758, 785, 762, 763, 752, 768, 751, 758, 759, 752,
- 756, 756, 754, 759, 757, 760, 763, 765, 769, 766,
- 0, 770, 785, 760, 765, 766, 762, 758, 785, 772,
- 763, 768, 768, 770, 771, 774, 771, 775, 776, 773,
- 0, 769, 760, 776, 765, 769, 766, 767, 770, 767,
- 775, 773, 772, 767, 777, 767, 772, 774, 0, 0,
- 767, 771, 774, 778, 775, 767, 773, 777, 0, 780,
- 776, 767, 779, 781, 767, 782, 767, 783, 786, 780,
- 767, 777, 767, 783, 779, 784, 778, 767, 782, 787,
- 778, 780, 767, 789, 791, 781, 780, 790, 784, 779,
-
- 781, 794, 782, 791, 783, 790, 780, 793, 0, 797,
- 786, 806, 784, 0, 795, 796, 787, 0, 0, 799,
- 0, 791, 793, 794, 790, 789, 792, 795, 794, 803,
- 796, 792, 798, 792, 793, 797, 797, 800, 799, 801,
- 802, 795, 796, 806, 792, 792, 799, 801, 802, 807,
- 800, 792, 792, 792, 798, 808, 803, 804, 792, 798,
- 792, 809, 810, 808, 800, 811, 801, 802, 813, 812,
- 816, 792, 792, 807, 815, 809, 807, 812, 792, 814,
- 804, 817, 808, 818, 804, 815, 813, 811, 809, 819,
- 821, 818, 811, 820, 810, 813, 812, 814, 822, 817,
-
- 820, 815, 816, 821, 823, 822, 814, 825, 817, 824,
- 818, 819, 838, 827, 831, 829, 819, 821, 830, 836,
- 820, 832, 823, 831, 827, 822, 830, 824, 829, 833,
- 834, 823, 835, 832, 837, 839, 824, 836, 842, 825,
- 827, 831, 829, 842, 838, 830, 836, 841, 832, 839,
- 843, 833, 834, 843, 835, 844, 833, 834, 841, 835,
- 837, 837, 839, 847, 846, 845, 850, 848, 851, 852,
- 842, 846, 847, 849, 841, 851, 843, 843, 845, 844,
- 843, 848, 844, 853, 855, 849, 856, 854, 857, 860,
- 847, 846, 845, 854, 848, 851, 858, 859, 850, 857,
-
- 849, 852, 865, 866, 860, 862, 855, 853, 856, 863,
- 853, 855, 864, 856, 854, 857, 860, 867, 858, 859,
- 863, 869, 868, 858, 859, 874, 862, 873, 870, 875,
- 866, 868, 862, 864, 865, 867, 863, 870, 871, 864,
- 872, 873, 876, 879, 867, 869, 871, 872, 869, 868,
- 877, 880, 879, 881, 873, 870, 882, 874, 880, 884,
- 885, 875, 883, 890, 876, 871, 886, 872, 884, 876,
- 879, 891, 877, 888, 893, 887, 0, 877, 880, 889,
- 883, 894, 888, 882, 885, 881, 884, 885, 0, 883,
- 886, 887, 892, 886, 889, 890, 893, 895, 896, 897,
-
- 888, 893, 887, 891, 892, 895, 889, 899, 894, 900,
- 901, 896, 904, 902, 897, 902, 899, 905, 901, 892,
- 904, 908, 907, 909, 895, 896, 897, 900, 911, 910,
- 912, 914, 915, 908, 899, 907, 900, 901, 909, 904,
- 902, 917, 0, 916, 905, 913, 911, 918, 908, 907,
- 909, 910, 913, 921, 919, 911, 910, 912, 920, 924,
- 927, 922, 0, 914, 915, 916, 917, 919, 917, 918,
- 916, 920, 913, 922, 918, 921, 923, 925, 928, 924,
- 921, 919, 926, 929, 923, 920, 924, 927, 922, 925,
- 926, 928, 929, 930, 931, 0, 934, 932, 936, 937,
-
- 967, 931, 0, 923, 925, 928, 932, 935, 932, 926,
- 929, 932, 937, 938, 930, 0, 946, 941, 936, 932,
- 930, 931, 934, 934, 932, 936, 937, 939, 940, 935,
- 943, 947, 967, 932, 935, 932, 939, 938, 932, 941,
- 938, 942, 944, 946, 941, 949, 940, 950, 951, 942,
- 944, 0, 943, 947, 939, 940, 948, 943, 947, 952,
- 956, 954, 0, 948, 957, 953, 951, 949, 942, 944,
- 950, 952, 949, 953, 950, 951, 954, 955, 959, 957,
- 956, 961, 958, 948, 959, 960, 952, 956, 954, 955,
- 958, 957, 953, 963, 960, 962, 964, 965, 968, 969,
-
- 963, 972, 961, 964, 955, 959, 970, 962, 961, 958,
- 971, 968, 960, 970, 973, 965, 972, 975, 969, 973,
- 963, 974, 962, 964, 965, 968, 969, 976, 972, 974,
- 975, 977, 971, 970, 981, 0, 994, 971, 979, 0,
- 0, 976, 980, 984, 975, 982, 973, 995, 974, 0,
- 0, 0, 979, 983, 976, 0, 985, 977, 977, 978,
- 980, 984, 978, 978, 0, 979, 981, 978, 994, 980,
- 984, 982, 982, 978, 986, 983, 987, 978, 985, 995,
- 983, 978, 988, 985, 988, 989, 978, 990, 991, 978,
- 978, 996, 989, 997, 978, 992, 986, 999, 993, 0,
-
- 978, 986, 987, 987, 978, 990, 988, 993, 992, 988,
- 991, 988, 989, 996, 990, 991, 997, 0, 996, 1003,
- 997, 1005, 992, 999, 999, 993, 998, 1001, 1004, 1006,
- 1005, 998, 1011, 998, 1007, 998, 1008, 998, 1010, 1007,
- 1004, 1008, 1003, 1001, 998, 1009, 1003, 1006, 1005, 1012,
- 1011, 1010, 1014, 998, 1001, 1004, 1006, 1012, 998, 1011,
- 998, 1013, 998, 1008, 998, 1010, 1007, 1009, 1015, 1013,
- 1016, 1014, 1009, 1017, 1019, 1018, 1012, 1021, 1020, 1014,
- 1020, 1015, 1022, 1019, 1023, 1024, 1017, 0, 1013, 1025,
- 1030, 1027, 1016, 1018, 0, 1015, 1023, 1016, 1028, 1021,
-
- 1017, 1019, 1018, 1031, 1021, 1020, 1032, 1033, 1036, 1022,
- 1031, 1023, 1024, 1029, 1025, 1027, 1025, 1030, 1027, 1038,
- 1028, 1029, 1034, 1040, 1037, 1028, 1035, 1039, 1034, 1033,
- 1031, 1037, 1035, 1032, 1033, 1036, 1042, 1043, 1045, 1044,
- 1029, 1038, 0, 1054, 1048, 1039, 1038, 1046, 1040, 1034,
- 1040, 1037, 1050, 1035, 1039, 1047, 1051, 1045, 1049, 1043,
- 1042, 1044, 1055, 1042, 1043, 1045, 1044, 1049, 1056, 1046,
- 1048, 1048, 1052, 1050, 1046, 1054, 1051, 1047, 1057, 1050,
- 1058, 1059, 1047, 1051, 1060, 1049, 1052, 1061, 1065, 1059,
- 1056, 1068, 1065, 1066, 1055, 1056, 1062, 1064, 1058, 1052,
-
- 1060, 1067, 1070, 1062, 1064, 1073, 0, 1058, 1059, 1072,
- 1057, 1060, 1068, 1071, 1061, 1065, 1072, 1074, 1068, 1071,
- 1073, 1076, 1075, 1062, 1064, 1066, 1071, 1078, 1077, 1078,
- 1074, 1075, 1073, 1067, 1070, 1077, 1072, 1080, 1081, 1082,
- 1071, 1079, 1088, 1082, 1074, 1083, 1071, 1076, 1076, 1075,
- 1079, 1086, 1085, 1087, 1078, 1077, 1086, 1089, 0, 1080,
- 1085, 1088, 1090, 1093, 1080, 1081, 1082, 1083, 1079, 1088,
- 1089, 1087, 1083, 1091, 1090, 1092, 1091, 1095, 1092, 1085,
- 1087, 1094, 0, 1086, 1089, 1091, 0, 1096, 1093, 1090,
- 1093, 1097, 1127, 1098, 1094, 1099, 1099, 1092, 1105, 1101,
-
- 1091, 1098, 1092, 1091, 1100, 1092, 1102, 1097, 1094, 1095,
- 1096, 1105, 1103, 1100, 1096, 1102, 1107, 1108, 1097, 1103,
- 1098, 1101, 1099, 1106, 1127, 1105, 1101, 1109, 1113, 1110,
- 1111, 1100, 1106, 1102, 0, 1114, 1109, 1110, 1112, 1103,
- 1108, 1113, 1107, 1107, 1108, 1111, 1112, 1114, 1115, 1117,
- 1106, 1116, 1118, 0, 1109, 1113, 1110, 1111, 1119, 1116,
- 1115, 1120, 1114, 1121, 0, 1112, 1122, 1125, 1124, 1126,
- 1120, 1117, 1118, 1125, 1123, 1115, 1117, 1128, 1116, 1118,
- 1119, 1121, 0, 0, 1129, 1119, 1123, 1130, 1120, 1124,
- 1121, 1126, 1122, 1122, 1125, 1124, 1126, 1132, 1133, 1134,
-
- 1138, 1123, 1136, 1135, 1137, 0, 1139, 0, 0, 1128,
- 1129, 1129, 1135, 1130, 1130, 1136, 1137, 1134, 1141, 1142,
- 1138, 1133, 0, 1143, 1132, 1133, 1134, 1138, 1140, 1136,
- 1135, 1137, 1139, 1139, 1144, 1140, 1143, 1141, 1145, 1146,
- 1147, 1142, 1144, 1145, 1146, 1141, 1142, 1147, 1148, 1149,
- 1143, 1150, 1153, 1151, 1152, 1140, 1148, 1149, 1155, 1150,
- 1151, 1144, 1156, 1152, 1154, 1154, 1155, 1147, 1157, 1158,
- 1145, 1146, 1168, 0, 1159, 1148, 1149, 1158, 1150, 1160,
- 1151, 1152, 1159, 1156, 1153, 1155, 1161, 1160, 1165, 1156,
- 1162, 1154, 1163, 1164, 1161, 1167, 1158, 1166, 1163, 1168,
-
- 1157, 1159, 1170, 1162, 1169, 1164, 1160, 0, 0, 1171,
- 1167, 0, 1172, 1161, 1165, 1165, 1176, 1162, 1173, 1163,
- 1164, 1166, 1167, 1171, 1166, 1170, 1169, 1178, 1177, 1170,
- 1172, 1169, 1173, 1174, 1178, 1179, 1171, 1174, 1176, 1172,
- 1177, 1180, 0, 1176, 1181, 1173, 1179, 1182, 0, 1183,
- 1174, 1189, 1184, 1188, 1178, 1177, 1185, 0, 1174, 1193,
- 1174, 1186, 1179, 1185, 1174, 1193, 1181, 1194, 1180, 1182,
- 1186, 1181, 1183, 1187, 1182, 1184, 1183, 1174, 1189, 1184,
- 1187, 1191, 1196, 1185, 1195, 1188, 1193, 0, 1186, 1194,
- 1191, 1198, 1200, 1201, 1194, 1202, 1207, 1204, 0, 1205,
-
- 1187, 1206, 1207, 1209, 1201, 1208, 1202, 1210, 1191, 1213,
- 1195, 1195, 1217, 1206, 1196, 1212, 1210, 1212, 1198, 1200,
- 1201, 1204, 1202, 1207, 1204, 1205, 1205, 1208, 1206, 1209,
- 1209, 1211, 1208, 1214, 1210, 1213, 1213, 1215, 1216, 1217,
- 1218, 1219, 1212, 1211, 1220, 1222, 1214, 1221, 1219, 0,
- 1216, 1225, 1221, 1223, 1224, 1227, 1229, 1228, 1211, 1215,
- 1214, 1222, 1224, 1218, 1215, 1216, 1228, 1218, 1219, 1229,
- 1220, 1220, 1222, 1225, 1221, 1231, 1223, 1232, 1225, 1232,
- 1223, 1224, 1227, 1229, 1228, 1230, 1230, 1234, 1231, 1233,
- 1235, 1236, 1237, 1230, 0, 1240, 1239, 1235, 1236, 1238,
-
- 0, 1242, 1231, 1239, 1232, 1241, 1244, 1247, 1251, 1234,
- 1237, 1251, 1230, 1230, 1234, 1233, 1233, 1235, 1236, 1237,
- 1240, 1238, 1240, 1239, 1243, 1249, 1238, 1241, 1246, 1248,
- 1254, 1243, 1241, 1242, 1247, 1251, 1252, 1248, 1244, 1253,
- 1255, 1246, 1256, 1254, 1257, 1259, 1249, 1258, 1262, 1255,
- 0, 1243, 1249, 0, 1256, 1246, 1248, 1254, 1268, 1263,
- 1259, 1261, 1252, 1252, 1261, 1253, 1253, 1255, 1257, 1256,
- 1260, 1257, 1259, 1258, 1258, 1264, 1261, 1260, 1265, 1271,
- 1262, 1263, 1266, 1267, 1266, 1261, 1263, 1269, 1261, 1270,
- 1268, 1261, 0, 1264, 1272, 1273, 1276, 1260, 1277, 1279,
-
- 1265, 1271, 1264, 1261, 1273, 1265, 1271, 1267, 1272, 1266,
- 1267, 1274, 1278, 1269, 1269, 1270, 1270, 1275, 1281, 1274,
- 1282, 1272, 1273, 1280, 1275, 1291, 1283, 1280, 1276, 1285,
- 1277, 1279, 1284, 1287, 1278, 1286, 1285, 0, 1274, 1278,
- 1281, 1284, 1286, 1289, 1275, 1281, 1287, 1282, 1283, 1290,
- 1280, 1288, 1297, 1283, 1292, 1294, 1285, 1291, 1289, 1284,
- 1287, 1292, 1286, 1290, 1288, 1293, 1299, 1295, 1294, 1300,
- 1289, 1301, 1293, 1295, 1302, 0, 1290, 1298, 1288, 1297,
- 1307, 1292, 1294, 1301, 1298, 1305, 1303, 1302, 1299, 1303,
- 1304, 0, 1293, 1299, 1295, 1300, 1300, 1306, 1301, 1304,
-
- 1307, 1302, 1308, 1305, 1298, 1308, 1311, 1307, 1309, 1306,
- 1314, 1311, 1305, 1303, 1313, 1315, 1313, 1304, 1311, 1309,
- 1308, 1316, 1317, 1319, 1306, 1318, 1322, 1326, 1325, 1308,
- 0, 1319, 1308, 1311, 1320, 1309, 1321, 1314, 1311, 1318,
- 1327, 1313, 1315, 1323, 1322, 1316, 1325, 1321, 1316, 1317,
- 1319, 1323, 1318, 1322, 1324, 1325, 1320, 1324, 1328, 1326,
- 1329, 1320, 1330, 1321, 1331, 1328, 1336, 1327, 1332, 0,
- 1323, 1330, 1324, 1333, 1329, 1336, 1335, 1331, 1335, 1332,
- 1337, 1324, 1341, 1338, 1324, 1328, 1339, 1329, 1333, 1330,
- 1340, 1331, 0, 1336, 1338, 1332, 1341, 0, 1342, 1344,
-
- 1333, 1342, 1343, 1335, 1339, 1344, 1337, 1337, 1341, 1341,
- 1338, 1343, 1340, 1339, 1346, 1345, 1342, 1340, 1348, 1346,
- 1349, 1350, 1351, 1341, 1345, 1342, 1344, 1352, 1342, 1343,
- 1350, 1348, 1354, 1353, 1357, 1355, 1359, 0, 1358, 1360,
- 1370, 1357, 1345, 0, 1376, 1348, 1346, 1372, 1350, 1351,
- 1364, 1358, 1349, 1360, 1372, 1353, 1355, 1361, 1364, 1352,
- 1353, 1357, 1355, 1361, 1354, 1358, 1360, 1365, 1359, 1366,
- 1368, 1367, 1370, 1369, 1372, 1365, 1376, 1364, 1371, 1374,
- 1373, 1361, 0, 1368, 1361, 1367, 1369, 1374, 1366, 1373,
- 1361, 1377, 1371, 1380, 1365, 1375, 1366, 1368, 1367, 1378,
-
- 1369, 1382, 1377, 1381, 1389, 1371, 1374, 1373, 1378, 1375,
- 1381, 1383, 1384, 1385, 1386, 1387, 1389, 1390, 1377, 1387,
- 1380, 1391, 1375, 1394, 1382, 0, 1378, 1396, 1382, 1391,
- 1381, 1389, 1386, 1383, 1384, 1385, 1392, 1393, 1383, 1384,
- 1385, 1386, 1387, 1395, 1390, 1393, 1397, 1396, 1391, 1399,
- 1394, 1392, 1398, 1400, 1396, 1401, 1395, 1399, 1405, 1402,
- 1400, 1397, 1403, 1392, 1393, 0, 1407, 1398, 1406, 1404,
- 1395, 1403, 1409, 1397, 1402, 1411, 1399, 1414, 1413, 1398,
- 1400, 1415, 1410, 1412, 0, 1405, 1402, 1401, 1415, 1403,
- 1404, 1419, 1406, 1407, 1409, 1406, 1404, 1420, 1412, 1409,
-
- 1410, 1414, 1411, 1413, 1414, 1413, 1416, 1417, 1415, 1410,
- 1412, 1416, 1418, 1419, 1421, 1420, 1417, 1424, 1419, 1422,
- 1423, 1418, 1427, 1428, 1420, 1425, 1426, 1434, 0, 1421,
- 1424, 1422, 1425, 1416, 1417, 1424, 1432, 1429, 1426, 1418,
- 1430, 1421, 1423, 1429, 1424, 1433, 1422, 1423, 1430, 1427,
- 1435, 1431, 1425, 1426, 1434, 1428, 1437, 1424, 1431, 1436,
- 1440, 1432, 1438, 1432, 1429, 1441, 1436, 1430, 1438, 1439,
- 1442, 1433, 1433, 1443, 1445, 1439, 1446, 1435, 1431, 1447,
- 1448, 1449, 1448, 1437, 1452, 1446, 1436, 1440, 1441, 1438,
- 1450, 1454, 1441, 1451, 1456, 0, 1439, 1443, 1454, 0,
-
- 1443, 1464, 1442, 1446, 0, 1449, 1445, 1448, 1449, 1459,
- 1461, 1447, 0, 0, 1459, 0, 1452, 1450, 1454, 1451,
- 1451, 1453, 1453, 1453, 1455, 1457, 1456, 1460, 1453, 1462,
- 1463, 1455, 1457, 1464, 0, 1461, 1453, 1461, 1467, 1466,
- 1460, 1459, 1463, 1465, 1467, 1462, 1466, 1468, 1453, 1453,
- 1453, 1455, 1457, 1470, 1460, 1453, 1462, 1463, 1469, 1469,
- 1471, 1465, 1473, 1472, 1474, 1467, 1466, 1471, 1472, 1481,
- 1465, 1480, 1482, 0, 1468, 1477, 1479, 1480, 0, 1470,
- 1470, 1483, 1484, 1491, 1482, 1469, 1486, 1471, 1473, 1473,
- 1472, 1474, 1490, 1477, 1479, 1494, 1481, 1493, 1480, 1482,
-
- 1484, 1483, 1477, 1479, 1485, 1485, 1487, 1487, 1483, 1484,
- 1488, 1492, 1486, 1486, 1490, 1491, 1495, 1493, 1492, 1490,
- 1496, 1488, 1497, 1498, 1493, 1499, 1500, 1494, 1501, 0,
- 1502, 1485, 1499, 1487, 1500, 1505, 1503, 1488, 1492, 1504,
- 1504, 1498, 1506, 1501, 1497, 1503, 1516, 1496, 1495, 1497,
- 1498, 1507, 1499, 1500, 1502, 1501, 1508, 1502, 1507, 1509,
- 1511, 1505, 1505, 1503, 1512, 1513, 1504, 1511, 1508, 1516,
- 0, 1515, 1512, 1516, 1506, 1509, 1517, 1513, 1507, 1515,
- 1519, 1518, 1509, 1508, 0, 1521, 1509, 1511, 1520, 1522,
- 1521, 1512, 1513, 1524, 1523, 1527, 1528, 1517, 1515, 1518,
-
- 1523, 1521, 1509, 1517, 1529, 1530, 1524, 1519, 1518, 1532,
- 1533, 1520, 1521, 0, 0, 1520, 1522, 1521, 1525, 1526,
- 1524, 1523, 1535, 1528, 1531, 1525, 1526, 1527, 1530, 1531,
- 1529, 1529, 1530, 1534, 1536, 1538, 1532, 1533, 1534, 1539,
- 1531, 1537, 1537, 1541, 0, 1525, 1526, 1545, 1543, 1542,
- 1538, 1531, 1547, 1544, 1535, 1544, 1531, 1559, 1541, 1546,
- 1556, 0, 1538, 1543, 1546, 1534, 1536, 1548, 1537, 1551,
- 1541, 1539, 1542, 1550, 1554, 1543, 1542, 1551, 1555, 1545,
- 1544, 1552, 1548, 1557, 1547, 1558, 1546, 1556, 1550, 1559,
- 1560, 1561, 1558, 1562, 1548, 1567, 1551, 1563, 1554, 1565,
-
- 1550, 1554, 1573, 1552, 1555, 1555, 1572, 0, 1552, 1574,
- 1557, 1560, 1558, 1561, 1562, 1563, 1568, 1560, 1561, 1567,
- 1562, 1565, 1567, 1570, 1563, 1571, 1565, 1574, 1572, 1573,
- 1577, 1568, 1575, 1572, 1576, 1578, 1574, 1579, 1570, 1580,
- 1571, 1581, 1578, 1568, 1582, 1584, 0, 1583, 1580, 1581,
- 1570, 1595, 1571, 0, 1575, 1579, 1576, 1577, 0, 1575,
- 1585, 1576, 1578, 1588, 1579, 1587, 1580, 1582, 1581, 1583,
- 1589, 1582, 1588, 1585, 1583, 1590, 1587, 1584, 1595, 1591,
- 1605, 1592, 0, 1602, 1604, 1597, 1600, 1585, 1589, 1598,
- 1588, 1587, 1587, 1590, 1591, 1592, 1597, 1589, 1600, 1603,
-
- 1598, 1601, 1590, 1587, 1606, 1605, 1591, 1605, 1592, 1603,
- 1604, 1604, 1597, 1600, 1601, 1602, 1598, 1607, 1609, 1612,
- 1610, 0, 1611, 1613, 1614, 1615, 1603, 1610, 1601, 1613,
- 1618, 1606, 1617, 1617, 0, 1623, 1607, 1612, 1609, 1614,
- 1615, 1616, 1618, 1622, 1607, 1609, 1612, 1610, 1611, 1611,
- 1613, 1614, 1615, 1619, 1621, 1624, 1616, 1618, 1622, 1617,
- 1625, 1621, 1623, 1627, 1624, 1626, 1619, 1625, 1616, 1628,
- 1622, 0, 1630, 1631, 1619, 1632, 1628, 1634, 1641, 1633,
- 1619, 1621, 1624, 1638, 1632, 1627, 0, 1625, 1637, 1626,
- 1627, 1636, 1626, 1619, 1630, 1643, 1628, 1634, 1631, 1630,
-
- 1631, 1633, 1632, 1637, 1634, 1641, 1633, 1640, 1638, 1636,
- 1638, 1642, 1642, 1645, 1644, 1637, 0, 1643, 1636, 1647,
- 1640, 1646, 1643, 1648, 1649, 1650, 1656, 0, 1647, 1660,
- 1648, 1651, 1652, 0, 1640, 1645, 1654, 0, 1642, 1644,
- 1645, 1644, 1655, 1646, 1654, 1651, 1647, 1650, 1646, 1657,
- 1648, 1652, 1650, 1656, 1658, 1655, 1649, 1659, 1651, 1652,
- 1661, 1660, 0, 1654, 1659, 1662, 1658, 1664, 1665, 1655,
- 1663, 0, 1666, 0, 1667, 1657, 1657, 1670, 1663, 0,
- 1671, 1658, 1661, 1665, 1659, 1668, 1671, 1661, 1669, 1663,
- 1662, 1669, 1662, 1672, 1664, 1665, 1673, 1663, 1666, 1666,
-
- 1667, 1667, 1670, 1668, 1670, 1663, 1669, 1671, 1677, 1674,
- 1676, 1678, 1668, 1680, 1673, 1669, 0, 1684, 1669, 1681,
- 1672, 1688, 1682, 1673, 1674, 1676, 1681, 1680, 1684, 1689,
- 1677, 1682, 1683, 1678, 1692, 1677, 1674, 1676, 1678, 1686,
- 1680, 1683, 1687, 1688, 1684, 1699, 1681, 1692, 1688, 1682,
- 1694, 1689, 1696, 1701, 1686, 1692, 1689, 1687, 1695, 1683,
- 1698, 1692, 1695, 1697, 1696, 1697, 1686, 1702, 1700, 1687,
- 1703, 1694, 1699, 1707, 1692, 1702, 1704, 1694, 1698, 1696,
- 1701, 1708, 1705, 1706, 1709, 1695, 1700, 1698, 1706, 1714,
- 1697, 1710, 1711, 1703, 1702, 1700, 1705, 1703, 1704, 1711,
-
- 1715, 1717, 1716, 1704, 1718, 1707, 1719, 1721, 1709, 1705,
- 1710, 1709, 0, 1708, 1715, 1706, 1714, 0, 1710, 1711,
- 1716, 1719, 1722, 1720, 1723, 1715, 1715, 1715, 1717, 1716,
- 1718, 1718, 1720, 1719, 1724, 1725, 1727, 1729, 1728, 1721,
- 0, 1715, 0, 1734, 1722, 1728, 1731, 1732, 1731, 1722,
- 1720, 1723, 1715, 1733, 1735, 1734, 1724, 1733, 1738, 1727,
- 1729, 1724, 1736, 1727, 1729, 1728, 1737, 1725, 1739, 1732,
- 1734, 1736, 1740, 1731, 1732, 1741, 1735, 1737, 1742, 1742,
- 1733, 1735, 1743, 1745, 1740, 1738, 1744, 0, 1747, 1736,
- 1743, 1739, 1748, 1737, 1749, 1739, 1747, 1741, 1749, 1740,
-
- 1748, 1750, 1741, 1751, 1750, 1742, 1752, 1753, 1744, 1743,
- 1745, 1751, 1752, 1744, 1754, 1747, 1757, 1756, 1758, 1748,
- 1754, 1749, 1753, 1759, 1763, 1760, 1761, 1764, 1750, 1756,
- 1751, 1762, 1766, 1752, 1753, 1765, 0, 1759, 1760, 1767,
- 1761, 1754, 1758, 1757, 1756, 1758, 1766, 1765, 1769, 1770,
- 1759, 1763, 1760, 1761, 1764, 1772, 1776, 1762, 1762, 1766,
- 1768, 1773, 1765, 1768, 1775, 1767, 1767, 1774, 1773, 1777,
- 1779, 1770, 1778, 1781, 1774, 1769, 1770, 1772, 1768, 1775,
- 1778, 1782, 1772, 1776, 1780, 1783, 1788, 1768, 1773, 1784,
- 1768, 1775, 1787, 1780, 1774, 1785, 1777, 1779, 1789, 1778,
-
- 1781, 1790, 1784, 1785, 0, 1792, 1789, 1793, 1782, 1791,
- 1795, 1780, 1783, 1788, 1787, 1794, 1784, 1799, 1791, 1787,
- 1801, 1796, 1785, 1797, 1805, 1789, 1792, 1801, 1790, 1796,
- 1794, 1793, 1792, 1803, 1793, 1797, 1791, 1795, 1798, 1802,
- 1804, 1794, 1794, 1802, 1799, 1803, 1798, 1801, 1796, 1810,
- 1797, 1805, 1807, 1806, 1812, 1811, 1808, 1794, 1813, 1816,
- 1803, 1806, 1811, 1804, 1807, 1798, 1802, 1804, 1808, 1814,
- 1814, 1813, 1815, 0, 1812, 1817, 1810, 1816, 1819, 1807,
- 1806, 1812, 1811, 1808, 1820, 1813, 1816, 1821, 1822, 1823,
- 1822, 1824, 1829, 1819, 0, 1825, 1814, 1824, 1815, 1815,
-
- 1817, 1826, 1817, 1823, 1827, 1819, 1820, 1828, 1830, 1821,
- 1831, 1820, 1831, 1832, 1821, 1822, 1823, 1825, 1824, 1828,
- 1833, 1834, 1825, 1826, 1829, 1835, 1827, 1832, 1826, 1837,
- 1830, 1827, 1836, 1838, 1828, 1830, 1843, 1831, 1833, 1834,
- 1832, 1839, 1837, 1835, 1841, 1845, 1844, 1833, 1834, 1846,
- 1836, 1841, 1835, 1847, 1843, 1847, 1837, 1846, 1849, 1836,
- 1847, 1851, 1852, 1843, 1839, 1838, 1855, 1850, 1839, 1849,
- 0, 1841, 1844, 1844, 1852, 1846, 1846, 1845, 1850, 1853,
- 1847, 1855, 1847, 1857, 1846, 1849, 1858, 1856, 1851, 1852,
- 1861, 1860, 1862, 1855, 1850, 1857, 1863, 1853, 1856, 1862,
-
- 1864, 1858, 1866, 1868, 1867, 1869, 1853, 1870, 1871, 1872,
- 1857, 1863, 1861, 1858, 1856, 1860, 1873, 1861, 1860, 1862,
- 1875, 1879, 1872, 1863, 1876, 1868, 1874, 1864, 1867, 1866,
- 1868, 1867, 1876, 1875, 1877, 1871, 1872, 1869, 1880, 1870,
- 1881, 1874, 1873, 1873, 1879, 1883, 1882, 1875, 1879, 1886,
- 0, 1876, 1883, 1874, 1884, 1889, 1886, 1887, 1888, 1890,
- 1877, 1877, 1880, 1892, 1887, 1880, 1890, 1881, 1882, 1891,
- 1897, 1888, 1883, 1882, 1894, 1898, 1886, 1884, 1889, 1893,
- 1910, 1884, 1889, 1894, 1887, 1888, 1890, 1896, 1900, 1899,
- 1903, 1891, 1897, 1904, 1905, 1892, 1891, 1897, 1896, 1907,
-
- 1893, 1894, 1912, 1903, 1906, 1906, 1893, 1898, 1899, 1909,
- 1928, 1916, 1910, 1900, 1896, 1900, 1899, 1903, 1905, 1904,
- 1904, 1905, 1911, 1913, 1918, 1907, 1907, 1924, 1926, 1912,
- 1922, 1906, 1909, 1918, 1923, 1930, 1909, 1911, 1916, 1929,
- 1931, 1913, 1928, 1935, 1936, 1931, 1930, 1932, 1939, 1911,
- 1913, 1918, 1922, 0, 1924, 1926, 1923, 1922, 1935, 1938,
- 1934, 1923, 1930, 1940, 1941, 1929, 1929, 1931, 1934, 1932,
- 1935, 1936, 1940, 1943, 1932, 1944, 1941, 1938, 1947, 1945,
- 1939, 1948, 1952, 1944, 0, 1949, 1938, 1934, 1945, 1950,
- 1940, 1941, 1951, 1954, 1955, 1952, 1956, 1953, 1957, 1958,
-
- 1943, 1961, 1944, 1959, 1947, 1947, 1945, 1949, 1948, 1952,
- 1953, 1950, 1949, 1960, 1965, 1954, 1950, 1951, 1959, 1951,
- 1954, 1955, 1960, 1956, 1953, 1957, 1958, 1961, 1961, 1962,
- 1959, 1963, 1964, 1966, 1967, 1968, 1970, 1969, 1971, 0,
- 1960, 1965, 1973, 1964, 1972, 1971, 1963, 1974, 0, 1973,
- 1968, 1970, 1975, 1976, 1976, 1962, 1962, 1969, 1963, 1964,
- 1966, 1967, 1968, 1970, 1969, 1971, 1972, 1978, 1977, 1973,
- 1975, 1972, 1980, 1979, 1974, 1977, 1979, 1981, 1982, 1975,
- 1976, 1978, 1986, 1987, 1989, 1980, 1983, 0, 1987, 1984,
- 1991, 1986, 1992, 1988, 1978, 1977, 1982, 1988, 1983, 1980,
-
- 1979, 1984, 1990, 1981, 1981, 1982, 1993, 1994, 1989, 1986,
- 1987, 1989, 1991, 1983, 1992, 1990, 1984, 1991, 1995, 1992,
- 1988, 1998, 1999, 2000, 2001, 2005, 0, 2004, 2003, 1990,
- 2005, 1999, 2001, 1993, 1994, 2003, 2004, 0, 2007, 2000,
- 0, 0, 2010, 2012, 1995, 1995, 2006, 1998, 1998, 1999,
- 2000, 2001, 2005, 2006, 2004, 2003, 2007, 2008, 2009, 2013,
- 2014, 2017, 2015, 2016, 2008, 2007, 2018, 2009, 2010, 2010,
- 2012, 2015, 2016, 2006, 2019, 0, 2025, 2013, 2018, 2023,
- 2024, 2017, 2020, 2019, 2008, 2009, 2013, 2014, 2017, 2015,
- 2016, 2020, 2021, 2018, 2022, 2026, 2029, 2028, 2027, 0,
-
- 2034, 2019, 2022, 2021, 2026, 2028, 2023, 2024, 2025, 2020,
- 2027, 2033, 2032, 2030, 0, 2036, 2035, 2040, 2029, 2021,
- 2030, 2022, 2026, 2029, 2028, 2027, 2031, 2034, 0, 2038,
- 2047, 2050, 0, 2031, 2032, 2040, 2033, 2038, 2033, 2032,
- 2030, 2035, 2036, 2035, 2040, 2041, 2042, 2046, 2045, 2048,
- 2049, 2053, 2041, 2031, 2042, 2045, 2038, 2047, 2050, 2049,
- 2051, 2048, 2054, 2053, 2055, 2056, 0, 2060, 2063, 2062,
- 2065, 2046, 2041, 2042, 2046, 2045, 2048, 2049, 2053, 2056,
- 2066, 2058, 2064, 2051, 2062, 2054, 2059, 2051, 2058, 2054,
- 2064, 2055, 2056, 2059, 2060, 2063, 2062, 2065, 2067, 0,
-
- 2072, 2073, 2066, 2074, 2075, 2076, 2073, 2066, 2058, 2064,
- 2077, 2081, 2083, 2059, 0, 0, 2082, 2074, 2075, 0,
- 2089, 2084, 2077, 2076, 2090, 2067, 2072, 2072, 2073, 2082,
- 2074, 2075, 2076, 2081, 2083, 2086, 2085, 2077, 2081, 2083,
- 2084, 2088, 2089, 2082, 2085, 2091, 2090, 2089, 2084, 2092,
- 2093, 2090, 2095, 2088, 2086, 2094, 2096, 2091, 2097, 2098,
- 2100, 0, 2086, 2085, 0, 2096, 2099, 2097, 2088, 2101,
- 2102, 2103, 2091, 2104, 2095, 2094, 2092, 2093, 2108, 2095,
- 2107, 2101, 2094, 2096, 2109, 2097, 2100, 2100, 2099, 2109,
- 2110, 2098, 2102, 2099, 2107, 2112, 2101, 2102, 2103, 2111,
-
- 2104, 2113, 2108, 2114, 2115, 2108, 2116, 2107, 0, 0,
- 2117, 0, 2110, 2118, 2121, 0, 2109, 2110, 2116, 2119,
- 2123, 2111, 2115, 2124, 2113, 2114, 2111, 2112, 2113, 2117,
- 2114, 2115, 2129, 2116, 2119, 2118, 2127, 2117, 2121, 2125,
- 2118, 2121, 2123, 2126, 2128, 2124, 2119, 2123, 2125, 2130,
- 2124, 2136, 2133, 2140, 2127, 0, 2135, 2126, 2129, 2129,
- 2133, 2134, 2128, 2127, 2135, 2137, 2125, 2130, 2134, 2138,
- 2126, 2128, 2139, 2137, 2141, 2146, 2130, 2143, 2136, 2133,
- 2140, 2148, 2141, 2135, 2139, 2147, 2145, 2138, 2134, 2143,
- 0, 2149, 2137, 2145, 2150, 2153, 2138, 2152, 2146, 2139,
-
- 2155, 2141, 2146, 2159, 2143, 2160, 2156, 2161, 2148, 2153,
- 2149, 2163, 2165, 2145, 2157, 2152, 2150, 2147, 2149, 2156,
- 2170, 2150, 2153, 2155, 2152, 2171, 2157, 2155, 2167, 2159,
- 2159, 2172, 2160, 2156, 2161, 2167, 2169, 2173, 2163, 2165,
- 2174, 2157, 2175, 2169, 2176, 2177, 2170, 2170, 2178, 2174,
- 2179, 2182, 2171, 2180, 2183, 2167, 0, 0, 2172, 2184,
- 2178, 2173, 2180, 2169, 2173, 2181, 2192, 2174, 2187, 2175,
- 2176, 2176, 2177, 2187, 2191, 2178, 2194, 2179, 2181, 2195,
- 2180, 2183, 2184, 2182, 2188, 2198, 2184, 2189, 2188, 2190,
- 2199, 2193, 2181, 2193, 2189, 2191, 2190, 2200, 2192, 2194,
-
- 2187, 2191, 2202, 2194, 2202, 0, 2195, 2198, 2203, 2199,
- 0, 2188, 2198, 2206, 2189, 2205, 2190, 2199, 2193, 2209,
- 2208, 2200, 2206, 2207, 2200, 2211, 2204, 2204, 0, 2202,
- 2207, 2210, 2203, 2208, 2213, 2203, 2204, 2205, 2214, 2210,
- 2206, 2212, 2205, 2215, 2211, 2216, 2209, 2208, 2217, 2212,
- 2207, 2218, 2211, 2204, 2204, 2219, 2220, 2220, 2210, 2217,
- 2213, 2213, 2219, 2221, 2214, 2214, 2225, 2222, 2212, 2215,
- 2215, 2216, 2216, 2218, 2222, 2217, 2226, 2223, 2218, 2227,
- 2229, 2221, 2219, 2220, 2223, 2230, 2231, 2232, 2227, 2235,
- 2221, 2236, 2233, 2225, 2222, 0, 2239, 2237, 2235, 2238,
-
- 2226, 2241, 0, 2226, 2223, 2230, 2227, 2229, 2239, 2232,
- 2233, 2242, 2230, 2231, 2232, 2241, 2235, 2238, 2236, 2233,
- 2237, 2247, 2240, 2239, 2237, 2248, 2238, 2240, 2241, 2242,
- 2249, 2252, 2253, 2252, 2255, 2257, 2266, 0, 2242, 2253,
- 2260, 2257, 2259, 2248, 2267, 2249, 2263, 2261, 2247, 2255,
- 2264, 2268, 2248, 2264, 2240, 0, 0, 2249, 2252, 2253,
- 2272, 2255, 2257, 2266, 2259, 2261, 2260, 2260, 2263, 2259,
- 2269, 2267, 2270, 2263, 2261, 2271, 2264, 2264, 2268, 2270,
- 2264, 2274, 2272, 2271, 2275, 2276, 0, 2272, 2269, 2277,
- 2279, 2278, 2280, 2282, 2281, 2284, 2279, 2269, 0, 2270,
-
- 2278, 2286, 2271, 2281, 2288, 0, 2275, 2276, 2283, 2286,
- 2283, 2275, 2276, 2274, 2280, 2287, 2277, 2279, 2278, 2280,
- 2289, 2281, 2284, 2290, 2294, 2282, 2291, 2287, 2286, 2293,
- 2292, 2288, 2294, 2295, 2289, 2283, 2296, 2290, 2297, 2297,
- 2293, 2298, 2287, 2301, 2302, 2306, 2299, 2289, 2292, 2291,
- 2290, 2294, 2295, 2291, 2299, 2304, 2293, 2292, 2296, 2308,
- 2295, 2304, 2310, 2296, 2307, 2297, 2315, 2311, 2298, 2313,
- 2301, 2302, 2306, 2299, 2311, 2307, 2312, 2313, 2318, 2319,
- 2312, 2308, 2304, 2318, 2316, 2320, 2308, 2335, 2321, 2310,
- 2322, 2307, 2315, 2315, 2311, 2323, 2313, 2316, 2325, 2327,
-
- 2328, 2324, 2323, 2312, 2329, 2318, 2319, 2321, 2322, 2324,
- 2336, 2316, 2320, 2325, 2326, 2321, 2334, 2322, 2333, 2335,
- 2337, 2326, 2323, 2334, 2328, 2325, 2327, 2328, 2324, 2338,
- 2329, 2329, 2341, 2333, 2321, 2342, 2344, 2336, 2343, 2339,
- 2346, 2326, 2348, 2334, 2337, 2333, 2343, 2337, 2339, 2351,
- 2345, 2345, 2352, 2353, 2341, 2349, 2356, 2342, 2354, 2341,
- 2345, 2338, 2342, 2349, 2355, 2343, 2339, 2346, 2344, 2348,
- 2357, 2354, 2358, 2359, 2361, 2353, 2351, 2345, 2345, 2352,
- 2353, 2364, 2349, 2356, 2367, 2354, 2355, 2366, 2369, 2364,
- 2370, 2355, 2366, 2373, 2372, 2359, 2374, 2357, 2371, 2358,
-
- 2359, 2361, 2378, 2370, 2380, 2371, 2379, 2381, 2364, 0,
- 2367, 2367, 2372, 2382, 2366, 2369, 2383, 2370, 2374, 2379,
- 2373, 2372, 2387, 2374, 2385, 2371, 2381, 2388, 2386, 2378,
- 0, 2385, 2389, 2379, 2381, 2386, 2380, 2391, 2383, 2392,
- 2382, 2393, 2388, 2383, 2387, 2394, 2396, 2392, 2393, 2387,
- 2405, 2385, 2394, 2389, 2388, 2386, 2391, 2396, 2395, 2389,
- 2397, 2397, 2399, 2398, 2391, 2406, 2392, 2395, 2393, 2398,
- 2397, 2402, 2394, 2396, 2407, 2411, 2413, 2405, 2402, 2414,
- 2414, 0, 2415, 2417, 2399, 2395, 2418, 2397, 2397, 2399,
- 2398, 2419, 2406, 2421, 2423, 2418, 2424, 2407, 2402, 2425,
-
- 2430, 2407, 2411, 2413, 2419, 2415, 2427, 2428, 2414, 2415,
- 2417, 2425, 2429, 2418, 2423, 2427, 2431, 2432, 2419, 2424,
- 2421, 2423, 2436, 2424, 2433, 2428, 2425, 2430, 2437, 2432,
- 2437, 2435, 2434, 2427, 2428, 2434, 2435, 2438, 2429, 2429,
- 0, 2439, 2443, 2431, 2432, 2440, 2433, 2439, 2441, 2438,
- 2434, 2433, 2442, 2446, 2436, 2437, 2449, 2450, 2451, 2434,
- 2442, 2454, 2434, 2435, 2438, 2456, 2457, 2440, 2439, 2443,
- 2441, 2453, 2440, 2459, 2460, 2441, 2458, 2461, 2457, 2442,
- 2446, 2464, 2465, 2449, 2450, 2451, 2460, 2467, 2454, 2453,
- 2464, 2458, 2456, 2457, 2466, 2466, 2468, 2472, 2453, 2459,
-
- 2459, 2460, 2470, 2458, 2461, 2468, 2465, 2471, 2464, 2465,
- 2472, 2473, 0, 2467, 2467, 2487, 2482, 2474, 2475, 2476,
- 0, 2466, 2487, 2468, 2472, 2474, 2470, 2475, 2485, 2470,
- 2476, 2486, 2485, 2473, 2488, 2491, 2496, 2490, 2473, 2471,
- 2482, 2490, 2487, 2482, 2474, 2475, 2476, 2488, 2492, 2493,
- 2496, 2491, 2495, 2494, 2486, 2485, 0, 2498, 2486, 2497,
- 2499, 2488, 2491, 2496, 2490, 2494, 2498, 2497, 2504, 2506,
- 2492, 2499, 2507, 2501, 2493, 2492, 2493, 2503, 2495, 2495,
- 2494, 2500, 2502, 2500, 2498, 2501, 2497, 2499, 2505, 2502,
- 2503, 2508, 2509, 2510, 0, 2504, 2506, 2512, 2507, 2507,
-
- 2501, 2510, 0, 2511, 2503, 2513, 2505, 2514, 2500, 2502,
- 2511, 2515, 2517, 2515, 2516, 2505, 2519, 0, 2508, 2509,
- 2510, 2512, 2518, 2520, 2512, 2522, 2516, 2513, 2527, 2514,
- 2511, 2520, 2513, 2524, 2514, 2518, 2528, 2522, 2515, 2529,
- 2530, 2516, 2524, 2519, 2517, 2531, 2532, 2534, 2530, 2518,
- 2520, 0, 2522, 2539, 0, 2527, 2533, 2535, 2529, 2538,
- 2524, 2534, 2528, 2528, 2537, 2535, 2529, 2530, 2541, 2533,
- 2542, 2537, 2538, 2543, 2534, 2541, 2539, 2531, 2532, 2544,
- 2539, 2543, 2545, 2533, 2535, 2547, 2538, 2551, 2548, 2552,
- 2546, 2537, 2542, 2544, 2549, 2541, 2545, 2542, 2546, 2553,
-
- 2543, 2554, 2555, 2549, 2559, 2550, 2544, 2547, 2556, 2545,
- 2548, 2552, 2547, 2550, 2551, 2548, 2552, 2546, 2557, 2560,
- 2561, 2549, 2568, 2565, 2555, 2558, 2563, 2554, 2554, 2555,
- 2556, 2553, 2550, 2558, 2564, 2556, 2559, 0, 2571, 2573,
- 2557, 2560, 2564, 2565, 2570, 2557, 2560, 2561, 2566, 2563,
- 2565, 2567, 2558, 2563, 2568, 2569, 2566, 2575, 2570, 2567,
- 2576, 2564, 2578, 2569, 2571, 2571, 2573, 2574, 2576, 2577,
- 2574, 2570, 2579, 2580, 2581, 2566, 2578, 2577, 2567, 2575,
- 2583, 2583, 2569, 2584, 2575, 2574, 2586, 2576, 2581, 2578,
- 2587, 2591, 2588, 2594, 2574, 2580, 2577, 2574, 2579, 2579,
-
- 2580, 2581, 2589, 2585, 2592, 2595, 0, 2583, 2593, 2584,
- 2584, 2585, 2586, 2586, 2588, 2590, 2587, 2587, 2591, 2588,
- 2594, 2596, 2589, 2590, 2598, 2595, 2592, 2601, 2597, 2589,
- 2585, 2592, 2595, 2593, 2604, 2593, 2597, 2599, 2605, 2602,
- 2610, 2596, 2590, 2608, 2606, 2599, 2598, 2602, 2596, 2607,
- 2611, 2598, 2606, 0, 2601, 2597, 2604, 2607, 2611, 2613,
- 2605, 2604, 2614, 2615, 2599, 2605, 2602, 2610, 2617, 2608,
- 2608, 2606, 2612, 2618, 2619, 2621, 2607, 2611, 2627, 2625,
- 2612, 2624, 2628, 2615, 2626, 2613, 2613, 2625, 0, 2614,
- 2615, 0, 2626, 0, 2619, 2617, 0, 2621, 0, 2612,
-
- 2618, 2619, 2621, 2624, 0, 2627, 2625, 0, 2624, 2628,
- 0, 2626, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2633,
- 2633, 2633, 2633, 2633, 2633, 2633, 2634, 2634, 2634, 2634,
- 2634, 2634, 2634, 2635, 2635, 2635, 2635, 2635, 2635, 2635,
- 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2638, 2638, 0,
- 2638, 2638, 2638, 2638, 2639, 2639, 0, 0, 0, 2639,
- 2639, 2640, 2640, 0, 0, 2640, 0, 2640, 2641, 0,
- 0, 0, 0, 0, 2641, 2642, 2642, 0, 0, 0,
- 2642, 2642, 2643, 0, 0, 0, 0, 0, 2643, 2644,
- 2644, 0, 2644, 2644, 2644, 2644, 2645, 2645, 0, 2645,
-
- 2645, 2645, 2645, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631
+ 284, 281, 0, 280, 291, 281, 286, 282, 283, 283,
+ 0, 293, 807, 289, 292, 299, 295, 285, 284, 304,
+ 285, 288, 291, 292, 288, 289, 290, 294, 0, 290,
+ 295, 291, 296, 293, 290, 290, 290, 290, 293, 299,
+ 301, 292, 299, 295, 290, 294, 304, 296, 297, 297,
+ 302, 294, 301, 290, 294, 300, 290, 305, 300, 296,
+ 303, 290, 290, 290, 290, 300, 306, 301, 302, 307,
+ 0, 309, 294, 297, 313, 297, 297, 302, 303, 305,
+
+ 308, 307, 300, 310, 305, 300, 309, 303, 311, 312,
+ 314, 310, 306, 306, 0, 311,