aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCy Schubert <cy@FreeBSD.org>2022-10-16 19:24:20 +0000
committerCy Schubert <cy@FreeBSD.org>2022-10-16 19:24:20 +0000
commit643f9a0581e8aac7eb790ced1164748939829826 (patch)
tree426d366252d838c8c61b439342ab32eccd181425
parent0dde6f4f8e604df8c6fbdab8b4aadb5ddf80c76f (diff)
downloadsrc-vendor/unbound/1.17.0.tar.gz
src-vendor/unbound/1.17.0.zip
unbound: Vendor import 1.16.3vendor/unbound/1.17.0
Added ACL per interface, proxy protocol and bug fixes. Announcement: https://nlnetlabs.nl/news/2022/Oct/13/unbound-1.17.0-released/
-rw-r--r--Makefile.in8
-rw-r--r--acx_nlnetlabs.m46
-rw-r--r--compat/arc4random.c8
-rwxr-xr-xconfig.guess8
-rw-r--r--config.h.in15
-rwxr-xr-xconfig.sub27
-rwxr-xr-xconfigure100
-rw-r--r--configure.ac13
-rw-r--r--daemon/acl_list.c447
-rw-r--r--daemon/acl_list.h39
-rw-r--r--daemon/daemon.c61
-rw-r--r--daemon/daemon.h2
-rw-r--r--daemon/remote.c6
-rw-r--r--daemon/stats.c27
-rw-r--r--daemon/worker.c152
-rw-r--r--daemon/worker.h4
-rw-r--r--dnstap/dtstream.c4
-rw-r--r--dnstap/unbound-dnstap-socket.c4
-rw-r--r--doc/Changelog107
-rw-r--r--doc/README2
-rw-r--r--doc/example.conf.in68
-rw-r--r--doc/libunbound.3.in4
-rw-r--r--doc/unbound-anchor.8.in2
-rw-r--r--doc/unbound-checkconf.8.in2
-rw-r--r--doc/unbound-control.8.in2
-rw-r--r--doc/unbound-host.1.in2
-rw-r--r--doc/unbound.8.in4
-rw-r--r--doc/unbound.conf.5.in63
-rw-r--r--edns-subnet/addrtree.c9
-rw-r--r--edns-subnet/addrtree.h7
-rw-r--r--edns-subnet/subnetmod.c43
-rw-r--r--iterator/iter_hints.c2
-rw-r--r--iterator/iter_resptype.c6
-rw-r--r--iterator/iterator.c105
-rw-r--r--iterator/iterator.h2
-rw-r--r--libunbound/libunbound.c4
-rw-r--r--pythonmod/interface.i4
-rw-r--r--pythonmod/pythonmod_utils.c8
-rw-r--r--respip/respip.c10
-rw-r--r--respip/respip.h6
-rw-r--r--services/authzone.c6
-rw-r--r--services/cache/infra.c37
-rw-r--r--services/cache/infra.h7
-rw-r--r--services/listen_dnsport.c134
-rw-r--r--services/listen_dnsport.h14
-rw-r--r--services/localzone.c12
-rw-r--r--services/mesh.c13
-rw-r--r--services/outside_network.c162
-rw-r--r--services/outside_network.h24
-rw-r--r--services/rpz.c28
-rw-r--r--services/view.c5
-rw-r--r--smallapp/unbound-checkconf.c18
-rw-r--r--smallapp/unbound-control.c4
-rw-r--r--testcode/delayer.c2
-rwxr-xr-xtestcode/do-tests.sh2
-rw-r--r--testcode/fake_event.c21
-rwxr-xr-xtestcode/mini_tdir.sh38
-rwxr-xr-xtestcode/mini_tpkg.sh128
-rw-r--r--testcode/perf.c2
-rw-r--r--testcode/replay.c11
-rw-r--r--testcode/streamtcp.c128
-rw-r--r--testcode/unitecs.c6
-rw-r--r--testcode/unittcpreuse.c253
-rw-r--r--testdata/04-checkconf.tdir/04-checkconf.test10
-rw-r--r--testdata/04-checkconf.tdir/bad.proxy-and-dnscrypt6
-rw-r--r--testdata/04-checkconf.tdir/bad.proxy-and-https4
-rw-r--r--testdata/07-confroot.tdir/07-confroot.dsc2
-rw-r--r--testdata/07-confroot.tdir/07-confroot.pre13
-rw-r--r--testdata/07-confroot.tdir/07-confroot.test7
-rw-r--r--testdata/08-host-lib.tdir/08-host-lib.pre9
-rw-r--r--testdata/08-host-lib.tdir/08-host-lib.test8
-rw-r--r--testdata/acl_interface.tdir/acl_interface.conf140
-rw-r--r--testdata/acl_interface.tdir/acl_interface.dsc16
-rw-r--r--testdata/acl_interface.tdir/acl_interface.post11
-rw-r--r--testdata/acl_interface.tdir/acl_interface.pre75
-rw-r--r--testdata/acl_interface.tdir/acl_interface.test11
-rw-r--r--testdata/acl_interface.tdir/acl_interface.test.scenario205
-rw-r--r--testdata/acl_interface.tdir/acl_interface.testns26
-rw-r--r--testdata/acl_interface.tdir/acl_interface.testns213
-rw-r--r--testdata/clang-analysis.tdir/clang-analysis.dsc2
-rw-r--r--testdata/clang-analysis.tdir/clang-analysis.pre21
-rw-r--r--testdata/clang-analysis.tdir/clang-analysis.test14
-rw-r--r--testdata/common.sh8
-rw-r--r--testdata/dnscrypt_cert.tdir/dnscrypt_cert.post3
-rw-r--r--testdata/dnscrypt_cert.tdir/dnscrypt_cert.pre6
-rw-r--r--testdata/dnscrypt_cert.tdir/dnscrypt_cert.test3
-rw-r--r--testdata/dnscrypt_cert.tdir/precheck.sh16
-rw-r--r--testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.post7
-rw-r--r--testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.pre20
-rw-r--r--testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.test10
-rw-r--r--testdata/dnscrypt_cert_chacha.tdir/precheck.sh16
-rw-r--r--testdata/dnstap.tdir/dnstap.post1
-rw-r--r--testdata/dnstap.tdir/dnstap.pre2
-rw-r--r--testdata/dnstap.tdir/dnstap.test1
-rw-r--r--testdata/dnstap_reconnect.tdir/dnstap_reconnect.post1
-rw-r--r--testdata/dnstap_reconnect.tdir/dnstap_reconnect.pre2
-rw-r--r--testdata/dnstap_reconnect.tdir/dnstap_reconnect.test1
-rw-r--r--testdata/dnstap_tcp.tdir/dnstap_tcp.post1
-rw-r--r--testdata/dnstap_tcp.tdir/dnstap_tcp.pre2
-rw-r--r--testdata/dnstap_tcp.tdir/dnstap_tcp.test1
-rw-r--r--testdata/dnstap_tls.tdir/dnstap_tls.post1
-rw-r--r--testdata/dnstap_tls.tdir/dnstap_tls.pre2
-rw-r--r--testdata/dnstap_tls.tdir/dnstap_tls.test1
-rw-r--r--testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.post1
-rw-r--r--testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.pre2
-rw-r--r--testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.test1
-rw-r--r--testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.post1
-rw-r--r--testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.pre2
-rw-r--r--testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.test1
-rw-r--r--testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.post1
-rw-r--r--testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.pre2
-rw-r--r--testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.test1
-rw-r--r--testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.post1
-rw-r--r--testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.pre2
-rw-r--r--testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.test1
-rw-r--r--testdata/doh_downstream.tdir/doh_downstream.post1
-rw-r--r--testdata/doh_downstream.tdir/doh_downstream.pre2
-rw-r--r--testdata/doh_downstream.tdir/doh_downstream.test1
-rw-r--r--testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.post1
-rw-r--r--testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.pre2
-rw-r--r--testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.test1
-rw-r--r--testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.post1
-rw-r--r--testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.pre2
-rw-r--r--testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.test1
-rw-r--r--testdata/doh_downstream_notls.tdir/doh_downstream_notls.post1
-rw-r--r--testdata/doh_downstream_notls.tdir/doh_downstream_notls.pre2
-rw-r--r--testdata/doh_downstream_notls.tdir/doh_downstream_notls.test1
-rw-r--r--testdata/doh_downstream_post.tdir/doh_downstream_post.post1
-rw-r--r--testdata/doh_downstream_post.tdir/doh_downstream_post.pre2
-rw-r--r--testdata/doh_downstream_post.tdir/doh_downstream_post.test1
-rw-r--r--testdata/dynlibmod.tdir/dynlibmod.post1
-rw-r--r--testdata/dynlibmod.tdir/dynlibmod.pre2
-rw-r--r--testdata/dynlibmod.tdir/dynlibmod.test1
-rwxr-xr-xtestdata/ede.tdir/bogus/clean.sh1
-rw-r--r--testdata/ede.tdir/bogus/dnskey-failures.test.signed7
-rw-r--r--testdata/ede.tdir/bogus/dnssec-failures.test.signed25
-rwxr-xr-xtestdata/ede.tdir/bogus/make-broken-zone.sh38
-rw-r--r--testdata/ede.tdir/bogus/nsec-failures.test.signed7
-rw-r--r--testdata/ede.tdir/bogus/rrsig-failures.test.signed4
-rw-r--r--testdata/ede.tdir/bogus/trust-anchors5
-rw-r--r--testdata/ede.tdir/ede.conf1
-rw-r--r--testdata/ede.tdir/ede.pre8
-rw-r--r--testdata/fetch_glue.rpl33
-rw-r--r--testdata/fetch_glue_cname.rpl35
-rw-r--r--testdata/fwd_ancil.tdir/fwd_ancil.post5
-rw-r--r--testdata/fwd_ancil.tdir/fwd_ancil.pre6
-rw-r--r--testdata/fwd_ancil.tdir/fwd_ancil.test5
-rw-r--r--testdata/ipset.tdir/ipset.post1
-rw-r--r--testdata/ipset.tdir/ipset.pre2
-rw-r--r--testdata/ipset.tdir/ipset.test1
-rw-r--r--testdata/iter_auth_tc.rpl138
-rw-r--r--testdata/iter_emptydp_for_glue.rpl4
-rw-r--r--testdata/iter_recurse.rpl11
-rw-r--r--testdata/nss_compile.tdir/nss_compile.dsc2
-rw-r--r--testdata/nss_compile.tdir/nss_compile.pre13
-rw-r--r--testdata/nss_compile.tdir/nss_compile.test7
-rw-r--r--testdata/padding.tdir/padding.post1
-rw-r--r--testdata/padding.tdir/padding.pre2
-rw-r--r--testdata/padding.tdir/padding.test1
-rw-r--r--testdata/proxy_protocol.tdir/proxy_protocol.conf34
-rw-r--r--testdata/proxy_protocol.tdir/proxy_protocol.dsc16
-rw-r--r--testdata/proxy_protocol.tdir/proxy_protocol.post12
-rw-r--r--testdata/proxy_protocol.tdir/proxy_protocol.pre66
-rw-r--r--testdata/proxy_protocol.tdir/proxy_protocol.test12
-rw-r--r--testdata/proxy_protocol.tdir/proxy_protocol.test.scenario193
-rw-r--r--testdata/proxy_protocol.tdir/proxy_protocol.testns23
-rw-r--r--testdata/proxy_protocol.tdir/unbound_server.key39
-rw-r--r--testdata/proxy_protocol.tdir/unbound_server.pem22
-rw-r--r--testdata/pylib.tdir/pylib.post7
-rw-r--r--testdata/pylib.tdir/pylib.pre3
-rw-r--r--testdata/pylib.tdir/pylib.test7
-rw-r--r--testdata/pymod.tdir/pymod.post7
-rw-r--r--testdata/pymod.tdir/pymod.pre3
-rw-r--r--testdata/pymod.tdir/pymod.test6
-rw-r--r--testdata/pymod_thread.tdir/pymod_thread.post7
-rw-r--r--testdata/pymod_thread.tdir/pymod_thread.pre3
-rw-r--r--testdata/pymod_thread.tdir/pymod_thread.test6
-rw-r--r--testdata/root_anchor.tdir/root_anchor.dsc2
-rw-r--r--testdata/root_anchor.tdir/root_anchor.pre11
-rw-r--r--testdata/root_anchor.tdir/root_anchor.test9
-rw-r--r--testdata/root_hints.tdir/root_hints.dsc2
-rw-r--r--testdata/root_hints.tdir/root_hints.pre11
-rw-r--r--testdata/root_hints.tdir/root_hints.test9
-rw-r--r--testdata/stub_auth_tc.tdir/stub_auth_tc.conf16
-rw-r--r--testdata/stub_auth_tc.tdir/stub_auth_tc.dsc16
-rw-r--r--testdata/stub_auth_tc.tdir/stub_auth_tc.post11
-rw-r--r--testdata/stub_auth_tc.tdir/stub_auth_tc.pre31
-rw-r--r--testdata/stub_auth_tc.tdir/stub_auth_tc.test26
-rw-r--r--testdata/stub_auth_tc.tdir/stub_auth_tc.testns26
-rw-r--r--testdata/subnet_scopezero.crpl439
-rw-r--r--util/config_file.c54
-rw-r--r--util/config_file.h20
-rw-r--r--util/configlexer.c7401
-rw-r--r--util/configlexer.lex6
-rw-r--r--util/configparser.c4019
-rw-r--r--util/configparser.h18
-rw-r--r--util/configparser.y129
-rw-r--r--util/fptr_wlist.c1
-rw-r--r--util/net_help.c6
-rw-r--r--util/net_help.h8
-rw-r--r--util/netevent.c836
-rw-r--r--util/netevent.h42
-rw-r--r--util/proxy_protocol.c139
-rw-r--r--util/proxy_protocol.h131
-rw-r--r--util/storage/dnstree.c13
-rw-r--r--util/storage/dnstree.h10
-rw-r--r--util/tube.c42
-rw-r--r--util/tube.h8
208 files changed, 10759 insertions, 6748 deletions
diff --git a/Makefile.in b/Makefile.in
index 3189731ad52f..e7c76c2588aa 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -130,7 +130,7 @@ 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/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/timehist.c util/tube.c util/proxy_protocol.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 \
@@ -148,7 +148,7 @@ outbound_list.lo alloc.lo config_file.lo configlexer.lo configparser.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 tcp_conn_limit.lo timehist.lo tube.lo winsock_event.lo \
-autotrust.lo val_anchor.lo rpz.lo \
+autotrust.lo val_anchor.lo rpz.lo proxy_protocol.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_OBJ) authzone.lo \
$(SUBNET_OBJ) $(PYTHONMOD_OBJ) $(CHECKLOCK_OBJ) $(DNSTAP_OBJ) $(DNSCRYPT_OBJ) \
@@ -984,6 +984,8 @@ netevent.lo netevent.o: $(srcdir)/util/netevent.c config.h $(srcdir)/util/neteve
$(srcdir)/sldns/sbuffer.h $(srcdir)/util/config_file.h $(srcdir)/services/authzone.h $(srcdir)/daemon/stats.h \
$(srcdir)/util/timehist.h $(srcdir)/libunbound/unbound.h $(srcdir)/respip/respip.h $(srcdir)/sldns/str2wire.h \
$(srcdir)/dnstap/dnstap.h $(srcdir)/services/listen_dnsport.h
+proxy_protocol.lo proxy_protocol.o: $(srcdir)/util/proxy_protocol.c config.h \
+ $(srcdir)/util/proxy_protocol.h $(srcdir)/sldns/sbuffer.h
net_help.lo net_help.o: $(srcdir)/util/net_help.c config.h $(srcdir)/util/net_help.h $(srcdir)/util/log.h \
$(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/module.h \
$(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \
@@ -1512,7 +1514,7 @@ asynclook.lo asynclook.o: $(srcdir)/testcode/asynclook.c config.h $(srcdir)/libu
$(srcdir)/services/modstack.h $(srcdir)/libunbound/unbound-event.h $(srcdir)/util/data/packed_rrset.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/sldns/rrdef.h
streamtcp.lo streamtcp.o: $(srcdir)/testcode/streamtcp.c config.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/util/net_help.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/util/net_help.h $(srcdir)/util/proxy_protocol.h $(srcdir)/util/data/msgencode.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 $(srcdir)/util/data/dname.h $(srcdir)/sldns/sbuffer.h \
$(srcdir)/sldns/str2wire.h $(srcdir)/sldns/wire2str.h
diff --git a/acx_nlnetlabs.m4 b/acx_nlnetlabs.m4
index 1574f97bfe02..cf436ec54bb6 100644
--- a/acx_nlnetlabs.m4
+++ b/acx_nlnetlabs.m4
@@ -2,7 +2,8 @@
# Copyright 2009, Wouter Wijngaards, NLnet Labs.
# BSD licensed.
#
-# Version 43
+# Version 44
+# 2022-09-01 fix checking if nonblocking sockets work on OpenBSD.
# 2021-08-17 fix sed script in ssldir split handling.
# 2021-08-17 fix for openssl to detect split version, with ssldir_include
# and ssldir_lib output directories.
@@ -963,6 +964,9 @@ AC_LANG_SOURCE([[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
diff --git a/compat/arc4random.c b/compat/arc4random.c
index b536d3143d42..486ab89c68d8 100644
--- a/compat/arc4random.c
+++ b/compat/arc4random.c
@@ -57,6 +57,8 @@
#define BLOCKSZ 64
#define RSBUFSZ (16*BLOCKSZ)
+#define REKEY_BASE (1024*1024) /* NB. should be a power of 2 */
+
/* Marked MAP_INHERIT_ZERO, so zero'd out in fork children. */
static struct {
size_t rs_have; /* valid bytes at end of rs_buf */
@@ -179,6 +181,7 @@ static void
_rs_stir(void)
{
u_char rnd[KEYSZ + IVSZ];
+ uint32_t rekey_fuzz = 0;
if (getentropy(rnd, sizeof rnd) == -1) {
if(errno != ENOSYS ||
@@ -201,7 +204,10 @@ _rs_stir(void)
rs->rs_have = 0;
memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf));
- rs->rs_count = 1600000;
+ /* rekey interval should not be predictable */
+ chacha_encrypt_bytes(&rsx->rs_chacha, (uint8_t *)&rekey_fuzz,
+ (uint8_t *)&rekey_fuzz, sizeof(rekey_fuzz));
+ rs->rs_count = REKEY_BASE + (rekey_fuzz % REKEY_BASE);
}
static inline void
diff --git a/config.guess b/config.guess
index a419d8643b62..980b02083815 100755
--- a/config.guess
+++ b/config.guess
@@ -4,7 +4,7 @@
# shellcheck disable=SC2006,SC2268 # see below for rationale
-timestamp='2022-08-01'
+timestamp='2022-09-17'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -966,6 +966,12 @@ EOF
GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
;;
+ x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*)
+ GUESS="$UNAME_MACHINE-pc-managarm-mlibc"
+ ;;
+ *:[Mm]anagarm:*:*)
+ GUESS="$UNAME_MACHINE-unknown-managarm-mlibc"
+ ;;
*:Minix:*:*)
GUESS=$UNAME_MACHINE-unknown-minix
;;
diff --git a/config.h.in b/config.h.in
index cc1fbe864818..2caecf30d040 100644
--- a/config.h.in
+++ b/config.h.in
@@ -298,6 +298,9 @@
/* Define to 1 if you have the `getrlimit' function. */
#undef HAVE_GETRLIMIT
+/* Define to 1 if you have the `gettid' function. */
+#undef HAVE_GETTID
+
/* Define to 1 if you have the `glob' function. */
#undef HAVE_GLOB
@@ -457,6 +460,12 @@
/* Define to 1 if you have the `OSSL_PARAM_BLD_new' function. */
#undef HAVE_OSSL_PARAM_BLD_NEW
+/* Define to 1 if you have the `poll' function. */
+#undef HAVE_POLL
+
+/* Define to 1 if you have the <poll.h> header file. */
+#undef HAVE_POLL_H
+
/* Define if you have POSIX threads libraries and header files. */
#undef HAVE_PTHREAD
@@ -800,12 +809,18 @@
/* Shared data */
#undef SHARE_DIR
+/* The size of `pthread_t', as computed by sizeof. */
+#undef SIZEOF_PTHREAD_T
+
/* The size of `size_t', as computed by sizeof. */
#undef SIZEOF_SIZE_T
/* The size of `time_t', as computed by sizeof. */
#undef SIZEOF_TIME_T
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
/* define if (v)snprintf does not return length needed, (but length used) */
#undef SNPRINTF_RET_BROKEN
diff --git a/config.sub b/config.sub
index fbaa37f2352d..baf1512b3c03 100755
--- a/config.sub
+++ b/config.sub
@@ -4,7 +4,7 @@
# shellcheck disable=SC2006,SC2268 # see below for rationale
-timestamp='2022-08-01'
+timestamp='2022-09-17'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -145,7 +145,7 @@ case $1 in
nto-qnx* | linux-* | uclinux-uclibc* \
| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
- | storm-chaos* | os2-emx* | rtmk-nova*)
+ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-*)
basic_machine=$field1
basic_os=$maybe_os
;;
@@ -1341,6 +1341,10 @@ EOF
kernel=linux
os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
;;
+ managarm*)
+ kernel=managarm
+ os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'`
+ ;;
*)
kernel=
os=$basic_os
@@ -1754,7 +1758,7 @@ case $os in
| onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
| midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
| nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
- | fiwix* )
+ | fiwix* | mlibc* )
;;
# This one is extra strict with allowed versions
sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
@@ -1762,6 +1766,9 @@ case $os in
;;
none)
;;
+ kernel* )
+ # Restricted further below
+ ;;
*)
echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
exit 1
@@ -1772,16 +1779,26 @@ esac
# (given a valid OS), if there is a kernel.
case $kernel-$os in
linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
- | linux-musl* | linux-relibc* | linux-uclibc* )
+ | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* )
;;
uclinux-uclibc* )
;;
- -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
+ managarm-mlibc* | managarm-kernel* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* )
# These are just libc implementations, not actual OSes, and thus
# require a kernel.
echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
exit 1
;;
+ -kernel* )
+ echo "Invalid configuration \`$1': \`$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ *-kernel* )
+ echo "Invalid configuration \`$1': \`$kernel' does not support \`$os'." 1>&2
+ exit 1
+ ;;
kfreebsd*-gnu* | kopensolaris*-gnu*)
;;
vxworks-simlinux | vxworks-simwindows | vxworks-spe)
diff --git a/configure b/configure
index f40187910ecc..a2837d18553b 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.16.3.
+# Generated by GNU Autoconf 2.69 for unbound 1.17.0.
#
# Report bugs to <unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues>.
#
@@ -591,8 +591,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='unbound'
PACKAGE_TARNAME='unbound'
-PACKAGE_VERSION='1.16.3'
-PACKAGE_STRING='unbound 1.16.3'
+PACKAGE_VERSION='1.17.0'
+PACKAGE_STRING='unbound 1.17.0'
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues'
PACKAGE_URL=''
@@ -1477,7 +1477,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.16.3 to adapt to many kinds of systems.
+\`configure' configures unbound 1.17.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1543,7 +1543,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of unbound 1.16.3:";;
+ short | recursive ) echo "Configuration of unbound 1.17.0:";;
esac
cat <<\_ACEOF
@@ -1785,7 +1785,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-unbound configure 1.16.3
+unbound configure 1.17.0
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2494,7 +2494,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.16.3, which was
+It was created by unbound $as_me 1.17.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2844,13 +2844,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
UNBOUND_VERSION_MAJOR=1
-UNBOUND_VERSION_MINOR=16
+UNBOUND_VERSION_MINOR=17
-UNBOUND_VERSION_MICRO=3
+UNBOUND_VERSION_MICRO=0
LIBUNBOUND_CURRENT=9
-LIBUNBOUND_REVISION=19
+LIBUNBOUND_REVISION=20
LIBUNBOUND_AGE=1
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -2937,6 +2937,7 @@ LIBUNBOUND_AGE=1
# 1.16.1 had 9:17:1
# 1.16.2 had 9:18:1
# 1.16.3 had 9:19:1
+# 1.17.0 had 9:20:1
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -14772,7 +14773,7 @@ fi
fi
# Checks for header files.
-for ac_header in stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/select.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h ifaddrs.h
+for ac_header in stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/select.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h ifaddrs.h poll.h
do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
@@ -16031,6 +16032,9 @@ else
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
@@ -17101,6 +17105,72 @@ _ACEOF
fi
+ # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5
+$as_echo_n "checking size of unsigned long... " >&6; }
+if ${ac_cv_sizeof_unsigned_long+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_unsigned_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned long)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_unsigned_long=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5
+$as_echo "$ac_cv_sizeof_unsigned_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+
+ # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pthread_t" >&5
+$as_echo_n "checking size of pthread_t... " >&6; }
+if ${ac_cv_sizeof_pthread_t+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))" "ac_cv_sizeof_pthread_t" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_pthread_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (pthread_t)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_pthread_t=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_pthread_t" >&5
+$as_echo "$ac_cv_sizeof_pthread_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_PTHREAD_T $ac_cv_sizeof_pthread_t
+_ACEOF
+
+
if echo "$CFLAGS" | $GREP -e "-pthread" >/dev/null; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if -pthread unused during linking" >&5
@@ -20591,7 +20661,7 @@ if test "$ac_res" != no; then :
fi
-for ac_func in tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex
+for ac_func in tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex poll gettid
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -22015,7 +22085,7 @@ _ACEOF
-version=1.16.3
+version=1.17.0
date=`date +'%b %e, %Y'`
@@ -22534,7 +22604,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.16.3, which was
+This file was extended by unbound $as_me 1.17.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -22600,7 +22670,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.16.3
+unbound config.status 1.17.0
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index bf8aa9d8cdb0..57cc7e604b1e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,15 +10,15 @@ sinclude(dnscrypt/dnscrypt.m4)
# must be numbers. ac_defun because of later processing
m4_define([VERSION_MAJOR],[1])
-m4_define([VERSION_MINOR],[16])
-m4_define([VERSION_MICRO],[3])
+m4_define([VERSION_MINOR],[17])
+m4_define([VERSION_MICRO],[0])
AC_INIT([unbound],m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]),[unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues],[unbound])
AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO])
LIBUNBOUND_CURRENT=9
-LIBUNBOUND_REVISION=19
+LIBUNBOUND_REVISION=20
LIBUNBOUND_AGE=1
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -105,6 +105,7 @@ LIBUNBOUND_AGE=1
# 1.16.1 had 9:17:1
# 1.16.2 had 9:18:1
# 1.16.3 had 9:19:1
+# 1.17.0 had 9:20:1
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -397,7 +398,7 @@ PKG_PROG_PKG_CONFIG
fi
# Checks for header files.
-AC_CHECK_HEADERS([stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/select.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h ifaddrs.h],,, [AC_INCLUDES_DEFAULT])
+AC_CHECK_HEADERS([stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/select.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h ifaddrs.h poll.h],,, [AC_INCLUDES_DEFAULT])
# net/if.h portability for Darwin see:
# https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Header-Portability.html
AC_CHECK_HEADERS([net/if.h],,, [
@@ -607,6 +608,8 @@ if test x_$withval != x_no; then
CC="$PTHREAD_CC"
ub_have_pthreads=yes
AC_CHECK_TYPES([pthread_spinlock_t, pthread_rwlock_t],,,[#include <pthread.h>])
+ AC_CHECK_SIZEOF([unsigned long])
+ AC_CHECK_SIZEOF(pthread_t)
if echo "$CFLAGS" | $GREP -e "-pthread" >/dev/null; then
AC_MSG_CHECKING([if -pthread unused during linking])
@@ -1644,7 +1647,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([
AC_MSG_RESULT(no))
AC_SEARCH_LIBS([setusercontext], [util])
-AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex])
+AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex poll gettid])
AC_CHECK_FUNCS([setresuid],,[AC_CHECK_FUNCS([setreuid])])
AC_CHECK_FUNCS([setresgid],,[AC_CHECK_FUNCS([setregid])])
diff --git a/daemon/acl_list.c b/daemon/acl_list.c
index aecb3e0c6437..f3961dbbb7ad 100644
--- a/daemon/acl_list.c
+++ b/daemon/acl_list.c
@@ -46,9 +46,10 @@
#include "util/config_file.h"
#include "util/net_help.h"
#include "services/localzone.h"
+#include "services/listen_dnsport.h"
#include "sldns/str2wire.h"
-struct acl_list*
+struct acl_list*
acl_list_create(void)
{
struct acl_list* acl = (struct acl_list*)calloc(1,
@@ -63,10 +64,10 @@ acl_list_create(void)
return acl;
}
-void
+void
acl_list_delete(struct acl_list* acl)
{
- if(!acl)
+ if(!acl)
return;
regional_destroy(acl->region);
free(acl);
@@ -74,8 +75,8 @@ acl_list_delete(struct acl_list* acl)
/** insert new address into acl_list structure */
static struct acl_addr*
-acl_list_insert(struct acl_list* acl, struct sockaddr_storage* addr,
- socklen_t addrlen, int net, enum acl_access control,
+acl_list_insert(struct acl_list* acl, struct sockaddr_storage* addr,
+ socklen_t addrlen, int net, enum acl_access control,
int complain_duplicates)
{
struct acl_addr* node = regional_alloc_zero(acl->region,
@@ -90,6 +91,31 @@ acl_list_insert(struct acl_list* acl, struct sockaddr_storage* addr,
return node;
}
+/** parse str to acl_access enum */
+static int
+parse_acl_access(const char* str, enum acl_access* control)
+{
+ if(strcmp(str, "allow") == 0)
+ *control = acl_allow;
+ else if(strcmp(str, "deny") == 0)
+ *control = acl_deny;
+ else if(strcmp(str, "refuse") == 0)
+ *control = acl_refuse;
+ else if(strcmp(str, "deny_non_local") == 0)
+ *control = acl_deny_non_local;
+ else if(strcmp(str, "refuse_non_local") == 0)
+ *control = acl_refuse_non_local;
+ else if(strcmp(str, "allow_snoop") == 0)
+ *control = acl_allow_snoop;
+ else if(strcmp(str, "allow_setrd") == 0)
+ *control = acl_allow_setrd;
+ else {
+ log_err("access control type %s unknown", str);
+ return 0;
+ }
+ return 1;
+}
+
/** apply acl_list string */
static int
acl_list_str_cfg(struct acl_list* acl, const char* str, const char* s2,
@@ -99,29 +125,14 @@ acl_list_str_cfg(struct acl_list* acl, const char* str, const char* s2,
int net;
socklen_t addrlen;
enum acl_access control;
- if(strcmp(s2, "allow") == 0)
- control = acl_allow;
- else if(strcmp(s2, "deny") == 0)
- control = acl_deny;
- else if(strcmp(s2, "refuse") == 0)
- control = acl_refuse;
- else if(strcmp(s2, "deny_non_local") == 0)
- control = acl_deny_non_local;
- else if(strcmp(s2, "refuse_non_local") == 0)
- control = acl_refuse_non_local;
- else if(strcmp(s2, "allow_snoop") == 0)
- control = acl_allow_snoop;
- else if(strcmp(s2, "allow_setrd") == 0)
- control = acl_allow_setrd;
- else {
- log_err("access control type %s unknown", str);
+ if(!parse_acl_access(s2, &control)) {
return 0;
}
if(!netblockstrtoaddr(str, UNBOUND_DNS_PORT, &addr, &addrlen, &net)) {
log_err("cannot parse access control: %s %s", str, s2);
return 0;
}
- if(!acl_list_insert(acl, &addr, addrlen, net, control,
+ if(!acl_list_insert(acl, &addr, addrlen, net, control,
complain_duplicates)) {
log_err("out of memory");
return 0;
@@ -131,19 +142,27 @@ acl_list_str_cfg(struct acl_list* acl, const char* str, const char* s2,
/** find or create node (NULL on parse or error) */
static struct acl_addr*
-acl_find_or_create(struct acl_list* acl, const char* str)
+acl_find_or_create_str2addr(struct acl_list* acl, const char* str,
+ int is_interface, int port)
{
struct acl_addr* node;
struct sockaddr_storage addr;
- int net;
socklen_t addrlen;
- if(!netblockstrtoaddr(str, UNBOUND_DNS_PORT, &addr, &addrlen, &net)) {
- log_err("cannot parse netblock: %s", str);
- return NULL;
+ int net = (str_is_ip6(str)?128:32);
+ if(is_interface) {
+ if(!extstrtoaddr(str, &addr, &addrlen, port)) {
+ log_err("cannot parse interface: %s", str);
+ return NULL;
+ }
+ } else {
+ if(!netblockstrtoaddr(str, UNBOUND_DNS_PORT, &addr, &addrlen, &net)) {
+ log_err("cannot parse netblock: %s", str);
+ return NULL;
+ }
}
/* find or create node */
if(!(node=(struct acl_addr*)addr_tree_find(&acl->tree, &addr,
- addrlen, net))) {
+ addrlen, net)) && !is_interface) {
/* create node, type 'allow' since otherwise tags are
* pointless, can override with specific access-control: cfg */
if(!(node=(struct acl_addr*)acl_list_insert(acl, &addr,
@@ -155,14 +174,65 @@ acl_find_or_create(struct acl_list* acl, const char* str)
return node;
}
+/** find or create node (NULL on error) */
+static struct acl_addr*
+acl_find_or_create(struct acl_list* acl, struct sockaddr_storage* addr,
+ socklen_t addrlen, enum acl_access control)
+{
+ struct acl_addr* node;
+ int net = (addr_is_ip6(addr, addrlen)?128:32);
+ /* find or create node */
+ if(!(node=(struct acl_addr*)addr_tree_find(&acl->tree, addr,
+ addrlen, net))) {
+ /* create node;
+ * can override with specific access-control: cfg */
+ if(!(node=(struct acl_addr*)acl_list_insert(acl, addr,
+ addrlen, net, control, 1))) {
+ log_err("out of memory");
+ return NULL;
+ }
+ }
+ return node;
+}
+
+/** apply acl_interface string */
+static int
+acl_interface_str_cfg(struct acl_list* acl_interface, const char* iface,
+ const char* s2, int port)
+{
+ struct acl_addr* node;
+ enum acl_access control;
+ if(!parse_acl_access(s2, &control)) {
+ return 0;
+ }
+ if(!(node=acl_find_or_create_str2addr(acl_interface, iface, 1, port))) {
+ log_err("cannot update ACL on non-configured interface: %s %d",
+ iface, port);
+ return 0;
+ }
+ node->control = control;
+ return 1;
+}
+
+struct acl_addr*
+acl_interface_insert(struct acl_list* acl_interface,
+ struct sockaddr_storage* addr, socklen_t addrlen,
+ enum acl_access control)
+{
+ return acl_find_or_create(acl_interface, addr, addrlen, control);
+}
+
/** apply acl_tag string */
static int
acl_list_tags_cfg(struct acl_list* acl, const char* str, uint8_t* bitmap,
- size_t bitmaplen)
+ size_t bitmaplen, int is_interface, int port)
{
struct acl_addr* node;
- if(!(node=acl_find_or_create(acl, str)))
+ if(!(node=acl_find_or_create_str2addr(acl, str, is_interface, port))) {
+ if(is_interface)
+ log_err("non-configured interface: %s", str);
return 0;
+ }
node->taglen = bitmaplen;
node->taglist = regional_alloc_init(acl->region, bitmap, bitmaplen);
if(!node->taglist) {
@@ -175,11 +245,14 @@ acl_list_tags_cfg(struct acl_list* acl, const char* str, uint8_t* bitmap,
/** apply acl_view string */
static int
acl_list_view_cfg(struct acl_list* acl, const char* str, const char* str2,
- struct views* vs)
+ struct views* vs, int is_interface, int port)
{
struct acl_addr* node;
- if(!(node=acl_find_or_create(acl, str)))
+ if(!(node=acl_find_or_create_str2addr(acl, str, is_interface, port))) {
+ if(is_interface)
+ log_err("non-configured interface: %s", str);
return 0;
+ }
node->view = views_find_view(vs, str2, 0 /* get read lock*/);
if(!node->view) {
log_err("no view with name: %s", str2);
@@ -192,13 +265,17 @@ acl_list_view_cfg(struct acl_list* acl, const char* str, const char* str2,
/** apply acl_tag_action string */
static int
acl_list_tag_action_cfg(struct acl_list* acl, struct config_file* cfg,
- const char* str, const char* tag, const char* action)
+ const char* str, const char* tag, const char* action,
+ int is_interface, int port)
{
struct acl_addr* node;
int tagid;
enum localzone_type t;
- if(!(node=acl_find_or_create(acl, str)))
+ if(!(node=acl_find_or_create_str2addr(acl, str, is_interface, port))) {
+ if(is_interface)
+ log_err("non-configured interface: %s", str);
return 0;
+ }
/* allocate array if not yet */
if(!node->tag_actions) {
node->tag_actions = (uint8_t*)regional_alloc_zero(acl->region,
@@ -281,13 +358,17 @@ check_data(const char* data, const struct config_strlist* head)
/** apply acl_tag_data string */
static int
acl_list_tag_data_cfg(struct acl_list* acl, struct config_file* cfg,
- const char* str, const char* tag, const char* data)
+ const char* str, const char* tag, const char* data,
+ int is_interface, int port)
{
struct acl_addr* node;
int tagid;
char* dupdata;
- if(!(node=acl_find_or_create(acl, str)))
+ if(!(node=acl_find_or_create_str2addr(acl, str, is_interface, port))) {
+ if(is_interface)
+ log_err("non-configured interface: %s", str);
return 0;
+ }
/* allocate array if not yet */
if(!node->tag_datas) {
node->tag_datas = (struct config_strlist**)regional_alloc_zero(
@@ -329,11 +410,11 @@ acl_list_tag_data_cfg(struct acl_list* acl, struct config_file* cfg,
}
/** read acl_list config */
-static int
-read_acl_list(struct acl_list* acl, struct config_file* cfg)
+static int
+read_acl_list(struct acl_list* acl, struct config_str2list* acls)
{
struct config_str2list* p;
- for(p = cfg->acls; p; p = p->next) {
+ for(p = acls; p; p = p->next) {
log_assert(p->str && p->str2);
if(!acl_list_str_cfg(acl, p->str, p->str2, 1))
return 0;
@@ -341,16 +422,17 @@ read_acl_list(struct acl_list* acl, struct config_file* cfg)
return 1;
}
-/** read acl tags config */
-static int
-read_acl_tags(struct acl_list* acl, struct config_file* cfg)
+/** read acl view config */
+static int
+read_acl_view(struct acl_list* acl, struct config_str2list** acl_view,
+ struct views* v)
{
- struct config_strbytelist* np, *p = cfg->acl_tags;
- cfg->acl_tags = NULL;
+ struct config_str2list* np, *p = *acl_view;
+ *acl_view = NULL;
while(p) {
log_assert(p->str && p->str2);
- if(!acl_list_tags_cfg(acl, p->str, p->str2, p->str2len)) {
- config_del_strbytelist(p);
+ if(!acl_list_view_cfg(acl, p->str, p->str2, v, 0, 0)) {
+ config_deldblstrlist(p);
return 0;
}
/* free the items as we go to free up memory */
@@ -363,15 +445,16 @@ read_acl_tags(struct acl_list* acl, struct config_file* cfg)
return 1;
}
-/** read acl view config */
-static int
-read_acl_view(struct acl_list* acl, struct config_file* cfg, struct views* v)
+/** read acl tags config */
+static int
+read_acl_tags(struct acl_list* acl, struct config_strbytelist** acl_tags)
{
- struct config_str2list* np, *p = cfg->acl_view;
- cfg->acl_view = NULL;
+ struct config_strbytelist* np, *p = *acl_tags;
+ *acl_tags = NULL;
while(p) {
log_assert(p->str && p->str2);
- if(!acl_list_view_cfg(acl, p->str, p->str2, v)) {
+ if(!acl_list_tags_cfg(acl, p->str, p->str2, p->str2len, 0, 0)) {
+ config_del_strbytelist(p);
return 0;
}
/* free the items as we go to free up memory */
@@ -385,16 +468,17 @@ read_acl_view(struct acl_list* acl, struct config_file* cfg, struct views* v)
}
/** read acl tag actions config */
-static int
-read_acl_tag_actions(struct acl_list* acl, struct config_file* cfg)
+static int
+read_acl_tag_actions(struct acl_list* acl, struct config_file* cfg,
+ struct config_str3list** acl_tag_actions)
{
struct config_str3list* p, *np;
- p = cfg->acl_tag_actions;
- cfg->acl_tag_actions = NULL;
+ p = *acl_tag_actions;
+ *acl_tag_actions = NULL;
while(p) {
log_assert(p->str && p->str2 && p->str3);
if(!acl_list_tag_action_cfg(acl, cfg, p->str, p->str2,
- p->str3)) {
+ p->str3, 0, 0)) {
config_deltrplstrlist(p);
return 0;
}
@@ -410,15 +494,17 @@ read_acl_tag_actions(struct acl_list* acl, struct config_file* cfg)
}
/** read acl tag datas config */
-static int
-read_acl_tag_datas(struct acl_list* acl, struct config_file* cfg)
+static int
+read_acl_tag_datas(struct acl_list* acl, struct config_file* cfg,
+ struct config_str3list** acl_tag_datas)
{
struct config_str3list* p, *np;
- p = cfg->acl_tag_datas;
- cfg->acl_tag_datas = NULL;
+ p = *acl_tag_datas;
+ *acl_tag_datas = NULL;
while(p) {
log_assert(p->str && p->str2 && p->str3);
- if(!acl_list_tag_data_cfg(acl, cfg, p->str, p->str2, p->str3)) {
+ if(!acl_list_tag_data_cfg(acl, cfg, p->str, p->str2, p->str3,
+ 0, 0)) {
config_deltrplstrlist(p);
return 0;
}
@@ -433,30 +519,27 @@ read_acl_tag_datas(struct acl_list* acl, struct config_file* cfg)
return 1;
}
-int
+int
acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg,
struct views* v)
{
regional_free_all(acl->region);
addr_tree_init(&acl->tree);
- if(!read_acl_list(acl, cfg))
+ if(!read_acl_list(acl, cfg->acls))
return 0;
- if(!read_acl_view(acl, cfg, v))
+ if(!read_acl_view(acl, &cfg->acl_view, v))
return 0;
- if(!read_acl_tags(acl, cfg))
+ if(!read_acl_tags(acl, &cfg->acl_tags))
return 0;
- if(!read_acl_tag_actions(acl, cfg))
+ if(!read_acl_tag_actions(acl, cfg, &cfg->acl_tag_actions))
return 0;
- if(!read_acl_tag_datas(acl, cfg))
+ if(!read_acl_tag_datas(acl, cfg, &cfg->acl_tag_datas))
return 0;
/* insert defaults, with '0' to ignore them if they are duplicates */
- if(!acl_list_str_cfg(acl, "0.0.0.0/0", "refuse", 0))
- return 0;
+ /* the 'refuse' defaults for /0 are now done per interface instead */
if(!acl_list_str_cfg(acl, "127.0.0.0/8", "allow", 0))
return 0;
if(cfg->do_ip6) {
- if(!acl_list_str_cfg(acl, "::0/0", "refuse", 0))
- return 0;
if(!acl_list_str_cfg(acl, "::1", "allow", 0))
return 0;
if(!acl_list_str_cfg(acl, "::ffff:127.0.0.1", "allow", 0))
@@ -466,7 +549,223 @@ acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg,
return 1;
}
-enum acl_access
+int
+acl_interface_compare(const void* k1, const void* k2)
+{
+ struct addr_tree_node* n1 = (struct addr_tree_node*)k1;
+ struct addr_tree_node* n2 = (struct addr_tree_node*)k2;
+ return sockaddr_cmp(&n1->addr, n1->addrlen, &n2->addr,
+ n2->addrlen);
+ /* We don't care about comparing node->net. All addresses in the
+ * acl_interface tree have either 32 (ipv4) or 128 (ipv6). */
+}
+
+void
+acl_interface_init(struct acl_list* acl_interface)
+{
+ regional_free_all(acl_interface->region);
+ /* We want comparison in the tree to include only address and port.
+ * We don't care about comparing node->net. All addresses in the
+ * acl_interface->tree should have either 32 (ipv4) or 128 (ipv6).
+ * Initialise with the appropriate compare function but keep treating
+ * it as an addr_tree. */
+ addr_tree_addrport_init(&acl_interface->tree);
+}
+
+static int
+read_acl_interface_action(struct acl_list* acl_interface,
+ struct config_str2list* acls, int port)
+{
+ struct config_str2list* p;
+ for(p = acls; p; p = p->next) {
+ char** resif = NULL;
+ int num_resif = 0;
+ int i;
+ log_assert(p->str && p->str2);
+ if(!resolve_interface_names(&p->str, 1, NULL, &resif, &num_resif))
+ return 0;
+ for(i = 0; i<num_resif; i++) {
+ if(!acl_interface_str_cfg(acl_interface, resif[i], p->str2, port)){
+ config_del_strarray(resif, num_resif);
+ return 0;
+ }
+ }
+ config_del_strarray(resif, num_resif);
+ }
+ return 1;
+}
+
+/** read acl view config for interface */
+static int
+read_acl_interface_view(struct acl_list* acl_interface,
+ struct config_str2list** acl_view,
+ struct views* v, int port)
+{
+ struct config_str2list* np, *p = *acl_view;
+ *acl_view = NULL;
+ while(p) {
+ char** resif = NULL;
+ int num_resif = 0;
+ int i;
+ log_assert(p->str && p->str2);
+ if(!resolve_interface_names(&p->str, 1, NULL, &resif, &num_resif)) {
+ config_deldblstrlist(p);
+ return 0;
+ }
+ for(i = 0; i<num_resif; i++) {
+ if(!acl_list_view_cfg(acl_interface, resif[i], p->str2,
+ v, 1, port)) {
+ config_del_strarray(resif, num_resif);
+ config_deldblstrlist(p);
+ return 0;
+ }
+ }
+ config_del_strarray(resif, num_resif);
+ /* free the items as we go to free up memory */
+ np = p->next;
+ free(p->str);
+ free(p->str2);
+ free(p);
+ p = np;
+ }
+ return 1;
+}
+
+/** read acl tags config for interface */
+static int
+read_acl_interface_tags(struct acl_list* acl_interface,
+ struct config_strbytelist** acl_tags, int port)
+{
+ struct config_strbytelist* np, *p = *acl_tags;
+ *acl_tags = NULL;
+ while(p) {
+ char** resif = NULL;
+ int num_resif = 0;
+ int i;
+ log_assert(p->str && p->str2);
+ if(!resolve_interface_names(&p->str, 1, NULL, &resif, &num_resif)) {
+ config_del_strbytelist(p);
+ return 0;
+ }
+ for(i = 0; i<num_resif; i++) {
+ if(!acl_list_tags_cfg(acl_interface, resif[i], p->str2,
+ p->str2len, 1, port)) {
+ config_del_strbytelist(p);
+ config_del_strarray(resif, num_resif);
+ return 0;
+ }
+ }
+ config_del_strarray(resif, num_resif);
+ /* free the items as we go to free up memory */
+ np = p->next;
+ free(p->str);
+ free(p->str2);
+ free(p);
+ p = np;
+ }
+ return 1;
+}
+
+/** read acl tag actions config for interface*/
+static int
+read_acl_interface_tag_actions(struct acl_list* acl_interface,
+ struct config_file* cfg,
+ struct config_str3list** acl_tag_actions, int port)
+{
+ struct config_str3list* p, *np;
+ p = *acl_tag_actions;
+ *acl_tag_actions = NULL;
+ while(p) {
+ char** resif = NULL;
+ int num_resif = 0;
+ int i;
+ log_assert(p->str && p->str2 && p->str3);
+ if(!resolve_interface_names(&p->str, 1, NULL, &resif, &num_resif)) {
+ config_deltrplstrlist(p);
+ return 0;
+ }
+ for(i = 0; i<num_resif; i++) {
+ if(!acl_list_tag_action_cfg(acl_interface, cfg,
+ resif[i], p->str2, p->str3, 1, port)) {
+ config_deltrplstrlist(p);
+ config_del_strarray(resif, num_resif);
+ return 0;
+ }
+ }
+ config_del_strarray(resif, num_resif);
+ /* free the items as we go to free up memory */
+ np = p->next;
+ free(p->str);
+ free(p->str2);
+ free(p->str3);
+ free(p);
+ p = np;
+ }
+ return 1;
+}
+
+/** read acl tag datas config for interface */
+static int
+read_acl_interface_tag_datas(struct acl_list* acl_interface,
+ struct config_file* cfg,
+ struct config_str3list** acl_tag_datas, int port)
+{
+ struct config_str3list* p, *np;
+ p = *acl_tag_datas;
+ *acl_tag_datas = NULL;
+ while(p) {
+ char** resif = NULL;
+ int num_resif = 0;
+ int i;
+ log_assert(p->str && p->str2 && p->str3);
+ if(!resolve_interface_names(&p->str, 1, NULL, &resif, &num_resif)) {
+ config_deltrplstrlist(p);
+ return 0;
+ }
+ for(i = 0; i<num_resif; i++) {
+ if(!acl_list_tag_data_cfg(acl_interface, cfg,
+ resif[i], p->str2, p->str3, 1, port)) {
+ config_deltrplstrlist(p);
+ config_del_strarray(resif, num_resif);
+ return 0;
+ }
+ }
+ config_del_strarray(resif, num_resif);
+ /* free the items as we go to free up memory */
+ np = p->next;
+ free(p->str);
+ free(p->str2);
+ free(p->str3);
+ free(p);
+ p = np;
+ }
+ return 1;
+}
+
+int
+acl_interface_apply_cfg(struct acl_list* acl_interface, struct config_file* cfg,
+ struct views* v)
+{
+ if(!read_acl_interface_action(acl_interface, cfg->interface_actions,
+ cfg->port))
+ return 0;
+ if(!read_acl_interface_view(acl_interface, &cfg->interface_view, v,
+ cfg->port))
+ return 0;
+ if(!read_acl_interface_tags(acl_interface, &cfg->interface_tags,
+ cfg->port))
+ return 0;
+ if(!read_acl_interface_tag_actions(acl_interface, cfg,
+ &cfg->interface_tag_actions, cfg->port))
+ return 0;
+ if(!read_acl_interface_tag_datas(acl_interface, cfg,
+ &cfg->interface_tag_datas, cfg->port))
+ return 0;
+ addr_tree_init_parents(&acl_interface->tree);
+ return 1;
+}
+
+enum acl_access
acl_get_control(struct acl_addr* acl)
{
if(acl) return acl->control;
@@ -481,7 +780,7 @@ acl_addr_lookup(struct acl_list* acl, struct sockaddr_storage* addr,
addr, addrlen);
}
-size_t
+size_t
acl_list_get_mem(struct acl_list* acl)
{
if(!acl) return 0;
diff --git a/daemon/acl_list.h b/daemon/acl_list.h
index c09e832a1def..c717179baf5e 100644
--- a/daemon/acl_list.h
+++ b/daemon/acl_list.h
@@ -36,7 +36,7 @@
/**
* \file
*
- * This file keeps track of the list of clients that are allowed to
+ * This file keeps track of the list of clients that are allowed to
* access the server.
*/
@@ -74,7 +74,7 @@ enum acl_access {
struct acl_list {
/** regional for allocation */
struct regional* region;
- /**
+ /**
* Tree of the addresses that are allowed/blocked.
* contents of type acl_addr.
*/
@@ -108,7 +108,7 @@ struct acl_addr {
};
/**
- * Create acl structure
+ * Create acl structure
* @return new structure or NULL on error.
*/
struct acl_list* acl_list_create(void);
@@ -120,6 +120,20 @@ struct acl_list* acl_list_create(void);
void acl_list_delete(struct acl_list* acl);
/**
+ * Insert interface in the acl_list. This should happen when the listening
+ * interface is setup.
+ * @param acl_interface: acl_list to insert to.
+ * @param addr: interface IP.
+ * @param addrlen: length of the interface IP.
+ * @param control: acl_access.
+ * @return new structure or NULL on error.
+ */
+struct acl_addr*
+acl_interface_insert(struct acl_list* acl_interface,
+ struct sockaddr_storage* addr, socklen_t addrlen,
+ enum acl_access control);
+
+/**
* Process access control config.
* @param acl: where to store.
* @param cfg: config options.
@@ -129,6 +143,25 @@ void acl_list_delete(struct acl_list* acl);
int acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg,
struct views* v);
+/** compare ACL interface "addr_tree" nodes (+port) */
+int acl_interface_compare(const void* k1, const void* k2);
+
+/**
+ * Initialise (also clean) the acl_interface struct.
+ * @param acl_interface: where to store.
+ */
+void acl_interface_init(struct acl_list* acl_interface);
+
+/**
+ * Process interface control config.
+ * @param acl_interface: where to store.
+ * @param cfg: config options.
+ * @param v: views structure
+ * @return 0 on error.
+ */
+int acl_interface_apply_cfg(struct acl_list* acl_interface, struct config_file* cfg,
+ struct views* v);
+
/**
* Lookup access control status for acl structure.
* @param acl: structure for acl storage.
diff --git a/daemon/daemon.c b/daemon/daemon.c
index 4ed531855ee6..71091133a487 100644
--- a/daemon/daemon.c
+++ b/daemon/daemon.c
@@ -96,6 +96,9 @@
#ifdef HAVE_SYSTEMD
#include <systemd/sd-daemon.h>
#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
/** How many quit requests happened. */
static int sig_record_quit = 0;
@@ -271,8 +274,17 @@ daemon_init(void)
free(daemon);
return NULL;
}
+ daemon->acl_interface = acl_list_create();
+ if(!daemon->acl_interface) {
+ acl_list_delete(daemon->acl);
+ edns_known_options_delete(daemon->env);
+ free(daemon->env);
+ free(daemon);
+ return NULL;
+ }
daemon->tcl = tcl_list_create();
if(!daemon->tcl) {
+ acl_list_delete(daemon->acl_interface);
acl_list_delete(daemon->acl);
edns_known_options_delete(daemon->env);
free(daemon->env);
@@ -284,6 +296,7 @@ daemon_init(void)
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_interface);
acl_list_delete(daemon->acl);
tcl_list_delete(daemon->tcl);
edns_known_options_delete(daemon->env);
@@ -293,6 +306,7 @@ daemon_init(void)
}
if(!(daemon->env->edns_strings = edns_strings_create())) {
auth_zones_delete(daemon->env->auth_zones);
+ acl_list_delete(daemon->acl_interface);
acl_list_delete(daemon->acl);
tcl_list_delete(daemon->tcl);
edns_known_options_delete(daemon->env);
@@ -303,6 +317,29 @@ daemon_init(void)
return daemon;
}
+static int setup_acl_for_ports(struct acl_list* list,
+ struct listen_port* port_list)
+{
+ struct acl_addr* acl_node;
+ struct addrinfo* addr;
+ for(; port_list; port_list=port_list->next) {
+ if(!port_list->socket) {
+ /* This is mainly for testbound where port_list is
+ * empty. */
+ continue;
+ }
+ addr = port_list->socket->addr;
+ if(!(acl_node = acl_interface_insert(list,
+ (struct sockaddr_storage*)addr->ai_addr,
+ (socklen_t)addr->ai_addrlen,
+ acl_refuse))) {
+ return 0;
+ }
+ port_list->socket->acl = acl_node;
+ }
+ return 1;
+}
+
int
daemon_open_shared_ports(struct daemon* daemon)
{
@@ -320,6 +357,8 @@ daemon_open_shared_ports(struct daemon* daemon)
free(daemon->ports);
daemon->ports = NULL;
}
+ /* clean acl_interface */
+ acl_interface_init(daemon->acl_interface);
if(!resolve_interface_names(daemon->cfg->ifs,
daemon->cfg->num_ifs, NULL, &resif, &num_resif))
return 0;
@@ -329,7 +368,8 @@ daemon_open_shared_ports(struct daemon* daemon)
daemon->reuseport = 1;
#endif
/* try to use reuseport */
- p0 = listening_ports_open(daemon->cfg, resif, num_resif, &daemon->reuseport);
+ p0 = listening_ports_open(daemon->cfg, resif, num_resif,
+ &daemon->reuseport);
if(!p0) {
listening_ports_free(p0);
config_del_strarray(resif, num_resif);
@@ -350,6 +390,12 @@ daemon_open_shared_ports(struct daemon* daemon)
return 0;
}
daemon->ports[0] = p0;
+ if(!setup_acl_for_ports(daemon->acl_interface,
+ daemon->ports[0])) {
+ listening_ports_free(p0);
+ config_del_strarray(resif, num_resif);
+ return 0;
+ }
if(daemon->reuseport) {
/* continue to use reuseport */
for(i=1; i<daemon->num_ports; i++) {
@@ -365,6 +411,15 @@ daemon_open_shared_ports(struct daemon* daemon)
config_del_strarray(resif, num_resif);
return 0;
}
+ if(!setup_acl_for_ports(daemon->acl_interface,
+ daemon->ports[i])) {
+ for(i=0; i<daemon->num_ports; i++)
+ listening_ports_free(daemon->ports[i]);
+ free(daemon->ports);
+ daemon->ports = NULL;
+ config_del_strarray(resif, num_resif);
+ return 0;
+ }
}
}
config_del_strarray(resif, num_resif);
@@ -604,6 +659,9 @@ 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(!acl_interface_apply_cfg(daemon->acl_interface, daemon->cfg,
+ daemon->views))
+ fatal_exit("Could not setup interface control list");
if(!tcl_list_apply_cfg(daemon->tcl, daemon->cfg))
fatal_exit("Could not setup TCP connection limits");
if(daemon->cfg->dnscrypt) {
@@ -780,6 +838,7 @@ daemon_delete(struct daemon* daemon)
ub_randfree(daemon->rand);
alloc_clear(&daemon->superalloc);
acl_list_delete(daemon->acl);
+ acl_list_delete(daemon->acl_interface);
tcl_list_delete(daemon->tcl);
listen_desetup_locks();
free(daemon->chroot);
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 3effbafb7918..58713e9ce466 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;
+ /** access control, which interfaces are allowed to connect */
+ struct acl_list* acl_interface;
/** TCP connection limit, limit connections from client IPs */
struct tcl_list* tcl;
/** local authority zones */
diff --git a/daemon/remote.c b/daemon/remote.c
index ec7a4d5d93f4..7d4a414002ac 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -494,8 +494,8 @@ int remote_accept_callback(struct comm_point* c, void* arg, int err,
n->c->do_not_close = 0;
comm_point_stop_listening(n->c);
comm_point_start_listening(n->c, -1, REMOTE_CONTROL_TCP_TIMEOUT);
- memcpy(&n->c->repinfo.addr, &addr, addrlen);
- n->c->repinfo.addrlen = addrlen;
+ memcpy(&n->c->repinfo.remote_addr, &addr, addrlen);
+ n->c->repinfo.remote_addrlen = addrlen;
if(rc->use_cert) {
n->shake_state = rc_hs_read;
n->ssl = SSL_new(rc->ctx);
@@ -3304,7 +3304,7 @@ remote_handshake_later(struct daemon_remote* rc, struct rc_state* s,
if(r == 0)
log_err("remote control connection closed prematurely");
log_addr(VERB_OPS, "failed connection from",
- &s->c->repinfo.addr, s->c->repinfo.addrlen);
+ &s->c->repinfo.remote_addr, s->c->repinfo.remote_addrlen);
log_crypto_err("remote control failed ssl");
clean_point(rc, s);
}
diff --git a/daemon/stats.c b/daemon/stats.c
index 57c42827161c..6b3834977844 100644
--- a/daemon/stats.c
+++ b/daemon/stats.c
@@ -70,6 +70,9 @@
#include <openssl/ssl.h>
#endif
+/** How long to wait for threads to transmit statistics, in msec. */
+#define STATS_THREAD_WAIT 60000
+
/** add timers and the values do not overflow or become negative */
static void
stats_timeval_add(long long* d_sec, long long* d_usec, long long add_sec, long long add_usec)
@@ -380,6 +383,28 @@ void server_stats_obtain(struct worker* worker, struct worker* who,
worker_send_cmd(who, worker_cmd_stats);
else worker_send_cmd(who, worker_cmd_stats_noreset);
verbose(VERB_ALGO, "wait for stats reply");
+ if(tube_wait_timeout(worker->cmd, STATS_THREAD_WAIT) == 0) {
+ verbose(VERB_OPS, "no response from thread %d"
+#ifdef HAVE_GETTID
+ " LWP %u"
+#endif
+#if defined(HAVE_PTHREAD) && defined(SIZEOF_PTHREAD_T) && defined(SIZEOF_UNSIGNED_LONG)
+# if SIZEOF_PTHREAD_T == SIZEOF_UNSIGNED_LONG
+ " pthread 0x%lx"
+# endif
+#endif
+ ,
+ who->thread_num
+#ifdef HAVE_GETTID
+ , (unsigned)who->thread_tid
+#endif
+#if defined(HAVE_PTHREAD) && defined(SIZEOF_PTHREAD_T) && defined(SIZEOF_UNSIGNED_LONG)
+# if SIZEOF_PTHREAD_T == SIZEOF_UNSIGNED_LONG
+ , (unsigned long)*((unsigned long*)&who->thr_id)
+# endif
+#endif
+ );
+ }
if(!tube_read_msg(worker->cmd, &reply, &len, 0))
fatal_exit("failed to read stats over cmd channel");
if(len != (uint32_t)sizeof(*s))
@@ -496,7 +521,7 @@ void server_stats_insquery(struct ub_server_stats* stats, struct comm_point* c,
stats->qhttps++;
}
}
- if(repinfo && addr_is_ip6(&repinfo->addr, repinfo->addrlen))
+ if(repinfo && addr_is_ip6(&repinfo->remote_addr, repinfo->remote_addrlen))
stats->qipv6++;
if( (flags&BIT_QR) )
stats->qbit_QR++;
diff --git a/daemon/worker.c b/daemon/worker.c
index 010c4dc0a281..caefad621409 100644
--- a/daemon/worker.c
+++ b/daemon/worker.c
@@ -547,7 +547,8 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
static int
apply_respip_action(struct worker* worker, const struct query_info* qinfo,
struct respip_client_info* cinfo, struct reply_info* rep,
- struct comm_reply* repinfo, struct ub_packed_rrset_key** alias_rrset,
+ struct sockaddr_storage* addr, socklen_t addrlen,
+ struct ub_packed_rrset_key** alias_rrset,
struct reply_info** encode_repp, struct auth_zones* az)
{
struct respip_action_info actinfo = {0, 0, 0, 0, NULL, 0, NULL};
@@ -574,7 +575,7 @@ apply_respip_action(struct worker* worker, const struct query_info* qinfo,
if(actinfo.addrinfo) {
respip_inform_print(&actinfo, qinfo->qname,
qinfo->qtype, qinfo->qclass, qinfo->local_alias,
- repinfo);
+ addr, addrlen);
if(worker->stats.extended && actinfo.rpz_used) {
if(actinfo.rpz_disabled)
@@ -703,7 +704,7 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
*alias_rrset = NULL; /* avoid confusion if caller set it to non-NULL */
if((worker->daemon->use_response_ip || worker->daemon->use_rpz) &&
!partial_rep && !apply_respip_action(worker, qinfo, cinfo, rep,
- repinfo, alias_rrset,
+ &repinfo->client_addr, repinfo->client_addrlen, alias_rrset,
&encode_rep, worker->env.auth_zones)) {
goto bail_out;
} else if(partial_rep &&
@@ -991,12 +992,14 @@ answer_chaos(struct worker* w, struct query_info* qinfo,
* @param w: worker
* @param qinfo: query info. Pointer into packet buffer.
* @param edns: edns info from query.
- * @param repinfo: reply info with source address.
+ * @param addr: client address.
+ * @param addrlen: client address length.
* @param pkt: packet buffer.
*/
static void
-answer_notify(struct worker* w, struct query_info* qinfo,
- struct edns_data* edns, sldns_buffer* pkt, struct comm_reply* repinfo)
+answer_notify(struct worker* w, struct query_info* qinfo,
+ struct edns_data* edns, sldns_buffer* pkt,
+ struct sockaddr_storage* addr, socklen_t addrlen)
{
int refused = 0;
int rcode = LDNS_RCODE_NOERROR;
@@ -1005,8 +1008,8 @@ answer_notify(struct worker* w, struct query_info* qinfo,
if(!w->env.auth_zones) return;
has_serial = auth_zone_parse_notify_serial(pkt, &serial);
if(auth_zones_notify(w->env.auth_zones, &w->env, qinfo->qname,
- qinfo->qname_len, qinfo->qclass, &repinfo->addr,
- repinfo->addrlen, has_serial, serial, &refused)) {
+ qinfo->qname_len, qinfo->qclass, addr,
+ addrlen, has_serial, serial, &refused)) {
rcode = LDNS_RCODE_NOERROR;
} else {
if(refused)
@@ -1031,7 +1034,7 @@ answer_notify(struct worker* w, struct query_info* qinfo,
"servfail for NOTIFY %sfor %s from", sr, zname);
else snprintf(buf, sizeof(buf),
"received NOTIFY %sfor %s from", sr, zname);
- log_addr(VERB_DETAIL, buf, &repinfo->addr, repinfo->addrlen);
+ log_addr(VERB_DETAIL, buf, addr, addrlen);
}
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
@@ -1051,8 +1054,8 @@ deny_refuse(struct comm_point* c, enum acl_access acl,
{
if(acl == deny) {
if(verbosity >= VERB_ALGO) {
- log_acl_action("dropped", &repinfo->addr,
- repinfo->addrlen, acl, acladdr);
+ log_acl_action("dropped", &repinfo->client_addr,
+ repinfo->client_addrlen, acl, acladdr);
log_buf(VERB_ALGO, "dropped", c->buffer);
}
comm_point_drop_reply(repinfo);
@@ -1063,8 +1066,8 @@ deny_refuse(struct comm_point* c, enum acl_access acl,
size_t opt_rr_mark;
if(verbosity >= VERB_ALGO) {
- log_acl_action("refused", &repinfo->addr,
- repinfo->addrlen, acl, acladdr);
+ log_acl_action("refused", &repinfo->client_addr,
+ repinfo->client_addrlen, acl, acladdr);
log_buf(VERB_ALGO, "refuse", c->buffer);
}
@@ -1224,12 +1227,24 @@ deny_refuse(struct comm_point* c, enum acl_access acl,
}
static int
-deny_refuse_all(struct comm_point* c, enum acl_access acl,
+deny_refuse_all(struct comm_point* c, enum acl_access* acl,
struct worker* worker, struct comm_reply* repinfo,
- struct acl_addr* acladdr, int ede)
+ struct acl_addr** acladdr, int ede, int check_proxy)
{
- return deny_refuse(c, acl, acl_deny, acl_refuse, worker, repinfo,
- acladdr, ede);
+ if(check_proxy) {
+ *acladdr = acl_addr_lookup(worker->daemon->acl,
+ &repinfo->remote_addr, repinfo->remote_addrlen);
+ } else {
+ *acladdr = acl_addr_lookup(worker->daemon->acl,
+ &repinfo->client_addr, repinfo->client_addrlen);
+ }
+ /* If there is no ACL based on client IP use the interface ACL. */
+ if(!(*acladdr) && c->socket) {
+ *acladdr = c->socket->acl;
+ }
+ *acl = acl_get_control(*acladdr);
+ return deny_refuse(c, *acl, acl_deny, acl_refuse, worker, repinfo,
+ *acladdr, ede);
}
static int
@@ -1241,7 +1256,7 @@ deny_refuse_non_local(struct comm_point* c, enum acl_access acl,
worker, repinfo, acladdr, ede);
}
-int
+int
worker_handle_request(struct comm_point* c, void* arg, int error,
struct comm_reply* repinfo)
{
@@ -1286,16 +1301,16 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
if(worker_check_request(c->buffer, worker) != 0) {
verbose(VERB_ALGO,
"dnscrypt: worker check request: bad query.");
- log_addr(VERB_CLIENT,"from",&repinfo->addr,
- repinfo->addrlen);
+ log_addr(VERB_CLIENT,"from",&repinfo->client_addr,
+ repinfo->client_addrlen);
comm_point_drop_reply(repinfo);
return 0;
}
if(!query_info_parse(&qinfo, c->buffer)) {
verbose(VERB_ALGO,
"dnscrypt: worker parse request: formerror.");
- log_addr(VERB_CLIENT, "from", &repinfo->addr,
- repinfo->addrlen);
+ log_addr(VERB_CLIENT, "from", &repinfo->client_addr,
+ repinfo->client_addrlen);
comm_point_drop_reply(repinfo);
return 0;
}
@@ -1323,25 +1338,30 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
* sending src (client)/dst (local service) addresses over DNSTAP from incoming request handler
*/
if(worker->dtenv.log_client_query_messages) {
- log_addr(VERB_ALGO, "request from client", &repinfo->addr, repinfo->addrlen);
+ log_addr(VERB_ALGO, "request from client", &repinfo->client_addr, repinfo->client_addrlen);
log_addr(VERB_ALGO, "to local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen);
- dt_msg_send_client_query(&worker->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer);
+ dt_msg_send_client_query(&worker->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer);
}
#endif
- acladdr = acl_addr_lookup(worker->daemon->acl, &repinfo->addr,
- repinfo->addrlen);
- acl = acl_get_control(acladdr);
-
- if((ret=deny_refuse_all(c, acl, worker, repinfo, acladdr,
- worker->env.cfg->ede)) != -1)
- {
+ /* Check deny/refuse ACLs */
+ if(repinfo->is_proxied) {
+ if((ret=deny_refuse_all(c, &acl, worker, repinfo, &acladdr,
+ worker->env.cfg->ede, 1)) != -1) {
+ if(ret == 1)
+ goto send_reply;
+ return ret;
+ }
+ }
+ if((ret=deny_refuse_all(c, &acl, worker, repinfo, &acladdr,
+ worker->env.cfg->ede, 0)) != -1) {
if(ret == 1)
goto send_reply;
return ret;
}
+
if((ret=worker_check_request(c->buffer, worker)) != 0) {
verbose(VERB_ALGO, "worker check request: bad query.");
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ log_addr(VERB_CLIENT,"from",&repinfo->client_addr, repinfo->client_addrlen);
if(ret != -1) {
LDNS_QR_SET(sldns_buffer_begin(c->buffer));
LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), ret);
@@ -1353,20 +1373,24 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
worker->stats.num_queries++;
- /* check if this query should be dropped based on source ip rate limiting */
- if(!infra_ip_ratelimit_inc(worker->env.infra_cache, repinfo,
+ /* check if this query should be dropped based on source ip rate limiting
+ * NOTE: we always check the repinfo->client_address. IP ratelimiting is
+ * implicitly disabled for proxies. */
+ if(!infra_ip_ratelimit_inc(worker->env.infra_cache,
+ &repinfo->client_addr, repinfo->client_addrlen,
*worker->env.now,
worker->env.cfg->ip_ratelimit_backoff, c->buffer)) {
/* See if we are passed through with slip factor */
if(worker->env.cfg->ip_ratelimit_factor != 0 &&
ub_random_max(worker->env.rnd,
- worker->env.cfg->ip_ratelimit_factor) == 0) {
-
+ worker->env.cfg->ip_ratelimit_factor) == 0) {
char addrbuf[128];
- addr_to_str(&repinfo->addr, repinfo->addrlen,
- addrbuf, sizeof(addrbuf));
- verbose(VERB_QUERY, "ip_ratelimit allowed through for ip address %s because of slip in ip_ratelimit_factor",
- addrbuf);
+ addr_to_str(&repinfo->client_addr,
+ repinfo->client_addrlen, addrbuf,
+ sizeof(addrbuf));
+ verbose(VERB_QUERY, "ip_ratelimit allowed through for "
+ "ip address %s because of slip in "
+ "ip_ratelimit_factor", addrbuf);
} else {
worker->stats.num_queries_ip_ratelimited++;
comm_point_drop_reply(repinfo);
@@ -1377,7 +1401,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
/* see if query is in the cache */
if(!query_info_parse(&qinfo, c->buffer)) {
verbose(VERB_ALGO, "worker parse request: formerror.");
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ log_addr(VERB_CLIENT, "from", &repinfo->client_addr,
+ repinfo->client_addrlen);
memset(&qinfo, 0, sizeof(qinfo)); /* zero qinfo.qname */
if(worker_err_ratelimit(worker, LDNS_RCODE_FORMERR) == -1) {
comm_point_drop_reply(repinfo);
@@ -1391,13 +1416,14 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
}
if(worker->env.cfg->log_queries) {
char ip[128];
- addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip));
+ addr_to_str(&repinfo->client_addr, repinfo->client_addrlen, ip, sizeof(ip));
log_query_in(ip, qinfo.qname, qinfo.qtype, qinfo.qclass);
}
if(qinfo.qtype == LDNS_RR_TYPE_AXFR ||
qinfo.qtype == LDNS_RR_TYPE_IXFR) {
verbose(VERB_ALGO, "worker request: refused zone transfer.");
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ log_addr(VERB_CLIENT, "from", &repinfo->client_addr,
+ repinfo->client_addrlen);
sldns_buffer_rewind(c->buffer);
LDNS_QR_SET(sldns_buffer_begin(c->buffer));
LDNS_RCODE_SET(sldns_buffer_begin(c->buffer),
@@ -1414,7 +1440,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
qinfo.qtype == LDNS_RR_TYPE_MAILB ||
(qinfo.qtype >= 128 && qinfo.qtype <= 248)) {
verbose(VERB_ALGO, "worker request: formerror for meta-type.");
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ log_addr(VERB_CLIENT, "from", &repinfo->client_addr,
+ repinfo->client_addrlen);
if(worker_err_ratelimit(worker, LDNS_RCODE_FORMERR) == -1) {
comm_point_drop_reply(repinfo);
return 0;
@@ -1432,7 +1459,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
worker->scratchpad)) != 0) {
struct edns_data reply_edns;
verbose(VERB_ALGO, "worker parse edns: formerror.");
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ log_addr(VERB_CLIENT, "from", &repinfo->client_addr,
+ repinfo->client_addrlen);
memset(&reply_edns, 0, sizeof(reply_edns));
reply_edns.edns_present = 1;
reply_edns.udp_size = EDNS_ADVERTISED_SIZE;
@@ -1454,7 +1482,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
edns.opt_list_inplace_cb_out = NULL;
edns.padding_block_size = 0;
verbose(VERB_ALGO, "query with bad edns version.");
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ log_addr(VERB_CLIENT, "from", &repinfo->client_addr,
+ repinfo->client_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);
@@ -1468,7 +1497,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
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);
+ log_addr(VERB_CLIENT, "from", &repinfo->client_addr,
+ repinfo->client_addrlen);
edns.udp_size = NORMAL_UDP_SIZE;
}
}
@@ -1477,12 +1507,14 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
verbose(VERB_QUERY,
"worker request: max UDP reply size modified"
" (%d to max-udp-size)", (int)edns.udp_size);
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ log_addr(VERB_CLIENT, "from", &repinfo->client_addr,
+ repinfo->client_addrlen);
edns.udp_size = worker->daemon->cfg->max_udp_size;
}
if(edns.udp_size < LDNS_HEADER_SIZE) {
verbose(VERB_ALGO, "worker request: edns is too small.");
- log_addr(VERB_CLIENT, "from", &repinfo->addr, repinfo->addrlen);
+ log_addr(VERB_CLIENT, "from", &repinfo->client_addr,
+ repinfo->client_addrlen);
LDNS_QR_SET(sldns_buffer_begin(c->buffer));
LDNS_TC_SET(sldns_buffer_begin(c->buffer));
LDNS_RCODE_SET(sldns_buffer_begin(c->buffer),
@@ -1506,7 +1538,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
}
if(LDNS_OPCODE_WIRE(sldns_buffer_begin(c->buffer)) ==
LDNS_PACKET_NOTIFY) {
- answer_notify(worker, &qinfo, &edns, c->buffer, repinfo);
+ answer_notify(worker, &qinfo, &edns, c->buffer,
+ &repinfo->client_addr, repinfo->client_addrlen);
regional_free_all(worker->scratchpad);
goto send_reply;
}
@@ -1582,7 +1615,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
sldns_buffer_read_u16_at(c->buffer, 2), &edns);
regional_free_all(worker->scratchpad);
log_addr(VERB_ALGO, "refused nonrec (cache snoop) query from",
- &repinfo->addr, repinfo->addrlen);
+ &repinfo->client_addr, repinfo->client_addrlen);
goto send_reply;
}
@@ -1722,9 +1755,9 @@ lookup_cache:
if(verbosity >= VERB_CLIENT) {
if(c->type == comm_udp)
log_addr(VERB_CLIENT, "udp request from",
- &repinfo->addr, repinfo->addrlen);
+ &repinfo->client_addr, repinfo->client_addrlen);
else log_addr(VERB_CLIENT, "tcp request from",
- &repinfo->addr, repinfo->addrlen);
+ &repinfo->client_addr, repinfo->client_addrlen);
}
/* grab a work request structure for this new request */
@@ -1756,8 +1789,8 @@ send_reply_rc:
*/
if(worker->dtenv.log_client_response_messages) {
log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen);
- log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen);
- dt_msg_send_client_response(&worker->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer);
+ log_addr(VERB_ALGO, "response to client", &repinfo->client_addr, repinfo->client_addrlen);
+ dt_msg_send_client_response(&worker->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer);
}
#endif
if(worker->env.cfg->log_replies)
@@ -1769,10 +1802,12 @@ send_reply_rc:
/* log original qname, before the local alias was
* used to resolve that CNAME to something else */
qinfo.qname = qinfo.local_alias->rrset->rk.dname;
- log_reply_info(NO_VERBOSE, &qinfo, &repinfo->addr, repinfo->addrlen,
+ log_reply_info(NO_VERBOSE, &qinfo,
+ &repinfo->client_addr, repinfo->client_addrlen,
tv, 1, c->buffer);
} else {
- log_reply_info(NO_VERBOSE, &qinfo, &repinfo->addr, repinfo->addrlen,
+ log_reply_info(NO_VERBOSE, &qinfo,
+ &repinfo->client_addr, repinfo->client_addrlen,
tv, 1, c->buffer);
}
}
@@ -1904,6 +1939,9 @@ worker_init(struct worker* worker, struct config_file *cfg,
#else
void* dtenv = NULL;
#endif
+#ifdef HAVE_GETTID
+ worker->thread_tid = gettid();
+#endif
worker->need_to_exit = 0;
worker->base = comm_base_create(do_sigs);
if(!worker->base) {
diff --git a/daemon/worker.h b/daemon/worker.h
index 3887d0405ae6..3fb52abd9d87 100644
--- a/daemon/worker.h
+++ b/daemon/worker.h
@@ -86,6 +86,10 @@ struct worker {
struct daemon* daemon;
/** thread id */
ub_thread_type thr_id;
+#ifdef HAVE_GETTID
+ /** thread tid, the LWP id. */
+ pid_t thread_tid;
+#endif
/** pipe, for commands for this worker */
struct tube* cmd;
/** the event base this worker works with */
diff --git a/dnstap/dtstream.c b/dnstap/dtstream.c
index a1dd9703ea95..9153f040472d 100644
--- a/dnstap/dtstream.c
+++ b/dnstap/dtstream.c
@@ -954,7 +954,7 @@ static int dtio_write_more(struct dt_io_thread* dtio)
* -1: continue, >0: number of bytes read into buffer */
static ssize_t receive_bytes(struct dt_io_thread* dtio, void* buf, size_t len) {
ssize_t r;
- r = recv(dtio->fd, (void*)buf, len, 0);
+ r = recv(dtio->fd, (void*)buf, len, MSG_DONTWAIT);
if(r == -1) {
char* to = dtio->socket_path;
if(!to) to = dtio->ip_str;
@@ -1960,7 +1960,7 @@ static int dtio_open_output_tcp(struct dt_io_thread* dtio)
memset(&addr, 0, sizeof(addr));
addrlen = (socklen_t)sizeof(addr);
- if(!extstrtoaddr(dtio->ip_str, &addr, &addrlen)) {
+ if(!extstrtoaddr(dtio->ip_str, &addr, &addrlen, UNBOUND_DNS_PORT)) {
log_err("could not parse IP '%s'", dtio->ip_str);
return 0;
}
diff --git a/dnstap/unbound-dnstap-socket.c b/dnstap/unbound-dnstap-socket.c
index 63292fbca36e..3bf889463eac 100644
--- a/dnstap/unbound-dnstap-socket.c
+++ b/dnstap/unbound-dnstap-socket.c
@@ -272,7 +272,7 @@ static int make_tcp_accept(char* ip)
memset(&addr, 0, sizeof(addr));
len = (socklen_t)sizeof(addr);
- if(!extstrtoaddr(ip, &addr, &len)) {
+ if(!extstrtoaddr(ip, &addr, &len, UNBOUND_DNS_PORT)) {
log_err("could not parse IP '%s'", ip);
return -1;
}
@@ -617,7 +617,7 @@ static void log_data_frame(uint8_t* pkt, size_t len)
static ssize_t receive_bytes(struct tap_data* data, int fd, void* buf,
size_t len)
{
- ssize_t ret = recv(fd, buf, len, 0);
+ ssize_t ret = recv(fd, buf, len, MSG_DONTWAIT);
if(ret == 0) {
/* closed */
if(verbosity) log_info("dnstap client stream closed from %s",
diff --git a/doc/Changelog b/doc/Changelog
index 78f6c7afcb27..727d1543ea4e 100644
--- a/doc/Changelog
+++ b/doc/Changelog
@@ -1,9 +1,116 @@
+11 October 2022: George
+ - Fix PROXYv2 header read for TCP connections when no proxied addresses
+ are provided.
+
+7 October 2022: George
+ - Fix to stop possible loops in the tcp reuse code (write_wait list
+ and tcp_wait list). Based on analysis and patch from Prad Seniappan
+ and Karthik Umashankar.
+ - Fix unit test to properly test the reuse_write_wait_pop function.
+
+6 October 2022: Wouter
+ - Fix to stop responses with TC flag from resulting in partial
+ responses. It retries to fetch the data elsewhere, or fails the
+ query and in depth fix removes the TC flag from the cached item.
+ - Fix proxy length debug output printout typecasts.
+
+5 October 2022: Wouter
+ - Fix dnscrypt compile for proxy protocol code changes.
+
+5 October 2022: George
+ - Use DEBUG_TDIR from environment in mini_tdir.sh for debugging.
+ - Fix string comparison in mini_tdir.sh.
+ - Make ede.tdir test more predictable by using static data.
+ - Fix checkconf test for dnscrypt and proxy port.
+
+4 October 2022: George
+ - Merge #764: Leniency for target discovery when under load (for
+ NRDelegation changes).
+
+4 October 2022: Wouter
+ - Fix static analysis report to remove dead code from the
+ rpz_callback_from_iterator_module function.
+ - Fix to clean up after the acl_interface unit test.
+
+3 October 2022: George
+ - Merge #760: PROXYv2 downstream support. (New proxy-protocol-port
+ configuration option).
+
+3 October 2022: Wouter
+ - Fix to remove erroneous TC flag from TCP upstream.
+ - Fix test tdir skip report printout.
+ - Fix windows compile, the identifier interface is defined in headers.
+ - Fix to close errno block in comm_point_tcp_handle_read outside of
+ ifdef.
+
+26 September 2022: George
+ - Better output for skipped tdir tests.
+
21 September 2022: Wouter
- Patch for CVE-2022-3204 Non-Responsive Delegation Attack.
+ - This patch was released in 1.16.3, the code repository continues
+ with the previous features and fixes for 1.17.0.
+ - Fix doxygen warning in respip.h.
+
+20 September 2022: George
+ - Convert tdir tests to use the new skip_test functionality.
+ - Remove unused testcode/mini_tpkg.sh file.
+
+16 September 2022: George
+ - Merge #753: ACL per interface. (New interface-* configuration
+ options).
+
+2 September 2022: Wouter
+ - Remove include that was there for debug purposes.
+ - Fix to check pthread_t size after pthread has been detected.
+
+1 September 2022: Wouter
+ - Fix to update config tests to fix checking if nonblocking sockets
+ work on OpenBSD.
+ - Slow down log frequency of write wait failures.
+ - Fix to set out of file descriptor warning to operational verbosity.
+ - Fix to log a verbose message at operational notice level if a
+ thread is not responding, to stats requests. It is logged with
+ thread identifiers.
+
+31 August 2022: Wouter
+ - Fix to avoid process wide fcntl calls mixed with nonblocking
+ operations after a blocked write.
+ - Patch from Vadim Fedorenko that adds MSG_DONTWAIT to receive
+ operations, so that instruction reordering does not cause mistakenly
+ blocking socket operations.
+ - Fix to wait for blocked write on UDP sockets, with a timeout if it
+ takes too long the packet is dropped.
+ - Fix for wait for udp send to stop when packet is successfully sent.
+
+22 August 2022: Wouter
+ - Fix #741: systemd socket activation fails on IPv6.
+
+12 August 2022: Wouter
+ - Fix to log accept error ENFILE and EMFILE errno, but slowly, once
+ per 10 seconds. Also log accept failures when no slow down is used.
+
+5 August 2022: Wouter
+ - Fix #734 [FR] enable unbound-checkconf to detect more (basic)
+ errors.
+
+4 August 2022: Wouter
+ - Fix ratelimit inconsistency, for ip-ratelimits the value is the
+ amount allowed, like for ratelimits.
+
+2 August 2022: Wouter
+ - Fix edns subnet so that scope 0 answers only match sourcemask 0
+ queries for answers from cache if from a query with sourcemask 0.
+ - Fix unittest for edns subnet change.
+ - Merge #730 from luisdallos: Fix startup failure on Windows 8.1 due
+ to unsupported IPV6_USER_MTU socket option being set.
1 August 2022: Wouter
- Fix the novel ghost domain issues CVE-2022-30698 and CVE-2022-30699.
- Tests for ghost domain fixes.
+ - Tag for 1.16.2 release. The code repo continues with 1.16.3.
+ - Fix #728: alloc_reg_obtain() core dump. Stop double
+ alloc_reg_release when serviced_create fails.
19 July 2022: George
- Update documentation for 'outbound-msg-retry:'.
diff --git a/doc/README b/doc/README
index 92a6e88f6624..88444a5e3c99 100644
--- a/doc/README
+++ b/doc/README
@@ -1,4 +1,4 @@
-README for Unbound 1.16.3
+README for Unbound 1.17.0
Copyright 2007 NLnet Labs
http://unbound.net
diff --git a/doc/example.conf.in b/doc/example.conf.in
index 601165f753b7..df0b2a1fb2c0 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.16.3.
+# See unbound.conf(5) man page, version 1.17.0.
#
# this is a comment.
@@ -17,7 +17,7 @@ server:
# whitespace is not necessary, but looks cleaner.
# verbosity number, 0 is least verbose. 1 is default.
- verbosity: 1
+ # verbosity: 1
# print statistics to the log (for every thread) every N seconds.
# Set to "" or 0 to disable. Default is disabled.
@@ -50,6 +50,7 @@ server:
# interface: 192.0.2.154
# interface: 192.0.2.154@5003
# interface: 2001:DB8::5
+ # interface: eth0@5003
# enable this feature to copy the source address of queries to reply.
# Socket options are not supported on all platforms. experimental.
@@ -217,7 +218,8 @@ server:
# the maximum number of hosts that are cached (roundtrip, EDNS, lame).
# infra-cache-numhosts: 10000
- # define a number of tags here, use with local-zone, access-control.
+ # define a number of tags here, use with local-zone, access-control,
+ # interface-*.
# repeat the define-tag statement to add additional tags.
# define-tag: "tag1 tag2 tag3"
@@ -273,9 +275,7 @@ server:
# allow_snoop (recursive and nonrecursive ok)
# deny_non_local (drop queries unless can be answered from local-data)
# refuse_non_local (like deny_non_local but polite error reply).
- # access-control: 0.0.0.0/0 refuse
# access-control: 127.0.0.0/8 allow
- # access-control: ::0/0 refuse
# access-control: ::1 allow
# access-control: ::ffff:127.0.0.1 allow
@@ -284,7 +284,7 @@ server:
# are tagged with one of these tags.
# access-control-tag: 192.0.2.0/24 "tag2 tag3"
- # set action for particular tag for given access control element
+ # set action for particular tag for given access control element.
# if you have multiple tag values, the tag used to lookup the action
# is the first tag match between access-control-tag and local-zone-tag
# where "first" comes from the order of the define-tag values.
@@ -296,6 +296,58 @@ server:
# Set view for access control element
# access-control-view: 192.0.2.0/24 viewname
+ # Similar to 'access-control:' but for interfaces.
+ # Control which listening interfaces are allowed to accept (recursive)
+ # queries for this server.
+ # The specified interfaces should be the same as the ones specified in
+ # 'interface:' followed by the action.
+ # The actions are the same as 'access-control:' above.
+ # By default all the interfaces configured are refused.
+ # Note: any 'access-control*:' setting overrides all 'interface-*:'
+ # settings for targeted clients.
+ # interface-action: 192.0.2.153 allow
+ # interface-action: 192.0.2.154 allow
+ # interface-action: 192.0.2.154@5003 allow
+ # interface-action: 2001:DB8::5 allow
+ # interface-action: eth0@5003 allow
+
+ # Similar to 'access-control-tag:' but for interfaces.
+ # Tag interfaces with a list of tags (in "" with spaces between).
+ # Interfaces using these tags use localzones that are tagged with one
+ # of these tags.
+ # The specified interfaces should be the same as the ones specified in
+ # 'interface:' followed by the list of tags.
+ # Note: any 'access-control*:' setting overrides all 'interface-*:'
+ # settings for targeted clients.
+ # interface-tag: eth0@5003 "tag2 tag3"
+
+ # Similar to 'access-control-tag-action:' but for interfaces.
+ # Set action for particular tag for a given interface element.
+ # If you have multiple tag values, the tag used to lookup the action
+ # is the first tag match between interface-tag and local-zone-tag
+ # where "first" comes from the order of the define-tag values.
+ # The specified interfaces should be the same as the ones specified in
+ # 'interface:' followed by the tag and action.
+ # Note: any 'access-control*:' setting overrides all 'interface-*:'
+ # settings for targeted clients.
+ # interface-tag-action: eth0@5003 tag3 refuse
+
+ # Similar to 'access-control-tag-data:' but for interfaces.
+ # Set redirect data for a particular tag for an interface element.
+ # The specified interfaces should be the same as the ones specified in
+ # 'interface:' followed by the tag and the redirect data.
+ # Note: any 'access-control*:' setting overrides all 'interface-*:'
+ # settings for targeted clients.
+ # interface-tag-data: eth0@5003 tag2 "A 127.0.0.1"
+
+ # Similar to 'access-control-view:' but for interfaces.
+ # Set view for an interface element.
+ # The specified interfaces should be the same as the ones specified in
+ # 'interface:' followed by the view name.
+ # Note: any 'access-control*:' setting overrides all 'interface-*:'
+ # settings for targeted clients.
+ # interface-view: eth0@5003 viewname
+
# if given, a chroot(2) is done to the given directory.
# i.e. you can chroot to the working directory, for example,
# for extra security, but make sure all files are in that directory.
@@ -850,6 +902,10 @@ server:
# Disable TLS for DNS-over-HTTP downstream service.
# http-notls-downstream: no
+ # The interfaces that use these listed port numbers will support and
+ # expect PROXYv2. For UDP and TCP/TLS interfaces.
+ # proxy-protocol-port: portno for each of the port numbers.
+
# DNS64 prefix. Must be specified when DNS64 is use.
# Enable dns64 in module-config. Used to synthesize IPv6 from IPv4.
# dns64-prefix: 64:ff9b::0/96
diff --git a/doc/libunbound.3.in b/doc/libunbound.3.in
index baf29219495f..b87289e0d764 100644
--- a/doc/libunbound.3.in
+++ b/doc/libunbound.3.in
@@ -1,4 +1,4 @@
-.TH "libunbound" "3" "Sep 21, 2022" "NLnet Labs" "unbound 1.16.3"
+.TH "libunbound" "3" "Oct 13, 2022" "NLnet Labs" "unbound 1.17.0"
.\"
.\" libunbound.3 -- unbound library functions manual
.\"
@@ -44,7 +44,7 @@
.B ub_ctx_zone_remove,
.B ub_ctx_data_add,
.B ub_ctx_data_remove
-\- Unbound DNS validating resolver 1.16.3 functions.
+\- Unbound DNS validating resolver 1.17.0 functions.
.SH "SYNOPSIS"
.B #include <unbound.h>
.LP
diff --git a/doc/unbound-anchor.8.in b/doc/unbound-anchor.8.in
index 922c105177f3..dc61b72dadb4 100644
--- a/doc/unbound-anchor.8.in
+++ b/doc/unbound-anchor.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-anchor" "8" "Sep 21, 2022" "NLnet Labs" "unbound 1.16.3"
+.TH "unbound-anchor" "8" "Oct 13, 2022" "NLnet Labs" "unbound 1.17.0"
.\"
.\" unbound-anchor.8 -- unbound anchor maintenance utility manual
.\"
diff --git a/doc/unbound-checkconf.8.in b/doc/unbound-checkconf.8.in
index 9b56c79252e4..ba6c334c7c78 100644
--- a/doc/unbound-checkconf.8.in
+++ b/doc/unbound-checkconf.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-checkconf" "8" "Sep 21, 2022" "NLnet Labs" "unbound 1.16.3"
+.TH "unbound-checkconf" "8" "Oct 13, 2022" "NLnet Labs" "unbound 1.17.0"
.\"
.\" unbound-checkconf.8 -- unbound configuration checker manual
.\"
diff --git a/doc/unbound-control.8.in b/doc/unbound-control.8.in
index e42e0cd544e7..3841b9737f4e 100644
--- a/doc/unbound-control.8.in
+++ b/doc/unbound-control.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-control" "8" "Sep 21, 2022" "NLnet Labs" "unbound 1.16.3"
+.TH "unbound-control" "8" "Oct 13, 2022" "NLnet Labs" "unbound 1.17.0"
.\"
.\" unbound-control.8 -- unbound remote control manual
.\"
diff --git a/doc/unbound-host.1.in b/doc/unbound-host.1.in
index aae95827d92c..8371084c575b 100644
--- a/doc/unbound-host.1.in
+++ b/doc/unbound-host.1.in
@@ -1,4 +1,4 @@
-.TH "unbound\-host" "1" "Sep 21, 2022" "NLnet Labs" "unbound 1.16.3"
+.TH "unbound\-host" "1" "Oct 13, 2022" "NLnet Labs" "unbound 1.17.0"
.\"
.\" unbound-host.1 -- unbound DNS lookup utility
.\"
diff --git a/doc/unbound.8.in b/doc/unbound.8.in
index 81a8f4f63f5e..ac61b0f7a10c 100644
--- a/doc/unbound.8.in
+++ b/doc/unbound.8.in
@@ -1,4 +1,4 @@
-.TH "unbound" "8" "Sep 21, 2022" "NLnet Labs" "unbound 1.16.3"
+.TH "unbound" "8" "Oct 13, 2022" "NLnet Labs" "unbound 1.17.0"
.\"
.\" unbound.8 -- unbound manual
.\"
@@ -9,7 +9,7 @@
.\"
.SH "NAME"
.B unbound
-\- Unbound DNS validating resolver 1.16.3.
+\- Unbound DNS validating resolver 1.17.0.
.SH "SYNOPSIS"
.B unbound
.RB [ \-h ]
diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in
index 4f542eb4757e..6c021b900d89 100644
--- a/doc/unbound.conf.5.in
+++ b/doc/unbound.conf.5.in
@@ -1,4 +1,4 @@
-.TH "unbound.conf" "5" "Sep 21, 2022" "NLnet Labs" "unbound 1.16.3"
+.TH "unbound.conf" "5" "Oct 13, 2022" "NLnet Labs" "unbound 1.17.0"
.\"
.\" unbound.conf.5 -- unbound.conf manual
.\"
@@ -118,7 +118,7 @@ The number of threads to create to serve clients. Use 1 for no threading.
.B port: \fI<port number>
The port number, default 53, on which the server responds to queries.
.TP
-.B interface: \fI<ip address[@port]>
+.B interface: \fI<ip address or interface name [@port]>
Interface to use to connect to the network. This interface is listened to
for queries from clients, and answers to clients are given from it.
Can be given multiple times to work on several interfaces. If none are
@@ -129,7 +129,7 @@ A port number can be specified with @port (without spaces between
interface and port number), if not specified the default port (from
\fBport\fR) is used.
.TP
-.B ip\-address: \fI<ip address[@port]>
+.B ip\-address: \fI<ip address or interface name [@port]>
Same as interface: (for ease of compatibility with nsd.conf).
.TP
.B interface\-automatic: \fI<yes or no>
@@ -656,6 +656,17 @@ Ignored if the option is not available. Default is yes.
Disable use of TLS for the downstream DNS-over-HTTP connections. Useful for
local back end servers. Default is no.
.TP
+.B proxy\-protocol\-port: \fI<portnr>
+List port numbers as proxy\-protocol\-port, and when interfaces are defined,
+eg. with the @port suffix, as this port number, they support and expect PROXYv2.
+In this case the proxy address will only be used for the network communication
+and initial ACL (check if the proxy itself is denied/refused by configuration).
+The proxied address (if any) will then be used as the true client address and
+will be used where applicable for logging, ACL, DNSTAP, RPZ and IP ratelimiting.
+PROXYv2 is supported for UDP and TCP/TLS listening interfaces.
+There is no support for PROXYv2 on a DoH or DNSCrypt listening interface.
+Can list multiple, each on a new statement.
+.TP
.B use\-systemd: \fI<yes or no>
Enable or disable systemd socket activation.
Default is no.
@@ -675,7 +686,7 @@ 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,
\fIallow\fR, \fIallow_setrd\fR, \fIallow_snoop\fR, \fIdeny_non_local\fR or
\fIrefuse_non_local\fR.
-The most specific netblock match is used, if none match \fIdeny\fR is used.
+The most specific netblock match is used, if none match \fIrefuse\fR is used.
The order of the access\-control statements therefore does not matter.
.IP
The action \fIdeny\fR stops queries from hosts from that netblock.
@@ -741,6 +752,46 @@ Set redirect data for particular tag for given access control element.
.B access\-control\-view: \fI<IP netblock> <view name>
Set view for given access control element.
.TP
+.B interface\-action: \fI<ip address or interface name [@port]> <action>
+Similar to \fBaccess\-control:\fR but for interfaces.
+.IP
+The action is the same as the ones defined under \fBaccess\-control:\fR.
+Interfaces are \fIrefuse\fRd by default.
+By default only localhost (the IP netblock, not the loopback interface) is
+\fIallow\fRed through the default \fBaccess\-control:\fR behavior.
+.IP
+Note that the interface needs to be already specified with \fBinterface:\fR
+and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR
+settings for targeted clients.
+.TP
+.B interface\-tag: \fI<ip address or interface name [@port]> <"list of tags">
+Similar to \fBaccess\-control-tag:\fR but for interfaces.
+.IP
+Note that the interface needs to be already specified with \fBinterface:\fR
+and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR
+settings for targeted clients.
+.TP
+.B interface\-tag\-action: \fI<ip address or interface name [@port]> <tag> <action>
+Similar to \fBaccess\-control-tag-action:\fR but for interfaces.
+.IP
+Note that the interface needs to be already specified with \fBinterface:\fR
+and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR
+settings for targeted clients.
+.TP
+.B interface\-tag\-data: \fI<ip address or interface name [@port]> <tag> <"resource record string">
+Similar to \fBaccess\-control-tag-data:\fR but for interfaces.
+.IP
+Note that the interface needs to be already specified with \fBinterface:\fR
+and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR
+settings for targeted clients.
+.TP
+.B interface\-view: \fI<ip address or interface name [@port]> <view name>
+Similar to \fBaccess\-control-view:\fR but for interfaces.
+.IP
+Note that the interface needs to be already specified with \fBinterface:\fR
+and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR
+settings for targeted clients.
+.TP
.B chroot: \fI<directory>
If chroot is enabled, you should pass the configfile (from the
commandline) as a full path from the original root. After the
@@ -1823,9 +1874,11 @@ section for options. To setup the correct self\-signed certificates use the
The option is used to enable remote control, default is "no".
If turned off, the server does not listen for control commands.
.TP 5
-.B control\-interface: \fI<ip address or path>
+.B control\-interface: \fI<ip address or interface name or path>
Give IPv4 or IPv6 addresses or local socket path to listen on for
control commands.
+If an interface name is used instead of an ip address, the list of ip addresses
+on that interface are used.
By default localhost (127.0.0.1 and ::1) is listened to.
Use 0.0.0.0 and ::0 to listen to all interfaces.
If you change this and permissions have been dropped, you must restart
diff --git a/edns-subnet/addrtree.c b/edns-subnet/addrtree.c
index 180a0227917c..ebe71b9706e4 100644
--- a/edns-subnet/addrtree.c
+++ b/edns-subnet/addrtree.c
@@ -97,6 +97,7 @@ node_create(struct addrtree *tree, void *elem, addrlen_t scope,
tree->node_count++;
node->scope = scope;
node->ttl = ttl;
+ node->only_match_scope_zero = 0;
node->edge[0] = NULL;
node->edge[1] = NULL;
node->parent_edge = NULL;
@@ -155,6 +156,7 @@ clean_node(struct addrtree *tree, struct addrnode *node)
if (!node->elem) return;
tree->size_bytes -= tree->sizefunc(node->elem);
tree->delfunc(tree->env, node->elem);
+ node->only_match_scope_zero = 0;
node->elem = NULL;
}
@@ -358,7 +360,7 @@ issub(const addrkey_t *s1, addrlen_t l1,
void
addrtree_insert(struct addrtree *tree, const addrkey_t *addr,
addrlen_t sourcemask, addrlen_t scope, void *elem, time_t ttl,
- time_t now)
+ time_t now, int only_match_scope_zero)
{
struct addrnode *newnode, *node;
struct addredge *edge;
@@ -381,6 +383,7 @@ addrtree_insert(struct addrtree *tree, const addrkey_t *addr,
/* update this node's scope and data */
clean_node(tree, node);
node->ttl = ttl;
+ node->only_match_scope_zero = only_match_scope_zero;
node->elem = elem;
node->scope = scope;
tree->size_bytes += tree->sizefunc(elem);
@@ -447,6 +450,7 @@ addrtree_insert(struct addrtree *tree, const addrkey_t *addr,
newnode->elem = elem;
newnode->scope = scope;
newnode->ttl = ttl;
+ newnode->only_match_scope_zero = only_match_scope_zero;
}
tree->size_bytes += node_size(tree, newnode);
@@ -483,7 +487,8 @@ addrtree_find(struct addrtree *tree, const addrkey_t *addr,
/* Current node more specific then question. */
log_assert(depth <= sourcemask);
/* does this node have data? if yes, see if we have a match */
- if (node->elem && node->ttl >= now) {
+ if (node->elem && node->ttl >= now &&
+ !(sourcemask != 0 && node->only_match_scope_zero)) {
/* saved at wrong depth */;
log_assert(node->scope >= depth);
if (depth == node->scope ||
diff --git a/edns-subnet/addrtree.h b/edns-subnet/addrtree.h
index 1aea54e01f79..0bc1837cdb80 100644
--- a/edns-subnet/addrtree.h
+++ b/edns-subnet/addrtree.h
@@ -95,6 +95,10 @@ struct addrnode {
time_t ttl;
/** Number of significant bits in address. */
addrlen_t scope;
+ /** Only use the element for queries for subnet/0. Set if the query
+ * for /0 was answered with scope 0. For query /x answer scope 0,
+ * they can match anything and this is false. */
+ int only_match_scope_zero;
/** A node can have 0-2 edges, set to NULL for unused */
struct addredge *edge[2];
/** edge between this node and parent */
@@ -157,11 +161,12 @@ void addrtree_delete(struct addrtree *tree);
* @param scope: Number of significant bits in addr.
* @param elem: data to store in the tree.
* @param ttl: elem is valid up to this time, seconds.
+ * @param only_match_scope_zero: set for when query /0 has scope /0 answer.
* @param now: Current time in seconds.
*/
void addrtree_insert(struct addrtree *tree, const addrkey_t *addr,
addrlen_t sourcemask, addrlen_t scope, void *elem, time_t ttl,
- time_t now);
+ time_t now, int only_match_scope_zero);
/**
* Find a node containing an element in the tree.
diff --git a/edns-subnet/subnetmod.c b/edns-subnet/subnetmod.c
index 75446113b742..0f1df417f6b5 100644
--- a/edns-subnet/subnetmod.c
+++ b/edns-subnet/subnetmod.c
@@ -55,6 +55,7 @@
#include "util/config_file.h"
#include "util/data/msgreply.h"
#include "sldns/sbuffer.h"
+#include "sldns/wire2str.h"
#include "iterator/iter_utils.h"
/** externally called */
@@ -331,6 +332,7 @@ update_cache(struct module_qstate *qstate, int id)
struct slabhash *subnet_msg_cache = sne->subnet_msg_cache;
struct ecs_data *edns = &sq->ecs_client_in;
size_t i;
+ int only_match_scope_zero;
/* We already calculated hash upon lookup (lookup_and_reply) if we were
* allowed to look in the ECS cache */
@@ -392,9 +394,12 @@ update_cache(struct module_qstate *qstate, int id)
reply_info_set_ttls(rep, *qstate->env->now);
rep->flags |= (BIT_RA | BIT_QR); /* fix flags to be sensible for */
rep->flags &= ~(BIT_AA | BIT_CD);/* a reply based on the cache */
+ if(edns->subnet_source_mask == 0 && edns->subnet_scope_mask == 0)
+ only_match_scope_zero = 1;
+ else only_match_scope_zero = 0;
addrtree_insert(tree, (addrkey_t*)edns->subnet_addr,
edns->subnet_source_mask, sq->max_scope, rep,
- rep->ttl, *qstate->env->now);
+ rep->ttl, *qstate->env->now, only_match_scope_zero);
lock_rw_unlock(&lru_entry->lock);
if (need_to_insert) {
@@ -674,6 +679,24 @@ ecs_query_response(struct module_qstate* qstate, struct dns_msg* response,
return 1;
}
+/** verbose print edns subnet option in pretty print */
+static void
+subnet_log_print(const char* s, struct edns_option* ecs_opt)
+{
+ if(verbosity >= VERB_ALGO) {
+ char buf[256];
+ char* str = buf;
+ size_t str_len = sizeof(buf);
+ if(!ecs_opt) {
+ verbose(VERB_ALGO, "%s (null)", s);
+ return;
+ }
+ (void)sldns_wire2str_edns_subnet_print(&str, &str_len,
+ ecs_opt->opt_data, ecs_opt->opt_len);
+ verbose(VERB_ALGO, "%s %s", s, buf);
+ }
+}
+
int
ecs_edns_back_parsed(struct module_qstate* qstate, int id,
void* ATTR_UNUSED(cbargs))
@@ -688,6 +711,7 @@ ecs_edns_back_parsed(struct module_qstate* qstate, int id,
qstate->env->cfg->client_subnet_opcode)) &&
parse_subnet_option(ecs_opt, &sq->ecs_server_in) &&
sq->subnet_sent && sq->ecs_server_in.subnet_validdata) {
+ subnet_log_print("answer has edns subnet", ecs_opt);
/* Only skip global cache store if we sent an ECS option
* and received one back. Answers from non-whitelisted
* servers will end up in global cache. Answers for
@@ -736,11 +760,12 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
qstate->ext_state[id] = module_finished;
return;
}
+ subnet_log_print("query has edns subnet", ecs_opt);
sq->subnet_downstream = 1;
}
else if(qstate->mesh_info->reply_list) {
subnet_option_from_ss(
- &qstate->mesh_info->reply_list->query_reply.addr,
+ &qstate->mesh_info->reply_list->query_reply.client_addr,
&sq->ecs_client_in, qstate->env->cfg);
}
@@ -775,6 +800,13 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
subnet_ecs_opt_list_append(&sq->ecs_client_out,
&qstate->edns_opts_front_out, qstate,
qstate->region);
+ if(verbosity >= VERB_ALGO) {
+ subnet_log_print("reply has edns subnet",
+ edns_opt_list_find(
+ qstate->edns_opts_front_out,
+ qstate->env->cfg->
+ client_subnet_opcode));
+ }
return;
}
lock_rw_unlock(&sne->biglock);
@@ -823,6 +855,13 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
subnet_ecs_opt_list_append(&sq->ecs_client_out,
&qstate->edns_opts_front_out, qstate,
qstate->region);
+ if(verbosity >= VERB_ALGO) {
+ subnet_log_print("reply has edns subnet",
+ edns_opt_list_find(
+ qstate->edns_opts_front_out,
+ qstate->env->cfg->
+ client_subnet_opcode));
+ }
}
qstate->no_cache_store = sq->started_no_cache_store;
qstate->no_cache_lookup = sq->started_no_cache_lookup;
diff --git a/iterator/iter_hints.c b/iterator/iter_hints.c
index 9b1a200bbb17..a60d9a6b1cf2 100644
--- a/iterator/iter_hints.c
+++ b/iterator/iter_hints.c
@@ -100,7 +100,7 @@ ah(struct delegpt* dp, const char* sv, const char* ip)
return 0;
}
if(!delegpt_add_ns_mlc(dp, dname, 0, NULL, UNBOUND_DNS_PORT) ||
- !extstrtoaddr(ip, &addr, &addrlen) ||
+ !extstrtoaddr(ip, &addr, &addrlen, UNBOUND_DNS_PORT) ||
!delegpt_add_target_mlc(dp, dname, dname_len,
&addr, addrlen, 0, 0)) {
free(dname);
diff --git a/iterator/iter_resptype.c b/iterator/iter_resptype.c
index f146a2b6bfe8..c2b824a0f9b8 100644
--- a/iterator/iter_resptype.c
+++ b/iterator/iter_resptype.c
@@ -113,7 +113,11 @@ response_type_from_server(int rdset,
if(!msg || !request)
return RESPONSE_TYPE_THROWAWAY;
-
+ /* If the TC flag is set, the response is incomplete. Too large to
+ * fit even in TCP or so. Discard it, it cannot be retrieved here. */
+ if((msg->rep->flags & BIT_TC))
+ return RESPONSE_TYPE_THROWAWAY;
+
/* If the message is NXDOMAIN, then it answers the question. */
if(FLAGS_GET_RCODE(msg->rep->flags) == LDNS_RCODE_NXDOMAIN) {
/* make sure its not recursive when we don't want it to */
diff --git a/iterator/iterator.c b/iterator/iterator.c
index da9b7990c506..2f3ad06fe6ea 100644
--- a/iterator/iterator.c
+++ b/iterator/iterator.c
@@ -255,9 +255,9 @@ error_supers(struct module_qstate* qstate, int id, struct module_qstate* super)
log_err("out of memory adding missing");
}
delegpt_mark_neg(dpns, qstate->qinfo.qtype);
- dpns->resolved = 1; /* mark as failed */
if((dpns->got4 == 2 || !ie->supports_ipv4) &&
(dpns->got6 == 2 || !ie->supports_ipv6)) {
+ dpns->resolved = 1; /* mark as failed */
target_count_increase_nx(super_iq, 1);
}
}
@@ -596,15 +596,17 @@ errinf_reply(struct module_qstate* qstate, struct iter_qstate* iq)
{
if(qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail)
return;
- if((qstate->reply && qstate->reply->addrlen != 0) ||
- (iq->fail_reply && iq->fail_reply->addrlen != 0)) {
+ if((qstate->reply && qstate->reply->remote_addrlen != 0) ||
+ (iq->fail_reply && iq->fail_reply->remote_addrlen != 0)) {
char from[256], frm[512];
- if(qstate->reply && qstate->reply->addrlen != 0)
- addr_to_str(&qstate->reply->addr, qstate->reply->addrlen,
- from, sizeof(from));
+ if(qstate->reply && qstate->reply->remote_addrlen != 0)
+ addr_to_str(&qstate->reply->remote_addr,
+ qstate->reply->remote_addrlen, from,
+ sizeof(from));
else
- addr_to_str(&iq->fail_reply->addr, iq->fail_reply->addrlen,
- from, sizeof(from));
+ addr_to_str(&iq->fail_reply->remote_addr,
+ iq->fail_reply->remote_addrlen, from,
+ sizeof(from));
snprintf(frm, sizeof(frm), "from %s", from);
errinf(qstate, frm);
}
@@ -2262,6 +2264,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
size_t qout_orig_len = 0;
int sq_check_ratelimit = 1;
int sq_was_ratelimited = 0;
+ int can_do_promisc = 0;
/* NOTE: a request will encounter this state for each target it
* needs to send a query to. That is, at least one per referral,
@@ -2589,12 +2592,12 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
if(iq->depth < ie->max_dependency_depth
&& iq->num_target_queries == 0
&& (!iq->target_count || iq->target_count[TARGET_COUNT_NX]==0)
- && iq->sent_count < TARGET_FETCH_STOP
- /* if the mesh query list is full, then do not waste cpu
- * and sockets to fetch promiscuous targets. They can be
- * looked up when needed. */
- && !mesh_jostle_exceeded(qstate->env->mesh)
- ) {
+ && iq->sent_count < TARGET_FETCH_STOP) {
+ can_do_promisc = 1;
+ }
+ /* if the mesh query list is full, then do not waste cpu and sockets to
+ * fetch promiscuous targets. They can be looked up when needed. */
+ if(can_do_promisc && !mesh_jostle_exceeded(qstate->env->mesh)) {
tf_policy = ie->target_fetch_policy[iq->depth];
}
@@ -2766,6 +2769,37 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
return 0;
}
+ /* We have a target. We could have created promiscuous target
+ * queries but we are currently under pressure (mesh_jostle_exceeded).
+ * If we are configured to allow promiscuous target queries and haven't
+ * gone out to the network for a target query for this delegation, then
+ * it is possible to slip in a promiscuous one with a 1/10 chance. */
+ if(can_do_promisc && tf_policy == 0 && iq->depth == 0
+ && iq->depth < ie->max_dependency_depth
+ && ie->target_fetch_policy[iq->depth] != 0
+ && iq->dp_target_count == 0
+ && !ub_random_max(qstate->env->rnd, 10)) {
+ int extra = 0;
+ verbose(VERB_ALGO, "available target exists in cache but "
+ "attempt to get extra 1 target");
+ (void)query_for_targets(qstate, iq, ie, id, 1, &extra);
+ /* errors ignored, these targets are not strictly necessary for
+ * this result, we do not have to reply with SERVFAIL */
+ if(extra > 0) {
+ iq->num_target_queries += extra;
+ target_count_increase(iq, extra);
+ check_waiting_queries(iq, qstate, id);
+ /* undo qname minimise step because we'll get back here
+ * to do it again */
+ if(qout_orig && iq->minimise_count > 0) {
+ iq->minimise_count--;
+ iq->qinfo_out.qname = qout_orig;
+ iq->qinfo_out.qname_len = qout_orig_len;
+ }
+ return 0;
+ }
+ }
+
/* Do not check ratelimit for forwarding queries or if we already got a
* pass. */
sq_check_ratelimit = (!(iq->chase_flags & BIT_RD) && !iq->ratelimit_ok);
@@ -2873,6 +2907,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
(int)((iq->chase_flags&BIT_RD) || iq->chase_to_rd),
iq->response, &iq->qinfo_out, iq->dp);
iq->chase_to_rd = 0;
+ /* remove TC flag, if this is erroneously set by TCP upstream */
+ iq->response->rep->flags &= ~BIT_TC;
if(type == RESPONSE_TYPE_REFERRAL && (iq->chase_flags&BIT_RD) &&
!iq->auth_zone_response) {
/* When forwarding (RD bit is set), we handle referrals
@@ -2896,8 +2932,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
* use dnssec-lame-bypass if it needs to query there.*/
if(qstate->reply) {
struct delegpt_addr* a = delegpt_find_addr(
- iq->dp, &qstate->reply->addr,
- qstate->reply->addrlen);
+ iq->dp, &qstate->reply->remote_addr,
+ qstate->reply->remote_addrlen);
if(a) a->dnsseclame = 1;
}
/* test the answer is from the zone we expected,
@@ -2993,9 +3029,9 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
(*qstate->env->detach_subs)(qstate);
iq->num_target_queries = 0;
if(qstate->reply)
- sock_list_insert(&qstate->reply_origin,
- &qstate->reply->addr, qstate->reply->addrlen,
- qstate->region);
+ sock_list_insert(&qstate->reply_origin,
+ &qstate->reply->remote_addr,
+ qstate->reply->remote_addrlen, qstate->region);
if(iq->minimisation_state != DONOT_MINIMISE_STATE
&& !(iq->chase_flags & BIT_RD)) {
if(FLAGS_GET_RCODE(iq->response->rep->flags) !=
@@ -3250,9 +3286,9 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
(*qstate->env->detach_subs)(qstate);
iq->num_target_queries = 0;
if(qstate->reply)
- sock_list_insert(&qstate->reply_origin,
- &qstate->reply->addr, qstate->reply->addrlen,
- qstate->region);
+ sock_list_insert(&qstate->reply_origin,
+ &qstate->reply->remote_addr,
+ qstate->reply->remote_addrlen, qstate->region);
verbose(VERB_ALGO, "cleared outbound list for query restart");
/* go to INIT_REQUEST_STATE for new qname. */
return next_state(iq, INIT_REQUEST_STATE);
@@ -3266,9 +3302,10 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
} else if(qstate->reply) {
/* need addr for lameness cache, but we may have
* gotten this from cache, so test to be sure */
- if(!infra_set_lame(qstate->env->infra_cache,
- &qstate->reply->addr, qstate->reply->addrlen,
- iq->dp->name, iq->dp->namelen,
+ if(!infra_set_lame(qstate->env->infra_cache,
+ &qstate->reply->remote_addr,
+ qstate->reply->remote_addrlen,
+ iq->dp->name, iq->dp->namelen,
*qstate->env->now, dnsseclame, 0,
iq->qchase.qtype))
log_err("mark host lame: out of memory");
@@ -3285,8 +3322,9 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
* gotten this from cache, so test to be sure */
verbose(VERB_DETAIL, "mark as REC_LAME");
if(!infra_set_lame(qstate->env->infra_cache,
- &qstate->reply->addr, qstate->reply->addrlen,
- iq->dp->name, iq->dp->namelen,
+ &qstate->reply->remote_addr,
+ qstate->reply->remote_addrlen,
+ iq->dp->name, iq->dp->namelen,
*qstate->env->now, 0, 1, iq->qchase.qtype))
log_err("mark host lame: out of memory");
}
@@ -3527,12 +3565,13 @@ processTargetResponse(struct module_qstate* qstate, int id,
} else {
verbose(VERB_ALGO, "iterator TargetResponse failed");
delegpt_mark_neg(dpns, qstate->qinfo.qtype);
- dpns->resolved = 1; /* fail the target */
if((dpns->got4 == 2 || !ie->supports_ipv4) &&
- (dpns->got6 == 2 || !ie->supports_ipv6) &&
+ (dpns->got6 == 2 || !ie->supports_ipv6)) {
+ dpns->resolved = 1; /* fail the target */
/* do not count cached answers */
- (qstate->reply_origin && qstate->reply_origin->len != 0)) {
- target_count_increase_nx(foriq, 1);
+ if(qstate->reply_origin && qstate->reply_origin->len != 0) {
+ target_count_increase_nx(foriq, 1);
+ }
}
}
}
@@ -4014,8 +4053,8 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
if(!iq->response)
goto handle_it;
log_query_info(VERB_DETAIL, "response for", &qstate->qinfo);
- log_name_addr(VERB_DETAIL, "reply from", iq->dp->name,
- &qstate->reply->addr, qstate->reply->addrlen);
+ log_name_addr(VERB_DETAIL, "reply from", iq->dp->name,
+ &qstate->reply->remote_addr, qstate->reply->remote_addrlen);
if(verbosity >= VERB_ALGO)
log_dns_msg("incoming scrubbed packet:", &iq->response->qinfo,
iq->response->rep);
diff --git a/iterator/iterator.h b/iterator/iterator.h
index b71b7fe9945f..e35718cf33bd 100644
--- a/iterator/iterator.h
+++ b/iterator/iterator.h
@@ -324,7 +324,7 @@ struct iter_qstate {
/** the number of times this query has been restarted. */
int query_restart_count;
- /** the number of times this query as followed a referral. */
+ /** the number of times this query has followed a referral. */
int referral_count;
/** number of queries fired off */
diff --git a/libunbound/libunbound.c b/libunbound/libunbound.c
index 038b7b927a74..ea5ef24bb01c 100644
--- a/libunbound/libunbound.c
+++ b/libunbound/libunbound.c
@@ -951,7 +951,7 @@ ub_ctx_set_fwd(struct ub_ctx* ctx, const char* addr)
lock_basic_unlock(&ctx->cfglock);
/* check syntax for addr */
- if(!extstrtoaddr(addr, &storage, &stlen)) {
+ if(!extstrtoaddr(addr, &storage, &stlen, UNBOUND_DNS_PORT)) {
errno=EINVAL;
return UB_SYNTAX;
}
@@ -1031,7 +1031,7 @@ int ub_ctx_set_stub(struct ub_ctx* ctx, const char* zone, const char* addr,
if(addr) {
struct sockaddr_storage storage;
socklen_t stlen;
- if(!extstrtoaddr(addr, &storage, &stlen)) {
+ if(!extstrtoaddr(addr, &storage, &stlen, UNBOUND_DNS_PORT)) {
errno=EINVAL;
return UB_SYNTAX;
}
diff --git a/pythonmod/interface.i b/pythonmod/interface.i
index 0d95613f8c97..df8514b4793b 100644
--- a/pythonmod/interface.i
+++ b/pythonmod/interface.i
@@ -609,9 +609,9 @@ struct mesh_reply {
struct comm_reply query_reply;
};
-%rename(_addr) comm_reply::addr;
+%rename(_addr) comm_reply::client_addr;
struct comm_reply {
- struct sockaddr_storage addr;
+ struct sockaddr_storage client_addr;
};
%extend comm_reply {
diff --git a/pythonmod/pythonmod_utils.c b/pythonmod/pythonmod_utils.c
index 1f6f2512918f..aebe4d2bbb24 100644
--- a/pythonmod/pythonmod_utils.c
+++ b/pythonmod/pythonmod_utils.c
@@ -172,14 +172,14 @@ int createResponse(struct module_qstate* qstate, sldns_buffer* pkt)
}
-/* Convert reply->addr to string */
+/* Convert reply->client_addr to string */
void reply_addr2str(struct comm_reply* reply, char* dest, int maxlen)
{
- int af = (int)((struct sockaddr_in*) &(reply->addr))->sin_family;
- void* sinaddr = &((struct sockaddr_in*) &(reply->addr))->sin_addr;
+ int af = (int)((struct sockaddr_in*) &(reply->client_addr))->sin_family;
+ void* sinaddr = &((struct sockaddr_in*) &(reply->client_addr))->sin_addr;
if(af == AF_INET6)
- sinaddr = &((struct sockaddr_in6*)&(reply->addr))->sin6_addr;
+ sinaddr = &((struct sockaddr_in6*)&(reply->client_addr))->sin6_addr;
dest[0] = 0;
if (inet_ntop(af, sinaddr, dest, (socklen_t)maxlen) == 0)
return;
diff --git a/respip/respip.c b/respip/respip.c
index deff663170aa..942e082b9577 100644
--- a/respip/respip.c
+++ b/respip/respip.c
@@ -1290,7 +1290,7 @@ respip_set_is_empty(const struct respip_set* set)
void
respip_inform_print(struct respip_action_info* respip_actinfo, uint8_t* qname,
uint16_t qtype, uint16_t qclass, struct local_rrset* local_alias,
- struct comm_reply* repinfo)
+ struct sockaddr_storage* addr, socklen_t addrlen)
{
char srcip[128], respip[128], txt[512];
unsigned port;
@@ -1300,10 +1300,10 @@ respip_inform_print(struct respip_action_info* respip_actinfo, uint8_t* qname,
if(local_alias)
qname = local_alias->rrset->rk.dname;
- port = (unsigned)((repinfo->addr.ss_family == AF_INET) ?
- ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port) :
- ntohs(((struct sockaddr_in6*)&repinfo->addr)->sin6_port));
- addr_to_str(&repinfo->addr, repinfo->addrlen, srcip, sizeof(srcip));
+ port = (unsigned)((addr->ss_family == AF_INET) ?
+ ntohs(((struct sockaddr_in*)addr)->sin_port) :
+ ntohs(((struct sockaddr_in6*)addr)->sin6_port));
+ addr_to_str(addr, addrlen, srcip, sizeof(srcip));
addr_to_str(&respip_addr->addr, respip_addr->addrlen,
respip, sizeof(respip));
if(respip_actinfo->rpz_log) {
diff --git a/respip/respip.h b/respip/respip.h
index 988a72263390..e4ab5cc9cce3 100644
--- a/respip/respip.h
+++ b/respip/respip.h
@@ -251,11 +251,13 @@ int respip_set_is_empty(const struct respip_set* set);
* @param local_alias: set to a local alias if the query matches an alias in
* a local zone. In this case its owner name will be considered the actual
* query name.
- * @param repinfo: reply info containing the client's source address and port.
+ * @param addr: the client's source address and port.
+ * @param addrlen: the client's source address length.
*/
void respip_inform_print(struct respip_action_info* respip_actinfo,
uint8_t* qname, uint16_t qtype, uint16_t qclass,
- struct local_rrset* local_alias, struct comm_reply* repinfo);
+ struct local_rrset* local_alias, struct sockaddr_storage* addr,
+ socklen_t addrlen);
/**
* Find resp_addr in tree, create and add to tree if it does not exist.
diff --git a/services/authzone.c b/services/authzone.c
index b9e0b11ef3bb..6de1e4319095 100644
--- a/services/authzone.c
+++ b/services/authzone.c
@@ -3699,7 +3699,7 @@ addr_matches_master(struct auth_master* master, struct sockaddr_storage* addr,
/* compare address (but not port number, that is the destination
* port of the master, the port number of the received notify is
* allowed to by any port on that master) */
- if(extstrtoaddr(master->host, &a, &alen) &&
+ if(extstrtoaddr(master->host, &a, &alen, UNBOUND_DNS_PORT) &&
sockaddr_cmp_addr(addr, addrlen, &a, alen)==0) {
*fromhost = master;
return 1;
@@ -5381,7 +5381,7 @@ xfr_transfer_lookup_host(struct auth_xfer* xfr, struct module_env* env)
struct edns_data edns;
sldns_buffer* buf = env->scratch_buffer;
if(!master) return 0;
- if(extstrtoaddr(master->host, &addr, &addrlen)) {
+ if(extstrtoaddr(master->host, &addr, &addrlen, UNBOUND_DNS_PORT)) {
/* not needed, host is in IP addr format */
return 0;
}
@@ -6572,7 +6572,7 @@ xfr_probe_lookup_host(struct auth_xfer* xfr, struct module_env* env)
struct edns_data edns;
sldns_buffer* buf = env->scratch_buffer;
if(!master) return 0;
- if(extstrtoaddr(master->host, &addr, &addrlen)) {
+ if(extstrtoaddr(master->host, &addr, &addrlen, UNBOUND_DNS_PORT)) {
/* not needed, host is in IP addr format */
return 0;
}
diff --git a/services/cache/infra.c b/services/cache/infra.c
index 0461c815b86b..537cb949cf88 100644
--- a/services/cache/infra.c
+++ b/services/cache/infra.c
@@ -834,14 +834,13 @@ static struct lruhash_entry* infra_find_ratedata(struct infra_cache* infra,
/** find data item in array for ip addresses */
static struct lruhash_entry* infra_find_ip_ratedata(struct infra_cache* infra,
- struct comm_reply* repinfo, int wr)
+ struct sockaddr_storage* addr, socklen_t addrlen, int wr)
{
struct ip_rate_key key;
- hashvalue_type h = hash_addr(&(repinfo->addr),
- repinfo->addrlen, 0);
+ hashvalue_type h = hash_addr(addr, addrlen, 0);
memset(&key, 0, sizeof(key));
- key.addr = repinfo->addr;
- key.addrlen = repinfo->addrlen;
+ key.addr = *addr;
+ key.addrlen = addrlen;
key.entry.hash = h;
return slabhash_lookup(infra->client_ip_rates, h, &key, wr);
}
@@ -876,10 +875,9 @@ static void infra_create_ratedata(struct infra_cache* infra,
/** create rate data item for ip address */
static void infra_ip_create_ratedata(struct infra_cache* infra,
- struct comm_reply* repinfo, time_t timenow)
+ struct sockaddr_storage* addr, socklen_t addrlen, time_t timenow)
{
- hashvalue_type h = hash_addr(&(repinfo->addr),
- repinfo->addrlen, 0);
+ hashvalue_type h = hash_addr(addr, addrlen, 0);
struct ip_rate_key* k = (struct ip_rate_key*)calloc(1, sizeof(*k));
struct ip_rate_data* d = (struct ip_rate_data*)calloc(1, sizeof(*d));
if(!k || !d) {
@@ -887,8 +885,8 @@ static void infra_ip_create_ratedata(struct infra_cache* infra,
free(d);
return; /* alloc failure */
}
- k->addr = repinfo->addr;
- k->addrlen = repinfo->addrlen;
+ k->addr = *addr;
+ k->addrlen = addrlen;
lock_rw_init(&k->entry.lock);
k->entry.hash = h;
k->entry.key = k;
@@ -985,8 +983,8 @@ int infra_ratelimit_inc(struct infra_cache* infra, uint8_t* name,
sldns_wire2str_class_buf(qinfo->qclass, cs, sizeof(cs));
ip[0]=0;
if(replylist) {
- addr_to_str((struct sockaddr_storage *)&replylist->addr,
- replylist->addrlen, ip, sizeof(ip));
+ addr_to_str((struct sockaddr_storage *)&replylist->remote_addr,
+ replylist->remote_addrlen, ip, sizeof(ip));
verbose(VERB_OPS, "ratelimit exceeded %s %d query %s %s %s from %s", buf, lim, qnm, cs, ts, ip);
} else {
verbose(VERB_OPS, "ratelimit exceeded %s %d query %s %s %s", buf, lim, qnm, cs, ts);
@@ -1040,7 +1038,7 @@ int infra_ratelimit_exceeded(struct infra_cache* infra, uint8_t* name,
max = infra_rate_max(entry->data, timenow, backoff);
lock_rw_unlock(&entry->lock);
- return (max >= lim);
+ return (max > lim);
}
size_t
@@ -1054,8 +1052,8 @@ infra_get_mem(struct infra_cache* infra)
}
int infra_ip_ratelimit_inc(struct infra_cache* infra,
- struct comm_reply* repinfo, time_t timenow, int backoff,
- struct sldns_buffer* buffer)
+ struct sockaddr_storage* addr, socklen_t addrlen, time_t timenow,
+ int backoff, struct sldns_buffer* buffer)
{
int max;
struct lruhash_entry* entry;
@@ -1065,7 +1063,7 @@ int infra_ip_ratelimit_inc(struct infra_cache* infra,
return 1;
}
/* find or insert ratedata */
- entry = infra_find_ip_ratedata(infra, repinfo, 1);
+ entry = infra_find_ip_ratedata(infra, addr, addrlen, 1);
if(entry) {
int premax = infra_rate_max(entry->data, timenow, backoff);
int* cur = infra_rate_give_second(entry->data, timenow);
@@ -1073,10 +1071,9 @@ int infra_ip_ratelimit_inc(struct infra_cache* infra,
max = infra_rate_max(entry->data, timenow, backoff);
lock_rw_unlock(&entry->lock);
- if(premax < infra_ip_ratelimit && max >= infra_ip_ratelimit) {
+ if(premax <= infra_ip_ratelimit && max > infra_ip_ratelimit) {
char client_ip[128], qnm[LDNS_MAX_DOMAINLEN+1+12+12];
- addr_to_str((struct sockaddr_storage *)&repinfo->addr,
- repinfo->addrlen, client_ip, sizeof(client_ip));
+ addr_to_str(addr, addrlen, client_ip, sizeof(client_ip));
qnm[0]=0;
if(sldns_buffer_limit(buffer)>LDNS_HEADER_SIZE &&
LDNS_QDCOUNT(sldns_buffer_begin(buffer))!=0) {
@@ -1101,6 +1098,6 @@ int infra_ip_ratelimit_inc(struct infra_cache* infra,
}
/* create */
- infra_ip_create_ratedata(infra, repinfo, timenow);
+ infra_ip_create_ratedata(infra, addr, addrlen, timenow);
return 1;
}
diff --git a/services/cache/infra.h b/services/cache/infra.h
index 6a2371aca477..faf7fd2f30e1 100644
--- a/services/cache/infra.h
+++ b/services/cache/infra.h
@@ -416,15 +416,16 @@ int infra_find_ratelimit(struct infra_cache* infra, uint8_t* name,
/** Update query ratelimit hash and decide
* whether or not a query should be dropped.
* @param infra: infra cache
- * @param repinfo: information about client
+ * @param addr: client address
+ * @param addrlen: client address length
* @param timenow: what time it is now.
* @param backoff: if backoff is enabled.
* @param buffer: with query for logging.
* @return 1 if it could be incremented. 0 if the increment overshot the
* ratelimit and the query should be dropped. */
int infra_ip_ratelimit_inc(struct infra_cache* infra,
- struct comm_reply* repinfo, time_t timenow, int backoff,
- struct sldns_buffer* buffer);
+ struct sockaddr_storage* addr, socklen_t addrlen, time_t timenow,
+ int backoff, struct sldns_buffer* buffer);
/**
* Get memory used by the infra cache.
diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c
index 1c7c177a007e..95606aff5d4e 100644
--- a/services/listen_dnsport.c
+++ b/services/listen_dnsport.c
@@ -124,12 +124,12 @@ verbose_print_addr(struct addrinfo *addr)
(void)strlcpy(buf, "(null)", sizeof(buf));
}
buf[sizeof(buf)-1] = 0;
- verbose(VERB_ALGO, "creating %s%s socket %s %d",
+ verbose(VERB_ALGO, "creating %s%s socket %s %d",
addr->ai_socktype==SOCK_DGRAM?"udp":
addr->ai_socktype==SOCK_STREAM?"tcp":"otherproto",
addr->ai_family==AF_INET?"4":
addr->ai_family==AF_INET6?"6":
- "_otherfam", buf,
+ "_otherfam", buf,
ntohs(((struct sockaddr_in*)addr->ai_addr)->sin_port));
}
}
@@ -140,7 +140,9 @@ verbose_print_unbound_socket(struct unbound_socket* ub_sock)
if(verbosity >= VERB_ALGO) {
log_info("listing of unbound_socket structure:");
verbose_print_addr(ub_sock->addr);
- log_info("s is: %d, fam is: %s", ub_sock->s, ub_sock->fam == AF_INET?"AF_INET":"AF_INET6");
+ log_info("s is: %d, fam is: %s, acl: %s", ub_sock->s,
+ ub_sock->fam == AF_INET?"AF_INET":"AF_INET6",
+ ub_sock->acl?"yes":"no");
}
}
@@ -458,7 +460,14 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
int action;
# endif
# if defined(IPV6_V6ONLY)
- if(v6only) {
+ if(v6only
+# ifdef HAVE_SYSTEMD
+ /* Systemd wants to control if the socket is v6 only
+ * or both, with BindIPv6Only=default, ipv6-only or
+ * both in systemd.socket, so it is not set here. */
+ && !got_fd_from_systemd
+# endif
+ ) {
int val=(v6only==2)?0:1;
if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
(void*)&val, (socklen_t)sizeof(val)) < 0) {
@@ -511,12 +520,14 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
* instead which is writable; IPV6_MTU is readonly there. */
if (setsockopt(s, IPPROTO_IPV6, IPV6_USER_MTU,
(void*)&mtu, (socklen_t)sizeof(mtu)) < 0) {
- log_err("setsockopt(..., IPV6_USER_MTU, ...) failed: %s",
- wsa_strerror(WSAGetLastError()));
- sock_close(s);
- *noproto = 0;
- *inuse = 0;
- return -1;
+ if (WSAGetLastError() != WSAENOPROTOOPT) {
+ log_err("setsockopt(..., IPV6_USER_MTU, ...) failed: %s",
+ wsa_strerror(WSAGetLastError()));
+ sock_close(s);
+ *noproto = 0;
+ *inuse = 0;
+ return -1;
+ }
}
# endif /* USE_WINSOCK */
# endif /* IPv6 MTU */
@@ -774,7 +785,14 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
(void)reuseport;
#endif /* defined(SO_REUSEPORT) */
#if defined(IPV6_V6ONLY)
- if(addr->ai_family == AF_INET6 && v6only) {
+ if(addr->ai_family == AF_INET6 && v6only
+# ifdef HAVE_SYSTEMD
+ /* Systemd wants to control if the socket is v6 only
+ * or both, with BindIPv6Only=default, ipv6-only or
+ * both in systemd.socket, so it is not set here. */
+ && !got_fd_from_systemd
+# endif
+ ) {
if(setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
(void*)&on, (socklen_t)sizeof(on)) < 0) {
log_err("setsockopt(..., IPV6_V6ONLY, ...) failed: %s",
@@ -1030,6 +1048,7 @@ make_sock(int stype, const char* ifname, const char* port,
ub_sock->addr = res;
ub_sock->s = s;
ub_sock->fam = hints->ai_family;
+ ub_sock->acl = NULL;
return s;
}
@@ -1074,11 +1093,13 @@ make_sock_port(int stype, const char* ifname, const char* port,
* @param list: list head. changed.
* @param s: fd.
* @param ftype: if fd is UDP.
+ * @param pp2_enabled: if PROXYv2 is enabled for this port.
* @param ub_sock: socket with address.
* @return false on failure. list in unchanged then.
*/
static int
-port_insert(struct listen_port** list, int s, enum listen_type ftype, struct unbound_socket* ub_sock)
+port_insert(struct listen_port** list, int s, enum listen_type ftype,
+ int pp2_enabled, struct unbound_socket* ub_sock)
{
struct listen_port* item = (struct listen_port*)malloc(
sizeof(struct listen_port));
@@ -1087,6 +1108,7 @@ port_insert(struct listen_port** list, int s, enum listen_type ftype, struct unb
item->next = *list;
item->fd = s;
item->ftype = ftype;
+ item->pp2_enabled = pp2_enabled;
item->socket = ub_sock;
*list = item;
return 1;
@@ -1182,6 +1204,7 @@ if_is_ssl(const char* ifname, const char* port, int ssl_port,
* @param ssl_port: ssl service port number
* @param tls_additional_port: list of additional ssl service port numbers.
* @param https_port: DoH service port number
+ * @param proxy_protocol_port: list of PROXYv2 port numbers.
* @param reuseport: try to set SO_REUSEPORT if nonNULL and true.
* set to false on exit if reuseport failed due to no kernel support.
* @param transparent: set IP_TRANSPARENT socket option.
@@ -1194,34 +1217,39 @@ if_is_ssl(const char* ifname, const char* port, int ssl_port,
* @return: returns false on error.
*/
static int
-ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
+ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
struct addrinfo *hints, const char* port, struct listen_port** list,
size_t rcv, size_t snd, int ssl_port,
struct config_strlist* tls_additional_port, int https_port,
+ struct config_strlist* proxy_protocol_port,
int* reuseport, int transparent, int tcp_mss, int freebind,
int http2_nodelay, int use_systemd, int dnscrypt_port, int dscp)
{
int s, noip6=0;
int is_https = if_is_https(ifname, port, https_port);
+ int is_dnscrypt = if_is_dnscrypt(ifname, port, dnscrypt_port);
+ int is_pp2 = if_is_pp2(ifname, port, proxy_protocol_port);
int nodelay = is_https && http2_nodelay;
struct unbound_socket* ub_sock;
-#ifdef USE_DNSCRYPT
- int is_dnscrypt = ((strchr(ifname, '@') &&
- atoi(strchr(ifname, '@')+1) == dnscrypt_port) ||
- (!strchr(ifname, '@') && atoi(port) == dnscrypt_port));
-#else
- int is_dnscrypt = 0;
- (void)dnscrypt_port;
-#endif
if(!do_udp && !do_tcp)
return 0;
+ if(is_pp2) {
+ if(is_dnscrypt) {
+ fatal_exit("PROXYv2 and DNSCrypt combination not "
+ "supported!");
+ } else if(is_https) {
+ fatal_exit("PROXYv2 and DoH combination not "
+ "supported!");
+ }
+ }
+
if(do_auto) {
ub_sock = calloc(1, sizeof(struct unbound_socket));
if(!ub_sock)
return 0;
- if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1,
+ if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1,
&noip6, rcv, snd, reuseport, transparent,
tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock)) == -1) {
freeaddrinfo(ub_sock->addr);
@@ -1239,8 +1267,9 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
free(ub_sock);
return 0;
}
- if(!port_insert(list, s,
- is_dnscrypt?listen_type_udpancil_dnscrypt:listen_type_udpancil, ub_sock)) {
+ if(!port_insert(list, s, is_dnscrypt
+ ?listen_type_udpancil_dnscrypt:listen_type_udpancil,
+ is_pp2, ub_sock)) {
sock_close(s);
freeaddrinfo(ub_sock->addr);
free(ub_sock);
@@ -1251,7 +1280,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
if(!ub_sock)
return 0;
/* regular udp socket */
- if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1,
+ if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1,
&noip6, rcv, snd, reuseport, transparent,
tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock)) == -1) {
freeaddrinfo(ub_sock->addr);
@@ -1262,8 +1291,9 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
}
return 0;
}
- if(!port_insert(list, s,
- is_dnscrypt?listen_type_udp_dnscrypt:listen_type_udp, ub_sock)) {
+ if(!port_insert(list, s, is_dnscrypt
+ ?listen_type_udp_dnscrypt:listen_type_udp,
+ is_pp2, ub_sock)) {
sock_close(s);
freeaddrinfo(ub_sock->addr);
free(ub_sock);
@@ -1285,7 +1315,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
port_type = listen_type_tcp_dnscrypt;
else
port_type = listen_type_tcp;
- if((s = make_sock_port(SOCK_STREAM, ifname, port, hints, 1,
+ if((s = make_sock_port(SOCK_STREAM, ifname, port, hints, 1,
&noip6, 0, 0, reuseport, transparent, tcp_mss, nodelay,
freebind, use_systemd, dscp, ub_sock)) == -1) {
freeaddrinfo(ub_sock->addr);
@@ -1298,7 +1328,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
}
if(is_ssl)
verbose(VERB_ALGO, "setup TCP for SSL service");
- if(!port_insert(list, s, port_type, ub_sock)) {
+ if(!port_insert(list, s, port_type, is_pp2, ub_sock)) {
sock_close(s);
freeaddrinfo(ub_sock->addr);
free(ub_sock);
@@ -1387,14 +1417,16 @@ listen_create(struct comm_base* base, struct listen_port* ports,
if(ports->ftype == listen_type_udp ||
ports->ftype == listen_type_udp_dnscrypt) {
cp = comm_point_create_udp(base, ports->fd,
- front->udp_buff, cb, cb_arg, ports->socket);
+ front->udp_buff, ports->pp2_enabled, cb,
+ cb_arg, ports->socket);
} else if(ports->ftype == listen_type_tcp ||
ports->ftype == listen_type_tcp_dnscrypt) {
cp = comm_point_create_tcp(base, ports->fd,
tcp_accept_count, tcp_idle_timeout,
harden_large_queries, 0, NULL,
tcp_conn_limit, bufsize, front->udp_buff,
- ports->ftype, cb, cb_arg, ports->socket);
+ ports->ftype, ports->pp2_enabled, cb, cb_arg,
+ ports->socket);
} else if(ports->ftype == listen_type_ssl ||
ports->ftype == listen_type_http) {
cp = comm_point_create_tcp(base, ports->fd,
@@ -1402,7 +1434,8 @@ listen_create(struct comm_base* base, struct listen_port* ports,
harden_large_queries,
http_max_streams, http_endpoint,
tcp_conn_limit, bufsize, front->udp_buff,
- ports->ftype, cb, cb_arg, ports->socket);
+ ports->ftype, ports->pp2_enabled, cb, cb_arg,
+ ports->socket);
if(ports->ftype == listen_type_http) {
if(!sslctx && !http_notls) {
log_warn("HTTPS port configured, but "
@@ -1428,7 +1461,8 @@ listen_create(struct comm_base* base, struct listen_port* ports,
} else if(ports->ftype == listen_type_udpancil ||
ports->ftype == listen_type_udpancil_dnscrypt) {
cp = comm_point_create_udp_ancil(base, ports->fd,
- front->udp_buff, cb, cb_arg, ports->socket);
+ front->udp_buff, ports->pp2_enabled, cb,
+ cb_arg, ports->socket);
}
if(!cp) {
log_err("can't create commpoint");
@@ -1700,7 +1734,7 @@ int resolve_interface_names(char** ifs, int num_ifs,
#endif /* HAVE_GETIFADDRS */
}
-struct listen_port*
+struct listen_port*
listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
int* reuseport)
{
@@ -1763,7 +1797,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
&hints, portbuf, &list,
cfg->so_rcvbuf, cfg->so_sndbuf,
cfg->ssl_port, cfg->tls_additional_port,
- cfg->https_port, reuseport, cfg->ip_transparent,
+ cfg->https_port,
+ cfg->proxy_protocol_port,
+ reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
cfg->dnscrypt_port, cfg->ip_dscp)) {
@@ -1778,7 +1814,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
&hints, portbuf, &list,
cfg->so_rcvbuf, cfg->so_sndbuf,
cfg->ssl_port, cfg->tls_additional_port,
- cfg->https_port, reuseport, cfg->ip_transparent,
+ cfg->https_port,
+ cfg->proxy_protocol_port,
+ reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
cfg->dnscrypt_port, cfg->ip_dscp)) {
@@ -1791,12 +1829,13 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
}
if(do_ip6) {
hints.ai_family = AF_INET6;
- if(!ports_create_if(do_auto?"::0":"::1",
- do_auto, cfg->do_udp, do_tcp,
+ if(!ports_create_if(do_auto?"::0":"::1",
+ do_auto, cfg->do_udp, do_tcp,
&hints, portbuf, &list,
cfg->so_rcvbuf, cfg->so_sndbuf,
cfg->ssl_port, cfg->tls_additional_port,
- cfg->https_port, reuseport, cfg->ip_transparent,
+ cfg->https_port, cfg->proxy_protocol_port,
+ reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
cfg->dnscrypt_port, cfg->ip_dscp)) {
@@ -1806,12 +1845,13 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
}
if(do_ip4) {
hints.ai_family = AF_INET;
- if(!ports_create_if(do_auto?"0.0.0.0":"127.0.0.1",
- do_auto, cfg->do_udp, do_tcp,
+ if(!ports_create_if(do_auto?"0.0.0.0":"127.0.0.1",
+ do_auto, cfg->do_udp, do_tcp,
&hints, portbuf, &list,
cfg->so_rcvbuf, cfg->so_sndbuf,
cfg->ssl_port, cfg->tls_additional_port,
- cfg->https_port, reuseport, cfg->ip_transparent,
+ cfg->https_port, cfg->proxy_protocol_port,
+ reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
cfg->dnscrypt_port, cfg->ip_dscp)) {
@@ -1825,10 +1865,11 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
continue;
hints.ai_family = AF_INET6;
if(!ports_create_if(ifs[i], 0, cfg->do_udp,
- do_tcp, &hints, portbuf, &list,
+ do_tcp, &hints, portbuf, &list,
cfg->so_rcvbuf, cfg->so_sndbuf,
cfg->ssl_port, cfg->tls_additional_port,
- cfg->https_port, reuseport, cfg->ip_transparent,
+ cfg->https_port, cfg->proxy_protocol_port,
+ reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
cfg->dnscrypt_port, cfg->ip_dscp)) {
@@ -1840,10 +1881,11 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
continue;
hints.ai_family = AF_INET;
if(!ports_create_if(ifs[i], 0, cfg->do_udp,
- do_tcp, &hints, portbuf, &list,
+ do_tcp, &hints, portbuf, &list,
cfg->so_rcvbuf, cfg->so_sndbuf,
cfg->ssl_port, cfg->tls_additional_port,
- cfg->https_port, reuseport, cfg->ip_transparent,
+ cfg->https_port, cfg->proxy_protocol_port,
+ reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
cfg->dnscrypt_port, cfg->ip_dscp)) {
diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h
index 0e63236bcbce..816d79aea61b 100644
--- a/services/listen_dnsport.h
+++ b/services/listen_dnsport.h
@@ -43,6 +43,7 @@
#define LISTEN_DNSPORT_H
#include "util/netevent.h"
+#include "daemon/acl_list.h"
#ifdef HAVE_NGHTTP2_NGHTTP2_H
#include <nghttp2/nghttp2.h>
#endif
@@ -107,11 +108,13 @@ enum listen_type {
*/
struct unbound_socket {
/** socket-address structure */
- struct addrinfo * addr;
+ struct addrinfo* addr;
/** socket descriptor returned by socket() syscall */
- int s;
+ int s;
/** address family (AF_INET/IF_INET6) */
- int fam;
+ int fam;
+ /** ACL on the socket (listening interface) */
+ struct acl_addr* acl;
};
/**
@@ -125,7 +128,10 @@ struct listen_port {
int fd;
/** type of file descriptor, udp or tcp */
enum listen_type ftype;
- /** fill in unbpound_socket structure for every opened socket at Unbound startup */
+ /** if the port should support PROXYv2 */
+ int pp2_enabled;
+ /** fill in unbound_socket structure for every opened socket at
+ * Unbound startup */
struct unbound_socket* socket;
};
diff --git a/services/localzone.c b/services/localzone.c
index 3ed7d835d33e..3536b7aaa91b 100644
--- a/services/localzone.c
+++ b/services/localzone.c
@@ -1744,13 +1744,13 @@ local_zones_zone_answer(struct local_zone* z, struct module_env* env,
/** print log information for an inform zone query */
static void
lz_inform_print(struct local_zone* z, struct query_info* qinfo,
- struct comm_reply* repinfo)
+ struct sockaddr_storage* addr, socklen_t addrlen)
{
char ip[128], txt[512];
char zname[LDNS_MAX_DOMAINLEN+1];
- uint16_t port = ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port);
+ uint16_t port = ntohs(((struct sockaddr_in*)addr)->sin_port);
dname_str(z->name, zname);
- addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip));
+ addr_to_str(addr, addrlen, ip, sizeof(ip));
snprintf(txt, sizeof(txt), "%s %s %s@%u", zname, local_zone_type2str(z->type), ip,
(unsigned)port);
log_nametypeclass(NO_VERBOSE, txt, qinfo->qname, qinfo->qtype, qinfo->qclass);
@@ -1765,7 +1765,8 @@ lz_type(uint8_t *taglist, size_t taglen, uint8_t *taglist2, size_t taglen2,
struct local_zone_override* lzo;
if(repinfo && override_tree) {
lzo = (struct local_zone_override*)addr_tree_lookup(
- override_tree, &repinfo->addr, repinfo->addrlen);
+ override_tree, &repinfo->client_addr,
+ repinfo->client_addrlen);
if(lzo && lzo->type) {
verbose(VERB_ALGO, "local zone override to type %s",
local_zone_type2str(lzo->type));
@@ -1888,7 +1889,8 @@ local_zones_answer(struct local_zones* zones, struct module_env* env,
lzt == local_zone_inform_deny ||
lzt == local_zone_inform_redirect)
&& repinfo)
- lz_inform_print(z, qinfo, repinfo);
+ lz_inform_print(z, qinfo, &repinfo->client_addr,
+ repinfo->client_addrlen);
if(lzt != local_zone_always_refuse
&& lzt != local_zone_always_transparent
diff --git a/services/mesh.c b/services/mesh.c
index 2a411942663d..9007b6e08c32 100644
--- a/services/mesh.c
+++ b/services/mesh.c
@@ -806,7 +806,7 @@ static void mesh_schedule_prefetch_subnet(struct mesh_area* mesh,
/* Fake the ECS data from the client's IP */
struct ecs_data ecs;
memset(&ecs, 0, sizeof(ecs));
- subnet_option_from_ss(&rep->addr, &ecs, mesh->env->cfg);
+ subnet_option_from_ss(&rep->client_addr, &ecs, mesh->env->cfg);
if(ecs.subnet_validdata == 0) {
log_err("prefetch_subnet subnet_option_from_ss: invalid data");
return;
@@ -1488,8 +1488,9 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
}
/* Log reply sent */
if(m->s.env->cfg->log_replies) {
- log_reply_info(NO_VERBOSE, &m->s.qinfo, &r->query_reply.addr,
- r->query_reply.addrlen, duration, 0, r_buffer);
+ log_reply_info(NO_VERBOSE, &m->s.qinfo,
+ &r->query_reply.client_addr,
+ r->query_reply.client_addrlen, duration, 0, r_buffer);
}
}
@@ -1530,7 +1531,8 @@ void mesh_query_done(struct mesh_state* mstate)
respip_inform_print(mstate->s.respip_action_info,
r->qname, mstate->s.qinfo.qtype,
mstate->s.qinfo.qclass, r->local_alias,
- &r->query_reply);
+ &r->query_reply.client_addr,
+ r->query_reply.client_addrlen);
if(mstate->s.env->cfg->stat_extended &&
mstate->s.respip_action_info->rpz_used) {
if(mstate->s.respip_action_info->rpz_disabled)
@@ -2180,7 +2182,8 @@ mesh_serve_expired_callback(void* arg)
if(actinfo.addrinfo) {
respip_inform_print(&actinfo, r->qname,
qstate->qinfo.qtype, qstate->qinfo.qclass,
- r->local_alias, &r->query_reply);
+ r->local_alias, &r->query_reply.client_addr,
+ r->query_reply.client_addrlen);
if(qstate->env->cfg->stat_extended && actinfo.rpz_used) {
if(actinfo.rpz_disabled)
diff --git a/services/outside_network.c b/services/outside_network.c
index 3f479a3a36fe..a4529ade52e0 100644
--- a/services/outside_network.c
+++ b/services/outside_network.c
@@ -86,10 +86,6 @@ static void serviced_tcp_initiate(struct serviced_query* sq, sldns_buffer* buff)
static int randomize_and_send_udp(struct pending* pend, sldns_buffer* packet,
int timeout);
-/** remove waiting tcp from the outnet waiting list */
-static void waiting_list_remove(struct outside_network* outnet,
- struct waiting_tcp* w);
-
/** select a DNS ID for a TCP stream */
static uint16_t tcp_select_id(struct outside_network* outnet,
struct reuse_tcp* reuse);
@@ -372,7 +368,8 @@ log_reuse_tcp(enum verbosity_value v, const char* msg, struct reuse_tcp* reuse)
}
/** pop the first element from the writewait list */
-static struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse)
+struct waiting_tcp*
+reuse_write_wait_pop(struct reuse_tcp* reuse)
{
struct waiting_tcp* w = reuse->write_wait_first;
if(!w)
@@ -390,8 +387,8 @@ static struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse)
}
/** remove the element from the writewait list */
-static void reuse_write_wait_remove(struct reuse_tcp* reuse,
- struct waiting_tcp* w)
+void
+reuse_write_wait_remove(struct reuse_tcp* reuse, struct waiting_tcp* w)
{
log_assert(w);
log_assert(w->write_wait_queued);
@@ -415,8 +412,8 @@ static void reuse_write_wait_remove(struct reuse_tcp* reuse,
}
/** push the element after the last on the writewait list */
-static void reuse_write_wait_push_back(struct reuse_tcp* reuse,
- struct waiting_tcp* w)
+void
+reuse_write_wait_push_back(struct reuse_tcp* reuse, struct waiting_tcp* w)
{
if(!w) return;
log_assert(!w->write_wait_queued);
@@ -427,7 +424,9 @@ static void reuse_write_wait_push_back(struct reuse_tcp* reuse,
w->write_wait_prev = reuse->write_wait_last;
} else {
reuse->write_wait_first = w;
+ w->write_wait_prev = NULL;
}
+ w->write_wait_next = NULL;
reuse->write_wait_last = w;
w->write_wait_queued = 1;
}
@@ -721,12 +720,12 @@ outnet_tcp_take_into_use(struct waiting_tcp* w)
pend->next_free = NULL;
pend->query = w;
pend->reuse.outnet = w->outnet;
- pend->c->repinfo.addrlen = w->addrlen;
+ pend->c->repinfo.remote_addrlen = w->addrlen;
pend->c->tcp_more_read_again = &pend->reuse.cp_more_read_again;
pend->c->tcp_more_write_again = &pend->reuse.cp_more_write_again;
pend->reuse.cp_more_read_again = 0;
pend->reuse.cp_more_write_again = 0;
- memcpy(&pend->c->repinfo.addr, &w->addr, w->addrlen);
+ memcpy(&pend->c->repinfo.remote_addr, &w->addr, w->addrlen);
pend->reuse.pending = pend;
/* Remove from tree in case the is_ssl will be different and causes the
@@ -810,20 +809,50 @@ reuse_tcp_lru_snip(struct outside_network* outnet)
return reuse;
}
-/** call callback on waiting_tcp, if not NULL */
-static void
-waiting_tcp_callback(struct waiting_tcp* w, struct comm_point* c, int error,
- struct comm_reply* reply_info)
+/** remove waiting tcp from the outnet waiting list */
+void
+outnet_waiting_tcp_list_remove(struct outside_network* outnet, struct waiting_tcp* w)
{
- if(w && w->cb) {
- fptr_ok(fptr_whitelist_pending_tcp(w->cb));
- (void)(*w->cb)(c, w->cb_arg, error, reply_info);
+ struct waiting_tcp* p = outnet->tcp_wait_first, *prev = NULL;
+ w->on_tcp_waiting_list = 0;
+ while(p) {
+ if(p == w) {
+ /* remove w */
+ if(prev)
+ prev->next_waiting = w->next_waiting;
+ else outnet->tcp_wait_first = w->next_waiting;
+ if(outnet->tcp_wait_last == w)
+ outnet->tcp_wait_last = prev;
+ w->next_waiting = NULL;
+ return;
+ }
+ prev = p;
+ p = p->next_waiting;
}
+ /* outnet_waiting_tcp_list_remove is currently called only with items
+ * that are already in the waiting list. */
+ log_assert(0);
+}
+
+/** pop the first waiting tcp from the outnet waiting list */
+struct waiting_tcp*
+outnet_waiting_tcp_list_pop(struct outside_network* outnet)
+{
+ struct waiting_tcp* w = outnet->tcp_wait_first;
+ if(!outnet->tcp_wait_first) return NULL;
+ log_assert(w->on_tcp_waiting_list);
+ outnet->tcp_wait_first = w->next_waiting;
+ if(outnet->tcp_wait_last == w)
+ outnet->tcp_wait_last = NULL;
+ w->on_tcp_waiting_list = 0;
+ w->next_waiting = NULL;
+ return w;
}
/** add waiting_tcp element to the outnet tcp waiting list */
-static void
-outnet_add_tcp_waiting(struct outside_network* outnet, struct waiting_tcp* w)
+void
+outnet_waiting_tcp_list_add(struct outside_network* outnet,
+ struct waiting_tcp* w, int set_timer)
{
struct timeval tv;
log_assert(!w->on_tcp_waiting_list);
@@ -835,16 +864,18 @@ outnet_add_tcp_waiting(struct outside_network* outnet, struct waiting_tcp* w)
else outnet->tcp_wait_first = w;
outnet->tcp_wait_last = w;
w->on_tcp_waiting_list = 1;
+ if(set_timer) {
#ifndef S_SPLINT_S
- tv.tv_sec = w->timeout/1000;
- tv.tv_usec = (w->timeout%1000)*1000;
+ tv.tv_sec = w->timeout/1000;
+ tv.tv_usec = (w->timeout%1000)*1000;
#endif
- comm_timer_set(w->timer, &tv);
+ comm_timer_set(w->timer, &tv);
+ }
}
/** add waiting_tcp element as first to the outnet tcp waiting list */
-static void
-outnet_add_tcp_waiting_first(struct outside_network* outnet,
+void
+outnet_waiting_tcp_list_add_first(struct outside_network* outnet,
struct waiting_tcp* w, int reset_timer)
{
struct timeval tv;
@@ -869,6 +900,17 @@ outnet_add_tcp_waiting_first(struct outside_network* outnet,
(outnet->tcp_reuse_first && outnet->tcp_reuse_last));
}
+/** call callback on waiting_tcp, if not NULL */
+static void
+waiting_tcp_callback(struct waiting_tcp* w, struct comm_point* c, int error,
+ struct comm_reply* reply_info)
+{
+ if(w && w->cb) {
+ fptr_ok(fptr_whitelist_pending_tcp(w->cb));
+ (void)(*w->cb)(c, w->cb_arg, error, reply_info);
+ }
+}
+
/** see if buffers can be used to service TCP queries */
static void
use_free_buffer(struct outside_network* outnet)
@@ -879,15 +921,10 @@ use_free_buffer(struct outside_network* outnet)
struct pending_tcp* pend_tcp = NULL;
#endif
struct reuse_tcp* reuse = NULL;
- w = outnet->tcp_wait_first;
- log_assert(w->on_tcp_waiting_list);
- outnet->tcp_wait_first = w->next_waiting;
- if(outnet->tcp_wait_last == w)
- outnet->tcp_wait_last = NULL;
+ w = outnet_waiting_tcp_list_pop(outnet);
log_assert(
(!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) ||
(outnet->tcp_reuse_first && outnet->tcp_reuse_last));
- w->on_tcp_waiting_list = 0;
reuse = reuse_tcp_find(outnet, &w->addr, w->addrlen,
w->ssl_upstream);
/* re-select an ID when moving to a new TCP buffer */
@@ -934,7 +971,7 @@ use_free_buffer(struct outside_network* outnet)
#endif
} else {
/* no reuse and no free buffer, put back at the start */
- outnet_add_tcp_waiting_first(outnet, w, 0);
+ outnet_waiting_tcp_list_add_first(outnet, w, 0);
break;
}
#ifdef USE_DNSTAP
@@ -1008,7 +1045,7 @@ reuse_move_writewait_away(struct outside_network* outnet,
* fail the query */
w->error_count ++;
reuse_tree_by_id_delete(&pend->reuse, w);
- outnet_add_tcp_waiting(outnet, w);
+ outnet_waiting_tcp_list_add(outnet, w, 1);
}
while((w = reuse_write_wait_pop(&pend->reuse)) != NULL) {
if(verbosity >= VERB_CLIENT && w->pkt_len > 12+2+2 &&
@@ -1019,7 +1056,7 @@ reuse_move_writewait_away(struct outside_network* outnet,
verbose(VERB_CLIENT, "reuse_move_writewait_away item %s", buf);
}
reuse_tree_by_id_delete(&pend->reuse, w);
- outnet_add_tcp_waiting(outnet, w);
+ outnet_waiting_tcp_list_add(outnet, w, 1);
}
}
@@ -1417,11 +1454,11 @@ outnet_udp_cb(struct comm_point* c, void* arg, int error,
/* setup lookup key */
key.id = (unsigned)LDNS_ID_WIRE(sldns_buffer_begin(c->buffer));
- memcpy(&key.addr, &reply_info->addr, reply_info->addrlen);
- key.addrlen = reply_info->addrlen;
+ memcpy(&key.addr, &reply_info->remote_addr, reply_info->remote_addrlen);
+ key.addrlen = reply_info->remote_addrlen;
verbose(VERB_ALGO, "Incoming reply id = %4.4x", key.id);
log_addr(VERB_ALGO, "Incoming reply addr =",
- &reply_info->addr, reply_info->addrlen);
+ &reply_info->remote_addr, reply_info->remote_addrlen);
/* find it, see if this thing is a valid query response */
verbose(VERB_ALGO, "lookup size is %d entries", (int)outnet->pending->count);
@@ -1690,7 +1727,7 @@ outside_network_create(struct comm_base *base, size_t bufsize,
return NULL;
}
pc->cp = comm_point_create_udp(outnet->base, -1,
- outnet->udp_buff, outnet_udp_cb, outnet, NULL);
+ outnet->udp_buff, 0, outnet_udp_cb, outnet, NULL);
if(!pc->cp) {
log_err("malloc failed");
free(pc);
@@ -2237,7 +2274,7 @@ outnet_tcptimer(void* arg)
verbose(VERB_CLIENT, "outnet_tcptimer");
if(w->on_tcp_waiting_list) {
/* it is on the waiting list */
- waiting_list_remove(outnet, w);
+ outnet_waiting_tcp_list_remove(outnet, w);
waiting_tcp_callback(w, NULL, NETEVENT_TIMEOUT, NULL);
waiting_tcp_delete(w);
} else {
@@ -2464,7 +2501,7 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet,
#ifdef USE_DNSTAP
w->sq = sq;
#endif
- outnet_add_tcp_waiting(sq->outnet, w);
+ outnet_waiting_tcp_list_add(sq->outnet, w, 1);
}
return w;
}
@@ -2545,8 +2582,10 @@ serviced_create(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
#ifdef UNBOUND_DEBUG
rbnode_type* ins;
#endif
- if(!sq)
+ if(!sq) {
+ alloc_reg_release(alloc, region);
return NULL;
+ }
sq->node.key = sq;
sq->alloc = alloc;
sq->region = region;
@@ -2610,30 +2649,6 @@ serviced_create(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
return sq;
}
-/** remove waiting tcp from the outnet waiting list */
-static void
-waiting_list_remove(struct outside_network* outnet, struct waiting_tcp* w)
-{
- struct waiting_tcp* p = outnet->tcp_wait_first, *prev = NULL;
- w->on_tcp_waiting_list = 0;
- while(p) {
- if(p == w) {
- /* remove w */
- if(prev)
- prev->next_waiting = w->next_waiting;
- else outnet->tcp_wait_first = w->next_waiting;
- if(outnet->tcp_wait_last == w)
- outnet->tcp_wait_last = prev;
- return;
- }
- prev = p;
- p = p->next_waiting;
- }
- /* waiting_list_remove is currently called only with items that are
- * already in the waiting list. */
- log_assert(0);
-}
-
/** reuse tcp stream, remove serviced query from stream,
* return true if the stream is kept, false if it is to be closed */
static int
@@ -2728,7 +2743,7 @@ serviced_delete(struct serviced_query* sq)
sq->pending = NULL;
} else {
verbose(VERB_CLIENT, "serviced_delete: tcpwait");
- waiting_list_remove(sq->outnet, w);
+ outnet_waiting_tcp_list_remove(sq->outnet, w);
if(!w->in_cb_and_decommission)
waiting_tcp_delete(w);
}
@@ -3101,8 +3116,8 @@ serviced_tcp_callback(struct comm_point* c, void* arg, int error,
rep = &r2;
r2.c = c;
}
- memcpy(&rep->addr, &sq->addr, sq->addrlen);
- rep->addrlen = sq->addrlen;
+ memcpy(&rep->remote_addr, &sq->addr, sq->addrlen);
+ rep->remote_addrlen = sq->addrlen;
serviced_callbacks(sq, error, c, rep);
return 0;
}
@@ -3432,7 +3447,6 @@ outnet_serviced_query(struct outside_network* outnet,
infra_ratelimit_dec(env->infra_cache,
zone, zonelen, timenow);
}
- alloc_reg_release(env->alloc, region);
return NULL;
}
if(!(cb = (struct service_callback*)regional_alloc(
@@ -3581,7 +3595,7 @@ outnet_comm_point_for_udp(struct outside_network* outnet,
if(fd == -1) {
return NULL;
}
- cp = comm_point_create_udp(outnet->base, fd, outnet->udp_buff,
+ cp = comm_point_create_udp(outnet->base, fd, outnet->udp_buff, 0,
cb, cb_arg, NULL);
if(!cp) {
log_err("malloc failure");
@@ -3669,8 +3683,8 @@ outnet_comm_point_for_tcp(struct outside_network* outnet,
close(fd);
return 0;
}
- cp->repinfo.addrlen = to_addrlen;
- memcpy(&cp->repinfo.addr, to_addr, to_addrlen);
+ cp->repinfo.remote_addrlen = to_addrlen;
+ memcpy(&cp->repinfo.remote_addr, to_addr, to_addrlen);
/* setup for SSL (if needed) */
if(ssl) {
@@ -3745,8 +3759,8 @@ outnet_comm_point_for_http(struct outside_network* outnet,
close(fd);
return 0;
}
- cp->repinfo.addrlen = to_addrlen;
- memcpy(&cp->repinfo.addr, to_addr, to_addrlen);
+ cp->repinfo.remote_addrlen = to_addrlen;
+ memcpy(&cp->repinfo.remote_addr, to_addr, to_addrlen);
/* setup for SSL (if needed) */
if(ssl) {
diff --git a/services/outside_network.h b/services/outside_network.h
index c383b8f09e24..467c81f60ca2 100644
--- a/services/outside_network.h
+++ b/services/outside_network.h
@@ -718,6 +718,30 @@ struct reuse_tcp* reuse_tcp_lru_snip(struct outside_network* outnet);
/** delete readwait waiting_tcp elements, deletes the elements in the list */
void reuse_del_readwait(rbtree_type* tree_by_id);
+/** remove waiting tcp from the outnet waiting list */
+void outnet_waiting_tcp_list_remove(struct outside_network* outnet,
+ struct waiting_tcp* w);
+
+/** pop the first waiting tcp from the outnet waiting list */
+struct waiting_tcp* outnet_waiting_tcp_list_pop(struct outside_network* outnet);
+
+/** add waiting_tcp element to the outnet tcp waiting list */
+void outnet_waiting_tcp_list_add(struct outside_network* outnet,
+ struct waiting_tcp* w, int set_timer);
+
+/** add waiting_tcp element as first to the outnet tcp waiting list */
+void outnet_waiting_tcp_list_add_first(struct outside_network* outnet,
+ struct waiting_tcp* w, int reset_timer);
+
+/** pop the first element from the writewait list */
+struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse);
+
+/** remove the element from the writewait list */
+void reuse_write_wait_remove(struct reuse_tcp* reuse, struct waiting_tcp* w);
+
+/** push the element after the last on the writewait list */
+void reuse_write_wait_push_back(struct reuse_tcp* reuse, struct waiting_tcp* w);
+
/** get TCP file descriptor for address, returns -1 on failure,
* tcp_mss is 0 or maxseg size to set for TCP packets. */
int outnet_get_tcp_fd(struct sockaddr_storage* addr, socklen_t addrlen,
diff --git a/services/rpz.c b/services/rpz.c
index 77b6266fecb9..e876f3f94834 100644
--- a/services/rpz.c
+++ b/services/rpz.c
@@ -1392,11 +1392,13 @@ log_rpz_apply(char* trigger, uint8_t* dname, struct addr_tree_node* addrnode,
dnamestr[0]=0;
}
if(repinfo) {
- addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip));
- port = ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port);
+ addr_to_str(&repinfo->client_addr, repinfo->client_addrlen, ip, sizeof(ip));
+ port = ntohs(((struct sockaddr_in*)&repinfo->client_addr)->sin_port);
} else if(ms && ms->mesh_info && ms->mesh_info->reply_list) {
- addr_to_str(&ms->mesh_info->reply_list->query_reply.addr, ms->mesh_info->reply_list->query_reply.addrlen, ip, sizeof(ip));
- port = ntohs(((struct sockaddr_in*)&ms->mesh_info->reply_list->query_reply.addr)->sin_port);
+ addr_to_str(&ms->mesh_info->reply_list->query_reply.client_addr,
+ ms->mesh_info->reply_list->query_reply.client_addrlen,
+ ip, sizeof(ip));
+ port = ntohs(((struct sockaddr_in*)&ms->mesh_info->reply_list->query_reply.client_addr)->sin_port);
} else {
ip[0]=0;
port = 0;
@@ -1468,7 +1470,9 @@ rpz_resolve_client_action_and_zone(struct auth_zones* az, struct query_info* qin
}
z = rpz_find_zone(r->local_zones, qinfo->qname, qinfo->qname_len,
qinfo->qclass, 0, 0, 0);
- node = rpz_ipbased_trigger_lookup(r->client_set, &repinfo->addr, repinfo->addrlen, "clientip");
+ node = rpz_ipbased_trigger_lookup(r->client_set,
+ &repinfo->client_addr, repinfo->client_addrlen,
+ "clientip");
if((z || node) && r->action_override == RPZ_DISABLED_ACTION) {
if(r->log)
log_rpz_apply((node?"clientip":"qname"),
@@ -2164,18 +2168,16 @@ rpz_callback_from_iterator_module(struct module_qstate* ms, struct iter_qstate*
lock_rw_unlock(&az->rpz_lock);
- if(raddr == NULL && z == NULL) { return NULL; }
- else if(raddr != NULL) {
+ if(raddr == NULL && z == NULL)
+ return NULL;
+
+ if(raddr != NULL) {
if(z) {
lock_rw_unlock(&z->lock);
}
return rpz_apply_nsip_trigger(ms, r, raddr, a);
- } else if(z != NULL) {
- if(raddr) {
- lock_rw_unlock(&raddr->lock);
- }
- return rpz_apply_nsdname_trigger(ms, r, z, &match, a);
- } else { return NULL; }
+ }
+ return rpz_apply_nsdname_trigger(ms, r, z, &match, a);
}
struct dns_msg* rpz_callback_from_iterator_cname(struct module_qstate* ms,
diff --git a/services/view.c b/services/view.c
index db48ae9545f8..72f3643184ee 100644
--- a/services/view.c
+++ b/services/view.c
@@ -66,8 +66,9 @@ views_create(void)
return v;
}
-/** This prototype is defined in in respip.h, but we want to avoid
- * unnecessary dependencies */
+/* \noop (ignore this comment for doxygen)
+ * This prototype is defined in in respip.h, but we want to avoid
+ * unnecessary dependencies */
void respip_set_delete(struct respip_set *set);
void
diff --git a/smallapp/unbound-checkconf.c b/smallapp/unbound-checkconf.c
index c25182bd20ff..f850469bab1b 100644
--- a/smallapp/unbound-checkconf.c
+++ b/smallapp/unbound-checkconf.c
@@ -316,7 +316,7 @@ warn_hosts(const char* typ, struct config_stub* list)
struct config_strlist* h;
for(s=list; s; s=s->next) {
for(h=s->hosts; h; h=h->next) {
- if(extstrtoaddr(h->str, &a, &alen)) {
+ if(extstrtoaddr(h->str, &a, &alen, UNBOUND_DNS_PORT)) {
fprintf(stderr, "unbound-checkconf: warning:"
" %s %s: \"%s\" is an IP%s address, "
"and when looked up as a host name "
@@ -338,6 +338,8 @@ interfacechecks(struct config_file* cfg)
int i, j, i2, j2;
char*** resif = NULL;
int* num_resif = NULL;
+ char portbuf[32];
+ snprintf(portbuf, sizeof(portbuf), "%d", cfg->port);
if(cfg->num_ifs != 0) {
resif = (char***)calloc(cfg->num_ifs, sizeof(char**));
@@ -359,9 +361,21 @@ interfacechecks(struct config_file* cfg)
fatal_exit("could not resolve interface names, for %s",
cfg->ifs[i]);
}
+ /* check for port combinations that are not supported */
+ if(if_is_pp2(resif[i][0], portbuf, cfg->proxy_protocol_port)) {
+ if(if_is_dnscrypt(resif[i][0], portbuf,
+ cfg->dnscrypt_port)) {
+ fatal_exit("PROXYv2 and DNSCrypt combination not "
+ "supported!");
+ } else if(if_is_https(resif[i][0], portbuf,
+ cfg->https_port)) {
+ fatal_exit("PROXYv2 and DoH combination not "
+ "supported!");
+ }
+ }
/* search for duplicates in the returned addresses */
for(j=0; j<num_resif[i]; j++) {
- if(!extstrtoaddr(resif[i][j], &a, &alen)) {
+ if(!extstrtoaddr(resif[i][j], &a, &alen, cfg->port)) {
if(strcmp(cfg->ifs[i], resif[i][j]) != 0)
fatal_exit("cannot parse interface address '%s' from the interface specified as '%s'",
resif[i][j], cfg->ifs[i]);
diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c
index d473702c441e..34fb801bb8b3 100644
--- a/smallapp/unbound-control.c
+++ b/smallapp/unbound-control.c
@@ -601,7 +601,7 @@ contact_server(const char* svr, struct config_file* cfg, int statuscmd)
struct sockaddr_storage addr2;
socklen_t addrlen2;
if(extstrtoaddr(cfg->control_ifs.first->str, &addr2,
- &addrlen2)) {
+ &addrlen2, UNBOUND_DNS_PORT)) {
svr = cfg->control_ifs.first->str;
} else {
if(!resolve_interface_names(NULL, 0,
@@ -629,7 +629,7 @@ contact_server(const char* svr, struct config_file* cfg, int statuscmd)
svr = "::1";
}
if(strchr(svr, '@')) {
- if(!extstrtoaddr(svr, &addr, &addrlen))
+ if(!extstrtoaddr(svr, &addr, &addrlen, UNBOUND_DNS_PORT))
fatal_exit("could not parse IP@port: %s", svr);
#ifdef HAVE_SYS_UN_H
} else if(svr[0] == '/') {
diff --git a/testcode/delayer.c b/testcode/delayer.c
index e915961f5ae7..647a4e24c469 100644
--- a/testcode/delayer.c
+++ b/testcode/delayer.c
@@ -974,7 +974,7 @@ service(const char* bind_str, int bindport, const char* serv_str,
dl_tv_add(&reuse, &delay);
if(reuse.tv_sec == 0)
reuse.tv_sec = 1;
- if(!extstrtoaddr(serv_str, &srv_addr, &srv_len)) {
+ if(!extstrtoaddr(serv_str, &srv_addr, &srv_len, UNBOUND_DNS_PORT)) {
printf("cannot parse forward address: %s\n", serv_str);
exit(1);
}
diff --git a/testcode/do-tests.sh b/testcode/do-tests.sh
index 2a1cfc4c96e8..6599f9f66594 100755
--- a/testcode/do-tests.sh
+++ b/testcode/do-tests.sh
@@ -16,6 +16,7 @@ NEED_WHOAMI='07-confroot.tdir'
NEED_IPV6='fwd_ancil.tdir fwd_tcp_tc6.tdir stub_udp6.tdir edns_cache.tdir'
NEED_NOMINGW='tcp_sigpipe.tdir 07-confroot.tdir 08-host-lib.tdir fwd_ancil.tdir'
NEED_DNSCRYPT_PROXY='dnscrypt_queries.tdir dnscrypt_queries_chacha.tdir'
+NEED_UNSHARE='acl_interface.tdir proxy_protocol.tdir'
# test if dig and ldns-testns are available.
test_tool_avail "dig"
@@ -50,6 +51,7 @@ for test in `ls -d *.tdir`; do
skip_if_in_list $test "$NEED_NC" "nc"
skip_if_in_list $test "$NEED_WHOAMI" "whoami"
skip_if_in_list $test "$NEED_DNSCRYPT_PROXY" "dnscrypt-proxy"
+ skip_if_in_list $test "$NEED_UNSHARE" "unshare"
if echo $NEED_IPV6 | grep $test >/dev/null; then
if test "$HAVE_IPV6" = no; then
diff --git a/testcode/fake_event.c b/testcode/fake_event.c
index be06a4721c21..efb22a6fb634 100644
--- a/testcode/fake_event.c
+++ b/testcode/fake_event.c
@@ -384,8 +384,8 @@ answer_callback_from_entry(struct replay_runtime* runtime,
fill_buffer_with_reply(c.buffer, entry, pend->pkt, pend->pkt_len,
pend->tcp_pkt_counter);
repinfo.c = &c;
- repinfo.addrlen = pend->addrlen;
- memcpy(&repinfo.addr, &pend->addr, pend->addrlen);
+ repinfo.remote_addrlen = pend->addrlen;
+ memcpy(&repinfo.remote_addr, &pend->addr, pend->addrlen);
if(!pend->serviced) {
if(entry && entry->reply_list->next &&
pend->tcp_pkt_counter < count_reply_packets(entry)) {
@@ -415,7 +415,7 @@ answer_check_it(struct replay_runtime* runtime)
tr = transport_udp;
if((runtime->now->addrlen == 0 || sockaddr_cmp(
&runtime->now->addr, runtime->now->addrlen,
- &ans->repinfo.addr, ans->repinfo.addrlen) == 0) &&
+ &ans->repinfo.remote_addr, ans->repinfo.remote_addrlen) == 0) &&
find_match(runtime->now->match, ans->pkt,
ans->pkt_len, tr)) {
log_info("testbound matched event entry from line %d",
@@ -453,10 +453,12 @@ fake_front_query(struct replay_runtime* runtime, struct replay_moment *todo)
repinfo.c = (struct comm_point*)calloc(1, sizeof(struct comm_point));
if(!repinfo.c)
fatal_exit("out of memory in fake_front_query");
- repinfo.addrlen = (socklen_t)sizeof(struct sockaddr_in);
+ repinfo.remote_addrlen = (socklen_t)sizeof(struct sockaddr_in);
if(todo->addrlen != 0) {
- repinfo.addrlen = todo->addrlen;
- memcpy(&repinfo.addr, &todo->addr, todo->addrlen);
+ repinfo.remote_addrlen = todo->addrlen;
+ memcpy(&repinfo.remote_addr, &todo->addr, todo->addrlen);
+ repinfo.client_addrlen = todo->addrlen;
+ memcpy(&repinfo.client_addr, &todo->addr, todo->addrlen);
}
repinfo.c->fd = -1;
repinfo.c->ev = (struct internal_event*)runtime;
@@ -510,8 +512,8 @@ fake_pending_callback(struct replay_runtime* runtime,
p->pkt_len, p->tcp_pkt_counter);
}
repinfo.c = &c;
- repinfo.addrlen = p->addrlen;
- memcpy(&repinfo.addr, &p->addr, p->addrlen);
+ repinfo.remote_addrlen = p->addrlen;
+ memcpy(&repinfo.remote_addr, &p->addr, p->addrlen);
if(!p->serviced) {
if(todo->match && todo->match->reply_list->next && !error &&
p->tcp_pkt_counter < count_reply_packets(todo->match)) {
@@ -1344,7 +1346,7 @@ struct listen_port* listening_ports_open(struct config_file* ATTR_UNUSED(cfg),
char** ATTR_UNUSED(ifs), int ATTR_UNUSED(num_ifs),
int* ATTR_UNUSED(reuseport))
{
- return calloc(1, 1);
+ return calloc(1, sizeof(struct listen_port));
}
void listening_ports_free(struct listen_port* list)
@@ -1663,6 +1665,7 @@ int create_udp_sock(int ATTR_UNUSED(family), int ATTR_UNUSED(socktype),
struct comm_point* comm_point_create_udp(struct comm_base *ATTR_UNUSED(base),
int ATTR_UNUSED(fd), sldns_buffer* ATTR_UNUSED(buffer),
+ int ATTR_UNUSED(pp2_enabled),
comm_point_callback_type* ATTR_UNUSED(callback),
void* ATTR_UNUSED(callback_arg),
struct unbound_socket* ATTR_UNUSED(socket))
diff --git a/testcode/mini_tdir.sh b/testcode/mini_tdir.sh
index 6bbece8d9368..624ecdf7fe5b 100755
--- a/testcode/mini_tdir.sh
+++ b/testcode/mini_tdir.sh
@@ -8,6 +8,7 @@ fi
# This will keep the temporary directory around and return 1 when the test failed.
DEBUG=0
+test -n "$DEBUG_TDIR" && DEBUG=1
quiet=0
if test "$1" = "-q"; then
@@ -17,9 +18,9 @@ fi
if test "$1" = "clean"; then
if test $quiet = 0; then
- echo "rm -f result.* .done* .tdir.var.master .tdir.var.test"
+ echo "rm -f result.* .done* .skip* .tdir.var.master .tdir.var.test"
fi
- rm -f result.* .done* .tdir.var.master .tdir.var.test
+ rm -f result.* .done* .skip* .tdir.var.master .tdir.var.test
exit 0
fi
if test "$1" = "fake"; then
@@ -54,12 +55,15 @@ if test "$1" = "-f" && test "$2" = "report"; then
echo "** PASSED ** $timelen $name: $desc"
pass=`expr $pass + 1`
fi
+ elif test -f ".skip-$name"; then
+ echo ".. SKIPPED.. $timelen $name: $desc"
+ skip=`expr $skip + 1`
else
if test -f "result.$name"; then
echo "!! FAILED !! $timelen $name: $desc"
fail=`expr $fail + 1`
else
- echo ".> SKIPPED<< $timelen $name: $desc"
+ echo ".. SKIPPED.. $timelen $name: $desc"
skip=`expr $skip + 1`
fi
fi
@@ -81,11 +85,17 @@ if test "$1" = "report" || test "$2" = "report"; then
if test $quiet = 0; then
echo "** PASSED ** : $name"
fi
+ elif test -f ".skip-$name"; then
+ if test $quiet = 0; then
+ echo ".. SKIPPED.. : $name"
+ fi
else
if test -f "result.$name"; then
echo "!! FAILED !! : $name"
else
- echo ">> SKIPPED<< : $name"
+ if test $quiet = 0; then
+ echo ".. SKIPPED.. : $name"
+ fi
fi
fi
done
@@ -116,6 +126,7 @@ name=`basename $1 .tdir`
dir=$name.$$
result=result.$name
done=.done-$name
+skip=.skip-$name
success="no"
if test -x "`which bash`"; then
shell="bash"
@@ -124,8 +135,8 @@ else
fi
# check already done
-if test -f .done-$name; then
- echo "minitdir .done-$name exists. skip test."
+if test -f $done; then
+ echo "minitdir $done exists. skip test."
exit 0
fi
@@ -151,11 +162,16 @@ if test -f $name.pre; then
fi
echo "minitdir exe $name.pre" >> $result
$shell $name.pre $args >> $result
- if test $? -ne 0; then
+ exit_value=$?
+ if test $exit_value -eq 3; then
+ echo "$name: SKIPPED" >> $result
+ echo "$name: SKIPPED" > ../$skip
+ echo "$name: SKIPPED"
+ elif test $exit_value -ne 0; then
echo "Warning: $name.pre did not exit successfully"
fi
fi
-if test -f $name.test; then
+if test -f $name.test -a ! -f ../$skip; then
if test $quiet = 0; then
echo "minitdir exe $name.test"
fi
@@ -167,14 +183,14 @@ if test -f $name.test; then
success="no"
else
echo "$name: PASSED" >> $result
- echo "$name: PASSED" > ../.done-$name
+ echo "$name: PASSED" > ../$done
if test $quiet = 0; then
echo "$name: PASSED"
fi
success="yes"
fi
fi
-if test -f $name.post; then
+if test -f $name.post -a ! -f ../$skip; then
if test $quiet = 0; then
echo "minitdir exe $name.post"
fi
@@ -198,7 +214,7 @@ if test $DEBUG -eq 0; then
rm -rf $dir
fi
else
- if test $success == "no"; then
+ if test $success = "no"; then
exit 1
fi
exit 0
diff --git a/testcode/mini_tpkg.sh b/testcode/mini_tpkg.sh
deleted file mode 100755
index ebf27a7d48a1..000000000000
--- a/testcode/mini_tpkg.sh
+++ /dev/null
@@ -1,128 +0,0 @@
-# tpkg that only exes the files.
-args="../.."
-if test "$1" = "-a"; then
- args=$2
- shift
- shift
-fi
-
-if test "$1" = "clean"; then
- echo "rm -f result.* .done* .tpkg.var.master .tpkg.var.test"
- rm -f result.* .done* .tpkg.var.master .tpkg.var.test
- exit 0
-fi
-if test "$1" = "fake"; then
- echo "minitpkg fake $2"
- echo "fake" > .done-`basename $2 .tpkg`
- exit 0
-fi
-if test "$1" = "report" || test "$2" = "report"; then
- echo "Minitpkg Report"
- for result in *.tpkg; do
- name=`basename $result .tpkg`
- if test -f ".done-$name"; then
- if test "$1" != "-q"; then
- echo "** PASSED ** : $name"
- fi
- else
- if test -f "result.$name"; then
- echo "!! FAILED !! : $name"
- else
- echo ">> SKIPPED<< : $name"
- fi
- fi
- done
- exit 0
-fi
-
-if test "$1" != 'exe'; then
- # usage
- echo "mini tpkg. Reduced functionality for old shells."
- echo " tpkg exe <file>"
- echo " tpkg fake <file>"
- echo " tpkg clean"
- echo " tpkg [-q] report"
- exit 1
-fi
-shift
-
-# do not execute if the disk is too full
-#DISKLIMIT=100000
-# This check is not portable (to Solaris 10).
-#avail=`df . | tail -1 | awk '{print $4}'`
-#if test "$avail" -lt "$DISKLIMIT"; then
- #echo "minitpkg: The disk is too full! Only $avail."
- #exit 1
-#fi
-
-name=`basename $1 .tpkg`
-dir=$name.$$
-result=result.$name
-done=.done-$name
-success="no"
-if test -x "`which bash`"; then
- shell="bash"
-else
- shell="sh"
-fi
-
-# check already done
-if test -f .done-$name; then
- echo "minitpkg .done-$name exists. skip test."
- exit 0
-fi
-
-# Extract
-echo "minitpkg extract $1 to $dir"
-mkdir $dir
-gzip -cd $name.tpkg | (cd $dir; tar xf -)
-cd $dir
-mv $name.dir/* .
-
-# EXE
-echo "minitpkg exe $name" > $result
-grep "Description:" $name.dsc >> $result 2>&1
-echo "DateRunStart: "`date "+%s" 2>/dev/null` >> $result
-if test -f $name.pre; then
- echo "minitpkg exe $name.pre"
- echo "minitpkg exe $name.pre" >> $result
- $shell $name.pre $args >> $result
- if test $? -ne 0; then
- echo "Warning: $name.pre did not exit successfully"
- fi
-fi
-if test -f $name.test; then
- echo "minitpkg exe $name.test"
- echo "minitpkg exe $name.test" >> $result
- $shell $name.test $args >>$result 2>&1
- if test $? -ne 0; then
- echo "$name: FAILED" >> $result
- echo "$name: FAILED"
- success="no"
- else
- echo "$name: PASSED" >> $result
- echo "$name: PASSED" > ../.done-$name
- echo "$name: PASSED"
- success="yes"
- fi
-fi
-if test -f $name.post; then
- echo "minitpkg exe $name.post"
- echo "minitpkg exe $name.post" >> $result
- $shell $name.post $args >> $result
- if test $? -ne 0; then
- echo "Warning: $name.post did not exit successfully"
- fi
-fi
-echo "DateRunEnd: "`date "+%s" 2>/dev/null` >> $result
-
-mv $result ..
-cd ..
-rm -rf $dir
-# compat for windows where deletion may not succeed initially (files locked
-# by processes that still have to exit).
-if test $? -eq 1; then
- echo "minitpkg waiting for processes to terminate"
- sleep 2 # some time to exit, and try again
- rm -rf $dir
-fi
diff --git a/testcode/perf.c b/testcode/perf.c
index 55d6483c7cf9..7fb524e22d94 100644
--- a/testcode/perf.c
+++ b/testcode/perf.c
@@ -618,7 +618,7 @@ int main(int argc, char* argv[])
printf("error: pass server IP address on commandline.\n");
usage(nm);
}
- if(!extstrtoaddr(argv[0], &info.dest, &info.destlen)) {
+ if(!extstrtoaddr(argv[0], &info.dest, &info.destlen, UNBOUND_DNS_PORT)) {
printf("Could not parse ip: %s\n", argv[0]);
exit(1);
}
diff --git a/testcode/replay.c b/testcode/replay.c
index 2487c146f7a8..43101d6acec6 100644
--- a/testcode/replay.c
+++ b/testcode/replay.c
@@ -179,7 +179,8 @@ replay_range_read(char* remain, FILE* in, const char* name,
while(isspace((unsigned char)*parse))
parse++;
strip_end_white(parse);
- if(!extstrtoaddr(parse, &rng->addr, &rng->addrlen)) {
+ if(!extstrtoaddr(parse, &rng->addr, &rng->addrlen,
+ UNBOUND_DNS_PORT)) {
log_err("Line %d: could not read ADDRESS: %s",
pstate->lineno, parse);
free(rng);
@@ -287,7 +288,8 @@ replay_moment_read(char* remain, FILE* in, const char* name,
} else if(parse_keyword(&remain, "QUERY")) {
mom->evt_type = repevt_front_query;
readentry = 1;
- if(!extstrtoaddr("127.0.0.1", &mom->addr, &mom->addrlen))
+ if(!extstrtoaddr("127.0.0.1", &mom->addr, &mom->addrlen,
+ UNBOUND_DNS_PORT))
fatal_exit("internal error");
} else if(parse_keyword(&remain, "CHECK_ANSWER")) {
mom->evt_type = repevt_front_reply;
@@ -354,7 +356,7 @@ replay_moment_read(char* remain, FILE* in, const char* name,
m++;
while(isspace((unsigned char)*m))
m++;
- if(!extstrtoaddr(s, &mom->addr, &mom->addrlen))
+ if(!extstrtoaddr(s, &mom->addr, &mom->addrlen, UNBOUND_DNS_PORT))
fatal_exit("bad infra_rtt address %s", s);
strip_end_white(m);
mom->variable = strdup(remain);
@@ -372,7 +374,8 @@ replay_moment_read(char* remain, FILE* in, const char* name,
while(isspace((unsigned char)*remain))
remain++;
strip_end_white(remain);
- if(!extstrtoaddr(remain, &mom->addr, &mom->addrlen)) {
+ if(!extstrtoaddr(remain, &mom->addr, &mom->addrlen,
+ UNBOUND_DNS_PORT)) {
log_err("line %d: could not parse ADDRESS: %s",
pstate->lineno, remain);
free(mom);
diff --git a/testcode/streamtcp.c b/testcode/streamtcp.c
index ecc83c1cff30..b2c0d5328bb7 100644
--- a/testcode/streamtcp.c
+++ b/testcode/streamtcp.c
@@ -49,6 +49,7 @@
#include "util/locks.h"
#include "util/log.h"
#include "util/net_help.h"
+#include "util/proxy_protocol.h"
#include "util/data/msgencode.h"
#include "util/data/msgparse.h"
#include "util/data/msgreply.h"
@@ -71,6 +72,7 @@ static void usage(char* argv[])
printf("usage: %s [options] name type class ...\n", argv[0]);
printf(" sends the name-type-class queries over TCP.\n");
printf("-f server what ipaddr@portnr to send the queries to\n");
+ printf("-p client what ipaddr@portnr to include in PROXYv2\n");
printf("-u use UDP. No retries are attempted.\n");
printf("-n do not wait for an answer.\n");
printf("-a print answers as they arrive.\n");
@@ -82,18 +84,17 @@ static void usage(char* argv[])
/** open TCP socket to svr */
static int
-open_svr(const char* svr, int udp)
+open_svr(const char* svr, int udp, struct sockaddr_storage* addr,
+ socklen_t* addrlen)
{
- struct sockaddr_storage addr;
- socklen_t addrlen;
int fd = -1;
/* svr can be ip@port */
- memset(&addr, 0, sizeof(addr));
- if(!extstrtoaddr(svr, &addr, &addrlen)) {
+ memset(addr, 0, sizeof(*addr));
+ if(!extstrtoaddr(svr, addr, addrlen, UNBOUND_DNS_PORT)) {
printf("fatal: bad server specs '%s'\n", svr);
exit(1);
}
- fd = socket(addr_is_ip6(&addr, addrlen)?PF_INET6:PF_INET,
+ fd = socket(addr_is_ip6(addr, *addrlen)?PF_INET6:PF_INET,
udp?SOCK_DGRAM:SOCK_STREAM, 0);
if(fd == -1) {
#ifndef USE_WINSOCK
@@ -103,7 +104,7 @@ open_svr(const char* svr, int udp)
#endif
exit(1);
}
- if(connect(fd, (struct sockaddr*)&addr, addrlen) < 0) {
+ if(connect(fd, (struct sockaddr*)addr, *addrlen) < 0) {
#ifndef USE_WINSOCK
perror("connect() error");
#else
@@ -116,11 +117,12 @@ open_svr(const char* svr, int udp)
/** write a query over the TCP fd */
static void
-write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
+write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
+ sldns_buffer* proxy_buf, int pp2_parsed,
const char* strname, const char* strtype, const char* strclass)
{
struct query_info qinfo;
- uint16_t len;
+ size_t proxy_buf_limit = sldns_buffer_limit(proxy_buf);
/* qname */
qinfo.qname = sldns_str2wire_dname(strname, &qinfo.qname_len);
if(!qinfo.qname) {
@@ -152,9 +154,27 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
attach_edns_record(buf, &edns);
}
+ /* we need to send the PROXYv2 information in every UDP message */
+ if(udp && pp2_parsed) {
+ /* append the proxy_buf with the buf's content
+ * and use that for sending */
+ if(sldns_buffer_capacity(proxy_buf) <
+ sldns_buffer_limit(proxy_buf) +
+ sldns_buffer_limit(buf)) {
+ printf("buffer too small for packet + proxy");
+ exit(1);
+ }
+ sldns_buffer_clear(proxy_buf);
+ sldns_buffer_skip(proxy_buf, proxy_buf_limit);
+ sldns_buffer_write(proxy_buf, sldns_buffer_begin(buf),
+ sldns_buffer_limit(buf));
+ sldns_buffer_flip(proxy_buf);
+ buf = proxy_buf;
+ }
+
/* send it */
if(!udp) {
- len = (uint16_t)sldns_buffer_limit(buf);
+ uint16_t len = (uint16_t)sldns_buffer_limit(buf);
len = htons(len);
if(ssl) {
if(SSL_write(ssl, (void*)&len, (int)sizeof(len)) <= 0) {
@@ -167,7 +187,7 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
#ifndef USE_WINSOCK
perror("send() len failed");
#else
- printf("send len: %s\n",
+ printf("send len: %s\n",
wsa_strerror(WSAGetLastError()));
#endif
exit(1);
@@ -182,17 +202,20 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
}
} else {
if(send(fd, (void*)sldns_buffer_begin(buf),
- sldns_buffer_limit(buf), 0) <
+ sldns_buffer_limit(buf), 0) <
(ssize_t)sldns_buffer_limit(buf)) {
#ifndef USE_WINSOCK
perror("send() data failed");
#else
- printf("send data: %s\n", wsa_strerror(WSAGetLastError()));
+ printf("send data: %s\n",
+ wsa_strerror(WSAGetLastError()));
#endif
exit(1);
}
}
+ /* reset the proxy_buf for next packet */
+ sldns_buffer_set_limit(proxy_buf, proxy_buf_limit);
free(qinfo.qname);
}
@@ -224,7 +247,7 @@ recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf)
#ifndef USE_WINSOCK
perror("read() len failed");
#else
- printf("read len: %s\n",
+ printf("read len: %s\n",
wsa_strerror(WSAGetLastError()));
#endif
exit(1);
@@ -243,12 +266,12 @@ recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf)
if(r != (int)len)
fatal_exit("ssl_read %d of %d", r, len);
} else {
- if(recv(fd, (void*)sldns_buffer_begin(buf), len, 0) <
+ if(recv(fd, (void*)sldns_buffer_begin(buf), len, 0) <
(ssize_t)len) {
#ifndef USE_WINSOCK
perror("read() data failed");
#else
- printf("read data: %s\n",
+ printf("read data: %s\n",
wsa_strerror(WSAGetLastError()));
#endif
exit(1);
@@ -257,12 +280,12 @@ recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf)
} else {
ssize_t l;
sldns_buffer_clear(buf);
- if((l=recv(fd, (void*)sldns_buffer_begin(buf),
+ if((l=recv(fd, (void*)sldns_buffer_begin(buf),
sldns_buffer_capacity(buf), 0)) < 0) {
#ifndef USE_WINSOCK
perror("read() data failed");
#else
- printf("read data: %s\n",
+ printf("read data: %s\n",
wsa_strerror(WSAGetLastError()));
#endif
exit(1);
@@ -324,17 +347,40 @@ static int get_random(void)
return (int)arc4random();
}
+/* parse the pp2_client and populate the proxy_buffer
+ * It doesn't populate the destination parts. */
+static int parse_pp2_client(const char* pp2_client, int udp,
+ sldns_buffer* proxy_buf)
+{
+ struct sockaddr_storage pp2_addr;
+ socklen_t pp2_addrlen = 0;
+ memset(&pp2_addr, 0, sizeof(pp2_addr));
+ if(*pp2_client == 0) return 0;
+ if(!extstrtoaddr(pp2_client, &pp2_addr, &pp2_addrlen, UNBOUND_DNS_PORT)) {
+ printf("fatal: bad proxy client specs '%s'\n", pp2_client);
+ exit(1);
+ }
+ sldns_buffer_clear(proxy_buf);
+ pp2_write_to_buf(proxy_buf, &pp2_addr, !udp);
+ sldns_buffer_flip(proxy_buf);
+ return 1;
+}
+
/** send the TCP queries and print answers */
static void
-send_em(const char* svr, int udp, int usessl, int noanswer, int onarrival,
- int delay, int num, char** qs)
+send_em(const char* svr, const char* pp2_client, int udp, int usessl,
+ int noanswer, int onarrival, int delay, int num, char** qs)
{
sldns_buffer* buf = sldns_buffer_new(65553);
- int fd = open_svr(svr, udp);
- int i, wait_results = 0;
+ sldns_buffer* proxy_buf = sldns_buffer_new(65553);
+ struct sockaddr_storage svr_addr;
+ socklen_t svr_addrlen;
+ int fd = open_svr(svr, udp, &svr_addr, &svr_addrlen);
+ int i, wait_results = 0, pp2_parsed;
SSL_CTX* ctx = NULL;
SSL* ssl = NULL;
if(!buf) fatal_exit("out of memory");
+ pp2_parsed = parse_pp2_client(pp2_client, udp, proxy_buf);
if(usessl) {
ctx = connect_sslctx_create(NULL, NULL, NULL, 0);
if(!ctx) fatal_exit("cannot create ssl ctx");
@@ -361,6 +407,28 @@ send_em(const char* svr, int udp, int usessl, int noanswer, int onarrival,
}
}
}
+ /* Send the PROXYv2 information once per stream */
+ if(!udp && pp2_parsed) {
+ if(ssl) {
+ if(SSL_write(ssl, (void*)sldns_buffer_begin(proxy_buf),
+ (int)sldns_buffer_limit(proxy_buf)) <= 0) {
+ log_crypto_err("cannot SSL_write");
+ exit(1);
+ }
+ } else {
+ if(send(fd, (void*)sldns_buffer_begin(proxy_buf),
+ sldns_buffer_limit(proxy_buf), 0) <
+ (ssize_t)sldns_buffer_limit(proxy_buf)) {
+#ifndef USE_WINSOCK
+ perror("send() data failed");
+#else
+ printf("send data: %s\n",
+ wsa_strerror(WSAGetLastError()));
+#endif
+ exit(1);
+ }
+ }
+ }
for(i=0; i<num; i+=3) {
if (delay != 0) {
#ifdef HAVE_SLEEP
@@ -370,8 +438,9 @@ send_em(const char* svr, int udp, int usessl, int noanswer, int onarrival,
#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]);
+ write_q(fd, udp, ssl, buf, (uint16_t)get_random(), proxy_buf,
+ pp2_parsed,
+ qs[i], qs[i+1], qs[i+2]);
/* print at least one result */
if(onarrival) {
wait_results += 1; /* one more answer to fetch */
@@ -390,6 +459,7 @@ send_em(const char* svr, int udp, int usessl, int noanswer, int onarrival,
}
sock_close(fd);
sldns_buffer_free(buf);
+ sldns_buffer_free(proxy_buf);
printf("orderly exit\n");
}
@@ -418,10 +488,11 @@ extern int optind;
extern char* optarg;
/** main program for streamtcp */
-int main(int argc, char** argv)
+int main(int argc, char** argv)
{
int c;
const char* svr = "127.0.0.1";
+ const char* pp2_client = "";
int udp = 0;
int noanswer = 0;
int onarrival = 0;
@@ -451,11 +522,14 @@ int main(int argc, char** argv)
if(argc == 1) {
usage(argv);
}
- while( (c=getopt(argc, argv, "af:hnsud:")) != -1) {
+ while( (c=getopt(argc, argv, "af:p:hnsud:")) != -1) {
switch(c) {
case 'f':
svr = optarg;
break;
+ case 'p':
+ pp2_client = optarg;
+ break;
case 'a':
onarrival = 1;
break;
@@ -508,7 +582,7 @@ int main(int argc, char** argv)
(void)OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS, NULL);
#endif
}
- send_em(svr, udp, usessl, noanswer, onarrival, delay, argc, argv);
+ send_em(svr, pp2_client, udp, usessl, noanswer, onarrival, delay, argc, argv);
checklock_stop();
#ifdef USE_WINSOCK
WSACleanup();
diff --git a/testcode/unitecs.c b/testcode/unitecs.c
index b240bfcc666e..68d6907f81a7 100644
--- a/testcode/unitecs.c
+++ b/testcode/unitecs.c
@@ -173,7 +173,7 @@ static void consistency_test(void)
for (i = 0; i < 1000; i++) {
l = randomkey(&k, 128);
elem = (struct reply_info *) calloc(1, sizeof(struct reply_info));
- addrtree_insert(t, k, l, 64, elem, timenow + 10, timenow);
+ addrtree_insert(t, k, l, 64, elem, timenow + 10, timenow, 0);
/* This should always hold because no items ever expire. They
* could be overwritten, though. */
unit_assert( count <= t->node_count );
@@ -189,7 +189,7 @@ static void consistency_test(void)
for (i = 0; i < 1000; i++) {
l = randomkey(&k, 128);
elem = (struct reply_info *) calloc(1, sizeof(struct reply_info));
- addrtree_insert(t, k, l, 64, elem, i + 10, i);
+ addrtree_insert(t, k, l, 64, elem, i + 10, i, 0);
free(k);
unit_assert( !addrtree_inconsistent(t) );
}
@@ -201,7 +201,7 @@ static void consistency_test(void)
for (i = 0; i < 1000; i++) {
l = randomkey(&k, 128);
elem = (struct reply_info *) calloc(1, sizeof(struct reply_info));
- addrtree_insert(t, k, l, 64, elem, i + 10, i);
+ addrtree_insert(t, k, l, 64, elem, i + 10, i, 0);
unit_assert( t->node_count <= 27);
free(k);
unit_assert( !addrtree_inconsistent(t) );
diff --git a/testcode/unittcpreuse.c b/testcode/unittcpreuse.c
index 087c6c1b9d50..5f45a4b456f1 100644
--- a/testcode/unittcpreuse.c
+++ b/testcode/unittcpreuse.c
@@ -44,6 +44,8 @@
#include "util/random.h"
#include "services/outside_network.h"
+#define MAX_TCP_WAITING_NODES 5
+
/** add number of new IDs to the reuse tree, randomly chosen */
static void tcpid_addmore(struct reuse_tcp* reuse,
struct outside_network* outnet, unsigned int addnum)
@@ -228,9 +230,260 @@ static void tcp_reuse_tree_list_test(void)
free(outnet.tcp_conns);
}
+static void check_waiting_tcp_list(struct outside_network* outnet,
+ struct waiting_tcp* first, struct waiting_tcp* last, size_t total)
+{
+ size_t i, j;
+ struct waiting_tcp* w = outnet->tcp_wait_first;
+ struct waiting_tcp* n = NULL;
+ if(first) unit_assert(outnet->tcp_wait_first == first);
+ if(last) unit_assert(outnet->tcp_wait_last == last && !last->next_waiting);
+ for(i=0; w; i++) {
+ unit_assert(i<total); /* otherwise we are looping */
+ unit_assert(w->on_tcp_waiting_list);
+ n = w->next_waiting;
+ for(j=0; n; j++) {
+ unit_assert(j<total-i-1); /* otherwise we are looping */
+ unit_assert(n != w);
+ n = n->next_waiting;
+ }
+ w = w->next_waiting;
+ }
+}
+
+/** clear the tcp waiting list */
+static void waiting_tcp_list_clear(struct outside_network* outnet)
+{
+ struct waiting_tcp* w = outnet->tcp_wait_first, *n = NULL;
+ if(!w) return;
+ unit_assert(outnet->tcp_wait_first);
+ unit_assert(outnet->tcp_wait_last);
+ while(w) {
+ n = w->next_waiting;
+ w->on_tcp_waiting_list = 0;
+ w->next_waiting = (struct waiting_tcp*)1; /* In purpose faux value */
+ w = n;
+ }
+ outnet->tcp_wait_first = NULL;
+ outnet->tcp_wait_last = NULL;
+}
+
+/** check removal of the waiting_tcp element on the given position of total
+ * elements */
+static void check_waiting_tcp_removal(int is_pop,
+ struct outside_network* outnet, struct waiting_tcp* store,
+ size_t position, size_t total)
+{
+ size_t i;
+ struct waiting_tcp* w;
+ waiting_tcp_list_clear(outnet);
+ for(i=0; i<total; i++) {
+ outnet_waiting_tcp_list_add(outnet, &store[i], 0);
+ }
+ check_waiting_tcp_list(outnet, &store[0], &store[total-1], total);
+
+ if(is_pop) {
+ w = outnet_waiting_tcp_list_pop(outnet);
+ unit_assert(w); /* please clang-analyser */
+ } else {
+ w = outnet->tcp_wait_first;
+ for(i=0; i<position; i++) {
+ unit_assert(w); /* please clang-analyser */
+ w = w->next_waiting;
+ }
+ unit_assert(w); /* please clang-analyser */
+ outnet_waiting_tcp_list_remove(outnet, w);
+ }
+ unit_assert(!(w->on_tcp_waiting_list || w->next_waiting));
+
+ if(position == 0 && total == 1) {
+ /* the list should be empty */
+ check_waiting_tcp_list(outnet, NULL, NULL, total-1);
+ } else if(position == 0) {
+ /* first element should be gone */
+ check_waiting_tcp_list(outnet, &store[1], &store[total-1], total-1);
+ } else if(position == total - 1) {
+ /* last element should be gone */
+ check_waiting_tcp_list(outnet, &store[0], &store[total-2], total-1);
+ } else {
+ /* an element should be gone */
+ check_waiting_tcp_list(outnet, &store[0], &store[total-1], total-1);
+ }
+}
+
+static void waiting_tcp_list_test(void)
+{
+ size_t i = 0;
+ struct outside_network outnet;
+ struct waiting_tcp* w, *t = NULL;
+ struct waiting_tcp store[MAX_TCP_WAITING_NODES];
+ memset(&outnet, 0, sizeof(outnet));
+ memset(&store, 0, sizeof(store));
+
+ /* Check add first on empty list */
+ unit_show_func("services/outside_network.c", "outnet_waiting_tcp_list_add_first");
+ t = &store[i];
+ outnet_waiting_tcp_list_add_first(&outnet, t, 0);
+ check_waiting_tcp_list(&outnet, t, t, 1);
+
+ /* Check add */
+ unit_show_func("services/outside_network.c", "outnet_waiting_tcp_list_add");
+ for(i=1; i<MAX_TCP_WAITING_NODES-1; i++) {
+ w = &store[i];
+ outnet_waiting_tcp_list_add(&outnet, w, 0);
+ }
+ check_waiting_tcp_list(&outnet, t, w, MAX_TCP_WAITING_NODES-1);
+
+ /* Check add first on populated list */
+ unit_show_func("services/outside_network.c", "outnet_waiting_tcp_list_add_first");
+ w = &store[i];
+ t = outnet.tcp_wait_last;
+ outnet_waiting_tcp_list_add_first(&outnet, w, 0);
+ check_waiting_tcp_list(&outnet, w, t, MAX_TCP_WAITING_NODES);
+
+ /* Check removal */
+ unit_show_func("services/outside_network.c", "outnet_waiting_tcp_list_remove");
+ check_waiting_tcp_removal(0, &outnet, store, 2, 5);
+ check_waiting_tcp_removal(0, &outnet, store, 1, 3);
+ check_waiting_tcp_removal(0, &outnet, store, 0, 2);
+ check_waiting_tcp_removal(0, &outnet, store, 1, 2);
+ check_waiting_tcp_removal(0, &outnet, store, 0, 1);
+
+ /* Check pop */
+ unit_show_func("services/outside_network.c", "outnet_waiting_tcp_list_pop");
+ check_waiting_tcp_removal(1, &outnet, store, 0, 3);
+ check_waiting_tcp_removal(1, &outnet, store, 0, 2);
+ check_waiting_tcp_removal(1, &outnet, store, 0, 1);
+}
+
+static void check_reuse_write_wait(struct reuse_tcp* reuse,
+ struct waiting_tcp* first, struct waiting_tcp* last, size_t total)
+{
+ size_t i, j;
+ struct waiting_tcp* w = reuse->write_wait_first;
+ struct waiting_tcp* n = NULL;
+ if(first) unit_assert(reuse->write_wait_first == first && !first->write_wait_prev);
+ if(last) unit_assert(reuse->write_wait_last == last && !last->write_wait_next);
+ /* check one way */
+ for(i=0; w; i++) {
+ unit_assert(i<total); /* otherwise we are looping */
+ unit_assert(w->write_wait_queued);
+ n = w->write_wait_next;
+ for(j=0; n; j++) {
+ unit_assert(j<total-i-1); /* otherwise we are looping */
+ unit_assert(n != w);
+ n = n->write_wait_next;
+ }
+ w = w->write_wait_next;
+ }
+ /* check the other way */
+ w = reuse->write_wait_last;
+ for(i=0; w; i++) {
+ unit_assert(i<total); /* otherwise we are looping */
+ unit_assert(w->write_wait_queued);
+ n = w->write_wait_prev;
+ for(j=0; n; j++) {
+ unit_assert(j<total-i-1); /* otherwise we are looping */
+ unit_assert(n != w);
+ n = n->write_wait_prev;
+ }
+ w = w->write_wait_prev;
+ }
+}
+
+/** clear the tcp waiting list */
+static void reuse_write_wait_clear(struct reuse_tcp* reuse)
+{
+ struct waiting_tcp* w = reuse->write_wait_first, *n = NULL;
+ if(!w) return;
+ unit_assert(reuse->write_wait_first);
+ unit_assert(reuse->write_wait_last);
+ while(w) {
+ n = w->write_wait_next;
+ w->write_wait_queued = 0;
+ w->write_wait_next = (struct waiting_tcp*)1; /* In purpose faux value */
+ w->write_wait_prev = (struct waiting_tcp*)1; /* In purpose faux value */
+ w = n;
+ }
+ reuse->write_wait_first = NULL;
+ reuse->write_wait_last = NULL;
+}
+
+/** check removal of the reuse_write_wait element on the given position of total
+ * elements */
+static void check_reuse_write_wait_removal(int is_pop,
+ struct reuse_tcp* reuse, struct waiting_tcp* store,
+ size_t position, size_t total)
+{
+ size_t i;
+ struct waiting_tcp* w;
+ reuse_write_wait_clear(reuse);
+ for(i=0; i<total; i++) {
+ reuse_write_wait_push_back(reuse, &store[i]);
+ }
+ check_reuse_write_wait(reuse, &store[0], &store[total-1], total);
+
+ if(is_pop) {
+ w = reuse_write_wait_pop(reuse);
+ } else {
+ w = reuse->write_wait_first;
+ for(i=0; i<position; i++) w = w->write_wait_next;
+ reuse_write_wait_remove(reuse, w);
+ }
+ unit_assert(!(w->write_wait_queued || w->write_wait_next || w->write_wait_prev));
+
+ if(position == 0 && total == 1) {
+ /* the list should be empty */
+ check_reuse_write_wait(reuse, NULL, NULL, total-1);
+ } else if(position == 0) {
+ /* first element should be gone */
+ check_reuse_write_wait(reuse, &store[1], &store[total-1], total-1);
+ } else if(position == total - 1) {
+ /* last element should be gone */
+ check_reuse_write_wait(reuse, &store[0], &store[total-2], total-1);
+ } else {
+ /* an element should be gone */
+ check_reuse_write_wait(reuse, &store[0], &store[total-1], total-1);
+ }
+}
+
+static void reuse_write_wait_test(void)
+{
+ size_t i;
+ struct reuse_tcp reuse;
+ struct waiting_tcp store[MAX_TCP_WAITING_NODES];
+ struct waiting_tcp* w;
+ memset(&reuse, 0, sizeof(reuse));
+ memset(&store, 0, sizeof(store));
+
+ /* Check adding */
+ unit_show_func("services/outside_network.c", "reuse_write_wait_push_back");
+ for(i=0; i<MAX_TCP_WAITING_NODES; i++) {
+ w = &store[i];
+ reuse_write_wait_push_back(&reuse, w);
+ }
+ check_reuse_write_wait(&reuse, &store[0], w, MAX_TCP_WAITING_NODES);
+
+ /* Check removal */
+ unit_show_func("services/outside_network.c", "reuse_write_wait_remove");
+ check_reuse_write_wait_removal(0, &reuse, store, 2, 5);
+ check_reuse_write_wait_removal(0, &reuse, store, 1, 3);
+ check_reuse_write_wait_removal(0, &reuse, store, 0, 2);
+ check_reuse_write_wait_removal(0, &reuse, store, 1, 2);
+ check_reuse_write_wait_removal(0, &reuse, store, 0, 1);
+
+ /* Check pop */
+ unit_show_func("services/outside_network.c", "reuse_write_wait_pop");
+ check_reuse_write_wait_removal(1, &reuse, store, 0, 3);
+ check_reuse_write_wait_removal(1, &reuse, store, 0, 2);
+ check_reuse_write_wait_removal(1, &reuse, store, 0, 1);
+}
+
void tcpreuse_test(void)
{
unit_show_feature("tcp_reuse");
tcpid_test();
tcp_reuse_tree_list_test();
+ waiting_tcp_list_test();
+ reuse_write_wait_test();
}
diff --git a/testdata/04-checkconf.tdir/04-checkconf.test b/testdata/04-checkconf.tdir/04-checkconf.test
index a2396fef7608..339e346d9719 100644
--- a/testdata/04-checkconf.tdir/04-checkconf.test
+++ b/testdata/04-checkconf.tdir/04-checkconf.test
@@ -28,6 +28,12 @@ if grep "define UB_ON_WINDOWS 1" ../../config.h; then
else
onwin=0
fi
+# detect dnscrypt
+if grep "define USE_DNSCRYPT 1" ../../config.h; then
+ with_dnscrypt=1
+else
+ with_dnscrypt=0
+fi
# test check of config files.
for f in bad.*; do
@@ -37,6 +43,10 @@ for f in bad.*; do
echo "skipped on windows"
continue
fi
+ if test $f = "bad.proxy-and-dnscrypt" -a $with_dnscrypt -eq 0; then
+ echo "skipped; no DNSCRYPT support"
+ continue
+ fi
$PRE/unbound-checkconf $f
if test $? != 1; then
diff --git a/testdata/04-checkconf.tdir/bad.proxy-and-dnscrypt b/testdata/04-checkconf.tdir/bad.proxy-and-dnscrypt
new file mode 100644
index 000000000000..f62f7868cbf6
--- /dev/null
+++ b/testdata/04-checkconf.tdir/bad.proxy-and-dnscrypt
@@ -0,0 +1,6 @@
+server:
+ interface: 127.0.0.1
+ proxy-protocol-port: 53
+dnscrypt:
+ dnscrypt-enable: yes
+ dnscrypt-port: 53
diff --git a/testdata/04-checkconf.tdir/bad.proxy-and-https b/testdata/04-checkconf.tdir/bad.proxy-and-https
new file mode 100644
index 000000000000..d27373ce0ba3
--- /dev/null
+++ b/testdata/04-checkconf.tdir/bad.proxy-and-https
@@ -0,0 +1,4 @@
+server:
+ interface: 127.0.0.1
+ proxy-protocol-port: 53
+ https-port: 53
diff --git a/testdata/07-confroot.tdir/07-confroot.dsc b/testdata/07-confroot.tdir/07-confroot.dsc
index f1cbe6e7da2e..a25301709825 100644
--- a/testdata/07-confroot.tdir/07-confroot.dsc
+++ b/testdata/07-confroot.tdir/07-confroot.dsc
@@ -8,7 +8,7 @@ Component:
CmdDepends:
Depends:
Help:
-Pre:
+Pre: 07-confroot.pre
Post:
Test: 07-confroot.test
AuxFiles:
diff --git a/testdata/07-confroot.tdir/07-confroot.pre b/testdata/07-confroot.tdir/07-confroot.pre
new file mode 100644
index 000000000000..4f966bddd0e5
--- /dev/null
+++ b/testdata/07-confroot.tdir/07-confroot.pre
@@ -0,0 +1,13 @@
+# #-- 07-confroot.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
+
+PRE="../.."
+
+if uname | grep "MINGW" >/dev/null; then
+ # no chroot, no need to test.
+ # (test fails on / and \ comparisons, by the way).
+ skip_test "no chroot on windows, end test"
+fi
diff --git a/testdata/07-confroot.tdir/07-confroot.test b/testdata/07-confroot.tdir/07-confroot.test
index d940aa873d83..9572330f72b7 100644
--- a/testdata/07-confroot.tdir/07-confroot.test
+++ b/testdata/07-confroot.tdir/07-confroot.test
@@ -6,13 +6,6 @@
PRE="../.."
-if uname | grep "MINGW" >/dev/null; then
- # no chroot, no need to test.
- # (test fails on / en \ comparisons, by the way).
- echo "no chroot on windows, end test"
- exit 0
-fi
-
# create config file
cwd=`pwd -P`
subdir=$cwd/subdir
diff --git a/testdata/08-host-lib.tdir/08-host-lib.pre b/testdata/08-host-lib.tdir/08-host-lib.pre
index 84817891ff93..481b0ef2c2eb 100644
--- a/testdata/08-host-lib.tdir/08-host-lib.pre
+++ b/testdata/08-host-lib.tdir/08-host-lib.pre
@@ -4,7 +4,16 @@
# use .tpkg.var.test for in test variable passing
[ -f .tpkg.var.test ] && source .tpkg.var.test
+PRE="../.."
. ../common.sh
+
+if grep FORK $PRE/config.h | grep "define" >/dev/null 2>&1; then
+ # nothing
+ :
+else
+ skip_test "forking is not available; test skipped."
+fi
+
get_random_port 2
FWD_PORT=$(($RND_PORT + 1))
echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test
diff --git a/testdata/08-host-lib.tdir/08-host-lib.test b/testdata/08-host-lib.tdir/08-host-lib.test
index 8de897776209..18603294e884 100644
--- a/testdata/08-host-lib.tdir/08-host-lib.test
+++ b/testdata/08-host-lib.tdir/08-host-lib.test
@@ -7,14 +7,6 @@
PRE="../.."
. ../common.sh
-if grep FORK $PRE/config.h | grep "define" >/dev/null 2>&1; then
- # nothing
- :
-else
- echo "forking is not available; test skipped."
- exit 0
-fi
-
# test if fwder is up
echo "> dig @127.0.0.1 -p $FWD_PORT www.example.com | tee outfile"
dig @127.0.0.1 -p $FWD_PORT www.example.com | tee outfile
diff --git a/testdata/acl_interface.tdir/acl_interface.conf b/testdata/acl_interface.tdir/acl_interface.conf
new file mode 100644
index 000000000000..157a2d7b76bf
--- /dev/null
+++ b/testdata/acl_interface.tdir/acl_interface.conf
@@ -0,0 +1,140 @@
+server:
+ verbosity: 7
+ use-syslog: no
+ directory: ""
+ pidfile: "unbound.pid"
+ chroot: ""
+ username: ""
+ do-not-query-localhost: no
+ use-caps-for-id: no
+ define-tag: "one two refuse"
+
+# Interface configuration for IPv4
+ interface: @IPV4_ADDR@@@PORT_ALLOW@
+ interface: @IPV4_ADDR@@@PORT_DENY@
+ interface: @IPV4_ADDR@@@PORT_REFUSE@
+ interface: @IPV4_ADDR@@@PORT_TAG_1@
+ interface: @IPV4_ADDR@@@PORT_TAG_2@
+ interface: @IPV4_ADDR@@@PORT_TAG_3@
+ interface: @IPV4_ADDR@@@PORT_VIEW_INT@
+ interface: @IPV4_ADDR@@@PORT_VIEW_EXT@
+ interface: @IPV4_ADDR@@@PORT_VIEW_INTEXT@
+
+ interface-action: @IPV4_ADDR@@@PORT_ALLOW@ allow
+ interface-action: @IPV4_ADDR@@@PORT_DENY@ deny
+ # interface-action: @IPV4_ADDR@@@PORT_REFUSE@ refuse # This is the default action
+ interface-action: @IPV4_ADDR@@@PORT_TAG_1@ allow
+ interface-action: @IPV4_ADDR@@@PORT_TAG_2@ allow
+ interface-action: @IPV4_ADDR@@@PORT_TAG_3@ allow
+ interface-action: @IPV4_ADDR@@@PORT_VIEW_INT@ allow
+ interface-action: @IPV4_ADDR@@@PORT_VIEW_EXT@ allow
+ interface-action: @IPV4_ADDR@@@PORT_VIEW_INTEXT@ allow
+
+ interface-tag: @IPV4_ADDR@@@PORT_TAG_1@ "one"
+ interface-tag: @IPV4_ADDR@@@PORT_TAG_2@ "two"
+ interface-tag: @IPV4_ADDR@@@PORT_TAG_3@ "refuse"
+ interface-tag-action: @IPV4_ADDR@@@PORT_TAG_1@ one redirect
+ interface-tag-data: @IPV4_ADDR@@@PORT_TAG_1@ one "A 1.1.1.1"
+ interface-tag-action: @IPV4_ADDR@@@PORT_TAG_2@ two redirect
+ interface-tag-data: @IPV4_ADDR@@@PORT_TAG_2@ two "A 2.2.2.2"
+ interface-tag-action: @IPV4_ADDR@@@PORT_TAG_3@ refuse always_refuse
+
+ interface-view: @IPV4_ADDR@@@PORT_VIEW_INT@ "int"
+ interface-view: @IPV4_ADDR@@@PORT_VIEW_EXT@ "ext"
+ interface-view: @IPV4_ADDR@@@PORT_VIEW_INTEXT@ "intext"
+
+# Mirrored interface configuration for IPv6
+ interface: @IPV6_ADDR@@@PORT_ALLOW@
+ interface: @IPV6_ADDR@@@PORT_DENY@
+ interface: @IPV6_ADDR@@@PORT_REFUSE@
+ interface: @IPV6_ADDR@@@PORT_TAG_1@
+ interface: @IPV6_ADDR@@@PORT_TAG_2@
+ interface: @IPV6_ADDR@@@PORT_TAG_3@
+ interface: @IPV6_ADDR@@@PORT_VIEW_INT@
+ interface: @IPV6_ADDR@@@PORT_VIEW_EXT@
+ interface: @IPV6_ADDR@@@PORT_VIEW_INTEXT@
+
+ interface-action: @IPV6_ADDR@@@PORT_ALLOW@ allow
+ interface-action: @IPV6_ADDR@@@PORT_DENY@ deny
+ # interface-action: @IPV6_ADDR@@@PORT_REFUSE@ refuse # This is the default action
+ interface-action: @IPV6_ADDR@@@PORT_TAG_1@ allow
+ interface-action: @IPV6_ADDR@@@PORT_TAG_2@ allow
+ interface-action: @IPV6_ADDR@@@PORT_TAG_3@ allow
+ interface-action: @IPV6_ADDR@@@PORT_VIEW_INT@ allow
+ interface-action: @IPV6_ADDR@@@PORT_VIEW_EXT@ allow
+ interface-action: @IPV6_ADDR@@@PORT_VIEW_INTEXT@ allow
+
+ interface-tag: @IPV6_ADDR@@@PORT_TAG_1@ "one"
+ interface-tag: @IPV6_ADDR@@@PORT_TAG_2@ "two"
+ interface-tag: @IPV6_ADDR@@@PORT_TAG_3@ "refuse"
+ interface-tag-action: @IPV6_ADDR@@@PORT_TAG_1@ one redirect
+ interface-tag-data: @IPV6_ADDR@@@PORT_TAG_1@ one "A 1.1.1.1"
+ interface-tag-action: @IPV6_ADDR@@@PORT_TAG_2@ two redirect
+ interface-tag-data: @IPV6_ADDR@@@PORT_TAG_2@ two "A 2.2.2.2"
+ interface-tag-action: @IPV6_ADDR@@@PORT_TAG_3@ refuse always_refuse
+
+ interface-view: @IPV6_ADDR@@@PORT_VIEW_INT@ "int"
+ interface-view: @IPV6_ADDR@@@PORT_VIEW_EXT@ "ext"
+ interface-view: @IPV6_ADDR@@@PORT_VIEW_INTEXT@ "intext"
+
+# Mirrored interface configuration for interface name
+ interface: @INTERFACE@@@PORT_ALLOW@
+ interface: @INTERFACE@@@PORT_DENY@
+ interface: @INTERFACE@@@PORT_REFUSE@
+ interface: @INTERFACE@@@PORT_TAG_1@
+ interface: @INTERFACE@@@PORT_TAG_2@
+ interface: @INTERFACE@@@PORT_TAG_3@
+ interface: @INTERFACE@@@PORT_VIEW_INT@
+ interface: @INTERFACE@@@PORT_VIEW_EXT@
+ interface: @INTERFACE@@@PORT_VIEW_INTEXT@
+
+ interface-action: @INTERFACE@@@PORT_ALLOW@ allow
+ interface-action: @INTERFACE@@@PORT_DENY@ deny
+ # interface-action: @INTERFACE@@@PORT_REFUSE@ refuse # This is the default action
+ interface-action: @INTERFACE@@@PORT_TAG_1@ allow
+ interface-action: @INTERFACE@@@PORT_TAG_2@ allow
+ interface-action: @INTERFACE@@@PORT_TAG_3@ allow
+ interface-action: @INTERFACE@@@PORT_VIEW_INT@ allow
+ interface-action: @INTERFACE@@@PORT_VIEW_EXT@ allow
+ interface-action: @INTERFACE@@@PORT_VIEW_INTEXT@ allow
+
+ interface-tag: @INTERFACE@@@PORT_TAG_1@ "one"
+ interface-tag: @INTERFACE@@@PORT_TAG_2@ "two"
+ interface-tag: @INTERFACE@@@PORT_TAG_3@ "refuse"
+ interface-tag-action: @INTERFACE@@@PORT_TAG_1@ one redirect
+ interface-tag-data: @INTERFACE@@@PORT_TAG_1@ one "A 1.1.1.1"
+ interface-tag-action: @INTERFACE@@@PORT_TAG_2@ two redirect
+ interface-tag-data: @INTERFACE@@@PORT_TAG_2@ two "A 2.2.2.2"
+ interface-tag-action: @INTERFACE@@@PORT_TAG_3@ refuse always_refuse
+
+ interface-view: @INTERFACE@@@PORT_VIEW_INT@ "int"
+ interface-view: @INTERFACE@@@PORT_VIEW_EXT@ "ext"
+ interface-view: @INTERFACE@@@PORT_VIEW_INTEXT@ "intext"
+
+# Local zones configuration
+ local-zone: local. transparent
+ local-data: "local. A 0.0.0.0"
+ local-zone-tag: local. "one two refuse"
+
+# Views configuration
+view:
+ name: "int"
+ view-first: yes
+ local-zone: "." refuse
+ local-zone: "internal" transparent
+view:
+ name: "ext"
+ view-first: yes
+ local-zone: "internal" refuse
+view:
+ name: "intext"
+ view-first: yes
+
+# Stubs configuration
+forward-zone:
+ name: "."
+ forward-addr: @IPV4_ADDR@@@FORWARD_PORT@
+
+stub-zone:
+ name: "internal"
+ stub-addr: @IPV4_ADDR@@@STUB_PORT@
diff --git a/testdata/acl_interface.tdir/acl_interface.dsc b/testdata/acl_interface.tdir/acl_interface.dsc
new file mode 100644
index 000000000000..cfe5c3cf56c8
--- /dev/null
+++ b/testdata/acl_interface.tdir/acl_interface.dsc
@@ -0,0 +1,16 @@
+BaseName: acl_interface
+Version: 1.0
+Description: Check the interface-* settings
+CreationDate: Fri 8 Oct 18:14:40 CEST 2021
+Maintainer:
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre: acl_interface.pre
+Post: acl_interface.post
+Test: acl_interface.test
+AuxFiles:
+Passed:
+Failure:
diff --git a/testdata/acl_interface.tdir/acl_interface.post b/testdata/acl_interface.tdir/acl_interface.post
new file mode 100644
index 000000000000..982e2b8955a5
--- /dev/null
+++ b/testdata/acl_interface.tdir/acl_interface.post
@@ -0,0 +1,11 @@
+# #-- acl_interface.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 $UNBOUND_PID
+kill_pid $FWD_PID
+kill_pid $STUB_PID
diff --git a/testdata/acl_interface.tdir/acl_interface.pre b/testdata/acl_interface.tdir/acl_interface.pre
new file mode 100644
index 000000000000..ce5358c1b2d9
--- /dev/null
+++ b/testdata/acl_interface.tdir/acl_interface.pre
@@ -0,0 +1,75 @@
+# #-- acl_interface.pre--#
+PRE="../.."
+. ../common.sh
+
+# This test uses the unshare utility
+if test ! -x "`which unshare 2>&1`"; then
+ skip_test "no unshare (from util-linux package) available, skip test"
+fi
+
+get_random_port 11
+
+PORT_ALLOW=$RND_PORT
+PORT_DENY=$(($RND_PORT + 1))
+PORT_REFUSE=$(($RND_PORT + 2))
+PORT_TAG_1=$(($RND_PORT + 3))
+PORT_TAG_2=$(($RND_PORT + 4))
+PORT_TAG_3=$(($RND_PORT + 5))
+PORT_VIEW_INT=$(($RND_PORT + 6))
+PORT_VIEW_EXT=$(($RND_PORT + 7))
+PORT_VIEW_INTEXT=$(($RND_PORT + 8))
+FORWARD_PORT=$(($RND_PORT + 9))
+STUB_PORT=$(($RND_PORT + 10))
+
+IPV4_ADDR=192.168.1.1
+IPV6_ADDR=2001:db8::1
+
+INTERFACE=eth24
+INTERFACE_ADDR_1=10.0.0.1
+INTERFACE_ADDR_2=10.0.0.2
+INTERFACE_ADDR_3=10.0.0.3
+INTERFACE_ADDR_4=10.0.0.4
+
+# make config file
+sed \
+ -e 's/@PORT_ALLOW\@/'$PORT_ALLOW'/' \
+ -e 's/@PORT_DENY\@/'$PORT_DENY'/' \
+ -e 's/@PORT_REFUSE\@/'$PORT_REFUSE'/' \
+ -e 's/@PORT_TAG_1\@/'$PORT_TAG_1'/' \
+ -e 's/@PORT_TAG_2\@/'$PORT_TAG_2'/' \
+ -e 's/@PORT_TAG_3\@/'$PORT_TAG_3'/' \
+ -e 's/@PORT_VIEW_INT\@/'$PORT_VIEW_INT'/' \
+ -e 's/@PORT_VIEW_EXT\@/'$PORT_VIEW_EXT'/' \
+ -e 's/@PORT_VIEW_INTEXT\@/'$PORT_VIEW_INTEXT'/' \
+ -e 's/@FORWARD_PORT\@/'$FORWARD_PORT'/' \
+ -e 's/@STUB_PORT\@/'$STUB_PORT'/' \
+ -e 's/@IPV4_ADDR\@/'$IPV4_ADDR'/' \
+ -e 's/@IPV6_ADDR\@/'$IPV6_ADDR'/' \
+ -e 's/@INTERFACE\@/'$INTERFACE'/' \
+ < acl_interface.conf > ub.conf
+
+if test -x "`which bash`"; then
+ shell="bash"
+else
+ shell="sh"
+fi
+
+echo "PORT_ALLOW=$PORT_ALLOW" >> .tpkg.var.test
+echo "PORT_DENY=$PORT_DENY" >> .tpkg.var.test
+echo "PORT_REFUSE=$PORT_REFUSE" >> .tpkg.var.test
+echo "PORT_TAG_1=$PORT_TAG_1" >> .tpkg.var.test
+echo "PORT_TAG_2=$PORT_TAG_2" >> .tpkg.var.test
+echo "PORT_TAG_3=$PORT_TAG_3" >> .tpkg.var.test
+echo "PORT_VIEW_INT=$PORT_VIEW_INT" >> .tpkg.var.test
+echo "PORT_VIEW_EXT=$PORT_VIEW_EXT" >> .tpkg.var.test
+echo "PORT_VIEW_INTEXT=$PORT_VIEW_INTEXT" >> .tpkg.var.test
+echo "FORWARD_PORT=$FORWARD_PORT" >> .tpkg.var.test
+echo "STUB_PORT=$STUB_PORT" >> .tpkg.var.test
+echo "IPV4_ADDR=$IPV4_ADDR" >> .tpkg.var.test
+echo "IPV6_ADDR=$IPV6_ADDR" >> .tpkg.var.test
+echo "INTERFACE=$INTERFACE" >> .tpkg.var.test
+echo "INTERFACE_ADDR_1=$INTERFACE_ADDR_1" >> .tpkg.var.test
+echo "INTERFACE_ADDR_2=$INTERFACE_ADDR_2" >> .tpkg.var.test
+echo "INTERFACE_ADDR_3=$INTERFACE_ADDR_3" >> .tpkg.var.test
+echo "INTERFACE_ADDR_4=$INTERFACE_ADDR_4" >> .tpkg.var.test
+echo "shell=$shell" >> .tpkg.var.test
diff --git a/testdata/acl_interface.tdir/acl_interface.test b/testdata/acl_interface.tdir/acl_interface.test
new file mode 100644
index 000000000000..421081887086
--- /dev/null
+++ b/testdata/acl_interface.tdir/acl_interface.test
@@ -0,0 +1,11 @@
+# #-- acl_interface.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
+PRE="../.."
+. ../common.sh
+
+# Run the scenario in an unshared namespace
+unshare -rUn $shell acl_interface.test.scenario
+exit $?
diff --git a/testdata/acl_interface.tdir/acl_interface.test.scenario b/testdata/acl_interface.tdir/acl_interface.test.scenario
new file mode 100644
index 000000000000..00b2b059f942
--- /dev/null
+++ b/testdata/acl_interface.tdir/acl_interface.test.scenario
@@ -0,0 +1,205 @@
+# #-- acl_interface.test.scenario --#
+# 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
+PRE="../.."
+. ../common.sh
+
+ip addr add $IPV4_ADDR dev lo
+ip addr add $IPV6_ADDR dev lo
+ip link set lo up
+
+ip link add $INTERFACE type dummy
+ip addr add $INTERFACE_ADDR_1 dev $INTERFACE
+ip addr add $INTERFACE_ADDR_2 dev $INTERFACE
+ip addr add $INTERFACE_ADDR_3 dev $INTERFACE
+ip addr add $INTERFACE_ADDR_4 dev $INTERFACE
+ip link set $INTERFACE up
+
+# start the forwarder in the background
+get_ldns_testns
+$LDNS_TESTNS -p $FORWARD_PORT acl_interface.testns >fwd.log 2>&1 &
+FWD_PID=$!
+echo "FWD_PID=$FWD_PID" >> .tpkg.var.test
+
+# start the stub in the background
+$LDNS_TESTNS -p $STUB_PORT acl_interface.testns2 >fwd2.log 2>&1 &
+STUB_PID=$!
+echo "STUB_PID=$STUB_PID" >> .tpkg.var.test
+
+# start unbound in the background
+$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_ldns_testns_up fwd2.log
+wait_unbound_up unbound.log
+
+end () {
+ echo "> cat logfiles"
+ cat fwd.log
+ cat fwd2.log
+ cat unbound.log
+ exit $1
+}
+
+# Query for the given domain to the given port
+# $1: address family [4, 6]
+# $2: port
+# $3: dname
+query () {
+ addr=$IPV4_ADDR
+ if test "$1" -eq 6; then
+ addr=$IPV6_ADDR
+ fi
+ echo "> dig -p $2 $3"
+ dig @"$addr" -p $2 $3 | tee outfile
+}
+
+# Query for the given domain to the given port
+# $1: address
+# $2: port
+# $3: dname
+query_addr () {
+ echo "> dig @$1 -p $2 $3"
+ dig @"$1" -p $2 $3 | tee outfile
+}
+
+expect_refused () {
+ echo "> check answer for REFUSED"
+ if grep "REFUSED" outfile; then
+ echo "OK"
+ else
+ echo "Not OK"
+ end 1
+ fi
+}
+
+expect_external_answer () {
+ echo "> check external answer"
+ if grep "1.2.3.4" outfile; then
+ echo "OK"
+ else
+ echo "Not OK"
+ end 1
+ fi
+}
+
+expect_internal_answer () {
+ echo "> check internal answer"
+ if grep "10.20.30.40" outfile; then
+ echo "OK"
+ else
+ echo "Not OK"
+ end 1
+ fi
+}
+
+expect_tag_one_answer () {
+ echo "> check tag 'one' answer"
+ if grep "1.1.1.1" outfile; then
+ echo "OK"
+ else
+ echo "Not OK"
+ end 1
+ fi
+}
+
+expect_tag_two_answer () {
+ echo "> check tag 'two' answer"
+ if grep "2.2.2.2" outfile; then
+ echo "OK"
+ else
+ echo "Not OK"
+ end 1
+ fi
+}
+
+# do the test
+
+for i in 4 6; do
+ query $i $PORT_REFUSE "www.external"
+ expect_refused
+
+ query $i $PORT_REFUSE "www.internal"
+ expect_refused
+
+ query $i $PORT_ALLOW "www.external"
+ expect_external_answer
+
+ query $i $PORT_ALLOW "www.internal"
+ expect_internal_answer
+
+ query $i $PORT_TAG_1 "local"
+ expect_tag_one_answer
+
+ query $i $PORT_TAG_2 "local"
+ expect_tag_two_answer
+
+ query $i $PORT_TAG_3 "local"
+ expect_refused
+
+ query $i $PORT_VIEW_INT "www.internal"
+ expect_internal_answer
+
+ query $i $PORT_VIEW_INT "www.external"
+ expect_refused
+
+ query $i $PORT_VIEW_EXT "www.internal"
+ expect_refused
+
+ query $i $PORT_VIEW_EXT "www.external"
+ expect_external_answer
+
+ query $i $PORT_VIEW_INTEXT "www.internal"
+ expect_internal_answer
+
+ query $i $PORT_VIEW_INTEXT "www.external"
+ expect_external_answer
+done
+
+for addr in $INTERFACE_ADDR_1 $INTERFACE_ADDR_2 $INTERFACE_ADDR_3 $INTERFACE_ADDR_4; do
+ query_addr $addr $PORT_REFUSE "www.external"
+ expect_refused
+
+ query_addr $addr $PORT_REFUSE "www.internal"
+ expect_refused
+
+ query_addr $addr $PORT_ALLOW "www.external"
+ expect_external_answer
+
+ query_addr $addr $PORT_ALLOW "www.internal"
+ expect_internal_answer
+
+ query_addr $addr $PORT_TAG_1 "local"
+ expect_tag_one_answer
+
+ query_addr $addr $PORT_TAG_2 "local"
+ expect_tag_two_answer
+
+ query_addr $addr $PORT_TAG_3 "local"
+ expect_refused
+
+ query_addr $addr $PORT_VIEW_INT "www.internal"
+ expect_internal_answer
+
+ query_addr $addr $PORT_VIEW_INT "www.external"
+ expect_refused
+
+ query_addr $addr $PORT_VIEW_EXT "www.internal"
+ expect_refused
+
+ query_addr $addr $PORT_VIEW_EXT "www.external"
+ expect_external_answer
+
+ query_addr $addr $PORT_VIEW_INTEXT "www.internal"
+ expect_internal_answer
+
+ query_addr $addr $PORT_VIEW_INTEXT "www.external"
+ expect_external_answer
+done
+
+end 0
diff --git a/testdata/acl_interface.tdir/acl_interface.testns b/testdata/acl_interface.tdir/acl_interface.testns
new file mode 100644
index 000000000000..d8c871b1c602
--- /dev/null
+++ b/testdata/acl_interface.tdir/acl_interface.testns
@@ -0,0 +1,26 @@
+; nameserver test file
+$ORIGIN external.
+$TTL 3600
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www IN A
+SECTION ANSWER
+www IN A 1.2.3.4
+ENTRY_END
+
+$ORIGIN local.
+$TTL 3600
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+@ IN A
+SECTION ANSWER
+@ IN A 127.0.0.1
+ENTRY_END
diff --git a/testdata/acl_interface.tdir/acl_interface.testns2 b/testdata/acl_interface.tdir/acl_interface.testns2
new file mode 100644
index 000000000000..e9edfc8ba56f
--- /dev/null
+++ b/testdata/acl_interface.tdir/acl_interface.testns2
@@ -0,0 +1,13 @@
+; nameserver test file
+$ORIGIN internal.
+$TTL 3600
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www IN A
+SECTION ANSWER
+www IN A 10.20.30.40
+ENTRY_END
diff --git a/testdata/clang-analysis.tdir/clang-analysis.dsc b/testdata/clang-analysis.tdir/clang-analysis.dsc
index 20a62a3e314c..b3a0609e3f1f 100644
--- a/testdata/clang-analysis.tdir/clang-analysis.dsc
+++ b/testdata/clang-analysis.tdir/clang-analysis.dsc
@@ -7,7 +7,7 @@ Category:
Component:
Depends:
Help:
-Pre:
+Pre: clang-analysis.pre
Post:
Test: clang-analysis.test
AuxFiles:
diff --git a/testdata/clang-analysis.tdir/clang-analysis.pre b/testdata/clang-analysis.tdir/clang-analysis.pre
new file mode 100644
index 000000000000..e9b9a26faabf
--- /dev/null
+++ b/testdata/clang-analysis.tdir/clang-analysis.pre
@@ -0,0 +1,21 @@
+# #-- clang-analysis.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 functions
+. ../common.sh
+
+PRE="../.."
+if test ! -x "`which clang 2>&1`"; then
+ skip_test "No clang in path"
+fi
+#echo "have clang"
+# test if assertions are enabled
+if grep "^#define UNBOUND_DEBUG" $PRE/config.h >/dev/null; then
+ :
+else
+ skip_test "UNBOUND_DEBUG is not enabled, skip test"
+ # no unbound debug means no assertions, and clang analyzer uses
+ # the assertions to make inferences.
+fi
diff --git a/testdata/clang-analysis.tdir/clang-analysis.test b/testdata/clang-analysis.tdir/clang-analysis.test
index 09c935860c47..388556a44848 100644
--- a/testdata/clang-analysis.tdir/clang-analysis.test
+++ b/testdata/clang-analysis.tdir/clang-analysis.test
@@ -7,20 +7,6 @@
. ../common.sh
PRE="../.."
-if test ! -x "`which clang 2>&1`"; then
- echo "No clang in path"
- exit 0
-fi
-#echo "have clang"
-# test if assertions are enabled
-if grep "^#define UNBOUND_DEBUG" $PRE/config.h >/dev/null; then
- :
-else
- echo "UNBOUND_DEBUG is not enabled, skip test"
- # no unbound debug means no assertions, and clang analyzer uses
- # the assertions to make inferences.
- exit 0
-fi
# read value from Makefile
# $1: result variable name
diff --git a/testdata/common.sh b/testdata/common.sh
index 280f5dac4cec..a449f1a64eb2 100644
--- a/testdata/common.sh
+++ b/testdata/common.sh
@@ -27,6 +27,7 @@
# wait_petal_up : wait for petal to come up.
# wait_nsd_up : wait for nsd to come up.
# wait_server_up_or_fail: wait for server to come up or print a failure string
+# skip_test x : print message and skip test (must be called in .pre)
# kill_pid : kill a server, make sure and wait for it to go down.
@@ -109,6 +110,13 @@ skip_if_in_list () {
fi
}
+# Print a message and skip the test. Must be called in the .pre file.
+# $1: message to print.
+skip_test () {
+ echo "$1"
+ exit 3
+}
+
# function to get a number of random port numbers.
# $1: number of random ports.
# RND_PORT is returned as the starting port number
diff --git a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.post b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.post
index 0346d3f84a61..fcb6c9d0e089 100644
--- a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.post
+++ b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.post
@@ -8,9 +8,6 @@
PRE="../.."
. ../common.sh
-# Check if we can run the test.
-. ./precheck.sh
-
kill_pid $FWD_PID
kill_pid $UNBOUND_PID
diff --git a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.pre b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.pre
index bee9e8ac63ca..6cf52299c5ad 100644
--- a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.pre
+++ b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.pre
@@ -8,7 +8,11 @@ PRE="../.."
. ../common.sh
# Check if we can run the test.
-. ./precheck.sh
+if grep "define USE_DNSCRYPT 1" $PRE/config.h; then
+ echo "have dnscrypt"
+else
+ skip_test "no dnscrypt"
+fi
get_random_port 3
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.test b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.test
index f09753792696..fdb88e8f9490 100644
--- a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.test
+++ b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.test
@@ -7,9 +7,6 @@
PRE="../.."
. ../common.sh
-# Check if we can run the test.
-. ./precheck.sh
-
# do the test
# Query plain request over DNSCrypt channel get closed
diff --git a/testdata/dnscrypt_cert.tdir/precheck.sh b/testdata/dnscrypt_cert.tdir/precheck.sh
deleted file mode 100644
index 00fa4bc76067..000000000000
--- a/testdata/dnscrypt_cert.tdir/precheck.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-# dnscrypt precheck.sh
-
-# if no dnscrypt; exit
-if grep "define USE_DNSCRYPT 1" $PRE/config.h; then
- echo "have dnscrypt"
-else
- echo "no dnscrypt"
- exit 0
-fi
-
-# if no xchacha20 support in unbound; exit
-if grep "define USE_DNSCRYPT_XCHACHA20 1" $PRE/config.h; then
- xchacha20=1
-else
- xchacha20=0
-fi
diff --git a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.post b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.post
index 54337df67d55..9537d9e821a4 100644
--- a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.post
+++ b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.post
@@ -8,10 +8,5 @@
PRE="../.."
. ../common.sh
-# Check if we can run the test.
-. ./precheck.sh
-
kill_pid $FWD_PID
-if [ $xchacha20 -ne 0 ]; then
- kill_pid $UNBOUND_PID
-fi
+kill_pid $UNBOUND_PID
diff --git a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.pre b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.pre
index c77290a8ab7d..4534fdf47f63 100644
--- a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.pre
+++ b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.pre
@@ -7,8 +7,17 @@
PRE="../.."
. ../common.sh
-# Check if we can run the test.
-. ./precheck.sh
+# if no dnscrypt; exit
+if grep "define USE_DNSCRYPT 1" $PRE/config.h; then
+ echo "have dnscrypt"
+else
+ skip_test "no dnscrypt"
+fi
+if grep "define USE_DNSCRYPT_XCHACHA20 1" $PRE/config.h; then
+ echo "have XChacha20 support"
+else
+ skip_test "no XChacha20 support"
+fi
get_random_port 3
UNBOUND_PORT=$RND_PORT
@@ -34,10 +43,5 @@ echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test
cat .tpkg.var.test
wait_ldns_testns_up fwd.log
-if [ $xchacha20 -eq 0 ]; then
- # no xchacha20 support, we expect unbound to exit with an error message.
- wait_server_up unbound.log "Certificate for XChacha20 but libsodium does not support it"
-else
- wait_unbound_up unbound.log
-fi
+wait_unbound_up unbound.log
diff --git a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.test b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.test
index 4ef6942be6fb..2db073ad6a40 100644
--- a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.test
+++ b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.test
@@ -6,17 +6,9 @@
PRE="../.."
. ../common.sh
-# Check if we can run the test.
-. ./precheck.sh
# do the test
-if [ $xchacha20 -eq 0 ]; then
- # Unbound would exit before we can attempt any tests.
- echo "OK"
- exit 0
-fi
-
# Query plain request over DNSCrypt channel get closed
# We use TCP to avoid hanging on waiting for UDP.
# We expect `outfile` to contain no DNS payload
@@ -104,7 +96,7 @@ do
echo "> check answer"
grep -F 'DNSC\000\002\000\000\1716\226\255*\244\002L\177g\025_\127tR\151\246R\203\178\153\248\006\137\"\138\173|G/,\160\152\015\010\172\184\220`\175\217\255,\162\018\178-d\007\246k0\003I[\205w\026)\204B\002\161\010\245\243W\191\189Z\216\210x\025\204\247\173\227t\138\018\162~\152\253\211\031z\\\002m5\008\254\2244\246\243W\191\189Z\216\210Y\160\2158Y\160\2158u\210\219\184' outfile
cert_found=$?
- if [ \( $cert_found -eq 0 -a $xchacha20 -eq 1 \) -o \( $cert_found -ne 0 -a $xchacha20 -eq 0 \) ]; then
+ if [ \( $cert_found -eq 0 \) ]; then
echo "OK"
else
echo "Not OK"
diff --git a/testdata/dnscrypt_cert_chacha.tdir/precheck.sh b/testdata/dnscrypt_cert_chacha.tdir/precheck.sh
deleted file mode 100644
index 00fa4bc76067..000000000000
--- a/testdata/dnscrypt_cert_chacha.tdir/precheck.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-# dnscrypt precheck.sh
-
-# if no dnscrypt; exit
-if grep "define USE_DNSCRYPT 1" $PRE/config.h; then
- echo "have dnscrypt"
-else
- echo "no dnscrypt"
- exit 0
-fi
-
-# if no xchacha20 support in unbound; exit
-if grep "define USE_DNSCRYPT_XCHACHA20 1" $PRE/config.h; then
- xchacha20=1
-else
- xchacha20=0
-fi
diff --git a/testdata/dnstap.tdir/dnstap.post b/testdata/dnstap.tdir/dnstap.post
index 6744b4b618ce..6d5e9d50d044 100644
--- a/testdata/dnstap.tdir/dnstap.post
+++ b/testdata/dnstap.tdir/dnstap.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $DNSTAP_SOCKET_PID
kill_pid $FWD_PID
kill $UNBOUND_PID
diff --git a/testdata/dnstap.tdir/dnstap.pre b/testdata/dnstap.tdir/dnstap.pre
index 6561d77e98a2..0f2e0231df58 100644
--- a/testdata/dnstap.tdir/dnstap.pre
+++ b/testdata/dnstap.tdir/dnstap.pre
@@ -7,7 +7,7 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 3
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/dnstap.tdir/dnstap.test b/testdata/dnstap.tdir/dnstap.test
index fbf8565ffcac..3a2dcc5e13f0 100644
--- a/testdata/dnstap.tdir/dnstap.test
+++ b/testdata/dnstap.tdir/dnstap.test
@@ -6,7 +6,6 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
# test if the server is up.
echo "> dig www.example.com."
diff --git a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.post b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.post
index 0056a20d9506..44b8e6b9722b 100644
--- a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.post
+++ b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $DNSTAP_SOCKET_PID
kill_pid $FWD_PID
kill $UNBOUND_PID
diff --git a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.pre b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.pre
index a1aba4f35c5d..df031ac0138b 100644
--- a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.pre
+++ b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.pre
@@ -7,7 +7,7 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 3
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.test b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.test
index 94679bc66e78..8f28bc1094b6 100644
--- a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.test
+++ b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.test
@@ -6,7 +6,6 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
# test if the server is up.
echo "> dig www.example.com."
diff --git a/testdata/dnstap_tcp.tdir/dnstap_tcp.post b/testdata/dnstap_tcp.tdir/dnstap_tcp.post
index 8aad21e19b6a..f9a52edf6b80 100644
--- a/testdata/dnstap_tcp.tdir/dnstap_tcp.post
+++ b/testdata/dnstap_tcp.tdir/dnstap_tcp.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $DNSTAP_SOCKET_PID
kill_pid $FWD_PID
kill $UNBOUND_PID
diff --git a/testdata/dnstap_tcp.tdir/dnstap_tcp.pre b/testdata/dnstap_tcp.tdir/dnstap_tcp.pre
index 3006603c5648..aea781de95c7 100644
--- a/testdata/dnstap_tcp.tdir/dnstap_tcp.pre
+++ b/testdata/dnstap_tcp.tdir/dnstap_tcp.pre
@@ -7,7 +7,7 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 4
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/dnstap_tcp.tdir/dnstap_tcp.test b/testdata/dnstap_tcp.tdir/dnstap_tcp.test
index d57eecfdbb94..c9aef3e78e97 100644
--- a/testdata/dnstap_tcp.tdir/dnstap_tcp.test
+++ b/testdata/dnstap_tcp.tdir/dnstap_tcp.test
@@ -6,7 +6,6 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
# test if the server is up.
echo "> dig www.example.com."
diff --git a/testdata/dnstap_tls.tdir/dnstap_tls.post b/testdata/dnstap_tls.tdir/dnstap_tls.post
index fe1824a063d8..8adfb1a024dd 100644
--- a/testdata/dnstap_tls.tdir/dnstap_tls.post
+++ b/testdata/dnstap_tls.tdir/dnstap_tls.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $DNSTAP_SOCKET_PID
kill_pid $FWD_PID
kill $UNBOUND_PID
diff --git a/testdata/dnstap_tls.tdir/dnstap_tls.pre b/testdata/dnstap_tls.tdir/dnstap_tls.pre
index 1df914873541..7a20ec2dd4ba 100644
--- a/testdata/dnstap_tls.tdir/dnstap_tls.pre
+++ b/testdata/dnstap_tls.tdir/dnstap_tls.pre
@@ -7,7 +7,7 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 4
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/dnstap_tls.tdir/dnstap_tls.test b/testdata/dnstap_tls.tdir/dnstap_tls.test
index f9a2bf00d7fd..3a0bf10f09f7 100644
--- a/testdata/dnstap_tls.tdir/dnstap_tls.test
+++ b/testdata/dnstap_tls.tdir/dnstap_tls.test
@@ -6,7 +6,6 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
# test if the server is up.
echo "> dig www.example.com."
diff --git a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.post b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.post
index d71eb28ae113..aa0dfbfa4994 100644
--- a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.post
+++ b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $DNSTAP_SOCKET_PID
kill_pid $FWD_PID
kill $UNBOUND_PID
diff --git a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.pre b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.pre
index eff7074d0b1e..f077965e0c9e 100644
--- a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.pre
+++ b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.pre
@@ -7,7 +7,7 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 4
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.test b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.test
index 0b85f64accbc..b4d944a0f9ad 100644
--- a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.test
+++ b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.test
@@ -6,7 +6,6 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
# test if the server is up.
echo "> dig www.example.com."
diff --git a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.post b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.post
index 59f05b81d936..553aa2f873d7 100644
--- a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.post
+++ b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $DNSTAP_SOCKET_PID
kill_pid $FWD_PID
kill $UNBOUND_PID
diff --git a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.pre b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.pre
index 0ffee6081619..6a4a480b6385 100644
--- a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.pre
+++ b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.pre
@@ -7,7 +7,7 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 4
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.test b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.test
index 248d8f222531..907392f6d580 100644
--- a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.test
+++ b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.test
@@ -6,7 +6,6 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
# test if the server is up.
echo "> dig www.example.com."
diff --git a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.post b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.post
index 83df2a72ec79..2ef2ac36f99a 100644
--- a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.post
+++ b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $DNSTAP_SOCKET_PID
kill_pid $FWD_PID
kill $UNBOUND_PID
diff --git a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.pre b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.pre
index a035181cec0f..80a5cd61b6eb 100644
--- a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.pre
+++ b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.pre
@@ -7,7 +7,7 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 4
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.test b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.test
index 5b9cce0a4c47..842c8190ee94 100644
--- a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.test
+++ b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.test
@@ -6,7 +6,6 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
# test if the server is up.
echo "> dig www.example.com."
diff --git a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.post b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.post
index 3ca63ada4ee3..733a36ea91d0 100644
--- a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.post
+++ b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $DNSTAP_SOCKET_PID
kill_pid $FWD_PID
kill $UNBOUND_PID
diff --git a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.pre b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.pre
index 25b838d8bfb0..50f9853d4833 100644
--- a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.pre
+++ b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.pre
@@ -7,7 +7,7 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 4
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.test b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.test
index 03bcbadfd093..b5a6adfc3226 100644
--- a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.test
+++ b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.test
@@ -6,7 +6,6 @@
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
# test if the server is up.
echo "> dig www.example.com."
diff --git a/testdata/doh_downstream.tdir/doh_downstream.post b/testdata/doh_downstream.tdir/doh_downstream.post
index 0e3c00b05531..67972a7f0c45 100644
--- a/testdata/doh_downstream.tdir/doh_downstream.post
+++ b/testdata/doh_downstream.tdir/doh_downstream.post
@@ -6,7 +6,6 @@
#
# do your teardown here
PRE="../.."
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
. ../common.sh
kill_pid $FWD_PID
kill_pid $UNBOUND_PID
diff --git a/testdata/doh_downstream.tdir/doh_downstream.pre b/testdata/doh_downstream.tdir/doh_downstream.pre
index 29bb805a16cc..22072544042b 100644
--- a/testdata/doh_downstream.tdir/doh_downstream.pre
+++ b/testdata/doh_downstream.tdir/doh_downstream.pre
@@ -6,7 +6,7 @@
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 2
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/doh_downstream.tdir/doh_downstream.test b/testdata/doh_downstream.tdir/doh_downstream.test
index d66168fbaab5..78e2e84eb3c4 100644
--- a/testdata/doh_downstream.tdir/doh_downstream.test
+++ b/testdata/doh_downstream.tdir/doh_downstream.test
@@ -6,7 +6,6 @@
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
get_make
(cd $PRE; $MAKE dohclient)
diff --git a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.post b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.post
index 881970a77c0c..f15ebe555a2c 100644
--- a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.post
+++ b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.post
@@ -6,7 +6,6 @@
#
# do your teardown here
PRE="../.."
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
. ../common.sh
kill_pid $UNBOUND_PID
cat unbound.log
diff --git a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.pre b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.pre
index a58780ab315a..ff68a46777f1 100644
--- a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.pre
+++ b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.pre
@@ -6,7 +6,7 @@
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 1
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.test b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.test
index 78c46081d39b..bbeb9eb2b65f 100644
--- a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.test
+++ b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.test
@@ -6,7 +6,6 @@
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
get_make
(cd $PRE; $MAKE dohclient)
diff --git a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.post b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.post
index dcdf8627e076..f15ebe555a2c 100644
--- a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.post
+++ b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.post
@@ -7,6 +7,5 @@
# do your teardown here
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $UNBOUND_PID
cat unbound.log
diff --git a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.pre b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.pre
index cd0d11fd4b3d..dd7acc290da3 100644
--- a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.pre
+++ b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.pre
@@ -6,7 +6,7 @@
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 1
UNBOUND_PORT=$RND_PORT
echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test
diff --git a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.test b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.test
index 2a6954cab645..d788e366700c 100644
--- a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.test
+++ b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.test
@@ -6,7 +6,6 @@
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
get_make
(cd $PRE; $MAKE dohclient)
diff --git a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.post b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.post
index 3ceaeade8f8d..9fb51b6d343a 100644
--- a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.post
+++ b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.post
@@ -6,7 +6,6 @@
#
# do your teardown here
PRE="../.."
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
. ../common.sh
kill_pid $FWD_PID
kill_pid $UNBOUND_PID
diff --git a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.pre b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.pre
index e1f30a575a81..9c7233d64906 100644
--- a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.pre
+++ b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.pre
@@ -6,7 +6,7 @@
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 2
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.test b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.test
index 87ff560d3eae..040285e8fd3a 100644
--- a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.test
+++ b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.test
@@ -6,7 +6,6 @@
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
get_make
(cd $PRE; $MAKE dohclient)
diff --git a/testdata/doh_downstream_post.tdir/doh_downstream_post.post b/testdata/doh_downstream_post.tdir/doh_downstream_post.post
index 98034a32c439..2f8f5a8e0be8 100644
--- a/testdata/doh_downstream_post.tdir/doh_downstream_post.post
+++ b/testdata/doh_downstream_post.tdir/doh_downstream_post.post
@@ -7,7 +7,6 @@
# do your teardown here
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $FWD_PID
kill_pid $UNBOUND_PID
cat unbound.log
diff --git a/testdata/doh_downstream_post.tdir/doh_downstream_post.pre b/testdata/doh_downstream_post.tdir/doh_downstream_post.pre
index 34df83d4b4d2..a8ecd344b2db 100644
--- a/testdata/doh_downstream_post.tdir/doh_downstream_post.pre
+++ b/testdata/doh_downstream_post.tdir/doh_downstream_post.pre
@@ -6,7 +6,7 @@
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 2
UNBOUND_PORT=$RND_PORT
FWD_PORT=$(($RND_PORT + 1))
diff --git a/testdata/doh_downstream_post.tdir/doh_downstream_post.test b/testdata/doh_downstream_post.tdir/doh_downstream_post.test
index 6442d1e12751..d6a512ae324e 100644
--- a/testdata/doh_downstream_post.tdir/doh_downstream_post.test
+++ b/testdata/doh_downstream_post.tdir/doh_downstream_post.test
@@ -6,7 +6,6 @@
PRE="../.."
. ../common.sh
-if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
get_make
(cd $PRE; $MAKE dohclient)
diff --git a/testdata/dynlibmod.tdir/dynlibmod.post b/testdata/dynlibmod.tdir/dynlibmod.post
index caa0da4f5161..99a4268a7cf4 100644
--- a/testdata/dynlibmod.tdir/dynlibmod.post
+++ b/testdata/dynlibmod.tdir/dynlibmod.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define WITH_DYNLIBMODULE 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $FWD_PID
kill $UNBOUND_PID
kill $UNBOUND_PID >/dev/null 2>&1
diff --git a/testdata/dynlibmod.tdir/dynlibmod.pre b/testdata/dynlibmod.tdir/dynlibmod.pre
index 94adaa72332d..fbf229b8b10c 100644
--- a/testdata/dynlibmod.tdir/dynlibmod.pre
+++ b/testdata/dynlibmod.tdir/dynlibmod.pre
@@ -7,7 +7,7 @@
. ../common.sh
PRE="../.."
-if grep "define WITH_DYNLIBMODULE 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define WITH_DYNLIBMODULE 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 3
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/dynlibmod.tdir/dynlibmod.test b/testdata/dynlibmod.tdir/dynlibmod.test
index f99f6fbc4e8b..2954acaff4f8 100644
--- a/testdata/dynlibmod.tdir/dynlibmod.test
+++ b/testdata/dynlibmod.tdir/dynlibmod.test
@@ -6,7 +6,6 @@
. ../common.sh
PRE="../.."
-if grep "define WITH_DYNLIBMODULE 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
# compile the dynamic library module
if grep "define USE_WINSOCK 1" $PRE/config.h; then
diff --git a/testdata/ede.tdir/bogus/clean.sh b/testdata/ede.tdir/bogus/clean.sh
deleted file mode 100755
index 54128f807217..000000000000
--- a/testdata/ede.tdir/bogus/clean.sh
+++ /dev/null
@@ -1 +0,0 @@
-rm -f K* piece1 base expired notyetincepted trust-anchors dnssec-failures.test.signed dnskey-failures.test.signed nsec-failures.test.signed rrsig-failures.test.signed
diff --git a/testdata/ede.tdir/bogus/dnskey-failures.test.signed b/testdata/ede.tdir/bogus/dnskey-failures.test.signed
new file mode 100644
index 000000000000..69bfde48b9f6
--- /dev/null
+++ b/testdata/ede.tdir/bogus/dnskey-failures.test.signed
@@ -0,0 +1,7 @@
+dnskey-failures.test. 3600 IN SOA ns.dnskey-failures.test. hostmaster.dnskey-failures.test. 1 14400 1800 2419200 300
+dnskey-failures.test. 3600 IN RRSIG SOA 13 2 3600 20010201000000 20001230000000 45928 dnskey-failures.test. NKixvGKa0WHSI8oE5THI1hjm5nExVkryUmW15VoNZ3pwqUYexGWLIlfuYsTaDE5GVEtPpSKbA+PlYDk19EsLNQ==
+dnskey-failures.test. 3600 IN A 192.0.2.1
+dnskey-failures.test. 3600 IN RRSIG A 13 2 3600 20010201000000 20001230000000 45928 dnskey-failures.test. FCEvbVL3TkzO7jWeOz7E/A3Q64QkpegVazS4OL+ybxN2o8OzXdCJN3QbCGdFP26/Rbj089ThDCZ0+OormAk1dw==
+dnskey-failures.test. 3600 IN RRSIG DNSKEY 13 2 3600 20010201000000 20001230000000 45928 dnskey-failures.test. pEjWVsJbFiQBvwNGV3v0nVirMJDOYKXqC4IX9dFuRTnoWSb95anvB08pgaZ1ie+thk6YC1fX2fUTRKRFr3vHnA==
+dnskey-failures.test. 300 IN NSEC dnskey-failures.test. A SOA RRSIG NSEC DNSKEY
+dnskey-failures.test. 300 IN RRSIG NSEC 13 2 300 20010201000000 20001230000000 45928 dnskey-failures.test. /vAazBDetA5+np+fE7V6f9W+faEQT3ETGueNNhFPjUsPF1dU9Gglu4PZ15fWOxsk0DPWHNmTMF70ZCGQJ2k+fw==
diff --git a/testdata/ede.tdir/bogus/dnssec-failures.test.signed b/testdata/ede.tdir/bogus/dnssec-failures.test.signed
new file mode 100644
index 000000000000..ed8f5d9d980b
--- /dev/null
+++ b/testdata/ede.tdir/bogus/dnssec-failures.test.signed
@@ -0,0 +1,25 @@
+dnssec-failures.test. 3600 IN SOA ns.dnssec-failures.test. hostmaster.dnssec-failures.test. 1 14400 1800 2419200 300
+dnssec-failures.test. 3600 IN RRSIG SOA 13 2 3600 20010201000000 20001230000000 53876 dnssec-failures.test. K37BIR/jLR4tN1JtTx3MwzgozslvnFtwUquCSfiBykCcKIv6wErSI9Gnw/tjH0tXrLI1eoLa5oWkgtxy0KKybg==
+dnssec-failures.test. 3600 IN NS ns.dnssec-failures.test.
+dnssec-failures.test. 3600 IN RRSIG NS 13 2 3600 20010201000000 20001230000000 53876 dnssec-failures.test. JP6mYQORwnwwv+2q9UxpeeaVs5/171y3lyc1FKAY3FHmFqjd4Uo0byW8jgk/BrJyVkaDeZbjvuZq+BED0codpw==
+dnssec-failures.test. 3600 IN DNSKEY 257 3 13 mx6xe39HZrYCpyC+9YmquHIf1WdWYaDqOfcpXg2Gtv5VJGS/WSO14txlUoKjYCldyRwcg9wT6JAwikpkzWS6UQ== ;{id = 53876 (ksk), size = 256b}
+dnssec-failures.test. 3600 IN RRSIG DNSKEY 13 2 3600 20010201000000 20001230000000 53876 dnssec-failures.test. F760TrogHIBkenX7nGr6LEvocTcGAZamfAaiftIkwprBp21/LZ+qotGsFu9YWsxlGqB3KAINXYATjS6AEJfGEQ==
+dnssec-failures.test. 300 IN NSEC expired.dnssec-failures.test. NS SOA RRSIG NSEC DNSKEY
+dnssec-failures.test. 300 IN RRSIG NSEC 13 2 300 20010201000000 20001230000000 53876 dnssec-failures.test. Zk+RW0mbLSzwvSYuNQJhNdd4XmtQv47CiLtHbqOyS8/xt5Pt87T0v1UxnCkZAlA+VTEWbJkasq06ER1wMuTetA==
+expired.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. UAhzOVumQZ2PVspwJS5NyOjZypIaQXfHMiXGEUYaZ161IfQdB3coBx2vF8MHdqbePOl6Z4oa51ltITMlBL+Stw==
+missingrrsigs.dnssec-failures.test. 3600 IN TXT "Signatures missing"
+missingrrsigs.dnssec-failures.test. 300 IN NSEC notyetincepted.dnssec-failures.test. TXT RRSIG NSEC
+missingrrsigs.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. 4phKld6eMt4cxA4w6I1i29uAbdfbwFrkpRGLBWwerUgDbOdDwUm1de6t4QhBys7DtoZb3wIS+DLJYjBNbz7Sig==
+notyetincepted.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. ix6Gg9uUZ0A56IQXbDJuBQ3vIm6QipuvzQTKd2wF6kZuEW/53wuy4ROBDIQ4IgnQD17vG8tJNeDOCfj0hh8+dQ==
+ns.dnssec-failures.test. 3600 IN A 192.0.2.1
+ns.dnssec-failures.test. 3600 IN RRSIG A 13 3 3600 20010201000000 20001230000000 53876 dnssec-failures.test. PbcykgJEHG218vCkj9pD8W5JVqyCD9VRNOy3SHqCTvWGVAApasdZ7n5wzNVpHdKrqlTpyLwf6z6vv4NMYbEQdw==
+ns.dnssec-failures.test. 300 IN NSEC sigsinvalid.dnssec-failures.test. A RRSIG NSEC
+ns.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. SEO+C116gcmI0sY4lnIM4DQrUxqyaGIIqlvhxyGrzF9jJopRZB8gflQcYPy5qhIwGZJoEMB+SO4er4LCaS8NwA==
+sigsinvalid.dnssec-failures.test. 3600 IN TXT "Signatures INVALID"
+sigsinvalid.dnssec-failures.test. 3600 IN RRSIG TXT 13 3 3600 20010201000000 20001230000000 53876 dnssec-failures.test. 3XFjjPt+UyY4ZIj8PAINTtOTh7sk4OIAO5akFDQhqgB/Wv6f7dWdqvl8Y2RIqdh0WQz+nGPRMktS8exA3FKW4Q==
+sigsinvalid.dnssec-failures.test. 300 IN NSEC dnssec-failures.test. TXT RRSIG NSEC
+sigsinvalid.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. gmft6HYmqZalLwmdnuWBqJod3JD5fRoGqiwYXVFxySm2bHPvz8J9xSe7RdTSONXPUc+7mE8IHYff/gGW7gctqw==
+expired.dnssec-failures.test. 3600 IN TXT "Expired"
+expired.dnssec-failures.test. 3600 IN RRSIG TXT 13 3 3600 20001230000000 20001201000000 53876 dnssec-failures.test. 8zosYGmmGGcGcBuWaf3oL3TE/hpKDrddtm7ZQGndjmqkZ8CVg6RwFb+8YLqcG5du3Si0rmTuZId+qBOV/pnViA==
+notyetincepted.dnssec-failures.test. 3600 IN TXT "Not yet incepted"
+notyetincepted.dnssec-failures.test. 3600 IN RRSIG TXT 13 3 3600 20010201000000 20010103000000 53876 dnssec-failures.test. lmk0+oEdnnKa1oujIsMeimuElrKvrUSlBknsfSNqOo07VxJxT2R4qkKc95oiEmeSWHcVTOrXxEhtl4kAAactPg==
diff --git a/testdata/ede.tdir/bogus/make-broken-zone.sh b/testdata/ede.tdir/bogus/make-broken-zone.sh
index 67b4fcfb2d84..f93df3978a6f 100755
--- a/testdata/ede.tdir/bogus/make-broken-zone.sh
+++ b/testdata/ede.tdir/bogus/make-broken-zone.sh
@@ -1,21 +1,28 @@
#!/usr/bin/env bash
-# create oudated zones
-CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom dnssec-failures.test`
-echo $CSK
+# This script was used to generate the broken signed zones used for testing.
-echo ". IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d" | \
- cat $CSK.ds - > bogus/trust-anchors
+# Override the current date; it is used in Unbound's configuration also.
+NOW=20010101
# differentiate for MacOS with "gdate"
DATE=date
which gdate > /dev/null 2>&1 && DATE=gdate
-ONEMONTHAGO=`$DATE -d 'now - 1 month' +%Y%m%d`
-YESTERDAY=`$DATE -d 'now - 2 days' +%Y%m%d`
-TOMORROW=`$DATE -d 'now + 2 days' +%Y%m%d`
+ONEMONTHAGO=`$DATE -d "$NOW - 1 month" +%Y%m%d`
+ONEMONTH=`$DATE -d "$NOW + 1 month" +%Y%m%d`
+YESTERDAY=`$DATE -d "$NOW - 2 days" +%Y%m%d`
+TOMORROW=`$DATE -d "$NOW + 2 days" +%Y%m%d`
+
+# Root trust anchor
+echo ". IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d" > bogus/trust-anchors
+
+# create oudated zones
+CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom dnssec-failures.test`
+echo $CSK
+cat $CSK.ds >> bogus/trust-anchors
-ldns-signzone -i $YESTERDAY -f - bogus/dnssec-failures.test $CSK | \
+ldns-signzone -i $YESTERDAY -e $ONEMONTH -f - bogus/dnssec-failures.test $CSK | \
grep -v '^missingrrsigs\.dnssec-failures\.test\..*IN.*RRSIG.*TXT' | \
sed 's/Signatures invalid/Signatures INVALID/g' | \
grep -v '^notyetincepted\.dnssec-failures\.test\..*IN.*TXT' | \
@@ -25,7 +32,7 @@ ldns-signzone -i $YESTERDAY -f - bogus/dnssec-failures.test $CSK | \
ldns-signzone -i $ONEMONTHAGO -e $YESTERDAY -f - bogus/dnssec-failures.test $CSK | \
grep -v '[ ]NSEC[ ]' | \
grep '^expired\.dnssec-failures\.test\..*IN.*TXT' > expired
-ldns-signzone -i $TOMORROW -f - bogus/dnssec-failures.test $CSK | \
+ldns-signzone -i $TOMORROW -e $ONEMONTH -f - bogus/dnssec-failures.test $CSK | \
grep -v '[ ]NSEC[ ]' | \
grep '^notyetincepted\.dnssec-failures\.test\..*IN.*TXT' > notyetincepted
@@ -33,34 +40,35 @@ cat base expired notyetincepted > bogus/dnssec-failures.test.signed
# cleanup old zone keys
rm -f $CSK.*
+
# create zone with DNSKEY missing
CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom dnskey-failures.test`
echo $CSK
cat $CSK.ds >> bogus/trust-anchors
-ldns-signzone -f tmp.signed bogus/dnskey-failures.test $CSK
+ldns-signzone -i $YESTERDAY -e $ONEMONTH -f tmp.signed bogus/dnskey-failures.test $CSK
grep -v ' DNSKEY ' tmp.signed > bogus/dnskey-failures.test.signed
-
# cleanup old zone keys
rm -f $CSK.*
+
# create zone with NSEC missing
CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom nsec-failures.test`
echo $CSK
cat $CSK.ds >> bogus/trust-anchors
-ldns-signzone -f tmp.signed bogus/nsec-failures.test $CSK
+ldns-signzone -i $YESTERDAY -e $ONEMONTH -f tmp.signed bogus/nsec-failures.test $CSK
grep -v ' NSEC ' tmp.signed > bogus/nsec-failures.test.signed
-
# cleanup old zone keys
rm -f $CSK.*
+
# create zone with RRSIGs missing
CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom rrsig-failures.test`
echo $CSK
cat $CSK.ds >> bogus/trust-anchors
-ldns-signzone -f tmp.signed bogus/rrsig-failures.test $CSK
+ldns-signzone -i $YESTERDAY -e $ONEMONTH -f tmp.signed bogus/rrsig-failures.test $CSK
grep -v ' RRSIG ' tmp.signed > bogus/rrsig-failures.test.signed
# cleanup
diff --git a/testdata/ede.tdir/bogus/nsec-failures.test.signed b/testdata/ede.tdir/bogus/nsec-failures.test.signed
new file mode 100644
index 000000000000..b631386137c3
--- /dev/null
+++ b/testdata/ede.tdir/bogus/nsec-failures.test.signed
@@ -0,0 +1,7 @@
+nsec-failures.test. 3600 IN SOA ns.nsec-failures.test. hostmaster.nsec-failures.test. 1 14400 1800 2419200 300
+nsec-failures.test. 3600 IN RRSIG SOA 13 2 3600 20010201000000 20001230000000 12342 nsec-failures.test. ZdnRF2uI0IDJsHTXsd4TclX9gUEkxjp19LykHuI3DaCKe3bY8uTETta8i73hlKWJWeRjmgQojIsi9tBlivOwjQ==
+nsec-failures.test. 3600 IN A 192.0.2.1
+nsec-failures.test. 3600 IN RRSIG A 13 2 3600 20010201000000 20001230000000 12342 nsec-failures.test. /JccCtWkuQgSF81gv6DPsxaicmlJoGAhVpCpR4JGgVz3tZMhIp+iXUGeI+CkBofw9G/MK66Hk937JRmMh9UTvQ==
+nsec-failures.test. 3600 IN DNSKEY 257 3 13 41tJnzHY0o3WKid0ZsIo6S5SJdC1JiW0H/KizsAD2phHdi1AIDiBclL+nG2lKvPjMoX2hcMfd8h9DfU99HR3kg== ;{id = 12342 (ksk), size = 256b}
+nsec-failures.test. 3600 IN RRSIG DNSKEY 13 2 3600 20010201000000 20001230000000 12342 nsec-failures.test. Y23xTzxdqQBjFsWLlqCRgPKT7raPcP0lAy2tR8trW5+vUAhBePXdVixp4AjoxEqXsLLalAtnJnc4QgH7+HO6PA==
+nsec-failures.test. 300 IN RRSIG NSEC 13 2 300 20010201000000 20001230000000 12342 nsec-failures.test. KfpncqGIzIPNB2ExkH22/z0jAPmq8jTTjDkLte29iKqR9t3bSZlcS0MQ2QB7Z6tgks8fo7Zpc9+BvaDq7Y6ONg==
diff --git a/testdata/ede.tdir/bogus/rrsig-failures.test.signed b/testdata/ede.tdir/bogus/rrsig-failures.test.signed
new file mode 100644
index 000000000000..222bdc0c6d9a
--- /dev/null
+++ b/testdata/ede.tdir/bogus/rrsig-failures.test.signed
@@ -0,0 +1,4 @@
+rrsig-failures.test. 3600 IN SOA ns.rrsig-failures.test. hostmaster.rrsig-failures.test. 1 14400 1800 2419200 300
+rrsig-failures.test. 3600 IN A 192.0.2.1
+rrsig-failures.test. 3600 IN DNSKEY 257 3 13 rIMJ4/qnOb91GuxKzAYiCdPNdEtUhyt+mi1Jz+NPP0rJQdGOhXr37LpctEiKK4isabCXcwYlVtFdDPopa4RufA== ;{id = 13838 (ksk), size = 256b}
+rrsig-failures.test. 300 IN NSEC rrsig-failures.test. A SOA RRSIG NSEC DNSKEY
diff --git a/testdata/ede.tdir/bogus/trust-anchors b/testdata/ede.tdir/bogus/trust-anchors
new file mode 100644
index 000000000000..bd20c8702e54
--- /dev/null
+++ b/testdata/ede.tdir/bogus/trust-anchors
@@ -0,0 +1,5 @@
+. IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d
+dnssec-failures.test. IN DS 53876 13 2 e0207223d847e0d8f3bd2afcf887f727178777a94563b94e1d0be8ca2f070d9a
+dnskey-failures.test. IN DS 45928 13 2 9295d5c0d9296599809ce968f994a974d4da7752266ee124ead4ce980c006c20
+nsec-failures.test. IN DS 12342 13 2 b0a994fe4ff12a706b2a47a794601b254a8d28e040832ad6e39e96dbf7736ca2
+rrsig-failures.test. IN DS 13838 13 2 b083d59d2e7ac370e1103bc5ada2a921e4e65745ea8550350b6fcb57eba9f917
diff --git a/testdata/ede.tdir/ede.conf b/testdata/ede.tdir/ede.conf
index 13730d42f2c5..639899d13049 100644
--- a/testdata/ede.tdir/ede.conf
+++ b/testdata/ede.tdir/ede.conf
@@ -11,6 +11,7 @@ server:
val-log-level: 2
trust-anchor-file: "bogus/trust-anchors"
+ val-override-date: "20010101020202"
module-config: "respip validator iterator"
diff --git a/testdata/ede.tdir/ede.pre b/testdata/ede.tdir/ede.pre
index e5a0667b0e02..57e15cc5a619 100644
--- a/testdata/ede.tdir/ede.pre
+++ b/testdata/ede.tdir/ede.pre
@@ -4,7 +4,9 @@
# use .tpkg.var.test for in test variable passing
[ -f .tpkg.var.test ] && source .tpkg.var.test
+PRE="../.."
. ../common.sh
+
get_random_port 2
UNBOUND_PORT=$RND_PORT
UNBOUND_PORT2=$(($RND_PORT + 1))
@@ -16,11 +18,7 @@ sed -e 's/@PORT\@/'$UNBOUND_PORT'/' < ede.conf > temp.conf
sed -e 's/@PORT2\@/'$UNBOUND_PORT2'/' < temp.conf > ub.conf
sed -e 's/@PORT2\@/'$UNBOUND_PORT2'/' < ede-auth.conf > ub2.conf
-# create broken dnssec zone
-bogus/make-broken-zone.sh
-
# 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
@@ -30,8 +28,6 @@ $PRE/unbound -d -c ub2.conf > unbound2.log 2>&1 &
UNBOUND_PID2=$!
echo "UNBOUND_PID2=$UNBOUND_PID2" >> .tpkg.var.test
-
cat .tpkg.var.test
wait_unbound_up unbound.log
wait_unbound_up unbound2.log
-
diff --git a/testdata/fetch_glue.rpl b/testdata/fetch_glue.rpl
index 3e9f64f8d1b0..8860d85b0612 100644
--- a/testdata/fetch_glue.rpl
+++ b/testdata/fetch_glue.rpl
@@ -176,36 +176,7 @@ SECTION ADDITIONAL
ns.example.com. IN A 1.2.3.4
ENTRY_END
-; due to ordering of answer packets, this is still outstanding, remove it
-STEP 21 CHECK_OUT_QUERY
-ENTRY_BEGIN
-ADJUST copy_id
-MATCH qname qtype
-REPLY QR
-SECTION QUESTION
-ns.example.com IN AAAA
-ENTRY_END
-
-; some more recursion needed.
-; to finish the NS query
-STEP 40 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-. IN NS
-ENTRY_END
-
-STEP 41 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-. IN NS
-SECTION ANSWER
-. IN NS K.ROOT-SERVERS.NET.
-SECTION AUTHORITY
-SECTION ADDITIONAL
-K.ROOT-SERVERS.NET. IN A 193.0.14.129
-ENTRY_END
+; let (possible) outstanding queries finish resolving
+STEP 21 TRAFFIC
SCENARIO_END
diff --git a/testdata/fetch_glue_cname.rpl b/testdata/fetch_glue_cname.rpl
index 4a86afa50f65..64f00fb20b5f 100644
--- a/testdata/fetch_glue_cname.rpl
+++ b/testdata/fetch_glue_cname.rpl
@@ -155,7 +155,7 @@ ENTRY_END
ENTRY_BEGIN
MATCH opcode qtype qname
ADJUST copy_id
-REPLY QR NOERROR
+REPLY QR AA NOERROR
SECTION QUESTION
ns.example.com. IN AAAA
SECTION AUTHORITY
@@ -188,36 +188,7 @@ SECTION ADDITIONAL
ns.example.com. IN A 1.2.3.4
ENTRY_END
-; due to ordering of answer packets, this is still outstanding, remove it
-STEP 21 CHECK_OUT_QUERY
-ENTRY_BEGIN
-ADJUST copy_id
-MATCH qname qtype
-REPLY QR
-SECTION QUESTION
-ns.example.com IN AAAA
-ENTRY_END
-
-; some more recursion needed.
-; to finish the NS query
-STEP 40 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-. IN NS
-ENTRY_END
-
-STEP 41 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-. IN NS
-SECTION ANSWER
-. IN NS K.ROOT-SERVERS.NET.
-SECTION AUTHORITY
-SECTION ADDITIONAL
-K.ROOT-SERVERS.NET. IN A 193.0.14.129
-ENTRY_END
+; let (possible) outstanding queries finish resolving
+STEP 21 TRAFFIC
SCENARIO_END
diff --git a/testdata/fwd_ancil.tdir/fwd_ancil.post b/testdata/fwd_ancil.tdir/fwd_ancil.post
index 6578151af737..c11bd44cd8a0 100644
--- a/testdata/fwd_ancil.tdir/fwd_ancil.post
+++ b/testdata/fwd_ancil.tdir/fwd_ancil.post
@@ -6,11 +6,6 @@
#
# do your teardown here
. ../common.sh
-if test `hostname`"" = "dicht.nlnetlabs.nl"; then
- echo "In jail, no ::1, skip test"
- exit 0
-fi
-
kill_pid $FWD_PID
if fgrep "service stopped" unbound.log; then
exit 0
diff --git a/testdata/fwd_ancil.tdir/fwd_ancil.pre b/testdata/fwd_ancil.tdir/fwd_ancil.pre
index e1ce37a7fcca..6c0fb7a0b234 100644
--- a/testdata/fwd_ancil.tdir/fwd_ancil.pre
+++ b/testdata/fwd_ancil.tdir/fwd_ancil.pre
@@ -6,8 +6,7 @@
. ../common.sh
if test `hostname`"" = "dicht.nlnetlabs.nl"; then
- echo "In jail, no ::1, skip test"
- exit 0
+ skip_test "In jail, no ::1, skip test"
fi
get_random_port 2
@@ -38,7 +37,6 @@ wait_ldns_testns_up fwd.log
# string 'Start of service' in log.
wait_server_up_or_fail unbound.log "start of service" "disable interface-automatic"
if fgrep "disable interface-automatic" unbound.log; then
- echo "skip test"
- exit 1
+ skip_test "skip test"
fi
diff --git a/testdata/fwd_ancil.tdir/fwd_ancil.test b/testdata/fwd_ancil.tdir/fwd_ancil.test
index b90360fb8b4d..8da4754ce0ac 100644
--- a/testdata/fwd_ancil.tdir/fwd_ancil.test
+++ b/testdata/fwd_ancil.tdir/fwd_ancil.test
@@ -7,11 +7,6 @@
PRE="../.."
. ../common.sh
-if test `hostname`"" = "dicht.nlnetlabs.nl"; then
- echo "In jail, no ::1, skip test"
- exit 0
-fi
-
if fgrep "disable interface-automatic" unbound.log; then
echo "skip test"
exit 0
diff --git a/testdata/ipset.tdir/ipset.post b/testdata/ipset.tdir/ipset.post
index 7af512a4d374..4c4c17b13029 100644
--- a/testdata/ipset.tdir/ipset.post
+++ b/testdata/ipset.tdir/ipset.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define USE_IPSET 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $FWD_PID
kill_pid $UNBOUND_PID
cat unbound.log
diff --git a/testdata/ipset.tdir/ipset.pre b/testdata/ipset.tdir/ipset.pre
index ee1aedc70937..42c94fac45e0 100644
--- a/testdata/ipset.tdir/ipset.pre
+++ b/testdata/ipset.tdir/ipset.pre
@@ -7,7 +7,7 @@
. ../common.sh
PRE="../.."
-if grep "define USE_IPSET 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define USE_IPSET 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 2
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/ipset.tdir/ipset.test b/testdata/ipset.tdir/ipset.test
index 9150e5e3f0bf..4dab457bab90 100644
--- a/testdata/ipset.tdir/ipset.test
+++ b/testdata/ipset.tdir/ipset.test
@@ -6,7 +6,6 @@
. ../common.sh
PRE="../.."
-if grep "define USE_IPSET 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
# Make all the queries. They need to succeed by the way.
echo "> dig www.example.net."
diff --git a/testdata/iter_auth_tc.rpl b/testdata/iter_auth_tc.rpl
new file mode 100644
index 000000000000..4178077249bd
--- /dev/null
+++ b/testdata/iter_auth_tc.rpl
@@ -0,0 +1,138 @@
+; config options
+server:
+ 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.
+CONFIG_END
+
+SCENARIO_BEGIN Test authoritative response with erroneous TC flag
+
+; K.ROOT-SERVERS.NET.
+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
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+ ADDRESS 192.5.6.30
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION ANSWER
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+RANGE_END
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION ANSWER
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns.example.com. IN A
+SECTION ANSWER
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns.example.com. IN AAAA
+SECTION ANSWER
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+; erroneous TC flag here
+REPLY QR TC NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA SERVFAIL
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/iter_emptydp_for_glue.rpl b/testdata/iter_emptydp_for_glue.rpl
index 2e7db65e1402..68fad6f15c6c 100644
--- a/testdata/iter_emptydp_for_glue.rpl
+++ b/testdata/iter_emptydp_for_glue.rpl
@@ -164,11 +164,11 @@ a.gtld-servers.net. IN A 192.5.6.30
ENTRY_END
ENTRY_BEGIN
-MATCH opcode qname
+MATCH opcode subdomain
ADJUST copy_id copy_query
REPLY QR NOERROR
SECTION QUESTION
-ns.example.org. IN A
+example.org. IN A
SECTION AUTHORITY
example.org. NS ns.example.net.
example.org. NS ns.example.org.
diff --git a/testdata/iter_recurse.rpl b/testdata/iter_recurse.rpl
index 181af11079f5..be50b4af8c26 100644
--- a/testdata/iter_recurse.rpl
+++ b/testdata/iter_recurse.rpl
@@ -216,14 +216,7 @@ example.com. IN NS ns.example.net.
;ns.example.net IN A 1.2.3.44
ENTRY_END
-; due to ordering of answer packets, this is still outstanding, remove it
-STEP 21 CHECK_OUT_QUERY
-ENTRY_BEGIN
-ADJUST copy_id
-MATCH qname qtype
-REPLY QR
-SECTION QUESTION
-ns.example.net IN AAAA
-ENTRY_END
+; let (possible) outstanding queries finish resolving
+STEP 21 TRAFFIC
SCENARIO_END
diff --git a/testdata/nss_compile.tdir/nss_compile.dsc b/testdata/nss_compile.tdir/nss_compile.dsc
index 6c59d245fa41..a719a260d0e4 100644
--- a/testdata/nss_compile.tdir/nss_compile.dsc
+++ b/testdata/nss_compile.tdir/nss_compile.dsc
@@ -8,7 +8,7 @@ Component:
CmdDepends:
Depends:
Help:
-Pre:
+Pre: nss_compile.pre
Post:
Test: nss_compile.test
AuxFiles:
diff --git a/testdata/nss_compile.tdir/nss_compile.pre b/testdata/nss_compile.tdir/nss_compile.pre
new file mode 100644
index 000000000000..313f603839e3
--- /dev/null
+++ b/testdata/nss_compile.tdir/nss_compile.pre
@@ -0,0 +1,13 @@
+# #-- nss_compile.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
+if test "`hostname`" = "open.nlnetlabs.nl"; then
+ echo "on open, continue test"
+else
+ skip_test "not on open, no test, do this explicitly"
+fi
+exit 0
diff --git a/testdata/nss_compile.tdir/nss_compile.test b/testdata/nss_compile.tdir/nss_compile.test
index 82b194668fd9..73afd6401f64 100644
--- a/testdata/nss_compile.tdir/nss_compile.test
+++ b/testdata/nss_compile.tdir/nss_compile.test
@@ -4,13 +4,6 @@
# use .tpkg.var.test for in test variable passing
[ -f .tpkg.var.test ] && source .tpkg.var.test
-if test "`hostname`" = "open.nlnetlabs.nl"; then
- echo "on open, continue test"
-else
- echo "not on open, no test, do this explicitly"
- exit 0
-fi
-
. ../common.sh
get_make
PRE="../.."
diff --git a/testdata/padding.tdir/padding.post b/testdata/padding.tdir/padding.post
index 826798a8f4f8..9121ccf257eb 100644
--- a/testdata/padding.tdir/padding.post
+++ b/testdata/padding.tdir/padding.post
@@ -7,7 +7,6 @@
# do your teardown here
. ../common.sh
PRE="../.."
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
kill_pid $DNSTAP_SOCKET_PID
kill_pid $FWD_PID
kill_pid `cat unbound2.pid`
diff --git a/testdata/padding.tdir/padding.pre b/testdata/padding.tdir/padding.pre
index 4a13d0229b11..fdb6386be4d8 100644
--- a/testdata/padding.tdir/padding.pre
+++ b/testdata/padding.tdir/padding.pre
@@ -6,7 +6,7 @@
PRE="../.."
. ../common.sh
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
+if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
get_random_port 5
UNBOUND_PORT=$RND_PORT
diff --git a/testdata/padding.tdir/padding.test b/testdata/padding.tdir/padding.test
index 5111d8139ca9..6161a49ae25d 100644
--- a/testdata/padding.tdir/padding.test
+++ b/testdata/padding.tdir/padding.test
@@ -8,7 +8,6 @@ echo There we go...
PRE="../.."
. ../common.sh
-if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi
echo "> query www.example.com. A"
dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.conf b/testdata/proxy_protocol.tdir/proxy_protocol.conf
new file mode 100644
index 000000000000..c5fa0ab332ff
--- /dev/null
+++ b/testdata/proxy_protocol.tdir/proxy_protocol.conf
@@ -0,0 +1,34 @@
+server:
+ verbosity: 5
+ num-threads: 1
+ interface: 127.0.0.1@@PORT@
+ interface: 127.0.0.1@@PROXYPORT@
+ interface: 127.0.0.1@@PROXYTLSPORT@
+ interface: @INTERFACE_ALLOW_ADDR@@@PORT@
+ interface: @INTERFACE_ALLOW_ADDR@@@PROXYPORT@
+ interface: @INTERFACE_ALLOW_ADDR@@@PROXYTLSPORT@
+ interface: @INTERFACE_REFUSE_ADDR@@@PORT@
+ interface: @INTERFACE_REFUSE_ADDR@@@PROXYPORT@
+ interface: @INTERFACE_REFUSE_ADDR@@@PROXYTLSPORT@
+ proxy-protocol-port: @PROXYPORT@
+ proxy-protocol-port: @PROXYTLSPORT@
+ tls-port: @PROXYTLSPORT@
+ use-syslog: no
+ directory: .
+ pidfile: "unbound.pid"
+ chroot: ""
+ username: ""
+ do-not-query-localhost: no
+ tls-service-key: "unbound_server.key"
+ tls-service-pem: "unbound_server.pem"
+
+ # 127.0.0.0/8 is allowed by default.
+ access-control: @CLIENT_ADDR_ALLOW@/32 allow
+ access-control: @CLIENT_ADDR_REFUSE@/32 refuse
+ access-control: @CLIENT_ADDR_ALLOW6@/128 allow
+ access-control: @CLIENT_ADDR_REFUSE6@/128 refuse
+ access-control: @INTERFACE_ALLOW_ADDR@/32 allow
+
+forward-zone:
+ name: "."
+ forward-addr: "127.0.0.1@@TOPORT@"
diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.dsc b/testdata/proxy_protocol.tdir/proxy_protocol.dsc
new file mode 100644
index 000000000000..34155f0350d9
--- /dev/null
+++ b/testdata/proxy_protocol.tdir/proxy_protocol.dsc
@@ -0,0 +1,16 @@
+BaseName: proxy_protocol
+Version: 1.0
+Description: Test proxy protocol
+CreationDate: Mon Mar 14 16:17:00 CET 2022
+Maintainer: Yorgos Thessalonikefs
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre: proxy_protocol.pre
+Post: proxy_protocol.post
+Test: proxy_protocol.test
+AuxFiles:
+Passed:
+Failure:
diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.post b/testdata/proxy_protocol.tdir/proxy_protocol.post
new file mode 100644
index 000000000000..cbf56bbd924c
--- /dev/null
+++ b/testdata/proxy_protocol.tdir/proxy_protocol.post
@@ -0,0 +1,12 @@
+# #-- proxy_protocol.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
+cat unbound.log
+exit 0
diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.pre b/testdata/proxy_protocol.tdir/proxy_protocol.pre
new file mode 100644
index 000000000000..01cf357f53b7
--- /dev/null
+++ b/testdata/proxy_protocol.tdir/proxy_protocol.pre
@@ -0,0 +1,66 @@
+# #-- proxy_protocol.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
+
+PRE="../.."
+. ../common.sh
+
+# This test uses the unshare utility
+if test ! -x "`which unshare 2>&1`"; then
+ skip_test "no unshare (from util-linux package) available, skip test"
+fi
+
+get_make
+(cd $PRE; $MAKE streamtcp)
+
+get_random_port 4
+UNBOUND_PORT=$RND_PORT
+FWD_PORT=$(($RND_PORT + 1))
+PROXY_PORT=$(($RND_PORT + 2))
+PROXY_TLS_PORT=$(($RND_PORT + 3))
+
+INTERFACE_ALLOW=eth123
+INTERFACE_ALLOW_ADDR=10.1.2.3
+INTERFACE_REFUSE=eth234
+INTERFACE_REFUSE_ADDR=10.2.3.4
+
+CLIENT_ADDR_ALLOW=1.2.3.4
+CLIENT_ADDR_ALLOW6=2001:db8::cafe:cafe
+CLIENT_ADDR_REFUSE=5.6.7.8
+CLIENT_ADDR_REFUSE6=2001:db8::dead:beef
+
+# make config file
+sed \
+ -e 's/@PORT\@/'$UNBOUND_PORT'/' \
+ -e 's/@TOPORT\@/'$FWD_PORT'/' \
+ -e 's/@PROXYPORT\@/'$PROXY_PORT'/' \
+ -e 's/@PROXYTLSPORT\@/'$PROXY_TLS_PORT'/' \
+ -e 's/@INTERFACE_ALLOW_ADDR\@/'$INTERFACE_ALLOW_ADDR'/' \
+ -e 's/@INTERFACE_REFUSE_ADDR\@/'$INTERFACE_REFUSE_ADDR'/' \
+ -e 's/@CLIENT_ADDR_ALLOW\@/'$CLIENT_ADDR_ALLOW'/' \
+ -e 's/@CLIENT_ADDR_ALLOW6\@/'$CLIENT_ADDR_ALLOW6'/' \
+ -e 's/@CLIENT_ADDR_REFUSE\@/'$CLIENT_ADDR_REFUSE'/' \
+ -e 's/@CLIENT_ADDR_REFUSE6\@/'$CLIENT_ADDR_REFUSE6'/' \
+ < proxy_protocol.conf > ub.conf
+
+if test -x "`which bash`"; then
+ shell="bash"
+else
+ shell="sh"
+fi
+
+echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test
+echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test
+echo "PROXY_PORT=$PROXY_PORT" >> .tpkg.var.test
+echo "PROXY_TLS_PORT=$PROXY_TLS_PORT" >> .tpkg.var.test
+echo "INTERFACE_ALLOW=$INTERFACE_ALLOW" >> .tpkg.var.test
+echo "INTERFACE_ALLOW_ADDR=$INTERFACE_ALLOW_ADDR" >> .tpkg.var.test
+echo "INTERFACE_REFUSE=$INTERFACE_REFUSE" >> .tpkg.var.test
+echo "INTERFACE_REFUSE_ADDR=$INTERFACE_REFUSE_ADDR" >> .tpkg.var.test
+echo "CLIENT_ADDR_ALLOW=$CLIENT_ADDR_ALLOW" >> .tpkg.var.test
+echo "CLIENT_ADDR_ALLOW6=$CLIENT_ADDR_ALLOW6" >> .tpkg.var.test
+echo "CLIENT_ADDR_REFUSE=$CLIENT_ADDR_REFUSE" >> .tpkg.var.test
+echo "CLIENT_ADDR_REFUSE6=$CLIENT_ADDR_REFUSE6" >> .tpkg.var.test
+echo "shell=$shell" >> .tpkg.var.test
diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.test b/testdata/proxy_protocol.tdir/proxy_protocol.test
new file mode 100644
index 000000000000..3f65e293267d
--- /dev/null
+++ b/testdata/proxy_protocol.tdir/proxy_protocol.test
@@ -0,0 +1,12 @@
+# #-- proxy_protocol.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
+
+PRE="../.."
+. ../common.sh
+
+# Run the scenario in an unshared namespace
+unshare -rUn $shell proxy_protocol.test.scenario
+exit $?
diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.test.scenario b/testdata/proxy_protocol.tdir/proxy_protocol.test.scenario
new file mode 100644
index 000000000000..0b8fe6efad22
--- /dev/null
+++ b/testdata/proxy_protocol.tdir/proxy_protocol.test.scenario
@@ -0,0 +1,193 @@
+# #-- proxy_protocol.test.scenario --#
+# 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
+
+PRE="../.."
+. ../common.sh
+
+ip addr add 127.0.0.1 dev lo
+ip link set lo up
+
+ip link add $INTERFACE_ALLOW type dummy
+ip addr add $INTERFACE_ALLOW_ADDR dev $INTERFACE_ALLOW
+ip link set $INTERFACE_ALLOW up
+
+ip link add $INTERFACE_REFUSE type dummy
+ip addr add $INTERFACE_REFUSE_ADDR dev $INTERFACE_REFUSE
+ip link set $INTERFACE_REFUSE up
+
+# start forwarder in the background
+get_ldns_testns
+$LDNS_TESTNS -p $FWD_PORT proxy_protocol.testns >fwd.log 2>&1 &
+FWD_PID=$!
+echo "FWD_PID=$FWD_PID" >> .tpkg.var.test
+
+# start unbound in the background
+$PRE/unbound -d -c ub.conf >unbound.log 2>&1 &
+UNBOUND_PID=$!
+echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test
+
+wait_ldns_testns_up fwd.log
+wait_unbound_up unbound.log
+
+# call streamtcp and check return value
+do_streamtcp () {
+ $PRE/streamtcp $* A IN >outfile 2>&1
+ if test "$?" -ne 0; then
+ echo "exit status not OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat unbound.log
+ echo "Not OK"
+ exit 1
+ fi
+}
+
+send_query () {
+ server=$1
+ client=$2
+ prot=$3
+ query=$4
+ echo -n "> query $query to $server"
+ port=$UNBOUND_PORT
+ if test ! -z "$client"; then
+ port=$PROXY_PORT
+ fi
+ case $prot in
+ -u)
+ echo -n " (over UDP)"
+ ;;
+ -s)
+ echo -n " (over TLS)"
+ port=$PROXY_TLS_PORT
+ ;;
+ *)
+ echo -n " (over TCP)"
+ esac
+ if test ! -z "$client"; then
+ echo -n " ($client proxied)"
+ fi
+ echo
+ do_streamtcp $prot -f $server@$port $client $query
+ #cat outfile
+}
+
+expect_answer () {
+ #query=$1
+ #answer=$2
+ if grep "$query" outfile | grep "$answer"; then
+ echo "content OK"
+ echo
+ else
+ echo "> cat logfiles"
+ cat outfile
+ cat unbound.log
+ echo "result contents not OK"
+ exit 1
+ fi
+}
+
+expect_refuse () {
+ if grep "rcode: REFUSE" outfile; then
+ echo "content OK"
+ echo
+ else
+ echo "> cat logfiles"
+ cat outfile
+ cat unbound.log
+ echo "result contents not OK"
+ exit 1
+ fi
+}
+
+# Start the test
+
+# Query without PROXYv2
+# Client localhost
+# Expect the result back
+server=127.0.0.1
+client=""
+query="two.example.net."
+answer="2.2.2.2"
+for prot in "-u" ""; do
+ send_query "$server" "$client" "$prot" "$query"
+ expect_answer
+done
+
+# Query with PROXYv2
+# Client $CLIENT_ADDR_ALLOW should be allowed
+# Expect the result back
+server=127.0.0.1
+client="-p $CLIENT_ADDR_ALLOW@1234"
+query="one.example.net."
+answer="1.1.1.1"
+for prot in "-u" "" "-s"; do
+ send_query "$server" "$client" "$prot" "$query"
+ expect_answer
+done
+
+# Query with PROXYv2
+# Client $CLIENT_ADDR_ALLOW6 should be allowed
+# Expect the result back
+server=127.0.0.1
+client="-p $CLIENT_ADDR_ALLOW6@1234"
+query="one.example.net."
+answer="1.1.1.1"
+for prot in "-u" "" "-s"; do
+ send_query "$server" "$client" "$prot" "$query"
+ expect_answer
+done
+
+# Query with PROXYv2
+# Client $CLIENT_ADDR_REFUSE should be refused
+# Expect the REFUSE back
+server=127.0.0.1
+client="-p $CLIENT_ADDR_REFUSE"
+query="one.example.net."
+answer=""
+for prot in "-u" "" "-s"; do
+ send_query "$server" "$client" "$prot" "$query"
+ expect_refuse
+done
+
+# Query with PROXYv2
+# Client $CLIENT_ADDR_REFUSE6 should be refused
+# Expect the REFUSE back
+server=127.0.0.1
+client="-p $CLIENT_ADDR_REFUSE6"
+query="one.example.net."
+answer=""
+for prot in "-u" "" "-s"; do
+ send_query "$server" "$client" "$prot" "$query"
+ expect_refuse
+done
+
+# Query with PROXYv2
+# Client $CLIENT_ADDR_ALLOW should be allowed; proxy source address should be allowed
+# Expect the result back
+server=$INTERFACE_ALLOW_ADDR
+client="-p $CLIENT_ADDR_ALLOW@1234"
+query="one.example.net."
+answer="1.1.1.1"
+for prot in "-u" "" "-s"; do
+ send_query "$server" "$client" "$prot" "$query"
+ expect_answer
+done
+
+# Query with PROXYv2
+# Client $CLIENT_ADDR_ALLOW should be allowed; proxy source address should be refused
+# Expect the REFUSE back
+server=$INTERFACE_REFUSE_ADDR
+client="-p $CLIENT_ADDR_ALLOW@1234"
+query="one.example.net."
+answer=""
+for prot in "-u" "" "-s"; do
+ send_query "$server" "$client" "$prot" "$query"
+ expect_refuse
+done
+
+echo "OK"
+exit 0
+
diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.testns b/testdata/proxy_protocol.tdir/proxy_protocol.testns
new file mode 100644
index 000000000000..176bc936a260
--- /dev/null
+++ b/testdata/proxy_protocol.tdir/proxy_protocol.testns
@@ -0,0 +1,23 @@
+; nameserver test file
+$ORIGIN example.net.
+$TTL 3600
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR RD RA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+one IN A
+SECTION ANSWER
+one IN A 1.1.1.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR RD RA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+two IN A
+SECTION ANSWER
+two IN A 2.2.2.2
+ENTRY_END
diff --git a/testdata/proxy_protocol.tdir/unbound_server.key b/testdata/proxy_protocol.tdir/unbound_server.key
new file mode 100644
index 000000000000..370a7bbb2f22
--- /dev/null
+++ b/testdata/proxy_protocol.tdir/unbound_server.key
@@ -0,0 +1,39 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIG5AIBAAKCAYEAvjSVSN2QMXudpzukdLCqgg/IOhCX8KYkD0FFFfWcQjgKq5wI
+0x41iG32a6wbGanre4IX7VxaSPu9kkHfnGgynCk5nwDRedE/FLFhAU78PoT0+Nqq
+GRS7XVQ24vLmIz9Hqc2Ozx1um1BXBTmIT0UfN2e22I0LWQ6a3seZlEDRj45gnk7Z
+uh9MDgotaBdm+v1JAbupSf6Zis4VEH3JNdvVGE3O1DHEIeuuz/3BDhpf6WBDH+8K
+WaBe1ca4TZHr9ThL2gEMEfAQl0wXDwRWRoi3NjNMH+mw0L1rjwThI5GXqNIee7o5
+FzUReSXZuTdFMyGe3Owcx+XoYnwi6cplSNoGsDBu4B9bKKglR9YleJVw4L4Xi8xP
+q6O9UPj4+nypHk/DOoC7DIM3ufN0yxPBsFo5TVowxfhdjZXJbbftd2TZv7AH8+XL
+A5UoZgRzXgzECelXSCTBFlMTnT48LfA9pMLydyjAz2UdPHs5Iv+TK5nnI+aJoeaP
+7kFZSngxdy1+A/bNAgMBAAECggGBALpTOIqQwVg4CFBylL/a8K1IWJTI/I65sklf
+XxYL7G7SB2HlEJ//z+E+F0+S4Vlao1vyLQ5QkgE82pAUB8FoMWvY1qF0Y8A5wtm6
+iZSGk4OLK488ZbT8Ii9i+AGKgPe2XbVxsJwj8N4k7Zooqec9hz73Up8ATEWJkRz7
+2u7oMGG4z91E0PULA64dOi3l/vOQe5w/Aa+CwVbAWtI05o7kMvQEBMDJn6C7CByo
+MB5op9wueJMnz7PM7hns+U7Dy6oE4ljuolJUy51bDzFWwoM54cRoQqLFNHd8JVQj
+WxldCkbfF43iyprlsEcUrTyUjtdA+ZeiG39vg/mtdmgNpGmdupHJZQvSuG8IcVlz
+O+eMSeQS1QXPD6Ik8UK4SU0h+zOl8xIWtRrsxQuh4fnTN40udm/YUWl/6gOebsBI
+IrVLlKGqJSfB3tMjpCRqdTzJ0dA9keVpkqm2ugZkxEf1+/efq/rFIQ2pUBLCqNTN
+qpNqruK8y8FphP30I2uI4Ej2UIB8AQKBwQDd2Yptj2FyDyaXCycsyde0wYkNyzGU
+dRnzdibfHnMZwjgTjwAwgIUBVIS8H0/z7ZJQKN7osJfddMrtjJtYYUk9g/dCpHXs
+bNh2QSoWah3FdzNGuWd0iRf9+LFxhjAAMo/FS8zFJAJKrFsBdCGTfFUMdsLC0bjr
+YjiWBuvV72uKf8XIZX5KIZruKdWBBcWukcb21R1UDyFYyXRBsly5XHaIYKZql3km
+7pV7MKWO0IYgHbHIqGUqPQlzZ/lkunS1jKECgcEA23wHffD6Ou9/x3okPx2AWpTr
+gh8rgqbyo6hQkBW5Y90Wz824cqaYebZDaBR/xlVx/YwjKkohv8Bde2lpH/ZxRZ1Z
+5Sk2s6GJ/vU0L9RsJZgCgj4L6Coal1NMxuZtCXAlnOpiCdxSZgfqbshbTVz30KsG
+ZJG361Cua1ScdAHxlZBxT52/1Sm0zRC2hnxL7h4qo7Idmtzs40LAJvYOKekR0pPN
+oWeJfra7vgx/jVNvMFWoOoSLpidVO4g+ot4ery6tAoHAdW3rCic1C2zdnmH28Iw+
+s50l8Lk3mz+I5wgJd1zkzCO0DxZIoWPGA3g7cmCYr6N3KRsZMs4W9NAXgjpFGDkW
+zYsG3K21BdpvkdjYcFjnPVjlOXB2RIc0vehf9Jl02wXoeCSxVUDEPcaRvWk9RJYx
+ZpGOchUU7vNkxHURbIJ4yCzuAi9G8/Jp0dsu+kaV5tufF5SjG5WOrzKjaQsCbdN1
+oqaWMCHRrTvov/Z2C+xwsptFOdN5CSyZzg6hQiI4GMlBAoHAXyb6KINcOEi0YMp3
+BFXJ23tMTnEs78tozcKeipigcsbaqORK3omS+NEnj+uzKUzJyl4CsMbKstK2tFYS
+mSTCHqgE3PBtIpsZtEqhgUraR8IK9GPpzZDTTl9ynZgwFTNlWw3RyuyVXF56J+T8
+kCGJ3hEHCHqT/ZRQyX85BKIDFhA0z4tYKxWVqIFiYBNq56R0X9tMMmMs36mEnF93
+7Ht6mowxTZQRa7nU0qOgeKh/P7ki4Zus3y+WJ+T9IqahLtlRAoHBAIhqMrcxSAB8
+RpB9jukJlAnidw2jCMPgrFE8tP0khhVvGrXMldxAUsMKntDIo8dGCnG1KTcWDI0O
+jepvSPHSsxVLFugL79h0eVIS5z4huW48i9xgU8VlHdgAcgEPIAOFcOw2BCu/s0Vp
+O+MM/EyUOdo3NsibB3qc/GJI6iNBYS7AljYEVo6rXo5V/MZvZUF4vClen6Obzsre
+MTTb+4sJjfqleWuvr1XNMeu2mBfXBQkWGZP1byBK0MvD/aQ2PWq92A==
+-----END RSA PRIVATE KEY-----
diff --git a/testdata/proxy_protocol.tdir/unbound_server.pem b/testdata/proxy_protocol.tdir/unbound_server.pem
new file mode 100644
index 000000000000..986807310f2b
--- /dev/null
+++ b/testdata/proxy_protocol.tdir/unbound_server.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDqzCCAhMCFBHWXeQ6ZIa9QcQbXLFfC6tj+KA+MA0GCSqGSIb3DQEBCwUAMBIx
+EDAOBgNVBAMMB3VuYm91bmQwHhcNMjAwNzA4MTMzMjI5WhcNNDAwMzI1MTMzMjI5
+WjASMRAwDgYDVQQDDAd1bmJvdW5kMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
+igKCAYEAvjSVSN2QMXudpzukdLCqgg/IOhCX8KYkD0FFFfWcQjgKq5wI0x41iG32
+a6wbGanre4IX7VxaSPu9kkHfnGgynCk5nwDRedE/FLFhAU78PoT0+NqqGRS7XVQ2
+4vLmIz9Hqc2Ozx1um1BXBTmIT0UfN2e22I0LWQ6a3seZlEDRj45gnk7Zuh9MDgot
+aBdm+v1JAbupSf6Zis4VEH3JNdvVGE3O1DHEIeuuz/3BDhpf6WBDH+8KWaBe1ca4
+TZHr9ThL2gEMEfAQl0wXDwRWRoi3NjNMH+mw0L1rjwThI5GXqNIee7o5FzUReSXZ
+uTdFMyGe3Owcx+XoYnwi6cplSNoGsDBu4B9bKKglR9YleJVw4L4Xi8xPq6O9UPj4
++nypHk/DOoC7DIM3ufN0yxPBsFo5TVowxfhdjZXJbbftd2TZv7AH8+XLA5UoZgRz
+XgzECelXSCTBFlMTnT48LfA9pMLydyjAz2UdPHs5Iv+TK5nnI+aJoeaP7kFZSngx
+dy1+A/bNAgMBAAEwDQYJKoZIhvcNAQELBQADggGBABunf93MKaCUHiZgnoOTinsW
+84/EgInrgtKzAyH+BhnKkJOhhR0kkIAx5d9BpDlaSiRTACFon9moWCgDIIsK/Ar7
+JE0Kln9cV//wiiNoFU0O4mnzyGUIMvlaEX6QHMJJQYvL05+w/3AAcf5XmMJtR5ca
+fJ8FqvGC34b2WxX9lTQoyT52sRt+1KnQikiMEnEyAdKktMG+MwKsFDdOwDXyZhZg
+XZhRrfX3/NVJolqB6EahjWIGXDeKuSSKZVtCyib6LskyeMzN5lcRfvubKDdlqFVF
+qlD7rHBsKhQUWK/IO64mGf7y/de+CgHtED5vDvr/p2uj/9sABATfbrOQR3W/Of25
+sLBj4OEfrJ7lX8hQgFaxkMI3x6VFT3W8dTCp7xnQgb6bgROWB5fNEZ9jk/gjSRmD
+yIU+r0UbKe5kBk/CmZVFXL2TyJ92V5NYEQh8V4DGy19qZ6u/XKYyNJL4ocs35GGe
+CA8SBuyrmdhx38h1RHErR2Skzadi1S7MwGf1y431fQ==
+-----END CERTIFICATE-----
diff --git a/testdata/pylib.tdir/pylib.post b/testdata/pylib.tdir/pylib.post
index 875e06d0ae34..8dbde8d2efd6 100644
--- a/testdata/pylib.tdir/pylib.post
+++ b/testdata/pylib.tdir/pylib.post
@@ -8,13 +8,6 @@
PRE="../.."
. ../common.sh
-# if no python; exit
-if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then
- echo "have pyunbound"
-else
- echo "no pyunbound"
- exit 0
-fi
# kill fwder
kill_pid $FWD_PID
diff --git a/testdata/pylib.tdir/pylib.pre b/testdata/pylib.tdir/pylib.pre
index 30e0059064ab..3a74b6019c3d 100644
--- a/testdata/pylib.tdir/pylib.pre
+++ b/testdata/pylib.tdir/pylib.pre
@@ -10,8 +10,7 @@ PRE="../.."
if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then
echo "have pyunbound"
else
- echo "no pyunbound"
- exit 0
+ skip_test "no pyunbound"
fi
# Copy the required libraries
diff --git a/testdata/pylib.tdir/pylib.test b/testdata/pylib.tdir/pylib.test
index 59f996459c17..a583daba4727 100644
--- a/testdata/pylib.tdir/pylib.test
+++ b/testdata/pylib.tdir/pylib.test
@@ -5,13 +5,6 @@
[ -f .tpkg.var.test ] && source .tpkg.var.test
PRE="../.."
-if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then
- echo "have pyunbound"
-else
- echo "no pyunbound"
- exit 0
-fi
-
if test "`uname 2>&1`" = "Darwin"; then
echo export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:../../.libs"
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:../../.libs"
diff --git a/testdata/pymod.tdir/pymod.post b/testdata/pymod.tdir/pymod.post
index 368d285edab2..5449ad47438b 100644
--- a/testdata/pymod.tdir/pymod.post
+++ b/testdata/pymod.tdir/pymod.post
@@ -8,13 +8,6 @@
PRE="../.."
. ../common.sh
-# if no python; exit
-if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then
- echo "have python module"
-else
- echo "no python module"
- exit 0
-fi
kill_pid $FWD_PID
kill_pid $UNBOUND_PID
diff --git a/testdata/pymod.tdir/pymod.pre b/testdata/pymod.tdir/pymod.pre
index 9029a8742337..f845d6f979f2 100644
--- a/testdata/pymod.tdir/pymod.pre
+++ b/testdata/pymod.tdir/pymod.pre
@@ -10,8 +10,7 @@ PRE="../.."
if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then
echo "have python module"
else
- echo "no python module"
- exit 0
+ skip_test "no python module"
fi
# get module python local
cp $PRE/pythonmod/unboundmodule.py .
diff --git a/testdata/pymod.tdir/pymod.test b/testdata/pymod.tdir/pymod.test
index 43bf6e65f87f..5ea87282b6f7 100644
--- a/testdata/pymod.tdir/pymod.test
+++ b/testdata/pymod.tdir/pymod.test
@@ -5,12 +5,6 @@
[ -f .tpkg.var.test ] && source .tpkg.var.test
PRE="../.."
-if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then
- echo "have python module"
-else
- echo "no python module"
- exit 0
-fi
if test "`uname 2>&1`" = "Darwin"; then
ldnsdir=`grep ldnsdir= ../../Makefile | sed -e 's/ldnsdir=//'`
diff --git a/testdata/pymod_thread.tdir/pymod_thread.post b/testdata/pymod_thread.tdir/pymod_thread.post
index e9b307548ba7..b438958b26e3 100644
--- a/testdata/pymod_thread.tdir/pymod_thread.post
+++ b/testdata/pymod_thread.tdir/pymod_thread.post
@@ -8,13 +8,6 @@
PRE="../.."
. ../common.sh
-# if no python; exit
-if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then
- echo "have python module"
-else
- echo "no python module"
- exit 0
-fi
kill_pid $FWD_PID
kill_pid $UNBOUND_PID
diff --git a/testdata/pymod_thread.tdir/pymod_thread.pre b/testdata/pymod_thread.tdir/pymod_thread.pre
index c16362a0b3fb..79fdc0375ad4 100644
--- a/testdata/pymod_thread.tdir/pymod_thread.pre
+++ b/testdata/pymod_thread.tdir/pymod_thread.pre
@@ -10,8 +10,7 @@ PRE="../.."
if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then
echo "have python module"
else
- echo "no python module"
- exit 0
+ skip_test "no python module"
fi
# get module python local
cp $PRE/pythonmod/unboundmodule.py .
diff --git a/testdata/pymod_thread.tdir/pymod_thread.test b/testdata/pymod_thread.tdir/pymod_thread.test
index c6baa01be842..7c55d19ab49e 100644
--- a/testdata/pymod_thread.tdir/pymod_thread.test
+++ b/testdata/pymod_thread.tdir/pymod_thread.test
@@ -5,12 +5,6 @@
[ -f .tpkg.var.test ] && source .tpkg.var.test
PRE="../.."
-if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then
- echo "have python module"
-else
- echo "no python module"
- exit 0
-fi
if test "`uname 2>&1`" = "Darwin"; then
ldnsdir=`grep ldnsdir= ../../Makefile | sed -e 's/ldnsdir=//'`
diff --git a/testdata/root_anchor.tdir/root_anchor.dsc b/testdata/root_anchor.tdir/root_anchor.dsc
index daf231da58de..2ea179e89103 100644
--- a/testdata/root_anchor.tdir/root_anchor.dsc
+++ b/testdata/root_anchor.tdir/root_anchor.dsc
@@ -8,7 +8,7 @@ Component:
CmdDepends:
Depends:
Help:
-Pre:
+Pre: root_anchor.pre
Post:
Test: root_anchor.test
AuxFiles:
diff --git a/testdata/root_anchor.tdir/root_anchor.pre b/testdata/root_anchor.tdir/root_anchor.pre
new file mode 100644
index 000000000000..0357646cdd5a
--- /dev/null
+++ b/testdata/root_anchor.tdir/root_anchor.pre
@@ -0,0 +1,11 @@
+# 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
+
+# only do this test if the network is up.
+if dig @k.root-servers.net . SOA 2>&1 | grep NOERROR ; then
+ :
+else
+ skip_test "network is not up"
+fi
diff --git a/testdata/root_anchor.tdir/root_anchor.test b/testdata/root_anchor.tdir/root_anchor.test
index f75dadf67871..bbff028beb58 100644
--- a/testdata/root_anchor.tdir/root_anchor.test
+++ b/testdata/root_anchor.tdir/root_anchor.test
@@ -5,15 +5,6 @@
PRE="../.."
-# only do this test if the network is up.
-echo "is the net up?"
-if dig @k.root-servers.net . SOA 2>&1 | grep NOERROR ; then
- echo yes
-else
- echo no
- exit 0
-fi
-
# test that unbound-anchor, its builtin DNSKEY, works.
# so the https is disabled (go to 127.0.0.1@10099).
$PRE/unbound-anchor -u "127.0.0.1" -P 10099 -a test.ds -v
diff --git a/testdata/root_hints.tdir/root_hints.dsc b/testdata/root_hints.tdir/root_hints.dsc
index 5576fbaf942a..c01f29074029 100644
--- a/testdata/root_hints.tdir/root_hints.dsc
+++ b/testdata/root_hints.tdir/root_hints.dsc
@@ -8,7 +8,7 @@ Component:
CmdDepends:
Depends:
Help:
-Pre:
+Pre: root_hints.pre
Post:
Test: root_hints.test
AuxFiles:
diff --git a/testdata/root_hints.tdir/root_hints.pre b/testdata/root_hints.tdir/root_hints.pre
new file mode 100644
index 000000000000..a756693121ab
--- /dev/null
+++ b/testdata/root_hints.tdir/root_hints.pre
@@ -0,0 +1,11 @@
+# #-- root_hints.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
+
+# dig 9 ?
+digv=`dig -v 2>&1 | wc -l`
+if test $digv -ne 1; then
+ skip_test "Dig too old. skip test"
+fi
diff --git a/testdata/root_hints.tdir/root_hints.test b/testdata/root_hints.tdir/root_hints.test
index 6ae4ec7f4677..a5c1dc195390 100644
--- a/testdata/root_hints.tdir/root_hints.test
+++ b/testdata/root_hints.tdir/root_hints.test
@@ -1,4 +1,4 @@
-# #-- 06-ianaports.test --#
+# #-- root_hints.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
@@ -6,13 +6,6 @@
PRE="../.."
-# dig 9 ?
-digv=`dig -v 2>&1 | wc -l`
-if test $digv -ne 1; then
- echo "Dig too old. skip test"
- exit 0
-fi
-
eval `grep ^srcdir= $PRE/Makefile`
echo "srcdir="$srcdir
diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.conf b/testdata/stub_auth_tc.tdir/stub_auth_tc.conf
new file mode 100644
index 000000000000..b74942799001
--- /dev/null
+++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.conf
@@ -0,0 +1,16 @@
+server:
+ verbosity: 4
+ # num-threads: 1
+ interface: 127.0.0.1
+ port: @PORT@
+ use-syslog: no
+ directory: .
+ pidfile: "unbound.pid"
+ chroot: ""
+ username: ""
+ do-not-query-localhost: no
+
+stub-zone:
+ name: "example.com"
+ stub-addr: "127.0.0.1@@TOPORT@"
+
diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.dsc b/testdata/stub_auth_tc.tdir/stub_auth_tc.dsc
new file mode 100644
index 000000000000..1f71961f1d15
--- /dev/null
+++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.dsc
@@ -0,0 +1,16 @@
+BaseName: stub_auth_tc
+Version: 1.0
+Description: Authority reply with erroneous TC in TCP
+CreationDate: Mon Oct 3 09:11:32 CEST 2022
+Maintainer: dr. W.C.A. Wijngaards
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre: stub_auth_tc.pre
+Post: stub_auth_tc.post
+Test: stub_auth_tc.test
+AuxFiles:
+Passed:
+Failure:
diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.post b/testdata/stub_auth_tc.tdir/stub_auth_tc.post
new file mode 100644
index 000000000000..907a885e4653
--- /dev/null
+++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.post
@@ -0,0 +1,11 @@
+# #-- stub_auth_tc.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/stub_auth_tc.tdir/stub_auth_tc.pre b/testdata/stub_auth_tc.tdir/stub_auth_tc.pre
new file mode 100644
index 000000000000..2f7e317bc315
--- /dev/null
+++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.pre
@@ -0,0 +1,31 @@
+# #-- stub_auth_tc.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 stub_auth_tc.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'/' < stub_auth_tc.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/stub_auth_tc.tdir/stub_auth_tc.test b/testdata/stub_auth_tc.tdir/stub_auth_tc.test
new file mode 100644
index 000000000000..7b7440274a60
--- /dev/null
+++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.test
@@ -0,0 +1,26 @@
+# #-- stub_auth_tc.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
+
+PRE="../.."
+# do the test
+echo "> dig www.example.com."
+dig @localhost -p $UNBOUND_PORT www.example.com. | tee outfile
+echo "> cat logfiles"
+cat fwd.log
+cat unbound.log
+echo "> check answer"
+if grep "SERVFAIL" outfile; then
+ echo "OK"
+else
+ echo "Not OK"
+ exit 1
+fi
+if grep "flags:" outfile | grep " tc "; then
+ echo "Not OK, TC flag in output"
+ exit 1
+fi
+
+exit 0
diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.testns b/testdata/stub_auth_tc.tdir/stub_auth_tc.testns
new file mode 100644
index 000000000000..f2829add418d
--- /dev/null
+++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.testns
@@ -0,0 +1,26 @@
+; nameserver test file
+$ORIGIN example.com.
+$TTL 3600
+
+ENTRY_BEGIN
+MATCH opcode qtype qname UDP
+REPLY QR AA TC NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www IN A
+SECTION ANSWER
+www IN A 10.20.30.40
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname TCP
+; erroneous TC flag here.
+REPLY QR AA TC NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www IN A
+SECTION ANSWER
+www IN A 10.20.30.40
+www IN A 10.20.30.41
+www IN A 10.20.30.42
+ENTRY_END
diff --git a/testdata/subnet_scopezero.crpl b/testdata/subnet_scopezero.crpl
new file mode 100644
index 000000000000..e0065142265a
--- /dev/null
+++ b/testdata/subnet_scopezero.crpl
@@ -0,0 +1,439 @@
+; scope of 0, if the query also had scope of 0, do not answer this
+; to everyone, but only for scope 0 queries. Otherwise can answer cached.
+
+server:
+ target-fetch-policy: "0 0 0 0 0"
+ send-client-subnet: 1.2.3.4
+ module-config: "subnetcache validator iterator"
+ verbosity: 4
+ qname-minimisation: no
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129
+
+stub-zone:
+ name: "example.com"
+ stub-addr: 1.2.3.4
+CONFIG_END
+
+SCENARIO_BEGIN Test subnet cache with scope zero queries and responses.
+
+; the upstream server.
+RANGE_BEGIN 0 100
+ ADDRESS 193.0.14.129
+
+ENTRY_BEGIN
+MATCH opcode qtype qname ednsdata
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ ;; we expect to receive empty
+HEX_EDNSDATA_END
+K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ENTRY_END
+RANGE_END
+
+RANGE_BEGIN 0 11
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+;copy_ednsdata_assume_clientsubnet
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ ; client is 127.0.0.1
+ 00 08 ; OPC
+ 00 07 ; option length
+ 00 01 ; Family
+ 18 11 ; source mask, scopemask
+ 7f 00 00 ; address
+HEX_EDNSDATA_END
+ENTRY_END
+RANGE_END
+
+RANGE_BEGIN 20 31
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+;copy_ednsdata_assume_clientsubnet
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.41
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ ; client is 127.0.0.1
+ 00 08 ; OPC
+ 00 07 ; option length
+ 00 01 ; Family
+ 18 11 ; source mask, scopemask
+ 7f 01 00 ; address
+HEX_EDNSDATA_END
+ENTRY_END
+RANGE_END
+
+RANGE_BEGIN 40 51
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+;copy_ednsdata_assume_clientsubnet
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.42
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ 00 08 ; OPC
+ 00 04 ; option length
+ 00 01 ; Family
+ 00 00 ; source mask, scopemask
+ ; address 0.0.0.0/0 scope 0
+HEX_EDNSDATA_END
+ENTRY_END
+RANGE_END
+
+RANGE_BEGIN 120 131
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+;copy_ednsdata_assume_clientsubnet
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.43
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ 00 08 ; OPC
+ 00 07 ; option length
+ 00 01 ; Family
+ 18 00 ; source mask, scopemask
+ 7f 02 00 ; address 127.2.0.0/24 scope 0
+HEX_EDNSDATA_END
+ENTRY_END
+RANGE_END
+
+; query for 127.0.0.0/24
+STEP 1 QUERY
+ENTRY_BEGIN
+HEX_ANSWER_BEGIN
+ 00 00 01 00 00 01 00 00 ;ID 0
+ 00 00 00 01 03 77 77 77 ; www.example.com A? (DO)
+ 07 65 78 61 6d 70 6c 65
+ 03 63 6f 6d 00 00 01 00
+ 01 00 00 29 10 00 00 00
+ 80 00 00 0b
+
+ 00 08 00 07 ; OPC, optlen
+ 00 01 18 00 ; ip4, scope 24, source 0
+ 7f 00 00 ;127.0.0.0/24
+HEX_ANSWER_END
+ENTRY_END
+
+; answer is 10.20.30.40 for 127.0.0.0/24 scope 17
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ednsdata
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ ; client is 127.0.0.1
+ 00 08 ; OPC
+ 00 07 ; option length
+ 00 01 ; Family
+ 18 11 ; source mask, scopemask
+ 7f 00 00 ; address
+HEX_EDNSDATA_END
+ENTRY_END
+
+; query for 127.1.0.0/24
+STEP 20 QUERY
+ENTRY_BEGIN
+HEX_ANSWER_BEGIN
+ 00 00 01 00 00 01 00 00 ;ID 0
+ 00 00 00 01 03 77 77 77 ; www.example.com A? (DO)
+ 07 65 78 61 6d 70 6c 65
+ 03 63 6f 6d 00 00 01 00
+ 01 00 00 29 10 00 00 00
+ 80 00 00 0b
+
+ 00 08 00 07 ; OPC, optlen
+ 00 01 18 00 ; ip4, scope 24, source 0
+ 7f 01 00 ;127.1.0.0/24
+HEX_ANSWER_END
+ENTRY_END
+
+; answer is 10.20.30.41 for 127.1.0.0/24 scope 17
+STEP 30 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ednsdata
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.41
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ ; client is 127.1.0.1
+ 00 08 ; OPC
+ 00 07 ; option length
+ 00 01 ; Family
+ 18 11 ; source mask, scopemask
+ 7f 01 00 ; address
+HEX_EDNSDATA_END
+ENTRY_END
+
+; query for 0.0.0.0/0
+STEP 40 QUERY
+ENTRY_BEGIN
+HEX_ANSWER_BEGIN
+ 00 00 01 00 00 01 00 00 ;ID 0
+ 00 00 00 01 03 77 77 77 ; www.example.com A? (DO)
+ 07 65 78 61 6d 70 6c 65
+ 03 63 6f 6d 00 00 01 00
+ 01 00 00 29 10 00 00 00
+ 80 00 00 08
+
+ 00 08 00 04 ; OPC, optlen
+ 00 01 00 00 ; ip4, scope 0, source 0
+ ;0.0.0.0/0
+HEX_ANSWER_END
+ENTRY_END
+
+; answer is 10.20.30.42 for 0.0.0.0/0 scope 0
+STEP 50 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ednsdata
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.42
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ 00 08 ; OPC
+ 00 04 ; option length
+ 00 01 ; Family
+ 00 00 ; source mask, scopemask
+ ; address
+HEX_EDNSDATA_END
+ENTRY_END
+
+; query for 127.0.0.0/24, again, it should be in cache.
+; and not from the scope 0 answer.
+STEP 60 QUERY
+ENTRY_BEGIN
+HEX_ANSWER_BEGIN
+ 00 00 01 00 00 01 00 00 ;ID 0
+ 00 00 00 01 03 77 77 77 ; www.example.com A? (DO)
+ 07 65 78 61 6d 70 6c 65
+ 03 63 6f 6d 00 00 01 00
+ 01 00 00 29 10 00 00 00
+ 80 00 00 0b
+
+ 00 08 00 07 ; OPC, optlen
+ 00 01 18 00 ; ip4, scope 24, source 0
+ 7f 00 00 ;127.0.0.0/24
+HEX_ANSWER_END
+ENTRY_END
+
+; answer should be 10.20.30.40 for 127.0.0.0/24 scope 17
+STEP 70 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ednsdata
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ ; client is 127.0.0.1
+ 00 08 ; OPC
+ 00 07 ; option length
+ 00 01 ; Family
+ 18 11 ; source mask, scopemask
+ 7f 00 00 ; address
+HEX_EDNSDATA_END
+ENTRY_END
+
+; query for 127.1.0.0/24, again, it should be in cache.
+STEP 80 QUERY
+ENTRY_BEGIN
+HEX_ANSWER_BEGIN
+ 00 00 01 00 00 01 00 00 ;ID 0
+ 00 00 00 01 03 77 77 77 ; www.example.com A? (DO)
+ 07 65 78 61 6d 70 6c 65
+ 03 63 6f 6d 00 00 01 00
+ 01 00 00 29 10 00 00 00
+ 80 00 00 0b
+
+ 00 08 00 07 ; OPC, optlen
+ 00 01 18 00 ; ip4, scope 24, source 0
+ 7f 01 00 ;127.1.0.0/24
+HEX_ANSWER_END
+ENTRY_END
+
+; answer should be 10.20.30.41 for 127.1.0.0/24 scope 17
+STEP 90 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ednsdata
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.41
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ ; client is 127.1.0.1
+ 00 08 ; OPC
+ 00 07 ; option length
+ 00 01 ; Family
+ 18 11 ; source mask, scopemask
+ 7f 01 00 ; address
+HEX_EDNSDATA_END
+ENTRY_END
+
+; query for 0.0.0.0/0, again.
+STEP 100 QUERY
+ENTRY_BEGIN
+HEX_ANSWER_BEGIN
+ 00 00 01 00 00 01 00 00 ;ID 0
+ 00 00 00 01 03 77 77 77 ; www.example.com A? (DO)
+ 07 65 78 61 6d 70 6c 65
+ 03 63 6f 6d 00 00 01 00
+ 01 00 00 29 10 00 00 00
+ 80 00 00 08
+
+ 00 08 00 04 ; OPC, optlen
+ 00 01 00 00 ; ip4, scope 0, source 0
+ ;0.0.0.0/0
+HEX_ANSWER_END
+ENTRY_END
+
+; answer should be 10.20.30.42 for 0.0.0.0/0 scope 0
+STEP 110 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ednsdata
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.42
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ 00 08 ; OPC
+ 00 04 ; option length
+ 00 01 ; Family
+ 00 00 ; source mask, scopemask
+ ; address
+HEX_EDNSDATA_END
+ENTRY_END
+
+; now a query for a /24 that gets an answer for a /0.
+STEP 120 QUERY
+ENTRY_BEGIN
+HEX_ANSWER_BEGIN
+ 00 00 01 00 00 01 00 00 ;ID 0
+ 00 00 00 01 03 77 77 77 ; www.example.com A? (DO)
+ 07 65 78 61 6d 70 6c 65
+ 03 63 6f 6d 00 00 01 00
+ 01 00 00 29 10 00 00 00
+ 80 00 00 0b
+
+ 00 08 00 07 ; OPC, optlen
+ 00 01 18 00 ; ip4, scope 24, source 0
+ 7f 02 00 ;127.2.0.0/24
+HEX_ANSWER_END
+ENTRY_END
+
+; answer should be 10.20.30.43 for 127.2.0.0/24 scope 0
+STEP 130 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ednsdata
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.43
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ ; client is 127.2.0.1
+ 00 08 ; OPC
+ 00 07 ; option length
+ 00 01 ; Family
+ 18 00 ; source mask, scopemask
+ 7f 02 00 ; address
+HEX_EDNSDATA_END
+ENTRY_END
+
+; the scope 0 answer is now used to answer queries from
+; query for 127.0.0.0/24
+STEP 140 QUERY
+ENTRY_BEGIN
+HEX_ANSWER_BEGIN
+ 00 00 01 00 00 01 00 00 ;ID 0
+ 00 00 00 01 03 77 77 77 ; www.example.com A? (DO)
+ 07 65 78 61 6d 70 6c 65
+ 03 63 6f 6d 00 00 01 00
+ 01 00 00 29 10 00 00 00
+ 80 00 00 0b
+
+ 00 08 00 07 ; OPC, optlen
+ 00 01 18 00 ; ip4, scope 24, source 0
+ 7f 00 00 ;127.0.0.0/24
+HEX_ANSWER_END
+ENTRY_END
+
+STEP 150 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ednsdata
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.43
+SECTION AUTHORITY
+SECTION ADDITIONAL
+HEX_EDNSDATA_BEGIN
+ ; client is 127.0.0.1
+ 00 08 ; OPC
+ 00 07 ; option length
+ 00 01 ; Family
+ 18 00 ; source mask, scopemask
+ 7f 00 00 ; address
+HEX_EDNSDATA_END
+ENTRY_END
+
+SCENARIO_END
diff --git a/util/config_file.c b/util/config_file.c
index 5ec966c2b84d..f807397e44e8 100644
--- a/util/config_file.c
+++ b/util/config_file.c
@@ -786,6 +786,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_SIZET_NONZERO("pad-responses-block-size:", pad_responses_block_size)
else S_YNO("pad-queries:", pad_queries)
else S_SIZET_NONZERO("pad-queries-block-size:", pad_queries_block_size)
+ else S_STRLIST("proxy-protocol-port:", proxy_protocol_port)
#ifdef USE_IPSECMOD
else S_YNO("ipsecmod-enabled:", ipsecmod_enabled)
else S_YNO("ipsecmod-ignore-bogus:", ipsecmod_ignore_bogus)
@@ -822,7 +823,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
* stub-ssl-upstream, forward-zone, auth-zone
* name, forward-addr, forward-host,
* ratelimit-for-domain, ratelimit-below-domain,
- * local-zone-tag, access-control-view,
+ * local-zone-tag, access-control-view, interface-*,
* send-client-subnet, client-subnet-always-forward,
* max-client-subnet-ipv4, max-client-subnet-ipv6,
* min-client-subnet-ipv4, min-client-subnet-ipv6,
@@ -1252,11 +1253,17 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_LS3(opt, "access-control-tag-action", acl_tag_actions)
else O_LS3(opt, "access-control-tag-data", acl_tag_datas)
else O_LS2(opt, "access-control-view", acl_view)
+ else O_LS2(opt, "interface-action", interface_actions)
+ else O_LTG(opt, "interface-tag", interface_tags)
+ else O_LS3(opt, "interface-tag-action", interface_tag_actions)
+ else O_LS3(opt, "interface-tag-data", interface_tag_datas)
+ else O_LS2(opt, "interface-view", interface_view)
else O_YNO(opt, "pad-responses", pad_responses)
else O_DEC(opt, "pad-responses-block-size", pad_responses_block_size)
else O_YNO(opt, "pad-queries", pad_queries)
else O_DEC(opt, "pad-queries-block-size", pad_queries_block_size)
else O_LS2(opt, "edns-client-strings", edns_client_strings)
+ else O_LST(opt, "proxy-protocol-port", proxy_protocol_port)
#ifdef USE_IPSECMOD
else O_YNO(opt, "ipsecmod-enabled", ipsecmod_enabled)
else O_YNO(opt, "ipsecmod-ignore-bogus", ipsecmod_ignore_bogus)
@@ -1302,6 +1309,7 @@ create_cfg_parser(struct config_file* cfg, char* filename, const char* chroot)
cfg_parser->errors = 0;
cfg_parser->cfg = cfg;
cfg_parser->chroot = chroot;
+ cfg_parser->started_toplevel = 0;
init_cfg_parse();
}
@@ -1606,10 +1614,16 @@ config_delete(struct config_file* cfg)
config_deltrplstrlist(cfg->local_zone_overrides);
config_del_strarray(cfg->tagname, cfg->num_tags);
config_del_strbytelist(cfg->local_zone_tags);
- config_del_strbytelist(cfg->acl_tags);
config_del_strbytelist(cfg->respip_tags);
+ config_deldblstrlist(cfg->acl_view);
+ config_del_strbytelist(cfg->acl_tags);
config_deltrplstrlist(cfg->acl_tag_actions);
config_deltrplstrlist(cfg->acl_tag_datas);
+ config_deldblstrlist(cfg->interface_actions);
+ config_deldblstrlist(cfg->interface_view);
+ config_del_strbytelist(cfg->interface_tags);
+ config_deltrplstrlist(cfg->interface_tag_actions);
+ config_deltrplstrlist(cfg->interface_tag_datas);
config_delstrlist(cfg->control_ifs.first);
free(cfg->server_key_file);
free(cfg->server_cert_file);
@@ -1630,6 +1644,7 @@ config_delete(struct config_file* cfg)
config_delstrlist(cfg->python_script);
config_delstrlist(cfg->dynlib_file);
config_deldblstrlist(cfg->edns_client_strings);
+ config_delstrlist(cfg->proxy_protocol_port);
#ifdef USE_IPSECMOD
free(cfg->ipsecmod_hook);
config_delstrlist(cfg->ipsecmod_whitelist);
@@ -1800,6 +1815,9 @@ void ub_c_error_msg(const char* fmt, ...)
void ub_c_error(const char *str)
{
cfg_parser->errors++;
+ if(strcmp(str, "syntax error")==0 && cfg_parser->started_toplevel ==0)
+ str = "syntax error, is there no section start after an "
+ "include-toplevel directive perhaps.";
fprintf(stderr, "%s:%d: error: %s\n", cfg_parser->filename,
cfg_parser->line, str);
}
@@ -2609,3 +2627,35 @@ int cfg_has_https(struct config_file* cfg)
}
return 0;
}
+
+/** see if interface is PROXYv2, its port number == the proxy port number */
+int
+if_is_pp2(const char* ifname, const char* port,
+ struct config_strlist* proxy_protocol_port)
+{
+ struct config_strlist* s;
+ char* p = strchr(ifname, '@');
+ for(s = proxy_protocol_port; s; s = s->next) {
+ if(p && atoi(p+1) == atoi(s->str))
+ return 1;
+ if(!p && atoi(port) == atoi(s->str))
+ return 1;
+ }
+ return 0;
+}
+
+/** see if interface is DNSCRYPT, its port number == the dnscrypt port number */
+int
+if_is_dnscrypt(const char* ifname, const char* port, int dnscrypt_port)
+{
+#ifdef USE_DNSCRYPT
+ return ((strchr(ifname, '@') &&
+ atoi(strchr(ifname, '@')+1) == dnscrypt_port) ||
+ (!strchr(ifname, '@') && atoi(port) == dnscrypt_port));
+#else
+ (void)ifname;
+ (void)port;
+ (void)dnscrypt_port;
+ return 0;
+#endif
+}
diff --git a/util/config_file.h b/util/config_file.h
index ed372522dfae..b1406913a8c1 100644
--- a/util/config_file.h
+++ b/util/config_file.h
@@ -114,6 +114,8 @@ struct config_file {
int do_tcp_keepalive;
/** tcp keepalive timeout, in msec */
int tcp_keepalive_timeout;
+ /** proxy protocol ports */
+ struct config_strlist* proxy_protocol_port;
/** private key file for dnstcp-ssl service (enabled if not NULL) */
char* ssl_service_key;
@@ -461,6 +463,16 @@ struct config_file {
struct config_str3list* acl_tag_datas;
/** list of aclname, view*/
struct config_str2list* acl_view;
+ /** list of interface action entries, linked list */
+ struct config_str2list* interface_actions;
+ /** list of interface, tagbitlist */
+ struct config_strbytelist* interface_tags;
+ /** list of interface, tagname, localzonetype */
+ struct config_str3list* interface_tag_actions;
+ /** list of interface, tagname, redirectdata */
+ struct config_str3list* interface_tag_datas;
+ /** list of interface, view*/
+ struct config_str2list* interface_view;
/** list of IP-netblock, tagbitlist */
struct config_strbytelist* respip_tags;
/** list of response-driven access control entries, linked list */
@@ -1262,6 +1274,8 @@ struct config_parser_state {
struct config_file* cfg;
/** the current chroot dir (or NULL if none) */
const char* chroot;
+ /** if we are started in a toplevel, or not, after a force_toplevel */
+ int started_toplevel;
};
/** global config parser object used during config parsing */
@@ -1310,6 +1324,12 @@ int if_is_https(const char* ifname, const char* port, int https_port);
*/
int cfg_has_https(struct config_file* cfg);
+/** see if interface is PROXYv2, its port number == the proxy port number */
+int if_is_pp2(const char* ifname, const char* port,
+ struct config_strlist* proxy_protocol_port);
+
+/** see if interface is DNSCRYPT, its port number == the dnscrypt port number */
+int if_is_dnscrypt(const char* ifname, const char* port, int dnscrypt_port);
#ifdef USE_LINUX_IP_LOCAL_PORT_RANGE
#define LINUX_IP_LOCAL_PORT_RANGE_PATH "/proc/sys/net/ipv4/ip_local_port_range"
#endif
diff --git a/util/configlexer.c b/util/configlexer.c
index 2dc877dadea5..56e7f12f3887 100644
--- a/util/configlexer.c
+++ b/util/configlexer.c
@@ -354,8 +354,8 @@ static void yynoreturn yy_fatal_error ( const char* msg );
(yy_hold_char) = *yy_cp; \
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 363
-#define YY_END_OF_BUFFER 364
+#define YY_NUM_RULES 369
+#define YY_END_OF_BUFFER 370
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -363,404 +363,409 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static const flex_int16_t yy_accept[3600] =
+static const flex_int16_t yy_accept[3646] =
{ 0,
- 1, 1, 337, 337, 341, 341, 345, 345, 349, 349,
- 1, 1, 353, 353, 357, 357, 364, 361, 1, 335,
- 335, 362, 2, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 362, 337, 338, 338, 339,
- 362, 341, 342, 342, 343, 362, 348, 345, 346, 346,
- 347, 362, 349, 350, 350, 351, 362, 360, 336, 2,
- 340, 360, 362, 356, 353, 354, 354, 355, 362, 357,
- 358, 358, 359, 362, 361, 0, 1, 2, 2, 2,
- 2, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 337,
- 0, 341, 0, 348, 0, 345, 349, 0, 360, 0,
- 2, 2, 360, 356, 0, 353, 357, 0, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 360, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 334, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 133, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 143, 361, 361, 361, 361, 361, 361,
- 361, 360, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 115, 361, 333, 361, 361, 361, 361, 361,
- 361, 361, 361, 8, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 134, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 148, 361,
- 361, 360, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 326, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 360, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 69, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 255, 361, 14, 15, 361, 19, 18,
- 361, 361, 239, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 141, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 237, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 3, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 360, 361, 361, 361, 361,
- 361, 361, 361, 320, 361, 361, 319, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 344, 361, 361,
- 361, 361, 361, 361, 361, 361, 68, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 72, 361, 289, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 327, 328, 361, 361, 361,
- 361, 361, 361, 361, 361, 73, 361, 361, 142, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 137, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 226, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 21, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 168, 361, 361, 361, 361, 361, 360, 344, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 113,
- 361, 361, 361, 361, 361, 361, 361, 297, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 195, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 167, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 112, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 35, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 36, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 70, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 140, 361, 361, 361,
- 360, 361, 361, 361, 361, 361, 132, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 71, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 259, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 196, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 58, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 277, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 63, 361, 64,
- 361, 361, 361, 361, 361, 116, 361, 117, 361, 361,
- 361, 361, 361, 114, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 7, 361, 361,
- 361, 361, 360, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 248, 361, 361, 361, 361, 171, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 260, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 49, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 59, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 218,
- 361, 217, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 16, 17, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 74, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 225, 361, 361, 361, 361, 361, 361, 119, 361,
- 118, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 209, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 149, 361, 361,
-
- 361, 360, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 107, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 95, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 238, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 100,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 67, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 212, 213, 361, 361, 361, 291, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 6, 361, 361, 361, 361, 361, 361, 361, 310,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 295, 361,
- 361, 361, 361, 361, 361, 361, 321, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 46, 361, 361, 361, 361, 361, 48, 361, 361,
-
- 361, 96, 361, 361, 361, 361, 361, 56, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 360,
- 361, 205, 361, 361, 361, 144, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 230, 361, 206, 361,
- 361, 361, 245, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 57, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 146, 125, 361, 126, 361,
- 361, 361, 361, 124, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 164, 361, 361, 54, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 276, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 207, 361, 361, 361, 361, 361,
- 210, 361, 216, 361, 361, 361, 361, 361, 361, 244,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 111, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 138, 361, 361,
- 361, 361, 361, 361, 361, 361, 65, 361, 361, 361,
- 29, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 20, 361, 361, 361, 361, 361, 361,
- 361, 30, 39, 361, 176, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 203,
- 361, 361, 360, 361, 361, 361, 361, 361, 361, 82,
- 84, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 299, 361, 361, 361, 361, 256,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 127, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 163, 361, 50, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 314, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 170, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 308, 361, 361, 361,
- 236, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 324, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 188, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 120, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 183, 361,
- 197, 361, 361, 361, 361, 361, 361, 361, 360, 361,
- 152, 361, 361, 361, 361, 361, 106, 361, 361, 361,
- 361, 228, 361, 361, 361, 361, 361, 361, 246, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 268, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 145, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 187, 361, 361, 361, 361,
-
- 361, 361, 361, 85, 361, 86, 361, 361, 361, 361,
- 361, 361, 66, 317, 361, 361, 361, 361, 361, 94,
- 198, 361, 219, 361, 249, 361, 361, 211, 292, 361,
- 361, 361, 361, 361, 361, 78, 361, 200, 361, 361,
- 361, 361, 361, 361, 9, 361, 361, 361, 361, 361,
- 110, 361, 361, 361, 361, 361, 281, 361, 361, 361,
- 361, 227, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 360, 361, 361, 361,
- 361, 186, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 172, 361, 298, 361, 361, 361, 361, 361,
- 267, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 240, 361, 361, 361, 361, 361, 361, 290,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 169, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 318, 361, 199, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 77, 79, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 109, 361,
- 361, 361, 361, 361, 279, 361, 361, 361, 361, 294,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 232, 37, 31, 33, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 38,
- 361, 32, 34, 361, 40, 361, 361, 361, 361, 361,
- 361, 361, 105, 361, 182, 361, 361, 361, 361, 361,
- 361, 361, 360, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 234, 231, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 76, 361, 361, 361, 147,
- 361, 128, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 165, 51, 361, 361, 361, 352, 13, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 312, 361, 315, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 12, 361, 361, 22,
- 361, 361, 361, 361, 361, 361, 285, 361, 361, 361,
- 361, 296, 361, 361, 361, 361, 80, 361, 242, 361,
- 361, 361, 361, 361, 233, 361, 361, 75, 361, 361,
-
- 361, 361, 361, 361, 23, 361, 361, 47, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 181, 180, 361, 361, 352, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 235, 229, 361, 247, 361, 361,
- 300, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 193, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 87, 361, 361,
- 361, 361, 361, 280, 361, 361, 361, 361, 215, 361,
- 361, 361, 361, 361, 241, 361, 361, 361, 361, 361,
-
- 361, 361, 361, 361, 287, 361, 361, 361, 322, 323,
- 178, 361, 361, 361, 81, 361, 361, 361, 361, 189,
- 361, 361, 361, 121, 123, 122, 361, 361, 361, 25,
- 361, 361, 173, 361, 175, 361, 220, 361, 361, 361,
- 361, 179, 361, 361, 361, 361, 250, 361, 361, 361,
- 361, 361, 361, 361, 154, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 258, 361, 361,
- 361, 361, 361, 361, 361, 331, 361, 27, 361, 293,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 92, 221, 361,
-
- 361, 361, 278, 361, 316, 361, 214, 361, 361, 361,
- 361, 361, 288, 60, 361, 361, 361, 361, 361, 361,
- 4, 361, 361, 361, 361, 136, 361, 153, 361, 361,
- 361, 194, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 253, 41, 42, 361, 361, 361, 361, 361, 361, 361,
- 301, 361, 361, 361, 361, 361, 361, 361, 266, 361,
- 361, 361, 361, 361, 361, 361, 361, 224, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 91, 90, 361, 361, 61, 361, 284, 361,
-
- 254, 361, 361, 361, 361, 361, 11, 361, 361, 361,
- 361, 361, 361, 361, 361, 135, 361, 361, 361, 361,
- 361, 222, 97, 361, 361, 44, 361, 361, 361, 361,
- 361, 361, 361, 361, 185, 361, 361, 361, 361, 361,
- 361, 361, 156, 361, 361, 361, 361, 257, 361, 361,
- 361, 361, 361, 265, 361, 361, 361, 361, 150, 361,
- 361, 361, 129, 131, 130, 361, 361, 361, 99, 103,
- 98, 166, 361, 361, 361, 361, 88, 361, 286, 361,
- 361, 361, 361, 361, 361, 10, 361, 361, 361, 361,
- 361, 282, 325, 361, 361, 361, 361, 361, 361, 330,
-
- 43, 361, 361, 361, 361, 361, 184, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 104, 102, 361, 55, 361, 361, 89, 361,
- 313, 361, 361, 361, 361, 24, 361, 361, 361, 361,
- 361, 208, 361, 361, 361, 361, 361, 361, 223, 361,
- 361, 361, 361, 361, 361, 361, 361, 204, 361, 361,
- 174, 83, 361, 361, 361, 361, 361, 302, 361, 361,
- 361, 361, 361, 361, 361, 262, 361, 361, 261, 151,
- 361, 361, 101, 52, 361, 361, 157, 158, 161, 162,
-
- 159, 160, 93, 311, 361, 361, 283, 139, 361, 361,
- 361, 26, 361, 177, 361, 361, 361, 361, 202, 361,
- 252, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 191, 190, 45, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 309, 361,
- 361, 361, 361, 108, 361, 251, 361, 275, 306, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 332, 361, 53, 62, 5, 361, 361, 243, 361, 361,
-
- 307, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 263, 28, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 264, 361, 361, 361, 155, 361,
- 361, 361, 361, 361, 361, 361, 361, 192, 361, 201,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 303,
- 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 329, 361, 361,
- 271, 361, 361, 361, 361, 361, 304, 361, 361, 361,
- 361, 361, 361, 305, 361, 361, 361, 269, 361, 272,
- 273, 361, 361, 361, 361, 361, 270, 274, 0
-
+ 1, 1, 343, 343, 347, 347, 351, 351, 355, 355,
+ 1, 1, 359, 359, 363, 363, 370, 367, 1, 341,
+ 341, 368, 2, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 368, 343, 344, 344, 345,
+ 368, 347, 348, 348, 349, 368, 354, 351, 352, 352,
+ 353, 368, 355, 356, 356, 357, 368, 366, 342, 2,
+ 346, 366, 368, 362, 359, 360, 360, 361, 368, 363,
+ 364, 364, 365, 368, 367, 0, 1, 2, 2, 2,
+ 2, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 343,
+ 0, 347, 0, 354, 0, 351, 355, 0, 366, 0,
+ 2, 2, 366, 362, 0, 359, 363, 0, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 366, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 339, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 133, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 143, 367, 367, 367, 367,
+ 367, 367, 367, 366, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 115, 367, 338, 367, 367, 367,
+ 367, 367, 367, 367, 367, 8, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 134, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 148, 367, 367, 366, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 331, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 366,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 69, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 260, 367, 14,
+ 15, 367, 19, 18, 367, 367, 240, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 141, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 238, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 3,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 366, 367, 367, 367, 367, 367, 367, 367, 325, 367,
+ 367, 324, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 350, 367, 367, 367, 367, 367, 367, 367,
+ 367, 68, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 72, 367,
+ 294, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 332, 333, 367, 367, 367, 367, 367, 367, 367, 367,
+ 73, 367, 367, 142, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 137,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 227, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 21, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 169, 367, 367, 367,
+ 367, 367, 366, 350, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 113, 367, 367, 367, 367,
+ 367, 367, 367, 302, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 196, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 168, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 112, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 35, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 36, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 70, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 140, 367, 367, 367, 366, 367, 367,
+ 367, 367, 367, 132, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 71,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 264, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 197, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 58, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 282, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 63, 367, 64, 367, 367,
+ 367, 367, 367, 116, 367, 117, 367, 367, 367, 367,
+ 367, 114, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 7, 367, 367, 367, 367,
+ 366, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 249,
+ 367, 367, 367, 367, 172, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 265, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 49, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 59, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 219,
+
+ 367, 218, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 16, 17, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 74, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 226, 367, 367, 367, 367, 367, 367, 119,
+ 367, 118, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 210, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 149, 367,
+ 367, 367, 366, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 107, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 95, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 239,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 100, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 67, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 213, 214, 367, 367,
+ 367, 296, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 6, 367, 367, 367, 367,
+ 367, 367, 367, 315, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 300, 367, 367, 367, 367, 367, 367,
+ 367, 326, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 46, 367, 367, 367,
+ 367, 367, 48, 367, 367, 367, 96, 367, 367, 367,
+ 367, 367, 56, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 366, 367, 206, 367, 367, 367,
+ 144, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 231, 367, 207, 367, 367, 367, 246, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 57, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 146, 125, 367, 126, 367, 367, 367, 367, 124, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 165, 367,
+ 367, 54, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 281, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 208, 367, 367, 367, 367, 367, 211, 367,
+ 217, 367, 367, 367, 367, 367, 367, 245, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 111, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 138, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 65, 367, 367, 367, 29,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 20, 367, 367, 367, 367, 367, 367, 367,
+ 30, 39, 367, 177, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 204, 367,
+ 367, 366, 367, 367, 367, 367, 367, 367, 82, 84,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 304, 367, 367, 367, 367, 261, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 127, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 164, 367, 50, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 255, 367, 367,
+ 367, 367, 367, 367, 367, 319, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 171, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 313,
+ 367, 367, 367, 367, 237, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 329, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 189, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 120, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 184, 367, 198, 367, 367, 367, 367, 367,
+ 367, 367, 366, 367, 152, 367, 367, 367, 367, 367,
+ 106, 367, 367, 367, 367, 229, 367, 367, 367, 367,
+ 367, 367, 247, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 273,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 145, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 188,
+ 367, 367, 367, 367, 367, 367, 367, 85, 367, 86,
+ 367, 367, 367, 367, 367, 258, 367, 367, 367, 367,
+ 66, 322, 367, 367, 367, 367, 367, 94, 199, 367,
+ 220, 367, 250, 367, 367, 212, 297, 367, 367, 367,
+ 367, 367, 367, 78, 367, 201, 367, 367, 367, 367,
+ 367, 367, 9, 367, 367, 367, 367, 367, 110, 367,
+ 367, 367, 367, 367, 367, 286, 367, 367, 367, 367,
+ 228, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 366, 367, 367, 367, 367,
+ 187, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 173, 367, 303, 367, 367, 367, 367, 367, 272,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 241, 367, 367, 367, 367, 367, 367, 295, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 170, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 323, 367, 200,
+ 367, 367, 367, 367, 367, 367, 367, 367, 77, 79,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 109, 367, 367, 367, 367, 367, 367, 284, 367, 367,
+ 367, 367, 299, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 233, 37, 31, 33,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 38, 367, 32, 34, 367, 40, 367, 367,
+
+ 367, 367, 367, 367, 367, 105, 367, 183, 367, 367,
+ 367, 367, 367, 367, 367, 366, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 235, 232, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 76, 367,
+ 367, 367, 147, 367, 128, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 166, 51, 367, 367, 367,
+ 358, 13, 367, 367, 367, 367, 367, 367, 367, 153,
+ 367, 367, 367, 367, 367, 367, 367, 317, 367, 320,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 12, 367, 367, 22, 367, 367, 367, 367,
+ 367, 367, 367, 290, 367, 367, 367, 367, 301, 367,
+ 367, 367, 367, 80, 367, 243, 367, 367, 367, 367,
+ 367, 234, 367, 367, 75, 367, 367, 367, 367, 367,
+ 367, 23, 367, 367, 47, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 182, 181, 367,
+ 367, 358, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 236, 230, 367, 248, 367, 367, 305, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 194, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 87, 367, 367, 367, 367, 367,
+ 367, 367, 285, 367, 367, 367, 367, 216, 367, 367,
+ 367, 367, 367, 242, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 292, 367, 367, 367, 327, 328,
+ 179, 367, 367, 367, 81, 367, 367, 367, 367, 190,
+ 367, 367, 367, 121, 123, 122, 367, 367, 367, 25,
+ 367, 367, 174, 367, 176, 367, 221, 367, 367, 367,
+ 367, 180, 367, 367, 367, 367, 251, 367, 367, 367,
+ 367, 367, 367, 367, 155, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 263, 367, 367,
+ 367, 367, 367, 367, 367, 336, 367, 27, 367, 298,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 92, 222, 367,
+ 367, 257, 367, 367, 283, 367, 321, 367, 215, 367,
+ 367, 367, 367, 367, 293, 60, 367, 367, 367, 367,
+ 367, 367, 367, 4, 367, 367, 367, 367, 136, 367,
+ 154, 367, 367, 367, 195, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 254, 41, 42, 367, 367, 367, 367,
+
+ 367, 367, 367, 306, 367, 367, 367, 367, 367, 367,
+ 367, 271, 367, 367, 367, 367, 367, 367, 367, 367,
+ 225, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 91, 90, 367, 367, 61,
+ 367, 367, 289, 367, 259, 367, 367, 367, 367, 367,
+ 11, 367, 367, 367, 367, 340, 367, 367, 367, 367,
+ 135, 367, 367, 367, 367, 367, 223, 97, 367, 367,
+ 44, 367, 367, 367, 367, 367, 367, 367, 367, 186,
+ 367, 367, 367, 367, 367, 367, 367, 157, 367, 367,
+ 367, 367, 262, 367, 367, 367, 367, 367, 270, 367,
+
+ 367, 367, 367, 150, 367, 367, 367, 129, 131, 130,
+ 367, 367, 367, 99, 103, 98, 167, 367, 367, 367,
+ 367, 88, 367, 256, 291, 367, 367, 367, 367, 367,
+ 367, 10, 367, 367, 367, 367, 367, 287, 330, 367,
+ 367, 367, 367, 367, 367, 335, 43, 367, 367, 367,
+ 367, 367, 185, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 104, 102,
+ 367, 55, 367, 367, 89, 367, 318, 367, 367, 367,
+ 367, 24, 367, 367, 367, 367, 367, 209, 367, 367,
+
+ 367, 367, 367, 367, 224, 367, 367, 367, 367, 367,
+ 367, 367, 367, 205, 367, 367, 175, 83, 367, 367,
+ 367, 367, 367, 307, 367, 367, 367, 367, 367, 367,
+ 367, 267, 367, 367, 266, 151, 367, 367, 101, 52,
+ 367, 367, 158, 159, 162, 163, 160, 161, 93, 316,
+ 367, 367, 288, 139, 367, 367, 367, 26, 367, 178,
+ 367, 367, 367, 367, 203, 367, 253, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 192, 191,
+ 45, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 314, 367, 367, 367, 367, 108,
+ 367, 252, 367, 280, 311, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 337, 367, 53, 62,
+ 5, 367, 367, 244, 367, 367, 312, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 268, 28, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 269, 367, 367, 367, 156, 367, 367, 367, 367, 367,
+ 367, 367, 367, 193, 367, 202, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 308, 367, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 334, 367, 367, 276, 367, 367, 367,
+ 367, 367, 309, 367, 367, 367, 367, 367, 367, 310,
+ 367, 367, 367, 274, 367, 277, 278, 367, 367, 367,
+ 367, 367, 275, 279, 0
} ;
static const YY_CHAR yy_ec[256] =
@@ -806,811 +811,821 @@ static const YY_CHAR yy_meta[67] =
1, 1, 1, 1, 1, 1
} ;
-static const flex_int16_t yy_base[3618] =
+static const flex_int16_t yy_base[3664] =
{ 0,
0, 0, 64, 67, 70, 72, 78, 84, 89, 92,
- 131, 137, 112, 118, 123, 142, 488, 423, 96,10283,
- 10283,10283, 160, 185, 116, 183, 229, 132, 175, 173,
+ 131, 137, 112, 118, 123, 142, 488, 423, 96,10421,
+ 10421,10421, 160, 185, 116, 183, 229, 132, 175, 173,
232, 50, 66, 120, 263, 275, 151, 323, 134, 375,
- 416, 286, 308, 283, 126, 237, 374,10283,10283,10283,
- 95, 372,10283,10283,10283, 186, 361, 373,10283,10283,
- 10283, 258, 309,10283,10283,10283, 104, 293,10283, 266,
- 10283, 167, 351, 281, 311,10283,10283,10283, 369, 268,
- 10283,10283,10283, 146, 252, 378, 177, 0, 392, 0,
+ 416, 286, 308, 283, 126, 237, 374,10421,10421,10421,
+ 95, 372,10421,10421,10421, 186, 361, 373,10421,10421,
+ 10421, 258, 309,10421,10421,10421, 104, 293,10421, 266,
+ 10421, 167, 351, 281, 311,10421,10421,10421, 369, 268,
+ 10421,10421,10421, 146, 252, 378, 177, 0, 392, 0,
0, 303, 270, 235, 317, 362, 344, 384, 178, 177,
226, 420, 377, 330, 379, 402, 414, 425, 413, 453,
319, 367, 440, 429, 441, 455, 475, 479, 458, 482,
490, 491, 489, 496, 504, 499, 521, 520, 506, 516,
- 531, 514, 540, 527, 548, 541, 549, 546, 570, 537,
- 543, 559, 584, 568, 250, 573, 603, 599, 576, 563,
- 389, 591, 626, 608, 618, 615, 595, 631, 625, 208,
- 294, 205, 236, 194, 668, 225, 180, 326, 158, 676,
- 680, 0, 653, 152, 690, 176, 130, 492, 668, 666,
- 659, 663, 679, 674, 681, 669, 676, 692, 690, 700,
- 725, 686, 717, 727, 256, 730, 774, 731, 729, 735,
-
- 715, 738, 740, 736, 719, 769, 772, 742, 755, 759,
- 764, 775, 762, 799, 803, 835, 806, 793, 800, 339,
- 796, 823, 378, 805, 418, 833, 824, 443, 832, 459,
- 830, 704, 847, 817, 852, 840, 850, 869, 871, 877,
- 873, 878, 879, 872, 874, 889, 894, 898, 900, 904,
- 897, 896, 910, 912, 906, 917, 696, 913, 927, 943,
- 946, 923, 948, 935, 937, 956, 952, 953, 963, 958,
- 945, 961, 955, 962, 978, 972, 991, 974, 1005, 1007,
- 998, 1001, 1012, 994, 1000, 993, 1002, 1018, 985, 1020,
- 1019, 1015, 1030, 144, 1032, 1034, 1039, 1036, 1033, 1051,
-
- 1060, 1046, 1047, 1049,10283, 1070, 1057, 1074, 1078, 1075,
- 1082, 1084, 1067, 1093, 1095, 1069, 1088, 1083, 1105, 1099,
- 1116, 1090, 1117, 1109, 1107, 1122, 1111, 1134, 1112, 1145,
- 1139, 1135, 1173, 1144, 1141, 1152, 1184, 1167, 1183, 1176,
- 1204, 1213, 1174, 1195, 1208, 1209, 1211, 1227, 1212, 1232,
- 1230, 1237, 1246, 1248, 1235, 1238, 1251, 1239, 1240, 1264,
- 1172, 1280,10283, 1262, 1288, 1261, 1289, 1290, 1297, 1270,
- 1315, 1277, 1311, 1303, 1296, 1320, 1363, 1411, 1313, 1329,
- 1326, 1328, 1321,10283, 1348, 1330, 1460, 1358, 1356, 1374,
- 1382, 1359, 1360, 1383, 1393, 1370, 1310, 1378, 1397, 1399,
-
- 1424, 1459, 1422, 1423, 1406, 1391, 1438, 1319, 1457, 1451,
- 1454, 1469, 1440, 1467, 1461, 1490, 1509, 1485, 1497, 1498,
- 1501, 1516, 1506, 1524, 1519, 1530, 1520, 1510, 1537, 1539,
- 1540, 1545, 1561, 1606, 1441, 1551, 1557, 1564, 1565, 1536,
- 1573, 1571, 1576, 1572, 1585, 1589, 1604, 1601, 1613, 1610,
- 1612, 1617, 1631, 1626, 1607, 1608, 1638, 1650, 1658, 1636,
- 1641, 1642, 1652, 1663, 1657, 1668, 1669, 1670, 1673, 1653,
- 1675, 1682,10283, 1691,10283, 1685, 1699, 1689, 1702, 1693,
- 1708, 1695, 1705,10283, 1703, 1709, 1719, 1729, 1730, 1736,
- 1733, 1742, 1735, 1744, 1748, 1750, 1738, 1758, 1763, 1741,
-
- 1756, 1778, 1770, 1776, 1765, 1768, 1794, 1788, 1785, 1797,
- 1783, 1782, 1791, 1831,10283, 1786, 1813, 1821, 1815, 1803,
- 1833, 1825, 1840, 1864, 1828, 1870, 1860, 1826, 1885, 1866,
- 1867, 1886, 1859, 1872, 1887, 1880, 1897, 1896, 1906, 1912,
- 1903, 1901, 1899, 1924, 1925, 1916, 1922, 1930,10283, 1931,
- 1938, 1946, 1949, 1941, 1944, 1947, 1956, 1945, 1957, 1951,
- 1968, 1977, 1961, 1982, 1989, 1996, 1980, 1999, 1986, 1997,
- 1987, 1988, 2005, 2008, 2020, 2006, 2045, 2021, 2031, 2041,
- 2023, 2042, 2043, 2025, 2051, 2026, 2033, 2047, 2052, 2057,
- 2046, 2056, 2072, 2071, 2067, 2058, 2083, 2085, 2068, 2089,
-
- 2078, 2092, 2086, 2105, 2094, 2080, 2103, 2099, 2095, 2114,
- 2130, 2124, 2117, 2151, 2119, 2138, 2122, 2126, 2143, 2145,
- 2133, 2153,10283, 2157, 2146, 2173, 2167, 2174, 2180, 2182,
- 2169, 2170, 2184, 2186, 2197, 2196, 2192, 2195, 2198, 2200,
- 2212, 2223, 2218, 2210, 2227, 2231, 2237, 2235, 2236, 2222,
- 2239, 2242, 2246, 2252, 2247, 2265, 2257, 2269, 2250, 2276,
- 2287, 2273, 2277, 2296, 2293, 2266, 2282, 2300, 2299, 2294,
- 2303, 2304, 2321, 2330, 2317, 2335, 2341, 2306, 2320, 2347,
- 2333, 2351, 2336, 2337, 2343, 2346, 2363, 2364, 2367, 2360,
- 2370, 2374, 2357, 2376, 2396, 2378, 2391, 2380, 2390, 2394,
-
- 2392, 2388, 2405, 2410, 2407, 2412, 2422, 2426, 2423, 2427,
- 2438, 2433, 2429, 2454, 2434, 2449, 2451, 2450, 2461, 2463,
- 2465, 2467, 2475, 2478, 2489, 2473, 2481, 2493, 2485, 2492,
- 2495, 2487, 2506, 2505, 2523, 2516, 2524, 2525, 2520, 2526,
- 2522, 2531, 2519, 2536, 2556, 2539, 2550, 2532,10283, 2551,
- 2574, 2553, 2567, 2548, 2554, 2558, 2591, 2580, 2582, 2572,
- 2568, 2584, 2630,10283, 2581,10283,10283, 2585,10283,10283,
- 2601, 2607,10283, 2592, 2618, 2617, 2611, 2629, 2620, 2645,
- 2644, 2640, 2647, 2616, 2669, 2696, 2648, 2660, 2657, 2662,
- 2679, 2666, 2682, 2689, 2672, 2699, 2705, 2709, 2716, 2733,
-
- 2730, 2711, 2725, 2717, 2744, 2743, 2747, 2746, 2753, 2752,
- 2756, 2736, 2758, 2739, 2757, 2761, 2764, 2772, 2779, 2789,
- 2780, 2782, 2775, 2805, 2796, 2804, 2810,10283, 2803, 2816,
- 2799, 2817, 2814, 2820, 2824, 2807, 2821, 2822, 2833, 2828,
- 2832, 2834, 2838, 2845, 2835, 2841, 2848, 2858, 2855, 2862,
- 2871, 2878, 2868,10283, 2865, 2872, 2859, 2885, 2879, 2873,
- 2891, 2893, 2877, 2900, 2898, 2921, 2899, 2918, 2915, 2905,
- 2922, 2917, 2910, 2932,10283, 2937, 2933, 2926, 2945, 2940,
- 2936, 2949, 2951, 2955, 2962, 2957, 2977, 2967, 2960, 2927,
- 2982, 2974, 2976, 2978, 2996, 2984, 2987, 3001, 2994, 2993,
-
- 3006, 3007, 3020, 3011, 3008, 3012, 3014, 3021, 3024, 3026,
- 3035, 3050, 3041, 3054, 3043, 3045, 3066, 3069, 3056, 3059,
- 3068, 3070, 3058, 3073, 3071, 3081, 3086, 3072, 3091, 3096,
- 3083, 3094, 3093, 3107, 3106, 3119, 3110, 3123, 3128, 3113,
- 3121, 3137, 3126,10283, 3120, 3143,10283, 3146, 3138, 3139,
- 3185, 3175, 3173, 3165, 3178, 3156, 3187, 3182, 3184, 3205,
- 3199, 3227, 3207, 3215, 3231, 3204, 3233, 3218, 3234, 3222,
- 3172, 3237, 3232, 3245, 3246, 3262, 3148, 3168, 3244, 381,
- 3258, 3254, 3261, 3264, 3309, 3257, 3265, 3272, 3275, 3292,
- 3295, 3297, 3314, 3284, 3285, 3299, 3322, 3306, 3316, 3327,
-
- 3333, 3331, 3334, 3341, 3340, 3342, 3343,10283, 3358, 3361,
- 3353, 3366, 3362, 3381, 3377, 3365,10283, 3374, 3378, 3379,
- 3386, 3385, 3388, 3391, 3397, 3389, 3399, 3408, 3416, 3418,
- 3422, 3412, 3405,10283, 3415,10283, 3423, 3413, 3436, 3432,
- 3434, 3435, 3442, 3460, 3461,10283,10283, 3462, 3463, 3469,
- 3476, 3478, 3468, 3459, 3485,10283, 3475, 3481,10283, 3505,
- 3480, 3486, 3494, 3495, 3497, 3503, 3502, 3524, 3508, 3525,
- 3519, 3518, 3512,10283, 3530, 3537, 3527, 3542, 3544, 3543,
- 3551, 3557, 3558, 3553,10283, 3550, 3552, 3566, 3571, 3573,
- 3579, 3564, 3578, 3593, 3583, 3577, 3587, 3599, 3584, 3608,
-
- 3617, 3618, 3611, 3614, 3622, 3620, 3623,10283, 3626, 3609,
- 3610, 3637, 3628, 3639, 3642, 3647, 3635, 3641, 3644, 3645,
- 3658, 3654, 3668, 3652, 3664, 3674, 3682, 3685, 3669, 3689,
- 3687, 3679, 3688, 3692, 3681, 91, 3695, 3696, 3691, 3703,
- 10283, 3708, 3707, 3709, 3719, 3733, 3721, 128, 3725, 3730,
- 3731, 3737, 3740, 3747, 3736, 3755, 3758, 3746, 3754, 3769,
- 3770, 3763, 3764, 3774, 3765, 3768, 3781, 3784, 3790,10283,
- 3793, 3786, 3776, 3795, 3806, 3796, 3826,10283, 3820, 3827,
- 3814, 3825, 3822, 3821, 3841, 3811, 3832, 3851, 3856, 3846,
- 3852, 3839, 3858, 3862, 3859, 3855,10283, 3875, 3879, 3888,
-
- 3878, 3889, 3877, 3886, 3885, 3892, 3890, 3911, 3903, 3917,
- 3916, 3910, 3905, 3913, 3927, 3920, 3915, 3919, 3932, 3940,
- 3942, 3944, 3953, 3945, 3943, 3946, 3979, 3955,10283, 3982,
- 3966, 3969, 3970, 3967, 3973, 3980, 3974, 4003, 3992, 3990,
- 4002, 3998, 4042, 4005, 4012, 4025, 4026, 4017, 4031, 4029,
- 4030, 4032, 4045, 4039, 4062, 4076, 4048, 4053, 4088, 4075,
- 4066, 4080, 4077, 4078, 4099, 4102, 4095, 4097, 4103, 4135,
- 4104, 4105, 4113, 4136, 4110,10283, 4129, 4123, 4127, 4130,
- 4125, 4150, 4120, 4156, 4154, 4158, 4160, 4165, 4175, 4163,
- 4169, 4181, 4183, 4185, 4195, 4187, 4194, 4197, 4180, 4188,
-
- 4212, 4205, 4208, 4209, 4227,10283, 4216, 4228, 4215, 4232,
- 4237, 4218, 4247, 4248, 4246, 4231, 4236, 4245, 4253, 4242,
- 4250, 4268, 4261, 4275, 4277, 4274, 4284, 4269,10283, 4288,
- 4270, 4279, 4294, 4276, 4295, 4297, 4302, 4313, 4315, 4322,
- 4325, 4310, 4327, 4324, 4326,10283, 4340, 4341, 4343, 4351,
- 4346, 4335, 4319, 4334, 4359, 4349,10283, 4358, 4361, 4354,
- 4362, 4360, 4370, 4387, 4389, 4368,10283, 4397, 4385, 4382,
- 4383, 4386, 4394, 4400, 4410, 4395, 4392, 4413, 4423, 4433,
- 4416, 4429,10283, 4422, 4451, 4430, 4427, 4444, 4445, 4438,
- 4449, 4465, 4460, 4472, 4463,10283, 4486, 4458, 4471, 4488,
-
- 4476, 4479, 4466, 4497, 4503, 4507, 4492, 4494, 4511, 4498,
- 10283, 4506, 4499, 4509, 4522, 4524, 4513, 4529, 4547, 4534,
- 4536, 4538, 4539, 4544, 4545, 4543, 4563, 4569, 4572, 4564,
- 4567, 4574, 4580, 4570, 4584, 4578, 4591, 4605, 4607, 4599,
- 4615, 4606, 4608, 4601, 4600, 4618, 4627, 4629, 4634, 4630,
- 4635,10283, 4637, 4642, 4638, 4633, 4640, 4639, 4644, 4648,
- 4667, 4650, 4664, 4671, 4669, 4662, 4690, 4692, 4673, 4687,
- 4682, 4685, 4675, 4700, 4694, 4696, 4706, 4711, 4702, 4698,
- 4709, 4727, 4720, 4731, 4746, 4723, 4725, 4729, 4730, 4734,
- 4741, 4738, 4745, 4762, 4764, 4751, 4758, 4769, 4774, 4779,
-
- 4778, 4780, 4775, 4786, 4785, 4797,10283, 4782, 4787, 4802,
- 4801, 4804, 4818, 4827, 4828, 4819, 4822, 4838, 4831, 4833,
- 4846, 4847, 4824, 4830, 4848, 4843, 4852,10283, 4853,10283,
- 4851, 4876, 4855, 4858, 4864,10283, 4886,10283, 4885, 4887,
- 4873, 4874, 4877,10283, 4894, 4875, 4898, 4883, 4902, 4904,
- 4911, 4906, 4909, 4925, 4920, 4912, 4936, 4931, 4917, 4933,
- 4916, 4939, 4945, 4942, 4947, 4966, 4955, 4950, 4972, 4958,
- 4979, 4962, 4968, 4977, 4986, 4975, 4991,10283, 4981, 4997,
- 4999, 5004, 5003, 4983, 5002, 5013, 5008, 5017, 5024, 5029,
- 5018, 5021, 5020, 5028, 5045, 5043, 5051, 5049, 5062, 5046,
-
- 5067,10283, 5044, 5074, 5056, 5073,10283, 5077, 5060, 5085,
- 5087, 5078, 5080, 5076, 5093, 5094, 5081, 5104, 5090, 5121,
- 5102, 5123, 5130,10283, 5125, 5131, 5113, 5129, 5135, 5117,
- 5147, 5150, 5148, 5145, 5163, 5152, 5162, 5156, 5160, 5165,
- 5161, 5168, 5175, 5187, 5190, 5188, 5191, 5174, 5194, 5200,
- 5198, 5186, 5189, 5210, 5192, 5208, 5214, 5218, 5215, 5213,
- 5219, 5241, 5225, 5227,10283, 5235, 5236, 5240, 5256, 5237,
- 5242, 5246, 5262, 5251,10283, 5277, 5259, 5282, 5269, 5289,
- 5273, 5278, 5267, 5280, 5286, 5296, 5294, 5315, 5304,10283,
- 5314,10283, 5285, 5323, 5330, 5332, 5321, 5317, 5336, 5340,
-
- 5342, 5345, 5338, 5346, 5347, 5356, 5361, 5359, 5362, 5378,
- 5371, 5351, 5358, 5385, 5373, 5383, 5376, 5370, 5397, 5406,
- 5404, 5403,10283,10283, 5391, 5407, 5421, 5410, 5418, 5434,
- 5431, 5429, 5423, 5433, 5436, 5449, 5469,10283, 5456, 5459,
- 5450, 5466, 5461, 5452, 5462, 5481, 5487, 5485, 5477, 5492,
- 5489,10283, 5483, 5486, 5497, 5493, 5502, 5514,10283, 5507,
- 10283, 5504, 5509, 5516, 5513, 5520, 5517, 5524, 5530, 5532,
- 5540, 5542, 5549, 5551, 5563, 5557, 5548, 5565, 5553, 5550,
- 5552, 5574, 5569, 5590, 5564, 5577, 5576,10283, 5589, 5579,
- 5598, 5600, 5587, 5603, 5606, 5601, 5592,10283, 5612, 5609,
-
- 5619, 5628, 5616, 5624, 5625, 5629, 5634, 5647, 5643, 5652,
- 5636, 5642,10283, 5645, 5646, 5665, 5650, 5658, 5672, 5682,
- 5680, 5687,10283, 5685, 5679, 5670, 5694, 5684, 5693, 5697,
- 5681, 5691, 5698, 5708, 5714, 5724, 5721, 5720, 5718, 5731,
- 5728, 5722, 5749, 5739, 5747, 5704, 5707, 5746,10283, 5752,
- 5751, 5753, 5759, 5763, 5780, 5771, 5764, 5784, 5793, 5776,
- 5800, 5803, 5792, 5794, 5795, 5801, 5802, 5810, 5805,10283,
- 5822, 5807, 5823, 5819, 5811, 5838, 5826, 5827, 5834, 5844,
- 5830, 5835, 5843, 5850, 5857, 5854, 5865, 5875, 5849, 5846,
- 5870, 5872, 5873,10283, 5903, 5881, 5886, 5877, 5896, 5897,
-
- 5883, 5900, 5891, 5898, 5905, 5914, 5925, 5915, 5921, 5928,
- 5931, 5917,10283,10283, 5933, 5920, 5941,10283, 5942, 5936,
- 5954, 5949, 5959, 5952, 5956, 5967, 5966, 5961, 5979, 5963,
- 5969,10283, 5996, 5977, 6000, 5983, 5990, 6004, 6006,10283,
- 5986, 6016, 6015, 6013, 6010, 6001, 6007, 6017, 6024, 6022,
- 6011, 6028, 6038, 6046, 6055, 6037, 6043, 6056,10283, 6041,
- 6040, 6064, 6059, 6047, 6053, 6063,10283, 6073, 6075, 6093,
- 6089, 6088, 6077, 6103, 6098, 6101, 6090, 6096, 6099, 6108,
- 6112, 6122, 6123, 6117, 6128, 6133, 6124, 6134, 6127, 6130,
- 6149,10283, 6154, 6151, 6144, 6160, 6152,10283, 6166, 6177,
-
- 6173,10283, 6187, 6157, 6180, 6174, 6193,10283, 6184, 6191,
- 6190, 6197, 6178, 6204, 6194, 6211, 6208, 6200, 6206, 6210,
- 6220,10283, 6222, 6209, 6235,10283, 6236, 6243, 6241, 6245,
- 6230, 6253, 6246, 6249, 6258, 6242,10283, 6255,10283, 6262,
- 6263, 6273,10283, 6271, 6272, 6281, 6288, 6285, 6290, 6291,
- 6300, 6293, 6277, 6298, 6287, 6309, 6302, 6311, 6314, 6308,
- 6310, 6313, 6325,10283, 6344, 6324, 6338, 6340, 6330, 6353,
- 6351, 6336, 6341, 6359, 6357,10283,10283, 6361,10283, 6376,
- 6366, 6369, 6374,10283, 6377, 6380, 6378, 6381, 6399, 6393,
- 6384, 6410, 6405,10283, 6414, 6415,10283, 6401, 6412, 6404,
-
- 6409, 6426, 6408, 6427, 6437, 6443, 6428, 6434, 6436, 6441,
- 6450, 6432, 6451, 6478,10283, 6461, 6459, 6460, 6467, 6473,
- 6475, 6487, 6493, 6476,10283, 6499, 6508, 6474, 6501, 6505,
- 10283, 6507,10283, 6503, 6518, 6517, 6511, 6522, 6520,10283,
- 6534, 6528, 6546, 6524, 6547, 6551, 6554, 6555, 6539, 6540,
- 6544, 6567, 6565, 6562, 6571, 6593, 6568,10283, 6577, 6585,
- 6590, 6600, 6594, 6591, 6587, 6613, 6604, 6614, 6597, 6603,
- 6622, 6617, 6624, 6634, 6628, 6640, 6621,10283, 6643, 6641,
- 6652, 6636, 6665, 6646, 6660, 6659,10283, 6663, 6673, 6677,
- 10283, 6670, 6668, 6667, 6689, 6681, 6693, 6694, 6690, 6666,
-
- 6687, 6692, 6708,10283, 6710, 6715, 6703, 6719, 6720, 6732,
- 6718,10283,10283, 6737,10283, 6738, 6730, 6733, 6740, 6747,
- 6746, 6761, 6757, 6762, 6751, 6760, 6773, 6771, 6768,10283,
- 6767, 6795, 6770, 6807, 6796, 6806, 6802, 6801, 6790,10283,
- 10283, 6811, 6815, 6812, 6818, 6819, 6813, 6808, 6817, 6822,
- 6823, 6831, 6850, 6861,10283, 6856, 6839, 6858, 6843,10283,
- 6840, 6864, 6848, 6857, 6868, 6875, 6878, 6854, 6892, 6881,
- 6879, 6900, 6895, 6902, 6891, 6885, 6896, 6901, 6898, 6921,
- 6919, 6915, 6916,10283, 6927, 6920, 6930, 6931, 6928, 6937,
- 6944, 6946, 6953, 6947, 6957,10283, 6954,10283, 6943, 6958,
-
- 6973, 6980, 6966, 6975, 6984, 6988, 6974, 6981, 6983, 6985,
- 7002, 7004, 7015, 7019, 7006, 7007, 7022, 7025, 7027, 7028,
- 7035, 7032,10283, 7033, 7031, 7041, 7044, 7040, 7043, 7050,
- 7045, 7055, 7057, 7059, 7070, 7076, 7079, 7066, 7072, 7068,
- 7077, 7071,10283, 7082, 7089, 7086, 7092, 7093, 7110, 7116,
- 7118, 7123, 7125, 7107, 7113, 7127,10283, 7120, 7114, 7130,
- 10283, 7138, 7144, 7140, 7146, 7160, 7168, 7150, 7165, 7157,
- 7166,10283, 7174, 7155, 7171, 7162, 7182, 7186, 7179, 7184,
- 7206, 7203, 7213, 7223,10283, 7219, 7205, 7220, 7224, 7193,
- 7209, 7227, 7230, 7232,10283, 7233, 7250, 7256, 7249, 7268,
-
- 7271, 7246, 7254, 7276, 7273, 7274, 7247, 7277, 7281, 7260,
- 7283, 7288, 7293, 7300, 7298, 7291, 7294, 7310,10283, 7296,
- 10283, 7306, 7304, 7321, 7333, 7329, 7323, 7334, 7337, 7324,
- 10283, 7331, 7336, 7345, 7339, 7358,10283, 7343, 7359, 7353,
- 7364,10283, 7374, 7373, 7363, 7372, 7387, 7388,10283, 7392,
- 7390, 7391, 7402, 7403, 7397, 7407, 7394, 7411, 7401, 7395,
- 7418, 7424, 7431, 7427, 7438,10283, 7428, 7439, 7444, 7445,
- 7448, 7440, 7447, 7458, 7457, 7446, 7466,10283, 7455, 7469,
- 7470, 7471, 7467, 7482, 7472, 7495, 7436, 7496, 7503, 7483,
- 7488, 7493, 7506, 7505, 7514,10283, 7509, 7508, 7520, 7542,
-
- 7545, 7535, 7544,10283, 7540,10283, 7536, 7553, 7552, 7556,
- 7531, 7560,10283,10283, 7562, 7547, 7563, 7564, 7569,10283,
- 10283, 7565,10283, 7567,10283, 7581, 7582,10283,10283, 7592,
- 7573, 7580, 7605, 7606, 7603,10283, 7604,10283, 7618, 7594,
- 7615, 7607, 7613, 7612,10283, 7627, 7626, 7624, 7637, 7620,
- 10283, 7639, 7651, 7632, 7634, 7640,10283, 7658, 7662, 7641,
- 7653,10283, 7668, 7670, 7667, 7656, 7677, 7675, 7676, 7689,
- 7679, 7695, 7678, 7702, 7692, 7694, 7705, 7700, 7711, 7723,
- 7724, 7713, 7708, 7728, 7729, 7741, 7743, 7719, 7727, 7736,
- 7739, 7740, 7746, 7745, 7757, 7764, 7765, 7766, 7778, 7767,
-
- 7773, 7769, 7763, 7782, 7775, 7791, 7785, 7788, 7798, 7790,
- 7793, 7806, 7799, 7807, 7805, 7826, 7817, 7830, 7832, 7820,
- 7822,10283, 7818, 7838, 7843, 7848, 7847, 7862, 7864, 7852,
- 7871, 7872,10283, 7875,10283, 7879, 7859, 7870, 7863, 7868,
- 10283, 7865, 7887, 7889, 7893, 7892, 7895, 7916, 7897, 7903,
- 7907, 7922,10283, 7927, 7926, 7919, 7914, 7920, 7935,10283,
- 7928, 7939, 7941, 7943, 7947, 7944, 7942, 7949, 7954, 7963,
- 7956, 7966, 7977, 7980, 7962, 7969, 7985,10283, 7995, 7997,
- 7990, 7983, 7993, 7988, 7986, 7994, 8014, 7996, 8015, 8007,
- 8020, 8029, 8033, 8034, 8037,10283, 8021,10283, 8030, 8032,
-
- 8038, 8035, 8044, 8063, 8052, 8054,10283,10283, 8060, 8056,
- 8066, 8070, 8071, 8057, 8085, 8077, 8076, 8090,10283, 8093,
- 8083, 8101, 8092, 8096,10283, 8099, 8102, 8104, 8106,10283,
- 8113, 8118, 8107, 8129, 8137, 8120, 8142, 8138, 8135, 8132,
- 8134, 8133, 8150,10283,10283,10283,10283, 8154, 8136, 8167,
- 8159, 8161, 8163, 8169, 8170, 8175, 8168, 8171, 8177,10283,
- 8183,10283,10283, 8182,10283, 8188, 8186, 8202, 8181, 8198,
- 8203, 8213,10283, 8208,10283, 8219, 8226, 8218, 8222, 8228,
- 8227, 8237, 8236, 8234, 8238, 8239, 8244, 8242, 8247, 8266,
- 8258, 8270, 8272, 8276,10283,10283, 8264, 8278, 8279, 8286,
-
- 8283, 8285, 8281, 8292, 8294, 8291, 8302, 8265, 8293, 8303,
- 8319, 8321, 8322, 8314, 8331,10283, 8325, 8328, 8334,10283,
- 8323,10283, 8338, 8339, 8340, 8329, 8350, 8348, 8359, 8372,
- 8360, 8371,10283,10283, 8361, 8383, 8374,10283,10283, 8362,
- 8365, 8377, 8375, 8382, 8384, 8386, 8406, 8399, 8401, 8393,
- 8398,10283, 8404,10283, 8402, 8423, 8430, 8409, 8428, 8440,
- 8420, 8442, 8439, 8437, 8426, 8443,10283, 8447, 8446,10283,
- 8457, 8455, 8464, 8449, 8460, 8462,10283, 8470, 8461, 8480,
- 8481,10283, 8492, 8489, 8491, 8485,10283, 8499,10283, 8482,
- 8495, 8498, 8533, 8503,10283, 8497, 8504,10283, 8511, 8513,
-
- 8514, 8531, 8522, 8523,10283, 8539, 8525,10283, 8526, 8545,
- 8547, 8551, 8540, 8554, 8544, 8538, 8550, 8552, 8559, 8565,
- 10283,10283, 8573, 8571, 73, 8585, 8566, 8567, 8568, 8584,
- 8602, 8574, 8600, 8605,10283,10283, 8601,10283, 8610, 8616,
- 10283, 8582, 8617, 8612, 8624, 8603, 8630, 8629, 8609, 8625,
- 8639, 8651, 8644, 8636, 8652,10283, 8664, 8670, 8665, 8661,
- 8666, 8671, 8673, 8676, 8682, 8679, 8681, 8685, 8688, 8693,
- 8691, 8697, 8712, 8710, 8701, 8706, 8709,10283, 8725, 8727,
- 8728, 8724, 8720,10283, 8735, 8733, 8742, 8744,10283, 8745,
- 8741, 8752, 8754, 8755,10283, 8748, 8759, 8770, 8769, 8765,
-
- 8768, 8767, 8783, 8785,10283, 8776, 8775, 8795,10283,10283,
- 10283, 8801, 8804, 8793,10283, 8808, 8803, 8788, 8791,10283,
- 8819, 8812, 8811,10283,10283,10283, 8802, 8832, 8815,10283,
- 8825, 8846,10283, 8831,10283, 8826,10283, 8844, 8850, 8856,
- 8851,10283, 8858, 8848, 8852, 8864,10283, 8862, 8867, 8869,
- 8871, 8877, 8881, 8894,10283, 8886, 8896, 8898, 8902, 8887,
- 8904, 8885, 8910, 8891, 8922, 8895, 8911,10283, 8930, 8914,
- 8935, 8938, 8925, 8933, 8936,10283, 8949,10283, 8945,10283,
- 8937, 8941, 8943, 8955, 8964, 8958, 8960, 8972, 8983, 8970,
- 8991, 8975, 8971, 8967, 8995, 9003, 8985,10283,10283, 9013,
-
- 8999, 9009,10283, 9000,10283, 9014,10283, 9007, 9008, 9020,
- 9012, 9032,10283,10283, 9029, 9018, 9033, 9048, 9026, 9027,
- 10283, 9043, 9047, 9039, 9057,10283, 9067,10283, 9052, 9068,
- 9073,10283, 9055, 9080, 9081, 9071, 9063, 9087, 9082, 9088,
- 9069, 9096, 9084, 9090, 9092, 9101, 9107, 9115, 9123, 9120,
- 10283,10283,10283, 9113, 9111, 9132, 9135, 9133, 9137, 9128,
- 10283, 9138, 9141, 9139, 9142, 9156, 9157, 9154,10283, 9155,
- 9158, 9152, 9159, 9178, 9168, 9164, 9181,10283, 9189, 9192,
- 9193, 9191, 9183, 9195, 9198, 9206, 9209, 9211, 9199, 9202,
- 9218, 9210,10283,10283, 9221, 9214,10283, 9231,10283, 9213,
-
- 10283, 9222, 9224, 9216, 9225, 9233,10283, 9250, 9227, 9237,
- 9249, 9245, 9257, 9267, 9268,10283, 9251, 9275, 9259, 9262,
- 9277,10283,10283, 9264, 9287,10283, 9288, 9292, 9284, 9280,
- 9289, 9291, 9300, 9305,10283, 9309, 9312, 9302, 9303, 9315,
- 9319, 9327,10283, 9326, 9316, 9318, 9321,10283, 9337, 9336,
- 9339, 9346, 9354,10283, 9364, 9350, 9376, 9373,10283, 9360,
- 9371, 9362,10283,10283,10283, 9372, 9385, 9384,10283,10283,
- 10283,10283, 9390, 9387, 9389, 9393,10283, 9391,10283, 9395,
- 9411, 9425, 9404, 9427, 9409,10283, 9416, 9419, 9429, 9412,
- 9418,10283,10283, 9433, 9417, 9422, 9436, 9447, 9431,10283,
-
- 10283, 9440, 9443, 9449, 9457, 9456,10283, 9454, 9468, 9462,
- 9470, 9474, 9482, 9485, 9476, 9481, 9478, 9515, 9493, 9469,
- 9489, 9498, 9502, 9506, 9503, 9523, 9529, 9520, 9527, 9528,
- 9517, 9530,10283,10283, 9536,10283, 9537, 9531,10283, 9521,
- 10283, 9541, 9543, 9545, 9551,10283, 9552, 9560, 9561, 9565,
- 9547,10283, 9562, 9569, 9575, 9567, 9568, 9557,10283, 9581,
- 9563, 9583, 9570, 9578, 9574, 9592, 9599,10283, 9596, 9606,
- 10283,10283, 9597, 9613, 9595, 9624, 9609,10283, 9614, 9619,
- 9618, 9623, 9610, 9612, 9631,10283, 9643, 9626,10283,10283,
- 9656, 9646,10283,10283, 9637, 9645,10283,10283,10283,10283,
-
- 10283,10283,10283,10283, 9662, 9666,10283,10283, 9655, 9671,
- 9675,10283, 9677,10283, 9657, 9670, 9674, 9683,10283, 9672,
- 10283, 9658, 9689, 9704, 9710, 9696, 9690, 9701, 9702, 9697,
- 9706, 9707, 9720, 9716, 9728, 9739, 9724, 9741, 9731, 9726,
- 9734, 9751,10283,10283,10283, 9743, 9749, 9760, 9755, 9763,
- 9773, 9765, 9775, 9761, 9759, 9782, 9784, 9788, 9770, 9783,
- 9639, 9790, 9787, 9800, 9794, 9803, 9808, 9813,10283, 9818,
- 9809, 9810, 9819,10283, 9826,10283, 9815,10283,10283, 9828,
- 9837, 9831, 9825, 9848, 9852, 9835, 9821, 9840, 9858, 9854,
- 10283, 9857,10283,10283,10283, 9851, 9850,10283, 9855, 9876,
-
- 10283, 9867, 9868, 9864, 9861, 9879, 9885, 9884, 9888, 9898,
- 10283,10283, 9882, 9890, 9886, 9918, 9916, 9927, 9922, 9919,
- 9925, 9928, 9907, 9932,10283, 9936, 9934, 9937,10283, 9938,
- 9943, 9940, 9949, 9952, 9945, 9954, 9964,10283, 9955,10283,
- 9958, 9966, 9979, 9961, 9967, 9974, 9989, 9991, 9995,10283,
- 9983, 9998, 9993,10002,10014, 9992,10020,10013,10021,10023,
- 10029,10033,10030,10036,10019,10039,10026,10283,10034,10048,
- 10283,10046,10047,10049,10050,10061,10283,10080,10063,10064,
- 10084,10081,10079,10283,10087,10092,10090,10283,10088,10283,
- 10283,10094,10103,10104,10098,10100,10283,10283,10283,10163,
-
- 10170,10177,10184,10191,10198,10205, 102,10212,10219,10226,
- 10233,10240,10247,10254,10261,10268,10275
+ 531, 514, 540, 527, 555, 530, 548, 541, 565, 538,
+ 547, 562, 576, 572, 250, 571, 601, 586, 591, 596,
+ 389, 598, 624, 597, 611, 618, 621, 627, 623, 208,
+ 294, 205, 236, 194, 669, 225, 180, 326, 158, 676,
+ 684, 0, 652, 152, 692, 176, 130, 492, 664, 676,
+ 662, 672, 682, 666, 686, 673, 683, 696, 668, 693,
+ 721, 681, 700, 717, 256, 727, 771, 733, 719, 740,
+
+ 723, 732, 736, 726, 735, 756, 739, 767, 757, 762,
+ 763, 781, 759, 782, 783, 823, 790, 801, 809, 339,
+ 810, 836, 378, 806, 418, 835, 813, 443, 840, 459,
+ 828, 600, 858, 606, 851, 867, 819, 868, 862, 852,
+ 869, 870, 881, 871, 878, 872, 889, 917, 901, 896,
+ 915, 899, 645, 911, 744, 898, 922, 932, 905, 928,
+ 786, 854, 912, 863, 925, 926, 942, 947, 955, 965,
+ 961, 945, 966, 964, 956, 969, 958, 974, 985, 970,
+ 986, 982, 984, 991, 995, 1001, 999, 1005, 1012, 996,
+ 1004, 1022, 1027, 1023, 144, 1016, 1032, 1035, 1014, 1038,
+
+ 1037, 1041, 1046, 1049, 1047,10421, 1043, 1057, 1074, 1073,
+ 1082, 1083, 1078, 1076, 1088, 1093, 1069, 1068, 1070, 1094,
+ 1098, 1108, 1101, 1113, 1103, 1105, 1126, 1106, 1138, 1125,
+ 1134, 1133, 1130, 1177, 1139, 1129, 1140, 1185, 1152, 1160,
+ 1166, 1181, 1207, 1198, 1143, 1209, 1204, 1205, 1221, 1182,
+ 1218, 1171, 1230, 1213, 1236, 1217, 1228, 1244, 1240, 1231,
+ 1241, 1245, 1256, 1272,10421, 1254, 1277, 1283, 1280, 1281,
+ 1290, 1289, 1312, 1287, 1297, 1294, 1305, 1321, 1360, 1408,
+ 1307, 1335, 1322, 1325, 1330,10421, 1347, 1345, 1457, 1353,
+ 1367, 1375, 1379, 1370, 1380, 1374, 1401, 1394, 1302, 1388,
+
+ 1403, 1406, 1430, 1458, 1419, 1428, 1437, 1417, 1438, 1352,
+ 1461, 1447, 1456, 1464, 1450, 1477, 1466, 1487, 1508, 1490,
+ 1485, 1495, 1499, 1514, 1515, 1528, 1519, 1532, 1517, 1506,
+ 1512, 1533, 1535, 1542, 1557, 1602, 1537, 1558, 1563, 1569,
+ 1561, 1576, 1560, 1585, 1578, 1571, 1594, 1590, 1612, 1598,
+ 1534, 1609, 1617, 1621, 1629, 1624, 1618, 1631, 1627, 1648,
+ 1660, 1650, 1643, 1646, 1654, 1665, 1667, 1670, 1659, 1675,
+ 1673, 1683, 1681, 1684,10421, 1711,10421, 1686, 1708, 1693,
+ 1709, 1694, 1717, 1699, 1713,10421, 1710, 1705, 1727, 1640,
+ 1734, 1690, 1742, 1729, 1753, 1745, 1752, 1761, 1754, 1750,
+
+ 1757, 1767, 1756, 1770, 1787, 1775, 1791, 1777, 1780, 1794,
+ 1803, 1795, 1804, 1790, 1792, 1800, 1840,10421, 1822, 1823,
+ 1797, 1816, 1826, 1847, 1835, 1830, 1871, 1843, 1872, 1873,
+ 1855, 1900, 1869, 1874, 1885, 1879, 1893, 1907, 1896, 1909,
+ 1899, 1906, 1915, 1924, 1912, 1916, 1917, 1919, 1934, 1932,
+ 1944,10421, 1945, 1952, 1958, 1965, 1951, 1949, 1948, 1955,
+ 1971, 1966, 1983, 1975, 1968, 1976, 1991, 2001, 1978, 1992,
+ 2011, 1995, 2005, 1998, 1994, 2015, 2013, 2014, 2021, 2029,
+ 2031, 2045, 2046, 2022, 2051, 2052, 2058, 2059, 2043, 2041,
+ 2053, 2060, 2050, 2047, 2067, 2073, 2064, 2072, 2078, 2077,
+
+ 2088, 2086, 2080, 2083, 2093, 2100, 2108, 2102, 2091, 2111,
+ 2104, 2103, 2120, 2126, 2127, 2128, 2149, 2138, 2136, 2144,
+ 2150, 2143, 2146, 2131, 2153,10421, 2154, 2165, 2179, 2181,
+ 2186, 2187, 2189, 2183, 2178, 2193, 2184, 2198, 2195, 2202,
+ 2210, 2209, 2211, 2217, 2222, 2223, 2244, 2234, 2238, 2249,
+ 2242, 2246, 2225, 2239, 2250, 2252, 2255, 2259, 2258, 2261,
+ 2272, 2256, 2282, 2273, 2297, 2280, 2283, 2298, 2299, 2285,
+ 2286, 2300, 2301, 2310, 2308, 2312, 2331, 2338, 2324, 2335,
+ 2352, 2328, 2316, 2351, 2345, 2355, 2342, 2348, 2356, 2354,
+ 2365, 2359, 2367, 2361, 2375, 2380, 2378, 2384, 2401, 2391,
+
+ 2394, 2388, 2400, 2397, 2407, 2389, 2419, 2416, 2421, 2428,
+ 2424, 2431, 2433, 2435, 2440, 2443, 2455, 2459, 2447, 2466,
+ 2453, 2473, 2470, 2462, 2476, 2479, 2489, 2493, 2494, 2480,
+ 2503, 2505, 2491, 2506, 2490, 2497, 2518, 2517, 2520, 2534,
+ 2538, 2542, 2535, 2543, 2533, 2536, 2530, 2432, 2558, 2553,
+ 2566, 2555,10421, 2562, 2547, 2563, 2568, 2575, 2576, 2570,
+ 2589, 2584, 2593, 2578, 2579, 2597, 2643,10421, 2594,10421,
+ 10421, 2595,10421,10421, 2598, 2620,10421, 2591, 2623, 2624,
+ 2614, 2642, 2631, 2653, 2650, 2649, 2657, 2658, 2647, 2705,
+ 2666, 2694, 2616, 2669, 2664, 2676, 2698, 2703, 2692, 2710,
+
+ 2689, 2695, 2725, 2746, 2733, 2742, 2734, 2748, 2755, 2752,
+ 2751, 2758, 2683, 2760, 2747, 2745, 2761, 2773, 2775, 2769,
+ 2770, 2780, 2785, 2800, 2787, 2791, 2784, 2813, 2804, 2810,
+ 2824,10421, 2811, 2818, 2796, 2822, 2820, 2834, 2832, 2833,
+ 2836, 2841, 2846, 2840, 2837, 2845, 2849, 2847, 2838, 2842,
+ 2851, 2857, 2877, 2871, 2887, 2893, 2872, 2873,10421, 2880,
+ 2882, 2878, 2896, 2885, 2900, 2905, 2881, 2899, 2906, 2898,
+ 2936, 2920, 2938, 2925, 2916, 2932, 2921, 2926, 2943,10421,
+ 2947, 2950, 2937, 2951, 2948, 2959, 2960, 2933, 2964, 2981,
+ 2965, 2985, 2975, 2976, 2999, 2991, 2986, 2994, 2978, 2987,
+
+ 3003, 2996, 3005, 3024, 3033, 3015, 3018, 3026, 3020, 3031,
+ 3021, 3022, 3036, 3023, 3032, 3059, 3062, 3050, 3074, 3058,
+ 3053, 3079, 3080, 3077, 3057, 3075, 3078, 3067, 3089, 3097,
+ 3098, 3093, 3091, 3099, 3102, 3101, 3111, 3113, 3114, 3127,
+ 3132, 3120, 3129, 3136, 3122, 3141, 3146, 3123,10421, 3128,
+ 3139,10421, 3154, 3155, 3156, 3202, 3164, 3170, 3172, 3176,
+ 3168, 3181, 3183, 3192, 3195, 3201, 3189, 3208, 3210, 3227,
+ 3194, 3234, 3214, 3225, 3232, 3235, 3233, 3254, 3250, 3242,
+ 3259, 3270, 3272, 3268, 381, 3276, 3257, 3261, 3260, 3307,
+ 3273, 3284, 3282, 3290, 3291, 3293, 3314, 3312, 3310, 3311,
+
+ 3317, 3316, 3277, 3340, 3319, 3329, 3334, 3344, 3346, 3352,
+ 3361, 3348,10421, 3371, 3366, 3351, 3375, 3363, 3386, 3377,
+ 3381,10421, 3374, 3378, 3390, 3389, 3385, 3392, 3410, 3398,
+ 3408, 3403, 3412, 3417, 3419, 3414, 3431, 3404,10421, 3413,
+ 10421, 3438, 3416, 3427, 3441, 3443, 3444, 3446, 3459, 3467,
+ 10421,10421, 3469, 3468, 3465, 3481, 3483, 3471, 3470, 3487,
+ 10421, 3486, 3511,10421, 3514, 3490, 3506, 3489, 3499, 3504,
+ 3507, 3508, 3513, 3495, 3517, 3529, 3524, 3538, 3535,10421,
+ 3552, 3547, 3533, 3556, 3558, 3541, 3560, 3562, 3566, 3570,
+ 10421, 3572, 3559, 3585, 3577, 3573, 3583, 3588, 3598, 3594,
+
+ 3589, 3584, 3593, 3605, 3604, 3619, 3628, 3629, 3621, 3622,
+ 3634, 3631, 3642,10421, 3633, 3623, 3625, 3644, 3646, 3643,
+ 3648, 3650, 3661, 3649, 3655, 3676, 3677, 3670, 3678, 3669,
+ 3673, 3671, 3694, 3696, 3684, 3697, 3692, 3701, 3695, 3703,
+ 3698, 91, 3700, 3704, 3714, 3707,10421, 3719, 3735, 3729,
+ 3734, 3743, 3724, 128, 3736, 3740, 3741, 3747, 3745, 3749,
+ 3758, 3762, 3763, 3757, 3764, 3781, 3782, 3772, 3774, 3789,
+ 3777, 3776, 3790, 3791, 3793,10421, 3798, 3809, 3784, 3811,
+ 3801, 3810, 3827,10421, 3831, 3839, 3837, 3844, 3838, 3833,
+ 3848, 3836, 3834, 3867, 3872, 3861, 3869, 3888, 3879, 3871,
+
+ 3875, 3868,10421, 3889, 3892, 3895, 3890, 3896, 3905, 3911,
+ 3903, 3906, 3907, 3928, 3914, 3932, 3923, 3924, 3925, 3936,
+ 3938, 3934, 3898, 3937, 3948, 3933, 3959, 3953, 3965, 3960,
+ 3958, 3963, 3987, 3969,10421, 3993, 3976, 3980, 3990, 3982,
+ 3981, 3995, 3999, 4028, 4012, 4005, 4017, 4014, 4058, 4020,
+ 4025, 4018, 4042, 4046, 4026, 4041, 4060, 4069, 4048, 4061,
+ 4078, 4086, 4075, 4085, 4045, 4088, 4080, 4094, 4023, 4092,
+ 4053, 4116, 4109, 4113, 4107, 4139, 4118, 4111, 4134, 4133,
+ 4131,10421, 4145, 4136, 4144, 4138, 4158, 4173, 4161, 4152,
+ 4172, 4175, 4178, 4171, 4176, 4179, 4186, 4191, 4184, 4199,
+
+ 4194, 4204, 4198, 4201, 4217, 4211, 4205, 4222, 4056, 4218,
+ 4215, 4238,10421, 4243, 4236, 4228, 4239, 4250, 4232, 4253,
+ 4257, 4256, 4251, 4255, 4260, 4262, 4244, 4269, 4287, 4273,
+ 4274, 4289, 4283, 4295, 4280,10421, 4299, 4291, 4296, 4300,
+ 4301, 4307, 4303, 4326, 4332, 4336, 4339, 4338, 4319, 4342,
+ 4344, 4334,10421, 4349, 4350, 4352, 4355, 4354, 4363, 4361,
+ 4362, 4356, 4365,10421, 4381, 4375, 4384, 4376, 4377, 4378,
+ 4400, 4403, 4390,10421, 4411, 4395, 4399, 4405, 4402, 4417,
+ 4416, 4432, 4420, 4410, 4421, 4444, 4445, 4427, 4446,10421,
+ 4436, 4469, 4438, 4448, 4460, 4465, 4459, 4470, 4486, 4471,
+
+ 4487, 4476,10421, 4475, 4477, 4482, 4505, 4492, 4496, 4506,
+ 4520, 4521, 4523, 4509, 4510, 4529, 4515,10421, 4517, 4541,
+ 4542, 4538, 4536, 4546, 4551, 4548, 4562, 4555, 4553, 4563,
+ 4561, 4566, 4565, 4578, 4587, 4580, 4582, 4575, 4586, 4605,
+ 4601, 4608, 4598, 4614, 4624, 4625, 4612, 4628, 4630, 4631,
+ 4620, 4613, 4633, 4651, 4653, 4654, 4649, 4665,10421, 4659,
+ 4663, 4661, 4644, 4656, 4655, 4657, 4684, 4673, 4678, 4694,
+ 4699, 4689, 4688, 4713, 4722, 4700, 4705, 4709, 4716, 4710,
+ 4718, 4725, 4721, 4724, 4729, 4733, 4734, 4731, 4758, 4740,
+ 4760, 4768, 4745, 4751, 4755, 4756, 4761, 4762, 4752, 4777,
+
+ 4789, 4791, 4779, 4786, 4784, 4799, 4808, 4804, 4806, 4801,
+ 4797, 4811, 4802, 4838,10421, 4816, 4822, 4831, 4825, 4832,
+ 4850, 4851, 4835, 4849, 4842, 4858, 4861, 4859, 4870, 4860,
+ 4871, 4872, 4875, 4865, 4879,10421, 4876,10421, 4883, 4891,
+ 4899, 4910, 4892,10421, 4909,10421, 4908, 4913, 4898, 4901,
+ 4916,10421, 4921, 4925, 4922, 4920, 4930, 4933, 4938, 4937,
+ 4935, 4940, 4941, 4968, 4965, 4961, 4956, 4960, 4951, 4959,
+ 4983, 4977, 4971, 4985, 4981, 4994, 4995, 4980, 5004, 4987,
+ 5001, 5002, 5011, 5006, 5014,10421, 5024, 5027, 5021, 5032,
+ 5023, 5017, 5029, 5048, 5031, 5028, 5059, 5044, 5054, 5057,
+
+ 5063, 5056, 5064, 5058, 5071, 5083, 5084, 5062, 5098,10421,
+ 5085, 5097, 5087, 5096,10421, 5103, 5089, 5116, 5118, 5093,
+ 5104, 5112, 5125, 5120, 5114, 5124, 5130, 5155, 5142, 5133,
+ 5153,10421, 5157, 5159, 5143, 5171, 5162, 5151, 5176, 5181,
+ 5182, 5178, 5189, 5186, 5191, 5184, 5192, 5185, 5195, 5217,
+ 5199, 5212, 5226, 5222, 5230, 5205, 5224, 5233, 5231, 5216,
+ 5218, 5221, 5232, 5248, 5250, 5254, 5251, 5245, 5267, 5272,
+ 5257, 5239,10421, 5273, 5275, 5277, 5255, 5266, 5289, 5288,
+ 5292, 5304, 5282, 5302,10421, 5318, 5300, 5316, 5310, 5323,
+ 5313, 5312, 5317, 5336, 5333, 5331, 5349, 5350, 5345,10421,
+
+ 5351,10421, 5340, 5367, 5330, 5364, 5363, 5369, 5376, 5374,
+ 5372, 5381, 5377, 5392, 5402, 5386, 5394, 5406, 5397, 5408,
+ 5409, 5428, 5384, 5419, 5411, 5412, 5422, 5427, 5432, 5456,
+ 5445, 5449,10421,10421, 5435, 5439, 5462, 5466, 5454, 5455,
+ 5473, 5479, 5483, 5481, 5484, 5477, 5485, 5514,10421, 5501,
+ 5505, 5496, 5511, 5510, 5490, 5508, 5527, 5504, 5528, 5522,
+ 5539, 5534,10421, 5530, 5532, 5544, 5535, 5549, 5561,10421,
+ 5556,10421, 5551, 5553, 5555, 5557, 5563, 5560, 5573, 5580,
+ 5581, 5579, 5584, 5602, 5608, 5609, 5607, 5592, 5612, 5595,
+ 5599, 5611, 5614, 5618, 5629, 5606, 5624, 5625,10421, 5627,
+
+ 5626, 5644, 5642, 5639, 5655, 5656, 5653, 5641,10421, 5638,
+ 5654, 5669, 5665, 5670, 5678, 5674, 5667, 5676, 5684, 5686,
+ 5691, 5690, 5696,10421, 5688, 5689, 5715, 5712, 5701, 5720,
+ 5714, 5718, 5730,10421, 5727, 5722, 5738, 5737, 5728, 5741,
+ 5747, 5736, 5739, 5742, 5744, 5767, 5768, 5766, 5764, 5763,
+ 5774, 5787, 5765, 5792, 5781, 5783, 5780, 5757, 5790,10421,
+ 5799, 5801, 5802, 5800, 5810, 5831, 5818, 5838, 5822, 5835,
+ 5824, 5840, 5845, 5829, 5842, 5843, 5841, 5848, 5858, 5851,
+ 10421, 5860, 5856, 5881, 5875, 5857, 5883, 5888, 5869, 5887,
+ 5893, 5879, 5876, 5890, 5899, 5910, 5900, 5903, 5921, 5898,
+
+ 5923, 5909, 5917, 5919, 5922, 5936, 5946,10421, 5928, 5938,
+ 5932, 5955, 5953, 5956, 5958, 5945, 5966, 5967, 5975, 5950,
+ 5989, 5972, 5973, 5996, 5987, 5981,10421,10421, 6004, 5980,
+ 6000,10421, 6002, 5985, 5994, 6010, 6018, 6013, 6015, 6028,
+ 6016, 6020, 6038, 6022, 6040,10421, 6049, 6036, 6055, 6031,
+ 6047, 6064, 6058,10421, 6050, 6075, 6071, 6067, 6070, 6065,
+ 6066, 6076, 6081, 6077, 6085, 6082, 6091, 6104, 6106, 6115,
+ 6094, 6108, 6116,10421, 6099, 6102, 6125, 6128, 6110, 6121,
+ 6138,10421, 6135, 6141, 6148, 6133, 6147, 6158, 6155, 6162,
+ 6164, 6150, 6165, 6168, 6183, 6170, 6174, 6176, 6143, 6166,
+
+ 6189, 6197, 6186, 6207, 6208, 6214,10421, 6203, 6211, 6205,
+ 6215, 6219,10421, 6228, 6248, 6213,10421, 6238, 6224, 6232,
+ 6241, 6249,10421, 6244, 6254, 6245, 6259, 6236, 6267, 6247,
+ 6271, 6270, 6263, 6272, 6268, 6266,10421, 6277, 6283, 6274,
+ 10421, 6288, 6306, 6303, 6308, 6293, 6316, 6311, 6309, 6315,
+ 6318,10421, 6319,10421, 6320, 6310, 6325,10421, 6343, 6344,
+ 6334, 6331, 6348, 6354, 6358, 6361, 6360, 6342, 6365, 6349,
+ 6353, 6369, 6388, 6370, 6350, 6389, 6384, 6390,10421, 6406,
+ 6385, 6396, 6399, 6394, 6409, 6413, 6412, 6417, 6423, 6429,
+ 10421,10421, 6379,10421, 6416, 6431, 6432, 6436,10421, 6439,
+
+ 6443, 6458, 6444, 6459, 6462, 6449, 6468, 6465,10421, 6472,
+ 6476,10421, 6455, 6474, 6488, 6479, 6483, 6475, 6489, 6495,
+ 6510, 6487, 6486, 6500, 6503, 6514, 6502, 6522, 6506, 6547,
+ 6517, 6550,10421, 6523, 6534, 6539, 6532, 6536, 6544, 6559,
+ 6555, 6545,10421, 6563, 6571, 6558, 6570, 6581,10421, 6584,
+ 10421, 6583, 6585, 6587, 6578, 6590, 6611,10421, 6602, 6605,
+ 6613, 6596, 6620, 6614, 6628, 6629, 6600, 6612, 6615, 6642,
+ 6639, 6637, 6636, 6658, 6643,10421, 6640, 6654, 6653, 6672,
+ 6673, 6671, 6661, 6663, 6678, 6679, 6685, 6675, 6681, 6691,
+ 6692, 6695, 6706, 6708, 6710, 6703,10421, 6709, 6716, 6724,
+
+ 6711, 6746, 6727, 6720, 6733,10421, 6737, 6752, 6753,10421,
+ 6748, 6742, 6741, 6763, 6747, 6760, 6764, 6754, 6768, 6769,
+ 6771, 6789,10421, 6787, 6788, 6781, 6797, 6798, 6795, 6805,
+ 10421,10421, 6827,10421, 6811, 6784, 6820, 6818, 6812, 6831,
+ 6841, 6834, 6842, 6830, 6832, 6845, 6847, 6853,10421, 6858,
+ 6860, 6859, 6888, 6870, 6876, 6879, 6883, 6869,10421,10421,
+ 6884, 6897, 6886, 6890, 6893, 6880, 6887, 6904, 6921, 6900,
+ 6902, 6925, 6938,10421, 6931, 6914, 6932, 6917,10421, 6915,
+ 6941, 6920, 6939, 6944, 6933, 6929, 6955, 6964, 6952, 6977,
+ 6976, 6968, 6979, 6967, 6960, 6970, 6978, 6973, 6993, 6995,
+
+ 6991, 6989,10421, 7006, 7002, 7004, 7005, 7003, 7010, 7019,
+ 7018, 7015, 7022, 7033,10421, 7025,10421, 7031, 7041, 7050,
+ 7045, 7037, 7059, 7058, 7066, 7049, 7051, 7065, 7060, 7080,
+ 7088, 7089, 7094, 7082, 7083, 7086, 7100,10421, 7095, 7102,
+ 7110, 7105, 7112, 7119, 7115,10421, 7118, 7113, 7116, 7122,
+ 7135, 7148, 7132, 7152, 7137, 7153, 7139, 7160, 7156, 7157,
+ 7144, 7159, 7150, 7162, 7169,10421, 7185, 7170, 7172, 7173,
+ 7175, 7196, 7192, 7202, 7206, 7204, 7189, 7194, 7211,10421,
+ 7199, 7218, 7224, 7179,10421, 7219, 7215, 7220, 7229, 7223,
+ 7248, 7233, 7250, 7238, 7246,10421, 7258, 7242, 7256, 7245,
+
+ 7249, 7260, 7266, 7265, 7273, 7275, 7293, 7294,10421, 7301,
+ 7286, 7299, 7302, 7290, 7296, 7289, 7322, 7306,10421, 7325,
+ 7333, 7335, 7328, 7308, 7324, 7323, 7331, 7350, 7342, 7348,
+ 7336, 7351, 7363, 7352, 7359, 7367, 7373, 7374, 7370, 7386,
+ 7390, 7385,10421, 7378,10421, 7387, 7393, 7391, 7401, 7414,
+ 7395, 7405, 7403, 7416,10421, 7410, 7424, 7421, 7412, 7435,
+ 10421, 7433, 7430, 7432, 7437,10421, 7452, 7451, 7441, 7454,
+ 7458, 7468,10421, 7470, 7472, 7479, 7482, 7485, 7477, 7487,
+ 7476, 7488, 7480, 7491, 7481, 7493, 7496, 7508, 7519,10421,
+ 7506, 7498, 7526, 7525, 7529, 7527, 7531, 7518, 7535, 7541,
+
+ 7537,10421, 7542, 7528, 7551, 7552, 7546, 7555, 7556, 7565,
+ 7585, 7575, 7583, 7573, 7569, 7574, 7589, 7586, 7590,10421,
+ 7592, 7579, 7600, 7614, 7619, 7615, 7622,10421, 7616,10421,
+ 7612, 7621, 7627, 7630, 7636,10421, 7641, 7642, 7603, 7639,
+ 10421,10421, 7634, 7652, 7646, 7659, 7661,10421,10421, 7674,
+ 10421, 7657,10421, 7662, 7664,10421,10421, 7672, 7655, 7666,
+ 7673, 7685, 7683,10421, 7692,10421, 7699, 7686, 7694, 7682,
+ 7689, 7691,10421, 7701, 7712, 7717, 7718, 7724,10421, 7716,
+ 7722, 7721, 7739, 7719, 7725,10421, 7735, 7733, 7734, 7723,
+ 10421, 7754, 7765, 7764, 7752, 7762, 7759, 7768, 7774, 7761,
+
+ 7763, 7766, 7779, 7767, 7788, 7780, 7783, 7809, 7813, 7816,
+ 7805, 7800, 7814, 7820, 7822, 7824, 7826, 7810, 7827, 7835,
+ 7837, 7840, 7833, 7815, 7859, 7863, 7857, 7869, 7860, 7864,
+ 7861, 7850, 7874, 7882, 7883, 7878, 7880, 7881, 7866, 7884,
+ 7899, 7890, 7901, 7891, 7918, 7909, 7922, 7916, 7917, 7919,
+ 10421, 7906, 7931, 7933, 7935, 7940, 7950, 7952, 7937, 7963,
+ 7965,10421, 7967,10421, 7969, 7958, 7960, 7959, 7973,10421,
+ 7979, 7983, 7980, 7984, 7982, 7992, 7987, 7993, 7990, 8003,
+ 8022,10421, 8020, 8025, 8018, 8011, 8027, 8034,10421, 8028,
+ 8041, 8026, 8038, 8039, 8035, 8031, 8049, 8052, 8058, 8053,
+
+ 8068, 8077, 8078, 8061, 8064, 8080,10421, 8087, 8089, 8095,
+ 8085, 8088, 8083, 8073, 8097, 8091, 8093, 8101, 8107, 8109,
+ 8115, 8112, 8130, 8138, 8117, 8139, 8131,10421, 8118,10421,
+ 8134, 8128, 8148, 8149, 8145, 8146, 8159, 8144,10421,10421,
+ 8161, 8162, 8182, 8183, 8176, 8166, 8192, 8186, 8187, 8190,
+ 10421, 8189, 8200, 8193, 8201, 8195, 8210,10421, 8218, 8214,
+ 8216, 8198,10421, 8226, 8221, 8231, 8239, 8244, 8227, 8247,
+ 8250, 8242, 8243, 8237, 8248, 8252,10421,10421,10421,10421,
+ 8271, 8258, 8256, 8274, 8275, 8276, 8281, 8282, 8283, 8284,
+ 8273, 8279,10421, 8296,10421,10421, 8299,10421, 8300, 8298,
+
+ 8308, 8314, 8309, 8315, 8321,10421, 8318,10421, 8325, 8332,
+ 8319, 8338, 8343, 8339, 8331, 8347, 8346, 8349, 8345, 8351,
+ 8367, 8370, 8378, 8368, 8377, 8384, 8385,10421,10421, 8373,
+ 8387, 8388, 8393, 8394, 8396, 8389, 8397, 8404, 8402, 8410,
+ 8412, 8390, 8411, 8438, 8441, 8417, 8428, 8442,10421, 8436,
+ 8445, 8444,10421, 8439,10421, 8448, 8452, 8455, 8446, 8449,
+ 8472, 8474, 8484, 8477, 8487,10421,10421, 8470, 8463, 8489,
+ 10421,10421, 8475, 8473, 8476, 8479, 8505, 8500, 8490,10421,
+ 8515, 8517, 8527, 8503, 8514, 8531, 8516,10421, 8522,10421,
+ 8513, 8534, 8539, 8521, 8552, 8555, 8541, 8557, 8563, 8561,
+
+ 8545, 8562,10421, 8565, 8558,10421, 8580, 8573, 8577, 8560,
+ 8579, 8583, 8584,10421, 8590, 8594, 8595, 8602,10421, 8609,
+ 8610, 8608, 8606,10421, 8616,10421, 8603, 8619, 8620, 8649,
+ 8626,10421, 8607, 8630,10421, 8625, 8628, 8645, 8653, 8635,
+ 8647,10421, 8661, 8646,10421, 8643, 8666, 8667, 8669, 8662,
+ 8671, 8665, 8679, 8672, 8684, 8681, 8696,10421,10421, 8687,
+ 8680, 73, 8715, 8693, 8682, 8698, 8695, 8708, 8692, 8722,
+ 8721,10421,10421, 8725,10421, 8723, 8729,10421, 8709, 8735,
+ 8736, 8749, 8728, 8750, 8727, 8755, 8746, 8756, 8775, 8757,
+ 8753, 8773,10421, 8790, 8792, 8782, 8779, 8787, 8802, 8806,
+
+ 8809, 8811, 8800, 8799, 8798, 8794, 8808, 8819, 8813, 8836,
+ 8833, 8828, 8830, 8834,10421, 8844, 8852, 8853, 8843, 8862,
+ 8859, 8846,10421, 8866, 8860, 8872, 8869,10421, 8876, 8873,
+ 8875, 8879, 8881,10421, 8877, 8878, 8897, 8894, 8901, 8893,
+ 8896, 8899, 8909, 8918,10421, 8903, 8922, 8915,10421,10421,
+ 10421, 8927, 8933, 8921,10421, 8938, 8926, 8925, 8937,10421,
+ 8944, 8942, 8945,10421,10421,10421, 8936, 8963, 8964,10421,
+ 8954, 8796,10421, 8958,10421, 8959,10421, 8971, 8978, 8965,
+ 8985,10421, 8982, 8962, 8990, 8995,10421, 8979, 9008, 9011,
+ 9006, 8993, 8997, 9014,10421, 9023, 9020, 9022, 9028, 9012,
+
+ 9017, 9024, 9031, 9035, 9037, 9034, 9048,10421, 9056, 9061,
+ 9062, 9064, 9049, 9054, 9055,10421, 9051,10421, 9073,10421,
+ 9072, 9077, 9088, 9075, 9094, 9089, 9091, 9099, 9104, 9093,
+ 9118, 9102, 9096, 9098, 9108, 9122, 9120,10421,10421, 9148,
+ 9128,10421, 9127, 9144,10421, 9129,10421, 9152,10421, 9137,
+ 9141, 9154, 9145, 9158,10421,10421, 9162, 9147, 9156, 9175,
+ 9155, 9173, 9168,10421, 9190, 9179, 9177, 9176,10421, 9202,
+ 10421, 9181, 9203, 9194,10421, 9185, 9209, 9210, 9198, 9195,
+ 9216, 9200, 9222, 9212, 9224, 9214, 9234, 9225, 9244, 9238,
+ 9247, 9251, 9255,10421,10421,10421, 9236, 9237, 9252, 9266,
+
+ 9264, 9260, 9258,10421, 9263, 9269, 9265, 9279, 9291, 9282,
+ 9288,10421, 9277, 9283, 9280, 9295, 9302, 9292, 9296, 9304,
+ 10421, 9314, 9317, 9320, 9316, 9310, 9325, 9333, 9334, 9336,
+ 9342, 9332, 9323, 9351, 9348,10421,10421, 9354, 9339,10421,
+ 9356, 9358,10421, 9343,10421, 9346, 9352, 9365, 9364, 9366,
+ 10421, 9371, 9361, 9377, 9376,10421, 9379, 9388, 9400, 9402,
+ 10421, 9389, 9382, 9385, 9391, 9403,10421,10421, 9398, 9420,
+ 10421, 9421, 9417, 9414, 9436, 9426, 9425, 9439, 9435,10421,
+ 9441, 9437, 9423, 9431, 9449, 9444, 9453,10421, 9465, 9455,
+ 9457, 9467,10421, 9461, 9469, 9472, 9470, 9488,10421, 9497,
+
+ 9478, 9480, 9503,10421, 9499, 9506, 9500,10421,10421,10421,
+ 9495, 9510, 9507,10421,10421,10421,10421, 9521, 9518, 9512,
+ 9528,10421, 9517,10421,10421, 9541, 9544, 9553, 9547, 9555,
+ 9545,10421, 9551, 9548, 9560, 9543, 9550,10421,10421, 9562,
+ 9546, 9559, 9576, 9565, 9574,10421,10421, 9570, 9578, 9592,
+ 9589, 9584,10421, 9582, 9597, 9604, 9601, 9606, 9613, 9614,
+ 9603, 9612, 9623, 9620, 9641, 9621, 9627, 9622, 9633, 9647,
+ 9634, 9651, 9660, 9650, 9657, 9658, 9648, 9659,10421,10421,
+ 9666,10421, 9667, 9662,10421, 9654,10421, 9676, 9682, 9688,
+ 9692,10421, 9695, 9696, 9697, 9700, 9675,10421, 9698, 9704,
+
+ 9705, 9699, 9694, 9690,10421, 9711, 9693, 9713, 9703, 9716,
+ 9724, 9740, 9742,10421, 9731, 9744,10421,10421, 9730, 9747,
+ 9726, 9753, 9737,10421, 9756, 9765, 9735, 9761, 9751, 9767,
+ 9768,10421, 9781, 9763,10421,10421, 9792, 9774,10421,10421,
+ 9776, 9771,10421,10421,10421,10421,10421,10421,10421,10421,
+ 9795, 9801,10421,10421, 9793, 9805, 9807,10421, 9809,10421,
+ 9790, 9812, 9811, 9810,10421, 9827,10421, 9820, 9824, 9839,
+ 9823, 9831, 9848, 9832, 9834, 9837, 9840, 9838, 9854, 9851,
+ 9862, 9872, 9858, 9881, 9865, 9888, 9871, 9889,10421,10421,
+ 10421, 9883, 9873, 9895, 9896, 9902, 9906, 9903, 9909, 9898,
+
+ 9892, 9911, 9921, 9922, 9910, 9913, 9936, 9929, 9930, 9940,
+ 9946, 9931, 9947, 9950,10421, 9952, 9944, 9941, 9961,10421,
+ 9949,10421, 9948,10421,10421, 9965, 9979, 9973, 9963, 9988,
+ 9989, 9971, 9983, 9975, 9990, 9997,10421, 9999,10421,10421,
+ 10421, 9984, 9993,10421, 9987,10000,10421, 9998,10014,10010,
+ 10017,10020,10015,10031,10038,10035,10421,10421,10028,10032,
+ 10045,10039,10044,10056,10051,10062,10063,10069,10054,10058,
+ 10421,10080,10077,10084,10421,10083,10078,10079,10089,10093,
+ 10098,10096,10090,10421,10091,10421,10099,10119,10116,10110,
+ 10113,10109,10126,10133,10134,10421,10118,10140,10143,10149,
+
+ 10151,10158,10157,10153,10166,10168,10167,10175,10174,10176,
+ 10178,10177,10179,10421,10186,10188,10421,10187,10206,10193,
+ 10199,10215,10421,10217,10202,10203,10226,10223,10224,10421,
+ 10228,10232,10229,10421,10230,10421,10421,10241,10233,10242,
+ 10237,10240,10421,10421,10421,10301,10308,10315,10322,10329,
+ 10336,10343, 102,10350,10357,10364,10371,10378,10385,10392,
+ 10399,10406,10413
} ;
-static const flex_int16_t yy_def[3618] =
+static const flex_int16_t yy_def[3664] =
{ 0,
- 3599, 1, 3600, 3600, 3601, 3601, 3602, 3602, 3603, 3603,
- 3604, 3604, 3605, 3605, 3606, 3606, 3599, 3607, 3599, 3599,
- 3599, 3599, 3608, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3609, 3599, 3599, 3599,
- 3609, 3610, 3599, 3599, 3599, 3610, 3611, 3599, 3599, 3599,
- 3599, 3611, 3612, 3599, 3599, 3599, 3612, 3613, 3599, 3614,
- 3599, 3613, 3613, 3615, 3599, 3599, 3599, 3599, 3615, 3616,
- 3599, 3599, 3599, 3616, 3607, 3607, 3599, 3617, 3608, 3617,
- 3608, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3609,
- 3609, 3610, 3610, 3611, 3611, 3599, 3612, 3612, 3613, 3613,
- 3614, 3614, 3613, 3615, 3615, 3599, 3616, 3616, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3613, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3613, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3613, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3613, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3599, 3599, 3607, 3599, 3599,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3613, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3613, 3613, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3613, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3613, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3599, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
-
- 3607, 3613, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3599, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
-
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3613,
- 3607, 3599, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3599, 3607,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3599, 3607, 3599, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3599, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3599, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3599, 3599, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
- 3607, 3607, 3613, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3599, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3613, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3599, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3599, 3607, 3607, 3607, 3607, 3607, 3599,
- 3599, 3607, 3599, 3607, 3599, 3607, 3607, 3599, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3613, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3599, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3599, 3599, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
- 3607, 3599, 3599, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3613, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3599, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3599,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3599, 3607, 3607, 3607, 3599, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3599, 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3599, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3599, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3599, 3599, 3607, 3607, 3613, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3599, 3607, 3599, 3607, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
-
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3599, 3599,
- 3599, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3599,
- 3607, 3607, 3607, 3599, 3599, 3599, 3607, 3607, 3607, 3599,
- 3607, 3607, 3599, 3607, 3599, 3607, 3599, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3599, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3599, 3607,
-
- 3607, 3607, 3599, 3607, 3599, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3599, 3599, 3607, 3607, 3607, 3607, 3607, 3607,
- 3599, 3607, 3607, 3607, 3607, 3599, 3607, 3599, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3599, 3599, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3599, 3607, 3607, 3599, 3607, 3599, 3607,
-
- 3599, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3599, 3599, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3599, 3599, 3599, 3607, 3607, 3607, 3599, 3599,
- 3599, 3599, 3607, 3607, 3607, 3607, 3599, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3599, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
-
- 3599, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3599, 3607, 3599, 3607, 3607, 3599, 3607,
- 3599, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3607,
- 3607, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3599, 3599, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3599, 3599,
- 3607, 3607, 3599, 3599, 3607, 3607, 3599, 3599, 3599, 3599,
-
- 3599, 3599, 3599, 3599, 3607, 3607, 3599, 3599, 3607, 3607,
- 3607, 3599, 3607, 3599, 3607, 3607, 3607, 3607, 3599, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3599, 3599, 3599, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3599, 3607, 3599, 3607, 3599, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3599, 3607, 3599, 3599, 3599, 3607, 3607, 3599, 3607, 3607,
-
- 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3599, 3599, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3599, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
- 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607,
- 3599, 3607, 3607, 3607, 3607, 3607, 3599, 3607, 3607, 3607,
- 3607, 3607, 3607, 3599, 3607, 3607, 3607, 3599, 3607, 3599,
- 3599, 3607, 3607, 3607, 3607, 3607, 3599, 3599, 0, 3599,
-
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599
+ 3645, 1, 3646, 3646, 3647, 3647, 3648, 3648, 3649, 3649,
+ 3650, 3650, 3651, 3651, 3652, 3652, 3645, 3653, 3645, 3645,
+ 3645, 3645, 3654, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3655, 3645, 3645, 3645,
+ 3655, 3656, 3645, 3645, 3645, 3656, 3657, 3645, 3645, 3645,
+ 3645, 3657, 3658, 3645, 3645, 3645, 3658, 3659, 3645, 3660,
+ 3645, 3659, 3659, 3661, 3645, 3645, 3645, 3645, 3661, 3662,
+ 3645, 3645, 3645, 3662, 3653, 3653, 3645, 3663, 3654, 3663,
+ 3654, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3655,
+ 3655, 3656, 3656, 3657, 3657, 3645, 3658, 3658, 3659, 3659,
+ 3660, 3660, 3659, 3661, 3661, 3645, 3662, 3662, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3659, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3659, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3659, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3659,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3645,
+ 3645, 3653, 3645, 3645, 3653, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3659, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3659, 3659, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3659, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3659, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3659, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3659, 3653, 3645, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3645, 3653, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3645, 3653, 3645, 3653, 3653, 3653, 3653, 3645, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3645, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3659, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3659, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3645, 3645, 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653,
+ 3645, 3653, 3645, 3653, 3653, 3645, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3659, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3645, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3645, 3645, 3653, 3645, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3659, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653, 3653, 3653,
+ 3645, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3645, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653,
+ 3653, 3659, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3645, 3653, 3645, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3645, 3645,
+ 3645, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3645, 3645, 3645, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3645, 3653, 3645, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3645, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653,
+ 3653, 3645, 3653, 3653, 3645, 3653, 3645, 3653, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3645, 3653,
+ 3645, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3645, 3645, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653, 3653, 3645,
+ 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3645, 3653,
+
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3645, 3645, 3645,
+ 3653, 3653, 3653, 3645, 3645, 3645, 3645, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3645, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3645,
+ 3653, 3645, 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3645, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3645, 3653, 3653, 3645, 3645, 3653, 3653, 3645, 3645,
+ 3653, 3653, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3653, 3653, 3645, 3645, 3653, 3653, 3653, 3645, 3653, 3645,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3645,
+ 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3645, 3653, 3645, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3645, 3645,
+ 3645, 3653, 3653, 3645, 3653, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3645, 3645, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3645, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3645, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3645, 3653, 3653, 3653, 3653,
+
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3645, 3653, 3653, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3653, 3653, 3653, 3653, 3653, 3653, 3645,
+ 3653, 3653, 3653, 3645, 3653, 3645, 3645, 3653, 3653, 3653,
+ 3653, 3653, 3645, 3645, 0, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645
} ;
-static const flex_int16_t yy_nxt[10350] =
+static const flex_int16_t yy_nxt[10488] =
{ 0,
18, 19, 20, 21, 22, 23, 22, 18, 18, 18,
18, 18, 22, 24, 25, 26, 27, 28, 29, 18,
@@ -1623,12 +1638,12 @@ static const flex_int16_t yy_nxt[10350] =
59, 60, 61, 120, 22, 58, 59, 60, 61, 86,
22, 64, 65, 66, 64, 65, 66, 87, 160, 160,
- 1351, 88, 85, 51, 119, 86, 51, 167, 167, 56,
+ 1358, 88, 85, 51, 119, 86, 51, 167, 167, 56,
120, 56, 170, 75, 76, 77, 78, 62, 22, 75,
76, 77, 78, 62, 22, 81, 82, 83, 67, 97,
86, 67, 19, 20, 21, 69, 70, 71, 19, 20,
21, 69, 70, 71, 81, 82, 83, 121, 108, 177,
- 177, 79, 72, 159, 413, 86, 97, 79, 72, 86,
+ 177, 79, 72, 159, 415, 86, 97, 79, 72, 86,
137, 90, 84, 90, 90, 86, 90, 170, 109, 178,
73, 86, 90, 86, 121, 108, 73, 176, 87, 72,
159, 84, 88, 86, 130, 72, 112, 137, 110, 162,
@@ -1639,8 +1654,8 @@ static const flex_int16_t yy_nxt[10350] =
173, 113, 86, 98, 86, 188, 166, 92, 93, 111,
99, 94, 114, 165, 100, 187, 95, 101, 85, 162,
85, 85, 162, 85, 163, 96, 102, 161, 115, 85,
- 103, 116, 189, 104, 181, 105, 106, 253, 117, 164,
- 118, 164, 164, 293, 164, 86, 107, 90, 86, 90,
+ 103, 116, 189, 104, 181, 105, 106, 254, 117, 164,
+ 118, 164, 164, 294, 164, 86, 107, 90, 86, 90,
90, 86, 90, 102, 86, 115, 122, 103, 116, 189,
104, 181, 105, 106, 123, 117, 180, 118, 126, 86,
124, 86, 127, 107, 125, 86, 156, 160, 160, 148,
@@ -1649,1110 +1664,1125 @@ static const flex_int16_t yy_nxt[10350] =
150, 123, 176, 180, 86, 126, 151, 124, 179, 127,
175, 125, 86, 156, 152, 86, 148, 157, 149, 167,
167, 158, 170, 128, 153, 129, 131, 150, 154, 155,
- 132, 182, 86, 151, 133, 179, 331, 86, 168, 206,
+ 132, 182, 86, 151, 133, 179, 332, 86, 168, 206,
134, 152, 169, 135, 169, 169, 86, 169, 86, 184,
136, 153, 86, 131, 195, 154, 155, 132, 182, 86,
174, 133, 174, 174, 166, 174, 206, 134, 86, 85,
- 135, 85, 85, 86, 85, 335, 184, 136, 138, 1198,
+ 135, 85, 85, 86, 85, 336, 184, 136, 138, 1204,
85, 195, 139, 90, 183, 90, 90, 207, 90, 185,
165, 86, 140, 141, 90, 142, 86, 193, 194, 197,
196, 163, 186, 161, 86, 138, 86, 86, 86, 139,
- 86, 183, 262, 86, 207, 337, 185, 198, 86, 140,
+ 86, 183, 263, 86, 207, 338, 185, 198, 86, 140,
141, 91, 142, 143, 193, 194, 144, 196, 190, 186,
- 199, 86, 200, 145, 191, 202, 192, 146, 147, 262,
- 341, 201, 86, 86, 198, 86, 208, 86, 210, 86,
- 143, 209, 86, 144, 86, 190, 343, 199, 86, 200,
+ 199, 86, 200, 145, 191, 202, 192, 146, 147, 263,
+ 342, 201, 86, 86, 198, 86, 208, 86, 210, 86,
+ 143, 209, 86, 144, 86, 190, 344, 199, 86, 200,
145, 191, 202, 192, 146, 147, 203, 204, 201, 86,
- 86, 211, 86, 208, 205, 210, 216, 3599, 209, 218,
- 212, 3599, 86, 213, 86, 177, 177, 86, 86, 219,
+ 86, 211, 86, 208, 205, 210, 216, 3645, 209, 218,
+ 212, 3645, 86, 213, 86, 177, 177, 86, 86, 219,
- 3599, 3599, 3599, 203, 204, 221, 214, 215, 211, 222,
- 217, 205, 227, 3599, 86, 226, 218, 212, 86, 220,
+ 3645, 3645, 3645, 203, 204, 221, 214, 215, 211, 222,
+ 217, 205, 227, 3645, 86, 226, 218, 212, 86, 220,
213, 86, 224, 228, 229, 223, 219, 225, 86, 86,
86, 232, 221, 214, 215, 86, 222, 217, 86, 227,
230, 231, 226, 86, 235, 86, 220, 234, 233, 224,
228, 229, 223, 86, 225, 86, 236, 237, 232, 86,
- 86, 3599, 241, 3599, 246, 238, 86, 230, 231, 239,
- 86, 235, 3599, 240, 234, 233, 86, 3599, 242, 86,
- 86, 247, 86, 236, 237, 86, 243, 86, 86, 241,
- 248, 246, 238, 252, 261, 244, 239, 254, 86, 249,
-
- 240, 245, 86, 3599, 260, 242, 3599, 86, 247, 86,
- 250, 3599, 86, 243, 251, 86, 255, 248, 258, 263,
- 252, 261, 244, 86, 254, 270, 249, 3599, 245, 259,
- 86, 260, 267, 256, 86, 268, 257, 250, 86, 269,
- 264, 251, 86, 255, 3599, 258, 263, 86, 271, 265,
- 3599, 272, 270, 3599, 86, 3599, 259, 86, 3599, 267,
- 256, 266, 268, 257, 86, 86, 269, 264, 273, 164,
- 86, 164, 164, 275, 164, 271, 265, 169, 272, 169,
- 169, 90, 169, 90, 90, 274, 90, 276, 266, 277,
- 278, 174, 170, 174, 174, 273, 174, 281, 86, 279,
-
- 283, 282, 86, 284, 3599, 86, 280, 86, 86, 285,
- 374, 345, 274, 86, 276, 86, 277, 278, 86, 172,
- 86, 287, 286, 290, 281, 86, 279, 283, 282, 86,
- 284, 86, 288, 280, 291, 86, 285, 374, 289, 86,
- 292, 294, 304, 86, 302, 295, 306, 305, 287, 286,
- 290, 310, 3599, 303, 86, 307, 86, 308, 86, 314,
- 309, 291, 296, 3599, 86, 289, 86, 292, 86, 86,
- 86, 302, 295, 306, 86, 86, 311, 86, 310, 86,
- 303, 86, 307, 315, 308, 316, 314, 309, 313, 296,
- 297, 317, 320, 3599, 86, 298, 3599, 3599, 86, 318,
-
- 299, 86, 319, 86, 312, 3599, 300, 301, 86, 332,
- 315, 86, 316, 86, 86, 313, 321, 297, 317, 320,
- 322, 3599, 298, 328, 348, 329, 318, 299, 330, 319,
- 333, 312, 86, 300, 301, 86, 332, 336, 86, 86,
- 338, 334, 86, 321, 86, 86, 344, 322, 323, 342,
- 328, 324, 329, 325, 339, 330, 86, 340, 350, 3599,
- 3599, 346, 86, 86, 336, 326, 347, 327, 334, 86,
- 3599, 86, 86, 344, 86, 323, 342, 349, 324, 86,
- 325, 339, 351, 3599, 340, 350, 86, 352, 346, 86,
- 3599, 86, 326, 347, 327, 357, 353, 355, 356, 359,
-
- 358, 362, 360, 368, 349, 354, 363, 3599, 86, 351,
- 86, 86, 86, 86, 352, 364, 86, 86, 86, 371,
- 366, 361, 357, 353, 355, 356, 359, 358, 86, 360,
- 365, 367, 354, 86, 373, 86, 86, 86, 372, 86,
- 369, 370, 364, 86, 375, 86, 376, 366, 361, 86,
- 377, 86, 86, 378, 379, 380, 86, 365, 367, 381,
- 385, 373, 86, 382, 384, 372, 86, 369, 370, 383,
- 387, 375, 388, 376, 86, 3599, 86, 3599, 391, 392,
- 390, 379, 86, 386, 86, 86, 381, 86, 3599, 389,
- 382, 86, 86, 393, 170, 86, 383, 86, 394, 388,
-
- 86, 86, 86, 3599, 395, 391, 392, 390, 396, 397,
- 386, 86, 398, 86, 399, 400, 389, 86, 401, 402,
- 393, 403, 408, 405, 86, 394, 404, 409, 406, 411,
- 86, 395, 86, 86, 410, 396, 397, 86, 407, 86,
- 86, 86, 400, 412, 86, 401, 86, 415, 403, 408,
- 405, 86, 416, 404, 86, 406, 411, 86, 86, 86,
- 418, 410, 414, 3599, 417, 407, 419, 421, 422, 86,
- 412, 86, 86, 86, 415, 86, 420, 424, 86, 416,
- 423, 426, 428, 425, 432, 86, 86, 418, 86, 414,
- 86, 417, 427, 419, 421, 422, 86, 431, 429, 86,
-
- 433, 436, 434, 420, 3599, 3599, 86, 423, 86, 86,
- 425, 432, 440, 86, 86, 430, 438, 86, 437, 427,
- 442, 86, 86, 86, 431, 429, 435, 86, 436, 86,
- 439, 441, 86, 443, 86, 446, 450, 445, 86, 440,
- 444, 447, 430, 438, 86, 437, 86, 442, 86, 448,
- 86, 86, 451, 435, 452, 86, 86, 439, 441, 453,
- 443, 86, 446, 450, 445, 460, 449, 444, 447, 462,
- 3599, 461, 3599, 86, 86, 3599, 448, 3599, 86, 494,
- 86, 452, 467, 86, 86, 3599, 453, 3599, 3599, 474,
- 3599, 86, 460, 449, 454, 3599, 462, 455, 461, 463,
-
- 469, 464, 456, 457, 458, 459, 86, 475, 468, 467,
- 3599, 86, 86, 86, 465, 86, 474, 466, 470, 471,
- 472, 454, 86, 86, 455, 473, 463, 469, 464, 456,
- 457, 458, 459, 482, 86, 468, 478, 476, 479, 3599,
- 477, 465, 484, 86, 466, 470, 471, 86, 86, 3599,
- 86, 86, 86, 483, 485, 489, 480, 481, 3599, 486,
- 482, 487, 488, 478, 476, 479, 86, 477, 501, 86,
- 491, 86, 492, 3599, 86, 490, 86, 86, 86, 86,
- 483, 485, 489, 480, 481, 86, 486, 86, 487, 488,
- 86, 493, 3599, 495, 499, 496, 507, 491, 512, 492,
-
- 86, 86, 490, 86, 497, 500, 502, 503, 515, 86,
- 514, 498, 505, 504, 506, 3599, 86, 557, 493, 86,
- 495, 499, 496, 507, 513, 512, 570, 86, 86, 86,
- 508, 497, 500, 502, 503, 86, 86, 516, 498, 505,
- 504, 506, 86, 509, 530, 529, 510, 534, 511, 86,
- 86, 513, 86, 532, 86, 533, 537, 508, 86, 86,
- 86, 3599, 531, 535, 516, 86, 3599, 86, 86, 86,
- 509, 530, 529, 510, 534, 511, 517, 547, 518, 536,
- 532, 548, 533, 537, 519, 546, 549, 86, 520, 531,
- 535, 553, 552, 521, 3599, 86, 522, 86, 170, 86,
-
- 550, 556, 86, 517, 547, 518, 536, 551, 568, 86,
- 554, 519, 546, 86, 555, 520, 558, 86, 553, 552,
- 521, 86, 86, 522, 523, 560, 524, 550, 556, 559,
- 86, 561, 86, 567, 551, 568, 86, 554, 86, 525,
- 562, 555, 526, 558, 527, 86, 528, 575, 609, 3599,
- 86, 523, 560, 524, 565, 566, 559, 3599, 3599, 3599,
- 567, 86, 86, 86, 3599, 569, 525, 562, 3599, 526,
- 571, 527, 3599, 528, 538, 539, 563, 86, 573, 86,
- 86, 565, 566, 572, 540, 541, 542, 543, 544, 577,
- 86, 545, 569, 86, 564, 574, 86, 571, 86, 86,
-
- 86, 538, 539, 563, 576, 573, 86, 578, 86, 3599,
- 572, 540, 541, 542, 543, 544, 577, 581, 545, 579,
- 580, 564, 574, 586, 86, 582, 583, 584, 3599, 86,
- 585, 576, 3599, 593, 578, 590, 86, 86, 587, 588,
- 86, 594, 3599, 614, 581, 86, 591, 3599, 86, 86,
- 586, 3599, 582, 583, 584, 86, 589, 585, 86, 86,
- 593, 592, 590, 86, 595, 587, 588, 596, 594, 86,
- 597, 598, 610, 591, 611, 86, 86, 3599, 86, 86,
- 612, 599, 600, 589, 86, 3599, 613, 618, 592, 616,
- 86, 595, 617, 601, 596, 602, 86, 597, 598, 610,
-
- 86, 611, 619, 86, 86, 3599, 615, 612, 599, 600,
- 86, 86, 86, 613, 618, 86, 616, 621, 3599, 617,
- 601, 620, 602, 603, 86, 623, 622, 624, 86, 619,
- 626, 604, 605, 615, 629, 606, 607, 625, 627, 608,
- 86, 630, 628, 86, 621, 86, 86, 86, 620, 86,
- 603, 86, 86, 622, 624, 631, 86, 626, 604, 605,
- 635, 629, 606, 607, 625, 86, 608, 632, 630, 628,
- 86, 633, 637, 636, 640, 86, 638, 86, 639, 634,
- 86, 86, 631, 643, 641, 3599, 645, 635, 646, 86,
- 644, 86, 86, 642, 632, 3599, 86, 86, 633, 637,
-
- 636, 640, 86, 638, 648, 639, 634, 86, 86, 86,
- 643, 641, 86, 645, 86, 646, 647, 644, 649, 650,
- 642, 86, 651, 652, 86, 654, 653, 655, 86, 656,
- 86, 648, 86, 657, 86, 658, 3599, 662, 86, 659,
- 664, 86, 86, 647, 86, 649, 650, 86, 86, 651,
- 652, 660, 654, 653, 655, 661, 656, 663, 86, 665,
- 657, 666, 658, 669, 667, 671, 659, 668, 86, 86,
- 673, 675, 86, 674, 86, 86, 670, 86, 660, 672,
- 86, 86, 661, 86, 663, 676, 665, 86, 666, 86,
- 669, 667, 671, 679, 668, 86, 678, 86, 675, 680,
-
- 674, 681, 86, 670, 86, 683, 672, 86, 677, 86,
- 682, 686, 684, 687, 685, 86, 688, 86, 697, 3599,
- 679, 86, 86, 678, 86, 86, 680, 86, 681, 3599,
- 86, 700, 683, 86, 701, 677, 86, 682, 686, 684,
- 687, 685, 86, 688, 689, 697, 698, 712, 699, 690,
- 702, 691, 86, 703, 86, 707, 704, 692, 700, 693,
- 86, 701, 694, 695, 86, 86, 3599, 86, 3599, 696,
- 86, 689, 86, 698, 712, 699, 690, 702, 691, 86,
- 703, 705, 707, 704, 692, 706, 693, 708, 710, 694,
- 695, 711, 713, 715, 718, 716, 696, 3599, 86, 86,
-
- 720, 717, 714, 86, 719, 86, 86, 709, 705, 86,
- 722, 86, 706, 3599, 708, 710, 726, 721, 711, 86,
- 715, 718, 716, 723, 86, 86, 86, 720, 717, 714,
- 724, 719, 727, 728, 709, 86, 86, 722, 86, 725,
- 86, 729, 86, 726, 721, 86, 730, 731, 733, 732,
- 723, 86, 734, 3599, 735, 86, 737, 724, 3599, 727,
- 728, 86, 736, 86, 86, 738, 725, 744, 729, 86,
- 86, 739, 742, 730, 731, 733, 732, 86, 740, 734,
- 86, 735, 741, 86, 86, 170, 86, 743, 86, 736,
- 86, 746, 738, 745, 744, 86, 86, 747, 739, 742,
-
- 86, 749, 748, 750, 751, 740, 752, 86, 3599, 741,
- 753, 3599, 754, 755, 743, 756, 86, 3599, 746, 86,
- 745, 86, 757, 758, 747, 86, 86, 86, 86, 748,
- 768, 751, 771, 3599, 762, 86, 86, 753, 86, 754,
- 755, 759, 756, 766, 86, 86, 765, 86, 760, 757,
- 758, 761, 763, 767, 769, 770, 774, 764, 772, 86,
- 86, 762, 86, 773, 86, 86, 775, 777, 759, 3599,
- 86, 776, 86, 765, 778, 760, 780, 779, 761, 3599,
- 86, 86, 86, 774, 86, 86, 86, 781, 782, 784,
- 86, 86, 786, 775, 777, 86, 86, 86, 776, 785,
-
- 787, 778, 783, 780, 779, 788, 86, 86, 789, 790,
- 86, 86, 791, 794, 781, 782, 784, 86, 792, 86,
- 795, 793, 86, 797, 86, 86, 785, 787, 86, 783,
- 796, 86, 788, 86, 86, 789, 790, 799, 86, 791,
- 794, 800, 86, 801, 86, 792, 798, 795, 793, 806,
- 797, 807, 808, 86, 809, 3599, 86, 796, 86, 812,
- 810, 86, 811, 86, 814, 86, 802, 815, 800, 86,
- 801, 803, 86, 798, 804, 805, 806, 86, 807, 808,
- 813, 809, 86, 817, 86, 86, 812, 810, 816, 811,
- 86, 819, 86, 802, 815, 820, 86, 822, 803, 821,
-
- 823, 804, 805, 824, 828, 818, 86, 813, 86, 86,
- 817, 825, 86, 86, 826, 816, 829, 835, 819, 86,
- 3599, 86, 820, 86, 822, 86, 821, 823, 827, 830,
- 824, 86, 818, 831, 86, 86, 86, 86, 825, 86,
- 832, 826, 834, 829, 833, 836, 837, 838, 839, 86,
- 840, 86, 842, 841, 847, 827, 830, 86, 3599, 3599,
- 831, 86, 86, 845, 849, 843, 86, 832, 844, 834,
- 86, 833, 836, 837, 86, 86, 86, 840, 86, 842,
- 841, 86, 848, 846, 850, 86, 86, 851, 3599, 86,
- 845, 86, 843, 852, 853, 844, 86, 861, 855, 854,
-
- 860, 3599, 856, 862, 86, 86, 3599, 865, 86, 848,
- 846, 850, 86, 857, 851, 86, 86, 863, 3599, 876,
- 852, 86, 866, 867, 861, 855, 86, 858, 859, 856,
- 862, 864, 86, 86, 865, 86, 868, 870, 86, 86,
- 857, 871, 86, 86, 863, 86, 876, 3599, 874, 866,
- 867, 869, 872, 875, 858, 859, 86, 877, 864, 86,
- 86, 878, 873, 868, 879, 880, 881, 882, 871, 86,
- 3599, 886, 86, 883, 86, 86, 86, 884, 869, 872,
- 86, 888, 86, 887, 877, 86, 86, 891, 878, 873,
- 86, 879, 880, 881, 882, 885, 86, 889, 896, 86,
-
- 883, 890, 86, 86, 884, 895, 86, 892, 888, 86,
- 887, 893, 897, 86, 891, 86, 898, 86, 899, 86,
- 894, 901, 885, 900, 889, 3599, 903, 86, 890, 86,
- 86, 86, 895, 86, 892, 86, 902, 904, 893, 897,
- 905, 3599, 913, 898, 86, 899, 86, 894, 901, 86,
- 900, 86, 906, 903, 909, 911, 907, 908, 910, 912,
- 915, 86, 86, 902, 904, 86, 86, 905, 86, 913,
- 914, 3599, 86, 86, 917, 3599, 918, 86, 919, 906,
- 916, 909, 911, 907, 908, 910, 912, 915, 86, 86,
- 86, 920, 922, 86, 923, 924, 921, 914, 927, 3599,
-
- 86, 917, 86, 918, 86, 919, 86, 916, 925, 926,
- 928, 930, 86, 932, 86, 929, 931, 86, 920, 922,
- 86, 923, 924, 921, 86, 927, 86, 933, 86, 934,
- 935, 86, 86, 936, 86, 925, 926, 928, 930, 937,
- 932, 938, 929, 931, 86, 86, 939, 940, 944, 941,
- 3599, 947, 943, 949, 933, 170, 934, 942, 86, 86,
- 936, 86, 86, 86, 86, 86, 937, 948, 938, 945,
- 86, 86, 954, 939, 940, 86, 941, 946, 86, 943,
- 949, 951, 950, 953, 942, 952, 3599, 86, 956, 86,
- 86, 955, 86, 86, 948, 86, 945, 86, 957, 954,
-
- 958, 959, 960, 3599, 946, 961, 86, 86, 970, 950,
- 953, 86, 952, 86, 971, 956, 962, 3599, 955, 86,
- 86, 86, 972, 86, 86, 973, 974, 958, 959, 960,
- 86, 86, 961, 979, 3599, 970, 975, 3599, 976, 977,
- 86, 971, 3599, 962, 963, 978, 86, 964, 984, 972,
- 86, 965, 973, 974, 966, 86, 86, 86, 980, 86,
- 979, 967, 968, 975, 969, 976, 977, 981, 86, 86,
- 982, 963, 978, 983, 964, 984, 985, 994, 965, 86,
- 993, 966, 3599, 86, 86, 980, 86, 86, 967, 968,
- 995, 969, 996, 3599, 981, 997, 86, 982, 999, 86,
-
- 983, 86, 998, 1002, 994, 86, 1001, 993, 86, 986,
- 987, 86, 988, 3599, 1000, 989, 1003, 995, 86, 996,
- 990, 86, 997, 3599, 1010, 999, 991, 992, 86, 998,
- 1002, 1006, 1004, 1001, 1012, 86, 986, 987, 86, 988,
- 1007, 1000, 989, 1003, 86, 1008, 1005, 990, 86, 1009,
- 86, 1010, 1011, 991, 992, 86, 86, 1013, 1006, 1004,
- 1014, 1012, 1015, 1016, 86, 1017, 1018, 1020, 3599, 86,
- 3599, 1022, 86, 1005, 1021, 86, 1009, 1025, 86, 1011,
- 1019, 1024, 86, 86, 1013, 86, 86, 1014, 1023, 1015,
- 1016, 86, 86, 1018, 1020, 86, 86, 86, 1022, 1026,
-
- 86, 1021, 1028, 86, 1025, 1027, 1030, 1019, 1024, 1031,
- 1029, 86, 1032, 1033, 86, 1023, 1034, 1035, 86, 86,
- 1037, 86, 1036, 1038, 1040, 1044, 1026, 1042, 86, 1028,
- 1039, 1041, 1027, 1030, 1046, 86, 1031, 1029, 86, 1043,
- 1033, 1045, 86, 86, 86, 1047, 86, 1037, 1048, 86,
- 3599, 1050, 1044, 86, 1051, 86, 86, 1039, 1041, 86,
- 86, 86, 1049, 86, 1052, 1053, 1043, 86, 1045, 1054,
- 1056, 86, 86, 86, 86, 1048, 1057, 86, 1050, 1055,
- 86, 1051, 1058, 1059, 86, 1060, 1062, 86, 1067, 1049,
- 3599, 1052, 1053, 1063, 86, 1064, 1054, 86, 86, 1061,
-
- 1066, 86, 1065, 1057, 86, 3599, 1055, 86, 1068, 1058,
- 86, 86, 86, 1062, 1070, 1067, 86, 86, 86, 1069,
- 1063, 1071, 1064, 1072, 86, 1075, 1061, 1066, 1073, 1065,
- 86, 1076, 86, 1074, 1098, 1068, 1078, 86, 86, 86,
- 1081, 1070, 1077, 1079, 86, 1085, 1069, 1082, 1071, 86,
- 1072, 1084, 1075, 1080, 86, 1083, 86, 86, 1076, 1086,
- 86, 86, 1087, 1078, 3599, 86, 86, 1081, 1089, 1077,
- 1079, 86, 86, 1088, 1082, 86, 86, 3599, 1084, 86,
- 1080, 1090, 1083, 1093, 86, 1091, 1086, 1092, 86, 1087,
- 86, 1097, 1094, 1095, 86, 1089, 86, 1096, 1100, 86,
-
- 1088, 86, 1104, 1099, 1101, 1108, 86, 1105, 1090, 1102,
- 1093, 1107, 1091, 86, 1092, 86, 86, 86, 1097, 1094,
- 1095, 86, 1103, 86, 1096, 1100, 86, 1106, 1113, 1104,
- 1099, 1101, 86, 86, 1105, 86, 1102, 1109, 1107, 1110,
- 86, 1111, 1119, 1112, 1114, 86, 86, 86, 1115, 1103,
- 86, 86, 1116, 86, 1106, 1113, 1117, 1120, 1118, 86,
- 86, 1122, 3599, 86, 1109, 86, 1110, 1121, 1111, 1123,
- 1112, 1114, 1127, 1125, 86, 1115, 1126, 1124, 1134, 1116,
- 86, 3599, 86, 1117, 86, 1118, 1133, 1131, 1135, 86,
- 1128, 1132, 1129, 86, 1121, 86, 1123, 86, 86, 1127,
-
- 1130, 1136, 1137, 1139, 1124, 86, 1141, 86, 86, 86,
- 86, 86, 86, 1133, 1131, 1140, 1138, 1128, 1132, 1129,
- 86, 1144, 86, 1142, 1143, 86, 1147, 1130, 1136, 1137,
- 86, 1148, 86, 86, 1145, 86, 1146, 1149, 3599, 1150,
- 3599, 1151, 1140, 1138, 3599, 86, 86, 1152, 1144, 86,
- 1142, 1143, 86, 1153, 1154, 1195, 1156, 1155, 170, 86,
- 86, 1145, 86, 1146, 1149, 86, 1150, 86, 1151, 1157,
- 1159, 1158, 1160, 3599, 1152, 1196, 86, 86, 86, 3599,
- 1153, 1154, 86, 1156, 1155, 86, 3599, 86, 1167, 1168,
- 1170, 3599, 1169, 1171, 3599, 86, 1157, 1159, 1158, 1160,
-
- 1161, 3599, 1162, 1172, 86, 1189, 1163, 86, 1164, 1173,
- 1174, 86, 86, 1165, 86, 1167, 1168, 86, 1166, 1169,
- 1171, 86, 1175, 86, 86, 1176, 86, 1161, 1179, 1162,
- 1172, 1183, 1189, 1163, 1177, 1164, 1173, 1174, 86, 1178,
- 1165, 1180, 1186, 86, 86, 1166, 86, 1181, 1188, 1175,
- 1184, 1187, 1176, 1191, 86, 1179, 1197, 86, 1183, 1182,
- 1185, 86, 1192, 1190, 1193, 1199, 86, 3599, 1180, 1186,
- 86, 86, 86, 86, 1181, 1188, 86, 1184, 1187, 1194,
- 1191, 1210, 1211, 86, 86, 86, 1182, 1185, 1200, 1192,
- 1190, 1193, 1201, 86, 1202, 3599, 86, 86, 1212, 1213,
-
- 86, 86, 3599, 86, 86, 1214, 1194, 3599, 1210, 1211,
- 1218, 86, 1215, 1222, 86, 1200, 1219, 1216, 3599, 1201,
- 3599, 1202, 1203, 86, 86, 1212, 1213, 1204, 3599, 1205,
- 1220, 86, 1214, 1223, 86, 1206, 86, 1218, 86, 1215,
- 1207, 1208, 1217, 1219, 1216, 86, 3599, 1209, 86, 1203,
- 1221, 1224, 1229, 86, 1204, 86, 1205, 1220, 1230, 1226,
- 1223, 86, 1206, 1225, 1227, 1232, 86, 1207, 1208, 1217,
- 86, 1228, 86, 86, 1209, 1231, 1233, 1221, 1224, 86,
- 86, 86, 86, 1235, 1234, 1230, 1226, 1236, 1237, 3599,
- 1225, 1227, 86, 1243, 1238, 1240, 1239, 86, 1228, 1241,
-
- 86, 86, 1231, 1233, 86, 86, 1244, 1242, 1246, 3599,
- 1235, 1234, 1255, 86, 1236, 1248, 86, 86, 86, 1245,
- 86, 1238, 1240, 1239, 86, 86, 1241, 86, 86, 1247,
- 86, 1249, 1250, 1244, 1242, 1246, 86, 1251, 86, 1252,
- 1253, 1254, 1248, 1256, 86, 1258, 1245, 86, 3599, 1257,
- 3599, 86, 86, 1259, 86, 86, 1247, 86, 1249, 1250,
- 1261, 86, 86, 1260, 1251, 1262, 1252, 1253, 1254, 1263,
- 1256, 86, 1258, 86, 86, 86, 1257, 1264, 1265, 1266,
- 1259, 86, 1268, 1269, 1267, 1270, 1272, 1261, 1275, 1271,
- 1260, 3599, 1262, 1276, 3599, 1279, 1263, 3599, 86, 86,
-
- 86, 86, 86, 1274, 1264, 1265, 1266, 86, 86, 1268,
- 1273, 1267, 1280, 1272, 86, 86, 1271, 86, 1277, 86,
- 86, 1278, 1279, 1282, 86, 86, 1281, 1283, 1284, 1285,
- 1274, 1286, 1288, 86, 86, 1290, 86, 1273, 1291, 1280,
- 1287, 86, 86, 1292, 86, 1277, 1289, 86, 1278, 3599,
- 1282, 86, 1293, 1281, 1283, 1284, 1285, 86, 86, 1295,
- 1294, 1296, 1290, 86, 86, 1291, 86, 1287, 1302, 86,
- 1292, 1297, 1298, 1289, 1299, 1300, 86, 1301, 1305, 1293,
- 1303, 86, 86, 86, 1304, 1306, 1295, 1294, 1296, 86,
- 86, 86, 86, 1309, 1308, 1302, 86, 86, 1297, 1298,
-
- 1307, 1299, 1300, 86, 1301, 86, 1310, 1303, 1312, 1315,
- 86, 1304, 86, 1311, 1314, 1316, 86, 86, 86, 1313,
- 1309, 1308, 86, 86, 1317, 1318, 86, 1307, 1319, 1321,
- 1323, 1320, 86, 1310, 3599, 1312, 1315, 1322, 86, 1325,
- 1311, 1314, 1326, 1324, 1327, 1328, 1313, 86, 86, 86,
- 86, 1329, 1332, 86, 3599, 1319, 86, 86, 1320, 86,
- 1335, 86, 86, 1330, 1322, 86, 1325, 86, 1331, 1326,
- 1324, 1333, 1328, 1336, 86, 1334, 86, 1337, 86, 1332,
- 86, 86, 1339, 86, 86, 1338, 86, 1335, 1340, 1342,
- 1330, 86, 1343, 86, 3599, 1331, 1344, 86, 1333, 1346,
-
- 1336, 3599, 1334, 86, 1337, 1341, 1345, 86, 86, 1339,
- 1347, 1350, 1338, 86, 1348, 1340, 1349, 1353, 86, 1357,
- 86, 86, 1354, 1344, 86, 1352, 86, 86, 86, 1358,
- 86, 86, 1341, 1345, 86, 86, 1359, 1347, 1350, 1356,
- 1355, 1348, 86, 1349, 1353, 3599, 86, 86, 86, 1354,
- 1360, 1362, 1352, 1361, 1365, 1364, 1358, 1363, 86, 1367,
- 170, 1366, 1369, 1359, 86, 1370, 1356, 1355, 1368, 86,
- 86, 1372, 86, 3599, 1371, 86, 86, 1360, 1362, 86,
- 1361, 1365, 1364, 1373, 1363, 86, 86, 1374, 1366, 1375,
- 1376, 1377, 1378, 86, 86, 1368, 3599, 86, 1372, 1379,
-
- 1380, 1371, 86, 86, 86, 1383, 1385, 86, 86, 86,
- 1373, 1381, 1384, 86, 1374, 86, 1375, 1376, 1377, 1378,
- 86, 1382, 1386, 86, 1387, 86, 1379, 1380, 1388, 86,
- 3599, 1395, 86, 1385, 86, 86, 1393, 1396, 1381, 1384,
- 1394, 1397, 1400, 1389, 3599, 86, 1406, 1398, 1382, 1386,
- 86, 1387, 1390, 86, 1391, 1388, 1399, 1392, 1395, 86,
- 86, 86, 1401, 1393, 86, 86, 86, 1394, 1397, 1400,
- 1389, 86, 1402, 1403, 1398, 1407, 1405, 1404, 86, 1390,
- 86, 1391, 1409, 1399, 1392, 86, 1410, 1411, 1408, 1401,
- 86, 86, 3599, 1416, 86, 86, 1412, 86, 86, 1402,
-
- 1403, 86, 1407, 1405, 1404, 1413, 1415, 1417, 3599, 1409,
- 1414, 3599, 1418, 1410, 86, 1408, 86, 86, 86, 1419,
- 1416, 1420, 1431, 1412, 86, 86, 1421, 86, 86, 86,
- 1423, 86, 1413, 1415, 1417, 1422, 1424, 1414, 1427, 1418,
- 1425, 1426, 86, 1428, 86, 1429, 1419, 1430, 1420, 86,
- 86, 1432, 86, 1421, 86, 86, 86, 1423, 86, 86,
- 3599, 1434, 1422, 1424, 1433, 1427, 86, 1425, 1426, 1435,
- 1428, 86, 1429, 1440, 1430, 1436, 1438, 1437, 1432, 86,
- 1439, 86, 86, 86, 86, 86, 1441, 1442, 1434, 1443,
- 1446, 1433, 86, 1444, 86, 1445, 1435, 1449, 1450, 1447,
-
- 1440, 1448, 1436, 1438, 1437, 86, 86, 1439, 86, 86,
- 1451, 1456, 86, 86, 1442, 1452, 1454, 1446, 86, 86,
- 1444, 86, 1445, 1453, 1449, 1450, 1447, 1455, 1448, 86,
- 1464, 86, 1466, 1465, 1468, 3599, 1470, 86, 1456, 1467,
- 3599, 86, 86, 1454, 86, 3599, 3599, 1471, 3599, 1472,
- 1453, 86, 1469, 3599, 1455, 1457, 86, 1464, 1473, 1458,
- 1465, 1468, 1459, 1460, 86, 86, 1467, 1461, 86, 86,
- 86, 86, 1474, 1462, 1471, 1475, 1472, 1463, 86, 1469,
- 1478, 86, 1457, 1479, 86, 1473, 1458, 86, 3599, 1459,
- 1460, 1476, 86, 1477, 1461, 1480, 1481, 1483, 1482, 1474,
-
- 1462, 86, 1475, 1484, 1463, 86, 1486, 1478, 1485, 1487,
- 1479, 3599, 1488, 1489, 86, 86, 86, 86, 1476, 86,
- 1477, 1496, 3599, 1481, 1483, 1482, 1498, 86, 1490, 3599,
- 1484, 1497, 1506, 1501, 86, 1485, 86, 1507, 86, 1488,
- 1489, 86, 86, 86, 86, 1502, 1499, 1500, 1496, 86,
- 1503, 1505, 86, 1498, 1509, 1490, 1491, 1504, 1497, 86,
- 1501, 1492, 86, 1493, 86, 1494, 86, 1495, 86, 86,
- 1516, 1508, 1502, 1510, 86, 86, 3599, 1503, 1505, 1512,
- 1511, 1509, 1517, 1491, 1504, 3599, 3599, 3599, 1492, 86,
- 1493, 1513, 1494, 86, 1495, 86, 1514, 86, 1508, 86,
-
- 1510, 1515, 86, 1519, 86, 1518, 1512, 1511, 86, 1517,
- 1525, 1520, 1521, 1522, 86, 1523, 1524, 1528, 1513, 86,
- 86, 1530, 86, 1514, 86, 1526, 86, 86, 1515, 1527,
- 1519, 1532, 1518, 86, 86, 1529, 86, 1525, 1520, 1521,
- 1522, 1531, 1523, 1524, 86, 1533, 1534, 86, 86, 1536,
- 1537, 86, 1526, 1535, 86, 86, 1527, 86, 1532, 1538,
- 3599, 1539, 1529, 1540, 1541, 1544, 86, 86, 1531, 1542,
- 86, 86, 1533, 1534, 1545, 86, 86, 1537, 1543, 1546,
- 1535, 86, 1549, 1547, 86, 86, 86, 86, 1539, 86,
- 1540, 1541, 86, 1548, 1550, 1551, 1542, 1555, 1552, 1553,
-
- 86, 1545, 1558, 1554, 1556, 1543, 1546, 86, 86, 86,
- 1547, 1557, 1559, 86, 86, 86, 86, 1560, 86, 1561,
- 1548, 1550, 1551, 86, 1555, 1552, 1553, 86, 1562, 1558,
- 1554, 1556, 1563, 86, 86, 1564, 86, 3599, 1557, 1559,
- 1566, 86, 1565, 1568, 1560, 1567, 1561, 1570, 1571, 86,
- 1576, 1569, 86, 1574, 86, 1562, 1575, 1577, 86, 1563,
- 1572, 86, 1564, 86, 86, 86, 86, 1566, 1573, 1565,
- 1568, 1578, 1567, 86, 86, 1580, 1582, 1576, 1569, 86,
- 86, 1579, 86, 1575, 1577, 86, 1588, 1572, 86, 1583,
- 86, 1581, 1584, 86, 1586, 1573, 1587, 86, 86, 86,
-
- 86, 170, 1580, 1582, 1589, 1585, 3599, 86, 1579, 86,
- 1594, 1590, 3599, 1588, 1592, 1593, 1583, 1591, 1581, 1584,
- 1595, 86, 86, 1597, 86, 86, 86, 1598, 86, 1599,
- 1596, 86, 1585, 86, 86, 3599, 86, 1594, 1590, 86,
- 1601, 1592, 1593, 1600, 1591, 1602, 1604, 1595, 1609, 86,
- 1597, 1603, 86, 1605, 1598, 86, 1599, 1596, 1606, 3599,
- 1608, 86, 86, 1607, 1610, 1612, 86, 1601, 86, 86,
- 1600, 1611, 86, 1604, 1621, 1609, 1613, 86, 1603, 1614,
- 1605, 1617, 1615, 86, 86, 1616, 1618, 1608, 86, 1619,
- 86, 1610, 1612, 1620, 1622, 1623, 1627, 86, 1611, 86,
-
- 1624, 1621, 86, 1613, 86, 86, 1614, 1625, 1617, 1615,
- 86, 86, 1616, 1618, 1628, 86, 1619, 1626, 86, 3599,
- 1629, 1622, 1631, 1627, 1630, 86, 1632, 86, 1633, 1636,
- 1634, 86, 1635, 86, 1625, 1638, 86, 86, 86, 1637,
- 1639, 1628, 86, 1640, 1626, 86, 86, 1629, 86, 1631,
- 86, 1630, 86, 1632, 1642, 1633, 1636, 1634, 1643, 1635,
- 1641, 86, 1638, 86, 1644, 1646, 1637, 1639, 86, 1645,
- 1640, 1647, 1648, 86, 1649, 86, 3599, 86, 86, 3599,
- 1650, 3599, 86, 86, 86, 1643, 86, 1641, 1651, 1652,
- 3599, 1644, 1646, 1656, 1653, 1655, 1645, 1657, 1647, 1648,
-
- 1654, 1649, 86, 86, 1660, 1658, 86, 1650, 86, 86,
- 1659, 86, 1661, 86, 1662, 1651, 1652, 86, 1665, 86,
- 1656, 1653, 1655, 86, 1657, 1663, 1666, 1654, 1664, 1667,
- 86, 1660, 1658, 1668, 1670, 1669, 1671, 1659, 86, 86,
- 86, 1672, 3599, 1673, 86, 86, 86, 86, 1674, 1675,
- 3599, 3599, 1663, 1666, 86, 1664, 1667, 86, 1676, 1677,
- 1668, 3599, 1669, 1678, 1679, 1680, 86, 1682, 86, 86,
- 1673, 1681, 86, 86, 86, 1674, 86, 86, 86, 86,
- 1683, 86, 1684, 86, 1685, 1676, 1677, 86, 1686, 86,
- 1678, 1679, 1680, 1688, 1682, 1687, 1697, 1689, 1681, 1691,
-
- 1694, 86, 1690, 86, 1692, 1693, 86, 1683, 86, 1684,
- 86, 1685, 86, 1695, 86, 1686, 1696, 1698, 1702, 1703,
- 1688, 86, 1687, 1697, 86, 1699, 86, 1694, 1700, 86,
- 1704, 86, 1693, 86, 1706, 86, 1701, 86, 3599, 86,
- 1695, 86, 3599, 1696, 1698, 86, 1703, 1705, 86, 1708,
- 86, 1707, 1699, 1709, 1710, 1700, 1711, 1704, 3599, 86,
- 1712, 1713, 86, 1701, 86, 1714, 86, 1715, 86, 86,
- 86, 1716, 1717, 86, 1705, 1718, 1708, 86, 1707, 1719,
- 86, 1710, 1720, 1711, 86, 86, 1723, 1712, 1713, 1721,
- 86, 1724, 1714, 1722, 1715, 1725, 1726, 86, 1716, 1717,
-
- 1727, 86, 1718, 86, 1734, 3599, 1719, 1728, 86, 1720,
- 1729, 1730, 1733, 86, 86, 1731, 1721, 86, 86, 86,
- 1722, 86, 1725, 1726, 86, 86, 86, 1727, 1732, 1735,
- 1738, 1734, 1737, 1736, 1728, 1740, 86, 1729, 1730, 1733,
- 86, 86, 1731, 86, 1739, 1743, 1741, 1742, 1744, 1745,
- 1751, 1749, 3599, 3599, 1748, 1732, 1735, 86, 86, 1737,
- 1736, 86, 1746, 86, 1752, 1757, 86, 86, 1756, 86,
- 86, 1739, 86, 1741, 1742, 1744, 1745, 86, 1749, 1747,
- 1750, 1748, 86, 1753, 1754, 86, 86, 86, 3599, 1746,
- 86, 86, 86, 1755, 86, 1756, 1758, 86, 1759, 1761,
-
- 1760, 1762, 1763, 86, 1768, 1764, 1747, 1750, 1766, 1765,
- 1753, 1754, 86, 86, 86, 86, 86, 1770, 3599, 1776,
- 1755, 3599, 86, 1758, 86, 86, 86, 1760, 1762, 1763,
- 1767, 1768, 1764, 86, 1769, 1766, 1765, 86, 1771, 1772,
- 1773, 86, 1774, 86, 1770, 86, 1775, 1779, 86, 1777,
- 86, 86, 1778, 1781, 3599, 86, 86, 1767, 1783, 86,
- 1780, 1769, 1788, 3599, 86, 1771, 1772, 1773, 1784, 1774,
- 86, 1782, 86, 1775, 1779, 86, 1777, 1785, 86, 1778,
- 1781, 86, 1787, 1786, 86, 1783, 86, 1780, 1789, 86,
- 1790, 3599, 1791, 1798, 86, 1784, 1792, 86, 1782, 1793,
-
- 1794, 86, 1795, 3599, 1785, 86, 1796, 86, 1797, 1787,
- 1786, 86, 1799, 1803, 86, 1789, 86, 1790, 86, 1791,
- 86, 1801, 86, 1792, 1800, 86, 1793, 1794, 1804, 1795,
- 86, 1802, 1813, 1796, 1807, 1797, 86, 1809, 86, 1799,
- 1803, 86, 170, 86, 1805, 1806, 1810, 86, 1801, 1814,
- 1811, 1800, 86, 1812, 1808, 1804, 86, 86, 1802, 86,
- 86, 1807, 1815, 86, 1809, 1817, 1818, 86, 86, 1819,
- 1822, 1805, 1806, 1810, 1821, 1816, 1814, 1811, 1820, 3599,
- 1812, 1808, 86, 86, 86, 86, 1823, 1824, 86, 1815,
- 86, 1825, 1817, 1818, 1826, 86, 1827, 1822, 1828, 86,
-
- 1829, 86, 1816, 1832, 1830, 1820, 86, 1834, 1833, 1841,
- 1831, 1835, 86, 86, 1824, 86, 86, 86, 1825, 86,
- 86, 1826, 1837, 1827, 86, 1828, 86, 1829, 1836, 86,
- 1832, 1830, 86, 86, 1834, 1833, 1838, 1831, 1835, 1839,
- 1842, 86, 3599, 86, 1848, 1843, 1845, 1849, 1846, 1837,
- 1847, 1840, 86, 1850, 1851, 1836, 86, 1852, 1854, 1856,
- 86, 1844, 86, 1838, 86, 1853, 1839, 1842, 86, 86,
- 86, 1848, 1843, 1845, 86, 1846, 1855, 1847, 1840, 1857,
- 1850, 1858, 1863, 1862, 86, 1854, 86, 86, 1844, 86,
- 1859, 86, 1853, 1861, 1864, 86, 1860, 1865, 1867, 86,
-
- 86, 86, 86, 1855, 86, 1866, 1857, 86, 1858, 1868,
- 1862, 1869, 1870, 86, 86, 1871, 1872, 1859, 3599, 3599,
- 1861, 1873, 3599, 1860, 1875, 86, 86, 86, 86, 86,
- 86, 86, 1866, 86, 1876, 1881, 1868, 86, 1869, 86,
- 1877, 1874, 1871, 1872, 1878, 1879, 1884, 86, 1873, 86,
- 1880, 1875, 86, 86, 86, 1882, 1883, 86, 86, 1885,
- 1886, 1876, 1881, 1888, 86, 1887, 86, 1877, 1874, 1889,
- 1890, 1878, 1879, 1884, 86, 86, 86, 1880, 1891, 86,
- 86, 86, 1882, 1883, 1893, 86, 1885, 1886, 1892, 1894,
- 86, 1895, 1887, 1897, 3599, 86, 1889, 1890, 86, 1896,
-
- 1899, 86, 1898, 1901, 1900, 1891, 86, 1903, 86, 3599,
- 1902, 1893, 86, 1905, 3599, 1892, 86, 86, 1895, 86,
- 1897, 86, 1911, 1904, 86, 86, 1896, 1899, 86, 1898,
- 1901, 1900, 1908, 86, 1903, 86, 1906, 1902, 1912, 1907,
- 1905, 1909, 1913, 86, 1914, 1915, 1910, 1916, 3599, 1911,
- 1904, 1917, 1918, 86, 86, 1921, 86, 3599, 1931, 1908,
- 86, 1922, 86, 1906, 1923, 1912, 1907, 1919, 1909, 86,
- 1932, 86, 1915, 1910, 1916, 86, 1920, 86, 1917, 86,
- 1926, 86, 1921, 3599, 86, 86, 86, 1924, 1922, 1925,
- 86, 1923, 1930, 1927, 1919, 86, 1937, 86, 86, 1928,
-
- 86, 86, 1929, 1920, 1933, 1934, 1936, 1926, 1935, 86,
- 86, 3599, 86, 1939, 1924, 86, 1925, 86, 1940, 1930,
- 1927, 1941, 86, 1937, 86, 1938, 1928, 1942, 1943, 1929,
- 86, 1933, 1934, 1936, 1945, 1935, 86, 1944, 1946, 1947,
- 1954, 3599, 86, 86, 1950, 86, 86, 1948, 1941, 86,
- 1952, 1949, 1938, 1953, 1942, 1943, 3599, 86, 1951, 1965,
- 86, 1945, 86, 1955, 1944, 1946, 1947, 1954, 86, 1956,
- 86, 1950, 86, 86, 1948, 86, 1958, 1952, 1949, 1957,
- 1953, 1959, 1960, 1963, 1962, 1951, 1961, 1964, 86, 86,
- 1955, 86, 1966, 1967, 1968, 86, 1956, 3599, 86, 1971,
-
- 86, 86, 1969, 1970, 1975, 86, 1957, 1972, 86, 1960,
- 1963, 1962, 1974, 1961, 1964, 1973, 86, 1977, 1976, 1966,
- 86, 1979, 86, 1978, 86, 86, 86, 1980, 86, 1969,
- 1970, 86, 86, 1984, 1972, 1981, 86, 1985, 1986, 1974,
- 1982, 86, 1973, 86, 1977, 1976, 86, 1983, 86, 1987,
- 1978, 1988, 86, 86, 1980, 86, 86, 1989, 1994, 86,
- 1984, 1992, 1981, 86, 1985, 1986, 1990, 1982, 1991, 86,
- 1995, 86, 1996, 1997, 1983, 3599, 1987, 1998, 1988, 86,
- 2000, 86, 1993, 2001, 1989, 1999, 2002, 86, 86, 86,
- 86, 86, 86, 1990, 2003, 1991, 86, 2004, 2005, 1996,
-
- 1997, 2008, 86, 86, 86, 2006, 2007, 2000, 86, 1993,
- 2001, 2009, 1999, 86, 2010, 86, 86, 2011, 86, 2012,
- 2013, 2003, 2015, 2014, 3599, 2005, 86, 2016, 86, 86,
- 2018, 86, 2006, 2007, 2019, 2017, 2022, 86, 2009, 86,
- 86, 2010, 86, 2021, 2011, 86, 2012, 2013, 86, 2015,
- 2014, 86, 2020, 2024, 2016, 86, 2023, 2018, 86, 2026,
- 2029, 2019, 2017, 86, 86, 2025, 2030, 170, 86, 2027,
- 2021, 2028, 2033, 86, 2034, 86, 2031, 2042, 2032, 2020,
- 2024, 86, 86, 2023, 86, 86, 86, 2029, 2035, 86,
- 2036, 86, 2025, 2030, 2037, 2038, 2027, 86, 2028, 2039,
-
- 2041, 2034, 2040, 2031, 86, 2032, 2043, 2045, 2044, 86,
- 3599, 86, 2046, 2047, 2065, 2035, 2064, 2036, 86, 86,
- 86, 86, 2038, 86, 86, 2048, 86, 2041, 2049, 2040,
- 86, 2051, 86, 86, 2045, 2044, 86, 86, 2050, 2046,
- 2047, 2052, 2053, 86, 2054, 2055, 86, 86, 2056, 2057,
- 3599, 3599, 2048, 86, 2059, 2049, 2062, 86, 2051, 86,
- 86, 86, 2058, 86, 3599, 2050, 2060, 86, 2052, 2053,
- 86, 2054, 2055, 2061, 2063, 2056, 2057, 2075, 86, 2066,
- 2067, 2059, 2068, 2062, 2069, 86, 86, 2070, 86, 2058,
- 86, 86, 86, 2060, 2072, 2071, 2076, 2073, 86, 2074,
-
- 2061, 2063, 86, 86, 2075, 2077, 2066, 2067, 2078, 2068,
- 86, 2069, 2079, 2084, 2070, 86, 2080, 2086, 2085, 86,
- 2087, 2072, 2071, 86, 2073, 2081, 2074, 2082, 2083, 2088,
- 2090, 86, 86, 86, 86, 2078, 2091, 2089, 2094, 86,
- 86, 86, 86, 2080, 86, 2085, 86, 2087, 2092, 86,
- 86, 2096, 2081, 2093, 2082, 2083, 2097, 2098, 86, 2095,
- 2100, 86, 86, 2091, 2089, 86, 86, 2101, 2099, 86,
- 2102, 2103, 2104, 86, 86, 2092, 2110, 86, 2096, 2112,
- 2093, 2109, 86, 86, 2098, 86, 2095, 2100, 86, 86,
- 2121, 2118, 3599, 86, 2101, 2099, 86, 2102, 2103, 2105,
-
- 2106, 2107, 2111, 2110, 86, 2113, 2108, 2116, 2109, 86,
- 2114, 86, 86, 2117, 86, 2115, 86, 2125, 2118, 2119,
- 86, 2122, 86, 2123, 2120, 86, 2105, 2106, 2107, 2111,
- 86, 2124, 2113, 2108, 2116, 86, 86, 86, 2127, 86,
- 2117, 2130, 86, 2131, 86, 2133, 2119, 2128, 2122, 2132,
- 2123, 2120, 2126, 86, 86, 2129, 86, 2134, 2124, 86,
- 86, 2138, 2135, 2136, 86, 2127, 3599, 86, 2130, 2137,
- 86, 2140, 86, 3599, 2128, 86, 2132, 2139, 3599, 2126,
- 86, 86, 2129, 2142, 2134, 2141, 2143, 2144, 86, 2135,
- 2136, 86, 2146, 86, 2150, 86, 2137, 2148, 86, 2145,
-
- 86, 2147, 86, 2149, 2139, 86, 86, 2151, 86, 2153,
- 2142, 2154, 2141, 2143, 2144, 2152, 86, 2156, 86, 2146,
- 2155, 2150, 86, 2157, 2148, 86, 2145, 2158, 2147, 86,
- 2159, 2160, 2163, 2161, 3599, 86, 2153, 2165, 2162, 86,
- 86, 2166, 2152, 86, 2156, 86, 86, 2155, 2164, 86,
- 86, 2168, 86, 2169, 86, 86, 86, 2159, 2160, 2163,
- 2161, 86, 2170, 86, 2165, 2162, 2167, 86, 2166, 2171,
- 2172, 2178, 2173, 2175, 2176, 2164, 86, 86, 2168, 86,
- 86, 2177, 86, 2179, 2180, 86, 86, 3599, 2174, 2187,
- 2181, 2183, 86, 2167, 86, 86, 2171, 2172, 86, 2173,
-
- 2175, 2176, 86, 86, 2182, 3599, 2184, 2185, 2177, 2186,
- 2179, 2180, 86, 2191, 86, 2174, 86, 2181, 2183, 2188,
- 3599, 2189, 2193, 2192, 2199, 2195, 2190, 86, 86, 86,
- 2194, 2182, 86, 2184, 2185, 86, 2186, 86, 86, 2204,
- 86, 2202, 86, 2205, 2196, 3599, 2188, 86, 2189, 2193,
- 2192, 86, 2195, 2190, 2197, 2198, 86, 2194, 2200, 2203,
- 2201, 86, 86, 86, 2212, 2206, 86, 86, 2202, 86,
- 2205, 2196, 86, 86, 2208, 2207, 2210, 2211, 2213, 2209,
- 2216, 2197, 2198, 86, 2214, 2200, 2203, 2201, 86, 2215,
- 86, 86, 2206, 86, 2217, 2218, 86, 2219, 2220, 86,
-
- 2221, 2208, 2207, 2210, 2211, 86, 2209, 2223, 2222, 3599,
- 2225, 2227, 86, 86, 2224, 2226, 86, 86, 2229, 86,
- 2230, 3599, 2218, 86, 2219, 2220, 86, 2233, 2228, 86,
- 86, 2231, 86, 86, 2223, 2222, 86, 2225, 2232, 86,
- 2236, 2224, 2226, 86, 2234, 86, 2235, 86, 86, 170,
- 86, 2238, 2237, 2240, 2233, 2228, 2239, 2241, 2231, 86,
- 2243, 86, 2242, 2247, 2244, 2232, 2245, 2236, 3599, 86,
- 3599, 2234, 2248, 2235, 86, 86, 2246, 2249, 2238, 2237,
- 86, 86, 86, 2239, 86, 86, 2251, 2250, 86, 2242,
- 2247, 2244, 86, 2245, 86, 2252, 2253, 86, 2254, 2248,
-
- 2255, 86, 86, 2246, 2249, 2260, 2256, 2257, 2258, 2261,
- 86, 86, 86, 2251, 2250, 2259, 86, 2263, 2265, 2262,
- 86, 2267, 2252, 2253, 86, 2254, 86, 86, 2266, 86,
- 86, 2269, 86, 2256, 2257, 2258, 2261, 86, 2268, 86,
- 2264, 86, 2259, 2270, 2263, 2265, 2262, 86, 86, 86,
- 86, 2271, 86, 86, 2274, 2266, 3599, 2272, 2269, 2275,
- 2280, 2276, 2277, 86, 86, 2268, 2278, 2264, 2273, 86,
- 2270, 3599, 2279, 2284, 2281, 86, 2282, 86, 2271, 86,
- 86, 2274, 2283, 86, 2272, 2291, 2275, 2280, 2276, 2277,
- 86, 2285, 86, 2278, 2286, 2273, 86, 2287, 86, 2279,
-
- 86, 2281, 2288, 2282, 2289, 86, 2290, 2294, 86, 2283,
- 2292, 2302, 2293, 86, 2295, 86, 86, 86, 2285, 86,
- 86, 2286, 2296, 86, 2287, 2297, 2298, 3599, 2299, 2288,
- 2301, 2289, 86, 2290, 2294, 2303, 2300, 2292, 86, 2293,
- 86, 2295, 2305, 86, 86, 2304, 3599, 86, 86, 86,
- 2307, 86, 2297, 86, 86, 2299, 2308, 2301, 2311, 2306,
- 2312, 2310, 2303, 2300, 2309, 86, 86, 86, 2313, 2305,
- 2315, 86, 2304, 86, 2314, 86, 86, 2307, 2316, 2323,
- 86, 3599, 86, 2308, 2322, 2311, 2306, 2312, 2310, 86,
- 86, 2309, 2317, 2320, 2321, 2313, 2318, 2315, 86, 86,
-
- 86, 2314, 2326, 2324, 2331, 2316, 86, 2325, 2328, 2319,
- 2327, 2322, 86, 86, 86, 86, 2329, 86, 2332, 2317,
- 2320, 2321, 2330, 2318, 2333, 2338, 86, 2340, 2334, 2326,
- 2324, 2331, 86, 2335, 2325, 2328, 2319, 2327, 86, 2336,
- 86, 2337, 86, 2329, 86, 2332, 86, 86, 2341, 2330,
- 86, 2333, 2338, 2339, 2342, 2334, 86, 86, 2343, 86,
- 2335, 86, 2344, 86, 2345, 2346, 2336, 86, 2337, 2349,
- 2350, 2347, 2348, 86, 2352, 2341, 2351, 3599, 86, 86,
- 2339, 2342, 2353, 86, 3599, 86, 86, 2354, 2358, 2344,
- 86, 2345, 2346, 86, 86, 2355, 2349, 2350, 2347, 2348,
-
- 2356, 86, 2361, 2351, 86, 2357, 86, 86, 2359, 2353,
- 86, 2360, 3599, 2362, 2354, 2358, 86, 2363, 2364, 2365,
- 2366, 2367, 2355, 2370, 86, 3599, 86, 2369, 2368, 86,
- 86, 2371, 86, 86, 2372, 2359, 86, 2374, 2360, 86,
- 2362, 2373, 86, 86, 2363, 2364, 2365, 2375, 2367, 2376,
- 2370, 2378, 86, 86, 2369, 2368, 86, 2377, 2371, 2379,
- 86, 86, 2380, 86, 2374, 2381, 2382, 86, 2373, 2383,
- 2386, 3599, 2384, 86, 2375, 86, 2376, 2385, 2378, 86,
- 86, 2387, 86, 2388, 2377, 86, 2379, 2389, 2394, 2380,
- 2390, 86, 2381, 2382, 2391, 2392, 2383, 2386, 86, 86,
-
- 2393, 2395, 86, 2400, 86, 86, 86, 86, 2387, 86,
- 2388, 2396, 86, 2401, 2389, 2394, 86, 2390, 2399, 2402,
- 86, 2391, 2392, 2397, 2398, 2403, 86, 2393, 86, 86,
- 2400, 86, 86, 86, 2404, 2406, 2407, 2408, 2396, 2405,
- 2401, 3599, 86, 3599, 3599, 2399, 2402, 86, 2410, 86,
- 2397, 2398, 2403, 2409, 86, 2411, 2413, 86, 86, 86,
- 2415, 2404, 2406, 2407, 2408, 2414, 2405, 2418, 2412, 86,
- 2416, 86, 86, 2419, 2421, 2410, 86, 86, 2420, 86,
- 2409, 2422, 2411, 2413, 2417, 86, 86, 2415, 2425, 2424,
- 86, 2423, 2414, 2426, 2418, 2412, 86, 2416, 2427, 86,
-
- 86, 86, 2428, 2432, 2429, 2420, 86, 86, 2422, 170,
- 86, 2417, 86, 2433, 2430, 2425, 2424, 2434, 2423, 2431,
- 2426, 2435, 2436, 2437, 2446, 2427, 3599, 3599, 2438, 86,
- 2442, 2429, 2443, 2441, 86, 86, 2448, 2444, 2445, 2447,
- 86, 86, 2439, 2449, 2434, 86, 86, 86, 2435, 2436,
- 86, 86, 86, 2440, 86, 2438, 86, 86, 86, 2443,
- 2441, 86, 86, 2448, 2444, 2445, 2447, 2450, 2451, 2439,
- 86, 2453, 2452, 3599, 2454, 2455, 3599, 2456, 86, 86,
- 2440, 2457, 86, 2458, 2459, 2460, 2463, 86, 3599, 86,
- 3599, 2466, 3599, 86, 2450, 86, 86, 86, 2453, 2452,
-
- 86, 2454, 2455, 86, 2456, 2461, 2462, 86, 2457, 2464,
- 2458, 2459, 2460, 2463, 86, 2465, 2467, 86, 86, 2469,
- 86, 2470, 2468, 2471, 86, 2473, 2472, 3599, 2478, 2474,
- 86, 86, 2461, 2462, 86, 86, 2464, 86, 2475, 86,
- 86, 86, 2465, 2467, 2476, 2477, 2469, 2479, 2470, 2468,
- 2471, 2480, 2473, 2472, 86, 86, 2474, 3599, 86, 86,
- 86, 2481, 2482, 2483, 2489, 2475, 86, 86, 2491, 86,
- 86, 2476, 2477, 2484, 2479, 2485, 86, 2487, 2480, 2486,
- 2488, 2490, 86, 86, 2492, 86, 86, 2496, 2481, 2482,
- 2483, 2493, 86, 86, 2494, 2491, 86, 86, 2495, 2499,
-
- 2484, 2497, 2485, 2498, 2487, 86, 2486, 2488, 2490, 2501,
- 2502, 2492, 86, 86, 86, 2503, 2504, 2500, 2493, 86,
- 86, 2494, 86, 86, 86, 2495, 2499, 86, 2497, 2505,
- 2498, 2506, 2508, 2507, 3599, 2509, 2501, 2502, 2510, 3599,
- 2513, 86, 2503, 86, 2500, 86, 86, 2514, 2511, 2515,
- 2516, 2512, 2520, 3599, 86, 2521, 2505, 2523, 86, 2508,
- 2507, 86, 2509, 2517, 86, 2510, 86, 86, 2519, 2525,
- 86, 86, 86, 2518, 86, 2511, 2515, 2516, 2512, 86,
- 86, 2522, 86, 86, 86, 2524, 2526, 2527, 2528, 86,
- 2517, 2529, 2530, 2531, 86, 2519, 86, 2532, 86, 2535,
-
- 2518, 2536, 2534, 2533, 2538, 86, 3599, 86, 2522, 86,
- 86, 86, 2524, 2526, 2527, 86, 86, 2537, 86, 2530,
- 2531, 86, 3599, 2539, 2532, 86, 2535, 2540, 86, 2534,
- 2533, 86, 86, 2542, 2541, 3599, 2543, 2545, 2546, 3599,
- 2547, 2548, 2551, 3599, 2537, 2550, 86, 2549, 3599, 86,
- 2539, 2544, 86, 86, 2540, 86, 3599, 86, 3599, 86,
- 2542, 2541, 86, 2543, 86, 2546, 86, 2547, 2548, 86,
- 2552, 2553, 2550, 2555, 2549, 2554, 2556, 86, 2544, 86,
- 2557, 2558, 2559, 86, 2560, 86, 2562, 2563, 2565, 86,
- 2564, 3599, 3599, 2561, 86, 3599, 86, 2552, 2553, 86,
-
- 2555, 86, 2554, 2556, 86, 86, 2568, 86, 2558, 2559,
- 86, 2560, 2566, 86, 2563, 2565, 2567, 2564, 86, 2570,
- 2561, 86, 2569, 86, 2571, 86, 2576, 2572, 3599, 2577,
- 2580, 3599, 86, 2568, 2581, 3599, 3599, 2578, 2573, 2566,
- 3599, 2579, 86, 2567, 86, 86, 2570, 2583, 86, 2569,
- 2585, 2571, 86, 2574, 2572, 2575, 2577, 2580, 86, 86,
- 2582, 2581, 86, 86, 2578, 2573, 86, 2586, 2579, 86,
- 2584, 86, 86, 2587, 2583, 2589, 2588, 2585, 2590, 2591,
- 2574, 2592, 2575, 2593, 2596, 86, 86, 2582, 86, 86,
- 2594, 2595, 2599, 86, 2586, 86, 2598, 2584, 2605, 86,
-
- 2587, 2606, 2597, 2588, 2600, 3599, 2591, 86, 2592, 2601,
- 86, 2596, 86, 86, 2602, 86, 86, 2594, 2595, 2599,
- 86, 2603, 86, 2598, 2604, 2610, 2607, 86, 2608, 2597,
- 86, 2600, 86, 86, 2611, 86, 2601, 86, 2609, 86,
- 2612, 2602, 2613, 86, 2615, 86, 3599, 2616, 2603, 86,
- 2614, 2604, 2610, 2607, 2617, 2608, 2618, 2622, 2619, 2620,
- 86, 2611, 86, 86, 2621, 2609, 2623, 2625, 86, 2613,
- 86, 2615, 86, 86, 2616, 86, 170, 2614, 86, 2624,
- 2627, 2617, 86, 2618, 86, 2619, 2620, 2626, 2628, 2629,
- 2630, 2621, 86, 2623, 2625, 2631, 2632, 86, 86, 2633,
-
- 3599, 2634, 86, 86, 2635, 2636, 2624, 2627, 2637, 2638,
- 2639, 86, 86, 86, 2626, 2628, 2629, 2630, 2640, 2641,
- 2642, 2645, 2631, 2632, 2643, 2644, 86, 86, 2634, 86,
- 86, 86, 2636, 86, 86, 2637, 86, 2647, 2648, 3599,
- 86, 86, 86, 2670, 2651, 2640, 86, 2642, 2645, 2646,
- 86, 2643, 2644, 2649, 2652, 2650, 2653, 86, 2660, 3599,
- 3599, 2656, 2654, 86, 2647, 2655, 86, 86, 2657, 3599,
- 86, 2651, 2662, 2659, 3599, 86, 2646, 86, 86, 86,
- 2649, 2652, 2650, 86, 86, 86, 86, 86, 2656, 2654,
- 2658, 2661, 2655, 2666, 86, 2657, 86, 86, 2667, 2662,
-
- 2659, 2663, 2664, 2665, 2668, 86, 86, 3599, 86, 86,
- 86, 86, 2669, 2673, 2671, 3599, 2672, 2658, 2661, 2674,
- 2666, 86, 86, 2676, 2675, 2667, 2678, 86, 2663, 2664,
- 2665, 2668, 86, 2679, 86, 86, 2680, 2681, 2677, 2669,
- 2673, 2671, 86, 2672, 86, 86, 2674, 86, 86, 2682,
- 2676, 2675, 2683, 86, 2694, 2684, 3599, 3599, 2685, 86,
- 2679, 2686, 2687, 2680, 2681, 2677, 2688, 2689, 3599, 2691,
- 86, 2690, 3599, 2692, 86, 86, 2696, 2698, 2693, 86,
- 3599, 86, 2684, 86, 86, 2685, 86, 2695, 2686, 2687,
- 2697, 86, 86, 2688, 2689, 86, 2691, 2699, 2690, 86,
-
- 2692, 86, 86, 86, 86, 2693, 86, 2700, 86, 2702,
- 2701, 2703, 86, 2704, 2695, 2707, 2708, 2697, 3599, 86,
- 86, 86, 2705, 2706, 2699, 2709, 2710, 3599, 2711, 2714,
- 3599, 86, 2719, 86, 2700, 2712, 2702, 2701, 2703, 2722,
- 2704, 2716, 86, 86, 86, 86, 86, 2713, 2717, 2705,
- 2706, 86, 86, 2710, 86, 2711, 2714, 86, 2715, 86,
- 2720, 2718, 2712, 86, 2723, 86, 86, 2724, 2716, 2721,
- 2725, 86, 2727, 86, 2713, 2717, 86, 2726, 86, 86,
- 86, 2729, 2730, 2728, 2731, 2715, 2732, 2720, 2718, 3599,
- 86, 2723, 86, 2735, 2724, 86, 2721, 86, 2733, 2727,
-
- 2734, 86, 2739, 2736, 2726, 2737, 86, 86, 2729, 86,
- 2728, 2731, 2744, 2732, 86, 86, 86, 86, 86, 2740,
- 2735, 2738, 2743, 2745, 2741, 2733, 2742, 2734, 86, 2739,
- 2736, 86, 2737, 86, 86, 2746, 2747, 2748, 2749, 86,
- 3599, 86, 2751, 2754, 86, 2750, 2740, 86, 2738, 2743,
- 86, 2741, 86, 2742, 2752, 3599, 2753, 2760, 86, 2755,
- 2756, 3599, 86, 86, 2748, 2749, 86, 86, 86, 2751,
- 2754, 2757, 2750, 2758, 2759, 86, 2762, 2763, 86, 86,
- 86, 2752, 86, 2753, 86, 86, 2755, 2756, 2761, 2764,
- 2765, 2766, 2767, 2768, 3599, 2769, 86, 2773, 2757, 2770,
-
- 2758, 2759, 86, 86, 86, 86, 86, 2771, 86, 2774,
- 2775, 3599, 86, 3599, 86, 2761, 2764, 86, 2766, 2767,
- 2768, 86, 2769, 2772, 86, 2777, 2770, 86, 2776, 86,
- 86, 2778, 86, 2780, 2771, 2779, 2774, 86, 86, 2781,
- 2782, 2783, 3599, 2784, 86, 86, 86, 2786, 2788, 2787,
- 2772, 3599, 2777, 2785, 3599, 2776, 170, 86, 2778, 86,
- 2780, 86, 2779, 2791, 2795, 86, 2781, 2782, 2783, 86,
- 2784, 86, 2789, 2792, 2786, 2788, 2787, 86, 2790, 2793,
- 2785, 2794, 86, 2796, 3599, 2797, 86, 86, 2798, 2800,
- 2791, 86, 2799, 2801, 2802, 2803, 3599, 2804, 86, 2789,
-
- 2792, 86, 86, 86, 86, 2790, 2793, 86, 2794, 86,
- 86, 86, 2797, 2808, 86, 2798, 2800, 2805, 86, 2799,
- 2801, 2802, 2803, 2806, 2804, 2807, 86, 2809, 86, 2811,
- 2810, 86, 86, 2812, 86, 2814, 86, 2813, 2816, 3599,
- 2808, 2819, 86, 2815, 2805, 2817, 86, 2820, 2818, 2821,
- 2806, 2822, 2807, 86, 2809, 86, 2811, 2810, 86, 86,
- 2812, 86, 2814, 2826, 2813, 86, 86, 86, 2819, 2827,
- 2815, 2823, 2817, 2824, 86, 2818, 2821, 2825, 86, 2828,
- 86, 86, 86, 86, 2829, 2832, 86, 2831, 86, 2833,
- 2826, 2830, 2834, 86, 2835, 86, 2827, 2840, 2823, 2836,
-
- 2824, 86, 86, 2837, 2825, 86, 2828, 2838, 86, 2839,
- 3599, 2829, 2832, 2841, 2831, 2843, 86, 2844, 2830, 86,
- 2845, 2835, 86, 2842, 86, 86, 2836, 86, 2847, 86,
- 2837, 2846, 86, 86, 86, 86, 86, 2850, 2848, 2849,
- 2841, 3599, 2843, 2851, 2844, 2852, 86, 2845, 2853, 2854,
- 2842, 2856, 2855, 86, 86, 2847, 3599, 3599, 2846, 86,
- 86, 2860, 2858, 2857, 2850, 2848, 2849, 2859, 86, 86,
- 2851, 86, 86, 86, 86, 2853, 86, 86, 2856, 2855,
- 2861, 2866, 2867, 86, 2862, 2863, 2865, 2869, 2860, 2858,
- 2857, 86, 2864, 86, 2859, 86, 86, 2870, 2868, 86,
-
- 2871, 2875, 86, 2872, 2877, 86, 2873, 2861, 2866, 86,
- 86, 2862, 2863, 2865, 2869, 86, 86, 2876, 2882, 2864,
- 2874, 2878, 86, 2885, 86, 2868, 2879, 2871, 2875, 86,
- 2872, 86, 86, 2873, 2880, 86, 2881, 2883, 86, 2884,
- 86, 86, 2886, 86, 2876, 86, 86, 2874, 2878, 2887,
- 2885, 2888, 86, 2879, 2889, 2890, 2891, 86, 2893, 86,
- 2892, 2880, 2895, 2881, 2883, 2894, 2884, 2896, 86, 2886,
- 2897, 86, 86, 86, 86, 86, 86, 86, 2888, 2898,
- 2905, 86, 2890, 2891, 2899, 2893, 2900, 2892, 2901, 86,
- 2902, 2903, 2894, 86, 2896, 2908, 2904, 2897, 86, 2909,
-
- 86, 2913, 86, 2906, 2907, 2910, 86, 86, 86, 86,
- 86, 2899, 2911, 2900, 86, 2901, 86, 2902, 2903, 2912,
- 86, 86, 86, 2904, 2915, 86, 2909, 86, 2913, 2914,
- 2906, 2907, 2910, 2916, 2921, 2917, 2918, 86, 3599, 2911,
- 2922, 86, 86, 2919, 2923, 2920, 2912, 86, 2925, 2930,
- 3599, 2915, 86, 2926, 3599, 2927, 2914, 86, 86, 3599,
- 2916, 86, 2917, 2918, 2931, 86, 86, 86, 2924, 2928,
- 2919, 2923, 2920, 86, 2929, 170, 86, 86, 86, 2932,
- 2926, 86, 2927, 86, 2935, 2933, 86, 2934, 2936, 2937,
- 2938, 2931, 2949, 2940, 2939, 2924, 2928, 86, 2941, 2945,
-
- 2942, 2929, 2943, 86, 86, 86, 2932, 2944, 2947, 86,
- 2946, 86, 2933, 2950, 2934, 86, 2937, 86, 86, 2949,
- 86, 2939, 86, 2948, 86, 86, 2952, 2942, 2953, 2943,
- 86, 86, 86, 86, 2944, 2947, 2951, 2946, 2955, 2954,
- 2950, 86, 86, 2956, 2957, 2958, 3599, 2960, 3599, 2959,
- 2948, 3599, 3599, 86, 3599, 2961, 2962, 2963, 86, 2964,
- 86, 86, 86, 2951, 86, 2955, 2954, 86, 86, 2966,
- 86, 2957, 2958, 86, 2960, 2965, 2959, 86, 86, 86,
- 2967, 2969, 2961, 2962, 2963, 2968, 2964, 86, 2970, 86,
- 2972, 2971, 2973, 2974, 2978, 3599, 2966, 2975, 86, 86,
-
- 86, 86, 2965, 2979, 86, 2984, 2977, 2967, 2969, 2976,
- 86, 86, 2968, 86, 86, 2970, 86, 2980, 2971, 2973,
- 2974, 86, 86, 86, 2975, 86, 2982, 2981, 2983, 2985,
- 2979, 2986, 86, 2977, 2987, 2991, 2976, 86, 86, 2988,
- 86, 86, 2989, 86, 2980, 86, 2990, 2992, 86, 2994,
- 2993, 2995, 3599, 2982, 2981, 2983, 2985, 2996, 2986, 86,
- 2998, 2987, 86, 2997, 3001, 86, 2988, 86, 2999, 86,
- 3002, 3000, 3005, 2990, 3599, 3004, 86, 2993, 86, 86,
- 3003, 86, 86, 3007, 2996, 86, 86, 2998, 86, 3006,
- 2997, 3008, 3009, 3010, 86, 2999, 86, 3002, 3000, 86,
-
- 86, 86, 3004, 86, 3011, 3012, 3014, 3003, 3013, 86,
- 3007, 3015, 3017, 3599, 3016, 3599, 3006, 3023, 3008, 86,
- 86, 86, 3018, 3024, 86, 3025, 3026, 3021, 86, 3022,
- 86, 86, 3012, 3014, 86, 3013, 86, 86, 86, 3017,
- 3019, 3016, 86, 86, 3023, 3020, 3027, 3028, 3029, 3018,
- 86, 3030, 86, 86, 3021, 3031, 3022, 3033, 3032, 3041,
- 3034, 86, 86, 3035, 86, 86, 3037, 3036, 3039, 3038,
- 86, 3042, 86, 3027, 3028, 3029, 3040, 86, 86, 86,
- 3044, 3043, 3031, 86, 86, 3032, 86, 3034, 3045, 86,
- 86, 86, 3046, 86, 3036, 3039, 3038, 3047, 86, 3049,
-
- 3050, 3048, 3051, 3040, 86, 86, 86, 86, 3043, 3052,
- 86, 3053, 86, 86, 3599, 3045, 3054, 3055, 3056, 3059,
- 3064, 86, 3599, 86, 86, 3061, 3049, 3050, 3048, 3051,
- 3057, 3058, 3060, 3599, 3599, 3067, 3599, 3068, 3053, 86,
- 86, 86, 86, 3054, 86, 3056, 3059, 3064, 86, 86,
- 3599, 86, 3061, 3062, 3063, 86, 86, 3057, 3058, 3060,
- 3065, 3066, 3067, 86, 86, 3069, 3070, 3073, 86, 86,
- 3072, 3075, 3074, 3080, 3071, 86, 3076, 3077, 86, 3081,
- 3062, 3063, 3078, 86, 3082, 3599, 3083, 3065, 3066, 3084,
- 86, 86, 3069, 3070, 3073, 3085, 3079, 3072, 3087, 3074,
-
- 86, 3071, 3599, 86, 86, 86, 3081, 3086, 3091, 86,
- 86, 3082, 86, 3083, 3599, 86, 3084, 3088, 86, 3090,
- 86, 86, 3085, 3079, 86, 3087, 3089, 86, 3092, 3093,
- 86, 3094, 86, 3095, 3086, 3091, 86, 3098, 3096, 3099,
- 86, 3097, 3101, 3100, 3088, 86, 3090, 3103, 86, 86,
- 3102, 86, 3104, 3089, 3105, 3092, 3093, 3107, 3094, 86,
- 3095, 3106, 3108, 86, 86, 3096, 86, 86, 3097, 3101,
- 3100, 3113, 86, 3109, 86, 3110, 3111, 3102, 3112, 3104,
- 86, 86, 3114, 86, 86, 3115, 3116, 86, 3106, 3108,
- 3118, 86, 3120, 86, 86, 3599, 3123, 3121, 86, 3117,
-
- 3109, 3122, 3110, 3111, 86, 3112, 86, 86, 86, 86,
- 3119, 3124, 3115, 3116, 86, 86, 3126, 3118, 3125, 3127,
- 3128, 3131, 86, 3123, 86, 3130, 3117, 86, 3122, 3129,
- 86, 3132, 86, 3133, 86, 3134, 3137, 3119, 3124, 3135,
- 86, 86, 86, 86, 3599, 3125, 3127, 86, 3131, 3136,
- 86, 86, 3130, 3139, 86, 3140, 3129, 3138, 86, 3141,
- 3133, 3142, 3134, 3137, 86, 86, 3135, 3143, 3599, 3144,
- 86, 86, 3145, 3147, 3151, 3146, 3136, 3149, 3148, 3152,
- 3150, 3153, 3140, 86, 3138, 86, 3141, 86, 3142, 86,
- 86, 86, 3154, 3158, 3143, 86, 3144, 86, 3599, 3145,
-
- 3147, 86, 3146, 86, 3149, 3148, 86, 3150, 86, 3155,
- 86, 3157, 3156, 3159, 3161, 3160, 86, 3162, 3164, 3154,
- 86, 3166, 3599, 3169, 86, 86, 86, 3165, 3163, 3167,
- 86, 3171, 3168, 86, 86, 86, 3155, 86, 3157, 3156,
- 3159, 86, 3160, 86, 3162, 3164, 3170, 3599, 3166, 86,
- 86, 3173, 3172, 86, 3165, 3163, 3174, 3178, 3171, 3168,
- 3175, 86, 3179, 3176, 86, 3599, 3180, 3599, 3181, 86,
- 3599, 3182, 86, 3170, 86, 86, 86, 86, 3173, 3172,
- 86, 3177, 86, 3174, 86, 3183, 3184, 3175, 86, 3179,
- 3176, 3185, 3186, 3180, 86, 3181, 3190, 86, 3182, 86,
-
- 3187, 3191, 3188, 86, 3189, 3192, 86, 3193, 3177, 86,
- 86, 86, 3183, 3184, 86, 3194, 3195, 3198, 3185, 3186,
- 3196, 3199, 86, 3190, 86, 3197, 3201, 3187, 3191, 3188,
- 86, 3189, 3192, 3200, 86, 3202, 3203, 3204, 86, 86,
- 3205, 3207, 86, 3195, 3198, 3599, 86, 86, 86, 3206,
- 3208, 86, 86, 86, 3209, 3210, 3213, 86, 3212, 86,
- 3200, 3211, 3202, 3203, 3204, 86, 86, 3205, 86, 3216,
- 3215, 86, 86, 3214, 3217, 3219, 3206, 3208, 86, 3599,
- 3599, 3209, 86, 3213, 3218, 3212, 86, 86, 3211, 3221,
- 3220, 86, 3222, 3223, 86, 3225, 86, 3215, 3224, 3226,
-
- 3214, 3230, 86, 3231, 3599, 3228, 86, 86, 86, 3229,
- 86, 3218, 86, 3235, 3233, 3232, 3221, 3220, 3227, 86,
- 86, 86, 3225, 86, 3234, 3224, 86, 86, 3230, 86,
- 3237, 86, 3228, 3239, 3236, 86, 3229, 3240, 3238, 3242,
- 86, 3233, 3232, 3241, 3245, 3227, 86, 3243, 3244, 3599,
- 86, 3234, 86, 3248, 86, 3247, 3249, 3237, 3246, 86,
- 3239, 3236, 86, 3251, 3240, 3238, 3254, 86, 3599, 3599,
- 3241, 86, 86, 3250, 86, 3244, 86, 86, 86, 3255,
- 86, 86, 3247, 3249, 3258, 3246, 3252, 3253, 3256, 3257,
- 3259, 86, 3261, 86, 86, 86, 86, 86, 86, 3260,
-
- 3250, 3263, 3262, 86, 3264, 3265, 3255, 86, 3266, 3267,
- 3269, 3258, 3268, 3252, 3253, 3256, 3257, 86, 3270, 3261,
- 86, 3271, 86, 3272, 3273, 3275, 3260, 3276, 86, 3262,
- 86, 86, 86, 3277, 86, 3266, 3267, 86, 86, 3268,
- 3274, 86, 3278, 3279, 3280, 86, 3285, 3283, 86, 86,
- 86, 3273, 86, 86, 3276, 86, 3281, 86, 3282, 3284,
- 86, 86, 3286, 86, 86, 3287, 86, 3274, 3288, 3278,
- 86, 3280, 86, 3285, 3283, 3289, 86, 3290, 3291, 3292,
- 3293, 3294, 3295, 3281, 86, 3282, 3284, 3304, 86, 86,
- 86, 3296, 3287, 3297, 3298, 3288, 86, 3299, 86, 3300,
-
- 3301, 86, 3289, 86, 3290, 3291, 86, 86, 3294, 3302,
- 3303, 3306, 3307, 3305, 86, 3599, 86, 3599, 3296, 86,
- 3297, 3298, 3308, 86, 3299, 3309, 86, 86, 86, 3310,
- 86, 86, 3313, 3599, 3311, 3312, 3302, 3303, 3306, 86,
- 3305, 86, 86, 3314, 86, 3315, 3316, 3317, 86, 3308,
- 3318, 86, 3309, 3319, 86, 86, 3310, 86, 86, 3313,
- 86, 3311, 3312, 3599, 3321, 86, 86, 3320, 3322, 3323,
- 3314, 3325, 3315, 3316, 3317, 86, 86, 3318, 86, 3324,
- 3319, 3326, 3327, 3328, 3333, 86, 3331, 3332, 3599, 86,
- 3329, 3321, 3330, 86, 3320, 3322, 3323, 3334, 3325, 86,
-
- 3335, 86, 3336, 86, 3337, 3339, 3324, 3341, 3326, 3327,
- 86, 86, 86, 3331, 3332, 86, 3346, 3329, 3340, 3330,
- 3338, 3342, 3343, 86, 86, 3349, 86, 3335, 86, 86,
- 86, 3337, 86, 3350, 86, 3344, 3345, 3347, 3348, 3599,
- 3351, 3352, 3353, 86, 3354, 3340, 3355, 3338, 86, 3356,
- 86, 86, 3349, 3358, 3357, 86, 86, 86, 86, 3359,
- 3350, 86, 3362, 3360, 86, 3363, 86, 3351, 86, 3353,
- 86, 3354, 86, 3355, 3368, 86, 3356, 3361, 3364, 86,
- 3358, 3357, 86, 3365, 3366, 3367, 86, 3370, 86, 3362,
- 3360, 3369, 3363, 86, 3371, 86, 86, 3372, 3374, 3375,
-
- 3379, 86, 3376, 3373, 3361, 3364, 3380, 86, 86, 86,
- 3365, 3366, 3367, 86, 3370, 86, 3381, 86, 3369, 3383,
- 86, 86, 3377, 3384, 86, 3374, 3375, 3378, 86, 3376,
- 3373, 3382, 86, 3380, 3385, 3386, 3387, 86, 3388, 3389,
- 3390, 86, 86, 3381, 3391, 86, 3383, 3392, 3393, 3394,
- 3384, 3396, 3395, 3397, 86, 3398, 86, 3399, 3382, 86,
- 86, 3385, 86, 3400, 3401, 3388, 86, 86, 86, 86,
- 86, 3391, 3402, 3403, 3392, 86, 86, 3404, 3396, 3395,
- 86, 3407, 86, 3406, 86, 3405, 86, 3408, 3409, 3411,
- 86, 86, 3410, 3412, 3413, 3414, 86, 3415, 3417, 86,
-
- 86, 86, 86, 3416, 86, 3418, 86, 86, 86, 86,
- 3406, 3419, 3405, 86, 86, 3409, 3411, 86, 3421, 3410,
- 86, 3413, 86, 3420, 3415, 3417, 3428, 3422, 3423, 3427,
- 3416, 86, 3418, 3424, 86, 86, 86, 3425, 86, 3426,
- 3430, 3431, 3432, 3599, 3429, 86, 3487, 3435, 86, 86,
- 3420, 86, 86, 86, 3422, 3423, 3427, 86, 86, 3433,
- 3424, 3434, 86, 86, 3425, 86, 3426, 3430, 3431, 3432,
- 86, 3429, 3436, 3437, 3435, 3438, 86, 3439, 86, 3440,
- 3442, 3441, 86, 3443, 86, 86, 3433, 3444, 3434, 3445,
- 3448, 3447, 3446, 3451, 86, 86, 86, 86, 3450, 3436,
-
- 3437, 86, 3438, 3456, 3439, 86, 3440, 3442, 3441, 86,
- 86, 86, 3452, 86, 86, 3449, 86, 3448, 3447, 3446,
- 3451, 3453, 86, 3455, 3454, 3450, 3457, 3459, 86, 86,
- 3456, 3599, 3599, 3458, 3460, 86, 86, 3463, 3469, 3452,
- 86, 86, 3449, 86, 3461, 86, 86, 3462, 3453, 86,
- 3455, 3454, 3464, 3457, 3459, 86, 3465, 3466, 3467, 86,
- 3458, 3460, 3468, 86, 3463, 86, 3470, 86, 3471, 3472,
- 86, 3461, 3474, 86, 3462, 3476, 3475, 3478, 86, 3464,
- 86, 3473, 86, 3465, 3466, 3467, 3477, 3479, 86, 3468,
- 86, 3481, 3480, 3470, 86, 3471, 3472, 3482, 86, 86,
-
- 86, 3483, 86, 3475, 86, 3484, 3491, 3485, 3473, 86,
- 3486, 3489, 86, 3477, 86, 3599, 3488, 3490, 3481, 3480,
- 3493, 86, 86, 86, 3482, 3494, 86, 86, 3483, 86,
- 3495, 3498, 3484, 86, 3485, 3492, 3496, 3486, 3489, 86,
- 3501, 3497, 86, 3488, 3490, 3500, 3508, 86, 86, 86,
- 3502, 3503, 86, 3499, 86, 3505, 3504, 86, 86, 3506,
- 86, 3507, 3492, 3496, 86, 86, 3511, 86, 3497, 3512,
- 86, 3509, 3500, 3508, 86, 3510, 86, 3502, 3503, 86,
- 3499, 3515, 3514, 3504, 3513, 3518, 3520, 86, 3507, 86,
- 86, 86, 3516, 86, 86, 3519, 86, 86, 3509, 3517,
-
- 86, 3523, 3510, 86, 3521, 3524, 86, 86, 3515, 3514,
- 3525, 3513, 3518, 3520, 3526, 86, 3522, 3528, 86, 3516,
- 3527, 86, 3519, 86, 86, 86, 3517, 86, 3523, 86,
- 3529, 3521, 3524, 3530, 3531, 3532, 3533, 86, 3536, 3537,
- 3599, 3526, 3534, 3522, 3528, 3535, 86, 3527, 3538, 3540,
- 3599, 3539, 3546, 3599, 3541, 86, 3599, 86, 86, 3543,
- 3530, 86, 3532, 3533, 86, 3536, 86, 86, 3549, 3534,
- 3550, 86, 3535, 86, 3542, 86, 86, 86, 3539, 86,
- 3544, 3541, 86, 3545, 86, 3547, 3543, 3551, 86, 3548,
- 3552, 86, 3554, 86, 86, 3549, 3553, 86, 3555, 3556,
-
- 86, 3542, 3557, 86, 3599, 86, 86, 3544, 3558, 3565,
- 3545, 3561, 3547, 86, 3551, 3563, 3548, 3552, 86, 3554,
- 3559, 3560, 86, 3553, 3562, 3555, 3556, 3564, 86, 3557,
- 86, 86, 86, 3568, 86, 3558, 3565, 86, 3561, 3566,
- 3569, 86, 3563, 3570, 3567, 3571, 3577, 3559, 3560, 3572,
- 3574, 3562, 86, 86, 3564, 3573, 3575, 3576, 86, 86,
- 86, 3599, 86, 3579, 3580, 86, 3566, 3569, 86, 86,
- 3570, 3567, 86, 86, 3583, 86, 3572, 3574, 86, 3578,
- 3581, 3582, 3573, 3575, 3576, 86, 86, 86, 86, 86,
- 3579, 3580, 3584, 3588, 3585, 3586, 3599, 3587, 3589, 3590,
-
- 86, 3583, 86, 86, 3591, 3593, 3578, 3581, 3582, 3592,
- 3597, 3594, 3598, 3599, 3599, 3599, 3599, 3599, 86, 86,
- 86, 3585, 3586, 86, 3587, 3589, 86, 86, 3599, 86,
- 3599, 86, 3593, 86, 3595, 3596, 3592, 86, 3594, 86,
- 3599, 3599, 86, 86, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3595, 3596, 47, 47, 47, 47, 47, 47, 47,
- 52, 52, 52, 52, 52, 52, 52, 57, 57, 57,
- 57, 57, 57, 57, 63, 63, 63, 63, 63, 63,
- 63, 68, 68, 68, 68, 68, 68, 68, 74, 74,
-
- 74, 74, 74, 74, 74, 80, 80, 80, 80, 80,
- 80, 80, 89, 89, 3599, 89, 89, 89, 89, 160,
- 160, 3599, 3599, 3599, 160, 160, 162, 162, 3599, 3599,
- 162, 3599, 162, 164, 3599, 3599, 3599, 3599, 3599, 164,
- 167, 167, 3599, 3599, 3599, 167, 167, 169, 3599, 3599,
- 3599, 3599, 3599, 169, 171, 171, 3599, 171, 171, 171,
- 171, 174, 3599, 3599, 3599, 3599, 3599, 174, 177, 177,
- 3599, 3599, 3599, 177, 177, 90, 90, 3599, 90, 90,
- 90, 90, 17, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
-
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599
+ 86, 242, 241, 3645, 3645, 247, 86, 230, 231, 86,
+ 86, 235, 238, 243, 234, 233, 239, 86, 3645, 86,
+ 86, 244, 240, 236, 237, 248, 86, 86, 242, 241,
+ 245, 250, 247, 249, 86, 255, 246, 253, 3645, 238,
+
+ 243, 86, 251, 239, 86, 259, 252, 346, 244, 240,
+ 86, 86, 248, 349, 256, 86, 260, 245, 250, 261,
+ 249, 268, 255, 246, 253, 86, 264, 262, 269, 251,
+ 86, 257, 259, 252, 258, 86, 86, 86, 265, 86,
+ 86, 256, 270, 260, 272, 86, 261, 266, 268, 273,
+ 86, 271, 370, 264, 262, 269, 3645, 86, 257, 267,
+ 86, 258, 86, 86, 3645, 265, 86, 274, 3645, 270,
+ 164, 272, 164, 164, 266, 164, 273, 169, 271, 169,
+ 169, 275, 169, 276, 86, 90, 267, 90, 90, 282,
+ 90, 170, 278, 174, 274, 174, 174, 277, 174, 279,
+
+ 287, 86, 280, 86, 284, 86, 283, 86, 275, 281,
+ 285, 86, 86, 286, 288, 86, 282, 292, 291, 278,
+ 86, 86, 86, 172, 277, 86, 279, 287, 289, 280,
+ 293, 284, 86, 283, 290, 86, 281, 285, 295, 86,
+ 286, 288, 296, 304, 292, 291, 303, 305, 3645, 308,
+ 310, 373, 306, 309, 307, 314, 86, 293, 86, 297,
+ 86, 290, 86, 312, 3645, 86, 86, 311, 3645, 296,
+ 304, 86, 86, 303, 86, 86, 308, 310, 86, 86,
+ 309, 307, 314, 86, 315, 316, 297, 298, 317, 321,
+ 318, 313, 299, 379, 311, 86, 86, 300, 86, 322,
+
+ 323, 86, 86, 301, 302, 319, 86, 329, 320, 3645,
+ 86, 315, 316, 3645, 298, 317, 321, 318, 313, 299,
+ 86, 86, 86, 333, 300, 86, 322, 323, 3645, 86,
+ 301, 302, 319, 330, 329, 320, 324, 331, 337, 325,
+ 86, 326, 339, 334, 345, 86, 341, 3645, 86, 86,
+ 333, 352, 86, 327, 335, 328, 340, 343, 86, 3645,
+ 330, 380, 86, 324, 331, 337, 325, 86, 326, 3645,
+ 382, 345, 347, 341, 86, 86, 350, 348, 352, 86,
+ 327, 335, 328, 340, 343, 351, 353, 354, 356, 357,
+ 86, 86, 360, 86, 3645, 358, 355, 86, 359, 347,
+
+ 362, 86, 86, 350, 348, 361, 86, 86, 86, 86,
+ 86, 86, 351, 353, 354, 356, 357, 86, 366, 360,
+ 86, 363, 358, 355, 364, 359, 367, 362, 86, 365,
+ 374, 368, 361, 369, 3645, 86, 377, 86, 86, 375,
+ 86, 371, 372, 381, 86, 366, 376, 378, 363, 383,
+ 86, 86, 384, 367, 86, 385, 86, 374, 368, 386,
+ 369, 86, 387, 377, 86, 86, 375, 86, 371, 372,
+ 381, 86, 389, 376, 378, 390, 383, 400, 3645, 384,
+ 392, 86, 385, 393, 86, 388, 86, 395, 394, 396,
+ 397, 398, 391, 401, 86, 86, 3645, 86, 404, 402,
+
+ 86, 403, 390, 170, 86, 86, 3645, 392, 86, 86,
+ 393, 411, 388, 86, 395, 394, 396, 397, 398, 391,
+ 399, 86, 405, 86, 86, 86, 402, 406, 403, 407,
+ 86, 408, 409, 410, 86, 86, 414, 412, 86, 3645,
+ 86, 413, 419, 86, 86, 417, 416, 399, 418, 405,
+ 426, 86, 421, 86, 406, 86, 407, 422, 408, 409,
+ 410, 86, 86, 414, 412, 420, 86, 423, 413, 419,
+ 424, 86, 417, 416, 86, 418, 86, 86, 425, 421,
+ 86, 428, 86, 427, 422, 86, 86, 429, 86, 430,
+ 3645, 433, 420, 434, 423, 435, 86, 424, 439, 431,
+
+ 436, 438, 3645, 440, 3645, 425, 3645, 86, 86, 86,
+ 427, 442, 86, 86, 429, 86, 432, 86, 433, 441,
+ 434, 86, 86, 443, 437, 439, 431, 86, 438, 445,
+ 440, 444, 86, 86, 446, 447, 449, 86, 442, 448,
+ 86, 453, 86, 432, 86, 86, 441, 86, 454, 452,
+ 443, 437, 86, 450, 455, 477, 445, 464, 444, 463,
+ 462, 446, 447, 449, 86, 86, 448, 469, 86, 86,
+ 451, 3645, 86, 86, 3645, 454, 452, 86, 86, 86,
+ 450, 455, 86, 486, 464, 470, 463, 462, 3645, 3645,
+ 471, 86, 3645, 3645, 469, 472, 473, 451, 456, 86,
+
+ 465, 457, 466, 484, 3645, 86, 458, 459, 460, 461,
+ 86, 3645, 470, 476, 474, 467, 86, 471, 468, 475,
+ 86, 86, 472, 473, 86, 456, 488, 465, 457, 466,
+ 484, 480, 481, 458, 459, 460, 461, 86, 478, 485,
+ 476, 479, 467, 86, 86, 468, 86, 487, 86, 489,
+ 482, 483, 86, 488, 490, 491, 86, 86, 480, 481,
+ 86, 492, 494, 497, 493, 478, 485, 86, 479, 86,
+ 86, 3645, 496, 495, 487, 86, 489, 482, 483, 86,
+ 86, 490, 491, 86, 86, 498, 502, 499, 492, 494,
+ 504, 493, 3645, 86, 503, 86, 500, 505, 506, 496,
+
+ 495, 517, 3645, 501, 507, 508, 3645, 509, 515, 560,
+ 516, 86, 498, 502, 499, 510, 86, 518, 3645, 86,
+ 86, 503, 86, 500, 505, 506, 86, 511, 86, 86,
+ 501, 507, 508, 86, 509, 515, 86, 516, 519, 532,
+ 512, 86, 510, 513, 86, 514, 86, 3645, 3645, 535,
+ 533, 86, 536, 3645, 511, 3645, 537, 3645, 3645, 573,
+ 86, 86, 538, 3645, 86, 519, 532, 512, 534, 86,
+ 513, 540, 514, 520, 86, 521, 535, 533, 539, 536,
+ 549, 522, 551, 537, 86, 523, 86, 552, 550, 538,
+ 524, 86, 86, 525, 3645, 534, 3645, 553, 540, 86,
+
+ 520, 557, 521, 555, 554, 539, 86, 549, 522, 170,
+ 3645, 556, 523, 86, 86, 550, 3645, 524, 86, 86,
+ 525, 526, 558, 527, 553, 559, 561, 86, 557, 3645,
+ 555, 554, 563, 86, 571, 562, 528, 564, 556, 529,
+ 86, 530, 86, 531, 3645, 86, 565, 86, 526, 558,
+ 527, 568, 559, 561, 3645, 3645, 86, 578, 86, 563,
+ 569, 571, 562, 528, 570, 572, 529, 86, 530, 86,
+ 531, 541, 542, 565, 574, 566, 86, 86, 568, 575,
+ 576, 543, 544, 545, 546, 547, 86, 569, 548, 86,
+ 577, 570, 572, 567, 580, 86, 86, 86, 541, 542,
+
+ 86, 574, 566, 86, 581, 86, 575, 576, 543, 544,
+ 545, 546, 547, 585, 579, 548, 86, 577, 582, 583,
+ 567, 580, 584, 586, 86, 587, 86, 3645, 588, 86,
+ 596, 581, 589, 3645, 86, 593, 3645, 597, 86, 598,
+ 585, 579, 590, 591, 612, 86, 626, 86, 594, 584,
+ 586, 86, 587, 86, 86, 588, 86, 596, 86, 589,
+ 592, 599, 593, 595, 597, 600, 598, 86, 601, 590,
+ 591, 86, 86, 86, 86, 594, 86, 602, 603, 613,
+ 614, 86, 616, 617, 3645, 615, 621, 592, 599, 604,
+ 595, 605, 600, 618, 620, 601, 86, 86, 3645, 86,
+
+ 86, 3645, 86, 619, 602, 603, 613, 614, 86, 616,
+ 86, 622, 615, 621, 3645, 86, 604, 86, 605, 606,
+ 618, 620, 623, 625, 86, 624, 627, 607, 608, 86,
+ 619, 609, 610, 86, 629, 611, 630, 86, 622, 3645,
+ 631, 86, 628, 3645, 634, 632, 606, 664, 86, 623,
+ 625, 86, 624, 627, 607, 608, 86, 86, 609, 610,
+ 86, 629, 611, 86, 633, 635, 86, 631, 86, 628,
+ 86, 634, 632, 636, 638, 639, 640, 3645, 641, 86,
+ 642, 637, 86, 645, 643, 86, 644, 86, 646, 86,
+ 647, 633, 635, 86, 649, 3645, 3645, 666, 86, 86,
+
+ 636, 638, 639, 640, 86, 641, 86, 642, 637, 86,
+ 645, 643, 86, 644, 86, 646, 648, 647, 650, 652,
+ 86, 649, 86, 86, 651, 86, 654, 656, 653, 86,
+ 655, 658, 86, 86, 657, 662, 668, 659, 86, 3645,
+ 660, 3645, 661, 648, 86, 650, 652, 86, 86, 86,
+ 86, 651, 86, 654, 656, 653, 86, 655, 658, 663,
+ 665, 657, 662, 667, 659, 3645, 86, 660, 86, 661,
+ 669, 670, 671, 86, 677, 672, 673, 675, 676, 3645,
+ 674, 86, 3645, 3645, 86, 679, 663, 665, 678, 86,
+ 667, 86, 86, 86, 680, 86, 86, 669, 670, 671,
+
+ 86, 682, 672, 673, 675, 676, 86, 674, 683, 86,
+ 686, 684, 679, 685, 86, 678, 86, 681, 690, 86,
+ 687, 689, 688, 691, 703, 692, 86, 3645, 682, 86,
+ 86, 86, 704, 86, 86, 683, 86, 686, 684, 86,
+ 685, 3645, 86, 86, 681, 690, 708, 687, 689, 688,
+ 691, 703, 692, 693, 701, 86, 702, 705, 694, 704,
+ 695, 86, 86, 707, 706, 86, 696, 3645, 697, 86,
+ 711, 698, 699, 708, 86, 3645, 716, 3645, 700, 86,
+ 693, 701, 86, 702, 705, 694, 86, 695, 709, 712,
+ 707, 706, 710, 696, 86, 697, 719, 711, 698, 699,
+
+ 721, 714, 720, 716, 715, 700, 3645, 717, 86, 713,
+ 86, 86, 86, 86, 722, 709, 712, 718, 86, 710,
+ 724, 3645, 726, 719, 86, 723, 727, 721, 714, 720,
+ 728, 715, 86, 725, 733, 86, 713, 730, 86, 86,
+ 734, 722, 729, 731, 718, 86, 86, 724, 86, 726,
+ 732, 86, 723, 727, 86, 86, 86, 728, 86, 736,
+ 725, 733, 737, 86, 730, 735, 738, 734, 739, 729,
+ 731, 86, 741, 86, 740, 742, 743, 732, 3645, 744,
+ 3645, 745, 750, 86, 86, 754, 736, 86, 86, 737,
+ 86, 86, 735, 738, 86, 739, 747, 170, 746, 748,
+
+ 749, 740, 742, 743, 86, 86, 744, 86, 745, 750,
+ 86, 752, 751, 753, 86, 86, 755, 86, 756, 757,
+ 758, 760, 86, 747, 759, 746, 748, 749, 762, 772,
+ 86, 86, 761, 86, 86, 763, 767, 86, 752, 751,
+ 86, 768, 764, 755, 86, 765, 757, 758, 760, 766,
+ 86, 759, 86, 86, 86, 762, 769, 770, 771, 761,
+ 86, 86, 763, 773, 774, 775, 776, 782, 86, 764,
+ 86, 777, 765, 778, 779, 781, 766, 780, 783, 3645,
+ 86, 786, 86, 769, 86, 86, 86, 784, 785, 86,
+ 86, 86, 86, 789, 782, 790, 792, 86, 86, 86,
+
+ 778, 779, 781, 86, 780, 783, 86, 787, 786, 788,
+ 794, 86, 86, 793, 784, 785, 86, 86, 791, 86,
+ 789, 796, 86, 792, 798, 86, 795, 86, 799, 797,
+ 86, 801, 86, 803, 787, 800, 788, 794, 3645, 86,
+ 793, 86, 86, 86, 804, 791, 3645, 86, 796, 811,
+ 86, 798, 802, 795, 805, 799, 797, 816, 801, 86,
+ 814, 818, 800, 815, 806, 86, 86, 86, 810, 807,
+ 86, 804, 808, 809, 812, 86, 811, 86, 813, 802,
+ 817, 805, 86, 86, 816, 86, 819, 814, 86, 86,
+ 815, 806, 86, 86, 820, 810, 807, 821, 3645, 808,
+
+ 809, 812, 824, 823, 86, 813, 825, 817, 827, 829,
+ 3645, 826, 828, 819, 832, 830, 3645, 86, 86, 822,
+ 86, 820, 86, 86, 821, 86, 86, 831, 86, 824,
+ 823, 833, 86, 825, 86, 827, 829, 86, 826, 828,
+ 834, 86, 830, 837, 835, 836, 822, 838, 86, 86,
+ 86, 839, 840, 841, 831, 846, 86, 844, 833, 842,
+ 843, 86, 86, 845, 86, 847, 851, 834, 853, 849,
+ 837, 835, 836, 86, 838, 852, 848, 86, 86, 840,
+ 841, 86, 846, 86, 844, 86, 850, 854, 86, 86,
+ 845, 86, 847, 855, 86, 86, 849, 86, 86, 856,
+
+ 86, 857, 852, 848, 858, 860, 865, 867, 861, 859,
+ 3645, 86, 86, 850, 854, 862, 866, 868, 3645, 86,
+ 855, 86, 86, 870, 86, 86, 856, 871, 857, 863,
+ 864, 872, 860, 869, 867, 861, 86, 86, 86, 86,
+ 86, 881, 862, 866, 868, 875, 873, 86, 876, 86,
+ 870, 86, 877, 882, 871, 86, 863, 864, 872, 879,
+ 869, 874, 878, 86, 880, 883, 891, 86, 881, 885,
+ 86, 3645, 886, 873, 86, 876, 884, 86, 887, 877,
+ 882, 86, 893, 892, 86, 889, 888, 86, 874, 878,
+ 86, 86, 883, 86, 86, 86, 885, 890, 86, 886,
+
+ 86, 901, 894, 884, 86, 887, 86, 895, 896, 893,
+ 892, 3645, 889, 888, 86, 897, 898, 86, 900, 86,
+ 902, 904, 906, 86, 890, 899, 903, 86, 86, 894,
+ 86, 3645, 908, 86, 895, 896, 86, 3645, 905, 86,
+ 86, 3645, 897, 898, 949, 900, 86, 902, 904, 906,
+ 907, 909, 899, 903, 911, 86, 910, 916, 86, 908,
+ 86, 912, 913, 86, 914, 905, 915, 86, 918, 917,
+ 86, 86, 86, 920, 86, 919, 922, 907, 909, 86,
+ 3645, 911, 86, 910, 916, 3645, 86, 924, 912, 913,
+ 925, 914, 86, 915, 86, 918, 917, 921, 86, 923,
+
+ 920, 86, 919, 922, 927, 86, 3645, 926, 928, 86,
+ 929, 936, 86, 930, 924, 86, 931, 925, 86, 86,
+ 932, 934, 933, 937, 921, 935, 923, 940, 86, 86,
+ 86, 927, 86, 86, 926, 928, 86, 929, 936, 938,
+ 930, 939, 86, 931, 86, 86, 3645, 932, 934, 933,
+ 937, 941, 935, 942, 956, 3645, 86, 86, 943, 86,
+ 946, 944, 947, 948, 945, 952, 938, 3645, 939, 86,
+ 3645, 950, 86, 170, 86, 86, 954, 86, 941, 951,
+ 942, 86, 86, 953, 958, 943, 86, 946, 944, 947,
+ 948, 945, 86, 955, 86, 957, 962, 86, 950, 959,
+
+ 961, 86, 86, 954, 963, 86, 951, 86, 965, 86,
+ 953, 958, 964, 960, 86, 86, 966, 86, 86, 977,
+ 955, 975, 957, 86, 976, 979, 959, 961, 86, 967,
+ 86, 963, 86, 86, 86, 965, 86, 86, 978, 964,
+ 960, 980, 982, 966, 984, 981, 977, 3645, 975, 1000,
+ 3645, 976, 979, 86, 990, 86, 967, 968, 983, 86,
+ 969, 3645, 86, 86, 970, 978, 985, 971, 980, 982,
+ 86, 984, 981, 986, 972, 973, 1000, 974, 3645, 987,
+ 1002, 86, 86, 988, 968, 983, 86, 969, 86, 86,
+ 989, 970, 86, 985, 971, 1022, 86, 86, 998, 1001,
+
+ 986, 972, 973, 86, 974, 86, 987, 1002, 86, 3645,
+ 988, 999, 1003, 3645, 1004, 86, 1009, 989, 991, 992,
+ 1006, 993, 86, 1007, 994, 998, 1001, 1008, 86, 995,
+ 1005, 86, 1010, 86, 86, 996, 997, 86, 999, 1003,
+ 1011, 1004, 86, 1009, 86, 991, 992, 1006, 993, 86,
+ 1007, 994, 1014, 1012, 1008, 1015, 995, 1005, 1013, 1010,
+ 3645, 1016, 996, 997, 86, 1017, 1020, 1011, 1018, 1019,
+ 3645, 1024, 86, 86, 1023, 1021, 1025, 1026, 3645, 1014,
+ 3645, 86, 1015, 1030, 86, 86, 86, 86, 1016, 1029,
+ 86, 86, 1017, 1020, 86, 1018, 1019, 86, 1024, 86,
+
+ 86, 1023, 1021, 1025, 1026, 1027, 1028, 1031, 86, 86,
+ 1030, 1032, 86, 1033, 86, 1035, 1029, 1034, 1036, 86,
+ 1037, 1038, 1039, 86, 86, 1043, 86, 1044, 1042, 1045,
+ 86, 1040, 1027, 1028, 1031, 86, 1041, 1046, 1032, 86,
+ 1033, 1047, 1035, 86, 1034, 1036, 3645, 1048, 1038, 86,
+ 86, 1049, 86, 1051, 1044, 1042, 1050, 86, 1052, 86,
+ 1053, 86, 1055, 86, 1046, 1056, 1057, 1054, 1058, 1061,
+ 1059, 86, 86, 86, 1048, 86, 86, 86, 1049, 86,
+ 86, 86, 1060, 1050, 86, 86, 86, 1053, 86, 1055,
+ 86, 1063, 1056, 1057, 1054, 1058, 86, 1059, 1062, 1064,
+
+ 1065, 1068, 1066, 1069, 1067, 3645, 1072, 1075, 3645, 1060,
+ 86, 86, 86, 1071, 1070, 1073, 86, 86, 1063, 86,
+ 86, 86, 1074, 1078, 86, 1062, 86, 1077, 1068, 1066,
+ 1069, 1067, 86, 1072, 1075, 86, 1076, 86, 86, 86,
+ 1071, 1070, 1073, 1079, 86, 86, 1081, 1084, 1080, 1074,
+ 1078, 1082, 1083, 1085, 1077, 86, 1087, 1086, 1088, 86,
+ 86, 1090, 1091, 1076, 86, 86, 1089, 1097, 1093, 3645,
+ 1092, 86, 86, 1081, 1084, 86, 86, 86, 1082, 1083,
+ 1085, 1094, 86, 1087, 1086, 1088, 86, 86, 1090, 86,
+ 86, 1095, 1096, 1089, 1097, 1093, 1098, 1092, 86, 86,
+
+ 1100, 1101, 1099, 86, 86, 1102, 1104, 1103, 1094, 1108,
+ 1106, 3645, 1105, 1109, 86, 86, 1111, 86, 1095, 1096,
+ 86, 1110, 1107, 1098, 86, 86, 86, 1100, 1101, 1099,
+ 86, 1112, 1102, 86, 1103, 86, 1108, 1106, 86, 1105,
+ 1109, 1113, 86, 1111, 86, 1114, 1115, 1117, 1110, 1107,
+ 1116, 1119, 1118, 1120, 86, 1123, 1121, 86, 1112, 86,
+ 86, 86, 86, 86, 1124, 86, 1125, 1122, 1113, 1126,
+ 86, 86, 86, 1115, 1117, 86, 1127, 1116, 1119, 1118,
+ 1120, 1128, 1123, 1121, 1129, 1130, 1131, 1132, 1134, 86,
+ 3645, 1124, 86, 1133, 1122, 1137, 86, 86, 86, 1135,
+
+ 1138, 86, 1139, 1127, 1140, 1141, 86, 1136, 1142, 1145,
+ 3645, 1129, 1130, 86, 86, 1134, 86, 86, 86, 86,
+ 1133, 1143, 1137, 1147, 1144, 3645, 1135, 1138, 86, 1139,
+ 86, 1149, 86, 1146, 1136, 1142, 86, 86, 86, 1153,
+ 86, 86, 1150, 1148, 1154, 1156, 3645, 1155, 1143, 1157,
+ 86, 1144, 86, 86, 1161, 1151, 1158, 1152, 1149, 86,
+ 1146, 86, 86, 1160, 1162, 1163, 86, 86, 86, 1150,
+ 1148, 170, 1156, 1159, 1155, 86, 1157, 1173, 86, 1164,
+ 86, 1161, 1151, 1158, 1152, 86, 1174, 1165, 1176, 1166,
+ 1160, 1162, 1163, 86, 86, 86, 1183, 1178, 3645, 1175,
+
+ 1159, 1184, 3645, 86, 1173, 1177, 1164, 86, 3645, 86,
+ 1179, 86, 1181, 1174, 1165, 86, 1166, 1167, 1180, 1168,
+ 86, 1189, 86, 1169, 1178, 1170, 1175, 1182, 86, 1185,
+ 1171, 86, 1177, 86, 86, 1172, 1186, 1179, 1192, 1181,
+ 86, 86, 1193, 1187, 1167, 1180, 1168, 86, 1189, 86,
+ 1169, 1190, 1170, 86, 1182, 1188, 1185, 1171, 1194, 1196,
+ 1199, 1191, 1172, 1186, 86, 1192, 86, 1198, 1195, 1193,
+ 1187, 86, 86, 86, 86, 1197, 1200, 1201, 1190, 1202,
+ 1203, 86, 1188, 1205, 1228, 1194, 1196, 1199, 1191, 86,
+ 1208, 1206, 1207, 86, 1198, 1195, 86, 1216, 86, 86,
+
+ 86, 1217, 1197, 1200, 1220, 3645, 3645, 86, 1218, 86,
+ 1221, 86, 86, 3645, 1219, 86, 86, 1208, 1206, 1207,
+ 1209, 86, 3645, 86, 1216, 1210, 3645, 1211, 1217, 86,
+ 86, 1220, 86, 1212, 1222, 1218, 1224, 1221, 1213, 1214,
+ 1223, 1219, 1225, 1230, 1227, 1215, 86, 1209, 1226, 86,
+ 86, 86, 1210, 86, 1211, 86, 86, 1229, 86, 1231,
+ 1212, 1222, 1232, 1224, 1235, 1213, 1214, 1223, 86, 1225,
+ 1230, 1227, 1215, 86, 1233, 1226, 1234, 1236, 1238, 86,
+ 1237, 1239, 1240, 86, 1229, 86, 1231, 86, 1242, 1232,
+ 86, 86, 1241, 1243, 1244, 1246, 1249, 3645, 3645, 1247,
+
+ 86, 1233, 86, 1234, 1236, 86, 1250, 1237, 1239, 1240,
+ 86, 1261, 1245, 86, 86, 1242, 86, 86, 1248, 1241,
+ 86, 1244, 1246, 1251, 86, 86, 1247, 1252, 86, 86,
+ 1253, 86, 1259, 1250, 1254, 1255, 1256, 86, 1257, 1245,
+ 1258, 1262, 86, 86, 1265, 1248, 3645, 86, 1264, 86,
+ 1251, 86, 86, 86, 1252, 86, 86, 1253, 86, 1259,
+ 1260, 1254, 1255, 1256, 1263, 1257, 86, 1258, 1262, 1267,
+ 86, 1265, 1266, 1269, 1268, 1264, 1270, 86, 1274, 3645,
+ 86, 3645, 86, 86, 1271, 86, 1272, 1260, 1275, 1273,
+ 1276, 1263, 1277, 3645, 3645, 3645, 1267, 1278, 86, 1266,
+
+ 1269, 1268, 1293, 1270, 86, 1274, 86, 86, 86, 86,
+ 86, 1271, 1279, 1272, 1280, 1287, 1273, 1285, 1281, 1277,
+ 86, 1286, 86, 1282, 1278, 86, 86, 1283, 86, 86,
+ 1284, 1288, 1289, 1291, 86, 3645, 1295, 1290, 86, 1279,
+ 1292, 1280, 1287, 86, 1285, 86, 86, 86, 1286, 1294,
+ 86, 1296, 86, 86, 1283, 1297, 86, 1284, 1288, 1289,
+ 1291, 1298, 1300, 86, 1290, 1299, 1301, 1292, 86, 1304,
+ 3645, 3645, 86, 1302, 86, 1303, 1294, 86, 1296, 1306,
+ 86, 1305, 1297, 1307, 1312, 1313, 86, 1310, 1298, 1300,
+ 1309, 86, 1299, 1301, 1308, 86, 1304, 86, 86, 86,
+
+ 1302, 86, 1303, 1311, 1314, 86, 1306, 1317, 1305, 86,
+ 1307, 86, 86, 1316, 1310, 1319, 86, 1309, 1315, 1318,
+ 1321, 1308, 86, 86, 86, 1320, 1323, 86, 86, 1322,
+ 1311, 1314, 86, 86, 1317, 1324, 1325, 86, 1326, 1327,
+ 1316, 1328, 1319, 86, 86, 1315, 1318, 1321, 1329, 1330,
+ 1331, 1334, 1320, 1332, 3645, 1336, 1322, 1333, 86, 3645,
+ 86, 86, 86, 1335, 86, 1326, 1327, 86, 86, 1337,
+ 86, 1338, 86, 86, 3645, 1329, 3645, 1331, 1339, 1340,
+ 1332, 86, 86, 86, 1333, 86, 1341, 86, 86, 86,
+ 1335, 1342, 1343, 1344, 86, 1345, 1337, 1347, 1338, 1346,
+
+ 86, 1349, 1348, 1350, 1353, 1339, 1340, 3645, 86, 86,
+ 86, 1351, 86, 1341, 1352, 86, 86, 86, 1342, 1343,
+ 1344, 1355, 1345, 86, 1347, 1360, 1346, 1356, 1357, 1348,
+ 1359, 86, 1354, 86, 86, 86, 86, 86, 1351, 86,
+ 86, 1352, 86, 86, 1362, 1361, 86, 1364, 1355, 1365,
+ 1363, 1366, 1360, 86, 1356, 1357, 1368, 1359, 86, 1354,
+ 1367, 1374, 1369, 170, 1372, 1371, 1373, 1370, 86, 1376,
+ 1377, 1362, 1361, 86, 86, 86, 1365, 1363, 1366, 86,
+ 86, 1379, 86, 1368, 86, 1378, 86, 1367, 86, 1369,
+ 1375, 1372, 1371, 1373, 1370, 1380, 86, 86, 1382, 1381,
+
+ 1383, 86, 86, 86, 1385, 3645, 1384, 1386, 1379, 1387,
+ 1390, 86, 1378, 86, 1392, 86, 86, 1375, 1388, 1394,
+ 86, 86, 1380, 86, 1389, 1382, 1381, 1383, 86, 86,
+ 86, 1385, 86, 1384, 1386, 1391, 1387, 86, 1393, 3645,
+ 86, 1392, 1395, 3645, 1396, 1388, 1394, 1400, 86, 86,
+ 86, 1389, 1401, 1397, 1402, 1398, 1403, 1404, 1399, 1405,
+ 3645, 3645, 1391, 1406, 1408, 1393, 86, 1407, 3645, 1395,
+ 86, 1396, 86, 86, 1400, 86, 86, 86, 86, 1401,
+ 1397, 1402, 1398, 86, 1404, 1399, 1405, 86, 1409, 1410,
+ 1406, 1408, 1411, 1412, 1407, 1413, 1414, 1415, 1416, 1417,
+
+ 86, 1418, 3645, 3645, 3645, 1438, 86, 86, 86, 1419,
+ 86, 86, 1420, 1422, 86, 1409, 1410, 3645, 86, 1411,
+ 1412, 1423, 1421, 1414, 1415, 1416, 1417, 86, 86, 86,
+ 1425, 86, 1424, 1426, 86, 86, 1419, 86, 1427, 1420,
+ 1422, 1430, 86, 1428, 86, 86, 86, 1432, 1423, 1421,
+ 86, 1431, 1429, 86, 1441, 1433, 1436, 1425, 1434, 1424,
+ 1426, 1437, 86, 86, 86, 1427, 1435, 86, 1430, 1439,
+ 1428, 86, 86, 86, 1432, 86, 86, 86, 1431, 1429,
+ 1440, 1441, 1433, 1436, 1443, 1434, 1442, 86, 1437, 1444,
+ 1447, 1445, 86, 1435, 1448, 1446, 1439, 86, 86, 86,
+
+ 1450, 1449, 86, 1451, 86, 3645, 1452, 1440, 86, 1455,
+ 1453, 1443, 1456, 1442, 1454, 86, 1444, 1447, 1445, 86,
+ 86, 86, 1446, 1457, 3645, 1473, 86, 1463, 1449, 86,
+ 1451, 1461, 86, 1452, 86, 1458, 1455, 1453, 86, 1456,
+ 1459, 1454, 1462, 1460, 86, 1471, 1472, 1476, 1477, 1491,
+ 1457, 86, 1487, 86, 1463, 1474, 86, 86, 1461, 86,
+ 1493, 1480, 86, 1475, 86, 86, 3645, 86, 1536, 1462,
+ 1460, 1464, 1471, 1472, 1476, 1465, 1491, 1478, 1466, 1467,
+ 86, 86, 1474, 1468, 86, 86, 1479, 86, 1480, 1469,
+ 1475, 1482, 86, 1470, 1481, 86, 3645, 86, 1464, 86,
+
+ 86, 1483, 1465, 1484, 1478, 1466, 1467, 1485, 86, 1488,
+ 1468, 1490, 1489, 1479, 86, 1486, 1469, 86, 1482, 86,
+ 1470, 1481, 1492, 1494, 86, 86, 1495, 86, 1483, 1496,
+ 1484, 86, 1497, 86, 1485, 1503, 1488, 1504, 1490, 1489,
+ 3645, 3645, 1486, 1506, 1507, 3645, 86, 1505, 86, 1492,
+ 86, 3645, 86, 1495, 1508, 86, 1496, 86, 3645, 1497,
+ 1498, 1509, 1503, 1510, 1504, 1499, 3645, 1500, 1512, 1501,
+ 86, 1502, 86, 86, 1505, 86, 1511, 86, 86, 1513,
+ 1514, 1508, 1516, 86, 86, 1515, 1517, 1498, 1509, 1518,
+ 1510, 86, 1499, 1524, 1500, 1512, 1501, 86, 1502, 1520,
+
+ 86, 1519, 1521, 1511, 1525, 1523, 1513, 1522, 1526, 1516,
+ 86, 86, 86, 1517, 86, 86, 1518, 86, 86, 1527,
+ 1528, 1529, 1531, 86, 1530, 86, 1520, 1538, 1519, 1521,
+ 86, 1525, 1523, 86, 1522, 1526, 1532, 86, 86, 1535,
+ 86, 1533, 1534, 86, 86, 1537, 1527, 1528, 1529, 1531,
+ 86, 1530, 1539, 1541, 86, 3645, 86, 86, 1540, 1542,
+ 1543, 86, 1544, 1532, 1545, 1546, 1535, 86, 1533, 1534,
+ 1547, 86, 1537, 1548, 1552, 86, 1553, 86, 86, 1539,
+ 1541, 1557, 86, 86, 1549, 1540, 1542, 1543, 1550, 86,
+ 86, 1545, 86, 1551, 86, 86, 86, 1547, 1554, 86,
+
+ 1548, 86, 1555, 1553, 1559, 1556, 1558, 3645, 86, 1560,
+ 1561, 1549, 86, 86, 1562, 1550, 3645, 1565, 1563, 86,
+ 1551, 1564, 86, 1568, 1567, 1554, 86, 1566, 86, 1555,
+ 86, 1559, 1556, 1558, 86, 86, 1560, 1561, 86, 86,
+ 86, 1562, 86, 1569, 1565, 1563, 86, 1570, 1564, 1574,
+ 1568, 1567, 1572, 1571, 1566, 1573, 1578, 1579, 86, 1577,
+ 1575, 1582, 3645, 1576, 3645, 86, 3645, 3645, 1586, 1580,
+ 1569, 86, 1581, 86, 1570, 86, 1574, 86, 86, 1572,
+ 1571, 86, 1573, 86, 1583, 1585, 1577, 1575, 86, 86,
+ 1576, 86, 1584, 86, 86, 86, 1580, 1587, 1588, 1581,
+
+ 86, 86, 86, 1591, 86, 1589, 1590, 1594, 1596, 1592,
+ 1595, 1583, 1585, 1593, 86, 170, 86, 86, 1597, 1584,
+ 86, 1598, 3645, 86, 1587, 1588, 1602, 1599, 3645, 86,
+ 1591, 1600, 1589, 1590, 86, 1596, 1592, 1601, 86, 86,
+ 1593, 86, 86, 1603, 86, 1605, 1604, 1607, 1598, 86,
+ 86, 1608, 1606, 1602, 1599, 86, 86, 1610, 1600, 86,
+ 86, 1609, 1611, 1612, 1601, 3645, 86, 1613, 1616, 1617,
+ 1603, 86, 1605, 1604, 1607, 86, 1614, 86, 1608, 1606,
+ 1618, 1615, 1628, 86, 86, 86, 1620, 86, 1609, 1611,
+ 1612, 1619, 1625, 1629, 1613, 1616, 1617, 1621, 86, 86,
+
+ 1622, 1626, 1627, 1623, 86, 1630, 1624, 1618, 86, 86,
+ 86, 3645, 1631, 1620, 86, 86, 86, 1632, 1619, 1625,
+ 1629, 86, 3645, 1633, 1621, 86, 86, 1622, 1626, 1627,
+ 1623, 86, 1630, 1624, 1634, 86, 1635, 1636, 1637, 1639,
+ 1638, 3645, 1640, 1643, 86, 86, 1641, 1642, 86, 86,
+ 1633, 1646, 1647, 3645, 86, 1650, 86, 3645, 3645, 86,
+ 86, 1634, 86, 1635, 1636, 1637, 1639, 1638, 86, 1640,
+ 1643, 1644, 1645, 1641, 1642, 86, 1648, 86, 1646, 1647,
+ 86, 86, 1649, 1652, 1653, 86, 1651, 86, 1655, 1654,
+ 86, 3645, 86, 1656, 86, 1658, 1657, 1660, 1644, 1645,
+
+ 86, 86, 86, 1648, 86, 86, 1659, 1663, 1662, 1649,
+ 1652, 1653, 1661, 1651, 86, 1655, 1654, 86, 1664, 86,
+ 1656, 86, 1658, 1657, 1660, 86, 86, 1668, 1665, 1666,
+ 1667, 1669, 1670, 1659, 1663, 1662, 3645, 86, 1671, 1661,
+ 86, 1672, 1673, 3645, 86, 1664, 1676, 86, 1675, 1674,
+ 1677, 86, 86, 86, 1668, 1665, 1666, 1667, 1678, 86,
+ 1679, 1680, 1681, 86, 86, 1671, 3645, 86, 1672, 86,
+ 86, 1685, 86, 1676, 1688, 1675, 1674, 1677, 1682, 1686,
+ 1689, 1690, 1687, 86, 1691, 3645, 1693, 3645, 86, 1681,
+ 86, 3645, 86, 86, 86, 86, 86, 1683, 86, 1684,
+
+ 86, 1688, 86, 1692, 86, 1682, 1686, 1689, 1690, 1687,
+ 1694, 1691, 86, 1693, 1695, 1697, 1696, 86, 1704, 1698,
+ 1699, 3645, 3645, 86, 1683, 1700, 1684, 86, 86, 1701,
+ 1692, 1707, 1703, 86, 1702, 1708, 1712, 1694, 86, 86,
+ 1705, 1695, 1697, 1696, 86, 1704, 1698, 1706, 86, 86,
+ 1713, 3645, 86, 1710, 1711, 86, 1709, 86, 1707, 1703,
+ 86, 86, 1708, 86, 86, 1716, 1714, 1705, 86, 1715,
+ 86, 1717, 86, 86, 1706, 1719, 1720, 1713, 1718, 86,
+ 1710, 1711, 1721, 1709, 86, 1726, 1722, 1723, 1725, 3645,
+ 86, 86, 1724, 1714, 86, 86, 1715, 86, 1717, 86,
+
+ 86, 86, 1728, 1720, 1727, 1718, 1729, 86, 1732, 1721,
+ 1730, 1733, 1726, 1722, 1723, 1725, 86, 1731, 86, 1724,
+ 1734, 1735, 1736, 86, 1738, 86, 1737, 1740, 86, 1728,
+ 86, 1727, 1739, 1729, 3645, 1732, 86, 1730, 86, 1745,
+ 86, 86, 1751, 86, 1731, 86, 1744, 86, 1735, 1736,
+ 86, 1738, 1741, 1737, 1740, 86, 1742, 1747, 1746, 1739,
+ 1748, 86, 1749, 3645, 86, 1754, 1745, 1753, 1750, 1743,
+ 86, 86, 1762, 1744, 86, 1756, 1752, 86, 1755, 1741,
+ 3645, 86, 3645, 1742, 1747, 1746, 1757, 1748, 86, 86,
+ 86, 1763, 1758, 1760, 1753, 1750, 1743, 86, 86, 86,
+
+ 86, 1759, 1756, 1752, 86, 1755, 1764, 1761, 1766, 86,
+ 86, 86, 1767, 1757, 86, 86, 1765, 1768, 86, 1758,
+ 1760, 1770, 86, 1771, 1769, 1772, 1773, 3645, 1759, 1774,
+ 86, 86, 3645, 1764, 1761, 1766, 1776, 86, 86, 1767,
+ 86, 1779, 3645, 1765, 1775, 3645, 1781, 86, 86, 86,
+ 1771, 1769, 86, 1773, 1778, 86, 1774, 1785, 1777, 86,
+ 86, 86, 1780, 1776, 86, 1782, 1784, 1786, 1779, 86,
+ 1783, 1775, 86, 1781, 86, 1787, 86, 86, 1788, 86,
+ 86, 1778, 1789, 3645, 1785, 1777, 1790, 1791, 1792, 1780,
+ 86, 1793, 1782, 1784, 1786, 86, 1794, 1783, 86, 86,
+
+ 86, 1796, 1797, 1795, 86, 1788, 1799, 86, 1798, 1789,
+ 86, 1800, 1801, 1790, 1791, 1792, 86, 1802, 1793, 86,
+ 86, 1803, 86, 1794, 86, 1805, 86, 1806, 1796, 1797,
+ 1795, 1808, 1804, 86, 86, 1798, 1809, 1807, 1800, 1801,
+ 86, 86, 1810, 86, 1802, 86, 1811, 1814, 1803, 1812,
+ 86, 1813, 1805, 86, 1806, 1815, 86, 1818, 1808, 1804,
+ 86, 1821, 170, 86, 1807, 1819, 86, 86, 86, 1810,
+ 86, 86, 1820, 1811, 1814, 1824, 1812, 1825, 1813, 1816,
+ 1817, 1826, 1815, 86, 1818, 1828, 1822, 86, 1821, 1823,
+ 1827, 1830, 1819, 86, 1831, 86, 86, 86, 86, 1820,
+
+ 1829, 86, 86, 86, 1825, 1832, 1816, 1817, 1826, 1834,
+ 86, 1833, 1828, 1822, 1836, 3645, 1823, 1827, 1835, 1841,
+ 1837, 1831, 86, 86, 86, 1838, 86, 1829, 86, 1839,
+ 3645, 1840, 86, 1845, 1842, 86, 86, 86, 1833, 1843,
+ 1844, 1836, 86, 86, 1846, 1835, 1841, 1837, 1847, 1852,
+ 1853, 86, 1838, 86, 3645, 86, 1839, 86, 1840, 86,
+ 1845, 1842, 1848, 86, 86, 3645, 1843, 1844, 1854, 86,
+ 1849, 1846, 86, 1850, 1860, 1847, 1857, 1853, 1856, 3645,
+ 1858, 86, 86, 1862, 1855, 1851, 1859, 1861, 1863, 1848,
+ 86, 1865, 86, 1867, 86, 1854, 86, 1849, 86, 1864,
+
+ 1850, 86, 1866, 1857, 3645, 1856, 1874, 1858, 1868, 1869,
+ 86, 1855, 1851, 1859, 1861, 86, 1871, 86, 1865, 1875,
+ 86, 86, 1870, 86, 86, 86, 1864, 1872, 86, 1866,
+ 86, 86, 1873, 1876, 86, 1868, 1869, 1878, 86, 1877,
+ 1879, 1880, 3645, 1871, 86, 1881, 1883, 3645, 1882, 1870,
+ 1884, 86, 1885, 3645, 1872, 86, 86, 86, 1895, 1873,
+ 86, 86, 1899, 86, 1886, 86, 1877, 1879, 1880, 86,
+ 86, 86, 86, 1883, 1887, 1882, 1888, 1884, 86, 1885,
+ 1889, 1890, 1891, 1892, 86, 1895, 1893, 86, 1894, 86,
+ 86, 1886, 3645, 86, 86, 1906, 86, 1896, 1900, 1897,
+
+ 3645, 1887, 1898, 1888, 3645, 86, 86, 1889, 1890, 1891,
+ 1892, 86, 86, 1893, 86, 1894, 86, 1901, 1903, 1904,
+ 1902, 86, 1906, 1907, 1896, 1900, 1897, 86, 86, 1898,
+ 1908, 86, 1909, 1910, 1911, 3645, 1912, 1905, 1914, 86,
+ 1913, 86, 1927, 86, 1901, 1903, 1904, 1902, 3645, 86,
+ 1907, 86, 86, 1915, 1917, 86, 86, 86, 1918, 1909,
+ 1910, 1911, 86, 1912, 1905, 1914, 1916, 1913, 1919, 86,
+ 86, 1920, 86, 1922, 1921, 86, 1928, 1925, 1923, 86,
+ 1915, 1917, 1926, 1924, 86, 1918, 1932, 1929, 86, 86,
+ 86, 1931, 3645, 1916, 1935, 1919, 1946, 1933, 1920, 1930,
+
+ 1922, 1921, 86, 86, 1925, 1923, 86, 1936, 86, 1926,
+ 1924, 86, 1934, 86, 1929, 86, 86, 1938, 1931, 1937,
+ 86, 1935, 1939, 86, 1933, 86, 1930, 1940, 1941, 1942,
+ 1944, 86, 1943, 86, 1936, 1945, 86, 1949, 1947, 1934,
+ 3645, 86, 3645, 1948, 1938, 86, 1937, 86, 86, 1939,
+ 86, 86, 1950, 1951, 1940, 1941, 1942, 1944, 86, 1943,
+ 1952, 86, 1955, 1953, 1949, 1947, 86, 86, 1954, 1958,
+ 1948, 86, 1957, 1956, 86, 1959, 1962, 3645, 86, 1950,
+ 1951, 1960, 1961, 3645, 86, 3645, 1963, 1952, 86, 1955,
+ 1964, 3645, 1965, 86, 86, 86, 1958, 1980, 1969, 1957,
+
+ 1956, 86, 1959, 1962, 1967, 86, 1966, 1968, 1960, 1961,
+ 1971, 1983, 86, 1963, 1970, 1972, 86, 1964, 86, 1965,
+ 86, 1973, 86, 86, 86, 1969, 1974, 1975, 1978, 86,
+ 1977, 1967, 1976, 1966, 1968, 86, 1979, 1971, 1981, 1982,
+ 86, 1970, 1972, 86, 86, 1984, 1986, 86, 1985, 86,
+ 86, 1990, 1987, 86, 1975, 1978, 3645, 1977, 1989, 1976,
+ 1991, 86, 1988, 1979, 1992, 1981, 86, 86, 1994, 86,
+ 1993, 86, 1984, 86, 86, 1985, 1995, 1999, 86, 1987,
+ 2000, 2001, 1996, 86, 1997, 1989, 1998, 1991, 86, 1988,
+ 86, 1992, 86, 3645, 86, 86, 86, 1993, 2002, 86,
+
+ 86, 2003, 86, 1995, 1999, 2005, 2004, 2000, 2001, 1996,
+ 2006, 1997, 86, 1998, 2007, 2009, 2010, 2012, 86, 86,
+ 86, 3645, 2011, 86, 2013, 2002, 2017, 2014, 2003, 2015,
+ 3645, 86, 2005, 2004, 86, 2008, 2019, 2006, 86, 2023,
+ 2020, 86, 2016, 2018, 2012, 86, 86, 86, 86, 2011,
+ 86, 86, 2021, 86, 2014, 2022, 2015, 86, 2024, 2026,
+ 2025, 2032, 2008, 86, 86, 86, 86, 2020, 86, 2016,
+ 2018, 2027, 2028, 2029, 2030, 2033, 2031, 86, 86, 2021,
+ 86, 86, 2022, 86, 2034, 2024, 2026, 2025, 2032, 2035,
+ 2037, 2039, 86, 86, 86, 86, 2041, 2036, 2027, 2028,
+
+ 2029, 2030, 2033, 2031, 170, 2038, 86, 2040, 86, 86,
+ 2043, 2034, 2042, 86, 2044, 86, 2035, 86, 2039, 2046,
+ 2045, 2047, 2048, 86, 2036, 86, 2052, 86, 86, 86,
+ 86, 2050, 2038, 2053, 2040, 86, 2049, 2043, 2051, 2042,
+ 86, 2044, 2054, 2056, 2055, 2057, 2046, 2045, 2047, 2058,
+ 3645, 86, 2059, 86, 86, 2060, 3645, 86, 2050, 86,
+ 2053, 86, 2061, 2049, 2080, 2051, 86, 86, 2062, 86,
+ 2056, 2055, 2064, 2063, 2065, 86, 86, 86, 86, 2059,
+ 86, 86, 2060, 86, 2066, 2067, 86, 2068, 2069, 2061,
+ 2070, 2071, 2079, 3645, 3645, 2062, 86, 2074, 2077, 2064,
+
+ 2063, 2065, 86, 86, 86, 86, 86, 86, 2072, 2075,
+ 2078, 2066, 2067, 86, 2068, 2069, 2076, 2070, 2071, 86,
+ 86, 2073, 86, 2081, 2074, 2077, 86, 2082, 2085, 86,
+ 3645, 86, 2083, 2084, 2091, 2072, 2075, 2078, 86, 86,
+ 86, 86, 2086, 2076, 2088, 2087, 2089, 2092, 2073, 86,
+ 2081, 2090, 2094, 2099, 2082, 2085, 2093, 86, 2095, 2083,
+ 2084, 86, 2096, 86, 2100, 2101, 2102, 2103, 86, 2086,
+ 86, 2088, 2087, 2089, 86, 2097, 2098, 86, 2090, 86,
+ 86, 86, 86, 2093, 86, 2095, 2104, 86, 2105, 2096,
+ 86, 2100, 2106, 2102, 2107, 86, 86, 86, 2108, 86,
+
+ 2109, 2110, 2097, 2098, 2111, 2112, 2113, 2115, 86, 2114,
+ 2119, 3645, 3645, 2104, 86, 86, 2116, 2118, 86, 2106,
+ 86, 2107, 86, 2117, 2127, 2108, 86, 86, 2110, 86,
+ 2124, 2111, 86, 2113, 2115, 2132, 2114, 86, 86, 86,
+ 2133, 2126, 86, 2116, 2118, 2120, 2121, 2122, 86, 86,
+ 2117, 2128, 2123, 2125, 2129, 2130, 86, 2124, 86, 2135,
+ 86, 86, 86, 2131, 2134, 2139, 2140, 86, 2126, 2136,
+ 3645, 86, 2120, 2121, 2122, 86, 2137, 86, 2128, 2123,
+ 2125, 2129, 2130, 2138, 86, 86, 2135, 2143, 2144, 86,
+ 2131, 2134, 86, 2140, 86, 86, 2136, 86, 2141, 2149,
+
+ 2142, 2156, 2145, 2137, 2146, 86, 86, 2147, 3645, 2148,
+ 2138, 86, 86, 2150, 86, 2144, 2151, 2152, 2155, 86,
+ 86, 2153, 3645, 2154, 86, 2141, 86, 2142, 86, 2145,
+ 2158, 2146, 3645, 86, 2147, 86, 2148, 2162, 2157, 86,
+ 2150, 86, 2160, 86, 2152, 2155, 2159, 2161, 2153, 86,
+ 2154, 2164, 86, 2168, 86, 86, 2167, 86, 2163, 86,
+ 2165, 86, 2169, 2170, 2162, 2157, 2171, 86, 2166, 2160,
+ 86, 2172, 2173, 2159, 2161, 86, 3645, 86, 2164, 86,
+ 2168, 2174, 2175, 2176, 2177, 2163, 86, 2165, 86, 86,
+ 2170, 2178, 2179, 2171, 86, 2166, 2182, 86, 2180, 2173,
+
+ 2184, 2183, 3645, 86, 86, 86, 86, 2181, 2174, 86,
+ 86, 2177, 2185, 2188, 86, 86, 86, 2187, 2178, 2179,
+ 86, 86, 2189, 2182, 86, 2180, 2190, 2184, 2183, 2186,
+ 86, 2194, 2192, 86, 2181, 2191, 2195, 3645, 86, 2185,
+ 2197, 86, 2196, 86, 2187, 86, 2198, 86, 2193, 86,
+ 2218, 2204, 2199, 2190, 86, 86, 2186, 2202, 2194, 2192,
+ 86, 2203, 2191, 2195, 86, 2200, 2201, 86, 2205, 2196,
+ 2206, 2207, 86, 2198, 86, 2193, 2210, 86, 2204, 2199,
+ 86, 3645, 86, 2211, 2202, 2208, 86, 86, 2203, 86,
+ 2209, 2212, 2200, 2201, 86, 2205, 2219, 86, 2207, 2213,
+
+ 2214, 86, 2215, 86, 86, 86, 2216, 86, 2217, 86,
+ 2211, 2222, 2208, 86, 2221, 86, 2220, 2209, 2212, 2223,
+ 2235, 2224, 86, 2219, 2226, 86, 2213, 2214, 86, 2215,
+ 2225, 2231, 2230, 2216, 2227, 2217, 86, 2229, 2222, 2228,
+ 2232, 2221, 86, 2220, 86, 2236, 86, 86, 2224, 2238,
+ 86, 2226, 86, 86, 86, 2233, 2240, 2225, 86, 2230,
+ 2234, 2227, 2237, 86, 2229, 2239, 2228, 86, 2241, 2243,
+ 2242, 86, 2244, 2245, 2246, 86, 2238, 86, 2248, 3645,
+ 86, 2247, 2249, 86, 86, 2252, 86, 86, 86, 2237,
+ 2253, 2256, 2239, 86, 2250, 2241, 2243, 2242, 86, 2244,
+
+ 2245, 2254, 86, 2257, 2251, 86, 86, 170, 2247, 86,
+ 86, 86, 2252, 86, 2255, 2259, 86, 2253, 2256, 2258,
+ 2260, 2250, 86, 2262, 3645, 2261, 2264, 86, 2254, 2263,
+ 2257, 2251, 86, 2265, 2269, 2268, 2267, 3645, 2270, 2266,
+ 3645, 2255, 86, 2274, 3645, 86, 2258, 86, 86, 86,
+ 86, 2273, 2261, 2264, 86, 86, 2263, 86, 86, 86,
+ 2265, 2269, 2268, 2267, 86, 2270, 2266, 2271, 2272, 2275,
+ 86, 2276, 2279, 86, 2280, 2277, 2278, 2286, 2273, 2282,
+ 2287, 86, 86, 86, 2283, 2284, 2281, 86, 86, 86,
+ 3645, 2303, 86, 86, 2271, 2272, 2275, 86, 2276, 86,
+
+ 86, 2280, 2277, 2278, 86, 2285, 2282, 2287, 86, 86,
+ 2288, 2283, 2284, 2281, 2289, 2293, 2290, 2294, 86, 2291,
+ 2295, 3645, 2297, 86, 86, 3645, 2296, 86, 86, 86,
+ 2292, 2304, 2285, 86, 2298, 86, 2299, 2288, 86, 3645,
+ 2301, 2289, 2293, 2290, 2294, 86, 2291, 2295, 86, 2297,
+ 2300, 86, 86, 2296, 2302, 86, 86, 2292, 2304, 2305,
+ 2306, 2298, 86, 2299, 2307, 2310, 2308, 2301, 86, 2309,
+ 86, 86, 2312, 2311, 3645, 86, 2313, 2300, 86, 2314,
+ 2315, 2302, 86, 86, 2317, 2316, 2305, 2306, 86, 2318,
+ 2319, 2307, 2320, 2308, 86, 2321, 2309, 86, 86, 2312,
+
+ 2311, 86, 2323, 2313, 86, 2322, 2314, 86, 2326, 2324,
+ 2330, 86, 2316, 86, 86, 86, 2318, 2319, 86, 2320,
+ 2329, 2325, 86, 2327, 2331, 86, 86, 86, 86, 2323,
+ 2332, 2328, 2322, 2336, 86, 2326, 2324, 2330, 2333, 86,
+ 2334, 86, 86, 2335, 2346, 86, 3645, 2329, 2325, 86,
+ 2327, 2331, 2339, 86, 2337, 2343, 86, 2332, 2328, 2338,
+ 2336, 86, 86, 2345, 2340, 2333, 2347, 2334, 2341, 2344,
+ 2335, 86, 2350, 86, 2349, 86, 2348, 2351, 86, 2339,
+ 2352, 2342, 2343, 86, 86, 2353, 86, 2355, 2354, 86,
+ 2345, 2340, 2361, 2347, 86, 2341, 2344, 86, 86, 2350,
+
+ 2356, 2349, 86, 2348, 2351, 2357, 2359, 2352, 2342, 86,
+ 86, 2360, 2353, 2358, 2355, 2354, 2364, 86, 2363, 2361,
+ 86, 2362, 86, 86, 86, 2366, 86, 2356, 2369, 86,
+ 2372, 2365, 2357, 2359, 2367, 86, 3645, 2368, 2360, 86,
+ 2358, 86, 2373, 2364, 86, 2370, 2371, 2374, 2362, 2375,
+ 86, 86, 86, 86, 86, 2369, 2376, 2372, 2365, 86,
+ 2378, 2367, 2377, 2381, 2368, 2379, 3645, 86, 86, 2373,
+ 2380, 2382, 2370, 2371, 2374, 86, 86, 2384, 86, 86,
+ 2383, 86, 86, 2376, 2385, 2390, 2386, 2378, 2388, 2377,
+ 2381, 3645, 86, 86, 2387, 2389, 2391, 86, 2382, 2392,
+
+ 86, 2394, 86, 2396, 2384, 2393, 3645, 2383, 2398, 2395,
+ 86, 86, 86, 2386, 86, 2388, 2397, 86, 86, 2399,
+ 86, 2387, 2389, 2391, 86, 2403, 2392, 2401, 2394, 2400,
+ 86, 86, 2393, 2402, 86, 2398, 2395, 2404, 2406, 3645,
+ 2405, 2411, 86, 2397, 2407, 86, 2399, 86, 86, 86,
+ 86, 2410, 2403, 2408, 2401, 86, 2400, 2412, 2409, 86,
+ 2402, 2413, 2418, 86, 2404, 2406, 86, 2405, 2411, 2414,
+ 2415, 2407, 86, 2416, 2417, 2419, 86, 2420, 2410, 3645,
+ 86, 86, 2423, 3645, 2412, 86, 86, 86, 2413, 2418,
+ 2421, 86, 86, 86, 2422, 2425, 2414, 2415, 2426, 86,
+
+ 2416, 2417, 86, 86, 2420, 2424, 2427, 86, 86, 2423,
+ 86, 2428, 2429, 2430, 2431, 2432, 2433, 2421, 3645, 2438,
+ 86, 2422, 2425, 86, 3645, 2426, 86, 86, 86, 2437,
+ 3645, 3645, 2424, 2427, 86, 2434, 86, 86, 2428, 2429,
+ 2430, 2431, 2432, 2433, 86, 2435, 2438, 2439, 2440, 2441,
+ 86, 86, 2442, 2443, 2445, 2444, 2437, 86, 2436, 86,
+ 2446, 2448, 2434, 2447, 2449, 3645, 86, 2452, 3645, 86,
+ 86, 86, 2435, 86, 2439, 2440, 2441, 2456, 2450, 2442,
+ 86, 86, 2444, 2457, 86, 2436, 86, 2446, 2448, 2451,
+ 2447, 2449, 86, 2453, 2458, 2454, 2461, 86, 170, 86,
+
+ 2455, 2460, 2466, 2459, 2468, 2450, 2467, 2465, 86, 86,
+ 2462, 2470, 3645, 2472, 2473, 86, 2451, 2469, 86, 86,
+ 2453, 2458, 86, 86, 2463, 86, 86, 86, 2460, 86,
+ 2459, 2468, 86, 2467, 2465, 2464, 86, 2462, 2471, 86,
+ 2472, 86, 2474, 86, 2469, 2475, 2477, 2476, 2478, 2479,
+ 3645, 2463, 2480, 86, 86, 2482, 86, 2486, 2481, 86,
+ 86, 2484, 2464, 2485, 86, 2471, 2483, 3645, 86, 2474,
+ 86, 86, 86, 2477, 2476, 2478, 2479, 86, 86, 2480,
+ 86, 2488, 2482, 86, 2486, 2481, 2489, 2487, 2484, 2490,
+ 2485, 86, 2491, 2483, 86, 2492, 2493, 2494, 2495, 86,
+
+ 2496, 2502, 2497, 86, 2498, 3645, 86, 86, 2488, 86,
+ 2499, 3645, 86, 2489, 2487, 86, 86, 86, 86, 2491,
+ 2500, 2501, 2492, 2493, 2494, 2495, 2503, 2496, 86, 2497,
+ 86, 2498, 86, 2504, 86, 2505, 2506, 2499, 2507, 2511,
+ 2513, 86, 86, 86, 86, 86, 2508, 2500, 2501, 86,
+ 2509, 2510, 2514, 2503, 86, 2512, 2515, 86, 86, 2518,
+ 2504, 86, 2505, 2506, 86, 2507, 2511, 2516, 2517, 2519,
+ 86, 2520, 86, 2508, 2523, 2521, 86, 2509, 2510, 2514,
+ 86, 2522, 2512, 2515, 86, 2526, 2518, 2524, 86, 86,
+ 86, 2525, 3645, 2527, 2516, 2517, 2519, 86, 86, 86,
+
+ 2528, 2523, 2521, 2529, 86, 86, 2530, 2536, 2522, 2531,
+ 2532, 2533, 2526, 2534, 2524, 2537, 2535, 3645, 2525, 86,
+ 2527, 86, 86, 2538, 2541, 86, 2539, 86, 86, 2540,
+ 2529, 2542, 2543, 86, 86, 2544, 2531, 2532, 2533, 86,
+ 2534, 86, 2537, 2535, 86, 2545, 2547, 2548, 2546, 86,
+ 2538, 86, 86, 2539, 86, 86, 2540, 86, 86, 2543,
+ 2549, 86, 2544, 2550, 2551, 2553, 2554, 2552, 2556, 2557,
+ 2558, 86, 2545, 2547, 86, 2546, 86, 2555, 86, 2560,
+ 2559, 3645, 2564, 86, 3645, 2566, 2580, 86, 2561, 86,
+ 2550, 86, 86, 2554, 2552, 86, 86, 2558, 86, 86,
+
+ 2562, 86, 2563, 2565, 2555, 2567, 2560, 2559, 86, 86,
+ 2569, 86, 86, 2568, 86, 2561, 2573, 2570, 86, 2571,
+ 2574, 2575, 3645, 3645, 86, 2576, 2577, 2562, 86, 2563,
+ 2565, 86, 2567, 86, 2572, 86, 2579, 2569, 86, 2585,
+ 2568, 86, 2582, 86, 2570, 86, 2571, 2574, 2575, 2578,
+ 86, 2581, 2576, 2577, 86, 2583, 2584, 86, 86, 86,
+ 2586, 2572, 86, 86, 2587, 2589, 2585, 2588, 86, 2582,
+ 2591, 2594, 86, 2590, 2592, 2593, 2578, 86, 2581, 2595,
+ 3645, 86, 2583, 2584, 86, 86, 2599, 86, 86, 86,
+ 2596, 2587, 2589, 2597, 2588, 86, 2600, 86, 2594, 86,
+
+ 2590, 2592, 2593, 2598, 86, 86, 2595, 2601, 2605, 2602,
+ 2606, 3645, 86, 2599, 86, 2618, 2607, 2596, 3645, 2608,
+ 2597, 2610, 2611, 2600, 2603, 86, 2604, 2609, 86, 86,
+ 2598, 2619, 86, 86, 2601, 86, 2602, 2606, 86, 2612,
+ 86, 86, 2614, 2607, 2613, 86, 2608, 86, 2610, 2611,
+ 2615, 2603, 2616, 2604, 2609, 2617, 2620, 2622, 2621, 2623,
+ 3645, 86, 86, 86, 86, 2624, 2612, 86, 3645, 2614,
+ 86, 2613, 86, 2625, 86, 86, 2626, 2615, 2627, 2616,
+ 2629, 86, 2617, 2620, 2628, 2621, 2623, 86, 2630, 86,
+ 86, 86, 2624, 2634, 2631, 2632, 2633, 2635, 86, 3645,
+
+ 2625, 2636, 86, 2626, 2640, 2627, 86, 2629, 2641, 86,
+ 2637, 2628, 86, 86, 2639, 2630, 2644, 86, 2645, 2638,
+ 2646, 2631, 2632, 2633, 86, 86, 86, 2642, 2636, 86,
+ 86, 2640, 86, 2651, 86, 2643, 3645, 2637, 2649, 2652,
+ 86, 2639, 170, 2644, 86, 2645, 2638, 2646, 2647, 86,
+ 2648, 86, 2650, 86, 2642, 86, 2653, 2654, 2655, 2656,
+ 86, 2657, 2643, 86, 3645, 2649, 2652, 2658, 2659, 86,
+ 2662, 86, 86, 2660, 86, 2647, 86, 2648, 2661, 2650,
+ 86, 2663, 2664, 2653, 2654, 2655, 2656, 2665, 2657, 2667,
+ 86, 86, 2668, 86, 2658, 2659, 2666, 86, 2669, 2670,
+
+ 2660, 2672, 2671, 2677, 2673, 2661, 2676, 86, 2663, 86,
+ 3645, 86, 2675, 2681, 2665, 86, 86, 2674, 86, 86,
+ 86, 86, 2680, 2666, 86, 2669, 86, 86, 2672, 2671,
+ 86, 2673, 86, 2676, 2678, 86, 2679, 86, 2682, 2675,
+ 2681, 3645, 2683, 3645, 2674, 86, 2684, 86, 2685, 2680,
+ 2687, 2688, 2686, 2689, 3645, 3645, 3645, 86, 86, 2691,
+ 2692, 2678, 2690, 2679, 86, 86, 86, 86, 86, 2683,
+ 86, 2696, 2695, 2684, 86, 2685, 86, 2687, 2688, 2686,
+ 86, 86, 2698, 2693, 2694, 86, 2691, 2692, 2697, 2690,
+ 86, 86, 2699, 2700, 86, 86, 2701, 3645, 2696, 2695,
+
+ 2703, 3645, 2707, 2702, 86, 2704, 2705, 2709, 86, 2698,
+ 2693, 2694, 86, 86, 86, 2697, 2708, 2710, 86, 2706,
+ 2700, 2711, 86, 2701, 86, 86, 2712, 2703, 86, 86,
+ 2702, 86, 2704, 2705, 2709, 2713, 2714, 2715, 2716, 86,
+ 2718, 2723, 86, 2708, 2710, 2719, 2706, 2717, 3645, 2720,
+ 2725, 86, 2724, 86, 86, 86, 2721, 2722, 86, 2726,
+ 86, 86, 2713, 2714, 2715, 2716, 86, 2718, 2723, 86,
+ 2727, 2728, 2719, 86, 2717, 86, 2720, 2725, 86, 2724,
+ 86, 86, 2729, 2721, 2722, 86, 2730, 2731, 2732, 2734,
+ 2737, 86, 2733, 2735, 86, 2739, 86, 2727, 86, 2736,
+
+ 86, 86, 2738, 86, 2740, 86, 2741, 2743, 2746, 2729,
+ 2744, 86, 86, 86, 2731, 2732, 2734, 2737, 2742, 2733,
+ 2735, 86, 86, 2745, 86, 86, 2736, 2748, 86, 2738,
+ 86, 86, 2747, 86, 2743, 2746, 2751, 2744, 86, 2754,
+ 86, 2749, 2750, 2753, 2752, 2742, 2755, 2758, 2759, 2756,
+ 2745, 86, 2757, 2761, 2748, 86, 86, 86, 86, 2747,
+ 86, 86, 86, 86, 86, 2760, 2754, 2762, 2749, 2750,
+ 2753, 2752, 86, 86, 86, 2759, 2756, 2763, 86, 2757,
+ 2761, 2764, 2765, 2766, 2767, 2768, 3645, 2770, 2769, 2771,
+ 2772, 86, 2760, 86, 2762, 2777, 2773, 2776, 86, 2774,
+
+ 86, 86, 86, 86, 86, 86, 86, 86, 2764, 2765,
+ 2766, 2767, 2768, 86, 2770, 2769, 2771, 2772, 86, 86,
+ 2775, 2778, 86, 2773, 2776, 2779, 2774, 86, 2780, 2781,
+ 2782, 2783, 3645, 2784, 3645, 2785, 3645, 2786, 3645, 86,
+ 3645, 3645, 2788, 3645, 86, 2793, 2794, 2775, 86, 86,
+ 2787, 2789, 86, 86, 86, 86, 2781, 2782, 2783, 86,
+ 2784, 86, 2785, 86, 2786, 86, 86, 2790, 2792, 2788,
+ 2791, 2795, 86, 2794, 86, 2796, 86, 2787, 2789, 86,
+ 2797, 2798, 2802, 2800, 2799, 2801, 3645, 3645, 3645, 86,
+ 2806, 2803, 3645, 2808, 2790, 2792, 86, 2791, 86, 86,
+
+ 86, 2807, 86, 86, 2809, 86, 3645, 2797, 86, 2802,
+ 2800, 2799, 2801, 86, 2804, 2805, 2810, 86, 2803, 86,
+ 86, 86, 86, 86, 2811, 2814, 2812, 2813, 2807, 86,
+ 86, 2809, 2815, 2816, 3645, 2817, 2821, 2818, 86, 3645,
+ 86, 2804, 2805, 2810, 2819, 86, 2820, 3645, 170, 2828,
+ 2824, 2811, 2814, 2812, 2813, 86, 86, 86, 86, 2815,
+ 2816, 86, 2817, 2821, 2818, 2822, 2825, 2826, 2823, 2827,
+ 86, 2819, 86, 2820, 86, 2829, 86, 2824, 2830, 86,
+ 2831, 3645, 2832, 2834, 3645, 3645, 3645, 3645, 2833, 86,
+ 2835, 86, 2822, 2825, 2826, 2823, 2827, 86, 86, 86,
+
+ 2836, 2843, 86, 2841, 86, 2830, 86, 2831, 86, 2832,
+ 2834, 2837, 86, 2838, 2839, 2833, 2840, 2835, 86, 86,
+ 2845, 86, 86, 86, 2842, 2844, 86, 2836, 2843, 86,
+ 2841, 86, 86, 2846, 3645, 2847, 2848, 2849, 2837, 3645,
+ 2838, 2839, 86, 2840, 2850, 2851, 2853, 2845, 2852, 2854,
+ 86, 2842, 2844, 2855, 2859, 3645, 2856, 86, 2860, 86,
+ 2846, 86, 2847, 2848, 86, 86, 86, 86, 2857, 2858,
+ 86, 2850, 2851, 86, 86, 2852, 2854, 86, 86, 2861,
+ 86, 2859, 2862, 2856, 2864, 2860, 2863, 2865, 86, 2866,
+ 2867, 86, 86, 2868, 2869, 2857, 2858, 86, 2870, 2871,
+
+ 86, 2872, 2873, 86, 2877, 2880, 2861, 86, 2879, 2862,
+ 2876, 2864, 86, 2863, 2865, 2874, 86, 86, 2875, 86,
+ 2868, 2869, 86, 2878, 86, 2870, 86, 86, 86, 2888,
+ 86, 2877, 86, 2881, 86, 2879, 86, 2876, 2884, 2882,
+ 86, 2883, 2874, 2890, 2885, 2875, 86, 2886, 86, 2891,
+ 2878, 86, 2887, 2889, 86, 2892, 86, 86, 3645, 2893,
+ 2881, 3645, 2896, 2897, 3645, 2884, 2882, 86, 2883, 86,
+ 86, 2885, 2894, 86, 2886, 2899, 2891, 86, 86, 2887,
+ 2889, 2895, 2892, 86, 86, 86, 2893, 86, 86, 2896,
+ 2897, 2898, 2901, 2900, 3645, 2903, 2905, 2902, 86, 2894,
+
+ 86, 86, 2899, 2904, 2906, 86, 2909, 2914, 2895, 2907,
+ 2919, 2912, 3645, 3645, 2908, 86, 2910, 2913, 2898, 2901,
+ 2900, 86, 86, 2905, 2902, 86, 86, 2911, 86, 86,
+ 2904, 86, 86, 2909, 86, 2915, 2907, 86, 2912, 86,
+ 86, 2908, 2921, 2910, 2913, 2916, 2917, 2922, 2918, 86,
+ 2920, 3645, 2923, 86, 2911, 86, 2924, 86, 2925, 2926,
+ 86, 2930, 2915, 2928, 2932, 86, 86, 2927, 2935, 2921,
+ 86, 2929, 2916, 2917, 2922, 2918, 86, 2920, 86, 2923,
+ 2931, 86, 86, 86, 2933, 2925, 86, 86, 2930, 86,
+ 2928, 86, 2934, 3645, 2927, 86, 2942, 86, 2929, 2936,
+
+ 2937, 2938, 2939, 2940, 2941, 2943, 2944, 2931, 2945, 3645,
+ 86, 2933, 86, 86, 86, 86, 2946, 2947, 86, 2934,
+ 86, 86, 86, 86, 2948, 2949, 2936, 2937, 2938, 2939,
+ 2940, 2941, 2943, 2944, 2950, 86, 2952, 86, 86, 86,
+ 2951, 2953, 2955, 2946, 2947, 2954, 2957, 86, 86, 2956,
+ 2958, 2948, 2949, 86, 86, 2959, 2960, 86, 86, 2962,
+ 86, 2950, 2961, 2952, 86, 2963, 2964, 2951, 2953, 2955,
+ 86, 86, 2954, 2957, 2967, 2965, 2956, 86, 86, 3645,
+ 3645, 2966, 86, 2960, 86, 86, 170, 2968, 86, 2961,
+ 86, 2969, 2963, 2964, 2971, 2970, 2972, 2973, 2974, 2975,
+
+ 2977, 3645, 2965, 2976, 2982, 2978, 86, 86, 2966, 86,
+ 2987, 2979, 86, 2980, 2968, 2981, 86, 86, 2969, 2984,
+ 2983, 2971, 2970, 86, 86, 2974, 86, 86, 86, 86,
+ 2976, 2985, 86, 86, 2991, 86, 86, 2987, 2979, 2986,
+ 2980, 86, 2981, 86, 2988, 2989, 2984, 2983, 2990, 86,
+ 86, 86, 2992, 3645, 2993, 2994, 86, 3645, 2985, 2996,
+ 3645, 2991, 2995, 2997, 3645, 2998, 2986, 86, 3645, 2999,
+ 3009, 2988, 3000, 3645, 3002, 86, 3001, 86, 86, 2992,
+ 86, 86, 2994, 86, 86, 86, 2996, 86, 86, 2995,
+ 2997, 86, 2998, 3003, 86, 3004, 2999, 3005, 3006, 3000,
+
+ 3008, 3002, 86, 3001, 3007, 3012, 3011, 3010, 3013, 86,
+ 3014, 86, 86, 86, 86, 86, 86, 3015, 86, 3016,
+ 3003, 3017, 3004, 86, 3005, 3006, 86, 3008, 86, 86,
+ 3021, 3007, 3012, 3011, 3010, 3013, 3018, 3014, 3019, 86,
+ 3020, 3022, 86, 3023, 86, 3026, 3016, 3024, 3017, 3025,
+ 3027, 3028, 86, 86, 86, 86, 86, 3021, 3029, 3030,
+ 86, 86, 3031, 3018, 3033, 3019, 86, 3020, 3022, 3645,
+ 86, 3032, 3026, 86, 3024, 3034, 3025, 3027, 86, 3037,
+ 86, 3035, 3036, 3039, 86, 3029, 3038, 3040, 3041, 3645,
+ 3043, 86, 3645, 3042, 86, 3045, 86, 86, 3032, 86,
+
+ 86, 86, 86, 3047, 86, 3044, 3037, 3049, 3035, 3036,
+ 3039, 3046, 86, 3038, 3050, 3041, 86, 3043, 86, 86,
+ 3042, 3051, 86, 86, 3048, 3053, 3052, 3054, 3055, 86,
+ 3047, 3645, 3044, 86, 86, 3056, 3057, 3064, 3046, 3062,
+ 3065, 86, 86, 3063, 3058, 86, 86, 86, 86, 86,
+ 3061, 3048, 3053, 3052, 3054, 86, 3059, 3066, 86, 86,
+ 3068, 3060, 3056, 3057, 86, 86, 3062, 86, 3067, 86,
+ 3063, 3058, 3069, 3070, 86, 3072, 3071, 3061, 3073, 3645,
+ 3074, 3075, 86, 3077, 86, 86, 86, 3068, 86, 3076,
+ 3078, 3081, 86, 3082, 3084, 3067, 3645, 3085, 3080, 3069,
+
+ 86, 86, 3072, 3071, 86, 86, 86, 3074, 86, 3079,
+ 86, 86, 3083, 3091, 3089, 3092, 3076, 3078, 86, 86,
+ 86, 86, 3086, 86, 3085, 3080, 86, 3087, 3088, 3093,
+ 3090, 86, 86, 3095, 86, 86, 3079, 86, 3094, 3083,
+ 3091, 3089, 3096, 3097, 3098, 3104, 3099, 86, 86, 3101,
+ 3100, 3645, 3645, 3645, 86, 3088, 3093, 3090, 3108, 3106,
+ 86, 86, 86, 3645, 86, 3094, 86, 86, 86, 3096,
+ 3097, 3098, 3104, 3099, 86, 86, 3101, 3100, 3102, 3103,
+ 3105, 3107, 3109, 3112, 3113, 86, 3106, 3645, 86, 86,
+ 3110, 3120, 86, 3114, 86, 86, 86, 3115, 3111, 3117,
+
+ 3121, 3645, 3116, 3182, 3118, 3102, 3103, 3105, 3107, 3109,
+ 3112, 3113, 86, 3119, 86, 3122, 3127, 3110, 86, 3123,
+ 3114, 86, 3124, 3645, 3125, 3111, 86, 3121, 3126, 86,
+ 3128, 86, 3129, 86, 3130, 86, 3131, 86, 86, 86,
+ 3119, 86, 3122, 3127, 3132, 86, 3123, 86, 86, 3124,
+ 86, 3125, 86, 3133, 3134, 3126, 3138, 3128, 86, 3129,
+ 3135, 3130, 3136, 3131, 3139, 3645, 3137, 86, 3140, 86,
+ 3141, 3132, 86, 86, 3142, 86, 3144, 3143, 3145, 3146,
+ 3133, 3134, 86, 86, 3147, 86, 3148, 3135, 3149, 3136,
+ 3155, 86, 86, 3137, 3150, 3140, 3151, 3141, 86, 86,
+
+ 3152, 86, 3153, 3144, 3143, 86, 3146, 3154, 86, 3156,
+ 3157, 86, 86, 3148, 86, 86, 86, 86, 86, 3160,
+ 86, 3150, 3158, 3151, 3159, 3163, 3161, 3152, 3165, 3153,
+ 3164, 3167, 86, 86, 3154, 86, 86, 3157, 86, 3645,
+ 86, 3162, 86, 3166, 3168, 3169, 3160, 3170, 86, 3158,
+ 3171, 3159, 3172, 3161, 86, 3165, 3175, 86, 3167, 3645,
+ 86, 86, 3173, 3176, 86, 86, 86, 3174, 3162, 3177,
+ 3166, 3168, 86, 3178, 3170, 86, 86, 86, 3187, 3172,
+ 3179, 86, 3183, 86, 86, 3180, 3181, 3190, 3185, 3173,
+ 3176, 3194, 3184, 86, 3174, 3186, 3177, 86, 86, 3189,
+
+ 3178, 86, 86, 86, 86, 3187, 3188, 3179, 3192, 3183,
+ 86, 3193, 3180, 3181, 3190, 3185, 3191, 86, 86, 3184,
+ 3195, 86, 3186, 3196, 86, 3198, 3189, 3197, 3199, 86,
+ 3201, 3200, 86, 3188, 86, 3192, 86, 3202, 3193, 3203,
+ 3204, 3206, 3205, 3191, 3210, 86, 3645, 86, 3208, 3645,
+ 86, 86, 3198, 86, 3197, 3199, 86, 3207, 3200, 86,
+ 3212, 86, 86, 86, 3202, 3209, 3203, 86, 3206, 3205,
+ 86, 3211, 3213, 86, 86, 3208, 86, 3216, 3214, 3215,
+ 3217, 3218, 3219, 3220, 3207, 3221, 3645, 86, 86, 3645,
+ 86, 3225, 3209, 86, 86, 86, 3645, 3222, 3211, 3213,
+
+ 86, 86, 3223, 86, 3216, 3214, 3215, 3217, 3218, 3219,
+ 3220, 86, 86, 3224, 86, 3226, 86, 3227, 3225, 3229,
+ 3236, 3230, 3228, 3233, 3222, 3231, 3234, 86, 86, 3223,
+ 86, 3232, 86, 86, 3237, 86, 3235, 86, 86, 3645,
+ 3224, 86, 3226, 86, 3227, 3242, 3229, 86, 3230, 3228,
+ 3233, 3238, 3231, 3234, 3241, 3239, 3243, 86, 3232, 86,
+ 3240, 86, 3244, 3235, 3245, 3246, 86, 86, 86, 3247,
+ 3645, 3248, 3242, 3249, 3251, 3250, 86, 3253, 3238, 3252,
+ 86, 3241, 3254, 86, 86, 3256, 86, 86, 3261, 3244,
+ 3255, 86, 3246, 86, 86, 86, 3247, 86, 3248, 3257,
+
+ 3249, 86, 3250, 3258, 3253, 3259, 3252, 86, 3260, 3262,
+ 3264, 3265, 86, 3263, 86, 86, 86, 3255, 86, 3266,
+ 86, 3267, 3268, 3273, 86, 3269, 3257, 3270, 3271, 86,
+ 3258, 3276, 3259, 86, 86, 3260, 3645, 86, 3265, 86,
+ 3263, 86, 86, 3274, 3275, 3277, 3266, 3272, 86, 86,
+ 3273, 86, 3269, 86, 3270, 86, 3280, 3279, 3278, 3287,
+ 3285, 86, 3282, 86, 86, 3281, 3283, 3290, 3284, 3286,
+ 3274, 3275, 3277, 86, 3272, 86, 86, 86, 3288, 3289,
+ 3292, 3293, 3294, 86, 3279, 3278, 86, 3285, 3291, 3282,
+ 86, 86, 3281, 3283, 86, 3284, 3286, 86, 3296, 86,
+
+ 3299, 3300, 86, 86, 86, 86, 3289, 3292, 86, 3294,
+ 3295, 3297, 3298, 3301, 3304, 3291, 86, 3302, 86, 86,
+ 3303, 86, 86, 3305, 3306, 3307, 3308, 86, 3300, 3309,
+ 86, 86, 3310, 3311, 86, 86, 3312, 3295, 3297, 3298,
+ 3301, 86, 3313, 86, 3302, 3314, 3315, 3303, 3316, 86,
+ 3305, 3306, 3307, 86, 3317, 86, 86, 3318, 3320, 86,
+ 3311, 3319, 86, 3312, 86, 3321, 3322, 3323, 3324, 3313,
+ 3325, 86, 86, 86, 3326, 86, 3645, 3645, 86, 3331,
+ 3327, 86, 86, 3332, 3318, 86, 3328, 86, 3319, 3341,
+ 86, 86, 3321, 86, 3323, 86, 3329, 86, 3330, 3333,
+
+ 86, 3326, 3335, 86, 86, 86, 3331, 3327, 3334, 3337,
+ 86, 3336, 3338, 3328, 3339, 86, 86, 3342, 86, 3340,
+ 3344, 86, 3343, 3329, 86, 3330, 3333, 86, 86, 3335,
+ 86, 3345, 3346, 3347, 3348, 3334, 3337, 86, 3336, 86,
+ 3349, 86, 86, 3350, 3342, 3352, 3340, 3344, 3645, 3343,
+ 3351, 3353, 3354, 86, 3356, 3357, 86, 3355, 3345, 86,
+ 86, 3348, 86, 3358, 86, 86, 3359, 3349, 3360, 3645,
+ 86, 3361, 3352, 3645, 86, 86, 86, 3351, 86, 3354,
+ 86, 3356, 3357, 86, 3355, 3362, 3363, 3374, 86, 3364,
+ 3358, 3366, 86, 3359, 86, 3360, 86, 3367, 3361, 3365,
+
+ 86, 3368, 3369, 3370, 86, 3371, 86, 3379, 86, 86,
+ 3373, 86, 3362, 3363, 3372, 3645, 3364, 86, 3366, 86,
+ 3375, 3377, 3380, 3381, 3367, 3378, 3365, 86, 3368, 3369,
+ 3370, 3376, 3371, 3382, 86, 3383, 86, 3373, 86, 86,
+ 3385, 3372, 86, 3384, 3386, 86, 86, 3375, 3377, 86,
+ 3381, 86, 3378, 3387, 3388, 3389, 86, 86, 3376, 3392,
+ 86, 3395, 3383, 3390, 3391, 3393, 3394, 86, 3396, 3397,
+ 3384, 3386, 3398, 3399, 3645, 3401, 3400, 3405, 3402, 3645,
+ 86, 3645, 86, 86, 86, 86, 86, 86, 3395, 86,
+ 86, 3403, 86, 3404, 86, 3396, 3397, 3408, 86, 86,
+
+ 3399, 86, 3401, 3400, 86, 3402, 3406, 3407, 3409, 86,
+ 3410, 3411, 3412, 86, 3413, 86, 3414, 86, 3403, 3416,
+ 3404, 86, 3415, 86, 3408, 3417, 3418, 3423, 86, 3420,
+ 3419, 86, 3424, 3406, 3407, 3409, 86, 3410, 3411, 3412,
+ 86, 3413, 86, 86, 3421, 86, 3416, 3422, 3425, 3415,
+ 3429, 86, 86, 86, 3427, 3428, 3420, 3419, 3426, 86,
+ 86, 86, 86, 3432, 3430, 3431, 86, 3433, 3434, 3435,
+ 3436, 3421, 86, 86, 3422, 3437, 3438, 3429, 3439, 3440,
+ 86, 3427, 3428, 3441, 3442, 3426, 86, 86, 3443, 86,
+ 86, 3430, 3431, 86, 3444, 3434, 86, 86, 86, 86,
+
+ 3445, 86, 3437, 3438, 3446, 86, 86, 3447, 3448, 3449,
+ 3441, 3442, 3450, 3451, 86, 86, 3453, 3454, 3456, 3452,
+ 3455, 86, 3457, 3458, 3459, 3460, 3645, 86, 3645, 86,
+ 3461, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 3451, 3462, 86, 86, 86, 3456, 3452, 3455, 3463, 3457,
+ 86, 3459, 86, 3464, 3465, 86, 3467, 3461, 3466, 3645,
+ 3468, 3475, 3469, 86, 3470, 86, 3471, 3472, 3462, 86,
+ 86, 3473, 3474, 3645, 86, 3463, 86, 3645, 3476, 86,
+ 3464, 86, 3477, 86, 3481, 3466, 86, 3468, 3475, 3469,
+ 86, 3470, 86, 3471, 3472, 86, 3479, 3478, 3473, 3480,
+
+ 86, 3483, 86, 3485, 86, 3476, 86, 86, 3482, 3477,
+ 86, 3481, 3486, 86, 3484, 86, 3487, 3489, 3488, 3490,
+ 86, 3491, 3645, 3479, 3478, 3492, 3480, 3494, 3483, 86,
+ 3485, 86, 86, 3493, 86, 3482, 3645, 3500, 3645, 3486,
+ 86, 3484, 3495, 3487, 86, 3488, 86, 3498, 86, 86,
+ 86, 86, 3492, 3496, 3494, 3497, 3499, 3503, 3501, 86,
+ 3493, 3502, 86, 86, 3500, 3504, 86, 3505, 3506, 3495,
+ 86, 86, 3509, 86, 3498, 3507, 86, 86, 86, 86,
+ 3496, 3508, 3497, 3499, 3503, 3501, 3510, 86, 3502, 3511,
+ 86, 3512, 3504, 86, 3505, 3506, 3514, 86, 3513, 3509,
+
+ 3515, 86, 3507, 3516, 86, 3519, 3517, 3520, 3508, 3518,
+ 86, 86, 86, 3510, 3522, 3524, 3511, 3521, 3512, 3523,
+ 86, 3525, 86, 3514, 3527, 3513, 3528, 86, 86, 3526,
+ 3516, 86, 3519, 3517, 86, 86, 3518, 86, 3529, 3530,
+ 3532, 86, 86, 3533, 3521, 86, 3523, 3531, 86, 86,
+ 86, 3527, 86, 3528, 3535, 3534, 3526, 3536, 3537, 3539,
+ 86, 86, 3540, 3538, 3541, 3529, 3530, 3532, 86, 86,
+ 86, 3542, 3543, 3544, 3531, 86, 3545, 3547, 3546, 86,
+ 86, 3535, 3534, 86, 3536, 86, 86, 86, 86, 86,
+ 3538, 86, 3548, 3549, 3550, 3551, 3552, 3553, 3542, 3543,
+
+ 86, 3645, 86, 3545, 86, 3546, 3555, 3556, 3554, 3557,
+ 86, 3558, 86, 3561, 86, 3645, 3562, 3559, 86, 3548,
+ 3549, 3550, 86, 86, 3553, 3560, 86, 86, 86, 86,
+ 3563, 3564, 86, 3555, 3556, 3554, 86, 86, 86, 86,
+ 3561, 3565, 3566, 3562, 3559, 3567, 3568, 3571, 3569, 86,
+ 3645, 3575, 3560, 86, 86, 3570, 86, 3563, 3564, 86,
+ 3572, 3576, 3573, 3577, 3578, 3583, 3645, 86, 3565, 3566,
+ 86, 86, 3567, 3568, 86, 3569, 3574, 86, 86, 3579,
+ 3580, 3645, 3570, 86, 86, 3582, 3581, 3572, 3576, 3573,
+ 86, 3578, 3584, 86, 3585, 86, 3586, 86, 3589, 3587,
+
+ 3645, 86, 86, 3574, 3595, 3592, 3579, 3580, 86, 3588,
+ 3645, 3596, 3582, 3581, 3645, 3594, 86, 86, 86, 86,
+ 3590, 3585, 86, 86, 3591, 3589, 3587, 3593, 86, 86,
+ 86, 3595, 86, 3599, 3602, 86, 3588, 86, 86, 3603,
+ 3597, 3600, 3594, 3598, 3601, 3645, 3645, 3590, 86, 86,
+ 3604, 3591, 86, 3607, 3593, 86, 3606, 86, 86, 3605,
+ 3599, 3602, 3609, 3645, 3610, 86, 3603, 3597, 3600, 3645,
+ 3598, 3601, 86, 86, 3608, 3611, 3612, 3604, 3614, 86,
+ 3607, 3616, 86, 3606, 3613, 3615, 3605, 3617, 86, 3609,
+ 86, 3610, 86, 3618, 3621, 3619, 86, 86, 3623, 3645,
+
+ 3645, 3608, 3611, 3612, 3625, 86, 86, 86, 3616, 3620,
+ 3622, 3613, 3615, 86, 86, 86, 86, 86, 86, 3624,
+ 3618, 3621, 3619, 3626, 3627, 86, 86, 86, 3629, 3630,
+ 3628, 3625, 86, 3631, 3632, 3634, 3620, 3622, 86, 3633,
+ 3636, 86, 86, 3635, 3637, 86, 3624, 3639, 3638, 3643,
+ 3626, 3627, 3644, 3645, 86, 3629, 86, 3628, 3640, 3645,
+ 3631, 3632, 86, 86, 3641, 86, 3633, 86, 86, 86,
+ 3635, 86, 86, 3642, 3639, 3638, 86, 3645, 3645, 86,
+ 86, 86, 3645, 3645, 3645, 3640, 3645, 3645, 3645, 3645,
+ 3645, 3641, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+
+ 3642, 47, 47, 47, 47, 47, 47, 47, 52, 52,
+ 52, 52, 52, 52, 52, 57, 57, 57, 57, 57,
+ 57, 57, 63, 63, 63, 63, 63, 63, 63, 68,
+ 68, 68, 68, 68, 68, 68, 74, 74, 74, 74,
+ 74, 74, 74, 80, 80, 80, 80, 80, 80, 80,
+ 89, 89, 3645, 89, 89, 89, 89, 160, 160, 3645,
+ 3645, 3645, 160, 160, 162, 162, 3645, 3645, 162, 3645,
+ 162, 164, 3645, 3645, 3645, 3645, 3645, 164, 167, 167,
+ 3645, 3645, 3645, 167, 167, 169, 3645, 3645, 3645, 3645,
+ 3645, 169, 171, 171, 3645, 171, 171, 171, 171, 174,
+
+ 3645, 3645, 3645, 3645, 3645, 174, 177, 177, 3645, 3645,
+ 3645, 177, 177, 90, 90, 3645, 90, 90, 90, 90,
+ 17, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645
} ;
-static const flex_int16_t yy_chk[10350] =
+static const flex_int16_t yy_chk[10488] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -2765,15 +2795,15 @@ static const flex_int16_t yy_chk[10350] =
7, 7, 7, 33, 7, 8, 8, 8, 8, 32,
8, 9, 9, 9, 10, 10, 10, 19, 51, 51,
- 1136, 19, 3607, 3, 32, 33, 4, 67, 67, 5,
- 33, 6, 2925, 13, 13, 13, 13, 7, 13, 14,
+ 1142, 19, 3653, 3, 32, 33, 4, 67, 67, 5,
+ 33, 6, 2962, 13, 13, 13, 13, 7, 13, 14,
14, 14, 14, 8, 14, 15, 15, 15, 9, 25,
- 1136, 10, 11, 11, 11, 11, 11, 11, 12, 12,
+ 1142, 10, 11, 11, 11, 11, 11, 11, 12, 12,
12, 12, 12, 12, 16, 16, 16, 34, 28, 84,
- 84, 13, 11, 45, 294, 25, 25, 14, 12, 34,
- 39, 23, 15, 23, 23, 45, 23, 1148, 28, 177,
+ 84, 13, 11, 45, 295, 25, 25, 14, 12, 34,
+ 39, 23, 15, 23, 23, 45, 23, 1154, 28, 177,
11, 28, 23, 39, 34, 28, 12, 176, 87, 11,
- 45, 16, 87, 294, 37, 12, 30, 39, 29, 56,
+ 45, 16, 87, 295, 37, 12, 30, 39, 29, 56,
37, 174, 56, 72, 30, 28, 26, 169, 100, 23,
24, 24, 29, 26, 24, 30, 72, 26, 99, 24,
@@ -2795,12 +2825,12 @@ static const flex_int16_t yy_chk[10350] =
38, 43, 73, 38, 73, 73, 95, 73, 111, 97,
38, 43, 38, 38, 104, 43, 43, 38, 95, 104,
79, 38, 79, 79, 58, 79, 111, 38, 220, 86,
- 38, 86, 86, 97, 86, 223, 97, 38, 40, 980,
+ 38, 86, 86, 97, 86, 223, 97, 38, 40, 985,
86, 104, 40, 89, 96, 89, 89, 112, 89, 98,
57, 96, 40, 40, 89, 40, 112, 103, 103, 106,
105, 52, 98, 47, 40, 40, 103, 223, 105, 40,
- 980, 96, 151, 98, 112, 225, 98, 106, 151, 40,
+ 985, 96, 151, 98, 112, 225, 98, 106, 151, 40,
40, 89, 40, 41, 103, 103, 41, 105, 102, 98,
107, 106, 108, 41, 102, 109, 102, 41, 41, 151,
228, 108, 109, 107, 106, 41, 113, 225, 115, 102,
@@ -2815,1083 +2845,1098 @@ static const flex_int16_t yy_chk[10350] =
122, 129, 121, 117, 117, 124, 121, 118, 126, 124,
127, 128, 123, 125, 132, 129, 120, 131, 130, 122,
125, 126, 121, 132, 122, 130, 133, 134, 129, 128,
- 127, 0, 137, 0, 140, 135, 134, 127, 128, 135,
- 131, 132, 0, 136, 131, 130, 140, 0, 138, 133,
- 136, 141, 141, 133, 134, 138, 139, 135, 137, 137,
- 142, 140, 135, 144, 150, 139, 135, 146, 142, 143,
-
- 136, 139, 150, 0, 149, 138, 0, 144, 141, 139,
- 143, 0, 146, 139, 143, 149, 147, 142, 148, 152,
- 144, 150, 139, 143, 146, 157, 143, 0, 139, 148,
- 152, 149, 154, 147, 157, 155, 147, 143, 148, 156,
- 153, 143, 147, 147, 0, 148, 152, 154, 158, 153,
- 0, 159, 157, 0, 156, 0, 148, 155, 0, 154,
- 147, 153, 155, 147, 159, 153, 156, 153, 173, 165,
- 158, 165, 165, 180, 165, 158, 153, 170, 159, 170,
- 170, 171, 170, 171, 171, 179, 171, 180, 153, 181,
- 182, 175, 173, 175, 175, 173, 175, 184, 181, 183,
-
- 186, 185, 182, 187, 0, 180, 183, 179, 186, 188,
- 257, 232, 179, 184, 180, 187, 181, 182, 183, 171,
- 185, 190, 189, 192, 184, 192, 183, 186, 185, 189,
- 187, 188, 191, 183, 193, 257, 188, 257, 191, 190,
- 194, 196, 200, 232, 198, 196, 201, 200, 190, 189,
- 192, 205, 0, 199, 201, 202, 193, 203, 205, 208,
- 204, 193, 196, 0, 191, 191, 194, 194, 199, 196,
- 198, 198, 196, 201, 200, 204, 206, 202, 205, 203,
- 199, 208, 202, 209, 203, 210, 208, 204, 207, 196,
- 197, 211, 213, 0, 209, 197, 0, 0, 210, 212,
-
- 197, 213, 212, 211, 206, 0, 197, 197, 206, 221,
- 209, 207, 210, 197, 212, 207, 214, 197, 211, 213,
- 215, 0, 197, 217, 234, 218, 212, 197, 219, 212,
- 222, 206, 218, 197, 197, 221, 221, 224, 214, 219,
- 226, 222, 215, 214, 224, 217, 231, 215, 216, 229,
- 217, 216, 218, 216, 226, 219, 234, 227, 236, 0,
- 0, 233, 222, 227, 224, 216, 233, 216, 222, 231,
- 0, 229, 226, 231, 216, 216, 229, 235, 216, 236,
- 216, 226, 237, 0, 227, 236, 233, 238, 233, 237,
- 0, 235, 216, 233, 216, 242, 239, 240, 241, 244,
-
- 243, 247, 245, 252, 235, 239, 247, 0, 238, 237,
- 239, 244, 241, 245, 238, 248, 240, 242, 243, 254,
- 250, 246, 242, 239, 240, 241, 244, 243, 246, 245,
- 249, 251, 239, 247, 256, 252, 251, 248, 255, 249,
- 253, 253, 248, 250, 258, 255, 259, 250, 246, 253,
- 260, 254, 258, 261, 262, 263, 256, 249, 251, 264,
- 268, 256, 262, 265, 267, 255, 259, 253, 253, 266,
- 269, 258, 270, 259, 264, 0, 265, 0, 272, 273,
- 271, 262, 260, 268, 271, 261, 264, 263, 0, 270,
- 265, 267, 268, 274, 273, 266, 266, 270, 275, 270,
-
- 272, 274, 269, 0, 276, 272, 273, 271, 277, 278,
- 268, 276, 279, 278, 280, 281, 270, 275, 282, 283,
- 274, 284, 289, 286, 289, 275, 285, 290, 287, 292,
- 277, 276, 286, 284, 291, 277, 278, 281, 288, 285,
- 282, 287, 281, 293, 279, 282, 280, 296, 284, 289,
- 286, 283, 297, 285, 292, 287, 292, 288, 291, 290,
- 299, 291, 295, 0, 298, 288, 300, 302, 303, 293,
- 293, 295, 299, 296, 296, 298, 301, 306, 297, 297,
- 304, 308, 310, 307, 313, 302, 303, 299, 304, 295,
- 300, 298, 309, 300, 302, 303, 307, 312, 311, 301,
-
- 314, 316, 315, 301, 0, 0, 313, 304, 316, 306,
- 307, 313, 320, 308, 310, 311, 318, 309, 317, 309,
- 322, 311, 318, 312, 312, 311, 315, 317, 316, 322,
- 319, 321, 314, 323, 315, 326, 329, 325, 320, 320,
- 324, 327, 311, 318, 319, 317, 325, 322, 324, 328,
- 327, 329, 330, 315, 331, 321, 323, 319, 321, 332,
- 323, 326, 326, 329, 325, 334, 328, 324, 327, 336,
- 0, 335, 0, 328, 332, 0, 328, 0, 331, 361,
- 335, 331, 338, 334, 330, 0, 332, 0, 0, 343,
- 0, 336, 334, 328, 333, 0, 336, 333, 335, 337,
-
- 340, 337, 333, 333, 333, 333, 338, 344, 339, 338,
- 0, 361, 333, 343, 337, 340, 343, 337, 341, 341,
- 342, 333, 339, 337, 333, 342, 337, 340, 337, 333,
- 333, 333, 333, 349, 344, 339, 346, 345, 347, 0,
- 345, 337, 351, 341, 337, 341, 341, 345, 346, 0,
- 347, 349, 342, 350, 352, 356, 348, 348, 0, 353,
- 349, 354, 355, 346, 345, 347, 348, 345, 366, 351,
- 358, 350, 359, 0, 355, 357, 352, 356, 358, 359,
- 350, 352, 356, 348, 348, 353, 353, 354, 354, 355,
- 357, 360, 0, 362, 364, 362, 370, 358, 372, 359,
-
- 366, 364, 357, 360, 362, 365, 367, 368, 375, 370,
- 374, 362, 369, 368, 369, 0, 372, 397, 360, 362,
- 362, 364, 362, 370, 373, 372, 408, 365, 367, 368,
- 371, 362, 365, 367, 368, 375, 369, 376, 362, 369,
- 368, 369, 374, 371, 380, 379, 371, 383, 371, 397,
- 373, 373, 379, 381, 371, 382, 386, 371, 408, 376,
- 383, 0, 380, 385, 376, 381, 0, 382, 380, 386,
- 371, 380, 379, 371, 383, 371, 377, 389, 377, 385,
- 381, 390, 382, 386, 377, 388, 390, 385, 377, 380,
- 385, 393, 392, 377, 0, 389, 377, 388, 392, 393,
-
- 391, 396, 377, 377, 389, 377, 385, 391, 406, 396,
- 394, 377, 388, 390, 395, 377, 398, 398, 393, 392,
- 377, 391, 394, 377, 378, 400, 378, 391, 396, 399,
- 406, 401, 395, 405, 391, 406, 399, 394, 400, 378,
- 401, 395, 378, 398, 378, 405, 378, 413, 435, 0,
- 378, 378, 400, 378, 403, 404, 399, 0, 0, 0,
- 405, 403, 404, 401, 0, 407, 378, 401, 0, 378,
- 409, 378, 0, 378, 387, 387, 402, 407, 411, 413,
- 435, 403, 404, 410, 387, 387, 387, 387, 387, 415,
- 410, 387, 407, 411, 402, 412, 409, 409, 402, 387,
-
- 415, 387, 387, 402, 414, 411, 414, 416, 412, 0,
- 410, 387, 387, 387, 387, 387, 415, 418, 387, 417,
- 417, 402, 412, 423, 418, 419, 420, 421, 0, 416,
- 422, 414, 0, 427, 416, 425, 419, 420, 424, 424,
- 421, 428, 0, 440, 418, 423, 426, 0, 417, 428,
- 423, 0, 419, 420, 421, 422, 424, 422, 425, 427,
- 427, 426, 425, 424, 429, 424, 424, 430, 428, 426,
- 431, 432, 436, 426, 437, 440, 429, 0, 430, 431,
- 438, 433, 433, 424, 432, 0, 439, 444, 426, 442,
- 436, 429, 443, 433, 430, 433, 437, 431, 432, 436,
-
- 433, 437, 445, 438, 439, 0, 441, 438, 433, 433,
- 442, 444, 441, 439, 444, 443, 442, 447, 0, 443,
- 433, 446, 433, 434, 445, 449, 448, 450, 446, 445,
- 452, 434, 434, 441, 455, 434, 434, 451, 453, 434,
- 448, 456, 454, 447, 447, 434, 455, 456, 446, 450,
- 434, 451, 449, 448, 450, 457, 452, 452, 434, 434,
- 460, 455, 434, 434, 451, 454, 434, 458, 456, 454,
- 453, 459, 462, 461, 465, 460, 463, 457, 464, 459,
- 461, 462, 457, 468, 466, 0, 470, 460, 471, 458,
- 469, 463, 470, 467, 458, 0, 465, 459, 459, 462,
-
- 461, 465, 464, 463, 474, 464, 459, 466, 467, 468,
- 468, 466, 469, 470, 471, 471, 472, 469, 476, 477,
- 467, 472, 478, 479, 476, 481, 480, 482, 478, 483,
- 474, 474, 480, 485, 482, 485, 0, 489, 477, 486,
- 491, 479, 485, 472, 483, 476, 477, 481, 486, 478,
- 479, 487, 481, 480, 482, 488, 483, 490, 487, 492,
- 485, 493, 485, 495, 494, 497, 486, 494, 488, 489,
- 499, 501, 491, 500, 493, 490, 496, 497, 487, 498,
- 500, 492, 488, 494, 490, 502, 492, 495, 493, 496,
- 495, 494, 497, 504, 494, 501, 503, 498, 501, 505,
-
- 500, 506, 499, 496, 505, 508, 498, 506, 502, 503,
- 507, 511, 509, 512, 510, 504, 513, 502, 516, 0,
- 504, 512, 511, 503, 509, 516, 505, 508, 506, 0,
- 513, 519, 508, 507, 520, 502, 510, 507, 511, 509,
- 512, 510, 520, 513, 514, 516, 517, 528, 518, 514,
- 521, 514, 517, 522, 519, 525, 523, 514, 519, 514,
- 518, 520, 514, 514, 522, 528, 0, 525, 0, 514,
- 514, 514, 521, 517, 528, 518, 514, 521, 514, 523,
- 522, 524, 525, 523, 514, 524, 514, 526, 527, 514,
- 514, 527, 529, 530, 533, 531, 514, 0, 533, 527,
-
- 535, 532, 529, 524, 534, 530, 531, 526, 524, 526,
- 537, 534, 524, 0, 526, 527, 541, 536, 527, 536,
- 530, 533, 531, 538, 529, 532, 535, 535, 532, 529,
- 539, 534, 542, 543, 526, 538, 537, 537, 543, 540,
- 542, 544, 541, 541, 536, 539, 545, 546, 548, 547,
- 538, 540, 550, 0, 551, 546, 553, 539, 0, 542,
- 543, 547, 552, 544, 545, 554, 540, 560, 544, 548,
- 550, 555, 558, 545, 546, 548, 547, 551, 556, 550,
- 554, 551, 557, 555, 558, 552, 556, 559, 553, 552,
- 560, 562, 554, 561, 560, 557, 559, 563, 555, 558,
-
- 563, 565, 564, 566, 567, 556, 568, 561, 0, 557,
- 569, 0, 570, 571, 559, 572, 562, 0, 562, 567,
- 561, 564, 573, 574, 563, 569, 571, 572, 565, 564,
- 581, 567, 584, 0, 576, 566, 570, 569, 568, 570,
- 571, 575, 572, 579, 573, 576, 578, 574, 575, 573,
- 574, 575, 577, 580, 582, 583, 586, 577, 585, 575,
- 578, 576, 581, 585, 584, 586, 587, 589, 575, 0,
- 579, 588, 587, 578, 590, 575, 592, 591, 575, 0,
- 580, 582, 583, 586, 577, 591, 588, 593, 594, 596,
- 585, 589, 598, 587, 589, 592, 590, 596, 588, 597,
-
- 599, 590, 595, 592, 591, 600, 595, 599, 601, 602,
- 594, 593, 603, 606, 593, 594, 596, 601, 604, 606,
- 607, 605, 597, 609, 598, 603, 597, 599, 600, 595,
- 608, 602, 600, 605, 609, 601, 602, 611, 608, 603,
- 606, 612, 607, 613, 604, 604, 610, 607, 605, 615,
- 609, 616, 617, 610, 618, 0, 613, 608, 615, 621,
- 619, 617, 620, 612, 624, 618, 614, 625, 612, 611,
- 613, 614, 621, 610, 614, 614, 615, 616, 616, 617,
- 622, 618, 619, 627, 620, 625, 621, 619, 626, 620,
- 614, 628, 622, 614, 625, 629, 624, 631, 614, 630,
-
- 632, 614, 614, 633, 637, 627, 627, 622, 631, 632,
- 627, 634, 626, 628, 635, 626, 638, 644, 628, 629,
- 0, 630, 629, 633, 631, 634, 630, 632, 636, 639,
- 633, 637, 627, 640, 638, 636, 635, 639, 634, 640,
- 641, 635, 643, 638, 642, 645, 646, 647, 647, 644,
- 648, 641, 650, 649, 655, 636, 639, 643, 0, 0,
- 640, 650, 642, 653, 657, 651, 645, 641, 652, 643,
- 646, 642, 645, 646, 648, 649, 647, 648, 651, 650,
- 649, 652, 656, 654, 658, 653, 655, 659, 0, 659,
- 653, 654, 651, 660, 661, 652, 657, 666, 662, 661,
-
- 665, 0, 663, 667, 656, 666, 0, 670, 658, 656,
- 654, 658, 662, 664, 659, 660, 663, 668, 0, 678,
- 660, 667, 671, 672, 666, 662, 661, 664, 664, 663,
- 667, 669, 665, 670, 670, 664, 673, 674, 669, 668,
- 664, 675, 671, 672, 668, 678, 678, 0, 677, 671,
- 672, 673, 676, 677, 664, 664, 675, 679, 669, 679,
- 673, 680, 676, 673, 681, 682, 683, 684, 675, 674,
- 0, 688, 681, 685, 676, 683, 684, 686, 673, 676,
- 677, 690, 685, 689, 679, 686, 680, 693, 680, 676,
- 682, 681, 682, 683, 684, 687, 693, 691, 697, 690,
-
- 685, 692, 687, 688, 686, 696, 689, 694, 690, 691,
- 689, 695, 698, 692, 693, 694, 699, 696, 700, 698,
- 695, 702, 687, 701, 691, 0, 704, 702, 692, 699,
- 697, 701, 696, 700, 694, 695, 703, 705, 695, 698,
- 706, 0, 713, 699, 703, 700, 705, 695, 702, 704,
- 701, 706, 707, 704, 709, 711, 708, 708, 710, 712,
- 715, 707, 709, 703, 705, 708, 710, 706, 713, 713,
- 714, 0, 712, 715, 717, 0, 718, 711, 719, 707,
- 716, 709, 711, 708, 708, 710, 712, 715, 716, 718,
- 717, 720, 722, 714, 723, 724, 721, 714, 727, 0,
-
- 719, 717, 720, 718, 721, 719, 722, 716, 725, 726,
- 728, 730, 726, 732, 723, 729, 731, 724, 720, 722,
- 727, 723, 724, 721, 729, 727, 732, 733, 725, 734,
- 735, 730, 728, 736, 731, 725, 726, 728, 730, 737,
- 732, 738, 729, 731, 734, 733, 739, 740, 744, 741,
- 0, 746, 743, 748, 733, 736, 734, 742, 743, 739,
- 736, 741, 735, 737, 738, 740, 737, 747, 738, 745,
- 742, 748, 754, 739, 740, 744, 741, 745, 746, 743,
- 748, 751, 750, 753, 742, 752, 0, 754, 756, 747,
- 750, 755, 752, 755, 747, 745, 745, 756, 757, 754,
-
- 758, 759, 760, 0, 745, 761, 753, 761, 765, 750,
- 753, 760, 752, 751, 768, 756, 762, 0, 755, 758,
- 765, 759, 771, 762, 768, 772, 774, 758, 759, 760,
- 757, 774, 761, 779, 0, 765, 775, 0, 776, 777,
- 771, 768, 0, 762, 763, 778, 772, 763, 784, 771,
- 777, 763, 772, 774, 763, 784, 776, 775, 780, 779,
- 779, 763, 763, 775, 763, 776, 777, 781, 778, 763,
- 782, 763, 778, 783, 763, 784, 785, 788, 763, 782,
- 787, 763, 0, 781, 780, 780, 783, 787, 763, 763,
- 789, 763, 790, 0, 781, 791, 789, 782, 793, 788,
-
- 783, 790, 792, 795, 788, 792, 794, 787, 785, 786,
- 786, 795, 786, 0, 793, 786, 796, 789, 791, 790,
- 786, 793, 791, 0, 802, 793, 786, 786, 794, 792,
- 795, 799, 797, 794, 804, 786, 786, 786, 796, 786,
- 800, 793, 786, 796, 797, 800, 798, 786, 798, 801,
- 802, 802, 803, 786, 786, 799, 804, 805, 799, 797,
- 806, 804, 807, 808, 803, 809, 810, 812, 0, 801,
- 0, 814, 800, 798, 813, 812, 801, 817, 814, 803,
- 811, 816, 806, 805, 805, 808, 807, 806, 815, 807,
- 808, 810, 809, 810, 812, 811, 815, 813, 814, 818,
-
- 816, 813, 820, 817, 817, 819, 822, 811, 816, 823,
- 821, 818, 824, 825, 823, 815, 826, 827, 819, 821,
- 829, 822, 827, 830, 832, 836, 818, 834, 820, 820,
- 831, 833, 819, 822, 838, 825, 823, 821, 831, 835,
- 825, 837, 829, 826, 824, 839, 836, 829, 840, 827,
- 0, 842, 836, 833, 843, 830, 832, 831, 833, 834,
- 837, 838, 841, 835, 844, 845, 835, 840, 837, 846,
- 848, 841, 839, 842, 845, 840, 849, 843, 842, 847,
- 846, 843, 850, 851, 844, 852, 855, 847, 860, 841,
- 0, 844, 845, 856, 849, 857, 846, 848, 857, 853,
-
- 859, 850, 858, 849, 855, 0, 847, 853, 861, 850,
- 851, 856, 860, 855, 863, 860, 863, 852, 859, 862,
- 856, 864, 857, 865, 858, 867, 853, 859, 866, 858,
- 861, 868, 862, 866, 890, 861, 870, 865, 867, 864,
- 873, 863, 869, 871, 870, 877, 862, 874, 864, 873,
- 865, 876, 867, 872, 869, 874, 872, 868, 868, 878,
- 866, 871, 879, 870, 0, 878, 890, 873, 881, 869,
- 871, 874, 877, 880, 874, 881, 876, 0, 876, 880,
- 872, 882, 874, 885, 879, 883, 878, 884, 882, 879,
- 883, 889, 886, 887, 884, 881, 886, 888, 892, 889,
-
- 880, 885, 896, 891, 893, 900, 888, 897, 882, 894,
- 885, 899, 883, 892, 884, 893, 887, 894, 889, 886,
- 887, 891, 895, 896, 888, 892, 897, 898, 905, 896,
- 891, 893, 900, 899, 897, 895, 894, 901, 899, 902,
- 898, 903, 911, 904, 906, 901, 902, 905, 907, 895,
- 904, 906, 908, 907, 898, 905, 909, 912, 910, 903,
- 908, 914, 0, 909, 901, 910, 902, 913, 903, 915,
- 904, 906, 919, 917, 911, 907, 918, 916, 925, 908,
- 913, 0, 915, 909, 916, 910, 924, 922, 926, 912,
- 920, 923, 921, 914, 913, 919, 915, 923, 920, 919,
-
- 921, 927, 928, 930, 916, 917, 932, 921, 918, 922,
- 925, 928, 924, 924, 922, 931, 929, 920, 923, 921,
- 926, 935, 931, 933, 934, 927, 936, 921, 927, 928,
- 929, 936, 933, 932, 935, 930, 935, 937, 0, 938,
- 0, 939, 931, 929, 0, 935, 934, 940, 935, 937,
- 933, 934, 940, 941, 942, 977, 945, 943, 936, 945,
- 941, 935, 938, 935, 937, 943, 938, 939, 939, 946,
- 949, 948, 950, 0, 940, 978, 942, 949, 950, 0,
- 941, 942, 946, 945, 943, 948, 0, 977, 952, 953,
- 955, 0, 954, 956, 0, 956, 946, 949, 948, 950,
-
- 951, 0, 951, 957, 954, 971, 951, 978, 951, 958,
- 959, 971, 953, 951, 952, 952, 953, 955, 951, 954,
- 956, 958, 960, 959, 951, 961, 957, 951, 963, 951,
- 957, 966, 971, 951, 962, 951, 958, 959, 961, 962,
- 951, 964, 968, 966, 960, 951, 963, 965, 970, 960,
- 967, 969, 961, 973, 964, 963, 979, 968, 966, 965,
- 967, 970, 974, 972, 975, 981, 962, 0, 964, 968,
- 965, 973, 967, 969, 965, 970, 972, 967, 969, 976,
- 973, 986, 987, 979, 974, 975, 965, 967, 982, 974,
- 972, 975, 983, 982, 984, 0, 986, 981, 988, 989,
-
- 983, 976, 0, 984, 987, 990, 976, 0, 986, 987,
- 994, 988, 991, 998, 989, 982, 995, 992, 0, 983,
- 0, 984, 985, 994, 995, 988, 989, 985, 0, 985,
- 996, 990, 990, 999, 991, 985, 992, 994, 996, 991,
- 985, 985, 993, 995, 992, 998, 0, 985, 985, 985,
- 997, 1000, 1005, 993, 985, 999, 985, 996, 1006, 1002,
- 999, 997, 985, 1001, 1003, 1009, 1000, 985, 985, 993,
- 1002, 1004, 1001, 1003, 985, 1007, 1010, 997, 1000, 1005,
- 1004, 1006, 1007, 1012, 1011, 1006, 1002, 1013, 1014, 0,
- 1001, 1003, 1011, 1021, 1015, 1018, 1016, 1009, 1004, 1019,
-
- 1010, 1013, 1007, 1010, 1016, 1012, 1022, 1020, 1024, 0,
- 1012, 1011, 1033, 1018, 1013, 1026, 1015, 1019, 1020, 1023,
- 1014, 1015, 1018, 1016, 1022, 1021, 1019, 1023, 1026, 1025,
- 1024, 1027, 1028, 1022, 1020, 1024, 1025, 1029, 1027, 1030,
- 1031, 1032, 1026, 1035, 1033, 1038, 1023, 1028, 0, 1037,
- 0, 1032, 1038, 1039, 1035, 1029, 1025, 1030, 1027, 1028,
- 1041, 1031, 1037, 1040, 1029, 1042, 1030, 1031, 1032, 1043,
- 1035, 1040, 1038, 1041, 1042, 1039, 1037, 1044, 1045, 1048,
- 1039, 1043, 1050, 1051, 1049, 1052, 1054, 1041, 1058, 1053,
- 1040, 0, 1042, 1058, 0, 1061, 1043, 0, 1054, 1044,
-
- 1045, 1048, 1049, 1057, 1044, 1045, 1048, 1053, 1050, 1050,
- 1055, 1049, 1062, 1054, 1057, 1051, 1053, 1052, 1060, 1061,
- 1058, 1060, 1061, 1064, 1055, 1062, 1063, 1065, 1066, 1067,
- 1057, 1068, 1070, 1063, 1064, 1072, 1065, 1055, 1073, 1062,
- 1069, 1067, 1066, 1075, 1060, 1060, 1071, 1069, 1060, 0,
- 1064, 1073, 1076, 1063, 1065, 1066, 1067, 1072, 1071, 1078,
- 1077, 1079, 1072, 1068, 1070, 1073, 1077, 1069, 1086, 1075,
- 1075, 1080, 1081, 1071, 1082, 1083, 1076, 1084, 1089, 1076,
- 1087, 1078, 1080, 1079, 1088, 1090, 1078, 1077, 1079, 1086,
- 1081, 1087, 1084, 1093, 1092, 1086, 1082, 1083, 1080, 1081,
-
- 1091, 1082, 1083, 1092, 1084, 1088, 1094, 1087, 1096, 1099,
- 1089, 1088, 1090, 1095, 1098, 1100, 1096, 1093, 1091, 1097,
- 1093, 1092, 1095, 1099, 1101, 1102, 1097, 1091, 1103, 1105,
- 1107, 1104, 1094, 1094, 0, 1096, 1099, 1106, 1098, 1110,
- 1095, 1098, 1111, 1109, 1112, 1113, 1097, 1100, 1110, 1111,
- 1103, 1114, 1117, 1104, 0, 1103, 1101, 1102, 1104, 1106,
- 1120, 1105, 1107, 1115, 1106, 1109, 1110, 1113, 1116, 1111,
- 1109, 1118, 1113, 1121, 1117, 1119, 1112, 1122, 1114, 1117,
- 1118, 1115, 1124, 1119, 1120, 1123, 1116, 1120, 1125, 1127,
- 1115, 1124, 1128, 1122, 0, 1116, 1129, 1121, 1118, 1131,
-
- 1121, 0, 1119, 1125, 1122, 1126, 1130, 1123, 1129, 1124,
- 1132, 1135, 1123, 1126, 1133, 1125, 1134, 1138, 1132, 1143,
- 1135, 1127, 1139, 1129, 1128, 1137, 1131, 1133, 1130, 1144,
- 1139, 1134, 1126, 1130, 1137, 1138, 1145, 1132, 1135, 1142,
- 1140, 1133, 1140, 1134, 1138, 0, 1143, 1142, 1144, 1139,
- 1146, 1149, 1137, 1147, 1152, 1151, 1144, 1150, 1145, 1154,
- 1147, 1153, 1156, 1145, 1149, 1157, 1142, 1140, 1155, 1150,
- 1151, 1159, 1146, 0, 1158, 1155, 1152, 1146, 1149, 1153,
- 1147, 1152, 1151, 1160, 1150, 1158, 1154, 1161, 1153, 1162,
- 1163, 1164, 1165, 1159, 1156, 1155, 0, 1157, 1159, 1166,
-
- 1167, 1158, 1162, 1163, 1165, 1171, 1173, 1166, 1160, 1161,
- 1160, 1168, 1172, 1164, 1161, 1173, 1162, 1163, 1164, 1165,
- 1167, 1169, 1174, 1168, 1175, 1172, 1166, 1167, 1176, 1169,
- 0, 1181, 1171, 1173, 1174, 1176, 1179, 1182, 1168, 1172,
- 1180, 1183, 1186, 1177, 0, 1175, 1192, 1184, 1169, 1174,
- 1186, 1175, 1177, 1181, 1177, 1176, 1185, 1177, 1181, 1179,
- 1184, 1183, 1187, 1179, 1182, 1177, 1180, 1180, 1183, 1186,
- 1177, 1187, 1188, 1189, 1184, 1193, 1191, 1190, 1192, 1177,
- 1185, 1177, 1195, 1185, 1177, 1190, 1196, 1198, 1194, 1187,
- 1188, 1191, 0, 1203, 1196, 1189, 1199, 1193, 1195, 1188,
-
- 1189, 1194, 1193, 1191, 1190, 1200, 1202, 1204, 0, 1195,
- 1201, 0, 1205, 1196, 1198, 1194, 1203, 1201, 1199, 1206,
- 1203, 1207, 1217, 1199, 1205, 1204, 1208, 1200, 1202, 1207,
- 1209, 1206, 1200, 1202, 1204, 1208, 1210, 1201, 1213, 1205,
- 1211, 1212, 1209, 1214, 1213, 1215, 1206, 1216, 1207, 1212,
- 1208, 1218, 1214, 1208, 1217, 1211, 1210, 1209, 1218, 1216,
- 0, 1220, 1208, 1210, 1219, 1213, 1215, 1211, 1212, 1221,
- 1214, 1219, 1215, 1226, 1216, 1222, 1224, 1223, 1218, 1220,
- 1225, 1221, 1225, 1222, 1224, 1226, 1227, 1228, 1220, 1230,
- 1233, 1219, 1223, 1231, 1228, 1232, 1221, 1236, 1237, 1234,
-
- 1226, 1235, 1222, 1224, 1223, 1231, 1234, 1225, 1232, 1233,
- 1238, 1242, 1235, 1237, 1228, 1238, 1240, 1233, 1227, 1236,
- 1231, 1230, 1232, 1239, 1236, 1237, 1234, 1241, 1235, 1240,
- 1244, 1239, 1246, 1245, 1248, 0, 1250, 1242, 1242, 1247,
- 0, 1241, 1238, 1240, 1244, 0, 0, 1251, 0, 1252,
- 1239, 1245, 1249, 0, 1241, 1243, 1248, 1244, 1253, 1243,
- 1245, 1248, 1243, 1243, 1246, 1247, 1247, 1243, 1250, 1251,
- 1249, 1252, 1254, 1243, 1251, 1255, 1252, 1243, 1254, 1249,
- 1257, 1243, 1243, 1258, 1253, 1253, 1243, 1257, 0, 1243,
- 1243, 1256, 1258, 1256, 1243, 1259, 1260, 1262, 1261, 1254,
-
- 1243, 1255, 1255, 1263, 1243, 1261, 1265, 1257, 1264, 1266,
- 1258, 0, 1267, 1268, 1260, 1256, 1263, 1264, 1256, 1262,
- 1256, 1271, 0, 1260, 1262, 1261, 1273, 1259, 1269, 0,
- 1263, 1272, 1281, 1275, 1267, 1264, 1268, 1281, 1265, 1267,
- 1268, 1266, 1269, 1271, 1272, 1277, 1274, 1274, 1271, 1275,
- 1278, 1280, 1273, 1273, 1283, 1269, 1270, 1279, 1272, 1283,
- 1275, 1270, 1278, 1270, 1281, 1270, 1279, 1270, 1277, 1280,
- 1290, 1282, 1277, 1284, 1270, 1274, 0, 1278, 1280, 1286,
- 1285, 1283, 1291, 1270, 1279, 0, 0, 0, 1270, 1282,
- 1270, 1287, 1270, 1285, 1270, 1284, 1288, 1286, 1282, 1287,
-
- 1284, 1289, 1290, 1293, 1288, 1292, 1286, 1285, 1291, 1291,
- 1299, 1294, 1295, 1296, 1289, 1297, 1298, 1302, 1287, 1299,
- 1292, 1304, 1293, 1288, 1294, 1300, 1296, 1300, 1289, 1301,
- 1293, 1307, 1292, 1297, 1295, 1303, 1298, 1299, 1294, 1295,
- 1296, 1305, 1297, 1298, 1302, 1308, 1309, 1303, 1304, 1311,
- 1312, 1301, 1300, 1310, 1309, 1307, 1301, 1312, 1307, 1313,
- 0, 1314, 1303, 1315, 1316, 1319, 1305, 1308, 1305, 1317,
- 1316, 1310, 1308, 1309, 1320, 1317, 1311, 1312, 1318, 1321,
- 1310, 1320, 1324, 1322, 1318, 1315, 1313, 1314, 1314, 1321,
- 1315, 1316, 1319, 1323, 1325, 1326, 1317, 1331, 1327, 1328,
-
- 1323, 1320, 1334, 1330, 1332, 1318, 1321, 1322, 1328, 1331,
- 1322, 1333, 1335, 1326, 1324, 1334, 1325, 1336, 1332, 1337,
- 1323, 1325, 1326, 1327, 1331, 1327, 1328, 1330, 1338, 1334,
- 1330, 1332, 1339, 1333, 1335, 1340, 1336, 0, 1333, 1335,
- 1342, 1337, 1341, 1344, 1336, 1343, 1337, 1347, 1348, 1342,
- 1353, 1345, 1338, 1351, 1339, 1338, 1352, 1354, 1353, 1339,
- 1349, 1340, 1340, 1344, 1341, 1345, 1343, 1342, 1350, 1341,
- 1344, 1355, 1343, 1354, 1352, 1358, 1360, 1353, 1345, 1347,
- 1348, 1356, 1349, 1352, 1354, 1351, 1366, 1349, 1356, 1361,
- 1350, 1359, 1362, 1360, 1364, 1350, 1365, 1358, 1355, 1362,
-
- 1359, 1361, 1358, 1360, 1368, 1363, 0, 1366, 1356, 1363,
- 1372, 1369, 0, 1366, 1370, 1371, 1361, 1369, 1359, 1362,
- 1373, 1370, 1371, 1375, 1369, 1372, 1364, 1376, 1365, 1377,
- 1374, 1377, 1363, 1373, 1376, 0, 1368, 1372, 1369, 1374,
- 1379, 1370, 1371, 1378, 1369, 1380, 1382, 1373, 1387, 1375,
- 1375, 1381, 1378, 1384, 1376, 1381, 1377, 1374, 1385, 0,
- 1386, 1384, 1379, 1385, 1388, 1390, 1387, 1379, 1382, 1386,
- 1378, 1389, 1380, 1382, 1398, 1387, 1391, 1390, 1381, 1391,
- 1384, 1393, 1392, 1388, 1389, 1392, 1394, 1386, 1391, 1395,
- 1385, 1388, 1390, 1397, 1399, 1400, 1403, 1398, 1389, 1393,
-
- 1400, 1398, 1395, 1391, 1392, 1403, 1391, 1401, 1393, 1392,
- 1399, 1394, 1392, 1394, 1404, 1401, 1395, 1402, 1402, 0,
- 1405, 1399, 1407, 1403, 1406, 1397, 1408, 1400, 1409, 1413,
- 1410, 1407, 1412, 1408, 1401, 1415, 1404, 1410, 1413, 1414,
- 1416, 1404, 1405, 1417, 1402, 1412, 1406, 1405, 1414, 1407,
- 1409, 1406, 1417, 1408, 1419, 1409, 1413, 1410, 1420, 1412,
- 1418, 1415, 1415, 1416, 1421, 1423, 1414, 1416, 1418, 1422,
- 1417, 1424, 1425, 1420, 1426, 1421, 0, 1422, 1423, 0,
- 1427, 0, 1426, 1424, 1425, 1420, 1419, 1418, 1428, 1429,
- 0, 1421, 1423, 1433, 1430, 1432, 1422, 1434, 1424, 1425,
-
- 1431, 1426, 1427, 1430, 1437, 1435, 1431, 1427, 1428, 1434,
- 1436, 1429, 1438, 1432, 1439, 1428, 1429, 1436, 1442, 1433,
- 1433, 1430, 1432, 1435, 1434, 1440, 1443, 1431, 1441, 1444,
- 1437, 1437, 1435, 1445, 1447, 1446, 1448, 1436, 1440, 1445,
- 1444, 1449, 0, 1450, 1438, 1442, 1439, 1443, 1451, 1453,
- 0, 0, 1440, 1443, 1441, 1441, 1444, 1446, 1454, 1455,
- 1445, 0, 1446, 1456, 1457, 1458, 1447, 1460, 1448, 1450,
- 1450, 1459, 1456, 1449, 1451, 1451, 1453, 1455, 1458, 1457,
- 1461, 1454, 1462, 1459, 1463, 1454, 1455, 1460, 1464, 1462,
- 1456, 1457, 1458, 1466, 1460, 1465, 1473, 1467, 1459, 1468,
-
- 1470, 1466, 1467, 1463, 1468, 1469, 1461, 1461, 1465, 1462,
- 1464, 1463, 1469, 1471, 1473, 1464, 1472, 1474, 1478, 1479,
- 1466, 1471, 1465, 1473, 1472, 1475, 1470, 1470, 1476, 1467,
- 1480, 1468, 1469, 1475, 1482, 1476, 1477, 1480, 0, 1474,
- 1471, 1479, 0, 1472, 1474, 1477, 1479, 1481, 1481, 1484,
- 1478, 1483, 1475, 1485, 1486, 1476, 1487, 1480, 0, 1483,
- 1488, 1489, 1486, 1477, 1487, 1490, 1482, 1491, 1488, 1489,
- 1484, 1492, 1493, 1490, 1481, 1494, 1484, 1492, 1483, 1495,
- 1491, 1486, 1496, 1487, 1493, 1485, 1499, 1488, 1489, 1497,
- 1496, 1500, 1490, 1498, 1491, 1501, 1502, 1497, 1492, 1493,
-
- 1503, 1494, 1494, 1495, 1509, 0, 1495, 1504, 1498, 1496,
- 1505, 1506, 1508, 1499, 1503, 1506, 1497, 1501, 1500, 1502,
- 1498, 1508, 1501, 1502, 1505, 1504, 1509, 1503, 1506, 1510,
- 1513, 1509, 1512, 1511, 1504, 1515, 1506, 1505, 1506, 1508,
- 1511, 1510, 1506, 1512, 1514, 1518, 1516, 1517, 1519, 1520,
- 1526, 1524, 0, 0, 1523, 1506, 1510, 1513, 1516, 1512,
- 1511, 1517, 1521, 1523, 1527, 1534, 1514, 1515, 1533, 1524,
- 1519, 1514, 1520, 1516, 1517, 1519, 1520, 1518, 1524, 1522,
- 1525, 1523, 1526, 1529, 1531, 1521, 1522, 1525, 0, 1521,
- 1531, 1527, 1529, 1532, 1533, 1533, 1535, 1534, 1537, 1540,
-
- 1539, 1541, 1542, 1535, 1548, 1543, 1522, 1525, 1546, 1545,
- 1529, 1531, 1541, 1542, 1546, 1532, 1543, 1550, 0, 1556,
- 1532, 0, 1548, 1535, 1539, 1537, 1540, 1539, 1541, 1542,
- 1547, 1548, 1543, 1545, 1549, 1546, 1545, 1547, 1551, 1552,
- 1553, 1549, 1554, 1550, 1550, 1552, 1555, 1559, 1553, 1557,
- 1551, 1556, 1558, 1561, 0, 1561, 1559, 1547, 1563, 1555,
- 1560, 1549, 1568, 0, 1554, 1551, 1552, 1553, 1564, 1554,
- 1558, 1562, 1560, 1555, 1559, 1557, 1557, 1565, 1562, 1558,
- 1561, 1564, 1567, 1566, 1563, 1563, 1565, 1560, 1569, 1568,
- 1570, 0, 1571, 1579, 1567, 1564, 1572, 1570, 1562, 1573,
-
- 1574, 1572, 1575, 0, 1565, 1566, 1576, 1573, 1577, 1567,
- 1566, 1569, 1580, 1584, 1576, 1569, 1574, 1570, 1571, 1571,
- 1579, 1582, 1584, 1572, 1581, 1575, 1573, 1574, 1585, 1575,
- 1577, 1583, 1593, 1576, 1587, 1577, 1580, 1589, 1581, 1580,
- 1584, 1585, 1583, 1582, 1586, 1586, 1590, 1587, 1582, 1594,
- 1591, 1581, 1586, 1592, 1588, 1585, 1588, 1591, 1583, 1593,
- 1592, 1587, 1595, 1589, 1589, 1597, 1598, 1594, 1590, 1599,
- 1603, 1586, 1586, 1590, 1601, 1596, 1594, 1591, 1600, 0,
- 1592, 1588, 1596, 1603, 1595, 1600, 1604, 1605, 1598, 1595,
- 1597, 1606, 1597, 1598, 1608, 1605, 1609, 1603, 1610, 1609,
-
- 1611, 1599, 1596, 1614, 1612, 1600, 1601, 1616, 1615, 1621,
- 1613, 1617, 1606, 1604, 1605, 1614, 1608, 1612, 1606, 1613,
- 1617, 1608, 1619, 1609, 1610, 1610, 1611, 1611, 1618, 1619,
- 1614, 1612, 1615, 1616, 1616, 1615, 1620, 1613, 1617, 1620,
- 1622, 1621, 0, 1618, 1628, 1623, 1625, 1629, 1626, 1619,
- 1627, 1620, 1627, 1630, 1631, 1618, 1630, 1632, 1634, 1636,
- 1620, 1623, 1622, 1620, 1625, 1633, 1620, 1622, 1628, 1623,
- 1626, 1628, 1623, 1625, 1629, 1626, 1635, 1627, 1620, 1637,
- 1630, 1638, 1643, 1642, 1634, 1634, 1631, 1633, 1623, 1632,
- 1639, 1636, 1633, 1641, 1644, 1638, 1640, 1645, 1647, 1639,
-
- 1641, 1637, 1635, 1635, 1640, 1646, 1637, 1642, 1638, 1648,
- 1642, 1649, 1650, 1648, 1643, 1651, 1652, 1639, 0, 0,
- 1641, 1653, 0, 1640, 1655, 1652, 1644, 1646, 1653, 1645,
- 1647, 1655, 1646, 1649, 1656, 1661, 1648, 1651, 1649, 1650,
- 1657, 1654, 1651, 1652, 1658, 1659, 1664, 1656, 1653, 1654,
- 1660, 1655, 1660, 1657, 1659, 1662, 1663, 1658, 1661, 1666,
- 1667, 1656, 1661, 1669, 1663, 1668, 1664, 1657, 1654, 1670,
- 1671, 1658, 1659, 1664, 1666, 1667, 1670, 1660, 1672, 1668,
- 1662, 1671, 1662, 1663, 1674, 1672, 1666, 1667, 1673, 1676,
- 1674, 1677, 1668, 1679, 0, 1669, 1670, 1671, 1677, 1678,
-
- 1681, 1673, 1680, 1683, 1682, 1672, 1683, 1685, 1679, 0,
- 1684, 1674, 1681, 1687, 0, 1673, 1676, 1682, 1677, 1684,
- 1679, 1678, 1693, 1686, 1693, 1685, 1678, 1681, 1680, 1680,
- 1683, 1682, 1689, 1687, 1685, 1686, 1688, 1684, 1694, 1688,
- 1687, 1691, 1695, 1689, 1696, 1697, 1691, 1698, 0, 1693,
- 1686, 1699, 1700, 1691, 1688, 1703, 1698, 0, 1712, 1689,
- 1697, 1704, 1694, 1688, 1705, 1694, 1688, 1701, 1691, 1695,
- 1713, 1696, 1697, 1691, 1698, 1699, 1702, 1703, 1699, 1700,
- 1708, 1701, 1703, 0, 1702, 1704, 1705, 1706, 1704, 1707,
- 1712, 1705, 1711, 1709, 1701, 1706, 1718, 1713, 1708, 1710,
-
- 1707, 1709, 1710, 1702, 1714, 1715, 1717, 1708, 1716, 1718,
- 1711, 0, 1715, 1720, 1706, 1717, 1707, 1710, 1720, 1711,
- 1709, 1721, 1716, 1718, 1714, 1719, 1710, 1722, 1725, 1710,
- 1725, 1714, 1715, 1717, 1727, 1716, 1719, 1726, 1728, 1729,
- 1733, 0, 1722, 1721, 1731, 1720, 1726, 1730, 1721, 1728,
- 1732, 1730, 1719, 1732, 1722, 1725, 0, 1729, 1731, 1744,
- 1727, 1727, 1733, 1734, 1726, 1728, 1729, 1733, 1732, 1735,
- 1731, 1731, 1734, 1730, 1730, 1735, 1737, 1732, 1730, 1736,
- 1732, 1737, 1739, 1742, 1741, 1731, 1740, 1743, 1736, 1741,
- 1734, 1744, 1745, 1746, 1747, 1739, 1735, 0, 1740, 1750,
-
- 1743, 1745, 1748, 1749, 1755, 1742, 1736, 1751, 1737, 1739,
- 1742, 1741, 1754, 1740, 1743, 1753, 1749, 1757, 1756, 1745,
- 1746, 1758, 1753, 1757, 1748, 1754, 1747, 1760, 1751, 1748,
- 1749, 1750, 1756, 1765, 1751, 1762, 1755, 1766, 1767, 1754,
- 1763, 1757, 1753, 1762, 1757, 1756, 1760, 1764, 1763, 1768,
- 1757, 1769, 1765, 1758, 1760, 1764, 1767, 1770, 1774, 1766,
- 1765, 1773, 1762, 1768, 1766, 1767, 1771, 1763, 1772, 1769,
- 1775, 1770, 1776, 1777, 1764, 0, 1768, 1778, 1769, 1771,
- 1780, 1772, 1773, 1781, 1770, 1779, 1782, 1777, 1773, 1780,
- 1774, 1781, 1779, 1771, 1783, 1772, 1776, 1784, 1785, 1776,
-
- 1777, 1789, 1775, 1785, 1778, 1786, 1787, 1780, 1783, 1773,
- 1781, 1790, 1779, 1782, 1791, 1787, 1786, 1792, 1790, 1793,
- 1794, 1783, 1796, 1795, 0, 1785, 1793, 1797, 1789, 1784,
- 1800, 1797, 1786, 1787, 1801, 1799, 1804, 1791, 1790, 1792,
- 1796, 1791, 1794, 1803, 1792, 1795, 1793, 1794, 1800, 1796,
- 1795, 1799, 1802, 1806, 1797, 1803, 1805, 1800, 1801, 1808,
- 1811, 1801, 1799, 1804, 1805, 1807, 1812, 1802, 1806, 1809,
- 1803, 1810, 1816, 1807, 1817, 1811, 1814, 1826, 1815, 1802,
- 1806, 1812, 1809, 1805, 1814, 1815, 1808, 1811, 1818, 1817,
- 1819, 1810, 1807, 1812, 1820, 1821, 1809, 1818, 1810, 1822,
-
- 1825, 1817, 1824, 1814, 1816, 1815, 1827, 1829, 1828, 1826,
- 0, 1819, 1830, 1831, 1847, 1818, 1846, 1819, 1825, 1821,
- 1831, 1820, 1821, 1828, 1824, 1832, 1822, 1825, 1833, 1824,
- 1832, 1835, 1829, 1827, 1829, 1828, 1830, 1833, 1834, 1830,
- 1831, 1836, 1837, 1846, 1838, 1839, 1847, 1834, 1840, 1841,
- 0, 0, 1832, 1835, 1842, 1833, 1844, 1839, 1835, 1838,
- 1837, 1842, 1841, 1836, 0, 1834, 1843, 1841, 1836, 1837,
- 1840, 1838, 1839, 1843, 1845, 1840, 1841, 1857, 1844, 1848,
- 1850, 1842, 1851, 1844, 1852, 1848, 1845, 1853, 1843, 1841,
- 1851, 1850, 1852, 1843, 1855, 1854, 1858, 1856, 1853, 1856,
-
- 1843, 1845, 1854, 1857, 1857, 1859, 1848, 1850, 1860, 1851,
- 1856, 1852, 1861, 1866, 1853, 1860, 1862, 1868, 1867, 1855,
- 1869, 1855, 1854, 1858, 1856, 1863, 1856, 1864, 1865, 1871,
- 1873, 1863, 1859, 1864, 1865, 1860, 1874, 1872, 1877, 1861,
- 1866, 1867, 1862, 1862, 1869, 1867, 1872, 1869, 1875, 1868,
- 1875, 1879, 1863, 1876, 1864, 1865, 1880, 1881, 1874, 1878,
- 1883, 1871, 1873, 1874, 1872, 1877, 1878, 1884, 1882, 1881,
- 1885, 1886, 1887, 1879, 1882, 1875, 1890, 1876, 1879, 1892,
- 1876, 1889, 1883, 1880, 1881, 1890, 1878, 1883, 1889, 1884,
- 1901, 1898, 0, 1886, 1884, 1882, 1885, 1885, 1886, 1888,
-
- 1888, 1888, 1891, 1890, 1887, 1893, 1888, 1896, 1889, 1891,
- 1895, 1892, 1893, 1897, 1888, 1895, 1898, 1905, 1898, 1899,
- 1896, 1902, 1901, 1903, 1900, 1897, 1888, 1888, 1888, 1891,
- 1903, 1904, 1893, 1888, 1896, 1899, 1900, 1904, 1907, 1902,
- 1897, 1910, 1895, 1911, 1905, 1915, 1899, 1908, 1902, 1912,
- 1903, 1900, 1906, 1906, 1908, 1909, 1912, 1916, 1904, 1916,
- 1909, 1921, 1917, 1919, 1907, 1907, 0, 1910, 1910, 1920,
- 1911, 1923, 1915, 0, 1908, 1920, 1912, 1922, 0, 1906,
- 1917, 1919, 1909, 1925, 1916, 1924, 1926, 1927, 1922, 1917,
- 1919, 1924, 1929, 1921, 1934, 1925, 1920, 1931, 1923, 1928,
-
- 1928, 1930, 1930, 1933, 1922, 1927, 1926, 1935, 1931, 1937,
- 1925, 1938, 1924, 1926, 1927, 1936, 1934, 1941, 1929, 1929,
- 1939, 1934, 1936, 1942, 1931, 1941, 1928, 1943, 1930, 1937,
- 1944, 1945, 1948, 1946, 0, 1933, 1937, 1950, 1947, 1935,
- 1946, 1951, 1936, 1938, 1941, 1939, 1947, 1939, 1949, 1945,
- 1951, 1953, 1944, 1954, 1943, 1942, 1948, 1944, 1945, 1948,
- 1946, 1950, 1955, 1949, 1950, 1947, 1952, 1952, 1951, 1956,
- 1957, 1963, 1958, 1960, 1961, 1949, 1956, 1953, 1953, 1961,
- 1960, 1962, 1957, 1964, 1965, 1954, 1964, 0, 1958, 1973,
- 1966, 1969, 1965, 1952, 1955, 1958, 1956, 1957, 1963, 1958,
-
- 1960, 1961, 1966, 1962, 1968, 0, 1970, 1971, 1962, 1972,
- 1964, 1965, 1968, 1976, 1969, 1958, 1973, 1966, 1969, 1974,
- 0, 1975, 1978, 1977, 1984, 1980, 1975, 1972, 1971, 1977,
- 1979, 1968, 1970, 1970, 1971, 1978, 1972, 1975, 1979, 1989,
- 1976, 1987, 1974, 1990, 1981, 0, 1974, 1980, 1975, 1978,
- 1977, 1981, 1980, 1975, 1982, 1983, 1984, 1979, 1985, 1988,
- 1986, 1982, 1983, 1987, 1997, 1991, 1989, 1985, 1987, 1990,
- 1990, 1981, 1986, 1988, 1994, 1993, 1995, 1996, 1999, 1994,
- 2001, 1982, 1983, 1995, 2000, 1985, 1988, 1986, 1991, 2000,
- 1994, 1997, 1991, 1993, 2003, 2004, 2004, 2005, 2006, 1996,
-
- 2007, 1994, 1993, 1995, 1996, 1999, 1994, 2010, 2009, 0,
- 2012, 2014, 2001, 2006, 2011, 2013, 2000, 2013, 2016, 2005,
- 2017, 0, 2004, 2009, 2005, 2006, 2003, 2020, 2015, 2011,
- 2010, 2018, 2007, 2015, 2010, 2009, 2012, 2012, 2019, 2018,
- 2024, 2011, 2013, 2014, 2021, 2019, 2023, 2017, 2024, 2020,
- 2016, 2027, 2025, 2029, 2020, 2015, 2028, 2030, 2018, 2021,
- 2032, 2023, 2031, 2036, 2033, 2019, 2034, 2024, 0, 2031,
- 0, 2021, 2038, 2023, 2025, 2027, 2035, 2040, 2027, 2025,
- 2029, 2036, 2028, 2028, 2030, 2033, 2042, 2041, 2034, 2031,
- 2036, 2033, 2032, 2034, 2038, 2044, 2045, 2035, 2046, 2038,
-
- 2047, 2040, 2041, 2035, 2040, 2052, 2048, 2049, 2050, 2053,
- 2044, 2045, 2042, 2042, 2041, 2051, 2053, 2055, 2057, 2054,
- 2046, 2059, 2044, 2045, 2048, 2046, 2055, 2047, 2058, 2049,
- 2050, 2061, 2052, 2048, 2049, 2050, 2053, 2054, 2060, 2051,
- 2056, 2057, 2051, 2062, 2055, 2057, 2054, 2060, 2056, 2061,
- 2058, 2063, 2062, 2059, 2066, 2058, 0, 2065, 2061, 2067,
- 2072, 2068, 2069, 2066, 2063, 2060, 2070, 2056, 2065, 2069,
- 2062, 0, 2071, 2078, 2073, 2072, 2074, 2067, 2063, 2068,
- 2073, 2066, 2075, 2065, 2065, 2087, 2067, 2072, 2068, 2069,
- 2071, 2080, 2070, 2070, 2081, 2065, 2075, 2082, 2074, 2071,
-
- 2078, 2073, 2083, 2074, 2085, 2081, 2086, 2090, 2082, 2075,
- 2088, 2100, 2089, 2083, 2091, 2080, 2085, 2087, 2080, 2086,
- 2088, 2081, 2092, 2091, 2082, 2093, 2095, 0, 2096, 2083,
- 2099, 2085, 2090, 2086, 2090, 2101, 2098, 2088, 2089, 2089,
- 2098, 2091, 2103, 2100, 2093, 2102, 0, 2103, 2101, 2092,
- 2105, 2099, 2093, 2095, 2096, 2096, 2106, 2099, 2108, 2104,
- 2109, 2107, 2101, 2098, 2106, 2102, 2104, 2107, 2110, 2103,
- 2112, 2112, 2102, 2108, 2111, 2109, 2105, 2105, 2113, 2119,
- 2110, 0, 2106, 2106, 2118, 2108, 2104, 2109, 2107, 2111,
- 2113, 2106, 2114, 2116, 2117, 2110, 2114, 2112, 2117, 2118,
-
- 2116, 2111, 2122, 2120, 2128, 2113, 2119, 2121, 2124, 2114,
- 2123, 2118, 2120, 2128, 2121, 2124, 2126, 2114, 2129, 2114,
- 2116, 2117, 2127, 2114, 2130, 2137, 2122, 2139, 2132, 2122,
- 2120, 2128, 2123, 2134, 2121, 2124, 2114, 2123, 2126, 2135,
- 2129, 2136, 2134, 2126, 2130, 2129, 2132, 2127, 2141, 2127,
- 2137, 2130, 2137, 2138, 2142, 2132, 2136, 2135, 2143, 2139,
- 2134, 2138, 2144, 2144, 2145, 2146, 2135, 2142, 2136, 2149,
- 2150, 2147, 2148, 2141, 2152, 2141, 2151, 0, 2149, 2150,
- 2138, 2142, 2153, 2151, 0, 2143, 2145, 2154, 2157, 2144,
- 2146, 2145, 2146, 2147, 2148, 2155, 2149, 2150, 2147, 2148,
-
- 2156, 2154, 2161, 2151, 2153, 2156, 2152, 2157, 2159, 2153,
- 2155, 2160, 0, 2162, 2154, 2157, 2159, 2163, 2164, 2165,
- 2166, 2167, 2155, 2170, 2160, 0, 2165, 2169, 2168, 2161,
- 2164, 2170, 2156, 2163, 2171, 2159, 2169, 2173, 2160, 2162,
- 2162, 2172, 2170, 2167, 2163, 2164, 2165, 2174, 2167, 2175,
- 2170, 2177, 2166, 2168, 2169, 2168, 2172, 2176, 2170, 2179,
- 2177, 2171, 2180, 2173, 2173, 2180, 2181, 2175, 2172, 2182,
- 2184, 0, 2183, 2174, 2174, 2182, 2175, 2183, 2177, 2176,
- 2180, 2185, 2179, 2186, 2176, 2184, 2179, 2188, 2194, 2180,
- 2189, 2181, 2180, 2181, 2190, 2192, 2182, 2184, 2186, 2185,
-
- 2193, 2195, 2188, 2200, 2183, 2200, 2194, 2193, 2185, 2192,
- 2186, 2196, 2189, 2201, 2188, 2194, 2190, 2189, 2199, 2202,
- 2196, 2190, 2192, 2197, 2198, 2203, 2201, 2193, 2195, 2199,
- 2200, 2202, 2197, 2198, 2205, 2207, 2208, 2209, 2196, 2206,
- 2201, 0, 2207, 0, 0, 2199, 2202, 2203, 2211, 2205,
- 2197, 2198, 2203, 2210, 2206, 2214, 2216, 2211, 2208, 2209,
- 2218, 2205, 2207, 2208, 2209, 2217, 2206, 2221, 2214, 2217,
- 2219, 2210, 2218, 2222, 2224, 2211, 2214, 2216, 2223, 2219,
- 2210, 2225, 2214, 2216, 2220, 2221, 2220, 2218, 2228, 2227,
- 2225, 2226, 2217, 2229, 2221, 2214, 2223, 2219, 2231, 2226,
-
- 2222, 2224, 2232, 2235, 2233, 2223, 2231, 2229, 2225, 2233,
- 2228, 2220, 2227, 2236, 2234, 2228, 2227, 2237, 2226, 2234,
- 2229, 2238, 2239, 2242, 2249, 2231, 0, 0, 2243, 2239,
- 2245, 2233, 2246, 2244, 2232, 2235, 2251, 2247, 2248, 2250,
- 2238, 2237, 2243, 2252, 2237, 2236, 2234, 2248, 2238, 2239,
- 2242, 2244, 2247, 2243, 2243, 2243, 2249, 2245, 2246, 2246,
- 2244, 2250, 2251, 2251, 2247, 2248, 2250, 2253, 2254, 2243,
- 2252, 2257, 2256, 0, 2258, 2259, 0, 2261, 2257, 2261,
- 2243, 2262, 2259, 2263, 2264, 2265, 2268, 2263, 0, 2253,
- 0, 2271, 0, 2268, 2253, 2256, 2264, 2258, 2257, 2256,
-
- 2254, 2258, 2259, 2262, 2261, 2266, 2267, 2265, 2262, 2269,
- 2263, 2264, 2265, 2268, 2266, 2270, 2272, 2267, 2271, 2274,
- 2270, 2275, 2273, 2276, 2276, 2278, 2277, 0, 2283, 2279,
- 2275, 2269, 2266, 2267, 2273, 2277, 2269, 2279, 2280, 2272,
- 2278, 2274, 2270, 2272, 2281, 2282, 2274, 2285, 2275, 2273,
- 2276, 2286, 2278, 2277, 2282, 2283, 2279, 0, 2281, 2286,
- 2280, 2287, 2288, 2289, 2295, 2280, 2285, 2289, 2299, 2287,
- 2288, 2281, 2282, 2290, 2285, 2291, 2290, 2293, 2286, 2292,
- 2294, 2297, 2299, 2291, 2300, 2292, 2294, 2304, 2287, 2288,
- 2289, 2301, 2293, 2297, 2302, 2299, 2295, 2300, 2303, 2307,
-
- 2290, 2305, 2291, 2306, 2293, 2303, 2292, 2294, 2297, 2309,
- 2310, 2300, 2301, 2307, 2304, 2311, 2312, 2308, 2301, 2302,
- 2308, 2302, 2309, 2305, 2310, 2303, 2307, 2306, 2305, 2313,
- 2306, 2314, 2316, 2315, 0, 2317, 2309, 2310, 2318, 0,
- 2320, 2311, 2311, 2312, 2308, 2315, 2316, 2321, 2319, 2322,
- 2324, 2319, 2328, 0, 2313, 2329, 2313, 2331, 2314, 2316,
- 2315, 2317, 2317, 2325, 2318, 2318, 2319, 2320, 2327, 2333,
- 2325, 2322, 2324, 2326, 2321, 2319, 2322, 2324, 2319, 2328,
- 2326, 2330, 2329, 2327, 2331, 2332, 2334, 2335, 2336, 2330,
- 2325, 2337, 2338, 2339, 2332, 2327, 2333, 2340, 2334, 2344,
-
- 2326, 2345, 2342, 2341, 2347, 2338, 0, 2340, 2330, 2335,
- 2342, 2339, 2332, 2334, 2335, 2336, 2341, 2346, 2337, 2338,
- 2339, 2344, 0, 2348, 2340, 2346, 2344, 2349, 2345, 2342,
- 2341, 2347, 2348, 2351, 2350, 0, 2352, 2353, 2354, 0,
- 2355, 2356, 2360, 0, 2346, 2359, 2354, 2358, 0, 2349,
- 2348, 2352, 2355, 2359, 2349, 2350, 0, 2351, 0, 2358,
- 2351, 2350, 2352, 2352, 2353, 2354, 2356, 2355, 2356, 2360,
- 2362, 2363, 2359, 2365, 2358, 2364, 2366, 2362, 2352, 2364,
- 2367, 2368, 2369, 2363, 2370, 2365, 2373, 2374, 2376, 2368,
- 2375, 0, 0, 2371, 2374, 0, 2370, 2362, 2363, 2366,
-
- 2365, 2376, 2364, 2366, 2369, 2371, 2379, 2367, 2368, 2369,
- 2375, 2370, 2377, 2373, 2374, 2376, 2378, 2375, 2379, 2381,
- 2371, 2377, 2380, 2380, 2382, 2378, 2386, 2383, 0, 2387,
- 2390, 0, 2390, 2379, 2391, 0, 0, 2388, 2384, 2377,
- 0, 2389, 2382, 2378, 2387, 2381, 2381, 2393, 2391, 2380,
- 2396, 2382, 2383, 2384, 2383, 2384, 2387, 2390, 2386, 2388,
- 2392, 2391, 2384, 2389, 2388, 2384, 2392, 2397, 2389, 2393,
- 2394, 2394, 2396, 2398, 2393, 2400, 2399, 2396, 2401, 2402,
- 2384, 2403, 2384, 2404, 2407, 2402, 2407, 2392, 2399, 2397,
- 2405, 2406, 2410, 2403, 2397, 2398, 2409, 2394, 2416, 2410,
-
- 2398, 2417, 2408, 2399, 2411, 0, 2402, 2400, 2403, 2412,
- 2401, 2407, 2405, 2406, 2413, 2404, 2408, 2405, 2406, 2410,
- 2409, 2414, 2411, 2409, 2415, 2423, 2418, 2412, 2420, 2408,
- 2416, 2411, 2413, 2417, 2424, 2420, 2412, 2415, 2422, 2414,
- 2425, 2413, 2426, 2423, 2427, 2422, 0, 2428, 2414, 2418,
- 2426, 2415, 2423, 2418, 2429, 2420, 2430, 2434, 2430, 2432,
- 2424, 2424, 2427, 2430, 2433, 2422, 2435, 2438, 2426, 2426,
- 2432, 2427, 2425, 2428, 2428, 2433, 2429, 2426, 2435, 2436,
- 2440, 2429, 2438, 2430, 2434, 2430, 2432, 2439, 2441, 2443,
- 2444, 2433, 2440, 2435, 2438, 2445, 2446, 2436, 2439, 2447,
-
- 0, 2448, 2445, 2441, 2450, 2451, 2436, 2440, 2452, 2453,
- 2454, 2446, 2444, 2443, 2439, 2441, 2443, 2444, 2455, 2456,
- 2457, 2460, 2445, 2446, 2458, 2459, 2447, 2448, 2448, 2451,
- 2452, 2450, 2451, 2457, 2460, 2452, 2455, 2462, 2463, 0,
- 2459, 2453, 2454, 2487, 2467, 2455, 2456, 2457, 2460, 2461,
- 2458, 2458, 2459, 2464, 2468, 2465, 2469, 2461, 2476, 0,
- 0, 2472, 2470, 2462, 2462, 2471, 2464, 2467, 2473, 0,
- 2463, 2467, 2479, 2475, 0, 2487, 2461, 2465, 2468, 2472,
- 2464, 2468, 2465, 2469, 2470, 2476, 2473, 2471, 2472, 2470,
- 2474, 2477, 2471, 2483, 2479, 2473, 2475, 2474, 2484, 2479,
-
- 2475, 2480, 2481, 2482, 2485, 2477, 2483, 0, 2480, 2481,
- 2482, 2485, 2486, 2490, 2488, 0, 2489, 2474, 2477, 2491,
- 2483, 2484, 2490, 2493, 2492, 2484, 2495, 2491, 2480, 2481,
- 2482, 2485, 2492, 2497, 2486, 2488, 2498, 2499, 2494, 2486,
- 2490, 2488, 2489, 2489, 2494, 2493, 2491, 2498, 2497, 2500,
- 2493, 2492, 2501, 2495, 2516, 2502, 0, 0, 2503, 2499,
- 2497, 2505, 2507, 2498, 2499, 2494, 2508, 2509, 0, 2511,
- 2511, 2510, 0, 2512, 2502, 2507, 2518, 2522, 2515, 2505,
- 0, 2500, 2502, 2503, 2501, 2503, 2516, 2517, 2505, 2507,
- 2519, 2509, 2508, 2508, 2509, 2510, 2511, 2524, 2510, 2512,
-
- 2512, 2515, 2517, 2518, 2522, 2515, 2524, 2526, 2519, 2530,
- 2527, 2531, 2531, 2532, 2517, 2535, 2537, 2519, 0, 2532,
- 2526, 2527, 2533, 2534, 2524, 2539, 2540, 0, 2541, 2544,
- 0, 2530, 2550, 2540, 2526, 2542, 2530, 2527, 2531, 2554,
- 2532, 2547, 2535, 2537, 2533, 2534, 2542, 2543, 2548, 2533,
- 2534, 2544, 2543, 2540, 2541, 2541, 2544, 2539, 2546, 2550,
- 2552, 2549, 2542, 2548, 2555, 2547, 2546, 2556, 2547, 2553,
- 2558, 2554, 2560, 2555, 2543, 2548, 2549, 2559, 2552, 2556,
- 2560, 2563, 2564, 2561, 2565, 2546, 2566, 2552, 2549, 0,
- 2553, 2555, 2561, 2569, 2556, 2566, 2553, 2558, 2567, 2560,
-
- 2568, 2559, 2573, 2570, 2559, 2571, 2565, 2563, 2563, 2564,
- 2561, 2565, 2578, 2566, 2568, 2569, 2567, 2573, 2571, 2574,
- 2569, 2572, 2577, 2579, 2575, 2567, 2576, 2568, 2570, 2573,
- 2570, 2575, 2571, 2576, 2572, 2580, 2581, 2582, 2583, 2578,
- 0, 2574, 2585, 2588, 2577, 2584, 2574, 2583, 2572, 2577,
- 2579, 2575, 2582, 2576, 2586, 0, 2587, 2594, 2588, 2589,
- 2590, 0, 2580, 2581, 2582, 2583, 2589, 2584, 2585, 2585,
- 2588, 2591, 2584, 2592, 2593, 2590, 2596, 2597, 2591, 2592,
- 2586, 2586, 2587, 2587, 2594, 2593, 2589, 2590, 2595, 2598,
- 2599, 2600, 2601, 2602, 0, 2603, 2595, 2607, 2591, 2604,
-
- 2592, 2593, 2603, 2596, 2597, 2598, 2600, 2605, 2602, 2608,
- 2609, 0, 2601, 0, 2605, 2595, 2598, 2599, 2600, 2601,
- 2602, 2604, 2603, 2606, 2607, 2611, 2604, 2608, 2610, 2610,
- 2606, 2612, 2611, 2614, 2605, 2613, 2608, 2609, 2613, 2615,
- 2616, 2617, 0, 2618, 2615, 2612, 2614, 2620, 2623, 2621,
- 2606, 0, 2611, 2619, 0, 2610, 2617, 2623, 2612, 2620,
- 2614, 2621, 2613, 2626, 2630, 2616, 2615, 2616, 2617, 2618,
- 2618, 2619, 2624, 2627, 2620, 2623, 2621, 2624, 2625, 2628,
- 2619, 2629, 2625, 2631, 0, 2632, 2627, 2626, 2634, 2637,
- 2626, 2630, 2636, 2638, 2639, 2640, 0, 2642, 2637, 2624,
-
- 2627, 2628, 2639, 2629, 2642, 2625, 2628, 2640, 2629, 2638,
- 2631, 2632, 2632, 2646, 2634, 2634, 2637, 2643, 2636, 2636,
- 2638, 2639, 2640, 2644, 2642, 2645, 2643, 2647, 2644, 2649,
- 2648, 2646, 2645, 2650, 2647, 2652, 2649, 2651, 2655, 0,
- 2646, 2658, 2650, 2654, 2643, 2656, 2651, 2659, 2657, 2661,
- 2644, 2662, 2645, 2657, 2647, 2648, 2649, 2648, 2656, 2658,
- 2650, 2652, 2652, 2666, 2651, 2655, 2654, 2661, 2658, 2667,
- 2654, 2663, 2656, 2664, 2659, 2657, 2661, 2665, 2662, 2668,
- 2663, 2667, 2664, 2666, 2669, 2672, 2665, 2671, 2668, 2673,
- 2666, 2670, 2674, 2669, 2675, 2671, 2667, 2681, 2663, 2676,
-
- 2664, 2675, 2670, 2677, 2665, 2672, 2668, 2679, 2676, 2680,
- 0, 2669, 2672, 2682, 2671, 2684, 2673, 2685, 2670, 2674,
- 2686, 2675, 2682, 2683, 2677, 2685, 2676, 2684, 2688, 2681,
- 2677, 2687, 2683, 2686, 2679, 2688, 2680, 2691, 2689, 2690,
- 2682, 0, 2684, 2692, 2685, 2693, 2690, 2686, 2694, 2695,
- 2683, 2699, 2697, 2687, 2689, 2688, 0, 0, 2687, 2691,
- 2697, 2703, 2701, 2700, 2691, 2689, 2690, 2702, 2692, 2699,
- 2692, 2700, 2693, 2694, 2702, 2694, 2695, 2701, 2699, 2697,
- 2704, 2711, 2712, 2703, 2705, 2706, 2710, 2714, 2703, 2701,
- 2700, 2705, 2709, 2706, 2702, 2710, 2714, 2715, 2713, 2709,
-
- 2716, 2721, 2704, 2717, 2723, 2711, 2718, 2704, 2711, 2712,
- 2713, 2705, 2706, 2710, 2714, 2717, 2716, 2722, 2729, 2709,
- 2720, 2724, 2721, 2733, 2715, 2713, 2726, 2716, 2721, 2718,
- 2717, 2723, 2720, 2718, 2727, 2724, 2728, 2731, 2726, 2732,
- 2722, 2727, 2734, 2728, 2722, 2729, 2733, 2720, 2724, 2735,
- 2733, 2736, 2731, 2726, 2737, 2738, 2739, 2732, 2741, 2736,
- 2740, 2727, 2743, 2728, 2731, 2742, 2732, 2748, 2734, 2734,
- 2749, 2740, 2742, 2741, 2739, 2749, 2735, 2738, 2736, 2750,
- 2757, 2737, 2738, 2739, 2751, 2741, 2752, 2740, 2753, 2743,
- 2754, 2755, 2742, 2748, 2748, 2761, 2756, 2749, 2751, 2764,
-
- 2752, 2769, 2753, 2758, 2759, 2766, 2750, 2757, 2754, 2755,
- 2758, 2751, 2767, 2752, 2756, 2753, 2759, 2754, 2755, 2768,
- 2769, 2764, 2761, 2756, 2771, 2767, 2764, 2766, 2769, 2770,
- 2758, 2759, 2766, 2772, 2779, 2774, 2776, 2770, 0, 2767,
- 2780, 2768, 2771, 2777, 2781, 2778, 2768, 2774, 2783, 2788,
- 0, 2771, 2772, 2784, 0, 2785, 2770, 2778, 2776, 0,
- 2772, 2779, 2774, 2776, 2789, 2777, 2781, 2780, 2782, 2786,
- 2777, 2781, 2778, 2784, 2787, 2783, 2782, 2785, 2786, 2790,
- 2784, 2788, 2785, 2787, 2793, 2791, 2789, 2792, 2794, 2797,
- 2798, 2789, 2808, 2800, 2799, 2782, 2786, 2791, 2800, 2804,
-
- 2801, 2787, 2802, 2797, 2808, 2790, 2790, 2803, 2806, 2792,
- 2805, 2793, 2791, 2809, 2792, 2794, 2797, 2798, 2799, 2808,
- 2803, 2799, 2801, 2807, 2802, 2800, 2811, 2801, 2812, 2802,
- 2806, 2804, 2809, 2805, 2803, 2806, 2810, 2805, 2814, 2813,
- 2809, 2807, 2810, 2815, 2817, 2818, 0, 2821, 0, 2819,
- 2807, 0, 0, 2814, 0, 2823, 2824, 2825, 2811, 2826,
- 2812, 2813, 2821, 2810, 2817, 2814, 2813, 2818, 2826, 2828,
- 2815, 2817, 2818, 2819, 2821, 2827, 2819, 2823, 2824, 2825,
- 2829, 2831, 2823, 2824, 2825, 2830, 2826, 2828, 2832, 2827,
- 2836, 2835, 2837, 2840, 2844, 0, 2828, 2841, 2829, 2831,
-
- 2835, 2840, 2827, 2845, 2841, 2850, 2843, 2829, 2831, 2842,
- 2832, 2830, 2830, 2837, 2843, 2832, 2842, 2846, 2835, 2837,
- 2840, 2844, 2836, 2845, 2841, 2846, 2848, 2847, 2849, 2851,
- 2845, 2853, 2850, 2843, 2855, 2859, 2842, 2851, 2848, 2856,
- 2849, 2855, 2857, 2853, 2846, 2847, 2858, 2860, 2858, 2862,
- 2861, 2863, 0, 2848, 2847, 2849, 2851, 2864, 2853, 2861,
- 2866, 2855, 2856, 2865, 2871, 2865, 2856, 2859, 2868, 2857,
- 2872, 2869, 2875, 2858, 0, 2874, 2864, 2861, 2863, 2860,
- 2873, 2862, 2866, 2878, 2864, 2869, 2868, 2866, 2874, 2876,
- 2865, 2879, 2880, 2881, 2872, 2868, 2871, 2872, 2869, 2875,
-
- 2879, 2876, 2874, 2873, 2883, 2884, 2886, 2873, 2885, 2878,
- 2878, 2888, 2891, 0, 2890, 0, 2876, 2897, 2879, 2880,
- 2881, 2890, 2892, 2899, 2886, 2900, 2901, 2894, 2884, 2896,
- 2885, 2883, 2884, 2886, 2891, 2885, 2896, 2892, 2888, 2891,
- 2893, 2890, 2894, 2897, 2897, 2893, 2902, 2903, 2904, 2892,
- 2899, 2906, 2900, 2901, 2894, 2907, 2896, 2910, 2909, 2918,
- 2911, 2903, 2904, 2912, 2907, 2909, 2914, 2913, 2916, 2915,
- 2902, 2919, 2893, 2902, 2903, 2904, 2917, 2916, 2906, 2913,
- 2923, 2920, 2907, 2915, 2910, 2909, 2911, 2911, 2924, 2917,
- 2912, 2918, 2926, 2914, 2913, 2916, 2915, 2926, 2919, 2928,
-
- 2929, 2927, 2930, 2917, 2920, 2927, 2928, 2929, 2920, 2931,
- 2924, 2932, 2923, 2932, 0, 2924, 2933, 2934, 2937, 2942,
- 2946, 2942, 0, 2930, 2926, 2944, 2928, 2929, 2927, 2930,
- 2939, 2940, 2943, 0, 0, 2949, 0, 2950, 2932, 2933,
- 2937, 2931, 2946, 2933, 2934, 2937, 2942, 2946, 2949, 2939,
- 0, 2944, 2944, 2945, 2945, 2940, 2943, 2939, 2940, 2943,
- 2947, 2948, 2949, 2945, 2950, 2951, 2952, 2954, 2948, 2947,
- 2953, 2957, 2955, 2960, 2952, 2954, 2957, 2958, 2951, 2961,
- 2945, 2945, 2958, 2953, 2962, 0, 2963, 2947, 2948, 2964,
- 2952, 2955, 2951, 2952, 2954, 2965, 2959, 2953, 2967, 2955,
-
- 2960, 2952, 0, 2957, 2959, 2961, 2961, 2966, 2971, 2958,
- 2962, 2962, 2963, 2963, 0, 2964, 2964, 2968, 2966, 2970,
- 2967, 2965, 2965, 2959, 2968, 2967, 2969, 2969, 2972, 2973,
- 2971, 2974, 2970, 2975, 2966, 2971, 2972, 2979, 2976, 2980,
- 2975, 2977, 2982, 2981, 2968, 2976, 2970, 2985, 2977, 2974,
- 2983, 2973, 2986, 2969, 2987, 2972, 2973, 2990, 2974, 2983,
- 2975, 2988, 2991, 2982, 2979, 2976, 2980, 2981, 2977, 2982,
- 2981, 2997, 2986, 2992, 2985, 2993, 2994, 2983, 2996, 2986,
- 2991, 2987, 2998, 2988, 2990, 2999, 3000, 2996, 2988, 2991,
- 3002, 2992, 3004, 2993, 2994, 0, 3007, 3004, 2997, 3001,
-
- 2992, 3006, 2993, 2994, 3000, 2996, 3002, 3001, 2999, 2998,
- 3003, 3008, 2999, 3000, 3007, 3006, 3013, 3002, 3012, 3014,
- 3016, 3019, 3003, 3007, 3004, 3018, 3001, 3018, 3006, 3017,
- 3019, 3021, 3014, 3022, 3008, 3023, 3029, 3003, 3008, 3027,
- 3012, 3027, 3017, 3013, 0, 3012, 3014, 3016, 3019, 3028,
- 3023, 3022, 3018, 3032, 3029, 3034, 3017, 3031, 3021, 3036,
- 3022, 3038, 3023, 3029, 3031, 3036, 3027, 3039, 0, 3040,
- 3034, 3028, 3041, 3044, 3048, 3043, 3028, 3046, 3045, 3049,
- 3046, 3050, 3034, 3038, 3031, 3032, 3036, 3044, 3038, 3039,
- 3041, 3045, 3051, 3056, 3039, 3040, 3040, 3043, 0, 3041,
-
- 3044, 3048, 3043, 3046, 3046, 3045, 3049, 3046, 3050, 3052,
- 3051, 3054, 3053, 3057, 3059, 3058, 3052, 3060, 3062, 3051,
- 3053, 3064, 0, 3067, 3062, 3056, 3060, 3063, 3061, 3065,
- 3064, 3070, 3066, 3054, 3066, 3057, 3052, 3058, 3054, 3053,
- 3057, 3059, 3058, 3061, 3060, 3062, 3069, 0, 3064, 3063,
- 3067, 3072, 3071, 3070, 3063, 3061, 3073, 3079, 3070, 3066,
- 3074, 3065, 3081, 3075, 3073, 0, 3082, 0, 3083, 3069,
- 0, 3084, 3074, 3069, 3071, 3075, 3081, 3072, 3072, 3071,
- 3082, 3077, 3083, 3073, 3079, 3085, 3086, 3074, 3077, 3081,
- 3075, 3087, 3088, 3082, 3084, 3083, 3092, 3086, 3084, 3087,
-
- 3089, 3093, 3090, 3085, 3091, 3094, 3094, 3095, 3077, 3090,
- 3093, 3088, 3085, 3086, 3092, 3096, 3097, 3101, 3087, 3088,
- 3100, 3102, 3089, 3092, 3097, 3100, 3106, 3089, 3093, 3090,
- 3091, 3091, 3094, 3104, 3095, 3108, 3109, 3110, 3101, 3104,
- 3111, 3115, 3096, 3097, 3101, 0, 3108, 3109, 3102, 3112,
- 3116, 3111, 3100, 3106, 3117, 3118, 3122, 3116, 3120, 3110,
- 3104, 3119, 3108, 3109, 3110, 3119, 3120, 3111, 3115, 3125,
- 3124, 3112, 3117, 3123, 3127, 3130, 3112, 3116, 3124, 0,
- 0, 3117, 3122, 3122, 3129, 3120, 3123, 3118, 3119, 3133,
- 3131, 3129, 3134, 3135, 3133, 3137, 3125, 3124, 3136, 3138,
-
- 3123, 3141, 3137, 3142, 0, 3139, 3127, 3130, 3141, 3140,
- 3136, 3129, 3131, 3146, 3144, 3143, 3133, 3131, 3138, 3134,
- 3135, 3139, 3137, 3143, 3145, 3136, 3138, 3140, 3141, 3144,
- 3148, 3145, 3139, 3150, 3147, 3142, 3140, 3154, 3149, 3156,
- 3146, 3144, 3143, 3155, 3159, 3138, 3147, 3157, 3158, 0,
- 3155, 3145, 3154, 3163, 3148, 3162, 3164, 3148, 3160, 3150,
- 3150, 3147, 3149, 3166, 3154, 3149, 3168, 3160, 0, 0,
- 3155, 3156, 3158, 3165, 3157, 3158, 3159, 3162, 3164, 3170,
- 3163, 3165, 3162, 3164, 3173, 3160, 3167, 3167, 3171, 3172,
- 3174, 3172, 3176, 3168, 3170, 3166, 3167, 3171, 3173, 3175,
-
- 3165, 3179, 3177, 3176, 3180, 3181, 3170, 3175, 3182, 3183,
- 3185, 3173, 3184, 3167, 3167, 3171, 3172, 3174, 3186, 3176,
- 3177, 3187, 3183, 3188, 3189, 3191, 3175, 3192, 3179, 3177,
- 3182, 3180, 3181, 3195, 3184, 3182, 3183, 3185, 3189, 3184,
- 3190, 3190, 3196, 3198, 3200, 3186, 3206, 3204, 3187, 3192,
- 3188, 3189, 3200, 3196, 3192, 3204, 3202, 3191, 3203, 3205,
- 3195, 3202, 3208, 3203, 3205, 3209, 3209, 3190, 3210, 3196,
- 3198, 3200, 3206, 3206, 3204, 3211, 3210, 3212, 3213, 3214,
- 3215, 3217, 3218, 3202, 3212, 3203, 3205, 3230, 3211, 3208,
- 3217, 3219, 3209, 3220, 3221, 3210, 3213, 3224, 3219, 3225,
-
- 3227, 3220, 3211, 3224, 3212, 3213, 3214, 3215, 3217, 3228,
- 3229, 3232, 3233, 3231, 3218, 0, 3221, 0, 3219, 3230,
- 3220, 3221, 3234, 3229, 3224, 3236, 3225, 3227, 3231, 3237,
- 3232, 3228, 3240, 0, 3238, 3239, 3228, 3229, 3232, 3233,
- 3231, 3238, 3239, 3241, 3234, 3242, 3244, 3245, 3236, 3234,
- 3246, 3237, 3236, 3247, 3240, 3245, 3237, 3246, 3241, 3240,
- 3247, 3238, 3239, 0, 3250, 3244, 3242, 3249, 3251, 3251,
- 3241, 3253, 3242, 3244, 3245, 3250, 3249, 3246, 3251, 3252,
- 3247, 3255, 3256, 3257, 3266, 3252, 3261, 3262, 0, 3256,
- 3258, 3250, 3260, 3253, 3249, 3251, 3251, 3267, 3253, 3260,
-
- 3268, 3262, 3273, 3255, 3274, 3276, 3252, 3280, 3255, 3256,
- 3261, 3266, 3258, 3261, 3262, 3257, 3283, 3258, 3278, 3260,
- 3275, 3281, 3281, 3268, 3267, 3285, 3274, 3268, 3275, 3273,
- 3278, 3274, 3276, 3287, 3280, 3282, 3282, 3284, 3284, 0,
- 3288, 3289, 3290, 3283, 3291, 3278, 3294, 3275, 3285, 3295,
- 3281, 3290, 3285, 3297, 3296, 3287, 3295, 3291, 3288, 3298,
- 3287, 3296, 3303, 3299, 3282, 3304, 3284, 3288, 3289, 3290,
- 3299, 3291, 3294, 3294, 3310, 3297, 3295, 3302, 3305, 3302,
- 3297, 3296, 3303, 3306, 3308, 3309, 3298, 3312, 3304, 3303,
- 3299, 3311, 3304, 3308, 3313, 3306, 3305, 3314, 3316, 3317,
-
- 3319, 3310, 3317, 3315, 3302, 3305, 3320, 3309, 3320, 3311,
- 3306, 3308, 3309, 3312, 3312, 3315, 3321, 3317, 3311, 3323,
- 3316, 3313, 3318, 3324, 3314, 3316, 3317, 3318, 3321, 3317,
- 3315, 3322, 3319, 3320, 3325, 3326, 3327, 3322, 3328, 3329,
- 3330, 3323, 3325, 3321, 3331, 3324, 3323, 3332, 3335, 3337,
- 3324, 3340, 3338, 3342, 3318, 3343, 3331, 3344, 3322, 3328,
- 3340, 3325, 3326, 3345, 3347, 3328, 3329, 3330, 3327, 3332,
- 3338, 3331, 3348, 3349, 3332, 3335, 3337, 3350, 3340, 3338,
- 3342, 3354, 3343, 3353, 3344, 3351, 3351, 3355, 3356, 3358,
- 3345, 3347, 3357, 3360, 3361, 3362, 3358, 3363, 3365, 3348,
-
- 3349, 3353, 3361, 3364, 3350, 3366, 3356, 3357, 3354, 3363,
- 3353, 3367, 3351, 3365, 3355, 3356, 3358, 3364, 3370, 3357,
- 3360, 3361, 3362, 3369, 3363, 3365, 3380, 3373, 3374, 3379,
- 3364, 3366, 3366, 3375, 3375, 3369, 3373, 3376, 3367, 3377,
- 3382, 3383, 3384, 0, 3381, 3370, 3461, 3388, 3377, 3383,
- 3369, 3384, 3374, 3379, 3373, 3374, 3379, 3381, 3380, 3385,
- 3375, 3387, 3382, 3376, 3376, 3388, 3377, 3382, 3383, 3384,
- 3385, 3381, 3391, 3392, 3388, 3395, 3395, 3396, 3461, 3405,
- 3409, 3406, 3387, 3410, 3396, 3392, 3385, 3411, 3387, 3413,
- 3417, 3416, 3415, 3422, 3409, 3391, 3415, 3422, 3420, 3391,
-
- 3392, 3405, 3395, 3427, 3396, 3406, 3405, 3409, 3406, 3416,
- 3410, 3420, 3423, 3417, 3411, 3418, 3413, 3417, 3416, 3415,
- 3422, 3424, 3418, 3426, 3425, 3420, 3428, 3430, 3423, 3427,
- 3427, 0, 0, 3429, 3431, 3426, 3430, 3434, 3440, 3423,
- 3428, 3429, 3418, 3424, 3432, 3431, 3432, 3433, 3424, 3425,
- 3426, 3425, 3435, 3428, 3430, 3434, 3436, 3437, 3438, 3433,
- 3429, 3431, 3439, 3437, 3434, 3440, 3441, 3435, 3442, 3446,
- 3439, 3432, 3448, 3441, 3433, 3450, 3449, 3452, 3436, 3435,
- 3438, 3447, 3446, 3436, 3437, 3438, 3451, 3453, 3447, 3439,
- 3442, 3455, 3454, 3441, 3449, 3442, 3446, 3456, 3455, 3448,
-
- 3454, 3457, 3450, 3449, 3452, 3458, 3465, 3459, 3447, 3459,
- 3460, 3463, 3451, 3451, 3453, 0, 3462, 3464, 3455, 3454,
- 3467, 3456, 3460, 3457, 3456, 3468, 3463, 3458, 3457, 3462,
- 3470, 3473, 3458, 3465, 3459, 3466, 3471, 3460, 3463, 3464,
- 3480, 3472, 3466, 3462, 3464, 3477, 3487, 3467, 3471, 3472,
- 3481, 3482, 3468, 3475, 3477, 3484, 3483, 3470, 3473, 3485,
- 3487, 3486, 3466, 3471, 3483, 3475, 3490, 3480, 3472, 3492,
- 3482, 3488, 3477, 3487, 3486, 3489, 3481, 3481, 3482, 3488,
- 3475, 3499, 3497, 3483, 3496, 3503, 3505, 3484, 3486, 3497,
- 3496, 3485, 3500, 3490, 3499, 3504, 3492, 3489, 3488, 3502,
-
- 3505, 3508, 3489, 3504, 3506, 3509, 3502, 3503, 3499, 3497,
- 3510, 3496, 3503, 3505, 3513, 3500, 3507, 3515, 3506, 3500,
- 3514, 3513, 3504, 3508, 3507, 3515, 3502, 3509, 3508, 3514,
- 3516, 3506, 3509, 3517, 3518, 3519, 3520, 3510, 3523, 3524,
- 0, 3513, 3521, 3507, 3515, 3522, 3523, 3514, 3526, 3528,
- 0, 3527, 3535, 0, 3530, 3517, 0, 3516, 3520, 3532,
- 3517, 3519, 3519, 3520, 3521, 3523, 3518, 3522, 3539, 3521,
- 3541, 3524, 3522, 3527, 3531, 3526, 3528, 3530, 3527, 3532,
- 3533, 3530, 3531, 3534, 3535, 3536, 3532, 3542, 3533, 3537,
- 3542, 3534, 3544, 3536, 3539, 3539, 3543, 3541, 3545, 3546,
-
- 3544, 3531, 3547, 3537, 0, 3542, 3545, 3533, 3548, 3556,
- 3534, 3552, 3536, 3546, 3542, 3554, 3537, 3542, 3543, 3544,
- 3549, 3551, 3551, 3543, 3553, 3545, 3546, 3555, 3547, 3547,
- 3548, 3556, 3553, 3559, 3549, 3548, 3556, 3552, 3552, 3557,
- 3560, 3554, 3554, 3561, 3558, 3562, 3569, 3549, 3551, 3563,
- 3565, 3553, 3558, 3555, 3555, 3564, 3566, 3567, 3565, 3557,
- 3559, 0, 3560, 3572, 3573, 3567, 3557, 3560, 3561, 3563,
- 3561, 3558, 3562, 3569, 3576, 3564, 3563, 3565, 3566, 3570,
- 3574, 3575, 3564, 3566, 3567, 3572, 3573, 3570, 3574, 3575,
- 3572, 3573, 3578, 3582, 3579, 3580, 0, 3581, 3583, 3585,
-
- 3576, 3576, 3579, 3580, 3586, 3589, 3570, 3574, 3575, 3587,
- 3595, 3592, 3596, 0, 0, 0, 0, 0, 3583, 3578,
- 3582, 3579, 3580, 3581, 3581, 3583, 3585, 3589, 0, 3587,
- 0, 3586, 3589, 3592, 3593, 3594, 3587, 3595, 3592, 3596,
- 0, 0, 3593, 3594, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 3593, 3594, 3600, 3600, 3600, 3600, 3600, 3600, 3600,
- 3601, 3601, 3601, 3601, 3601, 3601, 3601, 3602, 3602, 3602,
- 3602, 3602, 3602, 3602, 3603, 3603, 3603, 3603, 3603, 3603,
- 3603, 3604, 3604, 3604, 3604, 3604, 3604, 3604, 3605, 3605,
-
- 3605, 3605, 3605, 3605, 3605, 3606, 3606, 3606, 3606, 3606,
- 3606, 3606, 3608, 3608, 0, 3608, 3608, 3608, 3608, 3609,
- 3609, 0, 0, 0, 3609, 3609, 3610, 3610, 0, 0,
- 3610, 0, 3610, 3611, 0, 0, 0, 0, 0, 3611,
- 3612, 3612, 0, 0, 0, 3612, 3612, 3613, 0, 0,
- 0, 0, 0, 3613, 3614, 3614, 0, 3614, 3614, 3614,
- 3614, 3615, 0, 0, 0, 0, 0, 3615, 3616, 3616,
- 0, 0, 0, 3616, 3616, 3617, 3617, 0, 3617, 3617,
- 3617, 3617, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
-
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
- 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599
+ 127, 137, 136, 0, 0, 140, 134, 127, 128, 136,
+ 131, 132, 135, 138, 131, 130, 135, 140, 0, 133,
+ 138, 139, 135, 133, 134, 141, 141, 137, 137, 136,
+ 139, 143, 140, 142, 135, 146, 139, 144, 0, 135,
+
+ 138, 142, 143, 135, 139, 148, 143, 232, 139, 135,
+ 146, 144, 141, 234, 147, 143, 148, 139, 143, 149,
+ 142, 154, 146, 139, 144, 148, 152, 150, 155, 143,
+ 149, 147, 148, 143, 147, 150, 154, 152, 153, 232,
+ 147, 147, 156, 148, 158, 234, 149, 153, 154, 159,
+ 155, 157, 253, 152, 150, 155, 0, 156, 147, 153,
+ 157, 147, 159, 153, 0, 153, 158, 173, 0, 156,
+ 165, 158, 165, 165, 153, 165, 159, 170, 157, 170,
+ 170, 179, 170, 180, 253, 171, 153, 171, 171, 184,
+ 171, 173, 181, 175, 173, 175, 175, 180, 175, 182,
+
+ 189, 181, 183, 179, 186, 184, 185, 189, 179, 183,
+ 187, 182, 186, 188, 190, 180, 184, 193, 192, 181,
+ 192, 183, 187, 171, 180, 185, 182, 189, 191, 183,
+ 194, 186, 190, 185, 191, 188, 183, 187, 196, 193,
+ 188, 190, 196, 199, 193, 192, 198, 200, 0, 202,
+ 204, 255, 200, 203, 201, 207, 194, 194, 199, 196,
+ 191, 191, 201, 206, 0, 204, 196, 205, 0, 196,
+ 199, 202, 198, 198, 205, 203, 202, 204, 207, 200,
+ 203, 201, 207, 255, 208, 209, 196, 197, 210, 213,
+ 211, 206, 197, 261, 205, 206, 209, 197, 213, 214,
+
+ 215, 210, 211, 197, 197, 212, 208, 217, 212, 0,
+ 197, 208, 209, 0, 197, 210, 213, 211, 206, 197,
+ 212, 214, 215, 221, 197, 261, 214, 215, 0, 217,
+ 197, 197, 212, 218, 217, 212, 216, 219, 224, 216,
+ 218, 216, 226, 222, 231, 224, 227, 0, 219, 221,
+ 221, 237, 227, 216, 222, 216, 226, 229, 237, 0,
+ 218, 262, 216, 216, 219, 224, 216, 231, 216, 0,
+ 264, 231, 233, 227, 226, 222, 235, 233, 237, 229,
+ 216, 222, 216, 226, 229, 236, 238, 239, 240, 241,
+ 235, 240, 244, 262, 0, 242, 239, 233, 243, 233,
+
+ 246, 239, 264, 235, 233, 245, 236, 238, 241, 242,
+ 244, 246, 236, 238, 239, 240, 241, 245, 249, 244,
+ 243, 247, 242, 239, 248, 243, 250, 246, 247, 248,
+ 256, 251, 245, 252, 0, 250, 259, 256, 252, 257,
+ 249, 254, 254, 263, 259, 249, 258, 260, 247, 265,
+ 254, 263, 266, 250, 251, 267, 248, 256, 251, 268,
+ 252, 257, 269, 259, 265, 266, 257, 260, 254, 254,
+ 263, 258, 270, 258, 260, 271, 265, 280, 0, 266,
+ 272, 267, 267, 273, 272, 269, 268, 275, 274, 276,
+ 277, 278, 271, 281, 269, 275, 0, 277, 284, 282,
+
+ 271, 283, 271, 274, 270, 273, 0, 272, 276, 280,
+ 273, 291, 269, 278, 275, 274, 276, 277, 278, 271,
+ 279, 282, 285, 283, 279, 281, 282, 286, 283, 287,
+ 284, 288, 289, 290, 285, 290, 294, 292, 287, 0,
+ 286, 293, 299, 291, 288, 297, 296, 279, 298, 285,
+ 307, 289, 301, 299, 286, 296, 287, 302, 288, 289,
+ 290, 292, 294, 294, 292, 300, 293, 303, 293, 299,
+ 304, 297, 297, 296, 298, 298, 301, 300, 305, 301,
+ 302, 309, 307, 308, 302, 303, 305, 310, 304, 311,
+ 0, 313, 300, 314, 303, 315, 308, 304, 318, 312,
+
+ 316, 317, 0, 319, 0, 305, 0, 318, 317, 319,
+ 308, 321, 310, 309, 310, 314, 312, 313, 313, 320,
+ 314, 311, 312, 322, 316, 318, 312, 315, 317, 324,
+ 319, 323, 316, 320, 325, 326, 328, 321, 321, 327,
+ 323, 331, 325, 312, 326, 328, 320, 322, 332, 330,
+ 322, 316, 324, 329, 333, 345, 324, 337, 323, 336,
+ 335, 325, 326, 328, 330, 327, 327, 339, 336, 333,
+ 329, 0, 332, 331, 0, 332, 330, 329, 335, 337,
+ 329, 333, 345, 352, 337, 340, 336, 335, 0, 0,
+ 341, 339, 0, 0, 339, 342, 342, 329, 334, 340,
+
+ 338, 334, 338, 350, 0, 341, 334, 334, 334, 334,
+ 352, 0, 340, 344, 343, 338, 334, 341, 338, 343,
+ 342, 350, 342, 342, 338, 334, 354, 338, 334, 338,
+ 350, 347, 348, 334, 334, 334, 334, 344, 346, 351,
+ 344, 346, 338, 347, 348, 338, 343, 353, 346, 355,
+ 349, 349, 354, 354, 356, 357, 356, 351, 347, 348,
+ 349, 358, 360, 363, 359, 346, 351, 357, 346, 353,
+ 360, 0, 362, 361, 353, 355, 355, 349, 349, 359,
+ 361, 356, 357, 358, 362, 364, 366, 364, 358, 360,
+ 368, 359, 0, 366, 367, 363, 364, 369, 370, 362,
+
+ 361, 376, 0, 364, 370, 371, 0, 371, 374, 399,
+ 375, 364, 364, 366, 364, 372, 367, 377, 0, 369,
+ 370, 367, 368, 364, 369, 370, 374, 373, 372, 371,
+ 364, 370, 371, 376, 371, 374, 375, 375, 378, 381,
+ 373, 399, 372, 373, 377, 373, 381, 0, 0, 383,
+ 382, 373, 384, 0, 373, 0, 385, 0, 0, 410,
+ 378, 383, 387, 0, 384, 378, 381, 373, 382, 385,
+ 373, 388, 373, 379, 382, 379, 383, 382, 387, 384,
+ 390, 379, 392, 385, 388, 379, 387, 392, 391, 387,
+ 379, 410, 390, 379, 0, 382, 0, 393, 388, 379,
+
+ 379, 396, 379, 394, 393, 387, 391, 390, 379, 394,
+ 0, 395, 379, 396, 392, 391, 0, 379, 393, 395,
+ 379, 380, 397, 380, 393, 398, 400, 400, 396, 0,
+ 394, 393, 402, 398, 408, 401, 380, 403, 395, 380,
+ 397, 380, 401, 380, 0, 402, 403, 380, 380, 397,
+ 380, 405, 398, 400, 0, 0, 408, 415, 405, 402,
+ 406, 408, 401, 380, 407, 409, 380, 406, 380, 403,
+ 380, 389, 389, 403, 411, 404, 407, 409, 405, 412,
+ 413, 389, 389, 389, 389, 389, 412, 406, 389, 415,
+ 414, 407, 409, 404, 417, 413, 389, 404, 389, 389,
+
+ 411, 411, 404, 414, 418, 417, 412, 413, 389, 389,
+ 389, 389, 389, 421, 416, 389, 416, 414, 419, 419,
+ 404, 417, 420, 422, 421, 423, 418, 0, 424, 420,
+ 429, 418, 425, 0, 422, 427, 0, 430, 423, 431,
+ 421, 416, 426, 426, 437, 430, 451, 419, 428, 420,
+ 422, 431, 423, 424, 425, 424, 429, 429, 427, 425,
+ 426, 432, 427, 428, 430, 433, 431, 426, 434, 426,
+ 426, 428, 432, 451, 433, 428, 437, 435, 435, 438,
+ 439, 434, 441, 442, 0, 440, 446, 426, 432, 435,
+ 428, 435, 433, 443, 445, 434, 435, 438, 0, 443,
+
+ 441, 0, 439, 444, 435, 435, 438, 439, 440, 441,
+ 446, 447, 440, 446, 0, 442, 435, 445, 435, 436,
+ 443, 445, 448, 450, 444, 449, 452, 436, 436, 448,
+ 444, 436, 436, 447, 454, 436, 455, 450, 447, 0,
+ 456, 436, 453, 0, 459, 457, 436, 490, 452, 448,
+ 450, 449, 449, 452, 436, 436, 453, 457, 436, 436,
+ 454, 454, 436, 456, 458, 460, 459, 456, 455, 453,
+ 458, 459, 457, 461, 462, 463, 464, 0, 465, 490,
+ 466, 461, 463, 469, 467, 464, 468, 460, 470, 462,
+ 471, 458, 460, 465, 473, 0, 0, 492, 469, 461,
+
+ 461, 462, 463, 464, 466, 465, 467, 466, 461, 468,
+ 469, 467, 471, 468, 470, 470, 472, 471, 474, 478,
+ 473, 473, 472, 474, 476, 478, 480, 482, 479, 492,
+ 481, 484, 480, 482, 483, 488, 494, 485, 484, 0,
+ 487, 0, 487, 472, 488, 474, 478, 479, 481, 487,
+ 476, 476, 485, 480, 482, 479, 483, 481, 484, 489,
+ 491, 483, 488, 493, 485, 0, 489, 487, 494, 487,
+ 495, 496, 497, 491, 502, 497, 498, 500, 501, 0,
+ 499, 493, 0, 0, 496, 504, 489, 491, 503, 500,
+ 493, 497, 495, 499, 505, 503, 501, 495, 496, 497,
+
+ 498, 506, 497, 498, 500, 501, 502, 499, 507, 504,
+ 510, 508, 504, 509, 506, 503, 508, 505, 514, 509,
+ 511, 513, 512, 515, 521, 516, 505, 0, 506, 514,
+ 507, 515, 522, 510, 512, 507, 521, 510, 508, 516,
+ 509, 0, 511, 513, 505, 514, 526, 511, 513, 512,
+ 515, 521, 516, 517, 519, 522, 520, 523, 517, 522,
+ 517, 519, 520, 525, 524, 523, 517, 0, 517, 526,
+ 528, 517, 517, 526, 525, 0, 531, 0, 517, 517,
+ 517, 519, 528, 520, 523, 517, 524, 517, 527, 529,
+ 525, 524, 527, 517, 531, 517, 533, 528, 517, 517,
+
+ 535, 530, 534, 531, 530, 517, 0, 532, 533, 529,
+ 527, 529, 530, 534, 536, 527, 529, 532, 536, 527,
+ 538, 0, 540, 533, 535, 537, 541, 535, 530, 534,
+ 542, 530, 537, 539, 547, 539, 529, 544, 541, 532,
+ 548, 536, 543, 545, 532, 542, 538, 538, 540, 540,
+ 546, 545, 537, 541, 543, 546, 547, 542, 548, 550,
+ 539, 547, 551, 544, 544, 549, 553, 548, 554, 543,
+ 545, 550, 556, 549, 555, 557, 558, 546, 0, 559,
+ 0, 560, 565, 551, 553, 569, 550, 559, 558, 551,
+ 557, 554, 549, 553, 560, 554, 562, 555, 561, 563,
+
+ 564, 555, 557, 558, 556, 562, 559, 565, 560, 565,
+ 561, 567, 566, 568, 564, 566, 570, 569, 571, 572,
+ 573, 575, 563, 562, 574, 561, 563, 564, 577, 584,
+ 567, 570, 576, 575, 572, 578, 580, 574, 567, 566,
+ 568, 580, 578, 570, 573, 578, 572, 573, 575, 579,
+ 571, 574, 577, 578, 576, 577, 581, 582, 583, 576,
+ 579, 584, 578, 585, 586, 587, 588, 593, 580, 578,
+ 581, 588, 578, 589, 590, 592, 579, 591, 594, 0,
+ 590, 597, 589, 581, 582, 583, 594, 595, 596, 593,
+ 585, 586, 591, 600, 593, 601, 603, 587, 588, 592,
+
+ 589, 590, 592, 597, 591, 594, 595, 598, 597, 599,
+ 605, 598, 596, 604, 595, 596, 600, 599, 602, 603,
+ 600, 607, 604, 603, 609, 602, 606, 601, 610, 608,
+ 609, 612, 605, 614, 598, 611, 599, 605, 0, 606,
+ 604, 608, 612, 611, 615, 602, 0, 607, 607, 619,
+ 610, 609, 613, 606, 616, 610, 608, 624, 612, 613,
+ 622, 627, 611, 623, 617, 614, 615, 616, 618, 617,
+ 624, 615, 617, 617, 620, 619, 619, 618, 621, 613,
+ 625, 616, 622, 620, 624, 623, 628, 622, 617, 621,
+ 623, 617, 625, 627, 629, 618, 617, 630, 0, 617,
+
+ 617, 620, 632, 631, 628, 621, 633, 625, 635, 637,
+ 0, 634, 636, 628, 640, 638, 0, 635, 629, 630,
+ 630, 629, 634, 637, 630, 631, 632, 639, 633, 632,
+ 631, 641, 636, 633, 639, 635, 637, 638, 634, 636,
+ 642, 640, 638, 645, 643, 644, 630, 646, 642, 641,
+ 643, 647, 648, 649, 639, 653, 644, 651, 641, 650,
+ 650, 645, 646, 652, 653, 654, 658, 642, 660, 656,
+ 645, 643, 644, 648, 646, 659, 655, 649, 654, 648,
+ 649, 651, 653, 647, 651, 652, 657, 661, 650, 655,
+ 652, 656, 654, 662, 657, 662, 656, 659, 658, 663,
+
+ 660, 664, 659, 655, 665, 666, 669, 671, 667, 665,
+ 0, 661, 664, 657, 661, 668, 670, 672, 0, 666,
+ 662, 663, 667, 674, 670, 671, 663, 675, 664, 668,
+ 668, 676, 666, 673, 671, 667, 665, 668, 669, 672,
+ 673, 682, 668, 670, 672, 678, 677, 675, 679, 674,
+ 674, 676, 680, 683, 675, 683, 668, 668, 676, 681,
+ 673, 677, 680, 679, 681, 684, 692, 682, 682, 686,
+ 677, 0, 687, 677, 680, 679, 685, 678, 688, 680,
+ 683, 687, 694, 693, 685, 690, 689, 688, 677, 680,
+ 684, 681, 684, 690, 686, 689, 686, 691, 692, 687,
+
+ 694, 701, 695, 685, 691, 688, 693, 696, 697, 694,
+ 693, 0, 690, 689, 695, 698, 699, 697, 700, 696,
+ 702, 704, 706, 698, 691, 699, 703, 702, 706, 695,
+ 700, 0, 708, 701, 696, 697, 704, 0, 705, 703,
+ 699, 0, 698, 699, 748, 700, 705, 702, 704, 706,
+ 707, 709, 699, 703, 711, 708, 710, 715, 707, 708,
+ 709, 712, 712, 711, 713, 705, 714, 710, 717, 716,
+ 712, 748, 713, 719, 714, 718, 721, 707, 709, 715,
+ 0, 711, 716, 710, 715, 0, 719, 723, 712, 712,
+ 724, 713, 721, 714, 717, 717, 716, 720, 718, 722,
+
+ 719, 724, 718, 721, 726, 720, 0, 725, 727, 723,
+ 728, 735, 722, 729, 723, 725, 730, 724, 726, 730,
+ 731, 733, 732, 736, 720, 734, 722, 739, 727, 735,
+ 733, 726, 728, 729, 725, 727, 736, 728, 735, 737,
+ 729, 738, 731, 730, 732, 734, 0, 731, 733, 732,
+ 736, 740, 734, 741, 755, 0, 738, 737, 742, 739,
+ 745, 743, 746, 747, 744, 750, 737, 0, 738, 747,
+ 0, 749, 745, 740, 743, 746, 752, 741, 740, 749,
+ 741, 742, 744, 751, 757, 742, 755, 745, 743, 746,
+ 747, 744, 750, 754, 752, 756, 761, 749, 749, 758,
+
+ 760, 754, 756, 752, 762, 751, 749, 757, 764, 760,
+ 751, 757, 763, 759, 758, 759, 765, 764, 765, 775,
+ 754, 769, 756, 762, 772, 778, 758, 760, 761, 766,
+ 778, 762, 763, 769, 772, 764, 766, 775, 776, 763,
+ 759, 779, 781, 765, 783, 780, 775, 0, 769, 793,
+ 0, 772, 778, 781, 789, 793, 766, 767, 782, 776,
+ 767, 0, 779, 780, 767, 776, 784, 767, 779, 781,
+ 783, 783, 780, 785, 767, 767, 793, 767, 0, 786,
+ 795, 782, 767, 787, 767, 782, 789, 767, 786, 785,
+ 788, 767, 784, 784, 767, 813, 787, 788, 791, 794,
+
+ 785, 767, 767, 795, 767, 791, 786, 795, 794, 0,
+ 787, 792, 796, 0, 797, 796, 801, 788, 790, 790,
+ 798, 790, 813, 799, 790, 791, 794, 800, 801, 790,
+ 797, 799, 802, 792, 802, 790, 790, 797, 792, 796,
+ 803, 797, 798, 801, 790, 790, 790, 798, 790, 800,
+ 799, 790, 805, 804, 800, 806, 790, 797, 804, 802,
+ 0, 807, 790, 790, 803, 808, 811, 803, 809, 810,
+ 0, 815, 805, 807, 814, 812, 816, 817, 0, 805,
+ 0, 806, 806, 821, 816, 804, 815, 808, 807, 820,
+ 811, 810, 808, 811, 809, 809, 810, 812, 815, 814,
+
+ 817, 814, 812, 816, 817, 818, 819, 822, 820, 821,
+ 821, 823, 818, 824, 819, 826, 820, 825, 827, 822,
+ 828, 829, 830, 827, 823, 834, 825, 835, 833, 836,
+ 826, 831, 818, 819, 822, 835, 831, 837, 823, 824,
+ 824, 838, 826, 829, 825, 827, 0, 839, 829, 830,
+ 833, 840, 828, 842, 835, 833, 841, 834, 843, 837,
+ 844, 836, 846, 831, 837, 847, 848, 845, 849, 852,
+ 850, 839, 840, 838, 839, 841, 845, 849, 840, 844,
+ 842, 850, 851, 841, 846, 843, 848, 844, 847, 846,
+ 851, 854, 847, 848, 845, 849, 852, 850, 853, 855,
+
+ 856, 860, 857, 861, 858, 0, 864, 867, 0, 851,
+ 854, 857, 858, 863, 862, 865, 853, 862, 854, 860,
+ 867, 861, 866, 870, 864, 853, 855, 869, 860, 857,
+ 861, 858, 856, 864, 867, 863, 868, 870, 868, 865,
+ 863, 862, 865, 871, 866, 869, 872, 875, 871, 866,
+ 870, 873, 874, 876, 869, 875, 878, 877, 879, 872,
+ 877, 881, 882, 868, 874, 878, 879, 888, 884, 0,
+ 883, 876, 888, 872, 875, 871, 883, 873, 873, 874,
+ 876, 885, 879, 878, 877, 879, 881, 885, 881, 882,
+ 884, 886, 887, 879, 888, 884, 889, 883, 886, 887,
+
+ 891, 892, 890, 889, 891, 893, 895, 894, 885, 899,
+ 897, 0, 896, 900, 893, 894, 902, 899, 886, 887,
+ 890, 901, 898, 889, 892, 897, 900, 891, 892, 890,
+ 896, 903, 893, 898, 894, 902, 899, 897, 895, 896,
+ 900, 904, 901, 902, 903, 905, 906, 908, 901, 898,
+ 907, 910, 909, 911, 906, 914, 912, 907, 903, 909,
+ 911, 912, 914, 904, 915, 908, 916, 913, 904, 917,
+ 910, 915, 905, 906, 908, 913, 918, 907, 910, 909,
+ 911, 919, 914, 912, 920, 921, 922, 923, 925, 918,
+ 0, 915, 921, 924, 913, 927, 925, 920, 916, 926,
+
+ 928, 917, 929, 918, 930, 931, 928, 926, 932, 935,
+ 0, 920, 921, 919, 926, 925, 924, 927, 922, 923,
+ 924, 933, 927, 937, 934, 0, 926, 928, 929, 929,
+ 933, 939, 932, 936, 926, 932, 930, 931, 934, 941,
+ 936, 935, 940, 938, 941, 943, 0, 942, 933, 944,
+ 937, 934, 938, 939, 948, 940, 945, 940, 939, 942,
+ 936, 945, 948, 947, 950, 951, 940, 950, 943, 940,
+ 938, 941, 943, 946, 942, 944, 944, 957, 951, 953,
+ 946, 948, 940, 945, 940, 947, 958, 954, 960, 955,
+ 947, 950, 951, 953, 954, 955, 967, 962, 0, 959,
+
+ 946, 967, 0, 957, 957, 961, 953, 961, 0, 958,
+ 963, 959, 965, 958, 954, 960, 955, 956, 964, 956,
+ 962, 971, 963, 956, 962, 956, 959, 966, 967, 968,
+ 956, 964, 961, 971, 965, 956, 969, 963, 973, 965,
+ 966, 956, 974, 970, 956, 964, 956, 968, 971, 969,
+ 956, 972, 956, 973, 966, 970, 968, 956, 975, 977,
+ 980, 972, 956, 969, 974, 973, 970, 979, 976, 974,
+ 970, 975, 977, 972, 976, 978, 981, 982, 972, 983,
+ 984, 980, 970, 986, 1003, 975, 977, 980, 972, 979,
+ 989, 987, 988, 978, 979, 976, 987, 991, 981, 989,
+
+ 988, 992, 978, 981, 995, 0, 0, 984, 993, 982,
+ 996, 983, 991, 0, 994, 986, 1003, 989, 987, 988,
+ 990, 993, 0, 992, 991, 990, 0, 990, 992, 994,
+ 995, 995, 996, 990, 997, 993, 999, 996, 990, 990,
+ 998, 994, 1000, 1005, 1002, 990, 990, 990, 1001, 999,
+ 1000, 998, 990, 997, 990, 1002, 1001, 1004, 1005, 1006,
+ 990, 997, 1007, 999, 1010, 990, 990, 998, 1006, 1000,
+ 1005, 1002, 990, 1007, 1008, 1001, 1009, 1011, 1014, 1004,
+ 1012, 1015, 1016, 1008, 1004, 1009, 1006, 1012, 1018, 1007,
+ 1016, 1010, 1017, 1019, 1020, 1023, 1026, 0, 0, 1024,
+
+ 1011, 1008, 1018, 1009, 1011, 1015, 1027, 1012, 1015, 1016,
+ 1014, 1038, 1021, 1023, 1017, 1018, 1020, 1024, 1025, 1017,
+ 1021, 1020, 1023, 1028, 1027, 1019, 1024, 1029, 1026, 1025,
+ 1030, 1028, 1036, 1027, 1031, 1032, 1033, 1030, 1034, 1021,
+ 1035, 1040, 1032, 1038, 1044, 1025, 0, 1031, 1043, 1029,
+ 1028, 1033, 1040, 1036, 1029, 1043, 1034, 1030, 1035, 1036,
+ 1037, 1031, 1032, 1033, 1042, 1034, 1044, 1035, 1040, 1046,
+ 1037, 1044, 1045, 1048, 1047, 1043, 1049, 1042, 1055, 0,
+ 1045, 0, 1046, 1047, 1050, 1048, 1053, 1037, 1056, 1054,
+ 1057, 1042, 1058, 0, 0, 0, 1046, 1059, 1049, 1045,
+
+ 1048, 1047, 1074, 1049, 1055, 1055, 1050, 1054, 1053, 1059,
+ 1058, 1050, 1060, 1053, 1062, 1068, 1054, 1066, 1063, 1058,
+ 1056, 1067, 1057, 1063, 1059, 1062, 1060, 1065, 1068, 1066,
+ 1065, 1069, 1070, 1072, 1074, 0, 1076, 1071, 1069, 1060,
+ 1073, 1062, 1068, 1070, 1066, 1067, 1071, 1072, 1067, 1075,
+ 1063, 1077, 1073, 1065, 1065, 1078, 1075, 1065, 1069, 1070,
+ 1072, 1079, 1082, 1077, 1071, 1081, 1083, 1073, 1076, 1086,
+ 0, 0, 1083, 1084, 1079, 1085, 1075, 1078, 1077, 1088,
+ 1086, 1087, 1078, 1089, 1095, 1096, 1082, 1093, 1079, 1082,
+ 1092, 1081, 1081, 1083, 1090, 1084, 1086, 1085, 1093, 1087,
+
+ 1084, 1088, 1085, 1094, 1097, 1089, 1088, 1100, 1087, 1090,
+ 1089, 1092, 1096, 1099, 1093, 1102, 1095, 1092, 1098, 1101,
+ 1104, 1090, 1097, 1102, 1094, 1103, 1106, 1098, 1101, 1105,
+ 1094, 1097, 1103, 1100, 1100, 1107, 1108, 1099, 1109, 1110,
+ 1099, 1111, 1102, 1105, 1104, 1098, 1101, 1104, 1112, 1113,
+ 1115, 1118, 1103, 1116, 0, 1120, 1105, 1117, 1106, 0,
+ 1109, 1110, 1116, 1119, 1117, 1109, 1110, 1107, 1108, 1121,
+ 1112, 1122, 1115, 1111, 0, 1112, 0, 1115, 1123, 1124,
+ 1116, 1113, 1120, 1118, 1117, 1119, 1125, 1121, 1124, 1122,
+ 1119, 1126, 1127, 1128, 1125, 1129, 1121, 1131, 1122, 1130,
+
+ 1123, 1133, 1132, 1134, 1137, 1123, 1124, 0, 1130, 1128,
+ 1132, 1135, 1131, 1125, 1136, 1126, 1127, 1129, 1126, 1127,
+ 1128, 1139, 1129, 1135, 1131, 1144, 1130, 1140, 1141, 1132,
+ 1143, 1137, 1138, 1133, 1139, 1134, 1136, 1141, 1135, 1143,
+ 1138, 1136, 1140, 1144, 1146, 1145, 1146, 1149, 1139, 1150,
+ 1148, 1151, 1144, 1145, 1140, 1141, 1153, 1143, 1148, 1138,
+ 1152, 1160, 1155, 1153, 1158, 1157, 1159, 1156, 1150, 1162,
+ 1163, 1146, 1145, 1151, 1149, 1155, 1150, 1148, 1151, 1156,
+ 1157, 1165, 1152, 1153, 1159, 1164, 1158, 1152, 1160, 1155,
+ 1161, 1158, 1157, 1159, 1156, 1166, 1164, 1161, 1168, 1167,
+
+ 1169, 1162, 1163, 1165, 1171, 0, 1170, 1172, 1165, 1173,
+ 1177, 1168, 1164, 1169, 1179, 1172, 1171, 1161, 1174, 1181,
+ 1166, 1167, 1166, 1179, 1175, 1168, 1167, 1169, 1170, 1173,
+ 1174, 1171, 1175, 1170, 1172, 1178, 1173, 1177, 1180, 0,
+ 1181, 1179, 1182, 0, 1183, 1174, 1181, 1185, 1178, 1182,
+ 1180, 1175, 1186, 1183, 1187, 1183, 1188, 1189, 1183, 1190,
+ 0, 0, 1178, 1191, 1193, 1180, 1183, 1192, 0, 1182,
+ 1185, 1183, 1190, 1193, 1185, 1192, 1187, 1189, 1186, 1186,
+ 1183, 1187, 1183, 1188, 1189, 1183, 1190, 1191, 1194, 1195,
+ 1191, 1193, 1196, 1197, 1192, 1198, 1199, 1200, 1201, 1202,
+
+ 1196, 1204, 0, 0, 0, 1223, 1194, 1202, 1197, 1205,
+ 1200, 1195, 1206, 1208, 1201, 1194, 1195, 0, 1199, 1196,
+ 1197, 1209, 1207, 1199, 1200, 1201, 1202, 1198, 1204, 1207,
+ 1211, 1205, 1210, 1212, 1206, 1208, 1205, 1223, 1213, 1206,
+ 1208, 1215, 1211, 1214, 1209, 1212, 1213, 1217, 1209, 1207,
+ 1210, 1216, 1214, 1215, 1226, 1218, 1221, 1211, 1219, 1210,
+ 1212, 1222, 1217, 1218, 1219, 1213, 1220, 1214, 1215, 1224,
+ 1214, 1216, 1226, 1222, 1217, 1220, 1224, 1221, 1216, 1214,
+ 1225, 1226, 1218, 1221, 1228, 1219, 1227, 1225, 1222, 1229,
+ 1232, 1230, 1228, 1220, 1233, 1231, 1224, 1231, 1227, 1230,
+
+ 1236, 1234, 1232, 1237, 1229, 0, 1238, 1225, 1234, 1241,
+ 1239, 1228, 1242, 1227, 1240, 1237, 1229, 1232, 1230, 1238,
+ 1241, 1240, 1231, 1243, 0, 1252, 1233, 1248, 1234, 1239,
+ 1237, 1246, 1236, 1238, 1242, 1244, 1241, 1239, 1243, 1242,
+ 1244, 1240, 1247, 1245, 1246, 1250, 1251, 1255, 1256, 1269,
+ 1243, 1245, 1265, 1248, 1248, 1253, 1247, 1252, 1246, 1250,
+ 1271, 1259, 1269, 1254, 1251, 1255, 0, 1244, 1309, 1247,
+ 1245, 1249, 1250, 1251, 1255, 1249, 1269, 1257, 1249, 1249,
+ 1256, 1253, 1253, 1249, 1265, 1254, 1258, 1259, 1259, 1249,
+ 1254, 1261, 1271, 1249, 1260, 1309, 0, 1249, 1249, 1257,
+
+ 1260, 1262, 1249, 1262, 1257, 1249, 1249, 1263, 1258, 1266,
+ 1249, 1268, 1267, 1258, 1263, 1264, 1249, 1261, 1261, 1267,
+ 1249, 1260, 1270, 1272, 1264, 1262, 1273, 1266, 1262, 1274,
+ 1262, 1270, 1275, 1268, 1263, 1277, 1266, 1278, 1268, 1267,
+ 0, 0, 1264, 1280, 1280, 0, 1275, 1279, 1273, 1270,
+ 1278, 0, 1274, 1273, 1281, 1272, 1274, 1277, 0, 1275,
+ 1276, 1283, 1277, 1284, 1278, 1276, 0, 1276, 1286, 1276,
+ 1281, 1276, 1280, 1279, 1279, 1284, 1285, 1286, 1276, 1287,
+ 1288, 1281, 1289, 1285, 1283, 1288, 1290, 1276, 1283, 1291,
+ 1284, 1290, 1276, 1297, 1276, 1286, 1276, 1287, 1276, 1293,
+
+ 1289, 1292, 1294, 1285, 1298, 1296, 1287, 1295, 1299, 1289,
+ 1294, 1291, 1288, 1290, 1292, 1295, 1291, 1293, 1296, 1300,
+ 1301, 1302, 1304, 1299, 1303, 1297, 1293, 1311, 1292, 1294,
+ 1298, 1298, 1296, 1301, 1295, 1299, 1305, 1303, 1300, 1308,
+ 1304, 1306, 1307, 1302, 1307, 1310, 1300, 1301, 1302, 1304,
+ 1306, 1303, 1312, 1315, 1311, 0, 1305, 1310, 1314, 1316,
+ 1317, 1308, 1318, 1305, 1319, 1320, 1308, 1316, 1306, 1307,
+ 1321, 1319, 1310, 1322, 1326, 1315, 1327, 1312, 1317, 1312,
+ 1315, 1331, 1314, 1327, 1323, 1314, 1316, 1317, 1324, 1318,
+ 1323, 1319, 1320, 1325, 1324, 1322, 1321, 1321, 1328, 1325,
+
+ 1322, 1326, 1329, 1327, 1333, 1330, 1332, 0, 1328, 1334,
+ 1335, 1323, 1330, 1331, 1337, 1324, 0, 1340, 1338, 1335,
+ 1325, 1339, 1333, 1343, 1342, 1328, 1329, 1341, 1332, 1329,
+ 1338, 1333, 1330, 1332, 1334, 1339, 1334, 1335, 1337, 1340,
+ 1341, 1337, 1343, 1344, 1340, 1338, 1342, 1345, 1339, 1349,
+ 1343, 1342, 1347, 1346, 1341, 1348, 1354, 1355, 1349, 1352,
+ 1350, 1358, 0, 1351, 0, 1344, 0, 0, 1362, 1356,
+ 1344, 1345, 1357, 1352, 1345, 1346, 1349, 1348, 1347, 1347,
+ 1346, 1350, 1348, 1351, 1359, 1361, 1352, 1350, 1354, 1355,
+ 1351, 1356, 1360, 1358, 1357, 1362, 1356, 1363, 1365, 1357,
+
+ 1360, 1361, 1359, 1368, 1363, 1366, 1367, 1371, 1373, 1369,
+ 1372, 1359, 1361, 1370, 1366, 1368, 1369, 1370, 1375, 1360,
+ 1365, 1376, 0, 1367, 1363, 1365, 1379, 1376, 0, 1373,
+ 1368, 1377, 1366, 1367, 1376, 1373, 1369, 1378, 1377, 1371,
+ 1370, 1379, 1372, 1380, 1378, 1382, 1381, 1384, 1376, 1384,
+ 1375, 1385, 1383, 1379, 1376, 1381, 1380, 1387, 1377, 1383,
+ 1385, 1386, 1388, 1389, 1378, 0, 1388, 1391, 1393, 1394,
+ 1380, 1382, 1382, 1381, 1384, 1391, 1392, 1393, 1385, 1383,
+ 1395, 1392, 1404, 1386, 1387, 1389, 1397, 1394, 1386, 1388,
+ 1389, 1396, 1400, 1405, 1391, 1393, 1394, 1398, 1397, 1395,
+
+ 1398, 1401, 1402, 1399, 1396, 1406, 1399, 1395, 1392, 1398,
+ 1400, 0, 1407, 1397, 1404, 1402, 1405, 1407, 1396, 1400,
+ 1405, 1406, 0, 1408, 1398, 1399, 1401, 1398, 1401, 1402,
+ 1399, 1408, 1406, 1399, 1409, 1409, 1410, 1411, 1412, 1414,
+ 1413, 0, 1415, 1419, 1407, 1410, 1416, 1417, 1414, 1415,
+ 1408, 1422, 1423, 0, 1417, 1426, 1419, 0, 0, 1411,
+ 1412, 1409, 1413, 1410, 1411, 1412, 1414, 1413, 1416, 1415,
+ 1419, 1420, 1421, 1416, 1417, 1423, 1424, 1422, 1422, 1423,
+ 1420, 1421, 1425, 1428, 1429, 1424, 1427, 1426, 1431, 1430,
+ 1425, 0, 1429, 1432, 1428, 1434, 1433, 1436, 1420, 1421,
+
+ 1431, 1427, 1430, 1424, 1433, 1432, 1435, 1439, 1438, 1425,
+ 1428, 1429, 1437, 1427, 1438, 1431, 1430, 1434, 1440, 1436,
+ 1432, 1437, 1434, 1433, 1436, 1439, 1435, 1444, 1441, 1442,
+ 1443, 1445, 1446, 1435, 1439, 1438, 0, 1443, 1447, 1437,
+ 1441, 1448, 1449, 0, 1440, 1440, 1452, 1442, 1451, 1450,
+ 1453, 1447, 1452, 1444, 1444, 1441, 1442, 1443, 1454, 1451,
+ 1455, 1456, 1457, 1445, 1446, 1447, 0, 1448, 1448, 1449,
+ 1450, 1460, 1453, 1452, 1463, 1451, 1450, 1453, 1458, 1461,
+ 1464, 1465, 1462, 1463, 1466, 0, 1468, 0, 1457, 1457,
+ 1454, 0, 1455, 1456, 1465, 1464, 1466, 1458, 1460, 1458,
+
+ 1462, 1463, 1461, 1467, 1458, 1458, 1461, 1464, 1465, 1462,
+ 1469, 1466, 1468, 1468, 1470, 1472, 1471, 1469, 1477, 1473,
+ 1474, 0, 0, 1467, 1458, 1474, 1458, 1473, 1472, 1475,
+ 1467, 1480, 1476, 1470, 1475, 1481, 1485, 1469, 1471, 1476,
+ 1478, 1470, 1472, 1471, 1477, 1477, 1473, 1479, 1478, 1480,
+ 1486, 0, 1474, 1483, 1484, 1479, 1482, 1481, 1480, 1476,
+ 1483, 1475, 1481, 1484, 1482, 1489, 1487, 1478, 1485, 1488,
+ 1488, 1490, 1486, 1487, 1479, 1492, 1493, 1486, 1491, 1490,
+ 1483, 1484, 1494, 1482, 1493, 1499, 1495, 1496, 1498, 0,
+ 1494, 1499, 1497, 1487, 1495, 1496, 1488, 1489, 1490, 1491,
+
+ 1497, 1498, 1501, 1493, 1500, 1491, 1502, 1492, 1505, 1494,
+ 1503, 1506, 1499, 1495, 1496, 1498, 1500, 1504, 1503, 1497,
+ 1507, 1508, 1509, 1505, 1511, 1504, 1510, 1513, 1501, 1501,
+ 1502, 1500, 1512, 1502, 0, 1505, 1511, 1503, 1506, 1517,
+ 1510, 1513, 1523, 1508, 1504, 1509, 1516, 1507, 1508, 1509,
+ 1512, 1511, 1514, 1510, 1513, 1516, 1514, 1519, 1518, 1512,
+ 1520, 1517, 1521, 0, 1519, 1526, 1517, 1525, 1522, 1514,
+ 1518, 1520, 1534, 1516, 1523, 1528, 1524, 1514, 1527, 1514,
+ 0, 1525, 0, 1514, 1519, 1518, 1529, 1520, 1524, 1521,
+ 1522, 1535, 1530, 1532, 1525, 1522, 1514, 1526, 1528, 1530,
+
+ 1527, 1531, 1528, 1524, 1534, 1527, 1537, 1533, 1540, 1529,
+ 1531, 1532, 1541, 1529, 1533, 1537, 1539, 1542, 1535, 1530,
+ 1532, 1545, 1539, 1547, 1543, 1548, 1549, 0, 1531, 1550,
+ 1540, 1543, 0, 1537, 1533, 1540, 1553, 1549, 1541, 1541,
+ 1550, 1556, 0, 1539, 1551, 0, 1558, 1547, 1545, 1542,
+ 1547, 1543, 1548, 1549, 1555, 1551, 1550, 1562, 1554, 1556,
+ 1553, 1555, 1557, 1553, 1554, 1559, 1561, 1563, 1556, 1557,
+ 1560, 1551, 1558, 1558, 1561, 1564, 1560, 1559, 1565, 1562,
+ 1563, 1555, 1566, 0, 1562, 1554, 1567, 1568, 1569, 1557,
+ 1569, 1570, 1559, 1561, 1563, 1567, 1571, 1560, 1570, 1568,
+
+ 1566, 1573, 1574, 1572, 1565, 1565, 1576, 1564, 1575, 1566,
+ 1573, 1577, 1578, 1567, 1568, 1569, 1572, 1579, 1570, 1578,
+ 1575, 1580, 1571, 1571, 1574, 1582, 1580, 1583, 1573, 1574,
+ 1572, 1585, 1581, 1576, 1577, 1575, 1587, 1584, 1577, 1578,
+ 1581, 1582, 1588, 1579, 1579, 1584, 1589, 1592, 1580, 1590,
+ 1583, 1591, 1582, 1585, 1583, 1593, 1592, 1595, 1585, 1581,
+ 1589, 1598, 1591, 1587, 1584, 1596, 1588, 1596, 1593, 1588,
+ 1595, 1590, 1597, 1589, 1592, 1601, 1590, 1602, 1591, 1594,
+ 1594, 1603, 1593, 1598, 1595, 1605, 1599, 1594, 1598, 1600,
+ 1604, 1607, 1596, 1599, 1608, 1602, 1600, 1604, 1597, 1597,
+
+ 1606, 1608, 1601, 1603, 1602, 1609, 1594, 1594, 1603, 1612,
+ 1605, 1611, 1605, 1599, 1614, 0, 1600, 1604, 1613, 1620,
+ 1616, 1608, 1606, 1607, 1611, 1617, 1613, 1606, 1617, 1618,
+ 0, 1619, 1620, 1624, 1621, 1614, 1612, 1609, 1611, 1622,
+ 1623, 1614, 1616, 1621, 1625, 1613, 1620, 1616, 1626, 1629,
+ 1630, 1622, 1617, 1625, 0, 1618, 1618, 1619, 1619, 1624,
+ 1624, 1621, 1627, 1626, 1623, 0, 1622, 1623, 1631, 1627,
+ 1628, 1625, 1630, 1628, 1637, 1626, 1634, 1630, 1633, 0,
+ 1635, 1629, 1635, 1639, 1631, 1628, 1636, 1638, 1640, 1627,
+ 1638, 1642, 1631, 1644, 1628, 1631, 1633, 1628, 1634, 1641,
+
+ 1628, 1637, 1643, 1634, 0, 1633, 1651, 1635, 1645, 1646,
+ 1636, 1631, 1628, 1636, 1638, 1639, 1648, 1642, 1642, 1652,
+ 1640, 1641, 1647, 1646, 1648, 1644, 1641, 1649, 1643, 1643,
+ 1645, 1647, 1650, 1653, 1649, 1645, 1646, 1655, 1651, 1654,
+ 1656, 1657, 0, 1648, 1656, 1658, 1660, 0, 1659, 1647,
+ 1661, 1652, 1662, 0, 1649, 1660, 1650, 1661, 1672, 1650,
+ 1662, 1654, 1677, 1657, 1663, 1653, 1654, 1656, 1657, 1655,
+ 1659, 1663, 1658, 1660, 1664, 1659, 1665, 1661, 1672, 1662,
+ 1666, 1667, 1668, 1669, 1668, 1672, 1670, 1664, 1671, 1665,
+ 1667, 1663, 0, 1666, 1677, 1683, 1671, 1674, 1678, 1675,
+
+ 0, 1664, 1676, 1665, 0, 1678, 1669, 1666, 1667, 1668,
+ 1669, 1670, 1674, 1670, 1675, 1671, 1676, 1679, 1681, 1682,
+ 1680, 1683, 1683, 1684, 1674, 1678, 1675, 1680, 1679, 1676,
+ 1686, 1681, 1687, 1688, 1689, 0, 1690, 1682, 1692, 1687,
+ 1691, 1684, 1705, 1682, 1679, 1681, 1682, 1680, 0, 1689,
+ 1684, 1692, 1691, 1693, 1695, 1688, 1693, 1686, 1696, 1687,
+ 1688, 1689, 1690, 1690, 1682, 1692, 1694, 1691, 1697, 1705,
+ 1696, 1698, 1695, 1699, 1698, 1694, 1706, 1703, 1701, 1703,
+ 1693, 1695, 1704, 1701, 1699, 1696, 1710, 1707, 1697, 1698,
+ 1701, 1709, 0, 1694, 1713, 1697, 1723, 1711, 1698, 1708,
+
+ 1699, 1698, 1707, 1706, 1703, 1701, 1704, 1714, 1708, 1704,
+ 1701, 1711, 1712, 1710, 1707, 1709, 1713, 1716, 1709, 1715,
+ 1712, 1713, 1717, 1723, 1711, 1716, 1708, 1718, 1719, 1720,
+ 1721, 1714, 1720, 1717, 1714, 1722, 1719, 1726, 1724, 1712,
+ 0, 1715, 0, 1725, 1716, 1718, 1715, 1720, 1721, 1717,
+ 1725, 1726, 1727, 1728, 1718, 1719, 1720, 1721, 1724, 1720,
+ 1729, 1727, 1731, 1730, 1726, 1724, 1728, 1722, 1730, 1736,
+ 1725, 1729, 1735, 1732, 1735, 1737, 1740, 0, 1736, 1727,
+ 1728, 1738, 1739, 0, 1731, 0, 1741, 1729, 1732, 1731,
+ 1741, 0, 1742, 1739, 1740, 1730, 1736, 1755, 1744, 1735,
+
+ 1732, 1737, 1737, 1740, 1743, 1738, 1742, 1743, 1738, 1739,
+ 1746, 1758, 1741, 1741, 1745, 1747, 1746, 1741, 1742, 1742,
+ 1744, 1748, 1743, 1745, 1747, 1744, 1748, 1750, 1753, 1755,
+ 1752, 1743, 1751, 1742, 1743, 1752, 1754, 1746, 1756, 1757,
+ 1750, 1745, 1747, 1758, 1751, 1759, 1761, 1756, 1760, 1754,
+ 1753, 1766, 1762, 1748, 1750, 1753, 0, 1752, 1765, 1751,
+ 1767, 1760, 1764, 1754, 1768, 1756, 1757, 1759, 1769, 1764,
+ 1768, 1765, 1759, 1762, 1767, 1760, 1771, 1776, 1761, 1762,
+ 1777, 1778, 1773, 1766, 1774, 1765, 1775, 1767, 1768, 1764,
+ 1773, 1768, 1774, 0, 1775, 1771, 1776, 1768, 1779, 1778,
+
+ 1769, 1780, 1777, 1771, 1776, 1782, 1781, 1777, 1778, 1773,
+ 1783, 1774, 1779, 1775, 1784, 1785, 1786, 1788, 1782, 1780,
+ 1781, 0, 1787, 1783, 1789, 1779, 1793, 1790, 1780, 1791,
+ 0, 1788, 1782, 1781, 1790, 1784, 1795, 1783, 1791, 1800,
+ 1796, 1784, 1792, 1794, 1788, 1796, 1787, 1785, 1786, 1787,
+ 1792, 1789, 1797, 1793, 1790, 1798, 1791, 1794, 1801, 1803,
+ 1802, 1810, 1784, 1797, 1798, 1801, 1800, 1796, 1795, 1792,
+ 1794, 1804, 1805, 1806, 1807, 1811, 1808, 1810, 1804, 1797,
+ 1808, 1803, 1798, 1802, 1812, 1801, 1803, 1802, 1810, 1813,
+ 1815, 1817, 1807, 1811, 1805, 1806, 1819, 1814, 1804, 1805,
+
+ 1806, 1807, 1811, 1808, 1813, 1816, 1817, 1818, 1812, 1814,
+ 1821, 1812, 1820, 1816, 1822, 1818, 1813, 1815, 1817, 1825,
+ 1823, 1826, 1827, 1819, 1814, 1820, 1831, 1825, 1826, 1822,
+ 1821, 1829, 1816, 1832, 1818, 1823, 1828, 1821, 1830, 1820,
+ 1829, 1822, 1833, 1836, 1835, 1837, 1825, 1823, 1826, 1838,
+ 0, 1828, 1839, 1831, 1827, 1840, 0, 1832, 1829, 1830,
+ 1832, 1836, 1841, 1828, 1858, 1830, 1835, 1839, 1842, 1833,
+ 1836, 1835, 1844, 1843, 1845, 1842, 1838, 1837, 1843, 1839,
+ 1840, 1844, 1840, 1845, 1846, 1847, 1841, 1848, 1849, 1841,
+ 1850, 1851, 1857, 0, 0, 1842, 1858, 1853, 1855, 1844,
+
+ 1843, 1845, 1850, 1849, 1853, 1848, 1846, 1847, 1852, 1854,
+ 1856, 1846, 1847, 1851, 1848, 1849, 1854, 1850, 1851, 1857,
+ 1855, 1852, 1856, 1859, 1853, 1855, 1852, 1861, 1864, 1859,
+ 0, 1854, 1862, 1863, 1869, 1852, 1854, 1856, 1861, 1864,
+ 1862, 1863, 1865, 1854, 1867, 1866, 1867, 1870, 1852, 1865,
+ 1859, 1868, 1872, 1877, 1861, 1864, 1871, 1867, 1873, 1862,
+ 1863, 1869, 1874, 1871, 1878, 1879, 1880, 1882, 1874, 1865,
+ 1866, 1867, 1866, 1867, 1870, 1875, 1876, 1868, 1868, 1872,
+ 1877, 1875, 1876, 1871, 1873, 1873, 1883, 1878, 1884, 1874,
+ 1880, 1878, 1885, 1880, 1886, 1883, 1886, 1879, 1887, 1882,
+
+ 1888, 1889, 1875, 1876, 1890, 1891, 1892, 1894, 1889, 1893,
+ 1898, 0, 0, 1883, 1885, 1893, 1895, 1897, 1892, 1885,
+ 1884, 1886, 1887, 1896, 1903, 1887, 1890, 1888, 1889, 1894,
+ 1900, 1890, 1891, 1892, 1894, 1909, 1893, 1900, 1895, 1897,
+ 1909, 1902, 1898, 1895, 1897, 1899, 1899, 1899, 1902, 1896,
+ 1896, 1904, 1899, 1901, 1905, 1906, 1903, 1900, 1904, 1911,
+ 1899, 1905, 1901, 1907, 1910, 1915, 1916, 1909, 1902, 1912,
+ 0, 1911, 1899, 1899, 1899, 1906, 1913, 1910, 1904, 1899,
+ 1901, 1905, 1906, 1914, 1916, 1907, 1911, 1919, 1920, 1920,
+ 1907, 1910, 1913, 1916, 1912, 1914, 1912, 1915, 1917, 1925,
+
+ 1918, 1935, 1921, 1913, 1922, 1917, 1918, 1923, 0, 1924,
+ 1914, 1922, 1923, 1926, 1919, 1920, 1929, 1930, 1934, 1930,
+ 1926, 1931, 0, 1933, 1934, 1917, 1925, 1918, 1921, 1921,
+ 1937, 1922, 0, 1935, 1923, 1924, 1924, 1941, 1936, 1931,
+ 1926, 1933, 1939, 1929, 1930, 1934, 1938, 1940, 1931, 1936,
+ 1933, 1943, 1938, 1948, 1939, 1941, 1947, 1937, 1942, 1942,
+ 1944, 1944, 1949, 1950, 1941, 1936, 1951, 1940, 1945, 1939,
+ 1950, 1952, 1953, 1938, 1940, 1948, 0, 1943, 1943, 1945,
+ 1948, 1955, 1956, 1957, 1958, 1942, 1951, 1944, 1947, 1955,
+ 1950, 1959, 1960, 1951, 1949, 1945, 1963, 1953, 1961, 1953,
+
+ 1965, 1964, 0, 1952, 1960, 1961, 1958, 1962, 1955, 1959,
+ 1957, 1958, 1966, 1969, 1956, 1962, 1964, 1968, 1959, 1960,
+ 1963, 1966, 1970, 1963, 1965, 1961, 1971, 1965, 1964, 1967,
+ 1967, 1975, 1973, 1971, 1962, 1972, 1976, 0, 1975, 1966,
+ 1978, 1976, 1977, 1968, 1968, 1969, 1979, 1972, 1973, 1979,
+ 1999, 1986, 1980, 1971, 1970, 1973, 1967, 1984, 1975, 1973,
+ 1980, 1985, 1972, 1976, 1977, 1981, 1983, 1978, 1987, 1977,
+ 1988, 1989, 1986, 1979, 1983, 1973, 1991, 1981, 1986, 1980,
+ 1984, 0, 1999, 1992, 1984, 1990, 1987, 1985, 1985, 1992,
+ 1990, 1993, 1981, 1983, 1989, 1987, 2000, 1988, 1989, 1994,
+
+ 1995, 1990, 1996, 1991, 1993, 2000, 1997, 1994, 1998, 1996,
+ 1992, 2003, 1990, 1997, 2002, 1998, 2001, 1990, 1993, 2004,
+ 2016, 2005, 1995, 2000, 2008, 2003, 1994, 1995, 2001, 1996,
+ 2006, 2012, 2011, 1997, 2009, 1998, 2002, 2010, 2003, 2009,
+ 2014, 2002, 2008, 2001, 2010, 2018, 2004, 2005, 2005, 2020,
+ 2009, 2008, 2016, 2006, 2011, 2015, 2022, 2006, 2012, 2011,
+ 2015, 2009, 2019, 2019, 2010, 2021, 2009, 2014, 2024, 2026,
+ 2025, 2020, 2027, 2028, 2029, 2028, 2020, 2018, 2031, 0,
+ 2021, 2030, 2032, 2024, 2026, 2035, 2030, 2015, 2022, 2019,
+ 2036, 2040, 2021, 2025, 2033, 2024, 2026, 2025, 2027, 2027,
+
+ 2028, 2038, 2033, 2042, 2034, 2036, 2029, 2035, 2030, 2032,
+ 2031, 2034, 2035, 2040, 2039, 2044, 2038, 2036, 2040, 2043,
+ 2045, 2033, 2039, 2047, 0, 2046, 2049, 2042, 2038, 2048,
+ 2042, 2034, 2046, 2050, 2056, 2055, 2053, 0, 2057, 2051,
+ 0, 2039, 2044, 2062, 0, 2043, 2043, 2045, 2049, 2056,
+ 2048, 2061, 2046, 2049, 2050, 2047, 2048, 2051, 2053, 2055,
+ 2050, 2056, 2055, 2053, 2057, 2057, 2051, 2059, 2060, 2063,
+ 2062, 2064, 2067, 2061, 2068, 2065, 2066, 2074, 2061, 2070,
+ 2075, 2068, 2059, 2060, 2071, 2072, 2069, 2063, 2070, 2075,
+ 0, 2093, 2071, 2064, 2059, 2060, 2063, 2065, 2064, 2067,
+
+ 2066, 2068, 2065, 2066, 2069, 2073, 2070, 2075, 2072, 2074,
+ 2076, 2071, 2072, 2069, 2077, 2081, 2078, 2082, 2093, 2080,
+ 2083, 0, 2085, 2077, 2081, 0, 2084, 2073, 2076, 2078,
+ 2080, 2095, 2073, 2084, 2086, 2082, 2087, 2076, 2083, 0,
+ 2089, 2077, 2081, 2078, 2082, 2080, 2080, 2083, 2085, 2085,
+ 2088, 2087, 2086, 2084, 2090, 2095, 2088, 2080, 2095, 2096,
+ 2097, 2086, 2089, 2087, 2098, 2102, 2100, 2089, 2090, 2101,
+ 2096, 2097, 2104, 2103, 0, 2098, 2105, 2088, 2100, 2106,
+ 2107, 2090, 2101, 2103, 2110, 2108, 2096, 2097, 2106, 2111,
+ 2113, 2098, 2114, 2100, 2113, 2115, 2101, 2102, 2104, 2104,
+
+ 2103, 2105, 2117, 2105, 2108, 2116, 2106, 2107, 2120, 2118,
+ 2123, 2110, 2108, 2114, 2118, 2111, 2111, 2113, 2116, 2114,
+ 2122, 2119, 2117, 2121, 2124, 2123, 2122, 2115, 2119, 2117,
+ 2125, 2121, 2116, 2129, 2120, 2120, 2118, 2123, 2126, 2124,
+ 2127, 2127, 2125, 2128, 2137, 2129, 0, 2122, 2119, 2121,
+ 2121, 2124, 2131, 2126, 2130, 2134, 2131, 2125, 2121, 2130,
+ 2129, 2128, 2134, 2136, 2132, 2126, 2138, 2127, 2132, 2135,
+ 2128, 2137, 2141, 2135, 2140, 2138, 2139, 2142, 2136, 2131,
+ 2144, 2132, 2134, 2139, 2142, 2145, 2130, 2147, 2146, 2132,
+ 2136, 2132, 2155, 2138, 2141, 2132, 2135, 2146, 2140, 2141,
+
+ 2148, 2140, 2144, 2139, 2142, 2150, 2153, 2144, 2132, 2147,
+ 2145, 2154, 2145, 2152, 2147, 2146, 2159, 2155, 2157, 2155,
+ 2148, 2156, 2152, 2150, 2153, 2161, 2154, 2148, 2164, 2156,
+ 2167, 2160, 2150, 2153, 2162, 2162, 0, 2163, 2154, 2167,
+ 2152, 2159, 2168, 2159, 2160, 2165, 2166, 2169, 2156, 2170,
+ 2157, 2168, 2161, 2164, 2169, 2164, 2171, 2167, 2160, 2163,
+ 2173, 2162, 2172, 2175, 2163, 2174, 0, 2165, 2166, 2168,
+ 2174, 2177, 2165, 2166, 2169, 2173, 2172, 2179, 2171, 2177,
+ 2178, 2170, 2175, 2171, 2180, 2185, 2181, 2173, 2183, 2172,
+ 2175, 0, 2179, 2178, 2182, 2184, 2186, 2174, 2177, 2187,
+
+ 2183, 2189, 2184, 2190, 2179, 2188, 0, 2178, 2192, 2189,
+ 2182, 2180, 2181, 2181, 2188, 2183, 2191, 2185, 2186, 2193,
+ 2189, 2182, 2184, 2186, 2187, 2198, 2187, 2195, 2189, 2194,
+ 2190, 2191, 2188, 2196, 2192, 2192, 2189, 2199, 2200, 0,
+ 2199, 2204, 2196, 2191, 2201, 2193, 2193, 2194, 2198, 2195,
+ 2201, 2203, 2198, 2202, 2195, 2199, 2194, 2205, 2202, 2204,
+ 2196, 2207, 2213, 2200, 2199, 2200, 2203, 2199, 2204, 2208,
+ 2209, 2201, 2205, 2211, 2212, 2214, 2207, 2215, 2203, 0,
+ 2213, 2212, 2218, 0, 2205, 2202, 2215, 2211, 2207, 2213,
+ 2216, 2208, 2209, 2218, 2217, 2220, 2208, 2209, 2221, 2216,
+
+ 2211, 2212, 2214, 2217, 2215, 2219, 2222, 2219, 2220, 2218,
+ 2221, 2224, 2225, 2226, 2227, 2228, 2229, 2216, 0, 2236,
+ 2226, 2217, 2220, 2236, 0, 2221, 2224, 2225, 2222, 2235,
+ 0, 0, 2219, 2222, 2229, 2230, 2227, 2228, 2224, 2225,
+ 2226, 2227, 2228, 2229, 2230, 2233, 2236, 2237, 2238, 2239,
+ 2235, 2239, 2240, 2241, 2243, 2242, 2235, 2238, 2233, 2237,
+ 2244, 2246, 2230, 2245, 2247, 0, 2233, 2251, 0, 2244,
+ 2240, 2245, 2233, 2242, 2237, 2238, 2239, 2254, 2248, 2240,
+ 2241, 2243, 2242, 2255, 2246, 2233, 2247, 2244, 2246, 2250,
+ 2245, 2247, 2248, 2252, 2256, 2253, 2261, 2250, 2252, 2251,
+
+ 2253, 2258, 2264, 2257, 2266, 2248, 2265, 2263, 2258, 2254,
+ 2262, 2268, 0, 2270, 2271, 2255, 2250, 2267, 2256, 2266,
+ 2252, 2256, 2257, 2261, 2262, 2263, 2267, 2253, 2258, 2264,
+ 2257, 2266, 2265, 2265, 2263, 2262, 2262, 2262, 2269, 2270,
+ 2270, 2271, 2272, 2268, 2267, 2273, 2276, 2275, 2277, 2278,
+ 0, 2262, 2280, 2276, 2280, 2282, 2278, 2286, 2281, 2282,
+ 2269, 2284, 2262, 2285, 2272, 2269, 2283, 0, 2286, 2272,
+ 2275, 2277, 2285, 2276, 2275, 2277, 2278, 2273, 2283, 2280,
+ 2281, 2288, 2282, 2284, 2286, 2281, 2289, 2287, 2284, 2290,
+ 2285, 2289, 2291, 2283, 2287, 2292, 2293, 2294, 2295, 2295,
+
+ 2296, 2302, 2297, 2288, 2298, 0, 2294, 2292, 2288, 2296,
+ 2299, 0, 2298, 2289, 2287, 2291, 2290, 2297, 2293, 2291,
+ 2300, 2301, 2292, 2293, 2294, 2295, 2304, 2296, 2302, 2297,
+ 2301, 2298, 2299, 2305, 2300, 2306, 2307, 2299, 2308, 2312,
+ 2314, 2305, 2308, 2306, 2307, 2304, 2309, 2300, 2301, 2309,
+ 2310, 2311, 2316, 2304, 2312, 2313, 2318, 2311, 2310, 2321,
+ 2305, 2313, 2306, 2307, 2316, 2308, 2312, 2319, 2320, 2322,
+ 2318, 2323, 2314, 2309, 2326, 2324, 2322, 2310, 2311, 2316,
+ 2319, 2325, 2313, 2318, 2321, 2329, 2321, 2327, 2326, 2320,
+ 2327, 2328, 0, 2330, 2319, 2320, 2322, 2324, 2323, 2329,
+
+ 2331, 2326, 2324, 2332, 2328, 2325, 2333, 2339, 2325, 2334,
+ 2335, 2336, 2329, 2337, 2327, 2340, 2337, 0, 2328, 2330,
+ 2330, 2334, 2335, 2341, 2343, 2336, 2342, 2331, 2332, 2342,
+ 2332, 2344, 2345, 2333, 2339, 2347, 2334, 2335, 2336, 2337,
+ 2337, 2340, 2340, 2337, 2342, 2348, 2350, 2351, 2349, 2341,
+ 2341, 2343, 2348, 2342, 2345, 2349, 2342, 2347, 2344, 2345,
+ 2352, 2350, 2347, 2353, 2354, 2356, 2357, 2355, 2359, 2360,
+ 2361, 2353, 2348, 2350, 2351, 2349, 2355, 2358, 2357, 2363,
+ 2362, 0, 2368, 2361, 0, 2370, 2384, 2352, 2364, 2363,
+ 2353, 2354, 2356, 2357, 2355, 2359, 2360, 2361, 2362, 2358,
+
+ 2365, 2364, 2367, 2369, 2358, 2371, 2363, 2362, 2365, 2368,
+ 2373, 2369, 2370, 2372, 2371, 2364, 2376, 2374, 2384, 2375,
+ 2377, 2378, 0, 0, 2367, 2379, 2381, 2365, 2377, 2367,
+ 2369, 2373, 2371, 2378, 2375, 2372, 2383, 2373, 2381, 2390,
+ 2372, 2374, 2387, 2376, 2374, 2375, 2375, 2377, 2378, 2382,
+ 2379, 2386, 2379, 2381, 2387, 2388, 2389, 2382, 2386, 2388,
+ 2391, 2375, 2390, 2383, 2392, 2394, 2390, 2393, 2389, 2387,
+ 2397, 2400, 2392, 2395, 2398, 2399, 2382, 2394, 2386, 2401,
+ 0, 2398, 2388, 2389, 2400, 2395, 2405, 2391, 2401, 2393,
+ 2402, 2392, 2394, 2403, 2393, 2399, 2406, 2397, 2400, 2402,
+
+ 2395, 2398, 2399, 2404, 2404, 2403, 2401, 2407, 2410, 2408,
+ 2411, 0, 2405, 2405, 2406, 2424, 2412, 2402, 0, 2413,
+ 2403, 2415, 2416, 2406, 2408, 2411, 2408, 2414, 2416, 2414,
+ 2404, 2425, 2407, 2408, 2407, 2415, 2408, 2411, 2412, 2417,
+ 2410, 2413, 2420, 2412, 2418, 2418, 2413, 2424, 2415, 2416,
+ 2421, 2408, 2422, 2408, 2414, 2423, 2426, 2428, 2427, 2429,
+ 0, 2417, 2426, 2425, 2420, 2430, 2417, 2423, 0, 2420,
+ 2427, 2418, 2421, 2431, 2422, 2431, 2432, 2421, 2433, 2422,
+ 2435, 2429, 2423, 2426, 2434, 2427, 2429, 2430, 2436, 2428,
+ 2432, 2434, 2430, 2440, 2437, 2438, 2439, 2441, 2435, 0,
+
+ 2431, 2442, 2433, 2432, 2448, 2433, 2436, 2435, 2449, 2439,
+ 2444, 2434, 2437, 2438, 2447, 2436, 2451, 2444, 2452, 2446,
+ 2453, 2437, 2438, 2439, 2442, 2440, 2446, 2450, 2442, 2441,
+ 2448, 2448, 2447, 2458, 2451, 2450, 0, 2444, 2456, 2459,
+ 2449, 2447, 2453, 2451, 2452, 2452, 2446, 2453, 2454, 2456,
+ 2454, 2459, 2457, 2450, 2450, 2454, 2460, 2462, 2463, 2464,
+ 2458, 2465, 2450, 2457, 0, 2456, 2459, 2467, 2468, 2463,
+ 2471, 2464, 2462, 2469, 2460, 2454, 2465, 2454, 2470, 2457,
+ 2469, 2472, 2474, 2460, 2462, 2463, 2464, 2475, 2465, 2477,
+ 2468, 2467, 2478, 2470, 2467, 2468, 2476, 2471, 2479, 2480,
+
+ 2469, 2482, 2481, 2487, 2483, 2470, 2486, 2472, 2472, 2474,
+ 0, 2475, 2485, 2492, 2475, 2481, 2479, 2484, 2476, 2483,
+ 2485, 2477, 2491, 2476, 2478, 2479, 2480, 2482, 2482, 2481,
+ 2484, 2483, 2486, 2486, 2488, 2487, 2489, 2492, 2493, 2485,
+ 2492, 0, 2494, 0, 2484, 2491, 2495, 2488, 2496, 2491,
+ 2498, 2499, 2497, 2500, 0, 0, 0, 2498, 2489, 2503,
+ 2504, 2488, 2501, 2489, 2494, 2493, 2496, 2504, 2495, 2494,
+ 2497, 2508, 2507, 2495, 2499, 2496, 2501, 2498, 2499, 2497,
+ 2500, 2503, 2510, 2505, 2506, 2507, 2503, 2504, 2509, 2501,
+ 2505, 2506, 2511, 2512, 2508, 2509, 2513, 0, 2508, 2507,
+
+ 2515, 0, 2519, 2514, 2510, 2516, 2517, 2522, 2515, 2510,
+ 2505, 2506, 2514, 2516, 2512, 2509, 2521, 2523, 2522, 2518,
+ 2512, 2524, 2513, 2513, 2511, 2518, 2525, 2515, 2517, 2519,
+ 2514, 2521, 2516, 2517, 2522, 2526, 2527, 2529, 2531, 2523,
+ 2533, 2539, 2539, 2521, 2523, 2534, 2518, 2532, 0, 2535,
+ 2543, 2531, 2540, 2524, 2526, 2529, 2537, 2538, 2525, 2544,
+ 2532, 2527, 2526, 2527, 2529, 2531, 2533, 2533, 2539, 2534,
+ 2545, 2546, 2534, 2543, 2532, 2535, 2535, 2543, 2540, 2540,
+ 2537, 2538, 2547, 2537, 2538, 2545, 2550, 2552, 2554, 2558,
+ 2561, 2544, 2555, 2559, 2559, 2563, 2552, 2545, 2546, 2560,
+
+ 2547, 2554, 2562, 2555, 2565, 2560, 2567, 2569, 2572, 2547,
+ 2570, 2558, 2561, 2550, 2552, 2554, 2558, 2561, 2568, 2555,
+ 2559, 2570, 2563, 2571, 2562, 2568, 2560, 2575, 2571, 2562,
+ 2572, 2565, 2574, 2569, 2569, 2572, 2578, 2570, 2567, 2582,
+ 2574, 2576, 2577, 2581, 2580, 2568, 2583, 2587, 2588, 2584,
+ 2571, 2575, 2585, 2590, 2575, 2580, 2576, 2577, 2584, 2574,
+ 2582, 2581, 2590, 2578, 2585, 2589, 2582, 2592, 2576, 2577,
+ 2581, 2580, 2588, 2589, 2587, 2588, 2584, 2593, 2583, 2585,
+ 2590, 2594, 2595, 2596, 2597, 2598, 0, 2600, 2599, 2601,
+ 2602, 2595, 2589, 2592, 2592, 2607, 2603, 2606, 2597, 2604,
+
+ 2600, 2596, 2601, 2594, 2593, 2602, 2604, 2598, 2594, 2595,
+ 2596, 2597, 2598, 2599, 2600, 2599, 2601, 2602, 2603, 2606,
+ 2605, 2608, 2607, 2603, 2606, 2609, 2604, 2605, 2610, 2611,
+ 2612, 2613, 0, 2614, 0, 2615, 0, 2616, 0, 2612,
+ 0, 0, 2618, 0, 2611, 2623, 2624, 2605, 2608, 2618,
+ 2617, 2619, 2609, 2613, 2624, 2610, 2611, 2612, 2613, 2614,
+ 2614, 2615, 2615, 2616, 2616, 2617, 2619, 2620, 2622, 2618,
+ 2621, 2625, 2623, 2624, 2620, 2626, 2621, 2617, 2619, 2622,
+ 2627, 2628, 2632, 2630, 2629, 2631, 0, 0, 0, 2632,
+ 2636, 2633, 0, 2638, 2620, 2622, 2627, 2621, 2625, 2629,
+
+ 2631, 2637, 2626, 2630, 2639, 2639, 0, 2627, 2628, 2632,
+ 2630, 2629, 2631, 2633, 2634, 2635, 2640, 2636, 2633, 2637,
+ 2638, 2634, 2635, 2640, 2641, 2644, 2642, 2643, 2637, 2642,
+ 2644, 2639, 2645, 2646, 0, 2647, 2652, 2648, 2641, 0,
+ 2643, 2634, 2635, 2640, 2649, 2652, 2650, 0, 2646, 2659,
+ 2655, 2641, 2644, 2642, 2643, 2648, 2649, 2645, 2650, 2645,
+ 2646, 2647, 2647, 2652, 2648, 2653, 2656, 2657, 2654, 2658,
+ 2653, 2649, 2654, 2650, 2655, 2660, 2659, 2655, 2661, 2656,
+ 2663, 0, 2665, 2667, 0, 0, 0, 0, 2666, 2657,
+ 2668, 2658, 2653, 2656, 2657, 2654, 2658, 2666, 2668, 2667,
+
+ 2669, 2677, 2660, 2675, 2661, 2661, 2663, 2663, 2665, 2665,
+ 2667, 2671, 2669, 2672, 2673, 2666, 2674, 2668, 2671, 2673,
+ 2679, 2675, 2672, 2674, 2676, 2678, 2677, 2669, 2677, 2679,
+ 2675, 2676, 2678, 2680, 0, 2681, 2683, 2684, 2671, 0,
+ 2672, 2673, 2680, 2674, 2685, 2686, 2688, 2679, 2687, 2690,
+ 2686, 2676, 2678, 2691, 2695, 0, 2692, 2685, 2696, 2683,
+ 2680, 2681, 2681, 2683, 2684, 2692, 2687, 2690, 2693, 2694,
+ 2696, 2685, 2686, 2688, 2695, 2687, 2690, 2693, 2694, 2697,
+ 2691, 2695, 2698, 2692, 2700, 2696, 2699, 2701, 2697, 2702,
+ 2703, 2698, 2700, 2704, 2705, 2693, 2694, 2699, 2706, 2708,
+
+ 2704, 2709, 2710, 2705, 2714, 2717, 2697, 2701, 2716, 2698,
+ 2713, 2700, 2714, 2699, 2701, 2711, 2702, 2703, 2712, 2706,
+ 2704, 2705, 2713, 2715, 2711, 2706, 2708, 2712, 2709, 2725,
+ 2716, 2714, 2717, 2718, 2710, 2716, 2715, 2713, 2721, 2719,
+ 2718, 2720, 2711, 2727, 2722, 2712, 2719, 2723, 2720, 2729,
+ 2715, 2722, 2724, 2726, 2721, 2731, 2725, 2729, 0, 2732,
+ 2718, 0, 2735, 2736, 0, 2721, 2719, 2732, 2720, 2723,
+ 2727, 2722, 2733, 2731, 2723, 2738, 2729, 2724, 2726, 2724,
+ 2726, 2734, 2731, 2738, 2735, 2736, 2732, 2733, 2734, 2735,
+ 2736, 2737, 2742, 2741, 0, 2744, 2746, 2743, 2737, 2733,
+
+ 2741, 2742, 2738, 2745, 2747, 2746, 2750, 2756, 2734, 2748,
+ 2762, 2754, 0, 0, 2749, 2745, 2752, 2755, 2737, 2742,
+ 2741, 2743, 2744, 2746, 2743, 2748, 2749, 2753, 2752, 2750,
+ 2745, 2747, 2754, 2750, 2756, 2757, 2748, 2762, 2754, 2753,
+ 2755, 2749, 2765, 2752, 2755, 2759, 2760, 2766, 2761, 2757,
+ 2764, 0, 2767, 2760, 2753, 2761, 2768, 2759, 2769, 2770,
+ 2765, 2774, 2757, 2772, 2776, 2764, 2769, 2771, 2783, 2765,
+ 2766, 2773, 2759, 2760, 2766, 2761, 2774, 2764, 2767, 2767,
+ 2775, 2772, 2773, 2768, 2781, 2769, 2770, 2775, 2774, 2771,
+ 2772, 2776, 2782, 0, 2771, 2783, 2790, 2782, 2773, 2784,
+
+ 2785, 2786, 2787, 2788, 2789, 2791, 2792, 2775, 2794, 0,
+ 2781, 2781, 2791, 2784, 2785, 2786, 2797, 2799, 2792, 2782,
+ 2787, 2788, 2789, 2790, 2800, 2801, 2784, 2785, 2786, 2787,
+ 2788, 2789, 2791, 2792, 2802, 2794, 2804, 2800, 2797, 2799,
+ 2803, 2805, 2809, 2797, 2799, 2807, 2811, 2801, 2803, 2810,
+ 2812, 2800, 2801, 2802, 2804, 2813, 2814, 2807, 2811, 2816,
+ 2805, 2802, 2815, 2804, 2809, 2817, 2818, 2803, 2805, 2809,
+ 2815, 2810, 2807, 2811, 2821, 2819, 2810, 2812, 2814, 0,
+ 0, 2820, 2813, 2814, 2819, 2817, 2816, 2822, 2818, 2815,
+ 2820, 2823, 2817, 2818, 2825, 2824, 2826, 2827, 2830, 2831,
+
+ 2833, 0, 2819, 2832, 2837, 2833, 2821, 2824, 2820, 2822,
+ 2842, 2834, 2830, 2835, 2822, 2836, 2825, 2823, 2823, 2839,
+ 2838, 2825, 2824, 2826, 2827, 2830, 2831, 2832, 2836, 2842,
+ 2832, 2840, 2833, 2834, 2846, 2835, 2837, 2842, 2834, 2841,
+ 2835, 2839, 2836, 2838, 2843, 2844, 2839, 2838, 2845, 2840,
+ 2843, 2841, 2847, 0, 2848, 2850, 2846, 0, 2840, 2852,
+ 0, 2846, 2851, 2854, 0, 2856, 2841, 2847, 0, 2857,
+ 2869, 2843, 2858, 0, 2860, 2850, 2859, 2844, 2854, 2847,
+ 2845, 2848, 2850, 2852, 2851, 2859, 2852, 2856, 2860, 2851,
+ 2854, 2857, 2856, 2861, 2858, 2862, 2857, 2863, 2864, 2858,
+
+ 2868, 2860, 2869, 2859, 2865, 2874, 2873, 2870, 2875, 2868,
+ 2876, 2861, 2874, 2862, 2873, 2875, 2864, 2877, 2876, 2878,
+ 2861, 2879, 2862, 2863, 2863, 2864, 2865, 2868, 2870, 2879,
+ 2884, 2865, 2874, 2873, 2870, 2875, 2881, 2876, 2882, 2878,
+ 2883, 2885, 2884, 2886, 2877, 2891, 2878, 2887, 2879, 2889,
+ 2892, 2893, 2891, 2885, 2881, 2887, 2882, 2884, 2894, 2895,
+ 2894, 2889, 2896, 2881, 2898, 2882, 2883, 2883, 2885, 0,
+ 2886, 2897, 2891, 2892, 2887, 2899, 2889, 2892, 2893, 2902,
+ 2897, 2900, 2901, 2905, 2901, 2894, 2904, 2907, 2908, 0,
+ 2910, 2895, 0, 2909, 2896, 2912, 2898, 2905, 2897, 2910,
+
+ 2900, 2902, 2899, 2915, 2904, 2911, 2902, 2917, 2900, 2901,
+ 2905, 2913, 2908, 2904, 2918, 2908, 2909, 2910, 2911, 2907,
+ 2909, 2920, 2912, 2913, 2916, 2922, 2921, 2923, 2925, 2915,
+ 2915, 0, 2911, 2916, 2917, 2927, 2928, 2936, 2913, 2933,
+ 2937, 2918, 2927, 2934, 2929, 2923, 2933, 2922, 2920, 2921,
+ 2931, 2916, 2922, 2921, 2923, 2925, 2930, 2938, 2928, 2929,
+ 2940, 2930, 2927, 2928, 2936, 2931, 2933, 2937, 2939, 2934,
+ 2934, 2929, 2941, 2943, 2940, 2946, 2944, 2931, 2947, 0,
+ 2948, 2949, 2946, 2951, 2938, 2944, 2941, 2940, 2930, 2950,
+ 2952, 2955, 2939, 2956, 2960, 2939, 0, 2961, 2954, 2941,
+
+ 2943, 2950, 2946, 2944, 2952, 2947, 2948, 2948, 2949, 2953,
+ 2951, 2954, 2957, 2967, 2965, 2968, 2950, 2952, 2953, 2961,
+ 2956, 2965, 2963, 2955, 2961, 2954, 2960, 2963, 2964, 2969,
+ 2966, 2969, 2964, 2971, 2967, 2957, 2953, 2966, 2970, 2957,
+ 2967, 2965, 2974, 2976, 2977, 2983, 2979, 2968, 2979, 2981,
+ 2980, 0, 0, 0, 2963, 2964, 2969, 2966, 2987, 2985,
+ 2971, 2970, 2976, 0, 2974, 2970, 2985, 2983, 2977, 2974,
+ 2976, 2977, 2983, 2979, 2980, 2981, 2981, 2980, 2982, 2982,
+ 2984, 2986, 2988, 2990, 2991, 2987, 2985, 0, 2982, 2984,
+ 2989, 2997, 2991, 2992, 2986, 2988, 2990, 2994, 2989, 2995,
+
+ 2998, 0, 2994, 3072, 2995, 2982, 2982, 2984, 2986, 2988,
+ 2990, 2991, 2992, 2996, 2989, 2999, 3004, 2989, 2997, 3000,
+ 2992, 2996, 3001, 0, 3002, 2989, 2998, 2998, 3003, 2994,
+ 3005, 2995, 3006, 3006, 3007, 3072, 3008, 3005, 3004, 3003,
+ 2996, 2999, 2999, 3004, 3009, 3000, 3000, 3007, 3001, 3001,
+ 3002, 3002, 3009, 3010, 3011, 3003, 3016, 3005, 3008, 3006,
+ 3012, 3007, 3013, 3008, 3017, 0, 3014, 3012, 3018, 3013,
+ 3019, 3009, 3011, 3014, 3020, 3010, 3022, 3021, 3024, 3025,
+ 3010, 3011, 3019, 3016, 3026, 3022, 3027, 3012, 3029, 3013,
+ 3036, 3017, 3018, 3014, 3030, 3018, 3031, 3019, 3021, 3025,
+
+ 3032, 3020, 3033, 3022, 3021, 3024, 3025, 3035, 3027, 3037,
+ 3038, 3026, 3030, 3027, 3031, 3029, 3035, 3036, 3032, 3041,
+ 3033, 3030, 3039, 3031, 3040, 3044, 3042, 3032, 3046, 3033,
+ 3044, 3048, 3040, 3038, 3035, 3041, 3037, 3038, 3042, 0,
+ 3039, 3043, 3046, 3047, 3052, 3053, 3041, 3054, 3043, 3039,
+ 3056, 3040, 3057, 3042, 3048, 3046, 3061, 3044, 3048, 0,
+ 3054, 3047, 3058, 3062, 3058, 3057, 3052, 3059, 3043, 3063,
+ 3047, 3052, 3053, 3067, 3054, 3067, 3059, 3056, 3080, 3057,
+ 3068, 3062, 3074, 3061, 3063, 3069, 3071, 3084, 3078, 3058,
+ 3062, 3088, 3076, 3071, 3059, 3079, 3063, 3074, 3076, 3083,
+
+ 3067, 3084, 3068, 3069, 3080, 3080, 3081, 3068, 3086, 3074,
+ 3078, 3086, 3069, 3071, 3084, 3078, 3085, 3079, 3088, 3076,
+ 3089, 3083, 3079, 3090, 3081, 3092, 3083, 3091, 3093, 3085,
+ 3096, 3094, 3092, 3081, 3086, 3086, 3093, 3097, 3086, 3098,
+ 3099, 3101, 3100, 3085, 3105, 3091, 0, 3089, 3103, 0,
+ 3090, 3100, 3092, 3094, 3091, 3093, 3101, 3102, 3094, 3097,
+ 3107, 3098, 3096, 3102, 3097, 3104, 3098, 3099, 3101, 3100,
+ 3103, 3106, 3109, 3106, 3104, 3103, 3105, 3112, 3110, 3111,
+ 3113, 3114, 3115, 3117, 3102, 3119, 0, 3107, 3113, 0,
+ 3117, 3124, 3104, 3114, 3115, 3109, 0, 3121, 3106, 3109,
+
+ 3110, 3111, 3122, 3112, 3112, 3110, 3111, 3113, 3114, 3115,
+ 3117, 3121, 3119, 3123, 3124, 3125, 3122, 3126, 3124, 3128,
+ 3135, 3129, 3127, 3132, 3121, 3130, 3133, 3123, 3126, 3122,
+ 3127, 3131, 3130, 3125, 3136, 3133, 3134, 3134, 3128, 0,
+ 3123, 3132, 3125, 3129, 3126, 3143, 3128, 3135, 3129, 3127,
+ 3132, 3137, 3130, 3133, 3141, 3140, 3144, 3131, 3131, 3137,
+ 3140, 3136, 3146, 3134, 3148, 3150, 3143, 3141, 3146, 3151,
+ 0, 3152, 3143, 3153, 3157, 3154, 3150, 3159, 3137, 3158,
+ 3151, 3141, 3160, 3144, 3153, 3162, 3158, 3140, 3168, 3146,
+ 3161, 3148, 3150, 3152, 3161, 3159, 3151, 3154, 3152, 3163,
+
+ 3153, 3157, 3154, 3165, 3159, 3166, 3158, 3163, 3167, 3170,
+ 3173, 3174, 3162, 3172, 3160, 3168, 3167, 3161, 3166, 3176,
+ 3172, 3177, 3178, 3182, 3176, 3179, 3163, 3180, 3181, 3165,
+ 3165, 3185, 3166, 3174, 3180, 3167, 0, 3179, 3174, 3182,
+ 3172, 3170, 3173, 3183, 3184, 3186, 3176, 3181, 3177, 3178,
+ 3182, 3184, 3179, 3186, 3180, 3181, 3189, 3188, 3187, 3199,
+ 3197, 3183, 3191, 3185, 3188, 3190, 3192, 3202, 3193, 3198,
+ 3183, 3184, 3186, 3187, 3181, 3197, 3198, 3190, 3200, 3201,
+ 3205, 3206, 3207, 3189, 3188, 3187, 3191, 3197, 3203, 3191,
+ 3192, 3199, 3190, 3192, 3193, 3193, 3198, 3203, 3209, 3202,
+
+ 3211, 3213, 3205, 3201, 3207, 3200, 3201, 3205, 3206, 3207,
+ 3208, 3210, 3210, 3214, 3217, 3203, 3213, 3215, 3208, 3215,
+ 3216, 3210, 3214, 3218, 3219, 3220, 3222, 3211, 3213, 3223,
+ 3209, 3218, 3224, 3225, 3216, 3219, 3226, 3208, 3210, 3210,
+ 3214, 3217, 3227, 3220, 3215, 3228, 3229, 3216, 3230, 3226,
+ 3218, 3219, 3220, 3222, 3231, 3225, 3223, 3232, 3234, 3224,
+ 3225, 3233, 3233, 3226, 3227, 3235, 3238, 3239, 3241, 3227,
+ 3242, 3232, 3228, 3229, 3244, 3230, 0, 0, 3239, 3250,
+ 3246, 3231, 3244, 3252, 3232, 3246, 3247, 3235, 3233, 3263,
+ 3234, 3247, 3235, 3238, 3239, 3241, 3248, 3242, 3249, 3253,
+
+ 3253, 3244, 3255, 3249, 3248, 3250, 3250, 3246, 3254, 3258,
+ 3252, 3257, 3259, 3247, 3260, 3255, 3254, 3264, 3257, 3262,
+ 3266, 3263, 3265, 3248, 3264, 3249, 3253, 3258, 3262, 3255,
+ 3265, 3269, 3270, 3272, 3273, 3254, 3258, 3269, 3257, 3259,
+ 3274, 3260, 3266, 3275, 3264, 3277, 3262, 3266, 0, 3265,
+ 3276, 3278, 3279, 3274, 3282, 3283, 3273, 3281, 3269, 3270,
+ 3272, 3273, 3283, 3284, 3277, 3276, 3285, 3274, 3286, 0,
+ 3284, 3287, 3277, 0, 3279, 3275, 3282, 3276, 3278, 3279,
+ 3281, 3282, 3283, 3286, 3281, 3289, 3290, 3302, 3285, 3291,
+ 3284, 3294, 3287, 3285, 3290, 3286, 3291, 3295, 3287, 3292,
+
+ 3294, 3296, 3296, 3297, 3289, 3298, 3292, 3311, 3295, 3297,
+ 3301, 3296, 3289, 3290, 3300, 0, 3291, 3301, 3294, 3302,
+ 3303, 3306, 3312, 3313, 3295, 3307, 3292, 3298, 3296, 3296,
+ 3297, 3305, 3298, 3318, 3311, 3319, 3300, 3301, 3305, 3307,
+ 3321, 3300, 3303, 3320, 3323, 3306, 3313, 3303, 3306, 3312,
+ 3313, 3320, 3307, 3326, 3327, 3327, 3323, 3319, 3305, 3329,
+ 3318, 3331, 3319, 3328, 3328, 3330, 3330, 3321, 3333, 3334,
+ 3320, 3323, 3335, 3336, 0, 3340, 3337, 3344, 3341, 0,
+ 3326, 0, 3336, 3327, 3331, 3341, 3329, 3334, 3331, 3337,
+ 3333, 3342, 3328, 3343, 3330, 3333, 3334, 3349, 3342, 3335,
+
+ 3336, 3340, 3340, 3337, 3344, 3341, 3345, 3348, 3350, 3348,
+ 3351, 3352, 3354, 3345, 3355, 3343, 3356, 3349, 3342, 3358,
+ 3343, 3354, 3357, 3352, 3349, 3359, 3360, 3364, 3351, 3362,
+ 3361, 3350, 3364, 3345, 3348, 3350, 3355, 3351, 3352, 3354,
+ 3357, 3355, 3361, 3356, 3363, 3358, 3358, 3363, 3365, 3357,
+ 3369, 3362, 3359, 3360, 3367, 3368, 3362, 3361, 3366, 3364,
+ 3366, 3368, 3363, 3372, 3370, 3371, 3367, 3373, 3374, 3375,
+ 3376, 3363, 3369, 3371, 3363, 3377, 3378, 3369, 3381, 3383,
+ 3365, 3367, 3368, 3384, 3386, 3366, 3370, 3377, 3388, 3374,
+ 3372, 3370, 3371, 3386, 3389, 3374, 3375, 3376, 3378, 3373,
+
+ 3390, 3384, 3377, 3378, 3391, 3381, 3383, 3393, 3394, 3395,
+ 3384, 3386, 3396, 3397, 3397, 3388, 3400, 3401, 3403, 3399,
+ 3402, 3389, 3404, 3406, 3407, 3408, 0, 3390, 0, 3404,
+ 3409, 3391, 3407, 3403, 3393, 3394, 3395, 3399, 3402, 3396,
+ 3397, 3410, 3409, 3400, 3401, 3403, 3399, 3402, 3411, 3404,
+ 3406, 3407, 3408, 3412, 3413, 3410, 3416, 3409, 3415, 0,
+ 3419, 3427, 3420, 3411, 3421, 3421, 3422, 3423, 3410, 3419,
+ 3415, 3425, 3426, 0, 3427, 3411, 3423, 0, 3428, 3412,
+ 3412, 3413, 3429, 3416, 3434, 3415, 3420, 3419, 3427, 3420,
+ 3429, 3421, 3422, 3422, 3423, 3425, 3431, 3430, 3425, 3433,
+
+ 3428, 3438, 3434, 3442, 3426, 3428, 3430, 3431, 3437, 3429,
+ 3442, 3434, 3451, 3438, 3441, 3441, 3452, 3456, 3455, 3457,
+ 3433, 3459, 0, 3431, 3430, 3461, 3433, 3463, 3438, 3461,
+ 3442, 3437, 3455, 3462, 3451, 3437, 0, 3471, 0, 3451,
+ 3452, 3441, 3464, 3452, 3456, 3455, 3457, 3469, 3459, 3464,
+ 3463, 3462, 3461, 3466, 3463, 3468, 3470, 3474, 3472, 3468,
+ 3462, 3473, 3471, 3469, 3471, 3475, 3466, 3476, 3477, 3464,
+ 3472, 3474, 3480, 3475, 3469, 3478, 3476, 3478, 3470, 3477,
+ 3466, 3479, 3468, 3470, 3474, 3472, 3481, 3473, 3473, 3482,
+ 3480, 3483, 3475, 3479, 3476, 3477, 3485, 3483, 3484, 3480,
+
+ 3486, 3481, 3478, 3487, 3485, 3493, 3488, 3494, 3479, 3492,
+ 3487, 3482, 3493, 3481, 3496, 3498, 3482, 3495, 3483, 3497,
+ 3484, 3499, 3492, 3485, 3501, 3484, 3502, 3486, 3488, 3500,
+ 3487, 3501, 3493, 3488, 3494, 3495, 3492, 3500, 3503, 3504,
+ 3506, 3496, 3498, 3507, 3495, 3497, 3497, 3505, 3499, 3505,
+ 3502, 3501, 3506, 3502, 3509, 3508, 3500, 3510, 3511, 3513,
+ 3503, 3504, 3514, 3512, 3516, 3503, 3504, 3506, 3508, 3509,
+ 3512, 3517, 3518, 3519, 3505, 3507, 3521, 3526, 3523, 3510,
+ 3518, 3509, 3508, 3517, 3510, 3511, 3513, 3523, 3521, 3514,
+ 3512, 3516, 3527, 3528, 3529, 3530, 3531, 3532, 3517, 3518,
+
+ 3519, 0, 3529, 3521, 3526, 3523, 3534, 3535, 3533, 3536,
+ 3532, 3538, 3528, 3545, 3534, 0, 3546, 3542, 3527, 3527,
+ 3528, 3529, 3533, 3542, 3532, 3543, 3545, 3530, 3531, 3535,
+ 3548, 3549, 3543, 3534, 3535, 3533, 3536, 3548, 3538, 3546,
+ 3545, 3550, 3551, 3546, 3542, 3552, 3553, 3556, 3554, 3550,
+ 0, 3562, 3543, 3549, 3553, 3555, 3551, 3548, 3549, 3552,
+ 3559, 3563, 3560, 3564, 3565, 3570, 0, 3559, 3550, 3551,
+ 3554, 3560, 3552, 3553, 3556, 3554, 3561, 3555, 3562, 3566,
+ 3567, 0, 3555, 3563, 3561, 3569, 3568, 3559, 3563, 3560,
+ 3565, 3565, 3572, 3569, 3573, 3564, 3574, 3570, 3578, 3576,
+
+ 0, 3566, 3567, 3561, 3585, 3581, 3566, 3567, 3568, 3577,
+ 0, 3587, 3569, 3568, 0, 3583, 3573, 3577, 3578, 3572,
+ 3579, 3573, 3576, 3574, 3580, 3578, 3576, 3582, 3579, 3583,
+ 3585, 3585, 3580, 3589, 3592, 3582, 3577, 3581, 3587, 3593,
+ 3588, 3590, 3583, 3588, 3591, 0, 0, 3579, 3592, 3590,
+ 3594, 3580, 3591, 3598, 3582, 3589, 3597, 3597, 3588, 3595,
+ 3589, 3592, 3600, 0, 3601, 3593, 3593, 3588, 3590, 0,
+ 3588, 3591, 3594, 3595, 3599, 3602, 3603, 3594, 3605, 3598,
+ 3598, 3607, 3599, 3597, 3604, 3606, 3595, 3608, 3600, 3600,
+ 3601, 3601, 3604, 3609, 3612, 3610, 3603, 3602, 3615, 0,
+
+ 0, 3599, 3602, 3603, 3618, 3605, 3607, 3606, 3607, 3611,
+ 3613, 3604, 3606, 3609, 3608, 3610, 3612, 3611, 3613, 3616,
+ 3609, 3612, 3610, 3619, 3620, 3615, 3618, 3616, 3622, 3624,
+ 3621, 3618, 3620, 3625, 3626, 3628, 3611, 3613, 3621, 3627,
+ 3631, 3625, 3626, 3629, 3632, 3619, 3616, 3635, 3633, 3641,
+ 3619, 3620, 3642, 0, 3622, 3622, 3624, 3621, 3638, 0,
+ 3625, 3626, 3628, 3629, 3639, 3627, 3627, 3631, 3633, 3635,
+ 3629, 3632, 3639, 3640, 3635, 3633, 3641, 0, 0, 3642,
+ 3638, 3640, 0, 0, 0, 3638, 0, 0, 0, 0,
+ 0, 3639, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 3640, 3646, 3646, 3646, 3646, 3646, 3646, 3646, 3647, 3647,
+ 3647, 3647, 3647, 3647, 3647, 3648, 3648, 3648, 3648, 3648,
+ 3648, 3648, 3649, 3649, 3649, 3649, 3649, 3649, 3649, 3650,
+ 3650, 3650, 3650, 3650, 3650, 3650, 3651, 3651, 3651, 3651,
+ 3651, 3651, 3651, 3652, 3652, 3652, 3652, 3652, 3652, 3652,
+ 3654, 3654, 0, 3654, 3654, 3654, 3654, 3655, 3655, 0,
+ 0, 0, 3655, 3655, 3656, 3656, 0, 0, 3656, 0,
+ 3656, 3657, 0, 0, 0, 0, 0, 3657, 3658, 3658,
+ 0, 0, 0, 3658, 3658, 3659, 0, 0, 0, 0,
+ 0, 3659, 3660, 3660, 0, 3660, 3660, 3660, 3660, 3661,
+
+ 0, 0, 0, 0, 0, 3661, 3662, 3662, 0, 0,
+ 0, 3662, 3662, 3663, 3663, 0, 3663, 3663, 3663, 3663,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645
} ;
static yy_state_type yy_last_accepting_state;
@@ -4097,7 +4142,7 @@ static void config_end_include(void)
}
#endif
-#line 4098 "<stdout>"
+#line 4143 "<stdout>"
#define YY_NO_INPUT 1
#line 191 "util/configlexer.lex"
#ifndef YY_NO_UNPUT
@@ -4106,9 +4151,9 @@ static void config_end_include(void)
#ifndef YY_NO_INPUT
#define YY_NO_INPUT 1
#endif
-#line 4107 "<stdout>"
+#line 4152 "<stdout>"
-#line 4109 "<stdout>"
+#line 4154 "<stdout>"
#define INITIAL 0
#define quotedstring 1
@@ -4332,7 +4377,7 @@ YY_DECL
{
#line 211 "util/configlexer.lex"
-#line 4333 "<stdout>"
+#line 4378 "<stdout>"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
@@ -4365,13 +4410,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 3600 )
+ if ( yy_current_state >= 3646 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 10283 );
+ while ( yy_base[yy_current_state] != 10421 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
@@ -5161,959 +5206,989 @@ YY_RULE_SETUP
case 153:
YY_RULE_SETUP
#line 367 "util/configlexer.lex"
-{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
+{ YDVAR(2, VAR_INTERFACE_ACTION) }
YY_BREAK
case 154:
YY_RULE_SETUP
#line 368 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
+{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
YY_BREAK
case 155:
YY_RULE_SETUP
#line 369 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
YY_BREAK
case 156:
YY_RULE_SETUP
#line 370 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
YY_BREAK
case 157:
YY_RULE_SETUP
#line 371 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
YY_BREAK
case 158:
YY_RULE_SETUP
#line 372 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
+{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
YY_BREAK
case 159:
YY_RULE_SETUP
#line 373 "util/configlexer.lex"
-{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) }
+{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
YY_BREAK
case 160:
YY_RULE_SETUP
#line 374 "util/configlexer.lex"
-{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) }
+{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) }
YY_BREAK
case 161:
YY_RULE_SETUP
#line 375 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) }
+{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) }
YY_BREAK
case 162:
YY_RULE_SETUP
#line 376 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) }
+{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) }
YY_BREAK
case 163:
YY_RULE_SETUP
#line 377 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_IDENTITY) }
+{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) }
YY_BREAK
case 164:
YY_RULE_SETUP
#line 378 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_VERSION) }
+{ YDVAR(1, VAR_HIDE_IDENTITY) }
YY_BREAK
case 165:
YY_RULE_SETUP
#line 379 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
+{ YDVAR(1, VAR_HIDE_VERSION) }
YY_BREAK
case 166:
YY_RULE_SETUP
#line 380 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_HTTP_USER_AGENT) }
+{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
YY_BREAK
case 167:
YY_RULE_SETUP
#line 381 "util/configlexer.lex"
-{ YDVAR(1, VAR_IDENTITY) }
+{ YDVAR(1, VAR_HIDE_HTTP_USER_AGENT) }
YY_BREAK
case 168:
YY_RULE_SETUP
#line 382 "util/configlexer.lex"
-{ YDVAR(1, VAR_VERSION) }
+{ YDVAR(1, VAR_IDENTITY) }
YY_BREAK
case 169:
YY_RULE_SETUP
#line 383 "util/configlexer.lex"
-{ YDVAR(1, VAR_HTTP_USER_AGENT) }
+{ YDVAR(1, VAR_VERSION) }
YY_BREAK
case 170:
YY_RULE_SETUP
#line 384 "util/configlexer.lex"
-{ YDVAR(1, VAR_MODULE_CONF) }
+{ YDVAR(1, VAR_HTTP_USER_AGENT) }
YY_BREAK
case 171:
YY_RULE_SETUP
#line 385 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR) }
+{ YDVAR(1, VAR_MODULE_CONF) }
YY_BREAK
case 172:
YY_RULE_SETUP
#line 386 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
+{ YDVAR(1, VAR_DLV_ANCHOR) }
YY_BREAK
case 173:
YY_RULE_SETUP
#line 387 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
YY_BREAK
case 174:
YY_RULE_SETUP
#line 388 "util/configlexer.lex"
-{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
YY_BREAK
case 175:
YY_RULE_SETUP
#line 389 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
+{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
YY_BREAK
case 176:
YY_RULE_SETUP
#line 390 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR) }
+{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
YY_BREAK
case 177:
YY_RULE_SETUP
#line 391 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
+{ YDVAR(1, VAR_TRUST_ANCHOR) }
YY_BREAK
case 178:
YY_RULE_SETUP
#line 392 "util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
YY_BREAK
case 179:
YY_RULE_SETUP
#line 393 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
+{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
YY_BREAK
case 180:
YY_RULE_SETUP
#line 394 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
+{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
YY_BREAK
case 181:
YY_RULE_SETUP
#line 395 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
YY_BREAK
case 182:
YY_RULE_SETUP
#line 396 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_MAX_RESTART) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
YY_BREAK
case 183:
YY_RULE_SETUP
#line 397 "util/configlexer.lex"
-{ YDVAR(1, VAR_BOGUS_TTL) }
+{ YDVAR(1, VAR_VAL_MAX_RESTART) }
YY_BREAK
case 184:
YY_RULE_SETUP
#line 398 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
+{ YDVAR(1, VAR_BOGUS_TTL) }
YY_BREAK
case 185:
YY_RULE_SETUP
#line 399 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
+{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
YY_BREAK
case 186:
YY_RULE_SETUP
#line 400 "util/configlexer.lex"
-{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
+{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
YY_BREAK
case 187:
YY_RULE_SETUP
#line 401 "util/configlexer.lex"
-{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
+{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
YY_BREAK
case 188:
YY_RULE_SETUP
#line 402 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED) }
+{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
YY_BREAK
case 189:
YY_RULE_SETUP
#line 403 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) }
+{ YDVAR(1, VAR_SERVE_EXPIRED) }
YY_BREAK
case 190:
YY_RULE_SETUP
#line 404 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) }
YY_BREAK
case 191:
YY_RULE_SETUP
#line 405 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) }
YY_BREAK
case 192:
YY_RULE_SETUP
#line 406 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) }
YY_BREAK
case 193:
YY_RULE_SETUP
#line 407 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDE_SERVE_EXPIRED) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) }
YY_BREAK
case 194:
YY_RULE_SETUP
#line 408 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) }
+{ YDVAR(1, VAR_EDE_SERVE_EXPIRED) }
YY_BREAK
case 195:
YY_RULE_SETUP
#line 409 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_DSA) }
+{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) }
YY_BREAK
case 196:
YY_RULE_SETUP
#line 410 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_SHA1) }
+{ YDVAR(1, VAR_FAKE_DSA) }
YY_BREAK
case 197:
YY_RULE_SETUP
#line 411 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
+{ YDVAR(1, VAR_FAKE_SHA1) }
YY_BREAK
case 198:
YY_RULE_SETUP
#line 412 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
+{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
YY_BREAK
case 199:
YY_RULE_SETUP
#line 413 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
+{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
YY_BREAK
case 200:
YY_RULE_SETUP
#line 414 "util/configlexer.lex"
-{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
+{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
YY_BREAK
case 201:
YY_RULE_SETUP
#line 415 "util/configlexer.lex"
-{
- YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
+{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
YY_BREAK
case 202:
YY_RULE_SETUP
-#line 417 "util/configlexer.lex"
-{ YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) }
+#line 416 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
YY_BREAK
case 203:
YY_RULE_SETUP
#line 418 "util/configlexer.lex"
-{ YDVAR(1, VAR_ZONEMD_CHECK) }
+{ YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) }
YY_BREAK
case 204:
YY_RULE_SETUP
#line 419 "util/configlexer.lex"
-{ YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) }
+{ YDVAR(1, VAR_ZONEMD_CHECK) }
YY_BREAK
case 205:
YY_RULE_SETUP
#line 420 "util/configlexer.lex"
-{ YDVAR(1, VAR_ADD_HOLDDOWN) }
+{ YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) }
YY_BREAK
case 206:
YY_RULE_SETUP
#line 421 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEL_HOLDDOWN) }
+{ YDVAR(1, VAR_ADD_HOLDDOWN) }
YY_BREAK
case 207:
YY_RULE_SETUP
#line 422 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEEP_MISSING) }
+{ YDVAR(1, VAR_DEL_HOLDDOWN) }
YY_BREAK
case 208:
YY_RULE_SETUP
#line 423 "util/configlexer.lex"
-{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
+{ YDVAR(1, VAR_KEEP_MISSING) }
YY_BREAK
case 209:
YY_RULE_SETUP
#line 424 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSLOG) }
+{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
YY_BREAK
case 210:
YY_RULE_SETUP
#line 425 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_IDENTITY) }
+{ YDVAR(1, VAR_USE_SYSLOG) }
YY_BREAK
case 211:
YY_RULE_SETUP
#line 426 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TIME_ASCII) }
+{ YDVAR(1, VAR_LOG_IDENTITY) }
YY_BREAK
case 212:
YY_RULE_SETUP
#line 427 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_QUERIES) }
+{ YDVAR(1, VAR_LOG_TIME_ASCII) }
YY_BREAK
case 213:
YY_RULE_SETUP
#line 428 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_REPLIES) }
+{ YDVAR(1, VAR_LOG_QUERIES) }
YY_BREAK
case 214:
YY_RULE_SETUP
#line 429 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) }
+{ YDVAR(1, VAR_LOG_REPLIES) }
YY_BREAK
case 215:
YY_RULE_SETUP
#line 430 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
+{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) }
YY_BREAK
case 216:
YY_RULE_SETUP
#line 431 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_SERVFAIL) }
+{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
YY_BREAK
case 217:
YY_RULE_SETUP
#line 432 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE) }
+{ YDVAR(1, VAR_LOG_SERVFAIL) }
YY_BREAK
case 218:
YY_RULE_SETUP
#line 433 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA) }
+{ YDVAR(2, VAR_LOCAL_ZONE) }
YY_BREAK
case 219:
YY_RULE_SETUP
#line 434 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
+{ YDVAR(1, VAR_LOCAL_DATA) }
YY_BREAK
case 220:
YY_RULE_SETUP
#line 435 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
+{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
YY_BREAK
case 221:
YY_RULE_SETUP
#line 436 "util/configlexer.lex"
-{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
+{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
YY_BREAK
case 222:
YY_RULE_SETUP
#line 437 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
+{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
YY_BREAK
case 223:
YY_RULE_SETUP
#line 438 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
+{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
YY_BREAK
case 224:
YY_RULE_SETUP
#line 439 "util/configlexer.lex"
-{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
+{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
YY_BREAK
case 225:
YY_RULE_SETUP
#line 440 "util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_ENABLE) }
+{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
YY_BREAK
case 226:
YY_RULE_SETUP
#line 441 "util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_KEY) }
+{ YDVAR(1, VAR_SHM_ENABLE) }
YY_BREAK
case 227:
YY_RULE_SETUP
#line 442 "util/configlexer.lex"
-{ YDVAR(0, VAR_REMOTE_CONTROL) }
+{ YDVAR(1, VAR_SHM_KEY) }
YY_BREAK
case 228:
YY_RULE_SETUP
#line 443 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_ENABLE) }
+{ YDVAR(0, VAR_REMOTE_CONTROL) }
YY_BREAK
case 229:
YY_RULE_SETUP
#line 444 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_INTERFACE) }
+{ YDVAR(1, VAR_CONTROL_ENABLE) }
YY_BREAK
case 230:
YY_RULE_SETUP
#line 445 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_PORT) }
+{ YDVAR(1, VAR_CONTROL_INTERFACE) }
YY_BREAK
case 231:
YY_RULE_SETUP
#line 446 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_USE_CERT) }
+{ YDVAR(1, VAR_CONTROL_PORT) }
YY_BREAK
case 232:
YY_RULE_SETUP
#line 447 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_KEY_FILE) }
+{ YDVAR(1, VAR_CONTROL_USE_CERT) }
YY_BREAK
case 233:
YY_RULE_SETUP
#line 448 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_CERT_FILE) }
+{ YDVAR(1, VAR_SERVER_KEY_FILE) }
YY_BREAK
case 234:
YY_RULE_SETUP
#line 449 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
+{ YDVAR(1, VAR_SERVER_CERT_FILE) }
YY_BREAK
case 235:
YY_RULE_SETUP
#line 450 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
+{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
YY_BREAK
case 236:
YY_RULE_SETUP
#line 451 "util/configlexer.lex"
-{ YDVAR(1, VAR_PYTHON_SCRIPT) }
+{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
YY_BREAK
case 237:
YY_RULE_SETUP
#line 452 "util/configlexer.lex"
-{ YDVAR(0, VAR_PYTHON) }
+{ YDVAR(1, VAR_PYTHON_SCRIPT) }
YY_BREAK
case 238:
YY_RULE_SETUP
#line 453 "util/configlexer.lex"
-{ YDVAR(1, VAR_DYNLIB_FILE) }
+{ YDVAR(0, VAR_PYTHON) }
YY_BREAK
case 239:
YY_RULE_SETUP
#line 454 "util/configlexer.lex"
-{ YDVAR(0, VAR_DYNLIB) }
+{ YDVAR(1, VAR_DYNLIB_FILE) }
YY_BREAK
case 240:
YY_RULE_SETUP
#line 455 "util/configlexer.lex"
-{ YDVAR(1, VAR_DOMAIN_INSECURE) }
+{ YDVAR(0, VAR_DYNLIB) }
YY_BREAK
case 241:
YY_RULE_SETUP
#line 456 "util/configlexer.lex"
-{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
+{ YDVAR(1, VAR_DOMAIN_INSECURE) }
YY_BREAK
case 242:
YY_RULE_SETUP
#line 457 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
+{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
YY_BREAK
case 243:
YY_RULE_SETUP
#line 458 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) }
+{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
YY_BREAK
case 244:
YY_RULE_SETUP
#line 459 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_UDP_SIZE) }
+{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) }
YY_BREAK
case 245:
YY_RULE_SETUP
#line 460 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_PREFIX) }
+{ YDVAR(1, VAR_MAX_UDP_SIZE) }
YY_BREAK
case 246:
YY_RULE_SETUP
#line 461 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_SYNTHALL) }
+{ YDVAR(1, VAR_DNS64_PREFIX) }
YY_BREAK
case 247:
YY_RULE_SETUP
#line 462 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
+{ YDVAR(1, VAR_DNS64_SYNTHALL) }
YY_BREAK
case 248:
YY_RULE_SETUP
#line 463 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEFINE_TAG) }
+{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
YY_BREAK
case 249:
YY_RULE_SETUP
#line 464 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
+{ YDVAR(1, VAR_DEFINE_TAG) }
YY_BREAK
case 250:
YY_RULE_SETUP
#line 465 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
+{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
YY_BREAK
case 251:
YY_RULE_SETUP
#line 466 "util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
YY_BREAK
case 252:
YY_RULE_SETUP
#line 467 "util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
YY_BREAK
case 253:
YY_RULE_SETUP
#line 468 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
YY_BREAK
case 254:
YY_RULE_SETUP
#line 469 "util/configlexer.lex"
-{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
YY_BREAK
case 255:
YY_RULE_SETUP
#line 470 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSTAP) }
+{ YDVAR(2, VAR_INTERFACE_TAG) }
YY_BREAK
case 256:
YY_RULE_SETUP
#line 471 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_ENABLE) }
+{ YDVAR(3, VAR_INTERFACE_TAG_ACTION) }
YY_BREAK
case 257:
YY_RULE_SETUP
#line 472 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) }
+{ YDVAR(3, VAR_INTERFACE_TAG_DATA) }
YY_BREAK
case 258:
YY_RULE_SETUP
#line 473 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
+{ YDVAR(2, VAR_INTERFACE_VIEW) }
YY_BREAK
case 259:
YY_RULE_SETUP
#line 474 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IP) }
+{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
YY_BREAK
case 260:
YY_RULE_SETUP
#line 475 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_TLS) }
+{ YDVAR(0, VAR_DNSTAP) }
YY_BREAK
case 261:
YY_RULE_SETUP
#line 476 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) }
+{ YDVAR(1, VAR_DNSTAP_ENABLE) }
YY_BREAK
case 262:
YY_RULE_SETUP
#line 477 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) }
+{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) }
YY_BREAK
case 263:
YY_RULE_SETUP
#line 478 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) }
+{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
YY_BREAK
case 264:
YY_RULE_SETUP
-#line 480 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) }
+#line 479 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_IP) }
YY_BREAK
case 265:
YY_RULE_SETUP
-#line 482 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
+#line 480 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_TLS) }
YY_BREAK
case 266:
YY_RULE_SETUP
-#line 483 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
+#line 481 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) }
YY_BREAK
case 267:
YY_RULE_SETUP
-#line 484 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
+#line 482 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) }
YY_BREAK
case 268:
YY_RULE_SETUP
-#line 485 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_VERSION) }
+#line 483 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) }
YY_BREAK
case 269:
YY_RULE_SETUP
-#line 486 "util/configlexer.lex"
+#line 485 "util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) }
YY_BREAK
case 270:
YY_RULE_SETUP
-#line 488 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
+#line 487 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
YY_BREAK
case 271:
YY_RULE_SETUP
-#line 490 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
+#line 488 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
YY_BREAK
case 272:
YY_RULE_SETUP
-#line 492 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
+#line 489 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
YY_BREAK
case 273:
YY_RULE_SETUP
-#line 494 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
+#line 490 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_VERSION) }
YY_BREAK
case 274:
YY_RULE_SETUP
-#line 496 "util/configlexer.lex"
+#line 491 "util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
YY_BREAK
case 275:
YY_RULE_SETUP
-#line 498 "util/configlexer.lex"
-{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
+#line 493 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
YY_BREAK
case 276:
YY_RULE_SETUP
-#line 499 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT) }
+#line 495 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
YY_BREAK
case 277:
YY_RULE_SETUP
-#line 500 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT) }
+#line 497 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
YY_BREAK
case 278:
YY_RULE_SETUP
-#line 501 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
+#line 499 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
YY_BREAK
case 279:
YY_RULE_SETUP
-#line 502 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SLABS) }
+#line 501 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
YY_BREAK
case 280:
YY_RULE_SETUP
#line 503 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
YY_BREAK
case 281:
YY_RULE_SETUP
#line 504 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_IP_RATELIMIT) }
YY_BREAK
case 282:
YY_RULE_SETUP
#line 505 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
+{ YDVAR(1, VAR_RATELIMIT) }
YY_BREAK
case 283:
YY_RULE_SETUP
#line 506 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
YY_BREAK
case 284:
YY_RULE_SETUP
#line 507 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_RATELIMIT_SLABS) }
YY_BREAK
case 285:
YY_RULE_SETUP
#line 508 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
YY_BREAK
case 286:
YY_RULE_SETUP
#line 509 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_BACKOFF) }
+{ YDVAR(1, VAR_RATELIMIT_SIZE) }
YY_BREAK
case 287:
YY_RULE_SETUP
#line 510 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_BACKOFF) }
+{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
YY_BREAK
case 288:
YY_RULE_SETUP
#line 511 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTBOUND_MSG_RETRY) }
+{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
YY_BREAK
case 289:
YY_RULE_SETUP
#line 512 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOW_RTT) }
+{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
YY_BREAK
case 290:
YY_RULE_SETUP
#line 513 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_NUM) }
+{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
YY_BREAK
case 291:
YY_RULE_SETUP
#line 514 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_IP_RATELIMIT_BACKOFF) }
YY_BREAK
case 292:
YY_RULE_SETUP
#line 515 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_RATELIMIT_BACKOFF) }
YY_BREAK
case 293:
YY_RULE_SETUP
#line 516 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_OUTBOUND_MSG_RETRY) }
YY_BREAK
case 294:
YY_RULE_SETUP
#line 517 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
+{ YDVAR(1, VAR_LOW_RTT) }
YY_BREAK
case 295:
YY_RULE_SETUP
#line 518 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP) }
+{ YDVAR(1, VAR_FAST_SERVER_NUM) }
YY_BREAK
case 296:
YY_RULE_SETUP
#line 519 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
YY_BREAK
case 297:
YY_RULE_SETUP
#line 520 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSCRYPT) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
YY_BREAK
case 298:
YY_RULE_SETUP
#line 521 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
YY_BREAK
case 299:
YY_RULE_SETUP
#line 522 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PORT) }
+{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
YY_BREAK
case 300:
YY_RULE_SETUP
#line 523 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
+{ YDVAR(2, VAR_RESPONSE_IP) }
YY_BREAK
case 301:
YY_RULE_SETUP
#line 524 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
+{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
YY_BREAK
case 302:
YY_RULE_SETUP
#line 525 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
+{ YDVAR(0, VAR_DNSCRYPT) }
YY_BREAK
case 303:
YY_RULE_SETUP
#line 526 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
+{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
YY_BREAK
case 304:
YY_RULE_SETUP
#line 527 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
+{ YDVAR(1, VAR_DNSCRYPT_PORT) }
YY_BREAK
case 305:
YY_RULE_SETUP
-#line 529 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
+#line 528 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
YY_BREAK
case 306:
YY_RULE_SETUP
-#line 531 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
+#line 529 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
YY_BREAK
case 307:
YY_RULE_SETUP
-#line 532 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
+#line 530 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
YY_BREAK
case 308:
YY_RULE_SETUP
-#line 533 "util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_RESPONSES) }
+#line 531 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
YY_BREAK
case 309:
YY_RULE_SETUP
-#line 534 "util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) }
+#line 532 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
YY_BREAK
case 310:
YY_RULE_SETUP
-#line 535 "util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_QUERIES) }
+#line 534 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
YY_BREAK
case 311:
YY_RULE_SETUP
#line 536 "util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
YY_BREAK
case 312:
YY_RULE_SETUP
#line 537 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
YY_BREAK
case 313:
YY_RULE_SETUP
#line 538 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
+{ YDVAR(1, VAR_PAD_RESPONSES) }
YY_BREAK
case 314:
YY_RULE_SETUP
#line 539 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_HOOK) }
+{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) }
YY_BREAK
case 315:
YY_RULE_SETUP
#line 540 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
+{ YDVAR(1, VAR_PAD_QUERIES) }
YY_BREAK
case 316:
YY_RULE_SETUP
#line 541 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) }
YY_BREAK
case 317:
YY_RULE_SETUP
#line 542 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
YY_BREAK
case 318:
YY_RULE_SETUP
#line 543 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_STRICT) }
+{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
YY_BREAK
case 319:
YY_RULE_SETUP
#line 544 "util/configlexer.lex"
-{ YDVAR(0, VAR_CACHEDB) }
+{ YDVAR(1, VAR_IPSECMOD_HOOK) }
YY_BREAK
case 320:
YY_RULE_SETUP
#line 545 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_BACKEND) }
+{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
YY_BREAK
case 321:
YY_RULE_SETUP
#line 546 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
+{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
YY_BREAK
case 322:
YY_RULE_SETUP
#line 547 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
+{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
YY_BREAK
case 323:
YY_RULE_SETUP
#line 548 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
+{ YDVAR(1, VAR_IPSECMOD_STRICT) }
YY_BREAK
case 324:
YY_RULE_SETUP
#line 549 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
+{ YDVAR(0, VAR_CACHEDB) }
YY_BREAK
case 325:
YY_RULE_SETUP
#line 550 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) }
+{ YDVAR(1, VAR_CACHEDB_BACKEND) }
YY_BREAK
case 326:
YY_RULE_SETUP
#line 551 "util/configlexer.lex"
-{ YDVAR(0, VAR_IPSET) }
+{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
YY_BREAK
case 327:
YY_RULE_SETUP
#line 552 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSET_NAME_V4) }
+{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
YY_BREAK
case 328:
YY_RULE_SETUP
#line 553 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSET_NAME_V6) }
+{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
YY_BREAK
case 329:
YY_RULE_SETUP
#line 554 "util/configlexer.lex"
-{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
YY_BREAK
case 330:
YY_RULE_SETUP
#line 555 "util/configlexer.lex"
-{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
+{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) }
YY_BREAK
case 331:
YY_RULE_SETUP
#line 556 "util/configlexer.lex"
-{ YDVAR(2, VAR_EDNS_CLIENT_STRING) }
+{ YDVAR(0, VAR_IPSET) }
YY_BREAK
case 332:
YY_RULE_SETUP
#line 557 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
+{ YDVAR(1, VAR_IPSET_NAME_V4) }
YY_BREAK
case 333:
YY_RULE_SETUP
#line 558 "util/configlexer.lex"
-{ YDVAR(1, VAR_NSID ) }
+{ YDVAR(1, VAR_IPSET_NAME_V6) }
YY_BREAK
case 334:
YY_RULE_SETUP
#line 559 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDE ) }
+{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
YY_BREAK
case 335:
-/* rule 335 can match eol */
YY_RULE_SETUP
#line 560 "util/configlexer.lex"
-{ LEXOUT(("NL\n")); cfg_parser->line++; }
+{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
YY_BREAK
-/* Quoted strings. Strip leading and ending quotes */
case 336:
YY_RULE_SETUP
+#line 561 "util/configlexer.lex"
+{ YDVAR(2, VAR_EDNS_CLIENT_STRING) }
+ YY_BREAK
+case 337:
+YY_RULE_SETUP
+#line 562 "util/configlexer.lex"
+{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
+ YY_BREAK
+case 338:
+YY_RULE_SETUP
#line 563 "util/configlexer.lex"
+{ YDVAR(1, VAR_NSID ) }
+ YY_BREAK
+case 339:
+YY_RULE_SETUP
+#line 564 "util/configlexer.lex"
+{ YDVAR(1, VAR_EDE ) }
+ YY_BREAK
+case 340:
+YY_RULE_SETUP
+#line 565 "util/configlexer.lex"
+{ YDVAR(1, VAR_PROXY_PROTOCOL_PORT) }
+ YY_BREAK
+case 341:
+/* rule 341 can match eol */
+YY_RULE_SETUP
+#line 566 "util/configlexer.lex"
+{ LEXOUT(("NL\n")); cfg_parser->line++; }
+ YY_BREAK
+/* Quoted strings. Strip leading and ending quotes */
+case 342:
+YY_RULE_SETUP
+#line 569 "util/configlexer.lex"
{ BEGIN(quotedstring); LEXOUT(("QS ")); }
YY_BREAK
case YY_STATE_EOF(quotedstring):
-#line 564 "util/configlexer.lex"
+#line 570 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 337:
+case 343:
YY_RULE_SETUP
-#line 569 "util/configlexer.lex"
+#line 575 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 338:
-/* rule 338 can match eol */
+case 344:
+/* rule 344 can match eol */
YY_RULE_SETUP
-#line 570 "util/configlexer.lex"
+#line 576 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end \"");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 339:
+case 345:
YY_RULE_SETUP
-#line 572 "util/configlexer.lex"
+#line 578 "util/configlexer.lex"
{
LEXOUT(("QE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -6126,34 +6201,34 @@ YY_RULE_SETUP
}
YY_BREAK
/* Single Quoted strings. Strip leading and ending quotes */
-case 340:
+case 346:
YY_RULE_SETUP
-#line 584 "util/configlexer.lex"
+#line 590 "util/configlexer.lex"
{ BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
YY_BREAK
case YY_STATE_EOF(singlequotedstr):
-#line 585 "util/configlexer.lex"
+#line 591 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 341:
+case 347:
YY_RULE_SETUP
-#line 590 "util/configlexer.lex"
+#line 596 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 342:
-/* rule 342 can match eol */
+case 348:
+/* rule 348 can match eol */
YY_RULE_SETUP
-#line 591 "util/configlexer.lex"
+#line 597 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end '");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 343:
+case 349:
YY_RULE_SETUP
-#line 593 "util/configlexer.lex"
+#line 599 "util/configlexer.lex"
{
LEXOUT(("SQE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -6166,38 +6241,38 @@ YY_RULE_SETUP
}
YY_BREAK
/* include: directive */
-case 344:
+case 350:
YY_RULE_SETUP
-#line 605 "util/configlexer.lex"
+#line 611 "util/configlexer.lex"
{
LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
YY_BREAK
case YY_STATE_EOF(include):
-#line 607 "util/configlexer.lex"
+#line 613 "util/configlexer.lex"
{
yyerror("EOF inside include directive");
BEGIN(inc_prev);
}
YY_BREAK
-case 345:
+case 351:
YY_RULE_SETUP
-#line 611 "util/configlexer.lex"
+#line 617 "util/configlexer.lex"
{ LEXOUT(("ISP ")); /* ignore */ }
YY_BREAK
-case 346:
-/* rule 346 can match eol */
+case 352:
+/* rule 352 can match eol */
YY_RULE_SETUP
-#line 612 "util/configlexer.lex"
+#line 618 "util/configlexer.lex"
{ LEXOUT(("NL\n")); cfg_parser->line++;}
YY_BREAK
-case 347:
+case 353:
YY_RULE_SETUP
-#line 613 "util/configlexer.lex"
+#line 619 "util/configlexer.lex"
{ LEXOUT(("IQS ")); BEGIN(include_quoted); }
YY_BREAK
-case 348:
+case 354:
YY_RULE_SETUP
-#line 614 "util/configlexer.lex"
+#line 620 "util/configlexer.lex"
{
LEXOUT(("Iunquotedstr(%s) ", yytext));
config_start_include_glob(yytext, 0);
@@ -6205,27 +6280,27 @@ YY_RULE_SETUP
}
YY_BREAK
case YY_STATE_EOF(include_quoted):
-#line 619 "util/configlexer.lex"
+#line 625 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
BEGIN(inc_prev);
}
YY_BREAK
-case 349:
+case 355:
YY_RULE_SETUP
-#line 623 "util/configlexer.lex"
+#line 629 "util/configlexer.lex"
{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 350:
-/* rule 350 can match eol */
+case 356:
+/* rule 356 can match eol */
YY_RULE_SETUP
-#line 624 "util/configlexer.lex"
+#line 630 "util/configlexer.lex"
{ yyerror("newline before \" in include name");
cfg_parser->line++; BEGIN(inc_prev); }
YY_BREAK
-case 351:
+case 357:
YY_RULE_SETUP
-#line 626 "util/configlexer.lex"
+#line 632 "util/configlexer.lex"
{
LEXOUT(("IQE "));
yytext[yyleng - 1] = '\0';
@@ -6235,7 +6310,7 @@ YY_RULE_SETUP
YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(val):
-#line 632 "util/configlexer.lex"
+#line 638 "util/configlexer.lex"
{
LEXOUT(("LEXEOF "));
yy_set_bol(1); /* Set beginning of line, so "^" rules match. */
@@ -6250,39 +6325,39 @@ case YY_STATE_EOF(val):
}
YY_BREAK
/* include-toplevel: directive */
-case 352:
+case 358:
YY_RULE_SETUP
-#line 646 "util/configlexer.lex"
+#line 652 "util/configlexer.lex"
{
LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include_toplevel);
}
YY_BREAK
case YY_STATE_EOF(include_toplevel):
-#line 649 "util/configlexer.lex"
+#line 655 "util/configlexer.lex"
{
yyerror("EOF inside include_toplevel directive");
BEGIN(inc_prev);
}
YY_BREAK
-case 353:
+case 359:
YY_RULE_SETUP
-#line 653 "util/configlexer.lex"
+#line 659 "util/configlexer.lex"
{ LEXOUT(("ITSP ")); /* ignore */ }
YY_BREAK
-case 354:
-/* rule 354 can match eol */
+case 360:
+/* rule 360 can match eol */
YY_RULE_SETUP
-#line 654 "util/configlexer.lex"
+#line 660 "util/configlexer.lex"
{ LEXOUT(("NL\n")); cfg_parser->line++; }
YY_BREAK
-case 355:
+case 361:
YY_RULE_SETUP
-#line 655 "util/configlexer.lex"
+#line 661 "util/configlexer.lex"
{ LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); }
YY_BREAK
-case 356:
+case 362:
YY_RULE_SETUP
-#line 656 "util/configlexer.lex"
+#line 662 "util/configlexer.lex"
{
LEXOUT(("ITunquotedstr(%s) ", yytext));
config_start_include_glob(yytext, 1);
@@ -6291,29 +6366,29 @@ YY_RULE_SETUP
}
YY_BREAK
case YY_STATE_EOF(include_toplevel_quoted):
-#line 662 "util/configlexer.lex"
+#line 668 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
BEGIN(inc_prev);
}
YY_BREAK
-case 357:
+case 363:
YY_RULE_SETUP
-#line 666 "util/configlexer.lex"
+#line 672 "util/configlexer.lex"
{ LEXOUT(("ITSTR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 358:
-/* rule 358 can match eol */
+case 364:
+/* rule 364 can match eol */
YY_RULE_SETUP
-#line 667 "util/configlexer.lex"
+#line 673 "util/configlexer.lex"
{
yyerror("newline before \" in include name");
cfg_parser->line++; BEGIN(inc_prev);
}
YY_BREAK
-case 359:
+case 365:
YY_RULE_SETUP
-#line 671 "util/configlexer.lex"
+#line 677 "util/configlexer.lex"
{
LEXOUT(("ITQE "));
yytext[yyleng - 1] = '\0';
@@ -6322,33 +6397,33 @@ YY_RULE_SETUP
return (VAR_FORCE_TOPLEVEL);
}
YY_BREAK
-case 360:
+case 366:
YY_RULE_SETUP
-#line 679 "util/configlexer.lex"
+#line 685 "util/configlexer.lex"
{ LEXOUT(("unquotedstr(%s) ", yytext));
if(--num_args == 0) { BEGIN(INITIAL); }
yylval.str = strdup(yytext); return STRING_ARG; }
YY_BREAK
-case 361:
+case 367:
YY_RULE_SETUP
-#line 683 "util/configlexer.lex"
+#line 689 "util/configlexer.lex"
{
ub_c_error_msg("unknown keyword '%s'", yytext);
}
YY_BREAK
-case 362:
+case 368:
YY_RULE_SETUP
-#line 687 "util/configlexer.lex"
+#line 693 "util/configlexer.lex"
{
ub_c_error_msg("stray '%s'", yytext);
}
YY_BREAK
-case 363:
+case 369:
YY_RULE_SETUP
-#line 691 "util/configlexer.lex"
+#line 697 "util/configlexer.lex"
ECHO;
YY_BREAK
-#line 6349 "<stdout>"
+#line 6424 "<stdout>"
case YY_END_OF_BUFFER:
{
@@ -6643,7 +6718,7 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 3600 )
+ if ( yy_current_state >= 3646 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -6671,11 +6746,11 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 3600 )
+ if ( yy_current_state >= 3646 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
- yy_is_jam = (yy_current_state == 3599);
+ yy_is_jam = (yy_current_state == 3645);
return yy_is_jam ? 0 : yy_current_state;
}
@@ -7314,6 +7389,6 @@ void yyfree (void * ptr )
#define YYTABLES_NAME "yytables"
-#line 691 "util/configlexer.lex"
+#line 697 "util/configlexer.lex"
diff --git a/util/configlexer.lex b/util/configlexer.lex
index a46a74fb640e..09e314b21156 100644
--- a/util/configlexer.lex
+++ b/util/configlexer.lex
@@ -364,6 +364,7 @@ view-first{COLON} { YDVAR(1, VAR_VIEW_FIRST) }
do-not-query-address{COLON} { YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
do-not-query-localhost{COLON} { YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
access-control{COLON} { YDVAR(2, VAR_ACCESS_CONTROL) }
+interface-action{COLON} { YDVAR(2, VAR_INTERFACE_ACTION) }
send-client-subnet{COLON} { YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
client-subnet-zone{COLON} { YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
client-subnet-always-forward{COLON} { YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
@@ -466,6 +467,10 @@ access-control-tag{COLON} { YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
access-control-tag-action{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
access-control-tag-data{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
access-control-view{COLON} { YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
+interface-tag{COLON} { YDVAR(2, VAR_INTERFACE_TAG) }
+interface-tag-action{COLON} { YDVAR(3, VAR_INTERFACE_TAG_ACTION) }
+interface-tag-data{COLON} { YDVAR(3, VAR_INTERFACE_TAG_DATA) }
+interface-view{COLON} { YDVAR(2, VAR_INTERFACE_VIEW) }
local-zone-override{COLON} { YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
dnstap{COLON} { YDVAR(0, VAR_DNSTAP) }
dnstap-enable{COLON} { YDVAR(1, VAR_DNSTAP_ENABLE) }
@@ -557,6 +562,7 @@ edns-client-string{COLON} { YDVAR(2, VAR_EDNS_CLIENT_STRING) }
edns-client-string-opcode{COLON} { YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
nsid{COLON} { YDVAR(1, VAR_NSID ) }
ede{COLON} { YDVAR(1, VAR_EDE ) }
+proxy-protocol-port{COLON} { YDVAR(1, VAR_PROXY_PROTOCOL_PORT) }
<INITIAL,val>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; }
/* Quoted strings. Strip leading and ending quotes */
diff --git a/util/configparser.c b/util/configparser.c
index dc98f4c16ce6..294d5752914f 100644
--- a/util/configparser.c
+++ b/util/configparser.c
@@ -85,6 +85,7 @@ int ub_c_lex(void);
void ub_c_error(const char *message);
static void validate_respip_action(const char* action);
+static void validate_acl_action(const char* action);
/* these need to be global, otherwise they cannot be used inside yacc */
extern struct config_parser_state* cfg_parser;
@@ -96,7 +97,7 @@ extern struct config_parser_state* cfg_parser;
#endif
-#line 100 "util/configparser.c"
+#line 101 "util/configparser.c"
# ifndef YY_CAST
# ifdef __cplusplus
@@ -452,359 +453,371 @@ enum yysymbol_kind_t
YYSYMBOL_VAR_RPZ_SIGNAL_NXDOMAIN_RA = 325, /* VAR_RPZ_SIGNAL_NXDOMAIN_RA */
YYSYMBOL_VAR_INTERFACE_AUTOMATIC_PORTS = 326, /* VAR_INTERFACE_AUTOMATIC_PORTS */
YYSYMBOL_VAR_EDE = 327, /* VAR_EDE */
- YYSYMBOL_YYACCEPT = 328, /* $accept */
- YYSYMBOL_toplevelvars = 329, /* toplevelvars */
- YYSYMBOL_toplevelvar = 330, /* toplevelvar */
- YYSYMBOL_force_toplevel = 331, /* force_toplevel */
- YYSYMBOL_serverstart = 332, /* serverstart */
- YYSYMBOL_contents_server = 333, /* contents_server */
- YYSYMBOL_content_server = 334, /* content_server */
- YYSYMBOL_stubstart = 335, /* stubstart */
- YYSYMBOL_contents_stub = 336, /* contents_stub */
- YYSYMBOL_content_stub = 337, /* content_stub */
- YYSYMBOL_forwardstart = 338, /* forwardstart */
- YYSYMBOL_contents_forward = 339, /* contents_forward */
- YYSYMBOL_content_forward = 340, /* content_forward */
- YYSYMBOL_viewstart = 341, /* viewstart */
- YYSYMBOL_contents_view = 342, /* contents_view */
- YYSYMBOL_content_view = 343, /* content_view */
- YYSYMBOL_authstart = 344, /* authstart */
- YYSYMBOL_contents_auth = 345, /* contents_auth */
- YYSYMBOL_content_auth = 346, /* content_auth */
- YYSYMBOL_rpz_tag = 347, /* rpz_tag */
- YYSYMBOL_rpz_action_override = 348, /* rpz_action_override */
- YYSYMBOL_rpz_cname_override = 349, /* rpz_cname_override */
- YYSYMBOL_rpz_log = 350, /* rpz_log */
- YYSYMBOL_rpz_log_name = 351, /* rpz_log_name */
- YYSYMBOL_rpz_signal_nxdomain_ra = 352, /* rpz_signal_nxdomain_ra */
- YYSYMBOL_rpzstart = 353, /* rpzstart */
- YYSYMBOL_contents_rpz = 354, /* contents_rpz */
- YYSYMBOL_content_rpz = 355, /* content_rpz */
- YYSYMBOL_server_num_threads = 356, /* server_num_threads */
- YYSYMBOL_server_verbosity = 357, /* server_verbosity */
- YYSYMBOL_server_statistics_interval = 358, /* server_statistics_interval */
- YYSYMBOL_server_statistics_cumulative = 359, /* server_statistics_cumulative */
- YYSYMBOL_server_extended_statistics = 360, /* server_extended_statistics */
- YYSYMBOL_server_shm_enable = 361, /* server_shm_enable */
- YYSYMBOL_server_shm_key = 362, /* server_shm_key */
- YYSYMBOL_server_port = 363, /* server_port */
- YYSYMBOL_server_send_client_subnet = 364, /* server_send_client_subnet */
- YYSYMBOL_server_client_subnet_zone = 365, /* server_client_subnet_zone */
- YYSYMBOL_server_client_subnet_always_forward = 366, /* server_client_subnet_always_forward */
- YYSYMBOL_server_client_subnet_opcode = 367, /* server_client_subnet_opcode */
- YYSYMBOL_server_max_client_subnet_ipv4 = 368, /* server_max_client_subnet_ipv4 */
- YYSYMBOL_server_max_client_subnet_ipv6 = 369, /* server_max_client_subnet_ipv6 */
- YYSYMBOL_server_min_client_subnet_ipv4 = 370, /* server_min_client_subnet_ipv4 */
- YYSYMBOL_server_min_client_subnet_ipv6 = 371, /* server_min_client_subnet_ipv6 */
- YYSYMBOL_server_max_ecs_tree_size_ipv4 = 372, /* server_max_ecs_tree_size_ipv4 */
- YYSYMBOL_server_max_ecs_tree_size_ipv6 = 373, /* server_max_ecs_tree_size_ipv6 */
- YYSYMBOL_server_interface = 374, /* server_interface */
- YYSYMBOL_server_outgoing_interface = 375, /* server_outgoing_interface */
- YYSYMBOL_server_outgoing_range = 376, /* server_outgoing_range */
- YYSYMBOL_server_outgoing_port_permit = 377, /* server_outgoing_port_permit */
- YYSYMBOL_server_outgoing_port_avoid = 378, /* server_outgoing_port_avoid */
- YYSYMBOL_server_outgoing_num_tcp = 379, /* server_outgoing_num_tcp */
- YYSYMBOL_server_incoming_num_tcp = 380, /* server_incoming_num_tcp */
- YYSYMBOL_server_interface_automatic = 381, /* server_interface_automatic */
- YYSYMBOL_server_interface_automatic_ports = 382, /* server_interface_automatic_ports */
- YYSYMBOL_server_do_ip4 = 383, /* server_do_ip4 */
- YYSYMBOL_server_do_ip6 = 384, /* server_do_ip6 */
- YYSYMBOL_server_do_udp = 385, /* server_do_udp */
- YYSYMBOL_server_do_tcp = 386, /* server_do_tcp */
- YYSYMBOL_server_prefer_ip4 = 387, /* server_prefer_ip4 */
- YYSYMBOL_server_prefer_ip6 = 388, /* server_prefer_ip6 */
- YYSYMBOL_server_tcp_mss = 389, /* server_tcp_mss */
- YYSYMBOL_server_outgoing_tcp_mss = 390, /* server_outgoing_tcp_mss */
- YYSYMBOL_server_tcp_idle_timeout = 391, /* server_tcp_idle_timeout */
- YYSYMBOL_server_max_reuse_tcp_queries = 392, /* server_max_reuse_tcp_queries */
- YYSYMBOL_server_tcp_reuse_timeout = 393, /* server_tcp_reuse_timeout */
- YYSYMBOL_server_tcp_auth_query_timeout = 394, /* server_tcp_auth_query_timeout */
- YYSYMBOL_server_tcp_keepalive = 395, /* server_tcp_keepalive */
- YYSYMBOL_server_tcp_keepalive_timeout = 396, /* server_tcp_keepalive_timeout */
- YYSYMBOL_server_tcp_upstream = 397, /* server_tcp_upstream */
- YYSYMBOL_server_udp_upstream_without_downstream = 398, /* server_udp_upstream_without_downstream */
- YYSYMBOL_server_ssl_upstream = 399, /* server_ssl_upstream */
- YYSYMBOL_server_ssl_service_key = 400, /* server_ssl_service_key */
- YYSYMBOL_server_ssl_service_pem = 401, /* server_ssl_service_pem */
- YYSYMBOL_server_ssl_port = 402, /* server_ssl_port */
- YYSYMBOL_server_tls_cert_bundle = 403, /* server_tls_cert_bundle */
- YYSYMBOL_server_tls_win_cert = 404, /* server_tls_win_cert */
- YYSYMBOL_server_tls_additional_port = 405, /* server_tls_additional_port */
- YYSYMBOL_server_tls_ciphers = 406, /* server_tls_ciphers */
- YYSYMBOL_server_tls_ciphersuites = 407, /* server_tls_ciphersuites */
- YYSYMBOL_server_tls_session_ticket_keys = 408, /* server_tls_session_ticket_keys */
- YYSYMBOL_server_tls_use_sni = 409, /* server_tls_use_sni */
- YYSYMBOL_server_https_port = 410, /* server_https_port */
- YYSYMBOL_server_http_endpoint = 411, /* server_http_endpoint */
- YYSYMBOL_server_http_max_streams = 412, /* server_http_max_streams */
- YYSYMBOL_server_http_query_buffer_size = 413, /* server_http_query_buffer_size */
- YYSYMBOL_server_http_response_buffer_size = 414, /* server_http_response_buffer_size */
- YYSYMBOL_server_http_nodelay = 415, /* server_http_nodelay */
- YYSYMBOL_server_http_notls_downstream = 416, /* server_http_notls_downstream */
- YYSYMBOL_server_use_systemd = 417, /* server_use_systemd */
- YYSYMBOL_server_do_daemonize = 418, /* server_do_daemonize */
- YYSYMBOL_server_use_syslog = 419, /* server_use_syslog */
- YYSYMBOL_server_log_time_ascii = 420, /* server_log_time_ascii */
- YYSYMBOL_server_log_queries = 421, /* server_log_queries */
- YYSYMBOL_server_log_replies = 422, /* server_log_replies */
- YYSYMBOL_server_log_tag_queryreply = 423, /* server_log_tag_queryreply */
- YYSYMBOL_server_log_servfail = 424, /* server_log_servfail */
- YYSYMBOL_server_log_local_actions = 425, /* server_log_local_actions */
- YYSYMBOL_server_chroot = 426, /* server_chroot */
- YYSYMBOL_server_username = 427, /* server_username */
- YYSYMBOL_server_directory = 428, /* server_directory */
- YYSYMBOL_server_logfile = 429, /* server_logfile */
- YYSYMBOL_server_pidfile = 430, /* server_pidfile */
- YYSYMBOL_server_root_hints = 431, /* server_root_hints */
- YYSYMBOL_server_dlv_anchor_file = 432, /* server_dlv_anchor_file */
- YYSYMBOL_server_dlv_anchor = 433, /* server_dlv_anchor */
- YYSYMBOL_server_auto_trust_anchor_file = 434, /* server_auto_trust_anchor_file */
- YYSYMBOL_server_trust_anchor_file = 435, /* server_trust_anchor_file */
- YYSYMBOL_server_trusted_keys_file = 436, /* server_trusted_keys_file */
- YYSYMBOL_server_trust_anchor = 437, /* server_trust_anchor */
- YYSYMBOL_server_trust_anchor_signaling = 438, /* server_trust_anchor_signaling */
- YYSYMBOL_server_root_key_sentinel = 439, /* server_root_key_sentinel */
- YYSYMBOL_server_domain_insecure = 440, /* server_domain_insecure */
- YYSYMBOL_server_hide_identity = 441, /* server_hide_identity */
- YYSYMBOL_server_hide_version = 442, /* server_hide_version */
- YYSYMBOL_server_hide_trustanchor = 443, /* server_hide_trustanchor */
- YYSYMBOL_server_hide_http_user_agent = 444, /* server_hide_http_user_agent */
- YYSYMBOL_server_identity = 445, /* server_identity */
- YYSYMBOL_server_version = 446, /* server_version */
- YYSYMBOL_server_http_user_agent = 447, /* server_http_user_agent */
- YYSYMBOL_server_nsid = 448, /* server_nsid */
- YYSYMBOL_server_so_rcvbuf = 449, /* server_so_rcvbuf */
- YYSYMBOL_server_so_sndbuf = 450, /* server_so_sndbuf */
- YYSYMBOL_server_so_reuseport = 451, /* server_so_reuseport */
- YYSYMBOL_server_ip_transparent = 452, /* server_ip_transparent */
- YYSYMBOL_server_ip_freebind = 453, /* server_ip_freebind */
- YYSYMBOL_server_ip_dscp = 454, /* server_ip_dscp */
- YYSYMBOL_server_stream_wait_size = 455, /* server_stream_wait_size */
- YYSYMBOL_server_edns_buffer_size = 456, /* server_edns_buffer_size */
- YYSYMBOL_server_msg_buffer_size = 457, /* server_msg_buffer_size */
- YYSYMBOL_server_msg_cache_size = 458, /* server_msg_cache_size */
- YYSYMBOL_server_msg_cache_slabs = 459, /* server_msg_cache_slabs */
- YYSYMBOL_server_num_queries_per_thread = 460, /* server_num_queries_per_thread */
- YYSYMBOL_server_jostle_timeout = 461, /* server_jostle_timeout */
- YYSYMBOL_server_delay_close = 462, /* server_delay_close */
- YYSYMBOL_server_udp_connect = 463, /* server_udp_connect */
- YYSYMBOL_server_unblock_lan_zones = 464, /* server_unblock_lan_zones */
- YYSYMBOL_server_insecure_lan_zones = 465, /* server_insecure_lan_zones */
- YYSYMBOL_server_rrset_cache_size = 466, /* server_rrset_cache_size */
- YYSYMBOL_server_rrset_cache_slabs = 467, /* server_rrset_cache_slabs */
- YYSYMBOL_server_infra_host_ttl = 468, /* server_infra_host_ttl */
- YYSYMBOL_server_infra_lame_ttl = 469, /* server_infra_lame_ttl */
- YYSYMBOL_server_infra_cache_numhosts = 470, /* server_infra_cache_numhosts */
- YYSYMBOL_server_infra_cache_lame_size = 471, /* server_infra_cache_lame_size */
- YYSYMBOL_server_infra_cache_slabs = 472, /* server_infra_cache_slabs */
- YYSYMBOL_server_infra_cache_min_rtt = 473, /* server_infra_cache_min_rtt */
- YYSYMBOL_server_infra_cache_max_rtt = 474, /* server_infra_cache_max_rtt */
- YYSYMBOL_server_infra_keep_probing = 475, /* server_infra_keep_probing */
- YYSYMBOL_server_target_fetch_policy = 476, /* server_target_fetch_policy */
- YYSYMBOL_server_harden_short_bufsize = 477, /* server_harden_short_bufsize */
- YYSYMBOL_server_harden_large_queries = 478, /* server_harden_large_queries */
- YYSYMBOL_server_harden_glue = 479, /* server_harden_glue */
- YYSYMBOL_server_harden_dnssec_stripped = 480, /* server_harden_dnssec_stripped */
- YYSYMBOL_server_harden_below_nxdomain = 481, /* server_harden_below_nxdomain */
- YYSYMBOL_server_harden_referral_path = 482, /* server_harden_referral_path */
- YYSYMBOL_server_harden_algo_downgrade = 483, /* server_harden_algo_downgrade */
- YYSYMBOL_server_use_caps_for_id = 484, /* server_use_caps_for_id */
- YYSYMBOL_server_caps_whitelist = 485, /* server_caps_whitelist */
- YYSYMBOL_server_private_address = 486, /* server_private_address */
- YYSYMBOL_server_private_domain = 487, /* server_private_domain */
- YYSYMBOL_server_prefetch = 488, /* server_prefetch */
- YYSYMBOL_server_prefetch_key = 489, /* server_prefetch_key */
- YYSYMBOL_server_deny_any = 490, /* server_deny_any */
- YYSYMBOL_server_unwanted_reply_threshold = 491, /* server_unwanted_reply_threshold */
- YYSYMBOL_server_do_not_query_address = 492, /* server_do_not_query_address */
- YYSYMBOL_server_do_not_query_localhost = 493, /* server_do_not_query_localhost */
- YYSYMBOL_server_access_control = 494, /* server_access_control */
- YYSYMBOL_server_module_conf = 495, /* server_module_conf */
- YYSYMBOL_server_val_override_date = 496, /* server_val_override_date */
- YYSYMBOL_server_val_sig_skew_min = 497, /* server_val_sig_skew_min */
- YYSYMBOL_server_val_sig_skew_max = 498, /* server_val_sig_skew_max */
- YYSYMBOL_server_val_max_restart = 499, /* server_val_max_restart */
- YYSYMBOL_server_cache_max_ttl = 500, /* server_cache_max_ttl */
- YYSYMBOL_server_cache_max_negative_ttl = 501, /* server_cache_max_negative_ttl */
- YYSYMBOL_server_cache_min_ttl = 502, /* server_cache_min_ttl */
- YYSYMBOL_server_bogus_ttl = 503, /* server_bogus_ttl */
- YYSYMBOL_server_val_clean_additional = 504, /* server_val_clean_additional */
- YYSYMBOL_server_val_permissive_mode = 505, /* server_val_permissive_mode */
- YYSYMBOL_server_aggressive_nsec = 506, /* server_aggressive_nsec */
- YYSYMBOL_server_ignore_cd_flag = 507, /* server_ignore_cd_flag */
- YYSYMBOL_server_serve_expired = 508, /* server_serve_expired */
- YYSYMBOL_server_serve_expired_ttl = 509, /* server_serve_expired_ttl */
- YYSYMBOL_server_serve_expired_ttl_reset = 510, /* server_serve_expired_ttl_reset */
- YYSYMBOL_server_serve_expired_reply_ttl = 511, /* server_serve_expired_reply_ttl */
- YYSYMBOL_server_serve_expired_client_timeout = 512, /* server_serve_expired_client_timeout */
- YYSYMBOL_server_ede_serve_expired = 513, /* server_ede_serve_expired */
- YYSYMBOL_server_serve_original_ttl = 514, /* server_serve_original_ttl */
- YYSYMBOL_server_fake_dsa = 515, /* server_fake_dsa */
- YYSYMBOL_server_fake_sha1 = 516, /* server_fake_sha1 */
- YYSYMBOL_server_val_log_level = 517, /* server_val_log_level */
- YYSYMBOL_server_val_nsec3_keysize_iterations = 518, /* server_val_nsec3_keysize_iterations */
- YYSYMBOL_server_zonemd_permissive_mode = 519, /* server_zonemd_permissive_mode */
- YYSYMBOL_server_add_holddown = 520, /* server_add_holddown */
- YYSYMBOL_server_del_holddown = 521, /* server_del_holddown */
- YYSYMBOL_server_keep_missing = 522, /* server_keep_missing */
- YYSYMBOL_server_permit_small_holddown = 523, /* server_permit_small_holddown */
- YYSYMBOL_server_key_cache_size = 524, /* server_key_cache_size */
- YYSYMBOL_server_key_cache_slabs = 525, /* server_key_cache_slabs */
- YYSYMBOL_server_neg_cache_size = 526, /* server_neg_cache_size */
- YYSYMBOL_server_local_zone = 527, /* server_local_zone */
- YYSYMBOL_server_local_data = 528, /* server_local_data */
- YYSYMBOL_server_local_data_ptr = 529, /* server_local_data_ptr */
- YYSYMBOL_server_minimal_responses = 530, /* server_minimal_responses */
- YYSYMBOL_server_rrset_roundrobin = 531, /* server_rrset_roundrobin */
- YYSYMBOL_server_unknown_server_time_limit = 532, /* server_unknown_server_time_limit */
- YYSYMBOL_server_max_udp_size = 533, /* server_max_udp_size */
- YYSYMBOL_server_dns64_prefix = 534, /* server_dns64_prefix */
- YYSYMBOL_server_dns64_synthall = 535, /* server_dns64_synthall */
- YYSYMBOL_server_dns64_ignore_aaaa = 536, /* server_dns64_ignore_aaaa */
- YYSYMBOL_server_define_tag = 537, /* server_define_tag */
- YYSYMBOL_server_local_zone_tag = 538, /* server_local_zone_tag */
- YYSYMBOL_server_access_control_tag = 539, /* server_access_control_tag */
- YYSYMBOL_server_access_control_tag_action = 540, /* server_access_control_tag_action */
- YYSYMBOL_server_access_control_tag_data = 541, /* server_access_control_tag_data */
- YYSYMBOL_server_local_zone_override = 542, /* server_local_zone_override */
- YYSYMBOL_server_access_control_view = 543, /* server_access_control_view */
- YYSYMBOL_server_response_ip_tag = 544, /* server_response_ip_tag */
- YYSYMBOL_server_ip_ratelimit = 545, /* server_ip_ratelimit */
- YYSYMBOL_server_ratelimit = 546, /* server_ratelimit */
- YYSYMBOL_server_ip_ratelimit_size = 547, /* server_ip_ratelimit_size */
- YYSYMBOL_server_ratelimit_size = 548, /* server_ratelimit_size */
- YYSYMBOL_server_ip_ratelimit_slabs = 549, /* server_ip_ratelimit_slabs */
- YYSYMBOL_server_ratelimit_slabs = 550, /* server_ratelimit_slabs */
- YYSYMBOL_server_ratelimit_for_domain = 551, /* server_ratelimit_for_domain */
- YYSYMBOL_server_ratelimit_below_domain = 552, /* server_ratelimit_below_domain */
- YYSYMBOL_server_ip_ratelimit_factor = 553, /* server_ip_ratelimit_factor */
- YYSYMBOL_server_ratelimit_factor = 554, /* server_ratelimit_factor */
- YYSYMBOL_server_ip_ratelimit_backoff = 555, /* server_ip_ratelimit_backoff */
- YYSYMBOL_server_ratelimit_backoff = 556, /* server_ratelimit_backoff */
- YYSYMBOL_server_outbound_msg_retry = 557, /* server_outbound_msg_retry */
- YYSYMBOL_server_low_rtt = 558, /* server_low_rtt */
- YYSYMBOL_server_fast_server_num = 559, /* server_fast_server_num */
- YYSYMBOL_server_fast_server_permil = 560, /* server_fast_server_permil */
- YYSYMBOL_server_qname_minimisation = 561, /* server_qname_minimisation */
- YYSYMBOL_server_qname_minimisation_strict = 562, /* server_qname_minimisation_strict */
- YYSYMBOL_server_pad_responses = 563, /* server_pad_responses */
- YYSYMBOL_server_pad_responses_block_size = 564, /* server_pad_responses_block_size */
- YYSYMBOL_server_pad_queries = 565, /* server_pad_queries */
- YYSYMBOL_server_pad_queries_block_size = 566, /* server_pad_queries_block_size */
- YYSYMBOL_server_ipsecmod_enabled = 567, /* server_ipsecmod_enabled */
- YYSYMBOL_server_ipsecmod_ignore_bogus = 568, /* server_ipsecmod_ignore_bogus */
- YYSYMBOL_server_ipsecmod_hook = 569, /* server_ipsecmod_hook */
- YYSYMBOL_server_ipsecmod_max_ttl = 570, /* server_ipsecmod_max_ttl */
- YYSYMBOL_server_ipsecmod_whitelist = 571, /* server_ipsecmod_whitelist */
- YYSYMBOL_server_ipsecmod_strict = 572, /* server_ipsecmod_strict */
- YYSYMBOL_server_edns_client_string = 573, /* server_edns_client_string */
- YYSYMBOL_server_edns_client_string_opcode = 574, /* server_edns_client_string_opcode */
- YYSYMBOL_server_ede = 575, /* server_ede */
- YYSYMBOL_stub_name = 576, /* stub_name */
- YYSYMBOL_stub_host = 577, /* stub_host */
- YYSYMBOL_stub_addr = 578, /* stub_addr */
- YYSYMBOL_stub_first = 579, /* stub_first */
- YYSYMBOL_stub_no_cache = 580, /* stub_no_cache */
- YYSYMBOL_stub_ssl_upstream = 581, /* stub_ssl_upstream */
- YYSYMBOL_stub_tcp_upstream = 582, /* stub_tcp_upstream */
- YYSYMBOL_stub_prime = 583, /* stub_prime */
- YYSYMBOL_forward_name = 584, /* forward_name */
- YYSYMBOL_forward_host = 585, /* forward_host */
- YYSYMBOL_forward_addr = 586, /* forward_addr */
- YYSYMBOL_forward_first = 587, /* forward_first */
- YYSYMBOL_forward_no_cache = 588, /* forward_no_cache */
- YYSYMBOL_forward_ssl_upstream = 589, /* forward_ssl_upstream */
- YYSYMBOL_forward_tcp_upstream = 590, /* forward_tcp_upstream */
- YYSYMBOL_auth_name = 591, /* auth_name */
- YYSYMBOL_auth_zonefile = 592, /* auth_zonefile */
- YYSYMBOL_auth_master = 593, /* auth_master */
- YYSYMBOL_auth_url = 594, /* auth_url */
- YYSYMBOL_auth_allow_notify = 595, /* auth_allow_notify */
- YYSYMBOL_auth_zonemd_check = 596, /* auth_zonemd_check */
- YYSYMBOL_auth_zonemd_reject_absence = 597, /* auth_zonemd_reject_absence */
- YYSYMBOL_auth_for_downstream = 598, /* auth_for_downstream */
- YYSYMBOL_auth_for_upstream = 599, /* auth_for_upstream */
- YYSYMBOL_auth_fallback_enabled = 600, /* auth_fallback_enabled */
- YYSYMBOL_view_name = 601, /* view_name */
- YYSYMBOL_view_local_zone = 602, /* view_local_zone */
- YYSYMBOL_view_response_ip = 603, /* view_response_ip */
- YYSYMBOL_view_response_ip_data = 604, /* view_response_ip_data */
- YYSYMBOL_view_local_data = 605, /* view_local_data */
- YYSYMBOL_view_local_data_ptr = 606, /* view_local_data_ptr */
- YYSYMBOL_view_first = 607, /* view_first */
- YYSYMBOL_rcstart = 608, /* rcstart */
- YYSYMBOL_contents_rc = 609, /* contents_rc */
- YYSYMBOL_content_rc = 610, /* content_rc */
- YYSYMBOL_rc_control_enable = 611, /* rc_control_enable */
- YYSYMBOL_rc_control_port = 612, /* rc_control_port */
- YYSYMBOL_rc_control_interface = 613, /* rc_control_interface */
- YYSYMBOL_rc_control_use_cert = 614, /* rc_control_use_cert */
- YYSYMBOL_rc_server_key_file = 615, /* rc_server_key_file */
- YYSYMBOL_rc_server_cert_file = 616, /* rc_server_cert_file */
- YYSYMBOL_rc_control_key_file = 617, /* rc_control_key_file */
- YYSYMBOL_rc_control_cert_file = 618, /* rc_control_cert_file */
- YYSYMBOL_dtstart = 619, /* dtstart */
- YYSYMBOL_contents_dt = 620, /* contents_dt */
- YYSYMBOL_content_dt = 621, /* content_dt */
- YYSYMBOL_dt_dnstap_enable = 622, /* dt_dnstap_enable */
- YYSYMBOL_dt_dnstap_bidirectional = 623, /* dt_dnstap_bidirectional */
- YYSYMBOL_dt_dnstap_socket_path = 624, /* dt_dnstap_socket_path */
- YYSYMBOL_dt_dnstap_ip = 625, /* dt_dnstap_ip */
- YYSYMBOL_dt_dnstap_tls = 626, /* dt_dnstap_tls */
- YYSYMBOL_dt_dnstap_tls_server_name = 627, /* dt_dnstap_tls_server_name */
- YYSYMBOL_dt_dnstap_tls_cert_bundle = 628, /* dt_dnstap_tls_cert_bundle */
- YYSYMBOL_dt_dnstap_tls_client_key_file = 629, /* dt_dnstap_tls_client_key_file */
- YYSYMBOL_dt_dnstap_tls_client_cert_file = 630, /* dt_dnstap_tls_client_cert_file */
- YYSYMBOL_dt_dnstap_send_identity = 631, /* dt_dnstap_send_identity */
- YYSYMBOL_dt_dnstap_send_version = 632, /* dt_dnstap_send_version */
- YYSYMBOL_dt_dnstap_identity = 633, /* dt_dnstap_identity */
- YYSYMBOL_dt_dnstap_version = 634, /* dt_dnstap_version */
- YYSYMBOL_dt_dnstap_log_resolver_query_messages = 635, /* dt_dnstap_log_resolver_query_messages */
- YYSYMBOL_dt_dnstap_log_resolver_response_messages = 636, /* dt_dnstap_log_resolver_response_messages */
- YYSYMBOL_dt_dnstap_log_client_query_messages = 637, /* dt_dnstap_log_client_query_messages */
- YYSYMBOL_dt_dnstap_log_client_response_messages = 638, /* dt_dnstap_log_client_response_messages */
- YYSYMBOL_dt_dnstap_log_forwarder_query_messages = 639, /* dt_dnstap_log_forwarder_query_messages */
- YYSYMBOL_dt_dnstap_log_forwarder_response_messages = 640, /* dt_dnstap_log_forwarder_response_messages */
- YYSYMBOL_pythonstart = 641, /* pythonstart */
- YYSYMBOL_contents_py = 642, /* contents_py */
- YYSYMBOL_content_py = 643, /* content_py */
- YYSYMBOL_py_script = 644, /* py_script */
- YYSYMBOL_dynlibstart = 645, /* dynlibstart */
- YYSYMBOL_contents_dl = 646, /* contents_dl */
- YYSYMBOL_content_dl = 647, /* content_dl */
- YYSYMBOL_dl_file = 648, /* dl_file */
- YYSYMBOL_server_disable_dnssec_lame_check = 649, /* server_disable_dnssec_lame_check */
- YYSYMBOL_server_log_identity = 650, /* server_log_identity */
- YYSYMBOL_server_response_ip = 651, /* server_response_ip */
- YYSYMBOL_server_response_ip_data = 652, /* server_response_ip_data */
- YYSYMBOL_dnscstart = 653, /* dnscstart */
- YYSYMBOL_contents_dnsc = 654, /* contents_dnsc */
- YYSYMBOL_content_dnsc = 655, /* content_dnsc */
- YYSYMBOL_dnsc_dnscrypt_enable = 656, /* dnsc_dnscrypt_enable */
- YYSYMBOL_dnsc_dnscrypt_port = 657, /* dnsc_dnscrypt_port */
- YYSYMBOL_dnsc_dnscrypt_provider = 658, /* dnsc_dnscrypt_provider */
- YYSYMBOL_dnsc_dnscrypt_provider_cert = 659, /* dnsc_dnscrypt_provider_cert */
- YYSYMBOL_dnsc_dnscrypt_provider_cert_rotated = 660, /* dnsc_dnscrypt_provider_cert_rotated */
- YYSYMBOL_dnsc_dnscrypt_secret_key = 661, /* dnsc_dnscrypt_secret_key */
- YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_size = 662, /* dnsc_dnscrypt_shared_secret_cache_size */
- YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_slabs = 663, /* dnsc_dnscrypt_shared_secret_cache_slabs */
- YYSYMBOL_dnsc_dnscrypt_nonce_cache_size = 664, /* dnsc_dnscrypt_nonce_cache_size */
- YYSYMBOL_dnsc_dnscrypt_nonce_cache_slabs = 665, /* dnsc_dnscrypt_nonce_cache_slabs */
- YYSYMBOL_cachedbstart = 666, /* cachedbstart */
- YYSYMBOL_contents_cachedb = 667, /* contents_cachedb */
- YYSYMBOL_content_cachedb = 668, /* content_cachedb */
- YYSYMBOL_cachedb_backend_name = 669, /* cachedb_backend_name */
- YYSYMBOL_cachedb_secret_seed = 670, /* cachedb_secret_seed */
- YYSYMBOL_redis_server_host = 671, /* redis_server_host */
- YYSYMBOL_redis_server_port = 672, /* redis_server_port */
- YYSYMBOL_redis_timeout = 673, /* redis_timeout */
- YYSYMBOL_redis_expire_records = 674, /* redis_expire_records */
- YYSYMBOL_server_tcp_connection_limit = 675, /* server_tcp_connection_limit */
- YYSYMBOL_ipsetstart = 676, /* ipsetstart */
- YYSYMBOL_contents_ipset = 677, /* contents_ipset */
- YYSYMBOL_content_ipset = 678, /* content_ipset */
- YYSYMBOL_ipset_name_v4 = 679, /* ipset_name_v4 */
- YYSYMBOL_ipset_name_v6 = 680 /* ipset_name_v6 */
+ YYSYMBOL_VAR_INTERFACE_ACTION = 328, /* VAR_INTERFACE_ACTION */
+ YYSYMBOL_VAR_INTERFACE_VIEW = 329, /* VAR_INTERFACE_VIEW */
+ YYSYMBOL_VAR_INTERFACE_TAG = 330, /* VAR_INTERFACE_TAG */
+ YYSYMBOL_VAR_INTERFACE_TAG_ACTION = 331, /* VAR_INTERFACE_TAG_ACTION */
+ YYSYMBOL_VAR_INTERFACE_TAG_DATA = 332, /* VAR_INTERFACE_TAG_DATA */
+ YYSYMBOL_VAR_PROXY_PROTOCOL_PORT = 333, /* VAR_PROXY_PROTOCOL_PORT */
+ YYSYMBOL_YYACCEPT = 334, /* $accept */
+ YYSYMBOL_toplevelvars = 335, /* toplevelvars */
+ YYSYMBOL_toplevelvar = 336, /* toplevelvar */
+ YYSYMBOL_force_toplevel = 337, /* force_toplevel */
+ YYSYMBOL_serverstart = 338, /* serverstart */
+ YYSYMBOL_contents_server = 339, /* contents_server */
+ YYSYMBOL_content_server = 340, /* content_server */
+ YYSYMBOL_stubstart = 341, /* stubstart */
+ YYSYMBOL_contents_stub = 342, /* contents_stub */
+ YYSYMBOL_content_stub = 343, /* content_stub */
+ YYSYMBOL_forwardstart = 344, /* forwardstart */
+ YYSYMBOL_contents_forward = 345, /* contents_forward */
+ YYSYMBOL_content_forward = 346, /* content_forward */
+ YYSYMBOL_viewstart = 347, /* viewstart */
+ YYSYMBOL_contents_view = 348, /* contents_view */
+ YYSYMBOL_content_view = 349, /* content_view */
+ YYSYMBOL_authstart = 350, /* authstart */
+ YYSYMBOL_contents_auth = 351, /* contents_auth */
+ YYSYMBOL_content_auth = 352, /* content_auth */
+ YYSYMBOL_rpz_tag = 353, /* rpz_tag */
+ YYSYMBOL_rpz_action_override = 354, /* rpz_action_override */
+ YYSYMBOL_rpz_cname_override = 355, /* rpz_cname_override */
+ YYSYMBOL_rpz_log = 356, /* rpz_log */
+ YYSYMBOL_rpz_log_name = 357, /* rpz_log_name */
+ YYSYMBOL_rpz_signal_nxdomain_ra = 358, /* rpz_signal_nxdomain_ra */
+ YYSYMBOL_rpzstart = 359, /* rpzstart */
+ YYSYMBOL_contents_rpz = 360, /* contents_rpz */
+ YYSYMBOL_content_rpz = 361, /* content_rpz */
+ YYSYMBOL_server_num_threads = 362, /* server_num_threads */
+ YYSYMBOL_server_verbosity = 363, /* server_verbosity */
+ YYSYMBOL_server_statistics_interval = 364, /* server_statistics_interval */
+ YYSYMBOL_server_statistics_cumulative = 365, /* server_statistics_cumulative */
+ YYSYMBOL_server_extended_statistics = 366, /* server_extended_statistics */
+ YYSYMBOL_server_shm_enable = 367, /* server_shm_enable */
+ YYSYMBOL_server_shm_key = 368, /* server_shm_key */
+ YYSYMBOL_server_port = 369, /* server_port */
+ YYSYMBOL_server_send_client_subnet = 370, /* server_send_client_subnet */
+ YYSYMBOL_server_client_subnet_zone = 371, /* server_client_subnet_zone */
+ YYSYMBOL_server_client_subnet_always_forward = 372, /* server_client_subnet_always_forward */
+ YYSYMBOL_server_client_subnet_opcode = 373, /* server_client_subnet_opcode */
+ YYSYMBOL_server_max_client_subnet_ipv4 = 374, /* server_max_client_subnet_ipv4 */
+ YYSYMBOL_server_max_client_subnet_ipv6 = 375, /* server_max_client_subnet_ipv6 */
+ YYSYMBOL_server_min_client_subnet_ipv4 = 376, /* server_min_client_subnet_ipv4 */
+ YYSYMBOL_server_min_client_subnet_ipv6 = 377, /* server_min_client_subnet_ipv6 */
+ YYSYMBOL_server_max_ecs_tree_size_ipv4 = 378, /* server_max_ecs_tree_size_ipv4 */
+ YYSYMBOL_server_max_ecs_tree_size_ipv6 = 379, /* server_max_ecs_tree_size_ipv6 */
+ YYSYMBOL_server_interface = 380, /* server_interface */
+ YYSYMBOL_server_outgoing_interface = 381, /* server_outgoing_interface */
+ YYSYMBOL_server_outgoing_range = 382, /* server_outgoing_range */
+ YYSYMBOL_server_outgoing_port_permit = 383, /* server_outgoing_port_permit */
+ YYSYMBOL_server_outgoing_port_avoid = 384, /* server_outgoing_port_avoid */
+ YYSYMBOL_server_outgoing_num_tcp = 385, /* server_outgoing_num_tcp */
+ YYSYMBOL_server_incoming_num_tcp = 386, /* server_incoming_num_tcp */
+ YYSYMBOL_server_interface_automatic = 387, /* server_interface_automatic */
+ YYSYMBOL_server_interface_automatic_ports = 388, /* server_interface_automatic_ports */
+ YYSYMBOL_server_do_ip4 = 389, /* server_do_ip4 */
+ YYSYMBOL_server_do_ip6 = 390, /* server_do_ip6 */
+ YYSYMBOL_server_do_udp = 391, /* server_do_udp */
+ YYSYMBOL_server_do_tcp = 392, /* server_do_tcp */
+ YYSYMBOL_server_prefer_ip4 = 393, /* server_prefer_ip4 */
+ YYSYMBOL_server_prefer_ip6 = 394, /* server_prefer_ip6 */
+ YYSYMBOL_server_tcp_mss = 395, /* server_tcp_mss */
+ YYSYMBOL_server_outgoing_tcp_mss = 396, /* server_outgoing_tcp_mss */
+ YYSYMBOL_server_tcp_idle_timeout = 397, /* server_tcp_idle_timeout */
+ YYSYMBOL_server_max_reuse_tcp_queries = 398, /* server_max_reuse_tcp_queries */
+ YYSYMBOL_server_tcp_reuse_timeout = 399, /* server_tcp_reuse_timeout */
+ YYSYMBOL_server_tcp_auth_query_timeout = 400, /* server_tcp_auth_query_timeout */
+ YYSYMBOL_server_tcp_keepalive = 401, /* server_tcp_keepalive */
+ YYSYMBOL_server_tcp_keepalive_timeout = 402, /* server_tcp_keepalive_timeout */
+ YYSYMBOL_server_tcp_upstream = 403, /* server_tcp_upstream */
+ YYSYMBOL_server_udp_upstream_without_downstream = 404, /* server_udp_upstream_without_downstream */
+ YYSYMBOL_server_ssl_upstream = 405, /* server_ssl_upstream */
+ YYSYMBOL_server_ssl_service_key = 406, /* server_ssl_service_key */
+ YYSYMBOL_server_ssl_service_pem = 407, /* server_ssl_service_pem */
+ YYSYMBOL_server_ssl_port = 408, /* server_ssl_port */
+ YYSYMBOL_server_tls_cert_bundle = 409, /* server_tls_cert_bundle */
+ YYSYMBOL_server_tls_win_cert = 410, /* server_tls_win_cert */
+ YYSYMBOL_server_tls_additional_port = 411, /* server_tls_additional_port */
+ YYSYMBOL_server_tls_ciphers = 412, /* server_tls_ciphers */
+ YYSYMBOL_server_tls_ciphersuites = 413, /* server_tls_ciphersuites */
+ YYSYMBOL_server_tls_session_ticket_keys = 414, /* server_tls_session_ticket_keys */
+ YYSYMBOL_server_tls_use_sni = 415, /* server_tls_use_sni */
+ YYSYMBOL_server_https_port = 416, /* server_https_port */
+ YYSYMBOL_server_http_endpoint = 417, /* server_http_endpoint */
+ YYSYMBOL_server_http_max_streams = 418, /* server_http_max_streams */
+ YYSYMBOL_server_http_query_buffer_size = 419, /* server_http_query_buffer_size */
+ YYSYMBOL_server_http_response_buffer_size = 420, /* server_http_response_buffer_size */
+ YYSYMBOL_server_http_nodelay = 421, /* server_http_nodelay */
+ YYSYMBOL_server_http_notls_downstream = 422, /* server_http_notls_downstream */
+ YYSYMBOL_server_use_systemd = 423, /* server_use_systemd */
+ YYSYMBOL_server_do_daemonize = 424, /* server_do_daemonize */
+ YYSYMBOL_server_use_syslog = 425, /* server_use_syslog */
+ YYSYMBOL_server_log_time_ascii = 426, /* server_log_time_ascii */
+ YYSYMBOL_server_log_queries = 427, /* server_log_queries */
+ YYSYMBOL_server_log_replies = 428, /* server_log_replies */
+ YYSYMBOL_server_log_tag_queryreply = 429, /* server_log_tag_queryreply */
+ YYSYMBOL_server_log_servfail = 430, /* server_log_servfail */
+ YYSYMBOL_server_log_local_actions = 431, /* server_log_local_actions */
+ YYSYMBOL_server_chroot = 432, /* server_chroot */
+ YYSYMBOL_server_username = 433, /* server_username */
+ YYSYMBOL_server_directory = 434, /* server_directory */
+ YYSYMBOL_server_logfile = 435, /* server_logfile */
+ YYSYMBOL_server_pidfile = 436, /* server_pidfile */
+ YYSYMBOL_server_root_hints = 437, /* server_root_hints */
+ YYSYMBOL_server_dlv_anchor_file = 438, /* server_dlv_anchor_file */
+ YYSYMBOL_server_dlv_anchor = 439, /* server_dlv_anchor */
+ YYSYMBOL_server_auto_trust_anchor_file = 440, /* server_auto_trust_anchor_file */
+ YYSYMBOL_server_trust_anchor_file = 441, /* server_trust_anchor_file */
+ YYSYMBOL_server_trusted_keys_file = 442, /* server_trusted_keys_file */
+ YYSYMBOL_server_trust_anchor = 443, /* server_trust_anchor */
+ YYSYMBOL_server_trust_anchor_signaling = 444, /* server_trust_anchor_signaling */
+ YYSYMBOL_server_root_key_sentinel = 445, /* server_root_key_sentinel */
+ YYSYMBOL_server_domain_insecure = 446, /* server_domain_insecure */
+ YYSYMBOL_server_hide_identity = 447, /* server_hide_identity */
+ YYSYMBOL_server_hide_version = 448, /* server_hide_version */
+ YYSYMBOL_server_hide_trustanchor = 449, /* server_hide_trustanchor */
+ YYSYMBOL_server_hide_http_user_agent = 450, /* server_hide_http_user_agent */
+ YYSYMBOL_server_identity = 451, /* server_identity */
+ YYSYMBOL_server_version = 452, /* server_version */
+ YYSYMBOL_server_http_user_agent = 453, /* server_http_user_agent */
+ YYSYMBOL_server_nsid = 454, /* server_nsid */
+ YYSYMBOL_server_so_rcvbuf = 455, /* server_so_rcvbuf */
+ YYSYMBOL_server_so_sndbuf = 456, /* server_so_sndbuf */
+ YYSYMBOL_server_so_reuseport = 457, /* server_so_reuseport */
+ YYSYMBOL_server_ip_transparent = 458, /* server_ip_transparent */
+ YYSYMBOL_server_ip_freebind = 459, /* server_ip_freebind */
+ YYSYMBOL_server_ip_dscp = 460, /* server_ip_dscp */
+ YYSYMBOL_server_stream_wait_size = 461, /* server_stream_wait_size */
+ YYSYMBOL_server_edns_buffer_size = 462, /* server_edns_buffer_size */
+ YYSYMBOL_server_msg_buffer_size = 463, /* server_msg_buffer_size */
+ YYSYMBOL_server_msg_cache_size = 464, /* server_msg_cache_size */
+ YYSYMBOL_server_msg_cache_slabs = 465, /* server_msg_cache_slabs */
+ YYSYMBOL_server_num_queries_per_thread = 466, /* server_num_queries_per_thread */
+ YYSYMBOL_server_jostle_timeout = 467, /* server_jostle_timeout */
+ YYSYMBOL_server_delay_close = 468, /* server_delay_close */
+ YYSYMBOL_server_udp_connect = 469, /* server_udp_connect */
+ YYSYMBOL_server_unblock_lan_zones = 470, /* server_unblock_lan_zones */
+ YYSYMBOL_server_insecure_lan_zones = 471, /* server_insecure_lan_zones */
+ YYSYMBOL_server_rrset_cache_size = 472, /* server_rrset_cache_size */
+ YYSYMBOL_server_rrset_cache_slabs = 473, /* server_rrset_cache_slabs */
+ YYSYMBOL_server_infra_host_ttl = 474, /* server_infra_host_ttl */
+ YYSYMBOL_server_infra_lame_ttl = 475, /* server_infra_lame_ttl */
+ YYSYMBOL_server_infra_cache_numhosts = 476, /* server_infra_cache_numhosts */
+ YYSYMBOL_server_infra_cache_lame_size = 477, /* server_infra_cache_lame_size */
+ YYSYMBOL_server_infra_cache_slabs = 478, /* server_infra_cache_slabs */
+ YYSYMBOL_server_infra_cache_min_rtt = 479, /* server_infra_cache_min_rtt */
+ YYSYMBOL_server_infra_cache_max_rtt = 480, /* server_infra_cache_max_rtt */
+ YYSYMBOL_server_infra_keep_probing = 481, /* server_infra_keep_probing */
+ YYSYMBOL_server_target_fetch_policy = 482, /* server_target_fetch_policy */
+ YYSYMBOL_server_harden_short_bufsize = 483, /* server_harden_short_bufsize */
+ YYSYMBOL_server_harden_large_queries = 484, /* server_harden_large_queries */
+ YYSYMBOL_server_harden_glue = 485, /* server_harden_glue */
+ YYSYMBOL_server_harden_dnssec_stripped = 486, /* server_harden_dnssec_stripped */
+ YYSYMBOL_server_harden_below_nxdomain = 487, /* server_harden_below_nxdomain */
+ YYSYMBOL_server_harden_referral_path = 488, /* server_harden_referral_path */
+ YYSYMBOL_server_harden_algo_downgrade = 489, /* server_harden_algo_downgrade */
+ YYSYMBOL_server_use_caps_for_id = 490, /* server_use_caps_for_id */
+ YYSYMBOL_server_caps_whitelist = 491, /* server_caps_whitelist */
+ YYSYMBOL_server_private_address = 492, /* server_private_address */
+ YYSYMBOL_server_private_domain = 493, /* server_private_domain */
+ YYSYMBOL_server_prefetch = 494, /* server_prefetch */
+ YYSYMBOL_server_prefetch_key = 495, /* server_prefetch_key */
+ YYSYMBOL_server_deny_any = 496, /* server_deny_any */
+ YYSYMBOL_server_unwanted_reply_threshold = 497, /* server_unwanted_reply_threshold */
+ YYSYMBOL_server_do_not_query_address = 498, /* server_do_not_query_address */
+ YYSYMBOL_server_do_not_query_localhost = 499, /* server_do_not_query_localhost */
+ YYSYMBOL_server_access_control = 500, /* server_access_control */
+ YYSYMBOL_server_interface_action = 501, /* server_interface_action */
+ YYSYMBOL_server_module_conf = 502, /* server_module_conf */
+ YYSYMBOL_server_val_override_date = 503, /* server_val_override_date */
+ YYSYMBOL_server_val_sig_skew_min = 504, /* server_val_sig_skew_min */
+ YYSYMBOL_server_val_sig_skew_max = 505, /* server_val_sig_skew_max */
+ YYSYMBOL_server_val_max_restart = 506, /* server_val_max_restart */
+ YYSYMBOL_server_cache_max_ttl = 507, /* server_cache_max_ttl */
+ YYSYMBOL_server_cache_max_negative_ttl = 508, /* server_cache_max_negative_ttl */
+ YYSYMBOL_server_cache_min_ttl = 509, /* server_cache_min_ttl */
+ YYSYMBOL_server_bogus_ttl = 510, /* server_bogus_ttl */
+ YYSYMBOL_server_val_clean_additional = 511, /* server_val_clean_additional */
+ YYSYMBOL_server_val_permissive_mode = 512, /* server_val_permissive_mode */
+ YYSYMBOL_server_aggressive_nsec = 513, /* server_aggressive_nsec */
+ YYSYMBOL_server_ignore_cd_flag = 514, /* server_ignore_cd_flag */
+ YYSYMBOL_server_serve_expired = 515, /* server_serve_expired */
+ YYSYMBOL_server_serve_expired_ttl = 516, /* server_serve_expired_ttl */
+ YYSYMBOL_server_serve_expired_ttl_reset = 517, /* server_serve_expired_ttl_reset */
+ YYSYMBOL_server_serve_expired_reply_ttl = 518, /* server_serve_expired_reply_ttl */
+ YYSYMBOL_server_serve_expired_client_timeout = 519, /* server_serve_expired_client_timeout */
+ YYSYMBOL_server_ede_serve_expired = 520, /* server_ede_serve_expired */
+ YYSYMBOL_server_serve_original_ttl = 521, /* server_serve_original_ttl */
+ YYSYMBOL_server_fake_dsa = 522, /* server_fake_dsa */
+ YYSYMBOL_server_fake_sha1 = 523, /* server_fake_sha1 */
+ YYSYMBOL_server_val_log_level = 524, /* server_val_log_level */
+ YYSYMBOL_server_val_nsec3_keysize_iterations = 525, /* server_val_nsec3_keysize_iterations */
+ YYSYMBOL_server_zonemd_permissive_mode = 526, /* server_zonemd_permissive_mode */
+ YYSYMBOL_server_add_holddown = 527, /* server_add_holddown */
+ YYSYMBOL_server_del_holddown = 528, /* server_del_holddown */
+ YYSYMBOL_server_keep_missing = 529, /* server_keep_missing */
+ YYSYMBOL_server_permit_small_holddown = 530, /* server_permit_small_holddown */
+ YYSYMBOL_server_key_cache_size = 531, /* server_key_cache_size */
+ YYSYMBOL_server_key_cache_slabs = 532, /* server_key_cache_slabs */
+ YYSYMBOL_server_neg_cache_size = 533, /* server_neg_cache_size */
+ YYSYMBOL_server_local_zone = 534, /* server_local_zone */
+ YYSYMBOL_server_local_data = 535, /* server_local_data */
+ YYSYMBOL_server_local_data_ptr = 536, /* server_local_data_ptr */
+ YYSYMBOL_server_minimal_responses = 537, /* server_minimal_responses */
+ YYSYMBOL_server_rrset_roundrobin = 538, /* server_rrset_roundrobin */
+ YYSYMBOL_server_unknown_server_time_limit = 539, /* server_unknown_server_time_limit */
+ YYSYMBOL_server_max_udp_size = 540, /* server_max_udp_size */
+ YYSYMBOL_server_dns64_prefix = 541, /* server_dns64_prefix */
+ YYSYMBOL_server_dns64_synthall = 542, /* server_dns64_synthall */
+ YYSYMBOL_server_dns64_ignore_aaaa = 543, /* server_dns64_ignore_aaaa */
+ YYSYMBOL_server_define_tag = 544, /* server_define_tag */
+ YYSYMBOL_server_local_zone_tag = 545, /* server_local_zone_tag */
+ YYSYMBOL_server_access_control_tag = 546, /* server_access_control_tag */
+ YYSYMBOL_server_access_control_tag_action = 547, /* server_access_control_tag_action */
+ YYSYMBOL_server_access_control_tag_data = 548, /* server_access_control_tag_data */
+ YYSYMBOL_server_local_zone_override = 549, /* server_local_zone_override */
+ YYSYMBOL_server_access_control_view = 550, /* server_access_control_view */
+ YYSYMBOL_server_interface_tag = 551, /* server_interface_tag */
+ YYSYMBOL_server_interface_tag_action = 552, /* server_interface_tag_action */
+ YYSYMBOL_server_interface_tag_data = 553, /* server_interface_tag_data */
+ YYSYMBOL_server_interface_view = 554, /* server_interface_view */
+ YYSYMBOL_server_response_ip_tag = 555, /* server_response_ip_tag */
+ YYSYMBOL_server_ip_ratelimit = 556, /* server_ip_ratelimit */
+ YYSYMBOL_server_ratelimit = 557, /* server_ratelimit */
+ YYSYMBOL_server_ip_ratelimit_size = 558, /* server_ip_ratelimit_size */
+ YYSYMBOL_server_ratelimit_size = 559, /* server_ratelimit_size */
+ YYSYMBOL_server_ip_ratelimit_slabs = 560, /* server_ip_ratelimit_slabs */
+ YYSYMBOL_server_ratelimit_slabs = 561, /* server_ratelimit_slabs */
+ YYSYMBOL_server_ratelimit_for_domain = 562, /* server_ratelimit_for_domain */
+ YYSYMBOL_server_ratelimit_below_domain = 563, /* server_ratelimit_below_domain */
+ YYSYMBOL_server_ip_ratelimit_factor = 564, /* server_ip_ratelimit_factor */
+ YYSYMBOL_server_ratelimit_factor = 565, /* server_ratelimit_factor */
+ YYSYMBOL_server_ip_ratelimit_backoff = 566, /* server_ip_ratelimit_backoff */
+ YYSYMBOL_server_ratelimit_backoff = 567, /* server_ratelimit_backoff */
+ YYSYMBOL_server_outbound_msg_retry = 568, /* server_outbound_msg_retry */
+ YYSYMBOL_server_low_rtt = 569, /* server_low_rtt */
+ YYSYMBOL_server_fast_server_num = 570, /* server_fast_server_num */
+ YYSYMBOL_server_fast_server_permil = 571, /* server_fast_server_permil */
+ YYSYMBOL_server_qname_minimisation = 572, /* server_qname_minimisation */
+ YYSYMBOL_server_qname_minimisation_strict = 573, /* server_qname_minimisation_strict */
+ YYSYMBOL_server_pad_responses = 574, /* server_pad_responses */
+ YYSYMBOL_server_pad_responses_block_size = 575, /* server_pad_responses_block_size */
+ YYSYMBOL_server_pad_queries = 576, /* server_pad_queries */
+ YYSYMBOL_server_pad_queries_block_size = 577, /* server_pad_queries_block_size */
+ YYSYMBOL_server_ipsecmod_enabled = 578, /* server_ipsecmod_enabled */
+ YYSYMBOL_server_ipsecmod_ignore_bogus = 579, /* server_ipsecmod_ignore_bogus */
+ YYSYMBOL_server_ipsecmod_hook = 580, /* server_ipsecmod_hook */
+ YYSYMBOL_server_ipsecmod_max_ttl = 581, /* server_ipsecmod_max_ttl */
+ YYSYMBOL_server_ipsecmod_whitelist = 582, /* server_ipsecmod_whitelist */
+ YYSYMBOL_server_ipsecmod_strict = 583, /* server_ipsecmod_strict */
+ YYSYMBOL_server_edns_client_string = 584, /* server_edns_client_string */
+ YYSYMBOL_server_edns_client_string_opcode = 585, /* server_edns_client_string_opcode */
+ YYSYMBOL_server_ede = 586, /* server_ede */
+ YYSYMBOL_server_proxy_protocol_port = 587, /* server_proxy_protocol_port */
+ YYSYMBOL_stub_name = 588, /* stub_name */
+ YYSYMBOL_stub_host = 589, /* stub_host */
+ YYSYMBOL_stub_addr = 590, /* stub_addr */
+ YYSYMBOL_stub_first = 591, /* stub_first */
+ YYSYMBOL_stub_no_cache = 592, /* stub_no_cache */
+ YYSYMBOL_stub_ssl_upstream = 593, /* stub_ssl_upstream */
+ YYSYMBOL_stub_tcp_upstream = 594, /* stub_tcp_upstream */
+ YYSYMBOL_stub_prime = 595, /* stub_prime */
+ YYSYMBOL_forward_name = 596, /* forward_name */
+ YYSYMBOL_forward_host = 597, /* forward_host */
+ YYSYMBOL_forward_addr = 598, /* forward_addr */
+ YYSYMBOL_forward_first = 599, /* forward_first */
+ YYSYMBOL_forward_no_cache = 600, /* forward_no_cache */
+ YYSYMBOL_forward_ssl_upstream = 601, /* forward_ssl_upstream */
+ YYSYMBOL_forward_tcp_upstream = 602, /* forward_tcp_upstream */
+ YYSYMBOL_auth_name = 603, /* auth_name */
+ YYSYMBOL_auth_zonefile = 604, /* auth_zonefile */
+ YYSYMBOL_auth_master = 605, /* auth_master */
+ YYSYMBOL_auth_url = 606, /* auth_url */
+ YYSYMBOL_auth_allow_notify = 607, /* auth_allow_notify */
+ YYSYMBOL_auth_zonemd_check = 608, /* auth_zonemd_check */
+ YYSYMBOL_auth_zonemd_reject_absence = 609, /* auth_zonemd_reject_absence */
+ YYSYMBOL_auth_for_downstream = 610, /* auth_for_downstream */
+ YYSYMBOL_auth_for_upstream = 611, /* auth_for_upstream */
+ YYSYMBOL_auth_fallback_enabled = 612, /* auth_fallback_enabled */
+ YYSYMBOL_view_name = 613, /* view_name */
+ YYSYMBOL_view_local_zone = 614, /* view_local_zone */
+ YYSYMBOL_view_response_ip = 615, /* view_response_ip */
+ YYSYMBOL_view_response_ip_data = 616, /* view_response_ip_data */
+ YYSYMBOL_view_local_data = 617, /* view_local_data */
+ YYSYMBOL_view_local_data_ptr = 618, /* view_local_data_ptr */
+ YYSYMBOL_view_first = 619, /* view_first */
+ YYSYMBOL_rcstart = 620, /* rcstart */
+ YYSYMBOL_contents_rc = 621, /* contents_rc */
+ YYSYMBOL_content_rc = 622, /* content_rc */
+ YYSYMBOL_rc_control_enable = 623, /* rc_control_enable */
+ YYSYMBOL_rc_control_port = 624, /* rc_control_port */
+ YYSYMBOL_rc_control_interface = 625, /* rc_control_interface */
+ YYSYMBOL_rc_control_use_cert = 626, /* rc_control_use_cert */
+ YYSYMBOL_rc_server_key_file = 627, /* rc_server_key_file */
+ YYSYMBOL_rc_server_cert_file = 628, /* rc_server_cert_file */
+ YYSYMBOL_rc_control_key_file = 629, /* rc_control_key_file */
+ YYSYMBOL_rc_control_cert_file = 630, /* rc_control_cert_file */
+ YYSYMBOL_dtstart = 631, /* dtstart */
+ YYSYMBOL_contents_dt = 632, /* contents_dt */
+ YYSYMBOL_content_dt = 633, /* content_dt */
+ YYSYMBOL_dt_dnstap_enable = 634, /* dt_dnstap_enable */
+ YYSYMBOL_dt_dnstap_bidirectional = 635, /* dt_dnstap_bidirectional */
+ YYSYMBOL_dt_dnstap_socket_path = 636, /* dt_dnstap_socket_path */
+ YYSYMBOL_dt_dnstap_ip = 637, /* dt_dnstap_ip */
+ YYSYMBOL_dt_dnstap_tls = 638, /* dt_dnstap_tls */
+ YYSYMBOL_dt_dnstap_tls_server_name = 639, /* dt_dnstap_tls_server_name */
+ YYSYMBOL_dt_dnstap_tls_cert_bundle = 640, /* dt_dnstap_tls_cert_bundle */
+ YYSYMBOL_dt_dnstap_tls_client_key_file = 641, /* dt_dnstap_tls_client_key_file */
+ YYSYMBOL_dt_dnstap_tls_client_cert_file = 642, /* dt_dnstap_tls_client_cert_file */
+ YYSYMBOL_dt_dnstap_send_identity = 643, /* dt_dnstap_send_identity */
+ YYSYMBOL_dt_dnstap_send_version = 644, /* dt_dnstap_send_version */
+ YYSYMBOL_dt_dnstap_identity = 645, /* dt_dnstap_identity */
+ YYSYMBOL_dt_dnstap_version = 646, /* dt_dnstap_version */
+ YYSYMBOL_dt_dnstap_log_resolver_query_messages = 647, /* dt_dnstap_log_resolver_query_messages */
+ YYSYMBOL_dt_dnstap_log_resolver_response_messages = 648, /* dt_dnstap_log_resolver_response_messages */
+ YYSYMBOL_dt_dnstap_log_client_query_messages = 649, /* dt_dnstap_log_client_query_messages */
+ YYSYMBOL_dt_dnstap_log_client_response_messages = 650, /* dt_dnstap_log_client_response_messages */
+ YYSYMBOL_dt_dnstap_log_forwarder_query_messages = 651, /* dt_dnstap_log_forwarder_query_messages */
+ YYSYMBOL_dt_dnstap_log_forwarder_response_messages = 652, /* dt_dnstap_log_forwarder_response_messages */
+ YYSYMBOL_pythonstart = 653, /* pythonstart */
+ YYSYMBOL_contents_py = 654, /* contents_py */
+ YYSYMBOL_content_py = 655, /* content_py */
+ YYSYMBOL_py_script = 656, /* py_script */
+ YYSYMBOL_dynlibstart = 657, /* dynlibstart */
+ YYSYMBOL_contents_dl = 658, /* contents_dl */
+ YYSYMBOL_content_dl = 659, /* content_dl */
+ YYSYMBOL_dl_file = 660, /* dl_file */
+ YYSYMBOL_server_disable_dnssec_lame_check = 661, /* server_disable_dnssec_lame_check */
+ YYSYMBOL_server_log_identity = 662, /* server_log_identity */
+ YYSYMBOL_server_response_ip = 663, /* server_response_ip */
+ YYSYMBOL_server_response_ip_data = 664, /* server_response_ip_data */
+ YYSYMBOL_dnscstart = 665, /* dnscstart */
+ YYSYMBOL_contents_dnsc = 666, /* contents_dnsc */
+ YYSYMBOL_content_dnsc = 667, /* content_dnsc */
+ YYSYMBOL_dnsc_dnscrypt_enable = 668, /* dnsc_dnscrypt_enable */
+ YYSYMBOL_dnsc_dnscrypt_port = 669, /* dnsc_dnscrypt_port */
+ YYSYMBOL_dnsc_dnscrypt_provider = 670, /* dnsc_dnscrypt_provider */
+ YYSYMBOL_dnsc_dnscrypt_provider_cert = 671, /* dnsc_dnscrypt_provider_cert */
+ YYSYMBOL_dnsc_dnscrypt_provider_cert_rotated = 672, /* dnsc_dnscrypt_provider_cert_rotated */
+ YYSYMBOL_dnsc_dnscrypt_secret_key = 673, /* dnsc_dnscrypt_secret_key */
+ YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_size = 674, /* dnsc_dnscrypt_shared_secret_cache_size */
+ YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_slabs = 675, /* dnsc_dnscrypt_shared_secret_cache_slabs */
+ YYSYMBOL_dnsc_dnscrypt_nonce_cache_size = 676, /* dnsc_dnscrypt_nonce_cache_size */
+ YYSYMBOL_dnsc_dnscrypt_nonce_cache_slabs = 677, /* dnsc_dnscrypt_nonce_cache_slabs */
+ YYSYMBOL_cachedbstart = 678, /* cachedbstart */
+ YYSYMBOL_contents_cachedb = 679, /* contents_cachedb */
+ YYSYMBOL_content_cachedb = 680, /* content_cachedb */
+ YYSYMBOL_cachedb_backend_name = 681, /* cachedb_backend_name */
+ YYSYMBOL_cachedb_secret_seed = 682, /* cachedb_secret_seed */
+ YYSYMBOL_redis_server_host = 683, /* redis_server_host */
+ YYSYMBOL_redis_server_port = 684, /* redis_server_port */
+ YYSYMBOL_redis_timeout = 685, /* redis_timeout */
+ YYSYMBOL_redis_expire_records = 686, /* redis_expire_records */
+ YYSYMBOL_server_tcp_connection_limit = 687, /* server_tcp_connection_limit */
+ YYSYMBOL_ipsetstart = 688, /* ipsetstart */
+ YYSYMBOL_contents_ipset = 689, /* contents_ipset */
+ YYSYMBOL_content_ipset = 690, /* content_ipset */
+ YYSYMBOL_ipset_name_v4 = 691, /* ipset_name_v4 */
+ YYSYMBOL_ipset_name_v6 = 692 /* ipset_name_v6 */
};
typedef enum yysymbol_kind_t yysymbol_kind_t;
@@ -1126,19 +1139,19 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 2
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 695
+#define YYLAST 713
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 328
+#define YYNTOKENS 334
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 353
+#define YYNNTS 359
/* YYNRULES -- Number of rules. */
-#define YYNRULES 683
+#define YYNRULES 695
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 1015
+#define YYNSTATES 1040
/* YYMAXUTOK -- Last valid token kind. */
-#define YYMAXUTOK 582
+#define YYMAXUTOK 588
/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -1210,82 +1223,83 @@ static const yytype_int16 yytranslate[] =
295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
315, 316, 317, 318, 319, 320, 321, 322, 323, 324,
- 325, 326, 327
+ 325, 326, 327, 328, 329, 330, 331, 332, 333
};
#if YYDEBUG
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_int16 yyrline[] =
{
- 0, 195, 195, 195, 196, 196, 197, 197, 198, 198,
- 198, 199, 199, 200, 200, 201, 201, 202, 204, 210,
- 215, 216, 217, 217, 217, 218, 218, 219, 219, 219,
- 220, 220, 221, 221, 221, 222, 222, 223, 223, 223,
- 224, 224, 224, 225, 225, 226, 226, 227, 227, 228,
- 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
- 233, 233, 234, 234, 235, 235, 235, 236, 236, 236,
- 237, 237, 238, 238, 239, 239, 240, 240, 241, 241,
- 241, 242, 242, 243, 243, 244, 244, 244, 245, 245,
- 246, 246, 247, 247, 248, 248, 248, 249, 249, 250,
- 250, 251, 251, 252, 252, 253, 253, 254, 254, 255,
- 255, 256, 256, 257, 257, 257, 258, 258, 258, 259,
- 259, 259, 260, 260, 260, 260, 261, 262, 262, 262,
- 263, 263, 263, 264, 264, 265, 265, 266, 266, 266,
- 267, 267, 267, 268, 268, 269, 269, 269, 270, 270,
- 270, 271, 271, 271, 272, 272, 273, 273, 274, 274,
- 275, 276, 276, 277, 277, 278, 278, 279, 279, 280,
- 280, 281, 281, 282, 282, 283, 283, 284, 284, 285,
- 285, 286, 286, 286, 287, 287, 288, 288, 289, 289,
- 290, 291, 291, 292, 292, 293, 294, 294, 295, 295,
- 296, 296, 296, 297, 297, 298, 298, 298, 299, 299,
- 299, 300, 300, 301, 302, 302, 303, 303, 304, 304,
- 305, 305, 306, 306, 306, 307, 307, 307, 308, 308,
- 308, 309, 309, 310, 310, 311, 311, 312, 312, 313,
- 313, 314, 314, 315, 315, 316, 316, 319, 332, 333,
- 334, 334, 334, 334, 334, 335, 335, 335, 337, 350,
- 351, 352, 352, 352, 352, 353, 353, 353, 355, 370,
- 371, 372, 372, 372, 372, 373, 373, 373, 375, 395,
- 396, 397, 397, 397, 397, 398, 398, 398, 399, 399,
- 399, 402, 421, 438, 446, 456, 463, 473, 491, 492,
- 493, 493, 493, 493, 493, 494, 494, 494, 495, 495,
- 495, 495, 497, 506, 515, 526, 535, 544, 553, 564,
- 573, 585, 599, 614, 625, 642, 659, 676, 693, 708,
- 723, 736, 751, 760, 769, 778, 787, 796, 805, 812,
- 821, 830, 839, 848, 857, 866, 875, 884, 897, 908,
- 919, 930, 939, 952, 961, 970, 979, 986, 993, 1002,
- 1009, 1018, 1026, 1033, 1040, 1048, 1057, 1065, 1081, 1089,
- 1097, 1105, 1113, 1121, 1130, 1139, 1153, 1162, 1171, 1180,
- 1189, 1198, 1207, 1214, 1221, 1247, 1255, 1262, 1269, 1276,
- 1283, 1291, 1299, 1307, 1314, 1325, 1336, 1343, 1352, 1361,
- 1370, 1379, 1386, 1393, 1400, 1416, 1424, 1432, 1442, 1452,
- 1462, 1476, 1484, 1497, 1508, 1516, 1529, 1538, 1547, 1556,
- 1565, 1575, 1585, 1593, 1606, 1615, 1623, 1632, 1640, 1653,
- 1662, 1671, 1681, 1688, 1698, 1708, 1718, 1728, 1738, 1748,
- 1758, 1768, 1775, 1782, 1789, 1798, 1807, 1816, 1825, 1832,
- 1842, 1862, 1869, 1887, 1900, 1913, 1926, 1935, 1944, 1953,
- 1962, 1972, 1982, 1993, 2002, 2011, 2020, 2029, 2038, 2047,
- 2056, 2065, 2078, 2091, 2100, 2107, 2116, 2125, 2134, 2143,
- 2152, 2160, 2173, 2181, 2236, 2243, 2258, 2268, 2278, 2285,
- 2292, 2299, 2308, 2316, 2330, 2351, 2372, 2384, 2396, 2408,
- 2417, 2438, 2447, 2456, 2464, 2472, 2485, 2498, 2513, 2528,
- 2537, 2546, 2556, 2566, 2575, 2581, 2590, 2599, 2609, 2619,
- 2629, 2638, 2648, 2657, 2670, 2683, 2695, 2709, 2721, 2735,
- 2744, 2755, 2764, 2774, 2781, 2788, 2797, 2806, 2816, 2826,
- 2836, 2846, 2853, 2860, 2869, 2878, 2888, 2898, 2908, 2915,
- 2922, 2929, 2937, 2947, 2957, 2967, 2977, 2987, 2997, 3053,
- 3063, 3071, 3079, 3094, 3103, 3108, 3109, 3110, 3110, 3110,
- 3111, 3111, 3111, 3112, 3112, 3114, 3124, 3133, 3140, 3147,
- 3154, 3161, 3168, 3175, 3180, 3181, 3182, 3182, 3182, 3183,
- 3183, 3183, 3184, 3185, 3185, 3186, 3186, 3187, 3187, 3188,
- 3189, 3190, 3191, 3192, 3193, 3195, 3204, 3214, 3221, 3228,
- 3237, 3244, 3251, 3258, 3265, 3274, 3283, 3290, 3297, 3307,
- 3317, 3327, 3337, 3347, 3357, 3362, 3363, 3364, 3366, 3372,
- 3377, 3378, 3379, 3381, 3387, 3397, 3404, 3413, 3421, 3426,
- 3427, 3429, 3429, 3429, 3430, 3430, 3431, 3432, 3433, 3434,
- 3435, 3437, 3447, 3456, 3463, 3472, 3479, 3488, 3496, 3509,
- 3517, 3530, 3535, 3536, 3537, 3537, 3538, 3538, 3538, 3539,
- 3541, 3553, 3565, 3577, 3592, 3605, 3618, 3629, 3634, 3635,
- 3636, 3636, 3638, 3653
+ 0, 199, 199, 199, 200, 200, 201, 201, 202, 202,
+ 202, 203, 203, 204, 204, 205, 205, 206, 208, 215,
+ 221, 222, 223, 223, 223, 224, 224, 225, 225, 225,
+ 226, 226, 227, 227, 227, 228, 228, 229, 229, 229,
+ 230, 230, 230, 231, 231, 232, 232, 233, 233, 234,
+ 234, 235, 235, 236, 236, 237, 237, 238, 238, 239,
+ 239, 239, 240, 240, 241, 241, 241, 242, 242, 242,
+ 243, 243, 244, 244, 245, 245, 246, 246, 247, 247,
+ 247, 248, 248, 249, 249, 250, 250, 250, 251, 251,
+ 252, 252, 253, 253, 254, 254, 254, 255, 255, 256,
+ 256, 257, 257, 258, 258, 259, 259, 260, 260, 261,
+ 261, 262, 262, 263, 263, 263, 264, 264, 264, 265,
+ 265, 265, 266, 266, 266, 266, 267, 268, 268, 268,
+ 269, 269, 269, 270, 270, 271, 271, 272, 272, 272,
+ 273, 273, 273, 274, 274, 275, 275, 275, 276, 276,
+ 276, 277, 277, 277, 278, 278, 279, 279, 280, 280,
+ 281, 282, 282, 283, 283, 284, 284, 285, 285, 286,
+ 286, 287, 287, 288, 288, 289, 289, 290, 290, 291,
+ 291, 292, 292, 292, 293, 293, 294, 294, 295, 295,
+ 296, 296, 296, 297, 297, 298, 299, 299, 300, 300,
+ 301, 302, 302, 303, 303, 304, 304, 304, 305, 305,
+ 306, 306, 306, 307, 307, 307, 308, 308, 309, 310,
+ 310, 311, 311, 312, 312, 313, 313, 314, 314, 314,
+ 315, 315, 315, 316, 316, 316, 317, 317, 318, 318,
+ 319, 319, 320, 320, 321, 321, 322, 322, 323, 323,
+ 324, 324, 325, 327, 341, 342, 343, 343, 343, 343,
+ 343, 344, 344, 344, 346, 360, 361, 362, 362, 362,
+ 362, 363, 363, 363, 365, 381, 382, 383, 383, 383,
+ 383, 384, 384, 384, 386, 407, 408, 409, 409, 409,
+ 409, 410, 410, 410, 411, 411, 411, 414, 433, 450,
+ 458, 468, 475, 485, 504, 505, 506, 506, 506, 506,
+ 506, 507, 507, 507, 508, 508, 508, 508, 510, 519,
+ 528, 539, 548, 557, 566, 577, 586, 598, 612, 627,
+ 638, 655, 672, 689, 706, 721, 736, 749, 764, 773,
+ 782, 791, 800, 809, 818, 825, 834, 843, 852, 861,
+ 870, 879, 888, 897, 910, 921, 932, 943, 952, 965,
+ 974, 983, 992, 999, 1006, 1015, 1022, 1031, 1039, 1046,
+ 1053, 1061, 1070, 1078, 1094, 1102, 1110, 1118, 1126, 1134,
+ 1143, 1152, 1166, 1175, 1184, 1193, 1202, 1211, 1220, 1227,
+ 1234, 1260, 1268, 1275, 1282, 1289, 1296, 1304, 1312, 1320,
+ 1327, 1338, 1349, 1356, 1365, 1374, 1383, 1392, 1399, 1406,
+ 1413, 1429, 1437, 1445, 1455, 1465, 1475, 1489, 1497, 1510,
+ 1521, 1529, 1542, 1551, 1560, 1569, 1578, 1588, 1598, 1606,
+ 1619, 1628, 1636, 1645, 1653, 1666, 1675, 1684, 1694, 1701,
+ 1711, 1721, 1731, 1741, 1751, 1761, 1771, 1781, 1788, 1795,
+ 1802, 1811, 1820, 1829, 1838, 1845, 1855, 1863, 1872, 1879,
+ 1897, 1910, 1923, 1936, 1945, 1954, 1963, 1972, 1982, 1992,
+ 2003, 2012, 2021, 2030, 2039, 2048, 2057, 2066, 2075, 2088,
+ 2101, 2110, 2117, 2126, 2135, 2144, 2153, 2162, 2170, 2183,
+ 2191, 2246, 2253, 2268, 2278, 2288, 2295, 2302, 2309, 2318,
+ 2326, 2340, 2361, 2382, 2394, 2406, 2418, 2427, 2448, 2460,
+ 2472, 2481, 2502, 2511, 2520, 2528, 2536, 2549, 2562, 2577,
+ 2592, 2601, 2610, 2620, 2630, 2639, 2645, 2654, 2663, 2673,
+ 2683, 2693, 2702, 2712, 2721, 2734, 2747, 2759, 2773, 2785,
+ 2799, 2808, 2819, 2828, 2835, 2845, 2852, 2859, 2868, 2877,
+ 2887, 2897, 2907, 2917, 2924, 2931, 2940, 2949, 2959, 2969,
+ 2979, 2986, 2993, 3000, 3008, 3018, 3028, 3038, 3048, 3058,
+ 3068, 3124, 3134, 3142, 3150, 3165, 3174, 3180, 3181, 3182,
+ 3182, 3182, 3183, 3183, 3183, 3184, 3184, 3186, 3196, 3205,
+ 3212, 3219, 3226, 3233, 3240, 3247, 3253, 3254, 3255, 3255,
+ 3255, 3256, 3256, 3256, 3257, 3258, 3258, 3259, 3259, 3260,
+ 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3268, 3277, 3287,
+ 3294, 3301, 3310, 3317, 3324, 3331, 3338, 3347, 3356, 3363,
+ 3370, 3380, 3390, 3400, 3410, 3420, 3430, 3436, 3437, 3438,
+ 3440, 3446, 3452, 3453, 3454, 3456, 3462, 3472, 3479, 3488,
+ 3496, 3502, 3503, 3505, 3505, 3505, 3506, 3506, 3507, 3508,
+ 3509, 3510, 3511, 3513, 3523, 3532, 3539, 3548, 3555, 3564,
+ 3572, 3585, 3593, 3606, 3612, 3613, 3614, 3614, 3615, 3615,
+ 3615, 3616, 3618, 3630, 3642, 3654, 3669, 3682, 3695, 3706,
+ 3712, 3713, 3714, 3714, 3716, 3731
};
#endif
@@ -1425,17 +1439,20 @@ static const char *const yytname[] =
"VAR_EDNS_CLIENT_STRING", "VAR_EDNS_CLIENT_STRING_OPCODE", "VAR_NSID",
"VAR_ZONEMD_PERMISSIVE_MODE", "VAR_ZONEMD_CHECK",
"VAR_ZONEMD_REJECT_ABSENCE", "VAR_RPZ_SIGNAL_NXDOMAIN_RA",
- "VAR_INTERFACE_AUTOMATIC_PORTS", "VAR_EDE", "$accept", "toplevelvars",
- "toplevelvar", "force_toplevel", "serverstart", "contents_server",
- "content_server", "stubstart", "contents_stub", "content_stub",
- "forwardstart", "contents_forward", "content_forward", "viewstart",
- "contents_view", "content_view", "authstart", "contents_auth",
- "content_auth", "rpz_tag", "rpz_action_override", "rpz_cname_override",
- "rpz_log", "rpz_log_name", "rpz_signal_nxdomain_ra", "rpzstart",
- "contents_rpz", "content_rpz", "server_num_threads", "server_verbosity",
- "server_statistics_interval", "server_statistics_cumulative",
- "server_extended_statistics", "server_shm_enable", "server_shm_key",
- "server_port", "server_send_client_subnet", "server_client_subnet_zone",
+ "VAR_INTERFACE_AUTOMATIC_PORTS", "VAR_EDE", "VAR_INTERFACE_ACTION",
+ "VAR_INTERFACE_VIEW", "VAR_INTERFACE_TAG", "VAR_INTERFACE_TAG_ACTION",
+ "VAR_INTERFACE_TAG_DATA", "VAR_PROXY_PROTOCOL_PORT", "$accept",
+ "toplevelvars", "toplevelvar", "force_toplevel", "serverstart",
+ "contents_server", "content_server", "stubstart", "contents_stub",
+ "content_stub", "forwardstart", "contents_forward", "content_forward",
+ "viewstart", "contents_view", "content_view", "authstart",
+ "contents_auth", "content_auth", "rpz_tag", "rpz_action_override",
+ "rpz_cname_override", "rpz_log", "rpz_log_name",
+ "rpz_signal_nxdomain_ra", "rpzstart", "contents_rpz", "content_rpz",
+ "server_num_threads", "server_verbosity", "server_statistics_interval",
+ "server_statistics_cumulative", "server_extended_statistics",
+ "server_shm_enable", "server_shm_key", "server_port",
+ "server_send_client_subnet", "server_client_subnet_zone",
"server_client_subnet_always_forward", "server_client_subnet_opcode",
"server_max_client_subnet_ipv4", "server_max_client_subnet_ipv6",
"server_min_client_subnet_ipv4", "server_min_client_subnet_ipv6",
@@ -1491,7 +1508,7 @@ static const char *const yytname[] =
"server_private_domain", "server_prefetch", "server_prefetch_key",
"server_deny_any", "server_unwanted_reply_threshold",
"server_do_not_query_address", "server_do_not_query_localhost",
- "server_access_control", "server_module_conf",
+ "server_access_control", "server_interface_action", "server_module_conf",
"server_val_override_date", "server_val_sig_skew_min",
"server_val_sig_skew_max", "server_val_max_restart",
"server_cache_max_ttl", "server_cache_max_negative_ttl",
@@ -1513,40 +1530,42 @@ static const char *const yytname[] =
"server_dns64_ignore_aaaa", "server_define_tag", "server_local_zone_tag",
"server_access_control_tag", "server_access_control_tag_action",
"server_access_control_tag_data", "server_local_zone_override",
- "server_access_control_view", "server_response_ip_tag",
- "server_ip_ratelimit", "server_ratelimit", "server_ip_ratelimit_size",
- "server_ratelimit_size", "server_ip_ratelimit_slabs",
- "server_ratelimit_slabs", "server_ratelimit_for_domain",
- "server_ratelimit_below_domain", "server_ip_ratelimit_factor",
- "server_ratelimit_factor", "server_ip_ratelimit_backoff",
- "server_ratelimit_backoff", "server_outbound_msg_retry",
- "server_low_rtt", "server_fast_server_num", "server_fast_server_permil",
- "server_qname_minimisation", "server_qname_minimisation_strict",
- "server_pad_responses", "server_pad_responses_block_size",
- "server_pad_queries", "server_pad_queries_block_size",
- "server_ipsecmod_enabled", "server_ipsecmod_ignore_bogus",
- "server_ipsecmod_hook", "server_ipsecmod_max_ttl",
- "server_ipsecmod_whitelist", "server_ipsecmod_strict",
- "server_edns_client_string", "server_edns_client_string_opcode",
- "server_ede", "stub_name", "stub_host", "stub_addr", "stub_first",
- "stub_no_cache", "stub_ssl_upstream", "stub_tcp_upstream", "stub_prime",
- "forward_name", "forward_host", "forward_addr", "forward_first",
- "forward_no_cache", "forward_ssl_upstream", "forward_tcp_upstream",
- "auth_name", "auth_zonefile", "auth_master", "auth_url",
- "auth_allow_notify", "auth_zonemd_check", "auth_zonemd_reject_absence",
- "auth_for_downstream", "auth_for_upstream", "auth_fallback_enabled",
- "view_name", "view_local_zone", "view_response_ip",
- "view_response_ip_data", "view_local_data", "view_local_data_ptr",
- "view_first", "rcstart", "contents_rc", "content_rc",
- "rc_control_enable", "rc_control_port", "rc_control_interface",
- "rc_control_use_cert", "rc_server_key_file", "rc_server_cert_file",
- "rc_control_key_file", "rc_control_cert_file", "dtstart", "contents_dt",
- "content_dt", "dt_dnstap_enable", "dt_dnstap_bidirectional",
- "dt_dnstap_socket_path", "dt_dnstap_ip", "dt_dnstap_tls",
- "dt_dnstap_tls_server_name", "dt_dnstap_tls_cert_bundle",
- "dt_dnstap_tls_client_key_file", "dt_dnstap_tls_client_cert_file",
- "dt_dnstap_send_identity", "dt_dnstap_send_version",
- "dt_dnstap_identity", "dt_dnstap_version",
+ "server_access_control_view", "server_interface_tag",
+ "server_interface_tag_action", "server_interface_tag_data",
+ "server_interface_view", "server_response_ip_tag", "server_ip_ratelimit",
+ "server_ratelimit", "server_ip_ratelimit_size", "server_ratelimit_size",
+ "server_ip_ratelimit_slabs", "server_ratelimit_slabs",
+ "server_ratelimit_for_domain", "server_ratelimit_below_domain",
+ "server_ip_ratelimit_factor", "server_ratelimit_factor",
+ "server_ip_ratelimit_backoff", "server_ratelimit_backoff",
+ "server_outbound_msg_retry", "server_low_rtt", "server_fast_server_num",
+ "server_fast_server_permil", "server_qname_minimisation",
+ "server_qname_minimisation_strict", "server_pad_responses",
+ "server_pad_responses_block_size", "server_pad_queries",
+ "server_pad_queries_block_size", "server_ipsecmod_enabled",
+ "server_ipsecmod_ignore_bogus", "server_ipsecmod_hook",
+ "server_ipsecmod_max_ttl", "server_ipsecmod_whitelist",
+ "server_ipsecmod_strict", "server_edns_client_string",
+ "server_edns_client_string_opcode", "server_ede",
+ "server_proxy_protocol_port", "stub_name", "stub_host", "stub_addr",
+ "stub_first", "stub_no_cache", "stub_ssl_upstream", "stub_tcp_upstream",
+ "stub_prime", "forward_name", "forward_host", "forward_addr",
+ "forward_first", "forward_no_cache", "forward_ssl_upstream",
+ "forward_tcp_upstream", "auth_name", "auth_zonefile", "auth_master",
+ "auth_url", "auth_allow_notify", "auth_zonemd_check",
+ "auth_zonemd_reject_absence", "auth_for_downstream", "auth_for_upstream",
+ "auth_fallback_enabled", "view_name", "view_local_zone",
+ "view_response_ip", "view_response_ip_data", "view_local_data",
+ "view_local_data_ptr", "view_first", "rcstart", "contents_rc",
+ "content_rc", "rc_control_enable", "rc_control_port",
+ "rc_control_interface", "rc_control_use_cert", "rc_server_key_file",
+ "rc_server_cert_file", "rc_control_key_file", "rc_control_cert_file",
+ "dtstart", "contents_dt", "content_dt", "dt_dnstap_enable",
+ "dt_dnstap_bidirectional", "dt_dnstap_socket_path", "dt_dnstap_ip",
+ "dt_dnstap_tls", "dt_dnstap_tls_server_name",
+ "dt_dnstap_tls_cert_bundle", "dt_dnstap_tls_client_key_file",
+ "dt_dnstap_tls_client_cert_file", "dt_dnstap_send_identity",
+ "dt_dnstap_send_version", "dt_dnstap_identity", "dt_dnstap_version",
"dt_dnstap_log_resolver_query_messages",
"dt_dnstap_log_resolver_response_messages",
"dt_dnstap_log_client_query_messages",
@@ -1613,11 +1632,12 @@ static const yytype_int16 yytoknum[] =
545, 546, 547, 548, 549, 550, 551, 552, 553, 554,
555, 556, 557, 558, 559, 560, 561, 562, 563, 564,
565, 566, 567, 568, 569, 570, 571, 572, 573, 574,
- 575, 576, 577, 578, 579, 580, 581, 582
+ 575, 576, 577, 578, 579, 580, 581, 582, 583, 584,
+ 585, 586, 587, 588
};
#endif
-#define YYPACT_NINF (-312)
+#define YYPACT_NINF (-284)
#define yypact_value_is_default(Yyn) \
((Yyn) == YYPACT_NINF)
@@ -1631,108 +1651,110 @@ static const yytype_int16 yytoknum[] =
STATE-NUM. */
static const yytype_int16 yypact[] =
{
- -312, 0, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, 305, -39, -32, -43, -30, -44, -42, -98,
- -110, -311, -231, -235, -305, 4, 6, 7, 8, 9,
- 10, 23, 24, 25, 26, 27, 37, 38, 39, 40,
- 41, 43, 44, 53, 54, 56, 57, 58, 59, 60,
- 81, 82, 83, 84, 85, 87, 88, 89, 90, 91,
- 92, 93, 95, 96, 98, 99, 101, 103, 107, 108,
- 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
- 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
- 129, 130, 131, 132, 133, 134, 135, 136, 139, 140,
- 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
- 151, 152, 153, 154, 155, 156, 157, 158, 160, 161,
- 162, 163, 164, 165, 166, 167, 168, 169, 170, 171,
- 172, 173, 174, 175, 176, 177, 178, 179, 181, 182,
- 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
- 193, 194, 195, 196, 197, 198, 199, 200, 201, 202,
- 203, 204, 205, 206, 207, 208, 209, 210, 211, 212,
- 213, 214, 215, 216, 217, 218, 219, 220, 222, 223,
- 224, 225, 226, 227, 228, 229, 234, 235, 236, 237,
- 238, 239, 241, 250, 251, 252, 253, 256, 257, 263,
- 265, 266, 267, 268, 269, 270, 272, 274, 275, 276,
- 277, 278, 279, 280, 281, 282, 285, 286, 287, 288,
- 289, 290, 291, 292, 293, 294, 295, 296, 298, 299,
- 300, 302, 303, 304, 306, 340, 341, 342, 343, 347,
- 348, 349, 391, 392, 393, 394, 395, 396, 397, 398,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, 399, 405, 409, 410,
- 437, 438, 439, 441, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, 442, 450, 464, 465, 466, 467, 468,
- -312, -312, -312, -312, -312, -312, -312, -312, 469, 470,
- 471, 472, 473, 474, 475, -312, -312, -312, -312, -312,
- -312, -312, -312, 476, 477, 478, 479, 480, 481, 482,
- 483, 526, 528, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, 548, 549, 550, 551, 552, 553,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, 554, 555, 556, 557, 558, 569, 570,
- 571, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- 572, 573, 574, 575, 577, 578, 579, 580, 581, 582,
- 583, 586, 589, 592, 593, 602, 603, 604, 606, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, 607,
- -312, -312, 608, -312, -312, 609, 610, 611, 612, 613,
- 618, 619, 620, 623, 624, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, 625, 626, 627, 628,
- 629, 630, -312, -312, -312, -312, -312, -312, -312, 631,
- 632, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, 633, 634, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, 635, 636, 637, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, 638,
- 639, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, 640, 641, 642, 643, 644, 645, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, 646, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, 647, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, 648, -312, -312, 649, 650,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, 651, 652, 653, -312, -312, -312, -312,
- -312, -312, -312, -312, -312
+ -284, 250, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -13, 201, 218, 52, 84, 38, 236, 209,
+ -81, -283, -93, -191, -276, 29, 30, 31, 80, 81,
+ 91, 92, 120, 121, 132, 146, 147, 148, 149, 161,
+ 162, 163, 164, 165, 208, 210, 230, 231, 234, 235,
+ 237, 254, 255, 256, 257, 259, 260, 263, 264, 265,
+ 268, 271, 274, 284, 285, 288, 289, 290, 291, 293,
+ 294, 295, 300, 302, 311, 316, 317, 318, 319, 320,
+ 321, 331, 332, 333, 335, 338, 339, 345, 347, 348,
+ 349, 351, 357, 363, 364, 365, 366, 367, 388, 389,
+ 390, 391, 392, 393, 394, 395, 396, 399, 400, 401,
+ 402, 403, 404, 405, 406, 407, 408, 410, 411, 412,
+ 413, 414, 415, 416, 417, 418, 419, 420, 421, 422,
+ 423, 424, 425, 426, 427, 428, 429, 430, 431, 432,
+ 433, 434, 435, 436, 437, 438, 439, 440, 441, 442,
+ 443, 444, 445, 446, 447, 448, 449, 450, 451, 452,
+ 453, 454, 455, 456, 457, 458, 459, 460, 461, 462,
+ 463, 464, 465, 466, 467, 468, 469, 470, 472, 473,
+ 474, 475, 476, 477, 478, 479, 480, 481, 482, 483,
+ 484, 485, 486, 487, 488, 490, 491, 492, 494, 495,
+ 496, 497, 498, 499, 500, 501, 502, 503, 504, 506,
+ 507, 508, 509, 510, 511, 512, 513, 515, 516, 517,
+ 518, 519, 520, 521, 522, 524, 525, 526, 527, 528,
+ 529, 530, 531, 532, 533, 534, 535, 536, 537, 538,
+ 539, 540, 541, 542, 543, 544, 545, 546, 548, 549,
+ 550, 552, 553, 554, 555, 556, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, 558, 559,
+ 560, 561, 562, 563, 564, 565, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, 566, 567, 568, 569, 570,
+ 571, 572, -284, -284, -284, -284, -284, -284, -284, -284,
+ 573, 574, 575, 576, 577, 578, 579, -284, -284, -284,
+ -284, -284, -284, -284, -284, 580, 581, 582, 583, 584,
+ 585, 586, 587, 588, 589, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, 590, 591, 592, 593,
+ 594, 595, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, 596, 597, 598, 599, 600,
+ 601, 602, 603, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, 604, 605, 606, 607, 608, 609, 610, 611,
+ 612, 613, 614, 615, 616, 617, 618, 619, 620, 621,
+ 622, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, 623, -284, -284, 624, -284, -284, 625, 626, 627,
+ 628, 629, 630, 631, 632, 633, 634, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, 635, 636,
+ 637, 638, 639, 640, -284, -284, -284, -284, -284, -284,
+ -284, 641, 642, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, 643, 644, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, 645, 646, 647,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, 648, 649, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, 650, 651, 652, 653, 654, 655,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, 656, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, 657, -284, -284, -284, -284,
+ -284, 658, 659, 660, 661, 662, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, 663, -284, -284, 664, 665, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, 666, 667, 668, -284, -284, -284, -284, -284, -284,
+ 669, 670, -284, -284, -284, -284, -284, -284, -284, -284
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1740,10 +1762,10 @@ static const yytype_int16 yypact[] =
means the default is an error. */
static const yytype_int16 yydefact[] =
{
- 2, 0, 1, 18, 19, 247, 258, 564, 624, 583,
- 268, 638, 661, 278, 677, 297, 629, 3, 17, 21,
- 249, 260, 270, 280, 299, 566, 585, 626, 631, 640,
- 663, 679, 4, 5, 6, 10, 14, 15, 8, 9,
+ 2, 0, 1, 18, 19, 253, 264, 576, 636, 595,
+ 274, 650, 673, 284, 689, 303, 641, 3, 17, 21,
+ 255, 266, 276, 286, 305, 578, 597, 638, 643, 652,
+ 675, 691, 4, 5, 6, 10, 14, 15, 8, 9,
7, 16, 11, 12, 13, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1767,163 +1789,165 @@ static const yytype_int16 yydefact[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 20, 22, 23, 88, 91, 100, 208, 209, 24, 167,
- 168, 169, 170, 171, 172, 173, 174, 175, 176, 37,
- 79, 25, 92, 93, 48, 72, 87, 245, 26, 27,
- 30, 31, 28, 29, 32, 33, 34, 242, 243, 244,
- 35, 36, 124, 220, 125, 127, 128, 129, 222, 227,
- 223, 234, 235, 236, 237, 130, 131, 132, 133, 134,
- 135, 136, 204, 89, 78, 104, 122, 123, 232, 229,
- 126, 38, 39, 40, 41, 42, 80, 94, 95, 111,
- 66, 76, 67, 212, 213, 105, 58, 59, 211, 62,
- 60, 61, 63, 240, 115, 119, 140, 151, 181, 154,
- 233, 116, 73, 43, 44, 45, 102, 141, 142, 143,
- 144, 46, 47, 49, 50, 52, 53, 51, 148, 149,
- 155, 54, 55, 56, 64, 83, 120, 97, 150, 90,
- 177, 98, 99, 117, 118, 230, 103, 57, 81, 84,
- 65, 68, 106, 107, 108, 82, 178, 109, 69, 70,
- 71, 221, 121, 195, 196, 197, 198, 199, 200, 201,
- 202, 210, 110, 77, 241, 112, 113, 114, 179, 74,
- 75, 96, 85, 86, 101, 137, 138, 231, 139, 145,
- 146, 147, 182, 183, 185, 187, 188, 186, 189, 205,
- 152, 153, 158, 159, 156, 157, 160, 161, 163, 162,
- 165, 164, 166, 224, 226, 225, 180, 190, 191, 192,
- 193, 194, 214, 216, 215, 217, 218, 219, 238, 239,
- 246, 184, 203, 206, 207, 228, 0, 0, 0, 0,
- 0, 0, 0, 0, 248, 250, 251, 252, 254, 255,
- 256, 257, 253, 0, 0, 0, 0, 0, 0, 0,
- 259, 261, 262, 263, 264, 265, 266, 267, 0, 0,
- 0, 0, 0, 0, 0, 269, 271, 272, 275, 276,
- 273, 277, 274, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 279, 281, 282, 283, 284, 288, 289,
- 290, 285, 286, 287, 0, 0, 0, 0, 0, 0,
- 302, 306, 307, 308, 309, 310, 298, 300, 301, 303,
- 304, 305, 311, 0, 0, 0, 0, 0, 0, 0,
- 0, 565, 567, 569, 568, 574, 570, 571, 572, 573,
+ 0, 0, 0, 0, 0, 0, 20, 22, 23, 88,
+ 91, 100, 213, 214, 24, 167, 168, 169, 170, 171,
+ 172, 173, 174, 175, 176, 37, 79, 25, 92, 93,
+ 48, 72, 87, 250, 26, 27, 30, 31, 28, 29,
+ 32, 33, 34, 247, 248, 249, 35, 36, 124, 225,
+ 125, 127, 128, 129, 227, 232, 228, 239, 240, 241,
+ 242, 130, 131, 132, 133, 134, 135, 136, 209, 89,
+ 78, 104, 122, 123, 237, 234, 126, 38, 39, 40,
+ 41, 42, 80, 94, 95, 111, 66, 76, 67, 217,
+ 218, 105, 58, 59, 216, 62, 60, 61, 63, 245,
+ 115, 119, 140, 151, 181, 154, 238, 116, 73, 43,
+ 44, 45, 102, 141, 142, 143, 144, 46, 47, 49,
+ 50, 52, 53, 51, 148, 149, 155, 54, 55, 56,
+ 64, 83, 120, 97, 150, 90, 177, 98, 99, 117,
+ 118, 235, 103, 57, 81, 84, 190, 65, 68, 106,
+ 107, 108, 82, 178, 109, 69, 70, 71, 226, 121,
+ 200, 201, 202, 203, 204, 205, 206, 207, 215, 110,
+ 77, 246, 112, 113, 114, 179, 74, 75, 96, 85,
+ 86, 101, 137, 138, 236, 139, 145, 146, 147, 182,
+ 183, 185, 187, 188, 186, 189, 192, 193, 194, 191,
+ 210, 152, 153, 158, 159, 156, 157, 160, 161, 163,
+ 162, 165, 164, 166, 229, 231, 230, 180, 195, 196,
+ 197, 198, 199, 219, 221, 220, 222, 223, 224, 243,
+ 244, 251, 252, 184, 208, 211, 212, 233, 0, 0,
+ 0, 0, 0, 0, 0, 0, 254, 256, 257, 258,
+ 260, 261, 262, 263, 259, 0, 0, 0, 0, 0,
+ 0, 0, 265, 267, 268, 269, 270, 271, 272, 273,
+ 0, 0, 0, 0, 0, 0, 0, 275, 277, 278,
+ 281, 282, 279, 283, 280, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 285, 287, 288, 289, 290,
+ 294, 295, 296, 291, 292, 293, 0, 0, 0, 0,
+ 0, 0, 308, 312, 313, 314, 315, 316, 304, 306,
+ 307, 309, 310, 311, 317, 0, 0, 0, 0, 0,
+ 0, 0, 0, 577, 579, 581, 580, 586, 582, 583,
+ 584, 585, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 584,
- 586, 588, 587, 589, 590, 591, 592, 593, 594, 595,
- 596, 597, 598, 599, 600, 601, 602, 603, 604, 0,
- 625, 627, 0, 630, 632, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 639, 641, 642, 643, 645,
- 646, 644, 647, 648, 649, 650, 0, 0, 0, 0,
- 0, 0, 662, 664, 665, 666, 667, 668, 669, 0,
- 0, 678, 680, 681, 313, 312, 319, 332, 330, 343,
- 339, 340, 344, 341, 342, 345, 346, 347, 351, 352,
- 382, 383, 384, 385, 386, 414, 415, 416, 422, 423,
- 335, 424, 425, 428, 426, 427, 432, 433, 434, 448,
- 397, 398, 401, 402, 435, 451, 391, 393, 452, 459,
- 460, 461, 336, 413, 480, 481, 392, 474, 375, 331,
- 387, 449, 456, 436, 0, 0, 484, 337, 314, 374,
- 440, 315, 333, 334, 388, 389, 482, 438, 442, 443,
- 349, 348, 316, 485, 417, 447, 376, 396, 453, 454,
- 455, 458, 473, 390, 478, 476, 477, 405, 412, 444,
- 445, 406, 407, 437, 463, 377, 378, 381, 353, 355,
- 350, 356, 357, 358, 359, 366, 367, 368, 369, 370,
- 371, 372, 486, 487, 489, 418, 419, 420, 421, 429,
- 430, 431, 490, 491, 492, 0, 0, 0, 439, 408,
- 410, 634, 501, 505, 503, 502, 506, 504, 513, 0,
- 0, 509, 510, 511, 512, 320, 321, 322, 323, 324,
- 325, 326, 327, 328, 329, 441, 457, 479, 517, 518,
- 409, 493, 0, 0, 0, 0, 0, 0, 464, 465,
- 466, 467, 468, 469, 470, 471, 472, 635, 399, 400,
- 403, 394, 462, 373, 317, 318, 395, 519, 520, 521,
- 522, 523, 525, 524, 526, 527, 528, 354, 361, 514,
- 516, 515, 360, 0, 380, 446, 488, 379, 411, 362,
- 363, 365, 364, 0, 530, 404, 475, 338, 531, 532,
- 533, 534, 539, 537, 538, 535, 536, 540, 541, 542,
- 543, 545, 546, 544, 557, 0, 561, 562, 0, 0,
- 563, 547, 555, 548, 549, 550, 554, 556, 551, 552,
- 553, 291, 292, 293, 294, 295, 296, 575, 577, 576,
- 579, 580, 581, 582, 578, 605, 607, 608, 609, 610,
- 611, 612, 613, 614, 615, 606, 616, 617, 618, 619,
- 620, 621, 622, 623, 628, 633, 651, 652, 653, 656,
- 654, 655, 657, 658, 659, 660, 670, 671, 672, 673,
- 674, 675, 682, 683, 450, 483, 500, 636, 637, 507,
- 508, 494, 495, 0, 0, 0, 499, 676, 529, 558,
- 559, 560, 498, 496, 497
+ 0, 596, 598, 600, 599, 601, 602, 603, 604, 605,
+ 606, 607, 608, 609, 610, 611, 612, 613, 614, 615,
+ 616, 0, 637, 639, 0, 642, 644, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 651, 653, 654,
+ 655, 657, 658, 656, 659, 660, 661, 662, 0, 0,
+ 0, 0, 0, 0, 674, 676, 677, 678, 679, 680,
+ 681, 0, 0, 690, 692, 693, 319, 318, 325, 338,
+ 336, 349, 345, 346, 350, 347, 348, 351, 352, 353,
+ 357, 358, 388, 389, 390, 391, 392, 420, 421, 422,
+ 428, 429, 341, 430, 431, 434, 432, 433, 438, 439,
+ 440, 454, 403, 404, 407, 408, 441, 458, 397, 399,
+ 459, 466, 467, 468, 342, 419, 487, 488, 398, 481,
+ 381, 337, 393, 455, 463, 442, 0, 0, 491, 343,
+ 320, 380, 446, 321, 339, 340, 394, 395, 489, 444,
+ 448, 449, 355, 354, 322, 492, 423, 453, 382, 402,
+ 460, 461, 462, 465, 480, 396, 485, 483, 484, 411,
+ 418, 450, 451, 412, 413, 443, 470, 383, 384, 387,
+ 359, 361, 356, 362, 363, 364, 365, 372, 373, 374,
+ 375, 376, 377, 378, 493, 494, 496, 424, 425, 426,
+ 427, 435, 436, 437, 497, 498, 499, 0, 0, 0,
+ 445, 414, 416, 646, 512, 516, 514, 513, 517, 515,
+ 524, 0, 0, 520, 521, 522, 523, 326, 327, 328,
+ 329, 330, 331, 332, 333, 334, 335, 447, 464, 486,
+ 528, 529, 415, 500, 0, 0, 0, 0, 0, 0,
+ 471, 472, 473, 474, 475, 476, 477, 478, 479, 647,
+ 405, 406, 409, 400, 469, 379, 323, 324, 401, 530,
+ 531, 532, 533, 534, 536, 535, 537, 538, 539, 360,
+ 367, 525, 527, 526, 366, 0, 386, 452, 495, 385,
+ 417, 368, 369, 371, 370, 0, 541, 410, 482, 344,
+ 542, 0, 0, 0, 0, 0, 543, 544, 545, 546,
+ 551, 549, 550, 547, 548, 552, 553, 554, 555, 557,
+ 558, 556, 569, 0, 573, 574, 0, 0, 575, 559,
+ 567, 560, 561, 562, 566, 568, 563, 564, 565, 297,
+ 298, 299, 300, 301, 302, 587, 589, 588, 591, 592,
+ 593, 594, 590, 617, 619, 620, 621, 622, 623, 624,
+ 625, 626, 627, 618, 628, 629, 630, 631, 632, 633,
+ 634, 635, 640, 645, 663, 664, 665, 668, 666, 667,
+ 669, 670, 671, 672, 682, 683, 684, 685, 686, 687,
+ 694, 695, 456, 490, 511, 648, 649, 518, 519, 501,
+ 502, 0, 0, 0, 506, 688, 540, 457, 510, 507,
+ 0, 0, 570, 571, 572, 505, 503, 504, 508, 509
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -27, 654, 655, 656, 657, -312, -312,
- 658, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312, -312, -312, -312, -312, -312, -312, -312,
- -312, -312, -312
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, 671,
+ 672, 673, 674, 675, -284, -284, 676, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- 0, 1, 17, 18, 19, 32, 270, 20, 33, 504,
- 21, 34, 520, 22, 35, 535, 23, 36, 553, 570,
- 571, 572, 573, 574, 575, 24, 37, 576, 271, 272,
- 273, 274, 275, 276, 277, 278, 279, 280, 281, 282,
- 283, 284, 285, 286, 287, 288, 289, 290, 291, 292,
- 293, 294, 295, 296, 297, 298, 299, 300, 301, 302,
- 303, 304, 305, 306, 307, 308, 309, 310, 311, 312,
- 313, 314, 315, 316, 317, 318, 319, 320, 321, 322,
- 323, 324, 325, 326, 327, 328, 329, 330, 331, 332,
- 333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
- 343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
- 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
- 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
- 373, 374, 375, 376, 377, 378, 379, 380, 381, 382,
- 383, 384, 385, 386, 387, 388, 389, 390, 391, 392,
- 393, 394, 395, 396, 397, 398, 399, 400, 401, 402,
- 403, 404, 405, 406, 407, 408, 409, 410, 411, 412,
- 413, 414, 415, 416, 417, 418, 419, 420, 421, 422,
- 423, 424, 425, 426, 427, 428, 429, 430, 431, 432,
- 433, 434, 435, 436, 437, 438, 439, 440, 441, 442,
- 443, 444, 445, 446, 447, 448, 449, 450, 451, 452,
- 453, 454, 455, 456, 457, 458, 459, 460, 461, 462,
- 463, 464, 465, 466, 467, 468, 469, 470, 471, 472,
- 473, 474, 475, 476, 477, 478, 479, 480, 481, 482,
- 483, 484, 485, 486, 487, 488, 489, 490, 505, 506,
- 507, 508, 509, 510, 511, 512, 521, 522, 523, 524,
- 525, 526, 527, 554, 555, 556, 557, 558, 559, 560,
- 561, 562, 563, 536, 537, 538, 539, 540, 541, 542,
- 25, 38, 591, 592, 593, 594, 595, 596, 597, 598,
- 599, 26, 39, 619, 620, 621, 622, 623, 624, 625,
- 626, 627, 628, 629, 630, 631, 632, 633, 634, 635,
- 636, 637, 638, 27, 40, 640, 641, 28, 41, 643,
- 644, 491, 492, 493, 494, 29, 42, 655, 656, 657,
- 658, 659, 660, 661, 662, 663, 664, 665, 30, 43,
- 672, 673, 674, 675, 676, 677, 678, 495, 31, 44,
- 681, 682, 683
+ 0, 1, 17, 18, 19, 32, 276, 20, 33, 516,
+ 21, 34, 532, 22, 35, 547, 23, 36, 565, 582,
+ 583, 584, 585, 586, 587, 24, 37, 588, 277, 278,
+ 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
+ 289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
+ 299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
+ 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,
+ 319, 320, 321, 322, 323, 324, 325, 326, 327, 328,
+ 329, 330, 331, 332, 333, 334, 335, 336, 337, 338,
+ 339, 340, 341, 342, 343, 344, 345, 346, 347, 348,
+ 349, 350, 351, 352, 353, 354, 355, 356, 357, 358,
+ 359, 360, 361, 362, 363, 364, 365, 366, 367, 368,
+ 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,
+ 379, 380, 381, 382, 383, 384, 385, 386, 387, 388,
+ 389, 390, 391, 392, 393, 394, 395, 396, 397, 398,
+ 399, 400, 401, 402, 403, 404, 405, 406, 407, 408,
+ 409, 410, 411, 412, 413, 414, 415, 416, 417, 418,
+ 419, 420, 421, 422, 423, 424, 425, 426, 427, 428,
+ 429, 430, 431, 432, 433, 434, 435, 436, 437, 438,
+ 439, 440, 441, 442, 443, 444, 445, 446, 447, 448,
+ 449, 450, 451, 452, 453, 454, 455, 456, 457, 458,
+ 459, 460, 461, 462, 463, 464, 465, 466, 467, 468,
+ 469, 470, 471, 472, 473, 474, 475, 476, 477, 478,
+ 479, 480, 481, 482, 483, 484, 485, 486, 487, 488,
+ 489, 490, 491, 492, 493, 494, 495, 496, 497, 498,
+ 499, 500, 501, 502, 517, 518, 519, 520, 521, 522,
+ 523, 524, 533, 534, 535, 536, 537, 538, 539, 566,
+ 567, 568, 569, 570, 571, 572, 573, 574, 575, 548,
+ 549, 550, 551, 552, 553, 554, 25, 38, 603, 604,
+ 605, 606, 607, 608, 609, 610, 611, 26, 39, 631,
+ 632, 633, 634, 635, 636, 637, 638, 639, 640, 641,
+ 642, 643, 644, 645, 646, 647, 648, 649, 650, 27,
+ 40, 652, 653, 28, 41, 655, 656, 503, 504, 505,
+ 506, 29, 42, 667, 668, 669, 670, 671, 672, 673,
+ 674, 675, 676, 677, 30, 43, 684, 685, 686, 687,
+ 688, 689, 690, 507, 31, 44, 693, 694, 695
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@@ -1931,161 +1955,165 @@ static const yytype_int16 yydefgoto[] =
number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_int16 yytable[] =
{
- 2, 543, 528, 679, 680, 639, 496, 642, 497, 498,
- 577, 3, 4, 513, 684, 543, 685, 686, 687, 688,
- 689, 514, 515, 645, 646, 647, 648, 649, 650, 651,
- 652, 653, 654, 690, 691, 692, 693, 694, 529, 530,
- 666, 667, 668, 669, 670, 671, 5, 695, 696, 697,
- 698, 699, 6, 700, 701, 583, 584, 585, 586, 587,
- 588, 589, 590, 702, 703, 531, 704, 705, 706, 707,
- 708, 499, 600, 601, 602, 603, 604, 605, 606, 607,
- 608, 609, 610, 611, 612, 613, 614, 615, 616, 617,
- 618, 709, 710, 711, 712, 713, 7, 714, 715, 716,
- 717, 718, 719, 720, 500, 721, 722, 501, 723, 724,
- 516, 725, 517, 726, 8, 518, 502, 727, 728, 729,
- 730, 731, 732, 733, 734, 735, 736, 737, 738, 739,
- 740, 741, 742, 743, 744, 745, 746, 747, 748, 749,
- 750, 751, 752, 753, 754, 755, 756, 532, 533, 757,
- 758, 759, 760, 761, 762, 763, 764, 765, 766, 767,
- 768, 769, 770, 771, 772, 773, 774, 775, 776, 9,
- 777, 778, 779, 780, 781, 782, 783, 784, 785, 786,
- 787, 788, 789, 790, 791, 792, 793, 794, 795, 796,
- 534, 797, 798, 799, 800, 801, 802, 803, 804, 805,
- 806, 807, 808, 809, 810, 811, 812, 813, 814, 815,
- 816, 817, 818, 819, 820, 821, 822, 823, 824, 825,
- 826, 827, 828, 829, 830, 831, 832, 833, 834, 835,
- 836, 10, 837, 838, 839, 840, 841, 842, 843, 844,
- 545, 546, 547, 548, 845, 846, 847, 848, 849, 850,
- 550, 851, 544, 11, 545, 546, 547, 548, 549, 503,
- 852, 853, 854, 855, 550, 519, 856, 857, 564, 565,
- 566, 567, 568, 858, 12, 859, 860, 861, 862, 863,
- 864, 569, 865, 13, 866, 867, 868, 869, 870, 871,
- 872, 873, 874, 551, 552, 875, 876, 877, 878, 879,
- 880, 881, 882, 883, 884, 885, 886, 14, 887, 888,
- 889, 15, 890, 891, 892, 0, 893, 16, 45, 46,
- 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
- 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
- 894, 895, 896, 897, 77, 78, 79, 898, 899, 900,
- 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
- 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
- 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
- 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
- 120, 901, 902, 903, 904, 905, 906, 907, 908, 909,
- 121, 122, 123, 124, 125, 910, 126, 127, 128, 911,
- 912, 129, 130, 131, 132, 133, 134, 135, 136, 137,
- 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
- 148, 149, 150, 151, 152, 153, 154, 913, 914, 915,
- 155, 916, 917, 156, 157, 158, 159, 160, 161, 162,
- 918, 163, 164, 165, 166, 167, 168, 169, 170, 171,
- 172, 173, 174, 175, 919, 920, 921, 922, 923, 924,
- 925, 926, 927, 928, 929, 930, 931, 932, 933, 934,
- 935, 936, 937, 938, 176, 177, 178, 179, 180, 181,
- 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
- 192, 193, 194, 195, 196, 197, 198, 199, 200, 201,
- 202, 203, 204, 205, 206, 207, 208, 209, 210, 211,
- 212, 213, 214, 215, 216, 217, 939, 218, 940, 219,
- 220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
- 230, 231, 232, 233, 234, 235, 236, 237, 941, 942,
- 943, 944, 945, 946, 947, 948, 949, 950, 951, 238,
- 239, 240, 241, 242, 243, 244, 245, 246, 247, 952,
- 953, 954, 955, 956, 957, 958, 248, 959, 960, 961,
- 962, 963, 964, 965, 249, 250, 966, 251, 252, 967,
- 253, 254, 968, 969, 255, 256, 257, 258, 259, 260,
- 261, 262, 970, 971, 972, 263, 973, 974, 975, 976,
- 977, 978, 979, 980, 264, 265, 266, 267, 981, 982,
- 983, 268, 269, 984, 985, 986, 987, 988, 989, 990,
- 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000,
- 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010,
- 1011, 1012, 1013, 1014, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+ 75, 76, 691, 692, 651, 654, 77, 78, 79, 696,
+ 697, 698, 80, 81, 82, 83, 84, 85, 86, 87,
+ 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
+ 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
+ 118, 119, 120, 555, 678, 679, 680, 681, 682, 683,
+ 699, 700, 121, 122, 123, 124, 125, 540, 126, 127,
+ 128, 701, 702, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
+ 146, 147, 148, 149, 150, 151, 152, 153, 154, 555,
+ 703, 704, 155, 541, 542, 156, 157, 158, 159, 160,
+ 161, 162, 705, 163, 164, 165, 166, 167, 168, 169,
+ 170, 171, 172, 173, 174, 175, 706, 707, 708, 709,
+ 543, 657, 658, 659, 660, 661, 662, 663, 664, 665,
+ 666, 710, 711, 712, 713, 714, 176, 177, 178, 179,
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
+ 210, 211, 212, 213, 214, 215, 216, 217, 715, 218,
+ 716, 219, 220, 221, 222, 223, 224, 225, 226, 227,
+ 228, 229, 230, 231, 232, 233, 234, 235, 236, 237,
+ 717, 718, 544, 545, 719, 720, 508, 721, 509, 510,
+ 2, 238, 239, 240, 241, 242, 243, 244, 245, 246,
+ 247, 3, 4, 525, 722, 723, 724, 725, 248, 726,
+ 727, 526, 527, 728, 729, 730, 249, 250, 731, 251,
+ 252, 732, 253, 254, 733, 546, 255, 256, 257, 258,
+ 259, 260, 261, 262, 734, 735, 5, 263, 736, 737,
+ 738, 739, 6, 740, 741, 742, 264, 265, 266, 267,
+ 743, 511, 744, 268, 269, 270, 271, 272, 273, 274,
+ 275, 745, 557, 558, 559, 560, 746, 747, 748, 749,
+ 750, 751, 562, 595, 596, 597, 598, 599, 600, 601,
+ 602, 752, 753, 754, 512, 755, 7, 513, 756, 757,
+ 576, 577, 578, 579, 580, 758, 514, 759, 760, 761,
+ 528, 762, 529, 581, 8, 530, 556, 763, 557, 558,
+ 559, 560, 561, 764, 765, 766, 767, 768, 562, 612,
+ 613, 614, 615, 616, 617, 618, 619, 620, 621, 622,
+ 623, 624, 625, 626, 627, 628, 629, 630, 769, 770,
+ 771, 772, 773, 774, 775, 776, 777, 563, 564, 778,
+ 779, 780, 781, 782, 783, 784, 785, 786, 787, 9,
+ 788, 789, 790, 791, 792, 793, 794, 795, 796, 797,
+ 798, 799, 800, 801, 802, 803, 804, 805, 806, 807,
+ 808, 809, 810, 811, 812, 813, 814, 815, 816, 817,
+ 818, 819, 820, 821, 822, 823, 824, 825, 826, 827,
+ 828, 829, 830, 831, 832, 833, 834, 835, 836, 837,
+ 838, 839, 840, 841, 842, 843, 844, 845, 846, 847,
+ 848, 10, 849, 850, 851, 852, 853, 854, 855, 856,
+ 857, 858, 859, 860, 861, 862, 863, 864, 865, 515,
+ 866, 867, 868, 11, 869, 870, 871, 872, 873, 874,
+ 875, 876, 877, 878, 879, 531, 880, 881, 882, 883,
+ 884, 885, 886, 887, 12, 888, 889, 890, 891, 892,
+ 893, 894, 895, 13, 896, 897, 898, 899, 900, 901,
+ 902, 903, 904, 905, 906, 907, 908, 909, 910, 911,
+ 912, 913, 914, 915, 916, 917, 918, 14, 919, 920,
+ 921, 15, 922, 923, 924, 925, 926, 16, 927, 928,
+ 929, 930, 931, 932, 933, 934, 935, 936, 937, 938,
+ 939, 940, 941, 942, 943, 944, 945, 946, 947, 948,
+ 949, 950, 951, 952, 953, 954, 955, 956, 957, 958,
+ 959, 960, 961, 962, 963, 964, 965, 966, 967, 968,
+ 969, 970, 971, 972, 973, 974, 975, 976, 977, 978,
+ 979, 980, 981, 982, 983, 984, 985, 986, 987, 988,
+ 989, 990, 991, 992, 993, 994, 995, 996, 997, 998,
+ 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008,
+ 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018,
+ 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028,
+ 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038,
+ 1039, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 578, 579, 580, 581, 582
+ 0, 0, 0, 0, 0, 0, 0, 0, 589, 590,
+ 591, 592, 593, 594
};
static const yytype_int16 yycheck[] =
{
- 0, 45, 45, 308, 309, 115, 45, 318, 47, 48,
- 37, 11, 12, 45, 10, 45, 10, 10, 10, 10,
- 10, 53, 54, 254, 255, 256, 257, 258, 259, 260,
- 261, 262, 263, 10, 10, 10, 10, 10, 81, 82,
- 275, 276, 277, 278, 279, 280, 46, 10, 10, 10,
- 10, 10, 52, 10, 10, 97, 98, 99, 100, 101,
- 102, 103, 104, 10, 10, 108, 10, 10, 10, 10,
- 10, 110, 170, 171, 172, 173, 174, 175, 176, 177,
- 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
- 188, 10, 10, 10, 10, 10, 96, 10, 10, 10,
- 10, 10, 10, 10, 143, 10, 10, 146, 10, 10,
- 142, 10, 144, 10, 114, 147, 155, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 190, 191, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
+ 43, 44, 308, 309, 115, 318, 49, 50, 51, 10,
+ 10, 10, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
+ 93, 94, 95, 45, 275, 276, 277, 278, 279, 280,
+ 10, 10, 105, 106, 107, 108, 109, 45, 111, 112,
+ 113, 10, 10, 116, 117, 118, 119, 120, 121, 122,
+ 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
+ 133, 134, 135, 136, 137, 138, 139, 140, 141, 45,
+ 10, 10, 145, 81, 82, 148, 149, 150, 151, 152,
+ 153, 154, 10, 156, 157, 158, 159, 160, 161, 162,
+ 163, 164, 165, 166, 167, 168, 10, 10, 10, 10,
+ 108, 254, 255, 256, 257, 258, 259, 260, 261, 262,
+ 263, 10, 10, 10, 10, 10, 189, 190, 191, 192,
+ 193, 194, 195, 196, 197, 198, 199, 200, 201, 202,
+ 203, 204, 205, 206, 207, 208, 209, 210, 211, 212,
+ 213, 214, 215, 216, 217, 218, 219, 220, 221, 222,
+ 223, 224, 225, 226, 227, 228, 229, 230, 10, 232,
+ 10, 234, 235, 236, 237, 238, 239, 240, 241, 242,
+ 243, 244, 245, 246, 247, 248, 249, 250, 251, 252,
+ 10, 10, 190, 191, 10, 10, 45, 10, 47, 48,
+ 0, 264, 265, 266, 267, 268, 269, 270, 271, 272,
+ 273, 11, 12, 45, 10, 10, 10, 10, 281, 10,
+ 10, 53, 54, 10, 10, 10, 289, 290, 10, 292,
+ 293, 10, 295, 296, 10, 233, 299, 300, 301, 302,
+ 303, 304, 305, 306, 10, 10, 46, 310, 10, 10,
+ 10, 10, 52, 10, 10, 10, 319, 320, 321, 322,
+ 10, 110, 10, 326, 327, 328, 329, 330, 331, 332,
+ 333, 10, 284, 285, 286, 287, 10, 10, 10, 10,
+ 10, 10, 294, 97, 98, 99, 100, 101, 102, 103,
+ 104, 10, 10, 10, 143, 10, 96, 146, 10, 10,
+ 312, 313, 314, 315, 316, 10, 155, 10, 10, 10,
+ 142, 10, 144, 325, 114, 147, 282, 10, 284, 285,
+ 286, 287, 288, 10, 10, 10, 10, 10, 294, 170,
+ 171, 172, 173, 174, 175, 176, 177, 178, 179, 180,
+ 181, 182, 183, 184, 185, 186, 187, 188, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 323, 324, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 169,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 233, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 231, 10, 10, 10, 10, 10, 10, 10, 10,
- 284, 285, 286, 287, 10, 10, 10, 10, 10, 10,
- 294, 10, 282, 253, 284, 285, 286, 287, 288, 298,
- 10, 10, 10, 10, 294, 297, 10, 10, 312, 313,
- 314, 315, 316, 10, 274, 10, 10, 10, 10, 10,
- 10, 325, 10, 283, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 323, 324, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 298,
+ 10, 10, 10, 253, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 297, 10, 10, 10, 10,
+ 10, 10, 10, 10, 274, 10, 10, 10, 10, 10,
+ 10, 10, 10, 283, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 307, 10, 10,
- 10, 311, 10, 10, 10, -1, 10, 317, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
- 10, 10, 10, 10, 49, 50, 51, 10, 10, 10,
- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
- 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
- 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
- 95, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 105, 106, 107, 108, 109, 10, 111, 112, 113, 10,
- 10, 116, 117, 118, 119, 120, 121, 122, 123, 124,
- 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
- 135, 136, 137, 138, 139, 140, 141, 10, 10, 10,
- 145, 10, 10, 148, 149, 150, 151, 152, 153, 154,
- 10, 156, 157, 158, 159, 160, 161, 162, 163, 164,
- 165, 166, 167, 168, 10, 10, 10, 10, 10, 10,
+ 10, 311, 10, 10, 10, 10, 10, 317, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 189, 190, 191, 192, 193, 194,
- 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
- 205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
- 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
- 225, 226, 227, 228, 229, 230, 10, 232, 10, 234,
- 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
- 245, 246, 247, 248, 249, 250, 251, 252, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 264,
- 265, 266, 267, 268, 269, 270, 271, 272, 273, 10,
- 10, 10, 10, 10, 10, 10, 281, 10, 10, 10,
- 10, 10, 10, 10, 289, 290, 10, 292, 293, 10,
- 295, 296, 10, 10, 299, 300, 301, 302, 303, 304,
- 305, 306, 10, 10, 10, 310, 10, 10, 10, 10,
- 10, 10, 10, 10, 319, 320, 321, 322, 10, 10,
- 10, 326, 327, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 37, 37, 37, 37, 37
+ -1, -1, -1, -1, -1, -1, -1, -1, 37, 37,
+ 37, 37, 37, 37
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const yytype_int16 yystos[] =
{
- 0, 329, 0, 11, 12, 46, 52, 96, 114, 169,
- 231, 253, 274, 283, 307, 311, 317, 330, 331, 332,
- 335, 338, 341, 344, 353, 608, 619, 641, 645, 653,
- 666, 676, 333, 336, 339, 342, 345, 354, 609, 620,
- 642, 646, 654, 667, 677, 13, 14, 15, 16, 17,
+ 0, 335, 0, 11, 12, 46, 52, 96, 114, 169,
+ 231, 253, 274, 283, 307, 311, 317, 336, 337, 338,
+ 341, 344, 347, 350, 359, 620, 631, 653, 657, 665,
+ 678, 688, 339, 342, 345, 348, 351, 360, 621, 632,
+ 654, 658, 666, 679, 689, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
38, 39, 40, 41, 42, 43, 44, 49, 50, 51,
@@ -2108,7 +2136,7 @@ static const yytype_int16 yystos[] =
266, 267, 268, 269, 270, 271, 272, 273, 281, 289,
290, 292, 293, 295, 296, 299, 300, 301, 302, 303,
304, 305, 306, 310, 319, 320, 321, 322, 326, 327,
- 334, 356, 357, 358, 359, 360, 361, 362, 363, 364,
+ 328, 329, 330, 331, 332, 333, 340, 362, 363, 364,
365, 366, 367, 368, 369, 370, 371, 372, 373, 374,
375, 376, 377, 378, 379, 380, 381, 382, 383, 384,
385, 386, 387, 388, 389, 390, 391, 392, 393, 394,
@@ -2130,26 +2158,28 @@ static const yytype_int16 yystos[] =
545, 546, 547, 548, 549, 550, 551, 552, 553, 554,
555, 556, 557, 558, 559, 560, 561, 562, 563, 564,
565, 566, 567, 568, 569, 570, 571, 572, 573, 574,
- 575, 649, 650, 651, 652, 675, 45, 47, 48, 110,
- 143, 146, 155, 298, 337, 576, 577, 578, 579, 580,
- 581, 582, 583, 45, 53, 54, 142, 144, 147, 297,
- 340, 584, 585, 586, 587, 588, 589, 590, 45, 81,
- 82, 108, 190, 191, 233, 343, 601, 602, 603, 604,
- 605, 606, 607, 45, 282, 284, 285, 286, 287, 288,
- 294, 323, 324, 346, 591, 592, 593, 594, 595, 596,
- 597, 598, 599, 600, 312, 313, 314, 315, 316, 325,
- 347, 348, 349, 350, 351, 352, 355, 591, 592, 593,
- 594, 595, 598, 97, 98, 99, 100, 101, 102, 103,
- 104, 610, 611, 612, 613, 614, 615, 616, 617, 618,
- 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
- 180, 181, 182, 183, 184, 185, 186, 187, 188, 621,
- 622, 623, 624, 625, 626, 627, 628, 629, 630, 631,
- 632, 633, 634, 635, 636, 637, 638, 639, 640, 115,
- 643, 644, 318, 647, 648, 254, 255, 256, 257, 258,
- 259, 260, 261, 262, 263, 655, 656, 657, 658, 659,
- 660, 661, 662, 663, 664, 665, 275, 276, 277, 278,
- 279, 280, 668, 669, 670, 671, 672, 673, 674, 308,
- 309, 678, 679, 680, 10, 10, 10, 10, 10, 10,
+ 575, 576, 577, 578, 579, 580, 581, 582, 583, 584,
+ 585, 586, 587, 661, 662, 663, 664, 687, 45, 47,
+ 48, 110, 143, 146, 155, 298, 343, 588, 589, 590,
+ 591, 592, 593, 594, 595, 45, 53, 54, 142, 144,
+ 147, 297, 346, 596, 597, 598, 599, 600, 601, 602,
+ 45, 81, 82, 108, 190, 191, 233, 349, 613, 614,
+ 615, 616, 617, 618, 619, 45, 282, 284, 285, 286,
+ 287, 288, 294, 323, 324, 352, 603, 604, 605, 606,
+ 607, 608, 609, 610, 611, 612, 312, 313, 314, 315,
+ 316, 325, 353, 354, 355, 356, 357, 358, 361, 603,
+ 604, 605, 606, 607, 610, 97, 98, 99, 100, 101,
+ 102, 103, 104, 622, 623, 624, 625, 626, 627, 628,
+ 629, 630, 170, 171, 172, 173, 174, 175, 176, 177,
+ 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
+ 188, 633, 634, 635, 636, 637, 638, 639, 640, 641,
+ 642, 643, 644, 645, 646, 647, 648, 649, 650, 651,
+ 652, 115, 655, 656, 318, 659, 660, 254, 255, 256,
+ 257, 258, 259, 260, 261, 262, 263, 667, 668, 669,
+ 670, 671, 672, 673, 674, 675, 676, 677, 275, 276,
+ 277, 278, 279, 280, 680, 681, 682, 683, 684, 685,
+ 686, 308, 309, 690, 691, 692, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
@@ -2182,44 +2212,44 @@ static const yytype_int16 yystos[] =
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const yytype_int16 yyr1[] =
{
- 0, 328, 329, 329, 330, 330, 330, 330, 330, 330,
- 330, 330, 330, 330, 330, 330, 330, 330, 331, 332,
- 333, 333, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 335, 336, 336,
- 337, 337, 337, 337, 337, 337, 337, 337, 338, 339,
- 339, 340, 340, 340, 340, 340, 340, 340, 341, 342,
- 342, 343, 343, 343, 343, 343, 343, 343, 344, 345,
- 345, 346, 346, 346, 346, 346, 346, 346, 346, 346,
- 346, 347, 348, 349, 350, 351, 352, 353, 354, 354,
- 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
- 355, 355, 356, 357, 358, 359, 360, 361, 362, 363,
+ 0, 334, 335, 335, 336, 336, 336, 336, 336, 336,
+ 336, 336, 336, 336, 336, 336, 336, 336, 337, 338,
+ 339, 339, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 341, 342, 342, 343, 343, 343, 343,
+ 343, 343, 343, 343, 344, 345, 345, 346, 346, 346,
+ 346, 346, 346, 346, 347, 348, 348, 349, 349, 349,
+ 349, 349, 349, 349, 350, 351, 351, 352, 352, 352,
+ 352, 352, 352, 352, 352, 352, 352, 353, 354, 355,
+ 356, 357, 358, 359, 360, 360, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361, 362, 363,
364, 365, 366, 367, 368, 369, 370, 371, 372, 373,
374, 375, 376, 377, 378, 379, 380, 381, 382, 383,
384, 385, 386, 387, 388, 389, 390, 391, 392, 393,
@@ -2244,19 +2274,20 @@ static const yytype_int16 yyr1[] =
574, 575, 576, 577, 578, 579, 580, 581, 582, 583,
584, 585, 586, 587, 588, 589, 590, 591, 592, 593,
594, 595, 596, 597, 598, 599, 600, 601, 602, 603,
- 604, 605, 606, 607, 608, 609, 609, 610, 610, 610,
- 610, 610, 610, 610, 610, 611, 612, 613, 614, 615,
- 616, 617, 618, 619, 620, 620, 621, 621, 621, 621,
- 621, 621, 621, 621, 621, 621, 621, 621, 621, 621,
- 621, 621, 621, 621, 621, 622, 623, 624, 625, 626,
- 627, 628, 629, 630, 631, 632, 633, 634, 635, 636,
- 637, 638, 639, 640, 641, 642, 642, 643, 644, 645,
- 646, 646, 647, 648, 649, 650, 651, 652, 653, 654,
- 654, 655, 655, 655, 655, 655, 655, 655, 655, 655,
- 655, 656, 657, 658, 659, 660, 661, 662, 663, 664,
- 665, 666, 667, 667, 668, 668, 668, 668, 668, 668,
- 669, 670, 671, 672, 673, 674, 675, 676, 677, 677,
- 678, 678, 679, 680
+ 604, 605, 606, 607, 608, 609, 610, 611, 612, 613,
+ 614, 615, 616, 617, 618, 619, 620, 621, 621, 622,
+ 622, 622, 622, 622, 622, 622, 622, 623, 624, 625,
+ 626, 627, 628, 629, 630, 631, 632, 632, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 634, 635, 636,
+ 637, 638, 639, 640, 641, 642, 643, 644, 645, 646,
+ 647, 648, 649, 650, 651, 652, 653, 654, 654, 655,
+ 656, 657, 658, 658, 659, 660, 661, 662, 663, 664,
+ 665, 666, 666, 667, 667, 667, 667, 667, 667, 667,
+ 667, 667, 667, 668, 669, 670, 671, 672, 673, 674,
+ 675, 676, 677, 678, 679, 679, 680, 680, 680, 680,
+ 680, 680, 681, 682, 683, 684, 685, 686, 687, 688,
+ 689, 689, 690, 690, 691, 692
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
@@ -2286,14 +2317,14 @@ static const yytype_int8 yyr2[] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 2,
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 2,
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 2, 2, 2, 2, 2, 1, 2, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 2, 0, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
+ 2, 2, 2, 1, 2, 0, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -2307,30 +2338,31 @@ static const yytype_int8 yyr2[] =
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 3, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 3, 3, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 3, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 3, 3, 4, 4, 4, 3,
- 3, 2, 2, 2, 2, 2, 2, 3, 3, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
+ 3, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 3, 3, 4, 4, 4, 3, 3, 4, 4,
+ 3, 3, 2, 2, 2, 2, 2, 2, 3, 3,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 3, 3,
- 3, 2, 2, 2, 1, 2, 0, 1, 1, 1,
- 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
- 2, 2, 2, 1, 2, 0, 1, 1, 1, 1,
+ 3, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 2, 2, 2, 1, 2, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
+ 2, 2, 2, 2, 2, 1, 2, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 1, 2, 0, 1, 2, 1,
- 2, 0, 1, 2, 2, 2, 3, 3, 1, 2,
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 1, 2, 0, 1, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 2, 2, 3, 1, 2, 0,
- 1, 1, 2, 2
+ 2, 2, 2, 2, 2, 2, 1, 2, 0, 1,
+ 2, 1, 2, 0, 1, 2, 2, 2, 3, 3,
+ 1, 2, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 1, 2, 0, 1, 1, 1, 1,
+ 1, 1, 2, 2, 2, 2, 2, 2, 3, 1,
+ 2, 0, 1, 1, 2, 2
};
@@ -2798,26 +2830,29 @@ yyreduce:
switch (yyn)
{
case 18: /* force_toplevel: VAR_FORCE_TOPLEVEL */
-#line 205 "util/configparser.y"
+#line 209 "util/configparser.y"
{
OUTYY(("\nP(force-toplevel)\n"));
+ cfg_parser->started_toplevel = 0;
}
-#line 2806 "util/configparser.c"
+#line 2839 "util/configparser.c"
break;
case 19: /* serverstart: VAR_SERVER */
-#line 211 "util/configparser.y"
+#line 216 "util/configparser.y"
{
OUTYY(("\nP(server:)\n"));
+ cfg_parser->started_toplevel = 1;
}
-#line 2814 "util/configparser.c"
+#line 2848 "util/configparser.c"
break;
- case 247: /* stubstart: VAR_STUB_ZONE */
-#line 320 "util/configparser.y"
+ case 253: /* stubstart: VAR_STUB_ZONE */
+#line 328 "util/configparser.y"
{
struct config_stub* s;
OUTYY(("\nP(stub_zone:)\n"));
+ cfg_parser->started_toplevel = 1;
s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
if(s) {
s->next = cfg_parser->cfg->stubs;
@@ -2826,14 +2861,15 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 2830 "util/configparser.c"
+#line 2865 "util/configparser.c"
break;
- case 258: /* forwardstart: VAR_FORWARD_ZONE */
-#line 338 "util/configparser.y"
+ case 264: /* forwardstart: VAR_FORWARD_ZONE */
+#line 347 "util/configparser.y"
{
struct config_stub* s;
OUTYY(("\nP(forward_zone:)\n"));
+ cfg_parser->started_toplevel = 1;
s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
if(s) {
s->next = cfg_parser->cfg->forwards;
@@ -2842,14 +2878,15 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 2846 "util/configparser.c"
+#line 2882 "util/configparser.c"
break;
- case 268: /* viewstart: VAR_VIEW */
-#line 356 "util/configparser.y"
+ case 274: /* viewstart: VAR_VIEW */
+#line 366 "util/configparser.y"
{
struct config_view* s;
OUTYY(("\nP(view:)\n"));
+ cfg_parser->started_toplevel = 1;
s = (struct config_view*)calloc(1, sizeof(struct config_view));
if(s) {
s->next = cfg_parser->cfg->views;
@@ -2860,14 +2897,15 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 2864 "util/configparser.c"
+#line 2901 "util/configparser.c"
break;
- case 278: /* authstart: VAR_AUTH_ZONE */
-#line 376 "util/configparser.y"
+ case 284: /* authstart: VAR_AUTH_ZONE */
+#line 387 "util/configparser.y"
{
struct config_auth* s;
OUTYY(("\nP(auth_zone:)\n"));
+ cfg_parser->started_toplevel = 1;
s = (struct config_auth*)calloc(1, sizeof(struct config_auth));
if(s) {
s->next = cfg_parser->cfg->auths;
@@ -2883,11 +2921,11 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 2887 "util/configparser.c"
+#line 2925 "util/configparser.c"
break;
- case 291: /* rpz_tag: VAR_TAGS STRING_ARG */
-#line 403 "util/configparser.y"
+ case 297: /* rpz_tag: VAR_TAGS STRING_ARG */
+#line 415 "util/configparser.y"
{
uint8_t* bitlist;
size_t len = 0;
@@ -2904,11 +2942,11 @@ yyreduce:
}
}
-#line 2908 "util/configparser.c"
+#line 2946 "util/configparser.c"
break;
- case 292: /* rpz_action_override: VAR_RPZ_ACTION_OVERRIDE STRING_ARG */
-#line 422 "util/configparser.y"
+ case 298: /* rpz_action_override: VAR_RPZ_ACTION_OVERRIDE STRING_ARG */
+#line 434 "util/configparser.y"
{
OUTYY(("P(rpz_action_override:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "nxdomain")!=0 && strcmp((yyvsp[0].str), "nodata")!=0 &&
@@ -2923,21 +2961,21 @@ yyreduce:
cfg_parser->cfg->auths->rpz_action_override = (yyvsp[0].str);
}
}
-#line 2927 "util/configparser.c"
+#line 2965 "util/configparser.c"
break;
- case 293: /* rpz_cname_override: VAR_RPZ_CNAME_OVERRIDE STRING_ARG */
-#line 439 "util/configparser.y"
+ case 299: /* rpz_cname_override: VAR_RPZ_CNAME_OVERRIDE STRING_ARG */
+#line 451 "util/configparser.y"
{
OUTYY(("P(rpz_cname_override:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->auths->rpz_cname);
cfg_parser->cfg->auths->rpz_cname = (yyvsp[0].str);
}
-#line 2937 "util/configparser.c"
+#line 2975 "util/configparser.c"
break;
- case 294: /* rpz_log: VAR_RPZ_LOG STRING_ARG */
-#line 447 "util/configparser.y"
+ case 300: /* rpz_log: VAR_RPZ_LOG STRING_ARG */
+#line 459 "util/configparser.y"
{
OUTYY(("P(rpz_log:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2945,21 +2983,21 @@ yyreduce:
else cfg_parser->cfg->auths->rpz_log = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2949 "util/configparser.c"
+#line 2987 "util/configparser.c"
break;
- case 295: /* rpz_log_name: VAR_RPZ_LOG_NAME STRING_ARG */
-#line 457 "util/configparser.y"
+ case 301: /* rpz_log_name: VAR_RPZ_LOG_NAME STRING_ARG */
+#line 469 "util/configparser.y"
{
OUTYY(("P(rpz_log_name:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->auths->rpz_log_name);
cfg_parser->cfg->auths->rpz_log_name = (yyvsp[0].str);
}
-#line 2959 "util/configparser.c"
+#line 2997 "util/configparser.c"
break;
- case 296: /* rpz_signal_nxdomain_ra: VAR_RPZ_SIGNAL_NXDOMAIN_RA STRING_ARG */
-#line 464 "util/configparser.y"
+ case 302: /* rpz_signal_nxdomain_ra: VAR_RPZ_SIGNAL_NXDOMAIN_RA STRING_ARG */
+#line 476 "util/configparser.y"
{
OUTYY(("P(rpz_signal_nxdomain_ra:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2967,14 +3005,15 @@ yyreduce:
else cfg_parser->cfg->auths->rpz_signal_nxdomain_ra = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2971 "util/configparser.c"
+#line 3009 "util/configparser.c"
break;
- case 297: /* rpzstart: VAR_RPZ */
-#line 474 "util/configparser.y"
+ case 303: /* rpzstart: VAR_RPZ */
+#line 486 "util/configparser.y"
{
struct config_auth* s;
OUTYY(("\nP(rpz:)\n"));
+ cfg_parser->started_toplevel = 1;
s = (struct config_auth*)calloc(1, sizeof(struct config_auth));
if(s) {
s->next = cfg_parser->cfg->auths;
@@ -2988,11 +3027,11 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 2992 "util/configparser.c"
+#line 3031 "util/configparser.c"
break;
- case 312: /* server_num_threads: VAR_NUM_THREADS STRING_ARG */
-#line 498 "util/configparser.y"
+ case 318: /* server_num_threads: VAR_NUM_THREADS STRING_ARG */
+#line 511 "util/configparser.y"
{
OUTYY(("P(server_num_threads:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3000,11 +3039,11 @@ yyreduce:
else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3004 "util/configparser.c"
+#line 3043 "util/configparser.c"
break;
- case 313: /* server_verbosity: VAR_VERBOSITY STRING_ARG */
-#line 507 "util/configparser.y"
+ case 319: /* server_verbosity: VAR_VERBOSITY STRING_ARG */
+#line 520 "util/configparser.y"
{
OUTYY(("P(server_verbosity:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3012,11 +3051,11 @@ yyreduce:
else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3016 "util/configparser.c"
+#line 3055 "util/configparser.c"
break;
- case 314: /* server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG */
-#line 516 "util/configparser.y"
+ case 320: /* server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG */
+#line 529 "util/configparser.y"
{
OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0)
@@ -3026,11 +3065,11 @@ yyreduce:
else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3030 "util/configparser.c"
+#line 3069 "util/configparser.c"
break;
- case 315: /* server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG */
-#line 527 "util/configparser.y"
+ case 321: /* server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG */
+#line 540 "util/configparser.y"
{
OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3038,11 +3077,11 @@ yyreduce:
else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3042 "util/configparser.c"
+#line 3081 "util/configparser.c"
break;
- case 316: /* server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG */
-#line 536 "util/configparser.y"
+ case 322: /* server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG */
+#line 549 "util/configparser.y"
{
OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3050,11 +3089,11 @@ yyreduce:
else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3054 "util/configparser.c"
+#line 3093 "util/configparser.c"
break;
- case 317: /* server_shm_enable: VAR_SHM_ENABLE STRING_ARG */
-#line 545 "util/configparser.y"
+ case 323: /* server_shm_enable: VAR_SHM_ENABLE STRING_ARG */
+#line 558 "util/configparser.y"
{
OUTYY(("P(server_shm_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3062,11 +3101,11 @@ yyreduce:
else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3066 "util/configparser.c"
+#line 3105 "util/configparser.c"
break;
- case 318: /* server_shm_key: VAR_SHM_KEY STRING_ARG */
-#line 554 "util/configparser.y"
+ case 324: /* server_shm_key: VAR_SHM_KEY STRING_ARG */
+#line 567 "util/configparser.y"
{
OUTYY(("P(server_shm_key:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0)
@@ -3076,11 +3115,11 @@ yyreduce:
else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3080 "util/configparser.c"
+#line 3119 "util/configparser.c"
break;
- case 319: /* server_port: VAR_PORT STRING_ARG */
-#line 565 "util/configparser.y"
+ case 325: /* server_port: VAR_PORT STRING_ARG */
+#line 578 "util/configparser.y"
{
OUTYY(("P(server_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3088,11 +3127,11 @@ yyreduce:
else cfg_parser->cfg->port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3092 "util/configparser.c"
+#line 3131 "util/configparser.c"
break;
- case 320: /* server_send_client_subnet: VAR_SEND_CLIENT_SUBNET STRING_ARG */
-#line 574 "util/configparser.y"
+ case 326: /* server_send_client_subnet: VAR_SEND_CLIENT_SUBNET STRING_ARG */
+#line 587 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[0].str)));
@@ -3103,11 +3142,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 3107 "util/configparser.c"
+#line 3146 "util/configparser.c"
break;
- case 321: /* server_client_subnet_zone: VAR_CLIENT_SUBNET_ZONE STRING_ARG */
-#line 586 "util/configparser.y"
+ case 327: /* server_client_subnet_zone: VAR_CLIENT_SUBNET_ZONE STRING_ARG */
+#line 599 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_client_subnet_zone:%s)\n", (yyvsp[0].str)));
@@ -3119,11 +3158,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 3123 "util/configparser.c"
+#line 3162 "util/configparser.c"
break;
- case 322: /* server_client_subnet_always_forward: VAR_CLIENT_SUBNET_ALWAYS_FORWARD STRING_ARG */
-#line 600 "util/configparser.y"
+ case 328: /* server_client_subnet_always_forward: VAR_CLIENT_SUBNET_ALWAYS_FORWARD STRING_ARG */
+#line 613 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[0].str)));
@@ -3137,11 +3176,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3141 "util/configparser.c"
+#line 3180 "util/configparser.c"
break;
- case 323: /* server_client_subnet_opcode: VAR_CLIENT_SUBNET_OPCODE STRING_ARG */
-#line 615 "util/configparser.y"
+ case 329: /* server_client_subnet_opcode: VAR_CLIENT_SUBNET_OPCODE STRING_ARG */
+#line 628 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[0].str)));
@@ -3151,11 +3190,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3155 "util/configparser.c"
+#line 3194 "util/configparser.c"
break;
- case 324: /* server_max_client_subnet_ipv4: VAR_MAX_CLIENT_SUBNET_IPV4 STRING_ARG */
-#line 626 "util/configparser.y"
+ case 330: /* server_max_client_subnet_ipv4: VAR_MAX_CLIENT_SUBNET_IPV4 STRING_ARG */
+#line 639 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
@@ -3171,11 +3210,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3175 "util/configparser.c"
+#line 3214 "util/configparser.c"
break;
- case 325: /* server_max_client_subnet_ipv6: VAR_MAX_CLIENT_SUBNET_IPV6 STRING_ARG */
-#line 643 "util/configparser.y"
+ case 331: /* server_max_client_subnet_ipv6: VAR_MAX_CLIENT_SUBNET_IPV6 STRING_ARG */
+#line 656 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
@@ -3191,11 +3230,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3195 "util/configparser.c"
+#line 3234 "util/configparser.c"
break;
- case 326: /* server_min_client_subnet_ipv4: VAR_MIN_CLIENT_SUBNET_IPV4 STRING_ARG */
-#line 660 "util/configparser.y"
+ case 332: /* server_min_client_subnet_ipv4: VAR_MIN_CLIENT_SUBNET_IPV4 STRING_ARG */
+#line 673 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(min_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
@@ -3211,11 +3250,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3215 "util/configparser.c"
+#line 3254 "util/configparser.c"
break;
- case 327: /* server_min_client_subnet_ipv6: VAR_MIN_CLIENT_SUBNET_IPV6 STRING_ARG */
-#line 677 "util/configparser.y"
+ case 333: /* server_min_client_subnet_ipv6: VAR_MIN_CLIENT_SUBNET_IPV6 STRING_ARG */
+#line 690 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(min_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
@@ -3231,11 +3270,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3235 "util/configparser.c"
+#line 3274 "util/configparser.c"
break;
- case 328: /* server_max_ecs_tree_size_ipv4: VAR_MAX_ECS_TREE_SIZE_IPV4 STRING_ARG */
-#line 694 "util/configparser.y"
+ case 334: /* server_max_ecs_tree_size_ipv4: VAR_MAX_ECS_TREE_SIZE_IPV4 STRING_ARG */
+#line 707 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", (yyvsp[0].str)));
@@ -3249,11 +3288,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3253 "util/configparser.c"
+#line 3292 "util/configparser.c"
break;
- case 329: /* server_max_ecs_tree_size_ipv6: VAR_MAX_ECS_TREE_SIZE_IPV6 STRING_ARG */
-#line 709 "util/configparser.y"
+ case 335: /* server_max_ecs_tree_size_ipv6: VAR_MAX_ECS_TREE_SIZE_IPV6 STRING_ARG */
+#line 722 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", (yyvsp[0].str)));
@@ -3267,11 +3306,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3271 "util/configparser.c"
+#line 3310 "util/configparser.c"
break;
- case 330: /* server_interface: VAR_INTERFACE STRING_ARG */
-#line 724 "util/configparser.y"
+ case 336: /* server_interface: VAR_INTERFACE STRING_ARG */
+#line 737 "util/configparser.y"
{
OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->num_ifs == 0)
@@ -3283,11 +3322,11 @@ yyreduce:
else
cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str);
}
-#line 3287 "util/configparser.c"
+#line 3326 "util/configparser.c"
break;
- case 331: /* server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG */
-#line 737 "util/configparser.y"
+ case 337: /* server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG */
+#line 750 "util/configparser.y"
{
OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->num_out_ifs == 0)
@@ -3301,11 +3340,11 @@ yyreduce:
cfg_parser->cfg->out_ifs[
cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str);
}
-#line 3305 "util/configparser.c"
+#line 3344 "util/configparser.c"
break;
- case 332: /* server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG */
-#line 752 "util/configparser.y"
+ case 338: /* server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG */
+#line 765 "util/configparser.y"
{
OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3313,11 +3352,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3317 "util/configparser.c"
+#line 3356 "util/configparser.c"
break;
- case 333: /* server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG */
-#line 761 "util/configparser.y"
+ case 339: /* server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG */
+#line 774 "util/configparser.y"
{
OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[0].str)));
if(!cfg_mark_ports((yyvsp[0].str), 1,
@@ -3325,11 +3364,11 @@ yyreduce:
yyerror("port number or range (\"low-high\") expected");
free((yyvsp[0].str));
}
-#line 3329 "util/configparser.c"
+#line 3368 "util/configparser.c"
break;
- case 334: /* server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG */
-#line 770 "util/configparser.y"
+ case 340: /* server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG */
+#line 783 "util/configparser.y"
{
OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[0].str)));
if(!cfg_mark_ports((yyvsp[0].str), 0,
@@ -3337,11 +3376,11 @@ yyreduce:
yyerror("port number or range (\"low-high\") expected");
free((yyvsp[0].str));
}
-#line 3341 "util/configparser.c"
+#line 3380 "util/configparser.c"
break;
- case 335: /* server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG */
-#line 779 "util/configparser.y"
+ case 341: /* server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG */
+#line 792 "util/configparser.y"
{
OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3349,11 +3388,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3353 "util/configparser.c"
+#line 3392 "util/configparser.c"
break;
- case 336: /* server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG */
-#line 788 "util/configparser.y"
+ case 342: /* server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG */
+#line 801 "util/configparser.y"
{
OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3361,11 +3400,11 @@ yyreduce:
else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3365 "util/configparser.c"
+#line 3404 "util/configparser.c"
break;
- case 337: /* server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG */
-#line 797 "util/configparser.y"
+ case 343: /* server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG */
+#line 810 "util/configparser.y"
{
OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3373,21 +3412,21 @@ yyreduce:
else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3377 "util/configparser.c"
+#line 3416 "util/configparser.c"
break;
- case 338: /* server_interface_automatic_ports: VAR_INTERFACE_AUTOMATIC_PORTS STRING_ARG */
-#line 806 "util/configparser.y"
+ case 344: /* server_interface_automatic_ports: VAR_INTERFACE_AUTOMATIC_PORTS STRING_ARG */
+#line 819 "util/configparser.y"
{
OUTYY(("P(server_interface_automatic_ports:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->if_automatic_ports);
cfg_parser->cfg->if_automatic_ports = (yyvsp[0].str);
}
-#line 3387 "util/configparser.c"
+#line 3426 "util/configparser.c"
break;
- case 339: /* server_do_ip4: VAR_DO_IP4 STRING_ARG */
-#line 813 "util/configparser.y"
+ case 345: /* server_do_ip4: VAR_DO_IP4 STRING_ARG */
+#line 826 "util/configparser.y"
{
OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3395,11 +3434,11 @@ yyreduce:
else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3399 "util/configparser.c"
+#line 3438 "util/configparser.c"
break;
- case 340: /* server_do_ip6: VAR_DO_IP6 STRING_ARG */
-#line 822 "util/configparser.y"
+ case 346: /* server_do_ip6: VAR_DO_IP6 STRING_ARG */
+#line 835 "util/configparser.y"
{
OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3407,11 +3446,11 @@ yyreduce:
else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3411 "util/configparser.c"
+#line 3450 "util/configparser.c"
break;
- case 341: /* server_do_udp: VAR_DO_UDP STRING_ARG */
-#line 831 "util/configparser.y"
+ case 347: /* server_do_udp: VAR_DO_UDP STRING_ARG */
+#line 844 "util/configparser.y"
{
OUTYY(("P(server_do_udp:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3419,11 +3458,11 @@ yyreduce:
else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3423 "util/configparser.c"
+#line 3462 "util/configparser.c"
break;
- case 342: /* server_do_tcp: VAR_DO_TCP STRING_ARG */
-#line 840 "util/configparser.y"
+ case 348: /* server_do_tcp: VAR_DO_TCP STRING_ARG */
+#line 853 "util/configparser.y"
{
OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3431,11 +3470,11 @@ yyreduce:
else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3435 "util/configparser.c"
+#line 3474 "util/configparser.c"
break;
- case 343: /* server_prefer_ip4: VAR_PREFER_IP4 STRING_ARG */
-#line 849 "util/configparser.y"
+ case 349: /* server_prefer_ip4: VAR_PREFER_IP4 STRING_ARG */
+#line 862 "util/configparser.y"
{
OUTYY(("P(server_prefer_ip4:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3443,11 +3482,11 @@ yyreduce:
else cfg_parser->cfg->prefer_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3447 "util/configparser.c"
+#line 3486 "util/configparser.c"
break;
- case 344: /* server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG */
-#line 858 "util/configparser.y"
+ case 350: /* server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG */
+#line 871 "util/configparser.y"
{
OUTYY(("P(server_prefer_ip6:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3455,11 +3494,11 @@ yyreduce:
else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3459 "util/configparser.c"
+#line 3498 "util/configparser.c"
break;
- case 345: /* server_tcp_mss: VAR_TCP_MSS STRING_ARG */
-#line 867 "util/configparser.y"
+ case 351: /* server_tcp_mss: VAR_TCP_MSS STRING_ARG */
+#line 880 "util/configparser.y"
{
OUTYY(("P(server_tcp_mss:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3467,11 +3506,11 @@ yyreduce:
else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3471 "util/configparser.c"
+#line 3510 "util/configparser.c"
break;
- case 346: /* server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG */
-#line 876 "util/configparser.y"
+ case 352: /* server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG */
+#line 889 "util/configparser.y"
{
OUTYY(("P(server_outgoing_tcp_mss:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3479,11 +3518,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3483 "util/configparser.c"
+#line 3522 "util/configparser.c"
break;
- case 347: /* server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG */
-#line 885 "util/configparser.y"
+ case 353: /* server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG */
+#line 898 "util/configparser.y"
{
OUTYY(("P(server_tcp_idle_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3495,11 +3534,11 @@ yyreduce:
else cfg_parser->cfg->tcp_idle_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3499 "util/configparser.c"
+#line 3538 "util/configparser.c"
break;
- case 348: /* server_max_reuse_tcp_queries: VAR_MAX_REUSE_TCP_QUERIES STRING_ARG */
-#line 898 "util/configparser.y"
+ case 354: /* server_max_reuse_tcp_queries: VAR_MAX_REUSE_TCP_QUERIES STRING_ARG */
+#line 911 "util/configparser.y"
{
OUTYY(("P(server_max_reuse_tcp_queries:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3509,11 +3548,11 @@ yyreduce:
else cfg_parser->cfg->max_reuse_tcp_queries = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3513 "util/configparser.c"
+#line 3552 "util/configparser.c"
break;
- case 349: /* server_tcp_reuse_timeout: VAR_TCP_REUSE_TIMEOUT STRING_ARG */
-#line 909 "util/configparser.y"
+ case 355: /* server_tcp_reuse_timeout: VAR_TCP_REUSE_TIMEOUT STRING_ARG */
+#line 922 "util/configparser.y"
{
OUTYY(("P(server_tcp_reuse_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3523,11 +3562,11 @@ yyreduce:
else cfg_parser->cfg->tcp_reuse_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3527 "util/configparser.c"
+#line 3566 "util/configparser.c"
break;
- case 350: /* server_tcp_auth_query_timeout: VAR_TCP_AUTH_QUERY_TIMEOUT STRING_ARG */
-#line 920 "util/configparser.y"
+ case 356: /* server_tcp_auth_query_timeout: VAR_TCP_AUTH_QUERY_TIMEOUT STRING_ARG */
+#line 933 "util/configparser.y"
{
OUTYY(("P(server_tcp_auth_query_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3537,11 +3576,11 @@ yyreduce:
else cfg_parser->cfg->tcp_auth_query_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3541 "util/configparser.c"
+#line 3580 "util/configparser.c"
break;
- case 351: /* server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG */
-#line 931 "util/configparser.y"
+ case 357: /* server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG */
+#line 944 "util/configparser.y"
{
OUTYY(("P(server_tcp_keepalive:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3549,11 +3588,11 @@ yyreduce:
else cfg_parser->cfg->do_tcp_keepalive = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3553 "util/configparser.c"
+#line 3592 "util/configparser.c"
break;
- case 352: /* server_tcp_keepalive_timeout: VAR_EDNS_TCP_KEEPALIVE_TIMEOUT STRING_ARG */
-#line 940 "util/configparser.y"
+ case 358: /* server_tcp_keepalive_timeout: VAR_EDNS_TCP_KEEPALIVE_TIMEOUT STRING_ARG */
+#line 953 "util/configparser.y"
{
OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3565,11 +3604,11 @@ yyreduce:
else cfg_parser->cfg->tcp_keepalive_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3569 "util/configparser.c"
+#line 3608 "util/configparser.c"
break;
- case 353: /* server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG */
-#line 953 "util/configparser.y"
+ case 359: /* server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG */
+#line 966 "util/configparser.y"
{
OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3577,11 +3616,11 @@ yyreduce:
else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3581 "util/configparser.c"
+#line 3620 "util/configparser.c"
break;
- case 354: /* server_udp_upstream_without_downstream: VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM STRING_ARG */
-#line 962 "util/configparser.y"
+ case 360: /* server_udp_upstream_without_downstream: VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM STRING_ARG */
+#line 975 "util/configparser.y"
{
OUTYY(("P(server_udp_upstream_without_downstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3589,11 +3628,11 @@ yyreduce:
else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3593 "util/configparser.c"
+#line 3632 "util/configparser.c"
break;
- case 355: /* server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG */
-#line 971 "util/configparser.y"
+ case 361: /* server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG */
+#line 984 "util/configparser.y"
{
OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3601,31 +3640,31 @@ yyreduce:
else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3605 "util/configparser.c"
+#line 3644 "util/configparser.c"
break;
- case 356: /* server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG */
-#line 980 "util/configparser.y"
+ case 362: /* server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG */
+#line 993 "util/configparser.y"
{
OUTYY(("P(server_ssl_service_key:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->ssl_service_key);
cfg_parser->cfg->ssl_service_key = (yyvsp[0].str);
}
-#line 3615 "util/configparser.c"
+#line 3654 "util/configparser.c"
break;
- case 357: /* server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG */
-#line 987 "util/configparser.y"
+ case 363: /* server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG */
+#line 1000 "util/configparser.y"
{
OUTYY(("P(server_ssl_service_pem:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->ssl_service_pem);
cfg_parser->cfg->ssl_service_pem = (yyvsp[0].str);
}
-#line 3625 "util/configparser.c"
+#line 3664 "util/configparser.c"
break;
- case 358: /* server_ssl_port: VAR_SSL_PORT STRING_ARG */
-#line 994 "util/configparser.y"
+ case 364: /* server_ssl_port: VAR_SSL_PORT STRING_ARG */
+#line 1007 "util/configparser.y"
{
OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3633,21 +3672,21 @@ yyreduce:
else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3637 "util/configparser.c"
+#line 3676 "util/configparser.c"
break;
- case 359: /* server_tls_cert_bundle: VAR_TLS_CERT_BUNDLE STRING_ARG */
-#line 1003 "util/configparser.y"
+ case 365: /* server_tls_cert_bundle: VAR_TLS_CERT_BUNDLE STRING_ARG */
+#line 1016 "util/configparser.y"
{
OUTYY(("P(server_tls_cert_bundle:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->tls_cert_bundle);
cfg_parser->cfg->tls_cert_bundle = (yyvsp[0].str);
}
-#line 3647 "util/configparser.c"
+#line 3686 "util/configparser.c"
break;
- case 360: /* server_tls_win_cert: VAR_TLS_WIN_CERT STRING_ARG */
-#line 1010 "util/configparser.y"
+ case 366: /* server_tls_win_cert: VAR_TLS_WIN_CERT STRING_ARG */
+#line 1023 "util/configparser.y"
{
OUTYY(("P(server_tls_win_cert:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3655,53 +3694,53 @@ yyreduce:
else cfg_parser->cfg->tls_win_cert = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3659 "util/configparser.c"
+#line 3698 "util/configparser.c"
break;
- case 361: /* server_tls_additional_port: VAR_TLS_ADDITIONAL_PORT STRING_ARG */
-#line 1019 "util/configparser.y"
+ case 367: /* server_tls_additional_port: VAR_TLS_ADDITIONAL_PORT STRING_ARG */
+#line 1032 "util/configparser.y"
{
OUTYY(("P(server_tls_additional_port:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->tls_additional_port,
(yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3670 "util/configparser.c"
+#line 3709 "util/configparser.c"
break;
- case 362: /* server_tls_ciphers: VAR_TLS_CIPHERS STRING_ARG */
-#line 1027 "util/configparser.y"
+ case 368: /* server_tls_ciphers: VAR_TLS_CIPHERS STRING_ARG */
+#line 1040 "util/configparser.y"
{
OUTYY(("P(server_tls_ciphers:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->tls_ciphers);
cfg_parser->cfg->tls_ciphers = (yyvsp[0].str);
}
-#line 3680 "util/configparser.c"
+#line 3719 "util/configparser.c"
break;
- case 363: /* server_tls_ciphersuites: VAR_TLS_CIPHERSUITES STRING_ARG */
-#line 1034 "util/configparser.y"
+ case 369: /* server_tls_ciphersuites: VAR_TLS_CIPHERSUITES STRING_ARG */
+#line 1047 "util/configparser.y"
{
OUTYY(("P(server_tls_ciphersuites:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->tls_ciphersuites);
cfg_parser->cfg->tls_ciphersuites = (yyvsp[0].str);
}
-#line 3690 "util/configparser.c"
+#line 3729 "util/configparser.c"
break;
- case 364: /* server_tls_session_ticket_keys: VAR_TLS_SESSION_TICKET_KEYS STRING_ARG */
-#line 1041 "util/configparser.y"
+ case 370: /* server_tls_session_ticket_keys: VAR_TLS_SESSION_TICKET_KEYS STRING_ARG */
+#line 1054 "util/configparser.y"
{
OUTYY(("P(server_tls_session_ticket_keys:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_append(&cfg_parser->cfg->tls_session_ticket_keys,
(yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3701 "util/configparser.c"
+#line 3740 "util/configparser.c"
break;
- case 365: /* server_tls_use_sni: VAR_TLS_USE_SNI STRING_ARG */
-#line 1049 "util/configparser.y"
+ case 371: /* server_tls_use_sni: VAR_TLS_USE_SNI STRING_ARG */
+#line 1062 "util/configparser.y"
{
OUTYY(("P(server_tls_use_sni:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3709,11 +3748,11 @@ yyreduce:
else cfg_parser->cfg->tls_use_sni = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3713 "util/configparser.c"
+#line 3752 "util/configparser.c"
break;
- case 366: /* server_https_port: VAR_HTTPS_PORT STRING_ARG */
-#line 1058 "util/configparser.y"
+ case 372: /* server_https_port: VAR_HTTPS_PORT STRING_ARG */
+#line 1071 "util/configparser.y"
{
OUTYY(("P(server_https_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3721,11 +3760,11 @@ yyreduce:
else cfg_parser->cfg->https_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3725 "util/configparser.c"
+#line 3764 "util/configparser.c"
break;
- case 367: /* server_http_endpoint: VAR_HTTP_ENDPOINT STRING_ARG */
-#line 1066 "util/configparser.y"
+ case 373: /* server_http_endpoint: VAR_HTTP_ENDPOINT STRING_ARG */
+#line 1079 "util/configparser.y"
{
OUTYY(("P(server_http_endpoint:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->http_endpoint);
@@ -3741,11 +3780,11 @@ yyreduce:
cfg_parser->cfg->http_endpoint = (yyvsp[0].str);
}
}
-#line 3745 "util/configparser.c"
+#line 3784 "util/configparser.c"
break;
- case 368: /* server_http_max_streams: VAR_HTTP_MAX_STREAMS STRING_ARG */
-#line 1082 "util/configparser.y"
+ case 374: /* server_http_max_streams: VAR_HTTP_MAX_STREAMS STRING_ARG */
+#line 1095 "util/configparser.y"
{
OUTYY(("P(server_http_max_streams:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3753,11 +3792,11 @@ yyreduce:
else cfg_parser->cfg->http_max_streams = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3757 "util/configparser.c"
+#line 3796 "util/configparser.c"
break;
- case 369: /* server_http_query_buffer_size: VAR_HTTP_QUERY_BUFFER_SIZE STRING_ARG */
-#line 1090 "util/configparser.y"
+ case 375: /* server_http_query_buffer_size: VAR_HTTP_QUERY_BUFFER_SIZE STRING_ARG */
+#line 1103 "util/configparser.y"
{
OUTYY(("P(server_http_query_buffer_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str),
@@ -3765,11 +3804,11 @@ yyreduce:
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 3769 "util/configparser.c"
+#line 3808 "util/configparser.c"
break;
- case 370: /* server_http_response_buffer_size: VAR_HTTP_RESPONSE_BUFFER_SIZE STRING_ARG */
-#line 1098 "util/configparser.y"
+ case 376: /* server_http_response_buffer_size: VAR_HTTP_RESPONSE_BUFFER_SIZE STRING_ARG */
+#line 1111 "util/configparser.y"
{
OUTYY(("P(server_http_response_buffer_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str),
@@ -3777,11 +3816,11 @@ yyreduce:
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 3781 "util/configparser.c"
+#line 3820 "util/configparser.c"
break;
- case 371: /* server_http_nodelay: VAR_HTTP_NODELAY STRING_ARG */
-#line 1106 "util/configparser.y"
+ case 377: /* server_http_nodelay: VAR_HTTP_NODELAY STRING_ARG */
+#line 1119 "util/configparser.y"
{
OUTYY(("P(server_http_nodelay:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3789,11 +3828,11 @@ yyreduce:
else cfg_parser->cfg->http_nodelay = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3793 "util/configparser.c"
+#line 3832 "util/configparser.c"
break;
- case 372: /* server_http_notls_downstream: VAR_HTTP_NOTLS_DOWNSTREAM STRING_ARG */
-#line 1114 "util/configparser.y"
+ case 378: /* server_http_notls_downstream: VAR_HTTP_NOTLS_DOWNSTREAM STRING_ARG */
+#line 1127 "util/configparser.y"
{
OUTYY(("P(server_http_notls_downstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3801,11 +3840,11 @@ yyreduce:
else cfg_parser->cfg->http_notls_downstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3805 "util/configparser.c"
+#line 3844 "util/configparser.c"
break;
- case 373: /* server_use_systemd: VAR_USE_SYSTEMD STRING_ARG */
-#line 1122 "util/configparser.y"
+ case 379: /* server_use_systemd: VAR_USE_SYSTEMD STRING_ARG */
+#line 1135 "util/configparser.y"
{
OUTYY(("P(server_use_systemd:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3813,11 +3852,11 @@ yyreduce:
else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3817 "util/configparser.c"
+#line 3856 "util/configparser.c"
break;
- case 374: /* server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG */
-#line 1131 "util/configparser.y"
+ case 380: /* server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG */
+#line 1144 "util/configparser.y"
{
OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3825,11 +3864,11 @@ yyreduce:
else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3829 "util/configparser.c"
+#line 3868 "util/configparser.c"
break;
- case 375: /* server_use_syslog: VAR_USE_SYSLOG STRING_ARG */
-#line 1140 "util/configparser.y"
+ case 381: /* server_use_syslog: VAR_USE_SYSLOG STRING_ARG */
+#line 1153 "util/configparser.y"
{
OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3842,11 +3881,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3846 "util/configparser.c"
+#line 3885 "util/configparser.c"
break;
- case 376: /* server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG */
-#line 1154 "util/configparser.y"
+ case 382: /* server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG */
+#line 1167 "util/configparser.y"
{
OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3854,11 +3893,11 @@ yyreduce:
else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3858 "util/configparser.c"
+#line 3897 "util/configparser.c"
break;
- case 377: /* server_log_queries: VAR_LOG_QUERIES STRING_ARG */
-#line 1163 "util/configparser.y"
+ case 383: /* server_log_queries: VAR_LOG_QUERIES STRING_ARG */
+#line 1176 "util/configparser.y"
{
OUTYY(("P(server_log_queries:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3866,11 +3905,11 @@ yyreduce:
else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3870 "util/configparser.c"
+#line 3909 "util/configparser.c"
break;
- case 378: /* server_log_replies: VAR_LOG_REPLIES STRING_ARG */
-#line 1172 "util/configparser.y"
+ case 384: /* server_log_replies: VAR_LOG_REPLIES STRING_ARG */
+#line 1185 "util/configparser.y"
{
OUTYY(("P(server_log_replies:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3878,11 +3917,11 @@ yyreduce:
else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3882 "util/configparser.c"
+#line 3921 "util/configparser.c"
break;
- case 379: /* server_log_tag_queryreply: VAR_LOG_TAG_QUERYREPLY STRING_ARG */
-#line 1181 "util/configparser.y"
+ case 385: /* server_log_tag_queryreply: VAR_LOG_TAG_QUERYREPLY STRING_ARG */
+#line 1194 "util/configparser.y"
{
OUTYY(("P(server_log_tag_queryreply:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3890,11 +3929,11 @@ yyreduce:
else cfg_parser->cfg->log_tag_queryreply = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3894 "util/configparser.c"
+#line 3933 "util/configparser.c"
break;
- case 380: /* server_log_servfail: VAR_LOG_SERVFAIL STRING_ARG */
-#line 1190 "util/configparser.y"
+ case 386: /* server_log_servfail: VAR_LOG_SERVFAIL STRING_ARG */
+#line 1203 "util/configparser.y"
{
OUTYY(("P(server_log_servfail:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3902,11 +3941,11 @@ yyreduce:
else cfg_parser->cfg->log_servfail = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3906 "util/configparser.c"
+#line 3945 "util/configparser.c"
break;
- case 381: /* server_log_local_actions: VAR_LOG_LOCAL_ACTIONS STRING_ARG */
-#line 1199 "util/configparser.y"
+ case 387: /* server_log_local_actions: VAR_LOG_LOCAL_ACTIONS STRING_ARG */
+#line 1212 "util/configparser.y"
{
OUTYY(("P(server_log_local_actions:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3914,31 +3953,31 @@ yyreduce:
else cfg_parser->cfg->log_local_actions = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3918 "util/configparser.c"
+#line 3957 "util/configparser.c"
break;
- case 382: /* server_chroot: VAR_CHROOT STRING_ARG */
-#line 1208 "util/configparser.y"
+ case 388: /* server_chroot: VAR_CHROOT STRING_ARG */
+#line 1221 "util/configparser.y"
{
OUTYY(("P(server_chroot:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->chrootdir);
cfg_parser->cfg->chrootdir = (yyvsp[0].str);
}
-#line 3928 "util/configparser.c"
+#line 3967 "util/configparser.c"
break;
- case 383: /* server_username: VAR_USERNAME STRING_ARG */
-#line 1215 "util/configparser.y"
+ case 389: /* server_username: VAR_USERNAME STRING_ARG */
+#line 1228 "util/configparser.y"
{
OUTYY(("P(server_username:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->username);
cfg_parser->cfg->username = (yyvsp[0].str);
}
-#line 3938 "util/configparser.c"
+#line 3977 "util/configparser.c"
break;
- case 384: /* server_directory: VAR_DIRECTORY STRING_ARG */
-#line 1222 "util/configparser.y"
+ case 390: /* server_directory: VAR_DIRECTORY STRING_ARG */
+#line 1235 "util/configparser.y"
{
OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->directory);
@@ -3963,105 +4002,105 @@ yyreduce:
}
}
}
-#line 3967 "util/configparser.c"
+#line 4006 "util/configparser.c"
break;
- case 385: /* server_logfile: VAR_LOGFILE STRING_ARG */
-#line 1248 "util/configparser.y"
+ case 391: /* server_logfile: VAR_LOGFILE STRING_ARG */
+#line 1261 "util/configparser.y"
{
OUTYY(("P(server_logfile:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->logfile);
cfg_parser->cfg->logfile = (yyvsp[0].str);
cfg_parser->cfg->use_syslog = 0;
}
-#line 3978 "util/configparser.c"
+#line 4017 "util/configparser.c"
break;
- case 386: /* server_pidfile: VAR_PIDFILE STRING_ARG */
-#line 1256 "util/configparser.y"
+ case 392: /* server_pidfile: VAR_PIDFILE STRING_ARG */
+#line 1269 "util/configparser.y"
{
OUTYY(("P(server_pidfile:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->pidfile);
cfg_parser->cfg->pidfile = (yyvsp[0].str);
}
-#line 3988 "util/configparser.c"
+#line 4027 "util/configparser.c"
break;
- case 387: /* server_root_hints: VAR_ROOT_HINTS STRING_ARG */
-#line 1263 "util/configparser.y"
+ case 393: /* server_root_hints: VAR_ROOT_HINTS STRING_ARG */
+#line 1276 "util/configparser.y"
{
OUTYY(("P(server_root_hints:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3998 "util/configparser.c"
+#line 4037 "util/configparser.c"
break;
- case 388: /* server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG */
-#line 1270 "util/configparser.y"
+ case 394: /* server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG */
+#line 1283 "util/configparser.y"
{
OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[0].str)));
log_warn("option dlv-anchor-file ignored: DLV is decommissioned");
free((yyvsp[0].str));
}
-#line 4008 "util/configparser.c"
+#line 4047 "util/configparser.c"
break;
- case 389: /* server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG */
-#line 1277 "util/configparser.y"
+ case 395: /* server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG */
+#line 1290 "util/configparser.y"
{
OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[0].str)));
log_warn("option dlv-anchor ignored: DLV is decommissioned");
free((yyvsp[0].str));
}
-#line 4018 "util/configparser.c"
+#line 4057 "util/configparser.c"
break;
- case 390: /* server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG */
-#line 1284 "util/configparser.y"
+ case 396: /* server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG */
+#line 1297 "util/configparser.y"
{
OUTYY(("P(server_auto_trust_anchor_file:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->
auto_trust_anchor_file_list, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4029 "util/configparser.c"
+#line 4068 "util/configparser.c"
break;
- case 391: /* server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG */
-#line 1292 "util/configparser.y"
+ case 397: /* server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG */
+#line 1305 "util/configparser.y"
{
OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->
trust_anchor_file_list, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4040 "util/configparser.c"
+#line 4079 "util/configparser.c"
break;
- case 392: /* server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG */
-#line 1300 "util/configparser.y"
+ case 398: /* server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG */
+#line 1313 "util/configparser.y"
{
OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->
trusted_keys_file_list, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4051 "util/configparser.c"
+#line 4090 "util/configparser.c"
break;
- case 393: /* server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG */
-#line 1308 "util/configparser.y"
+ case 399: /* server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG */
+#line 1321 "util/configparser.y"
{
OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4061 "util/configparser.c"
+#line 4100 "util/configparser.c"
break;
- case 394: /* server_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG */
-#line 1315 "util/configparser.y"
+ case 400: /* server_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG */
+#line 1328 "util/configparser.y"
{
OUTYY(("P(server_trust_anchor_signaling:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4071,11 +4110,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4075 "util/configparser.c"
+#line 4114 "util/configparser.c"
break;
- case 395: /* server_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG */
-#line 1326 "util/configparser.y"
+ case 401: /* server_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG */
+#line 1339 "util/configparser.y"
{
OUTYY(("P(server_root_key_sentinel:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4085,21 +4124,21 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4089 "util/configparser.c"
+#line 4128 "util/configparser.c"
break;
- case 396: /* server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG */
-#line 1337 "util/configparser.y"
+ case 402: /* server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG */
+#line 1350 "util/configparser.y"
{
OUTYY(("P(server_domain_insecure:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4099 "util/configparser.c"
+#line 4138 "util/configparser.c"
break;
- case 397: /* server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG */
-#line 1344 "util/configparser.y"
+ case 403: /* server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG */
+#line 1357 "util/configparser.y"
{
OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4107,11 +4146,11 @@ yyreduce:
else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4111 "util/configparser.c"
+#line 4150 "util/configparser.c"
break;
- case 398: /* server_hide_version: VAR_HIDE_VERSION STRING_ARG */
-#line 1353 "util/configparser.y"
+ case 404: /* server_hide_version: VAR_HIDE_VERSION STRING_ARG */
+#line 1366 "util/configparser.y"
{
OUTYY(("P(server_hide_version:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4119,11 +4158,11 @@ yyreduce:
else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4123 "util/configparser.c"
+#line 4162 "util/configparser.c"
break;
- case 399: /* server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG */
-#line 1362 "util/configparser.y"
+ case 405: /* server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG */
+#line 1375 "util/configparser.y"
{
OUTYY(("P(server_hide_trustanchor:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4131,11 +4170,11 @@ yyreduce:
else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4135 "util/configparser.c"
+#line 4174 "util/configparser.c"
break;
- case 400: /* server_hide_http_user_agent: VAR_HIDE_HTTP_USER_AGENT STRING_ARG */
-#line 1371 "util/configparser.y"
+ case 406: /* server_hide_http_user_agent: VAR_HIDE_HTTP_USER_AGENT STRING_ARG */
+#line 1384 "util/configparser.y"
{
OUTYY(("P(server_hide_user_agent:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4143,41 +4182,41 @@ yyreduce:
else cfg_parser->cfg->hide_http_user_agent = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4147 "util/configparser.c"
+#line 4186 "util/configparser.c"
break;
- case 401: /* server_identity: VAR_IDENTITY STRING_ARG */
-#line 1380 "util/configparser.y"
+ case 407: /* server_identity: VAR_IDENTITY STRING_ARG */
+#line 1393 "util/configparser.y"
{
OUTYY(("P(server_identity:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->identity);
cfg_parser->cfg->identity = (yyvsp[0].str);
}
-#line 4157 "util/configparser.c"
+#line 4196 "util/configparser.c"
break;
- case 402: /* server_version: VAR_VERSION STRING_ARG */
-#line 1387 "util/configparser.y"
+ case 408: /* server_version: VAR_VERSION STRING_ARG */
+#line 1400 "util/configparser.y"
{
OUTYY(("P(server_version:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->version);
cfg_parser->cfg->version = (yyvsp[0].str);
}
-#line 4167 "util/configparser.c"
+#line 4206 "util/configparser.c"
break;
- case 403: /* server_http_user_agent: VAR_HTTP_USER_AGENT STRING_ARG */
-#line 1394 "util/configparser.y"
+ case 409: /* server_http_user_agent: VAR_HTTP_USER_AGENT STRING_ARG */
+#line 1407 "util/configparser.y"
{
OUTYY(("P(server_http_user_agent:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->http_user_agent);
cfg_parser->cfg->http_user_agent = (yyvsp[0].str);
}
-#line 4177 "util/configparser.c"
+#line 4216 "util/configparser.c"
break;
- case 404: /* server_nsid: VAR_NSID STRING_ARG */
-#line 1401 "util/configparser.y"
+ case 410: /* server_nsid: VAR_NSID STRING_ARG */
+#line 1414 "util/configparser.y"
{
OUTYY(("P(server_nsid:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->nsid_cfg_str);
@@ -4192,33 +4231,33 @@ yyreduce:
yyerror("the NSID must be either a hex string or an "
"ascii character string prepended with ascii_.");
}
-#line 4196 "util/configparser.c"
+#line 4235 "util/configparser.c"
break;
- case 405: /* server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG */
-#line 1417 "util/configparser.y"
+ case 411: /* server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG */
+#line 1430 "util/configparser.y"
{
OUTYY(("P(server_so_rcvbuf:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_rcvbuf))
yyerror("buffer size expected");
free((yyvsp[0].str));
}
-#line 4207 "util/configparser.c"
+#line 4246 "util/configparser.c"
break;
- case 406: /* server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG */
-#line 1425 "util/configparser.y"
+ case 412: /* server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG */
+#line 1438 "util/configparser.y"
{
OUTYY(("P(server_so_sndbuf:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_sndbuf))
yyerror("buffer size expected");
free((yyvsp[0].str));
}
-#line 4218 "util/configparser.c"
+#line 4257 "util/configparser.c"
break;
- case 407: /* server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG */
-#line 1433 "util/configparser.y"
+ case 413: /* server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG */
+#line 1446 "util/configparser.y"
{
OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4227,11 +4266,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4231 "util/configparser.c"
+#line 4270 "util/configparser.c"
break;
- case 408: /* server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG */
-#line 1443 "util/configparser.y"
+ case 414: /* server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG */
+#line 1456 "util/configparser.y"
{
OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4240,11 +4279,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4244 "util/configparser.c"
+#line 4283 "util/configparser.c"
break;
- case 409: /* server_ip_freebind: VAR_IP_FREEBIND STRING_ARG */
-#line 1453 "util/configparser.y"
+ case 415: /* server_ip_freebind: VAR_IP_FREEBIND STRING_ARG */
+#line 1466 "util/configparser.y"
{
OUTYY(("P(server_ip_freebind:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4253,11 +4292,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4257 "util/configparser.c"
+#line 4296 "util/configparser.c"
break;
- case 410: /* server_ip_dscp: VAR_IP_DSCP STRING_ARG */
-#line 1463 "util/configparser.y"
+ case 416: /* server_ip_dscp: VAR_IP_DSCP STRING_ARG */
+#line 1476 "util/configparser.y"
{
OUTYY(("P(server_ip_dscp:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4270,22 +4309,22 @@ yyreduce:
cfg_parser->cfg->ip_dscp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4274 "util/configparser.c"
+#line 4313 "util/configparser.c"
break;
- case 411: /* server_stream_wait_size: VAR_STREAM_WAIT_SIZE STRING_ARG */
-#line 1477 "util/configparser.y"
+ case 417: /* server_stream_wait_size: VAR_STREAM_WAIT_SIZE STRING_ARG */
+#line 1490 "util/configparser.y"
{
OUTYY(("P(server_stream_wait_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->stream_wait_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 4285 "util/configparser.c"
+#line 4324 "util/configparser.c"
break;
- case 412: /* server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG */
-#line 1485 "util/configparser.y"
+ case 418: /* server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG */
+#line 1498 "util/configparser.y"
{
OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4297,11 +4336,11 @@ yyreduce:
else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4301 "util/configparser.c"
+#line 4340 "util/configparser.c"
break;
- case 413: /* server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG */
-#line 1498 "util/configparser.y"
+ case 419: /* server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG */
+#line 1511 "util/configparser.y"
{
OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4311,22 +4350,22 @@ yyreduce:
else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4315 "util/configparser.c"
+#line 4354 "util/configparser.c"
break;
- case 414: /* server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG */
-#line 1509 "util/configparser.y"
+ case 420: /* server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG */
+#line 1522 "util/configparser.y"
{
OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->msg_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 4326 "util/configparser.c"
+#line 4365 "util/configparser.c"
break;
- case 415: /* server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG */
-#line 1517 "util/configparser.y"
+ case 421: /* server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG */
+#line 1530 "util/configparser.y"
{
OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -4338,11 +4377,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4342 "util/configparser.c"
+#line 4381 "util/configparser.c"
break;
- case 416: /* server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG */
-#line 1530 "util/configparser.y"
+ case 422: /* server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG */
+#line 1543 "util/configparser.y"
{
OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4350,11 +4389,11 @@ yyreduce:
else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4354 "util/configparser.c"
+#line 4393 "util/configparser.c"
break;
- case 417: /* server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG */
-#line 1539 "util/configparser.y"
+ case 423: /* server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG */
+#line 1552 "util/configparser.y"
{
OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4362,11 +4401,11 @@ yyreduce:
else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4366 "util/configparser.c"
+#line 4405 "util/configparser.c"
break;
- case 418: /* server_delay_close: VAR_DELAY_CLOSE STRING_ARG */
-#line 1548 "util/configparser.y"
+ case 424: /* server_delay_close: VAR_DELAY_CLOSE STRING_ARG */
+#line 1561 "util/configparser.y"
{
OUTYY(("P(server_delay_close:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4374,11 +4413,11 @@ yyreduce:
else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4378 "util/configparser.c"
+#line 4417 "util/configparser.c"
break;
- case 419: /* server_udp_connect: VAR_UDP_CONNECT STRING_ARG */
-#line 1557 "util/configparser.y"
+ case 425: /* server_udp_connect: VAR_UDP_CONNECT STRING_ARG */
+#line 1570 "util/configparser.y"
{
OUTYY(("P(server_udp_connect:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4386,11 +4425,11 @@ yyreduce:
else cfg_parser->cfg->udp_connect = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4390 "util/configparser.c"
+#line 4429 "util/configparser.c"
break;
- case 420: /* server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG */
-#line 1566 "util/configparser.y"
+ case 426: /* server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG */
+#line 1579 "util/configparser.y"
{
OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4399,11 +4438,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4403 "util/configparser.c"
+#line 4442 "util/configparser.c"
break;
- case 421: /* server_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG */
-#line 1576 "util/configparser.y"
+ case 427: /* server_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG */
+#line 1589 "util/configparser.y"
{
OUTYY(("P(server_insecure_lan_zones:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4412,22 +4451,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4416 "util/configparser.c"
+#line 4455 "util/configparser.c"
break;
- case 422: /* server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG */
-#line 1586 "util/configparser.y"
+ case 428: /* server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG */
+#line 1599 "util/configparser.y"
{
OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->rrset_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 4427 "util/configparser.c"
+#line 4466 "util/configparser.c"
break;
- case 423: /* server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG */
-#line 1594 "util/configparser.y"
+ case 429: /* server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG */
+#line 1607 "util/configparser.y"
{
OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -4439,11 +4478,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4443 "util/configparser.c"
+#line 4482 "util/configparser.c"
break;
- case 424: /* server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG */
-#line 1607 "util/configparser.y"
+ case 430: /* server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG */
+#line 1620 "util/configparser.y"
{
OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4451,22 +4490,22 @@ yyreduce:
else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4455 "util/configparser.c"
+#line 4494 "util/configparser.c"
break;
- case 425: /* server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG */
-#line 1616 "util/configparser.y"
+ case 431: /* server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG */
+#line 1629 "util/configparser.y"
{
OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[0].str)));
verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
"removed, use infra-host-ttl)", (yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4466 "util/configparser.c"
+#line 4505 "util/configparser.c"
break;
- case 426: /* server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG */
-#line 1624 "util/configparser.y"
+ case 432: /* server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG */
+#line 1637 "util/configparser.y"
{
OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4474,22 +4513,22 @@ yyreduce:
else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4478 "util/configparser.c"
+#line 4517 "util/configparser.c"
break;
- case 427: /* server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG */
-#line 1633 "util/configparser.y"
+ case 433: /* server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG */
+#line 1646 "util/configparser.y"
{
OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[0].str)));
verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
"(option removed, use infra-cache-numhosts)", (yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4489 "util/configparser.c"
+#line 4528 "util/configparser.c"
break;
- case 428: /* server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG */
-#line 1641 "util/configparser.y"
+ case 434: /* server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG */
+#line 1654 "util/configparser.y"
{
OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -4501,11 +4540,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4505 "util/configparser.c"
+#line 4544 "util/configparser.c"
break;
- case 429: /* server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG */
-#line 1654 "util/configparser.y"
+ case 435: /* server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG */
+#line 1667 "util/configparser.y"
{
OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4513,11 +4552,11 @@ yyreduce:
else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4517 "util/configparser.c"
+#line 4556 "util/configparser.c"
break;
- case 430: /* server_infra_cache_max_rtt: VAR_INFRA_CACHE_MAX_RTT STRING_ARG */
-#line 1663 "util/configparser.y"
+ case 436: /* server_infra_cache_max_rtt: VAR_INFRA_CACHE_MAX_RTT STRING_ARG */
+#line 1676 "util/configparser.y"
{
OUTYY(("P(server_infra_cache_max_rtt:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4525,11 +4564,11 @@ yyreduce:
else cfg_parser->cfg->infra_cache_max_rtt = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4529 "util/configparser.c"
+#line 4568 "util/configparser.c"
break;
- case 431: /* server_infra_keep_probing: VAR_INFRA_KEEP_PROBING STRING_ARG */
-#line 1672 "util/configparser.y"
+ case 437: /* server_infra_keep_probing: VAR_INFRA_KEEP_PROBING STRING_ARG */
+#line 1685 "util/configparser.y"
{
OUTYY(("P(server_infra_keep_probing:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4538,21 +4577,21 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4542 "util/configparser.c"
+#line 4581 "util/configparser.c"
break;
- case 432: /* server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG */
-#line 1682 "util/configparser.y"
+ case 438: /* server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG */
+#line 1695 "util/configparser.y"
{
OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->target_fetch_policy);
cfg_parser->cfg->target_fetch_policy = (yyvsp[0].str);
}
-#line 4552 "util/configparser.c"
+#line 4591 "util/configparser.c"
break;
- case 433: /* server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG */
-#line 1689 "util/configparser.y"
+ case 439: /* server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG */
+#line 1702 "util/configparser.y"
{
OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4561,11 +4600,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4565 "util/configparser.c"
+#line 4604 "util/configparser.c"
break;
- case 434: /* server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG */
-#line 1699 "util/configparser.y"
+ case 440: /* server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG */
+#line 1712 "util/configparser.y"
{
OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4574,11 +4613,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4578 "util/configparser.c"
+#line 4617 "util/configparser.c"
break;
- case 435: /* server_harden_glue: VAR_HARDEN_GLUE STRING_ARG */
-#line 1709 "util/configparser.y"
+ case 441: /* server_harden_glue: VAR_HARDEN_GLUE STRING_ARG */
+#line 1722 "util/configparser.y"
{
OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4587,11 +4626,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4591 "util/configparser.c"
+#line 4630 "util/configparser.c"
break;
- case 436: /* server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG */
-#line 1719 "util/configparser.y"
+ case 442: /* server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG */
+#line 1732 "util/configparser.y"
{
OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4600,11 +4639,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4604 "util/configparser.c"
+#line 4643 "util/configparser.c"
break;
- case 437: /* server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG */
-#line 1729 "util/configparser.y"
+ case 443: /* server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG */
+#line 1742 "util/configparser.y"
{
OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4613,11 +4652,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4617 "util/configparser.c"
+#line 4656 "util/configparser.c"
break;
- case 438: /* server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG */
-#line 1739 "util/configparser.y"
+ case 444: /* server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG */
+#line 1752 "util/configparser.y"
{
OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4626,11 +4665,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4630 "util/configparser.c"
+#line 4669 "util/configparser.c"
break;
- case 439: /* server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG */
-#line 1749 "util/configparser.y"
+ case 445: /* server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG */
+#line 1762 "util/configparser.y"
{
OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4639,11 +4678,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4643 "util/configparser.c"
+#line 4682 "util/configparser.c"
break;
- case 440: /* server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG */
-#line 1759 "util/configparser.y"
+ case 446: /* server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG */
+#line 1772 "util/configparser.y"
{
OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4652,41 +4691,41 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4656 "util/configparser.c"
+#line 4695 "util/configparser.c"
break;
- case 441: /* server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG */
-#line 1769 "util/configparser.y"
+ case 447: /* server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG */
+#line 1782 "util/configparser.y"
{
OUTYY(("P(server_caps_whitelist:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4666 "util/configparser.c"
+#line 4705 "util/configparser.c"
break;
- case 442: /* server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG */
-#line 1776 "util/configparser.y"
+ case 448: /* server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG */
+#line 1789 "util/configparser.y"
{
OUTYY(("P(server_private_address:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4676 "util/configparser.c"
+#line 4715 "util/configparser.c"
break;
- case 443: /* server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG */
-#line 1783 "util/configparser.y"
+ case 449: /* server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG */
+#line 1796 "util/configparser.y"
{
OUTYY(("P(server_private_domain:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4686 "util/configparser.c"
+#line 4725 "util/configparser.c"
break;
- case 444: /* server_prefetch: VAR_PREFETCH STRING_ARG */
-#line 1790 "util/configparser.y"
+ case 450: /* server_prefetch: VAR_PREFETCH STRING_ARG */
+#line 1803 "util/configparser.y"
{
OUTYY(("P(server_prefetch:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4694,11 +4733,11 @@ yyreduce:
else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4698 "util/configparser.c"
+#line 4737 "util/configparser.c"
break;
- case 445: /* server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG */
-#line 1799 "util/configparser.y"
+ case 451: /* server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG */
+#line 1812 "util/configparser.y"
{
OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4706,11 +4745,11 @@ yyreduce:
else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4710 "util/configparser.c"
+#line 4749 "util/configparser.c"
break;
- case 446: /* server_deny_any: VAR_DENY_ANY STRING_ARG */
-#line 1808 "util/configparser.y"
+ case 452: /* server_deny_any: VAR_DENY_ANY STRING_ARG */
+#line 1821 "util/configparser.y"
{
OUTYY(("P(server_deny_any:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4718,11 +4757,11 @@ yyreduce:
else cfg_parser->cfg->deny_any = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4722 "util/configparser.c"
+#line 4761 "util/configparser.c"
break;
- case 447: /* server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG */
-#line 1817 "util/configparser.y"
+ case 453: /* server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG */
+#line 1830 "util/configparser.y"
{
OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4730,21 +4769,21 @@ yyreduce:
else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4734 "util/configparser.c"
+#line 4773 "util/configparser.c"
break;
- case 448: /* server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG */
-#line 1826 "util/configparser.y"
+ case 454: /* server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG */
+#line 1839 "util/configparser.y"
{
OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4744 "util/configparser.c"
+#line 4783 "util/configparser.c"
break;
- case 449: /* server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG */
-#line 1833 "util/configparser.y"
+ case 455: /* server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG */
+#line 1846 "util/configparser.y"
{
OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4753,44 +4792,44 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4757 "util/configparser.c"
+#line 4796 "util/configparser.c"
break;
- case 450: /* server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG */
-#line 1843 "util/configparser.y"
+ case 456: /* server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG */
+#line 1856 "util/configparser.y"
{
OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "deny")!=0 && strcmp((yyvsp[0].str), "refuse")!=0 &&
- strcmp((yyvsp[0].str), "deny_non_local")!=0 &&
- strcmp((yyvsp[0].str), "refuse_non_local")!=0 &&
- strcmp((yyvsp[0].str), "allow_setrd")!=0 &&
- strcmp((yyvsp[0].str), "allow")!=0 &&
- strcmp((yyvsp[0].str), "allow_snoop")!=0) {
- yyerror("expected deny, refuse, deny_non_local, "
- "refuse_non_local, allow, allow_setrd or "
- "allow_snoop in access control action");
- free((yyvsp[-1].str));
- free((yyvsp[0].str));
- } else {
- if(!cfg_str2list_insert(&cfg_parser->cfg->acls, (yyvsp[-1].str), (yyvsp[0].str)))
- fatal_exit("out of memory adding acl");
- }
+ validate_acl_action((yyvsp[0].str));
+ if(!cfg_str2list_insert(&cfg_parser->cfg->acls, (yyvsp[-1].str), (yyvsp[0].str)))
+ fatal_exit("out of memory adding acl");
+ }
+#line 4807 "util/configparser.c"
+ break;
+
+ case 457: /* server_interface_action: VAR_INTERFACE_ACTION STRING_ARG STRING_ARG */
+#line 1864 "util/configparser.y"
+ {
+ OUTYY(("P(server_interface_action:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
+ validate_acl_action((yyvsp[0].str));
+ if(!cfg_str2list_insert(
+ &cfg_parser->cfg->interface_actions, (yyvsp[-1].str), (yyvsp[0].str)))
+ fatal_exit("out of memory adding acl");
}
-#line 4780 "util/configparser.c"
+#line 4819 "util/configparser.c"
break;
- case 451: /* server_module_conf: VAR_MODULE_CONF STRING_ARG */
-#line 1863 "util/configparser.y"
+ case 458: /* server_module_conf: VAR_MODULE_CONF STRING_ARG */
+#line 1873 "util/configparser.y"
{
OUTYY(("P(server_module_conf:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->module_conf);
cfg_parser->cfg->module_conf = (yyvsp[0].str);
}
-#line 4790 "util/configparser.c"
+#line 4829 "util/configparser.c"
break;
- case 452: /* server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG */
-#line 1870 "util/configparser.y"
+ case 459: /* server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG */
+#line 1880 "util/configparser.y"
{
OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -4807,11 +4846,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4811 "util/configparser.c"
+#line 4850 "util/configparser.c"
break;
- case 453: /* server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG */
-#line 1888 "util/configparser.y"
+ case 460: /* server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG */
+#line 1898 "util/configparser.y"
{
OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -4823,11 +4862,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4827 "util/configparser.c"
+#line 4866 "util/configparser.c"
break;
- case 454: /* server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG */
-#line 1901 "util/configparser.y"
+ case 461: /* server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG */
+#line 1911 "util/configparser.y"
{
OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -4839,11 +4878,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4843 "util/configparser.c"
+#line 4882 "util/configparser.c"
break;
- case 455: /* server_val_max_restart: VAR_VAL_MAX_RESTART STRING_ARG */
-#line 1914 "util/configparser.y"
+ case 462: /* server_val_max_restart: VAR_VAL_MAX_RESTART STRING_ARG */
+#line 1924 "util/configparser.y"
{
OUTYY(("P(server_val_max_restart:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -4855,11 +4894,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4859 "util/configparser.c"
+#line 4898 "util/configparser.c"
break;
- case 456: /* server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG */
-#line 1927 "util/configparser.y"
+ case 463: /* server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG */
+#line 1937 "util/configparser.y"
{
OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4867,11 +4906,11 @@ yyreduce:
else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4871 "util/configparser.c"
+#line 4910 "util/configparser.c"
break;
- case 457: /* server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG */
-#line 1936 "util/configparser.y"
+ case 464: /* server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG */
+#line 1946 "util/configparser.y"
{
OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4879,11 +4918,11 @@ yyreduce:
else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4883 "util/configparser.c"
+#line 4922 "util/configparser.c"
break;
- case 458: /* server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG */
-#line 1945 "util/configparser.y"
+ case 465: /* server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG */
+#line 1955 "util/configparser.y"
{
OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4891,11 +4930,11 @@ yyreduce:
else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4895 "util/configparser.c"
+#line 4934 "util/configparser.c"
break;
- case 459: /* server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG */
-#line 1954 "util/configparser.y"
+ case 466: /* server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG */
+#line 1964 "util/configparser.y"
{
OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4903,11 +4942,11 @@ yyreduce:
else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4907 "util/configparser.c"
+#line 4946 "util/configparser.c"
break;
- case 460: /* server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG */
-#line 1963 "util/configparser.y"
+ case 467: /* server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG */
+#line 1973 "util/configparser.y"
{
OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4916,11 +4955,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4920 "util/configparser.c"
+#line 4959 "util/configparser.c"
break;
- case 461: /* server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG */
-#line 1973 "util/configparser.y"
+ case 468: /* server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG */
+#line 1983 "util/configparser.y"
{
OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4929,11 +4968,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4933 "util/configparser.c"
+#line 4972 "util/configparser.c"
break;
- case 462: /* server_aggressive_nsec: VAR_AGGRESSIVE_NSEC STRING_ARG */
-#line 1983 "util/configparser.y"
+ case 469: /* server_aggressive_nsec: VAR_AGGRESSIVE_NSEC STRING_ARG */
+#line 1993 "util/configparser.y"
{
OUTYY(("P(server_aggressive_nsec:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4943,11 +4982,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4947 "util/configparser.c"
+#line 4986 "util/configparser.c"
break;
- case 463: /* server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG */
-#line 1994 "util/configparser.y"
+ case 470: /* server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG */
+#line 2004 "util/configparser.y"
{
OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4955,11 +4994,11 @@ yyreduce:
else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4959 "util/configparser.c"
+#line 4998 "util/configparser.c"
break;
- case 464: /* server_serve_expired: VAR_SERVE_EXPIRED STRING_ARG */
-#line 2003 "util/configparser.y"
+ case 471: /* server_serve_expired: VAR_SERVE_EXPIRED STRING_ARG */
+#line 2013 "util/configparser.y"
{
OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4967,11 +5006,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4971 "util/configparser.c"
+#line 5010 "util/configparser.c"
break;
- case 465: /* server_serve_expired_ttl: VAR_SERVE_EXPIRED_TTL STRING_ARG */
-#line 2012 "util/configparser.y"
+ case 472: /* server_serve_expired_ttl: VAR_SERVE_EXPIRED_TTL STRING_ARG */
+#line 2022 "util/configparser.y"
{
OUTYY(("P(server_serve_expired_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4979,11 +5018,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4983 "util/configparser.c"
+#line 5022 "util/configparser.c"
break;
- case 466: /* server_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG */
-#line 2021 "util/configparser.y"
+ case 473: /* server_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG */
+#line 2031 "util/configparser.y"
{
OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4991,11 +5030,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4995 "util/configparser.c"
+#line 5034 "util/configparser.c"
break;
- case 467: /* server_serve_expired_reply_ttl: VAR_SERVE_EXPIRED_REPLY_TTL STRING_ARG */
-#line 2030 "util/configparser.y"
+ case 474: /* server_serve_expired_reply_ttl: VAR_SERVE_EXPIRED_REPLY_TTL STRING_ARG */
+#line 2040 "util/configparser.y"
{
OUTYY(("P(server_serve_expired_reply_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5003,11 +5042,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired_reply_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5007 "util/configparser.c"
+#line 5046 "util/configparser.c"
break;
- case 468: /* server_serve_expired_client_timeout: VAR_SERVE_EXPIRED_CLIENT_TIMEOUT STRING_ARG */
-#line 2039 "util/configparser.y"
+ case 475: /* server_serve_expired_client_timeout: VAR_SERVE_EXPIRED_CLIENT_TIMEOUT STRING_ARG */
+#line 2049 "util/configparser.y"
{
OUTYY(("P(server_serve_expired_client_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5015,11 +5054,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired_client_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5019 "util/configparser.c"
+#line 5058 "util/configparser.c"
break;
- case 469: /* server_ede_serve_expired: VAR_EDE_SERVE_EXPIRED STRING_ARG */
-#line 2048 "util/configparser.y"
+ case 476: /* server_ede_serve_expired: VAR_EDE_SERVE_EXPIRED STRING_ARG */
+#line 2058 "util/configparser.y"
{
OUTYY(("P(server_ede_serve_expired:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5027,11 +5066,11 @@ yyreduce:
else cfg_parser->cfg->ede_serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5031 "util/configparser.c"
+#line 5070 "util/configparser.c"
break;
- case 470: /* server_serve_original_ttl: VAR_SERVE_ORIGINAL_TTL STRING_ARG */
-#line 2057 "util/configparser.y"
+ case 477: /* server_serve_original_ttl: VAR_SERVE_ORIGINAL_TTL STRING_ARG */
+#line 2067 "util/configparser.y"
{
OUTYY(("P(server_serve_original_ttl:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5039,11 +5078,11 @@ yyreduce:
else cfg_parser->cfg->serve_original_ttl = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5043 "util/configparser.c"
+#line 5082 "util/configparser.c"
break;
- case 471: /* server_fake_dsa: VAR_FAKE_DSA STRING_ARG */
-#line 2066 "util/configparser.y"
+ case 478: /* server_fake_dsa: VAR_FAKE_DSA STRING_ARG */
+#line 2076 "util/configparser.y"
{
OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5055,11 +5094,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 5059 "util/configparser.c"
+#line 5098 "util/configparser.c"
break;
- case 472: /* server_fake_sha1: VAR_FAKE_SHA1 STRING_ARG */
-#line 2079 "util/configparser.y"
+ case 479: /* server_fake_sha1: VAR_FAKE_SHA1 STRING_ARG */
+#line 2089 "util/configparser.y"
{
OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5071,11 +5110,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 5075 "util/configparser.c"
+#line 5114 "util/configparser.c"
break;
- case 473: /* server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG */
-#line 2092 "util/configparser.y"
+ case 480: /* server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG */
+#line 2102 "util/configparser.y"
{
OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5083,21 +5122,21 @@ yyreduce:
else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5087 "util/configparser.c"
+#line 5126 "util/configparser.c"
break;
- case 474: /* server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG */
-#line 2101 "util/configparser.y"
+ case 481: /* server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG */
+#line 2111 "util/configparser.y"
{
OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->val_nsec3_key_iterations);
cfg_parser->cfg->val_nsec3_key_iterations = (yyvsp[0].str);
}
-#line 5097 "util/configparser.c"
+#line 5136 "util/configparser.c"
break;
- case 475: /* server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG */
-#line 2108 "util/configparser.y"
+ case 482: /* server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG */
+#line 2118 "util/configparser.y"
{
OUTYY(("P(server_zonemd_permissive_mode:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5105,11 +5144,11 @@ yyreduce:
else cfg_parser->cfg->zonemd_permissive_mode = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5109 "util/configparser.c"
+#line 5148 "util/configparser.c"
break;
- case 476: /* server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG */
-#line 2117 "util/configparser.y"
+ case 483: /* server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG */
+#line 2127 "util/configparser.y"
{
OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5117,11 +5156,11 @@ yyreduce:
else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5121 "util/configparser.c"
+#line 5160 "util/configparser.c"
break;
- case 477: /* server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG */
-#line 2126 "util/configparser.y"
+ case 484: /* server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG */
+#line 2136 "util/configparser.y"
{
OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5129,11 +5168,11 @@ yyreduce:
else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5133 "util/configparser.c"
+#line 5172 "util/configparser.c"
break;
- case 478: /* server_keep_missing: VAR_KEEP_MISSING STRING_ARG */
-#line 2135 "util/configparser.y"
+ case 485: /* server_keep_missing: VAR_KEEP_MISSING STRING_ARG */
+#line 2145 "util/configparser.y"
{
OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5141,11 +5180,11 @@ yyreduce:
else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5145 "util/configparser.c"
+#line 5184 "util/configparser.c"
break;
- case 479: /* server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG */
-#line 2144 "util/configparser.y"
+ case 486: /* server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG */
+#line 2154 "util/configparser.y"
{
OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5154,22 +5193,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5158 "util/configparser.c"
+#line 5197 "util/configparser.c"
break;
- case 480: /* server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG */
-#line 2153 "util/configparser.y"
+ case 487: /* server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG */
+#line 2163 "util/configparser.y"
{
OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->key_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 5169 "util/configparser.c"
+#line 5208 "util/configparser.c"
break;
- case 481: /* server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG */
-#line 2161 "util/configparser.y"
+ case 488: /* server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG */
+#line 2171 "util/configparser.y"
{
OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -5181,22 +5220,22 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5185 "util/configparser.c"
+#line 5224 "util/configparser.c"
break;
- case 482: /* server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG */
-#line 2174 "util/configparser.y"
+ case 489: /* server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG */
+#line 2184 "util/configparser.y"
{
OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->neg_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 5196 "util/configparser.c"
+#line 5235 "util/configparser.c"
break;
- case 483: /* server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */
-#line 2182 "util/configparser.y"
+ case 490: /* server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */
+#line 2192 "util/configparser.y"
{
OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
@@ -5250,21 +5289,21 @@ yyreduce:
fatal_exit("out of memory adding local-zone");
}
}
-#line 5254 "util/configparser.c"
+#line 5293 "util/configparser.c"
break;
- case 484: /* server_local_data: VAR_LOCAL_DATA STRING_ARG */
-#line 2237 "util/configparser.y"
+ case 491: /* server_local_data: VAR_LOCAL_DATA STRING_ARG */
+#line 2247 "util/configparser.y"
{
OUTYY(("P(server_local_data:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[0].str)))
fatal_exit("out of memory adding local-data");
}
-#line 5264 "util/configparser.c"
+#line 5303 "util/configparser.c"
break;
- case 485: /* server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */
-#line 2244 "util/configparser.y"
+ case 492: /* server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */
+#line 2254 "util/configparser.y"
{
char* ptr;
OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -5278,11 +5317,11 @@ yyreduce:
yyerror("local-data-ptr could not be reversed");
}
}
-#line 5282 "util/configparser.c"
+#line 5321 "util/configparser.c"
break;
- case 486: /* server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG */
-#line 2259 "util/configparser.y"
+ case 493: /* server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG */
+#line 2269 "util/configparser.y"
{
OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5291,11 +5330,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5295 "util/configparser.c"
+#line 5334 "util/configparser.c"
break;
- case 487: /* server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG */
-#line 2269 "util/configparser.y"
+ case 494: /* server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG */
+#line 2279 "util/configparser.y"
{
OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5304,41 +5343,41 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5308 "util/configparser.c"
+#line 5347 "util/configparser.c"
break;
- case 488: /* server_unknown_server_time_limit: VAR_UNKNOWN_SERVER_TIME_LIMIT STRING_ARG */
-#line 2279 "util/configparser.y"
+ case 495: /* server_unknown_server_time_limit: VAR_UNKNOWN_SERVER_TIME_LIMIT STRING_ARG */
+#line 2289 "util/configparser.y"
{
OUTYY(("P(server_unknown_server_time_limit:%s)\n", (yyvsp[0].str)));
cfg_parser->cfg->unknown_server_time_limit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5318 "util/configparser.c"
+#line 5357 "util/configparser.c"
break;
- case 489: /* server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG */
-#line 2286 "util/configparser.y"
+ case 496: /* server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG */
+#line 2296 "util/configparser.y"
{
OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[0].str)));
cfg_parser->cfg->max_udp_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5328 "util/configparser.c"
+#line 5367 "util/configparser.c"
break;
- case 490: /* server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG */
-#line 2293 "util/configparser.y"
+ case 497: /* server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG */
+#line 2303 "util/configparser.y"
{
OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dns64_prefix);
cfg_parser->cfg->dns64_prefix = (yyvsp[0].str);
}
-#line 5338 "util/configparser.c"
+#line 5377 "util/configparser.c"
break;
- case 491: /* server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG */
-#line 2300 "util/configparser.y"
+ case 498: /* server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG */
+#line 2310 "util/configparser.y"
{
OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5346,22 +5385,22 @@ yyreduce:
else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5350 "util/configparser.c"
+#line 5389 "util/configparser.c"
break;
- case 492: /* server_dns64_ignore_aaaa: VAR_DNS64_IGNORE_AAAA STRING_ARG */
-#line 2309 "util/configparser.y"
+ case 499: /* server_dns64_ignore_aaaa: VAR_DNS64_IGNORE_AAAA STRING_ARG */
+#line 2319 "util/configparser.y"
{
OUTYY(("P(dns64_ignore_aaaa:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa,
(yyvsp[0].str)))
fatal_exit("out of memory adding dns64-ignore-aaaa");
}
-#line 5361 "util/configparser.c"
+#line 5400 "util/configparser.c"
break;
- case 493: /* server_define_tag: VAR_DEFINE_TAG STRING_ARG */
-#line 2317 "util/configparser.y"
+ case 500: /* server_define_tag: VAR_DEFINE_TAG STRING_ARG */
+#line 2327 "util/configparser.y"
{
char* p, *s = (yyvsp[0].str);
OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str)));
@@ -5374,11 +5413,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5378 "util/configparser.c"
+#line 5417 "util/configparser.c"
break;
- case 494: /* server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG */
-#line 2331 "util/configparser.y"
+ case 501: /* server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG */
+#line 2341 "util/configparser.y"
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -5398,11 +5437,11 @@ yyreduce:
}
}
}
-#line 5402 "util/configparser.c"
+#line 5441 "util/configparser.c"
break;
- case 495: /* server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG */
-#line 2352 "util/configparser.y"
+ case 502: /* server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG */
+#line 2362 "util/configparser.y"
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -5422,11 +5461,11 @@ yyreduce:
}
}
}
-#line 5426 "util/configparser.c"
+#line 5465 "util/configparser.c"
break;
- case 496: /* server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */
-#line 2373 "util/configparser.y"
+ case 503: /* server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */
+#line 2383 "util/configparser.y"
{
OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
@@ -5437,11 +5476,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 5441 "util/configparser.c"
+#line 5480 "util/configparser.c"
break;
- case 497: /* server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */
-#line 2385 "util/configparser.y"
+ case 504: /* server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */
+#line 2395 "util/configparser.y"
{
OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
@@ -5452,11 +5491,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 5456 "util/configparser.c"
+#line 5495 "util/configparser.c"
break;
- case 498: /* server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG */
-#line 2397 "util/configparser.y"
+ case 505: /* server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG */
+#line 2407 "util/configparser.y"
{
OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
@@ -5467,11 +5506,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 5471 "util/configparser.c"
+#line 5510 "util/configparser.c"
break;
- case 499: /* server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG */
-#line 2409 "util/configparser.y"
+ case 506: /* server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG */
+#line 2419 "util/configparser.y"
{
OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
@@ -5479,11 +5518,77 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 5483 "util/configparser.c"
+#line 5522 "util/configparser.c"
break;
- case 500: /* server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG */
-#line 2418 "util/configparser.y"
+ case 507: /* server_interface_tag: VAR_INTERFACE_TAG STRING_ARG STRING_ARG */
+#line 2428 "util/configparser.y"
+ {
+ size_t len = 0;
+ uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
+ &len);
+ free((yyvsp[0].str));
+ OUTYY(("P(server_interface_tag:%s)\n", (yyvsp[-1].str)));
+ if(!bitlist) {
+ yyerror("could not parse tags, (define-tag them first)");
+ free((yyvsp[-1].str));
+ }
+ if(bitlist) {
+ if(!cfg_strbytelist_insert(
+ &cfg_parser->cfg->interface_tags,
+ (yyvsp[-1].str), bitlist, len)) {
+ yyerror("out of memory");
+ free((yyvsp[-1].str));
+ }
+ }
+ }
+#line 5546 "util/configparser.c"
+ break;
+
+ case 508: /* server_interface_tag_action: VAR_INTERFACE_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */
+#line 2449 "util/configparser.y"
+ {
+ OUTYY(("P(server_interface_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
+ if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_actions,
+ (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))) {
+ yyerror("out of memory");
+ free((yyvsp[-2].str));
+ free((yyvsp[-1].str));
+ free((yyvsp[0].str));
+ }
+ }
+#line 5561 "util/configparser.c"
+ break;
+
+ case 509: /* server_interface_tag_data: VAR_INTERFACE_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */
+#line 2461 "util/configparser.y"
+ {
+ OUTYY(("P(server_interface_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
+ if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_datas,
+ (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))) {
+ yyerror("out of memory");
+ free((yyvsp[-2].str));
+ free((yyvsp[-1].str));
+ free((yyvsp[0].str));
+ }
+ }
+#line 5576 "util/configparser.c"
+ break;
+
+ case 510: /* server_interface_view: VAR_INTERFACE_VIEW STRING_ARG STRING_ARG */
+#line 2473 "util/configparser.y"
+ {
+ OUTYY(("P(server_interface_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
+ if(!cfg_str2list_insert(&cfg_parser->cfg->interface_view,
+ (yyvsp[-1].str), (yyvsp[0].str))) {
+ yyerror("out of memory");
+ }
+ }
+#line 5588 "util/configparser.c"
+ break;
+
+ case 511: /* server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG */
+#line 2482 "util/configparser.y"
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -5503,11 +5608,11 @@ yyreduce:
}
}
}
-#line 5507 "util/configparser.c"
+#line 5612 "util/configparser.c"
break;
- case 501: /* server_ip_ratelimit: VAR_IP_RATELIMIT STRING_ARG */
-#line 2439 "util/configparser.y"
+ case 512: /* server_ip_ratelimit: VAR_IP_RATELIMIT STRING_ARG */
+#line 2503 "util/configparser.y"
{
OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5515,11 +5620,11 @@ yyreduce:
else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5519 "util/configparser.c"
+#line 5624 "util/configparser.c"
break;
- case 502: /* server_ratelimit: VAR_RATELIMIT STRING_ARG */
-#line 2448 "util/configparser.y"
+ case 513: /* server_ratelimit: VAR_RATELIMIT STRING_ARG */
+#line 2512 "util/configparser.y"
{
OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5527,33 +5632,33 @@ yyreduce:
else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5531 "util/configparser.c"
+#line 5636 "util/configparser.c"
break;
- case 503: /* server_ip_ratelimit_size: VAR_IP_RATELIMIT_SIZE STRING_ARG */
-#line 2457 "util/configparser.y"
+ case 514: /* server_ip_ratelimit_size: VAR_IP_RATELIMIT_SIZE STRING_ARG */
+#line 2521 "util/configparser.y"
{
OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ip_ratelimit_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 5542 "util/configparser.c"
+#line 5647 "util/configparser.c"
break;
- case 504: /* server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG */
-#line 2465 "util/configparser.y"
+ case 515: /* server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG */
+#line 2529 "util/configparser.y"
{
OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ratelimit_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 5553 "util/configparser.c"
+#line 5658 "util/configparser.c"
break;
- case 505: /* server_ip_ratelimit_slabs: VAR_IP_RATELIMIT_SLABS STRING_ARG */
-#line 2473 "util/configparser.y"
+ case 516: /* server_ip_ratelimit_slabs: VAR_IP_RATELIMIT_SLABS STRING_ARG */
+#line 2537 "util/configparser.y"
{
OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -5565,11 +5670,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5569 "util/configparser.c"
+#line 5674 "util/configparser.c"
break;
- case 506: /* server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG */
-#line 2486 "util/configparser.y"
+ case 517: /* server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG */
+#line 2550 "util/configparser.y"
{
OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -5581,11 +5686,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5585 "util/configparser.c"
+#line 5690 "util/configparser.c"
break;
- case 507: /* server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG */
-#line 2499 "util/configparser.y"
+ case 518: /* server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG */
+#line 2563 "util/configparser.y"
{
OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
@@ -5599,11 +5704,11 @@ yyreduce:
"ratelimit-for-domain");
}
}
-#line 5603 "util/configparser.c"
+#line 5708 "util/configparser.c"
break;
- case 508: /* server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG */
-#line 2514 "util/configparser.y"
+ case 519: /* server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG */
+#line 2578 "util/configparser.y"
{
OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
@@ -5617,11 +5722,11 @@ yyreduce:
"ratelimit-below-domain");
}
}
-#line 5621 "util/configparser.c"
+#line 5726 "util/configparser.c"
break;
- case 509: /* server_ip_ratelimit_factor: VAR_IP_RATELIMIT_FACTOR STRING_ARG */
-#line 2529 "util/configparser.y"
+ case 520: /* server_ip_ratelimit_factor: VAR_IP_RATELIMIT_FACTOR STRING_ARG */
+#line 2593 "util/configparser.y"
{
OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5629,11 +5734,11 @@ yyreduce:
else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5633 "util/configparser.c"
+#line 5738 "util/configparser.c"
break;
- case 510: /* server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG */
-#line 2538 "util/configparser.y"
+ case 521: /* server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG */
+#line 2602 "util/configparser.y"
{
OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5641,11 +5746,11 @@ yyreduce:
else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5645 "util/configparser.c"
+#line 5750 "util/configparser.c"
break;
- case 511: /* server_ip_ratelimit_backoff: VAR_IP_RATELIMIT_BACKOFF STRING_ARG */
-#line 2547 "util/configparser.y"
+ case 522: /* server_ip_ratelimit_backoff: VAR_IP_RATELIMIT_BACKOFF STRING_ARG */
+#line 2611 "util/configparser.y"
{
OUTYY(("P(server_ip_ratelimit_backoff:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5654,11 +5759,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5658 "util/configparser.c"
+#line 5763 "util/configparser.c"
break;
- case 512: /* server_ratelimit_backoff: VAR_RATELIMIT_BACKOFF STRING_ARG */
-#line 2557 "util/configparser.y"
+ case 523: /* server_ratelimit_backoff: VAR_RATELIMIT_BACKOFF STRING_ARG */
+#line 2621 "util/configparser.y"
{
OUTYY(("P(server_ratelimit_backoff:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5667,11 +5772,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5671 "util/configparser.c"
+#line 5776 "util/configparser.c"
break;
- case 513: /* server_outbound_msg_retry: VAR_OUTBOUND_MSG_RETRY STRING_ARG */
-#line 2567 "util/configparser.y"
+ case 524: /* server_outbound_msg_retry: VAR_OUTBOUND_MSG_RETRY STRING_ARG */
+#line 2631 "util/configparser.y"
{
OUTYY(("P(server_outbound_msg_retry:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5679,20 +5784,20 @@ yyreduce:
else cfg_parser->cfg->outbound_msg_retry = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5683 "util/configparser.c"
+#line 5788 "util/configparser.c"
break;
- case 514: /* server_low_rtt: VAR_LOW_RTT STRING_ARG */
-#line 2576 "util/configparser.y"
+ case 525: /* server_low_rtt: VAR_LOW_RTT STRING_ARG */
+#line 2640 "util/configparser.y"
{
OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n"));
free((yyvsp[0].str));
}
-#line 5692 "util/configparser.c"
+#line 5797 "util/configparser.c"
break;
- case 515: /* server_fast_server_num: VAR_FAST_SERVER_NUM STRING_ARG */
-#line 2582 "util/configparser.y"
+ case 526: /* server_fast_server_num: VAR_FAST_SERVER_NUM STRING_ARG */
+#line 2646 "util/configparser.y"
{
OUTYY(("P(server_fast_server_num:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) <= 0)
@@ -5700,11 +5805,11 @@ yyreduce:
else cfg_parser->cfg->fast_server_num = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5704 "util/configparser.c"
+#line 5809 "util/configparser.c"
break;
- case 516: /* server_fast_server_permil: VAR_FAST_SERVER_PERMIL STRING_ARG */
-#line 2591 "util/configparser.y"
+ case 527: /* server_fast_server_permil: VAR_FAST_SERVER_PERMIL STRING_ARG */
+#line 2655 "util/configparser.y"
{
OUTYY(("P(server_fast_server_permil:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5712,11 +5817,11 @@ yyreduce:
else cfg_parser->cfg->fast_server_permil = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5716 "util/configparser.c"
+#line 5821 "util/configparser.c"
break;
- case 517: /* server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG */
-#line 2600 "util/configparser.y"
+ case 528: /* server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG */
+#line 2664 "util/configparser.y"
{
OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5725,11 +5830,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5729 "util/configparser.c"
+#line 5834 "util/configparser.c"
break;
- case 518: /* server_qname_minimisation_strict: VAR_QNAME_MINIMISATION_STRICT STRING_ARG */
-#line 2610 "util/configparser.y"
+ case 529: /* server_qname_minimisation_strict: VAR_QNAME_MINIMISATION_STRICT STRING_ARG */
+#line 2674 "util/configparser.y"
{
OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5738,11 +5843,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5742 "util/configparser.c"
+#line 5847 "util/configparser.c"
break;
- case 519: /* server_pad_responses: VAR_PAD_RESPONSES STRING_ARG */
-#line 2620 "util/configparser.y"
+ case 530: /* server_pad_responses: VAR_PAD_RESPONSES STRING_ARG */
+#line 2684 "util/configparser.y"
{
OUTYY(("P(server_pad_responses:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5751,11 +5856,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5755 "util/configparser.c"
+#line 5860 "util/configparser.c"
break;
- case 520: /* server_pad_responses_block_size: VAR_PAD_RESPONSES_BLOCK_SIZE STRING_ARG */
-#line 2630 "util/configparser.y"
+ case 531: /* server_pad_responses_block_size: VAR_PAD_RESPONSES_BLOCK_SIZE STRING_ARG */
+#line 2694 "util/configparser.y"
{
OUTYY(("P(server_pad_responses_block_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -5763,11 +5868,11 @@ yyreduce:
else cfg_parser->cfg->pad_responses_block_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5767 "util/configparser.c"
+#line 5872 "util/configparser.c"
break;
- case 521: /* server_pad_queries: VAR_PAD_QUERIES STRING_ARG */
-#line 2639 "util/configparser.y"
+ case 532: /* server_pad_queries: VAR_PAD_QUERIES STRING_ARG */
+#line 2703 "util/configparser.y"
{
OUTYY(("P(server_pad_queries:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5776,11 +5881,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5780 "util/configparser.c"
+#line 5885 "util/configparser.c"
break;
- case 522: /* server_pad_queries_block_size: VAR_PAD_QUERIES_BLOCK_SIZE STRING_ARG */
-#line 2649 "util/configparser.y"
+ case 533: /* server_pad_queries_block_size: VAR_PAD_QUERIES_BLOCK_SIZE STRING_ARG */
+#line 2713 "util/configparser.y"
{
OUTYY(("P(server_pad_queries_block_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -5788,11 +5893,11 @@ yyreduce:
else cfg_parser->cfg->pad_queries_block_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5792 "util/configparser.c"
+#line 5897 "util/configparser.c"
break;
- case 523: /* server_ipsecmod_enabled: VAR_IPSECMOD_ENABLED STRING_ARG */
-#line 2658 "util/configparser.y"
+ case 534: /* server_ipsecmod_enabled: VAR_IPSECMOD_ENABLED STRING_ARG */
+#line 2722 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str)));
@@ -5804,11 +5909,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 5808 "util/configparser.c"
+#line 5913 "util/configparser.c"
break;
- case 524: /* server_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG */
-#line 2671 "util/configparser.y"
+ case 535: /* server_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG */
+#line 2735 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str)));
@@ -5820,11 +5925,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 5824 "util/configparser.c"
+#line 5929 "util/configparser.c"
break;
- case 525: /* server_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG */
-#line 2684 "util/configparser.y"
+ case 536: /* server_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG */
+#line 2748 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str)));
@@ -5835,11 +5940,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 5839 "util/configparser.c"
+#line 5944 "util/configparser.c"
break;
- case 526: /* server_ipsecmod_max_ttl: VAR_IPSECMOD_MAX_TTL STRING_ARG */
-#line 2696 "util/configparser.y"
+ case 537: /* server_ipsecmod_max_ttl: VAR_IPSECMOD_MAX_TTL STRING_ARG */
+#line 2760 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str)));
@@ -5852,11 +5957,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 5856 "util/configparser.c"
+#line 5961 "util/configparser.c"
break;
- case 527: /* server_ipsecmod_whitelist: VAR_IPSECMOD_WHITELIST STRING_ARG */
-#line 2710 "util/configparser.y"
+ case 538: /* server_ipsecmod_whitelist: VAR_IPSECMOD_WHITELIST STRING_ARG */
+#line 2774 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str)));
@@ -5867,11 +5972,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 5871 "util/configparser.c"
+#line 5976 "util/configparser.c"
break;
- case 528: /* server_ipsecmod_strict: VAR_IPSECMOD_STRICT STRING_ARG */
-#line 2722 "util/configparser.y"
+ case 539: /* server_ipsecmod_strict: VAR_IPSECMOD_STRICT STRING_ARG */
+#line 2786 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str)));
@@ -5884,11 +5989,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 5888 "util/configparser.c"
+#line 5993 "util/configparser.c"
break;
- case 529: /* server_edns_client_string: VAR_EDNS_CLIENT_STRING STRING_ARG STRING_ARG */
-#line 2736 "util/configparser.y"
+ case 540: /* server_edns_client_string: VAR_EDNS_CLIENT_STRING STRING_ARG STRING_ARG */
+#line 2800 "util/configparser.y"
{
OUTYY(("P(server_edns_client_string:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str2list_insert(
@@ -5896,11 +6001,11 @@ yyreduce:
fatal_exit("out of memory adding "
"edns-client-string");
}
-#line 5900 "util/configparser.c"
+#line 6005 "util/configparser.c"
break;
- case 530: /* server_edns_client_string_opcode: VAR_EDNS_CLIENT_STRING_OPCODE STRING_ARG */
-#line 2745 "util/configparser.y"
+ case 541: /* server_edns_client_string_opcode: VAR_EDNS_CLIENT_STRING_OPCODE STRING_ARG */
+#line 2809 "util/configparser.y"
{
OUTYY(("P(edns_client_string_opcode:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5910,11 +6015,11 @@ yyreduce:
else cfg_parser->cfg->edns_client_string_opcode = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5914 "util/configparser.c"
+#line 6019 "util/configparser.c"
break;
- case 531: /* server_ede: VAR_EDE STRING_ARG */
-#line 2756 "util/configparser.y"
+ case 542: /* server_ede: VAR_EDE STRING_ARG */
+#line 2820 "util/configparser.y"
{
OUTYY(("P(server_ede:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5922,11 +6027,21 @@ yyreduce:
else cfg_parser->cfg->ede = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5926 "util/configparser.c"
+#line 6031 "util/configparser.c"
break;
- case 532: /* stub_name: VAR_NAME STRING_ARG */
-#line 2765 "util/configparser.y"
+ case 543: /* server_proxy_protocol_port: VAR_PROXY_PROTOCOL_PORT STRING_ARG */
+#line 2829 "util/configparser.y"
+ {
+ OUTYY(("P(server_proxy_protocol_port:%s)\n", (yyvsp[0].str)));
+ if(!cfg_strlist_insert(&cfg_parser->cfg->proxy_protocol_port, (yyvsp[0].str)))
+ yyerror("out of memory");
+ }
+#line 6041 "util/configparser.c"
+ break;
+
+ case 544: /* stub_name: VAR_NAME STRING_ARG */
+#line 2836 "util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->stubs->name)
@@ -5935,31 +6050,31 @@ yyreduce:
free(cfg_parser->cfg->stubs->name);
cfg_parser->cfg->stubs->name = (yyvsp[0].str);
}
-#line 5939 "util/configparser.c"
+#line 6054 "util/configparser.c"
break;
- case 533: /* stub_host: VAR_STUB_HOST STRING_ARG */
-#line 2775 "util/configparser.y"
+ case 545: /* stub_host: VAR_STUB_HOST STRING_ARG */
+#line 2846 "util/configparser.y"
{
OUTYY(("P(stub-host:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 5949 "util/configparser.c"
+#line 6064 "util/configparser.c"
break;
- case 534: /* stub_addr: VAR_STUB_ADDR STRING_ARG */
-#line 2782 "util/configparser.y"
+ case 546: /* stub_addr: VAR_STUB_ADDR STRING_ARG */
+#line 2853 "util/configparser.y"
{
OUTYY(("P(stub-addr:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 5959 "util/configparser.c"
+#line 6074 "util/configparser.c"
break;
- case 535: /* stub_first: VAR_STUB_FIRST STRING_ARG */
-#line 2789 "util/configparser.y"
+ case 547: /* stub_first: VAR_STUB_FIRST STRING_ARG */
+#line 2860 "util/configparser.y"
{
OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5967,11 +6082,11 @@ yyreduce:
else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5971 "util/configparser.c"
+#line 6086 "util/configparser.c"
break;
- case 536: /* stub_no_cache: VAR_STUB_NO_CACHE STRING_ARG */
-#line 2798 "util/configparser.y"
+ case 548: /* stub_no_cache: VAR_STUB_NO_CACHE STRING_ARG */
+#line 2869 "util/configparser.y"
{
OUTYY(("P(stub-no-cache:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5979,11 +6094,11 @@ yyreduce:
else cfg_parser->cfg->stubs->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5983 "util/configparser.c"
+#line 6098 "util/configparser.c"
break;
- case 537: /* stub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG */
-#line 2807 "util/configparser.y"
+ case 549: /* stub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG */
+#line 2878 "util/configparser.y"
{
OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5992,11 +6107,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5996 "util/configparser.c"
+#line 6111 "util/configparser.c"
break;
- case 538: /* stub_tcp_upstream: VAR_STUB_TCP_UPSTREAM STRING_ARG */
-#line 2817 "util/configparser.y"
+ case 550: /* stub_tcp_upstream: VAR_STUB_TCP_UPSTREAM STRING_ARG */
+#line 2888 "util/configparser.y"
{
OUTYY(("P(stub-tcp-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6005,11 +6120,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6009 "util/configparser.c"
+#line 6124 "util/configparser.c"
break;
- case 539: /* stub_prime: VAR_STUB_PRIME STRING_ARG */
-#line 2827 "util/configparser.y"
+ case 551: /* stub_prime: VAR_STUB_PRIME STRING_ARG */
+#line 2898 "util/configparser.y"
{
OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6018,11 +6133,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6022 "util/configparser.c"
+#line 6137 "util/configparser.c"
break;
- case 540: /* forward_name: VAR_NAME STRING_ARG */
-#line 2837 "util/configparser.y"
+ case 552: /* forward_name: VAR_NAME STRING_ARG */
+#line 2908 "util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->forwards->name)
@@ -6031,31 +6146,31 @@ yyreduce:
free(cfg_parser->cfg->forwards->name);
cfg_parser->cfg->forwards->name = (yyvsp[0].str);
}
-#line 6035 "util/configparser.c"
+#line 6150 "util/configparser.c"
break;
- case 541: /* forward_host: VAR_FORWARD_HOST STRING_ARG */
-#line 2847 "util/configparser.y"
+ case 553: /* forward_host: VAR_FORWARD_HOST STRING_ARG */
+#line 2918 "util/configparser.y"
{
OUTYY(("P(forward-host:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 6045 "util/configparser.c"
+#line 6160 "util/configparser.c"
break;
- case 542: /* forward_addr: VAR_FORWARD_ADDR STRING_ARG */
-#line 2854 "util/configparser.y"
+ case 554: /* forward_addr: VAR_FORWARD_ADDR STRING_ARG */
+#line 2925 "util/configparser.y"
{
OUTYY(("P(forward-addr:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 6055 "util/configparser.c"
+#line 6170 "util/configparser.c"
break;
- case 543: /* forward_first: VAR_FORWARD_FIRST STRING_ARG */
-#line 2861 "util/configparser.y"
+ case 555: /* forward_first: VAR_FORWARD_FIRST STRING_ARG */
+#line 2932 "util/configparser.y"
{
OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6063,11 +6178,11 @@ yyreduce:
else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6067 "util/configparser.c"
+#line 6182 "util/configparser.c"
break;
- case 544: /* forward_no_cache: VAR_FORWARD_NO_CACHE STRING_ARG */
-#line 2870 "util/configparser.y"
+ case 556: /* forward_no_cache: VAR_FORWARD_NO_CACHE STRING_ARG */
+#line 2941 "util/configparser.y"
{
OUTYY(("P(forward-no-cache:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6075,11 +6190,11 @@ yyreduce:
else cfg_parser->cfg->forwards->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6079 "util/configparser.c"
+#line 6194 "util/configparser.c"
break;
- case 545: /* forward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG */
-#line 2879 "util/configparser.y"
+ case 557: /* forward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG */
+#line 2950 "util/configparser.y"
{
OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6088,11 +6203,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6092 "util/configparser.c"
+#line 6207 "util/configparser.c"
break;
- case 546: /* forward_tcp_upstream: VAR_FORWARD_TCP_UPSTREAM STRING_ARG */
-#line 2889 "util/configparser.y"
+ case 558: /* forward_tcp_upstream: VAR_FORWARD_TCP_UPSTREAM STRING_ARG */
+#line 2960 "util/configparser.y"
{
OUTYY(("P(forward-tcp-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6101,11 +6216,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6105 "util/configparser.c"
+#line 6220 "util/configparser.c"
break;
- case 547: /* auth_name: VAR_NAME STRING_ARG */
-#line 2899 "util/configparser.y"
+ case 559: /* auth_name: VAR_NAME STRING_ARG */
+#line 2970 "util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->auths->name)
@@ -6114,52 +6229,52 @@ yyreduce:
free(cfg_parser->cfg->auths->name);
cfg_parser->cfg->auths->name = (yyvsp[0].str);
}
-#line 6118 "util/configparser.c"
+#line 6233 "util/configparser.c"
break;
- case 548: /* auth_zonefile: VAR_ZONEFILE STRING_ARG */
-#line 2909 "util/configparser.y"
+ case 560: /* auth_zonefile: VAR_ZONEFILE STRING_ARG */
+#line 2980 "util/configparser.y"
{
OUTYY(("P(zonefile:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->auths->zonefile);
cfg_parser->cfg->auths->zonefile = (yyvsp[0].str);
}
-#line 6128 "util/configparser.c"
+#line 6243 "util/configparser.c"
break;
- case 549: /* auth_master: VAR_MASTER STRING_ARG */
-#line 2916 "util/configparser.y"
+ case 561: /* auth_master: VAR_MASTER STRING_ARG */
+#line 2987 "util/configparser.y"
{
OUTYY(("P(master:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 6138 "util/configparser.c"
+#line 6253 "util/configparser.c"
break;
- case 550: /* auth_url: VAR_URL STRING_ARG */
-#line 2923 "util/configparser.y"
+ case 562: /* auth_url: VAR_URL STRING_ARG */
+#line 2994 "util/configparser.y"
{
OUTYY(("P(url:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 6148 "util/configparser.c"
+#line 6263 "util/configparser.c"
break;
- case 551: /* auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG */
-#line 2930 "util/configparser.y"
+ case 563: /* auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG */
+#line 3001 "util/configparser.y"
{
OUTYY(("P(allow-notify:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify,
(yyvsp[0].str)))
yyerror("out of memory");
}
-#line 6159 "util/configparser.c"
+#line 6274 "util/configparser.c"
break;
- case 552: /* auth_zonemd_check: VAR_ZONEMD_CHECK STRING_ARG */
-#line 2938 "util/configparser.y"
+ case 564: /* auth_zonemd_check: VAR_ZONEMD_CHECK STRING_ARG */
+#line 3009 "util/configparser.y"
{
OUTYY(("P(zonemd-check:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6168,11 +6283,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6172 "util/configparser.c"
+#line 6287 "util/configparser.c"
break;
- case 553: /* auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG */
-#line 2948 "util/configparser.y"
+ case 565: /* auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG */
+#line 3019 "util/configparser.y"
{
OUTYY(("P(zonemd-reject-absence:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6181,11 +6296,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6185 "util/configparser.c"
+#line 6300 "util/configparser.c"
break;
- case 554: /* auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG */
-#line 2958 "util/configparser.y"
+ case 566: /* auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG */
+#line 3029 "util/configparser.y"
{
OUTYY(("P(for-downstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6194,11 +6309,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6198 "util/configparser.c"
+#line 6313 "util/configparser.c"
break;
- case 555: /* auth_for_upstream: VAR_FOR_UPSTREAM STRING_ARG */
-#line 2968 "util/configparser.y"
+ case 567: /* auth_for_upstream: VAR_FOR_UPSTREAM STRING_ARG */
+#line 3039 "util/configparser.y"
{
OUTYY(("P(for-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6207,11 +6322,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6211 "util/configparser.c"
+#line 6326 "util/configparser.c"
break;
- case 556: /* auth_fallback_enabled: VAR_FALLBACK_ENABLED STRING_ARG */
-#line 2978 "util/configparser.y"
+ case 568: /* auth_fallback_enabled: VAR_FALLBACK_ENABLED STRING_ARG */
+#line 3049 "util/configparser.y"
{
OUTYY(("P(fallback-enabled:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6220,11 +6335,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6224 "util/configparser.c"
+#line 6339 "util/configparser.c"
break;
- case 557: /* view_name: VAR_NAME STRING_ARG */
-#line 2988 "util/configparser.y"
+ case 569: /* view_name: VAR_NAME STRING_ARG */
+#line 3059 "util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->views->name)
@@ -6233,11 +6348,11 @@ yyreduce:
free(cfg_parser->cfg->views->name);
cfg_parser->cfg->views->name = (yyvsp[0].str);
}
-#line 6237 "util/configparser.c"
+#line 6352 "util/configparser.c"
break;
- case 558: /* view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */
-#line 2998 "util/configparser.y"
+ case 570: /* view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */
+#line 3069 "util/configparser.y"
{
OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
@@ -6292,11 +6407,11 @@ yyreduce:
fatal_exit("out of memory adding local-zone");
}
}
-#line 6296 "util/configparser.c"
+#line 6411 "util/configparser.c"
break;
- case 559: /* view_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */
-#line 3054 "util/configparser.y"
+ case 571: /* view_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */
+#line 3125 "util/configparser.y"
{
OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
validate_respip_action((yyvsp[0].str));
@@ -6305,33 +6420,33 @@ yyreduce:
fatal_exit("out of memory adding per-view "
"response-ip action");
}
-#line 6309 "util/configparser.c"
+#line 6424 "util/configparser.c"
break;
- case 560: /* view_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */
-#line 3064 "util/configparser.y"
+ case 572: /* view_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */
+#line 3135 "util/configparser.y"
{
OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[-1].str)));
if(!cfg_str2list_insert(
&cfg_parser->cfg->views->respip_data, (yyvsp[-1].str), (yyvsp[0].str)))
fatal_exit("out of memory adding response-ip-data");
}
-#line 6320 "util/configparser.c"
+#line 6435 "util/configparser.c"
break;
- case 561: /* view_local_data: VAR_LOCAL_DATA STRING_ARG */
-#line 3072 "util/configparser.y"
+ case 573: /* view_local_data: VAR_LOCAL_DATA STRING_ARG */
+#line 3143 "util/configparser.y"
{
OUTYY(("P(view_local_data:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, (yyvsp[0].str))) {
fatal_exit("out of memory adding local-data");
}
}
-#line 6331 "util/configparser.c"
+#line 6446 "util/configparser.c"
break;
- case 562: /* view_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */
-#line 3080 "util/configparser.y"
+ case 574: /* view_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */
+#line 3151 "util/configparser.y"
{
char* ptr;
OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -6345,11 +6460,11 @@ yyreduce:
yyerror("local-data-ptr could not be reversed");
}
}
-#line 6349 "util/configparser.c"
+#line 6464 "util/configparser.c"
break;
- case 563: /* view_first: VAR_VIEW_FIRST STRING_ARG */
-#line 3095 "util/configparser.y"
+ case 575: /* view_first: VAR_VIEW_FIRST STRING_ARG */
+#line 3166 "util/configparser.y"
{
OUTYY(("P(view-first:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6357,19 +6472,20 @@ yyreduce:
else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6361 "util/configparser.c"
+#line 6476 "util/configparser.c"
break;
- case 564: /* rcstart: VAR_REMOTE_CONTROL */
-#line 3104 "util/configparser.y"
+ case 576: /* rcstart: VAR_REMOTE_CONTROL */
+#line 3175 "util/configparser.y"
{
OUTYY(("\nP(remote-control:)\n"));
+ cfg_parser->started_toplevel = 1;
}
-#line 6369 "util/configparser.c"
+#line 6485 "util/configparser.c"
break;
- case 575: /* rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG */
-#line 3115 "util/configparser.y"
+ case 587: /* rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG */
+#line 3187 "util/configparser.y"
{
OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6378,11 +6494,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6382 "util/configparser.c"
+#line 6498 "util/configparser.c"
break;
- case 576: /* rc_control_port: VAR_CONTROL_PORT STRING_ARG */
-#line 3125 "util/configparser.y"
+ case 588: /* rc_control_port: VAR_CONTROL_PORT STRING_ARG */
+#line 3197 "util/configparser.y"
{
OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -6390,79 +6506,80 @@ yyreduce:
else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6394 "util/configparser.c"
+#line 6510 "util/configparser.c"
break;
- case 577: /* rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG */
-#line 3134 "util/configparser.y"
+ case 589: /* rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG */
+#line 3206 "util/configparser.y"
{
OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 6404 "util/configparser.c"
+#line 6520 "util/configparser.c"
break;
- case 578: /* rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG */
-#line 3141 "util/configparser.y"
+ case 590: /* rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG */
+#line 3213 "util/configparser.y"
{
OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str)));
cfg_parser->cfg->control_use_cert = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6414 "util/configparser.c"
+#line 6530 "util/configparser.c"
break;
- case 579: /* rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG */
-#line 3148 "util/configparser.y"
+ case 591: /* rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG */
+#line 3220 "util/configparser.y"
{
OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->server_key_file);
cfg_parser->cfg->server_key_file = (yyvsp[0].str);
}
-#line 6424 "util/configparser.c"
+#line 6540 "util/configparser.c"
break;
- case 580: /* rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG */
-#line 3155 "util/configparser.y"
+ case 592: /* rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG */
+#line 3227 "util/configparser.y"
{
OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->server_cert_file);
cfg_parser->cfg->server_cert_file = (yyvsp[0].str);
}
-#line 6434 "util/configparser.c"
+#line 6550 "util/configparser.c"
break;
- case 581: /* rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG */
-#line 3162 "util/configparser.y"
+ case 593: /* rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG */
+#line 3234 "util/configparser.y"
{
OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->control_key_file);
cfg_parser->cfg->control_key_file = (yyvsp[0].str);
}
-#line 6444 "util/configparser.c"
+#line 6560 "util/configparser.c"
break;
- case 582: /* rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG */
-#line 3169 "util/configparser.y"
+ case 594: /* rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG */
+#line 3241 "util/configparser.y"
{
OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->control_cert_file);
cfg_parser->cfg->control_cert_file = (yyvsp[0].str);
}
-#line 6454 "util/configparser.c"
+#line 6570 "util/configparser.c"
break;
- case 583: /* dtstart: VAR_DNSTAP */
-#line 3176 "util/configparser.y"
+ case 595: /* dtstart: VAR_DNSTAP */
+#line 3248 "util/configparser.y"
{
OUTYY(("\nP(dnstap:)\n"));
+ cfg_parser->started_toplevel = 1;
}
-#line 6462 "util/configparser.c"
+#line 6579 "util/configparser.c"
break;
- case 605: /* dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG */
-#line 3196 "util/configparser.y"
+ case 617: /* dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG */
+#line 3269 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6470,11 +6587,11 @@ yyreduce:
else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6474 "util/configparser.c"
+#line 6591 "util/configparser.c"
break;
- case 606: /* dt_dnstap_bidirectional: VAR_DNSTAP_BIDIRECTIONAL STRING_ARG */
-#line 3205 "util/configparser.y"
+ case 618: /* dt_dnstap_bidirectional: VAR_DNSTAP_BIDIRECTIONAL STRING_ARG */
+#line 3278 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_bidirectional:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6483,31 +6600,31 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6487 "util/configparser.c"
+#line 6604 "util/configparser.c"
break;
- case 607: /* dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG */
-#line 3215 "util/configparser.y"
+ case 619: /* dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG */
+#line 3288 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_socket_path);
cfg_parser->cfg->dnstap_socket_path = (yyvsp[0].str);
}
-#line 6497 "util/configparser.c"
+#line 6614 "util/configparser.c"
break;
- case 608: /* dt_dnstap_ip: VAR_DNSTAP_IP STRING_ARG */
-#line 3222 "util/configparser.y"
+ case 620: /* dt_dnstap_ip: VAR_DNSTAP_IP STRING_ARG */
+#line 3295 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_ip:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_ip);
cfg_parser->cfg->dnstap_ip = (yyvsp[0].str);
}
-#line 6507 "util/configparser.c"
+#line 6624 "util/configparser.c"
break;
- case 609: /* dt_dnstap_tls: VAR_DNSTAP_TLS STRING_ARG */
-#line 3229 "util/configparser.y"
+ case 621: /* dt_dnstap_tls: VAR_DNSTAP_TLS STRING_ARG */
+#line 3302 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_tls:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6515,51 +6632,51 @@ yyreduce:
else cfg_parser->cfg->dnstap_tls = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6519 "util/configparser.c"
+#line 6636 "util/configparser.c"
break;
- case 610: /* dt_dnstap_tls_server_name: VAR_DNSTAP_TLS_SERVER_NAME STRING_ARG */
-#line 3238 "util/configparser.y"
+ case 622: /* dt_dnstap_tls_server_name: VAR_DNSTAP_TLS_SERVER_NAME STRING_ARG */
+#line 3311 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_tls_server_name:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_tls_server_name);
cfg_parser->cfg->dnstap_tls_server_name = (yyvsp[0].str);
}
-#line 6529 "util/configparser.c"
+#line 6646 "util/configparser.c"
break;
- case 611: /* dt_dnstap_tls_cert_bundle: VAR_DNSTAP_TLS_CERT_BUNDLE STRING_ARG */
-#line 3245 "util/configparser.y"
+ case 623: /* dt_dnstap_tls_cert_bundle: VAR_DNSTAP_TLS_CERT_BUNDLE STRING_ARG */
+#line 3318 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_tls_cert_bundle:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_tls_cert_bundle);
cfg_parser->cfg->dnstap_tls_cert_bundle = (yyvsp[0].str);
}
-#line 6539 "util/configparser.c"
+#line 6656 "util/configparser.c"
break;
- case 612: /* dt_dnstap_tls_client_key_file: VAR_DNSTAP_TLS_CLIENT_KEY_FILE STRING_ARG */
-#line 3252 "util/configparser.y"
+ case 624: /* dt_dnstap_tls_client_key_file: VAR_DNSTAP_TLS_CLIENT_KEY_FILE STRING_ARG */
+#line 3325 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_tls_client_key_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_tls_client_key_file);
cfg_parser->cfg->dnstap_tls_client_key_file = (yyvsp[0].str);
}
-#line 6549 "util/configparser.c"
+#line 6666 "util/configparser.c"
break;
- case 613: /* dt_dnstap_tls_client_cert_file: VAR_DNSTAP_TLS_CLIENT_CERT_FILE STRING_ARG */
-#line 3259 "util/configparser.y"
+ case 625: /* dt_dnstap_tls_client_cert_file: VAR_DNSTAP_TLS_CLIENT_CERT_FILE STRING_ARG */
+#line 3332 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_tls_client_cert_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_tls_client_cert_file);
cfg_parser->cfg->dnstap_tls_client_cert_file = (yyvsp[0].str);
}
-#line 6559 "util/configparser.c"
+#line 6676 "util/configparser.c"
break;
- case 614: /* dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG */
-#line 3266 "util/configparser.y"
+ case 626: /* dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG */
+#line 3339 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6567,11 +6684,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6571 "util/configparser.c"
+#line 6688 "util/configparser.c"
break;
- case 615: /* dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG */
-#line 3275 "util/configparser.y"
+ case 627: /* dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG */
+#line 3348 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6579,31 +6696,31 @@ yyreduce:
else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6583 "util/configparser.c"
+#line 6700 "util/configparser.c"
break;
- case 616: /* dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG */
-#line 3284 "util/configparser.y"
+ case 628: /* dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG */
+#line 3357 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_identity);
cfg_parser->cfg->dnstap_identity = (yyvsp[0].str);
}
-#line 6593 "util/configparser.c"
+#line 6710 "util/configparser.c"
break;
- case 617: /* dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG */
-#line 3291 "util/configparser.y"
+ case 629: /* dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG */
+#line 3364 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_version);
cfg_parser->cfg->dnstap_version = (yyvsp[0].str);
}
-#line 6603 "util/configparser.c"
+#line 6720 "util/configparser.c"
break;
- case 618: /* dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG */
-#line 3298 "util/configparser.y"
+ case 630: /* dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG */
+#line 3371 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6612,11 +6729,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6616 "util/configparser.c"
+#line 6733 "util/configparser.c"
break;
- case 619: /* dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG */
-#line 3308 "util/configparser.y"
+ case 631: /* dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG */
+#line 3381 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6625,11 +6742,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6629 "util/configparser.c"
+#line 6746 "util/configparser.c"
break;
- case 620: /* dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG */
-#line 3318 "util/configparser.y"
+ case 632: /* dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG */
+#line 3391 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6638,11 +6755,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6642 "util/configparser.c"
+#line 6759 "util/configparser.c"
break;
- case 621: /* dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG */
-#line 3328 "util/configparser.y"
+ case 633: /* dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG */
+#line 3401 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6651,11 +6768,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6655 "util/configparser.c"
+#line 6772 "util/configparser.c"
break;
- case 622: /* dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG */
-#line 3338 "util/configparser.y"
+ case 634: /* dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG */
+#line 3411 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6664,11 +6781,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6668 "util/configparser.c"
+#line 6785 "util/configparser.c"
break;
- case 623: /* dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG */
-#line 3348 "util/configparser.y"
+ case 635: /* dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG */
+#line 3421 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6677,47 +6794,49 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6681 "util/configparser.c"
+#line 6798 "util/configparser.c"
break;
- case 624: /* pythonstart: VAR_PYTHON */
-#line 3358 "util/configparser.y"
+ case 636: /* pythonstart: VAR_PYTHON */
+#line 3431 "util/configparser.y"
{
OUTYY(("\nP(python:)\n"));
+ cfg_parser->started_toplevel = 1;
}
-#line 6689 "util/configparser.c"
+#line 6807 "util/configparser.c"
break;
- case 628: /* py_script: VAR_PYTHON_SCRIPT STRING_ARG */
-#line 3367 "util/configparser.y"
+ case 640: /* py_script: VAR_PYTHON_SCRIPT STRING_ARG */
+#line 3441 "util/configparser.y"
{
OUTYY(("P(python-script:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_append_ex(&cfg_parser->cfg->python_script, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 6699 "util/configparser.c"
+#line 6817 "util/configparser.c"
break;
- case 629: /* dynlibstart: VAR_DYNLIB */
-#line 3373 "util/configparser.y"
+ case 641: /* dynlibstart: VAR_DYNLIB */
+#line 3447 "util/configparser.y"
{
OUTYY(("\nP(dynlib:)\n"));
+ cfg_parser->started_toplevel = 1;
}
-#line 6707 "util/configparser.c"
+#line 6826 "util/configparser.c"
break;
- case 633: /* dl_file: VAR_DYNLIB_FILE STRING_ARG */
-#line 3382 "util/configparser.y"
+ case 645: /* dl_file: VAR_DYNLIB_FILE STRING_ARG */
+#line 3457 "util/configparser.y"
{
OUTYY(("P(dynlib-file:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_append_ex(&cfg_parser->cfg->dynlib_file, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 6717 "util/configparser.c"
+#line 6836 "util/configparser.c"
break;
- case 634: /* server_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG */
-#line 3388 "util/configparser.y"
+ case 646: /* server_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG */
+#line 3463 "util/configparser.y"
{
OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str)));
if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6726,21 +6845,21 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6730 "util/configparser.c"
+#line 6849 "util/configparser.c"
break;
- case 635: /* server_log_identity: VAR_LOG_IDENTITY STRING_ARG */
-#line 3398 "util/configparser.y"
+ case 647: /* server_log_identity: VAR_LOG_IDENTITY STRING_ARG */
+#line 3473 "util/configparser.y"
{
OUTYY(("P(server_log_identity:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->log_identity);
cfg_parser->cfg->log_identity = (yyvsp[0].str);
}
-#line 6740 "util/configparser.c"
+#line 6859 "util/configparser.c"
break;
- case 636: /* server_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */
-#line 3405 "util/configparser.y"
+ case 648: /* server_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */
+#line 3480 "util/configparser.y"
{
OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
validate_respip_action((yyvsp[0].str));
@@ -6748,30 +6867,31 @@ yyreduce:
(yyvsp[-1].str), (yyvsp[0].str)))
fatal_exit("out of memory adding response-ip");
}
-#line 6752 "util/configparser.c"
+#line 6871 "util/configparser.c"
break;
- case 637: /* server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */
-#line 3414 "util/configparser.y"
+ case 649: /* server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */
+#line 3489 "util/configparser.y"
{
OUTYY(("P(server_response_ip_data:%s)\n", (yyvsp[-1].str)));
if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
(yyvsp[-1].str), (yyvsp[0].str)))
fatal_exit("out of memory adding response-ip-data");
}
-#line 6763 "util/configparser.c"
+#line 6882 "util/configparser.c"
break;
- case 638: /* dnscstart: VAR_DNSCRYPT */
-#line 3422 "util/configparser.y"
+ case 650: /* dnscstart: VAR_DNSCRYPT */
+#line 3497 "util/configparser.y"
{
OUTYY(("\nP(dnscrypt:)\n"));
+ cfg_parser->started_toplevel = 1;
}
-#line 6771 "util/configparser.c"
+#line 6891 "util/configparser.c"
break;
- case 651: /* dnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG */
-#line 3438 "util/configparser.y"
+ case 663: /* dnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG */
+#line 3514 "util/configparser.y"
{
OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6779,11 +6899,11 @@ yyreduce:
else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6783 "util/configparser.c"
+#line 6903 "util/configparser.c"
break;
- case 652: /* dnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG */
-#line 3448 "util/configparser.y"
+ case 664: /* dnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG */
+#line 3524 "util/configparser.y"
{
OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -6791,21 +6911,21 @@ yyreduce:
else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6795 "util/configparser.c"
+#line 6915 "util/configparser.c"
break;
- case 653: /* dnsc_dnscrypt_provider: VAR_DNSCRYPT_PROVIDER STRING_ARG */
-#line 3457 "util/configparser.y"
+ case 665: /* dnsc_dnscrypt_provider: VAR_DNSCRYPT_PROVIDER STRING_ARG */
+#line 3533 "util/configparser.y"
{
OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnscrypt_provider);
cfg_parser->cfg->dnscrypt_provider = (yyvsp[0].str);
}
-#line 6805 "util/configparser.c"
+#line 6925 "util/configparser.c"
break;
- case 654: /* dnsc_dnscrypt_provider_cert: VAR_DNSCRYPT_PROVIDER_CERT STRING_ARG */
-#line 3464 "util/configparser.y"
+ case 666: /* dnsc_dnscrypt_provider_cert: VAR_DNSCRYPT_PROVIDER_CERT STRING_ARG */
+#line 3540 "util/configparser.y"
{
OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[0].str)));
if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
@@ -6813,21 +6933,21 @@ yyreduce:
if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
fatal_exit("out of memory adding dnscrypt-provider-cert");
}
-#line 6817 "util/configparser.c"
+#line 6937 "util/configparser.c"
break;
- case 655: /* dnsc_dnscrypt_provider_cert_rotated: VAR_DNSCRYPT_PROVIDER_CERT_ROTATED STRING_ARG */
-#line 3473 "util/configparser.y"
+ case 667: /* dnsc_dnscrypt_provider_cert_rotated: VAR_DNSCRYPT_PROVIDER_CERT_ROTATED STRING_ARG */
+#line 3549 "util/configparser.y"
{
OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, (yyvsp[0].str)))
fatal_exit("out of memory adding dnscrypt-provider-cert-rotated");
}
-#line 6827 "util/configparser.c"
+#line 6947 "util/configparser.c"
break;
- case 656: /* dnsc_dnscrypt_secret_key: VAR_DNSCRYPT_SECRET_KEY STRING_ARG */
-#line 3480 "util/configparser.y"
+ case 668: /* dnsc_dnscrypt_secret_key: VAR_DNSCRYPT_SECRET_KEY STRING_ARG */
+#line 3556 "util/configparser.y"
{
OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[0].str)));
if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
@@ -6835,22 +6955,22 @@ yyreduce:
if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
fatal_exit("out of memory adding dnscrypt-secret-key");
}
-#line 6839 "util/configparser.c"
+#line 6959 "util/configparser.c"
break;
- case 657: /* dnsc_dnscrypt_shared_secret_cache_size: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE STRING_ARG */
-#line 3489 "util/configparser.y"
+ case 669: /* dnsc_dnscrypt_shared_secret_cache_size: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE STRING_ARG */
+#line 3565 "util/configparser.y"
{
OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_shared_secret_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 6850 "util/configparser.c"
+#line 6970 "util/configparser.c"
break;
- case 658: /* dnsc_dnscrypt_shared_secret_cache_slabs: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS STRING_ARG */
-#line 3497 "util/configparser.y"
+ case 670: /* dnsc_dnscrypt_shared_secret_cache_slabs: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS STRING_ARG */
+#line 3573 "util/configparser.y"
{
OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -6862,22 +6982,22 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 6866 "util/configparser.c"
+#line 6986 "util/configparser.c"
break;
- case 659: /* dnsc_dnscrypt_nonce_cache_size: VAR_DNSCRYPT_NONCE_CACHE_SIZE STRING_ARG */
-#line 3510 "util/configparser.y"
+ case 671: /* dnsc_dnscrypt_nonce_cache_size: VAR_DNSCRYPT_NONCE_CACHE_SIZE STRING_ARG */
+#line 3586 "util/configparser.y"
{
OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_nonce_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 6877 "util/configparser.c"
+#line 6997 "util/configparser.c"
break;
- case 660: /* dnsc_dnscrypt_nonce_cache_slabs: VAR_DNSCRYPT_NONCE_CACHE_SLABS STRING_ARG */
-#line 3518 "util/configparser.y"
+ case 672: /* dnsc_dnscrypt_nonce_cache_slabs: VAR_DNSCRYPT_NONCE_CACHE_SLABS STRING_ARG */
+#line 3594 "util/configparser.y"
{
OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -6889,19 +7009,20 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 6893 "util/configparser.c"
+#line 7013 "util/configparser.c"
break;
- case 661: /* cachedbstart: VAR_CACHEDB */
-#line 3531 "util/configparser.y"
+ case 673: /* cachedbstart: VAR_CACHEDB */
+#line 3607 "util/configparser.y"
{
OUTYY(("\nP(cachedb:)\n"));
+ cfg_parser->started_toplevel = 1;
}
-#line 6901 "util/configparser.c"
+#line 7022 "util/configparser.c"
break;
- case 670: /* cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG */
-#line 3542 "util/configparser.y"
+ case 682: /* cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG */
+#line 3619 "util/configparser.y"
{
#ifdef USE_CACHEDB
OUTYY(("P(backend:%s)\n", (yyvsp[0].str)));
@@ -6912,11 +7033,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 6916 "util/configparser.c"
+#line 7037 "util/configparser.c"
break;
- case 671: /* cachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG */
-#line 3554 "util/configparser.y"
+ case 683: /* cachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG */
+#line 3631 "util/configparser.y"
{
#ifdef USE_CACHEDB
OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str)));
@@ -6927,11 +7048,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 6931 "util/configparser.c"
+#line 7052 "util/configparser.c"
break;
- case 672: /* redis_server_host: VAR_CACHEDB_REDISHOST STRING_ARG */
-#line 3566 "util/configparser.y"
+ case 684: /* redis_server_host: VAR_CACHEDB_REDISHOST STRING_ARG */
+#line 3643 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str)));
@@ -6942,11 +7063,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 6946 "util/configparser.c"
+#line 7067 "util/configparser.c"
break;
- case 673: /* redis_server_port: VAR_CACHEDB_REDISPORT STRING_ARG */
-#line 3578 "util/configparser.y"
+ case 685: /* redis_server_port: VAR_CACHEDB_REDISPORT STRING_ARG */
+#line 3655 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
int port;
@@ -6960,11 +7081,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 6964 "util/configparser.c"
+#line 7085 "util/configparser.c"
break;
- case 674: /* redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG */
-#line 3593 "util/configparser.y"
+ case 686: /* redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG */
+#line 3670 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str)));
@@ -6976,11 +7097,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 6980 "util/configparser.c"
+#line 7101 "util/configparser.c"
break;
- case 675: /* redis_expire_records: VAR_CACHEDB_REDISEXPIRERECORDS STRING_ARG */
-#line 3606 "util/configparser.y"
+ case 687: /* redis_expire_records: VAR_CACHEDB_REDISEXPIRERECORDS STRING_ARG */
+#line 3683 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
OUTYY(("P(redis_expire_records:%s)\n", (yyvsp[0].str)));
@@ -6992,11 +7113,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 6996 "util/configparser.c"
+#line 7117 "util/configparser.c"
break;
- case 676: /* server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG */
-#line 3619 "util/configparser.y"
+ case 688: /* server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG */
+#line 3696 "util/configparser.y"
{
OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if (atoi((yyvsp[0].str)) < 0)
@@ -7006,19 +7127,20 @@ yyreduce:
fatal_exit("out of memory adding tcp connection limit");
}
}
-#line 7010 "util/configparser.c"
+#line 7131 "util/configparser.c"
break;
- case 677: /* ipsetstart: VAR_IPSET */
-#line 3630 "util/configparser.y"
+ case 689: /* ipsetstart: VAR_IPSET */
+#line 3707 "util/configparser.y"
{
OUTYY(("\nP(ipset:)\n"));
+ cfg_parser->started_toplevel = 1;
}
-#line 7018 "util/configparser.c"
+#line 7140 "util/configparser.c"
break;
- case 682: /* ipset_name_v4: VAR_IPSET_NAME_V4 STRING_ARG */
-#line 3639 "util/configparser.y"
+ case 694: /* ipset_name_v4: VAR_IPSET_NAME_V4 STRING_ARG */
+#line 3717 "util/configparser.y"
{
#ifdef USE_IPSET
OUTYY(("P(name-v4:%s)\n", (yyvsp[0].str)));
@@ -7032,11 +7154,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 7036 "util/configparser.c"
+#line 7158 "util/configparser.c"
break;
- case 683: /* ipset_name_v6: VAR_IPSET_NAME_V6 STRING_ARG */
-#line 3654 "util/configparser.y"
+ case 695: /* ipset_name_v6: VAR_IPSET_NAME_V6 STRING_ARG */
+#line 3732 "util/configparser.y"
{
#ifdef USE_IPSET
OUTYY(("P(name-v6:%s)\n", (yyvsp[0].str)));
@@ -7050,11 +7172,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 7054 "util/configparser.c"
+#line 7176 "util/configparser.c"
break;
-#line 7058 "util/configparser.c"
+#line 7180 "util/configparser.c"
default: break;
}
@@ -7248,7 +7370,7 @@ yyreturn:
return yyresult;
}
-#line 3668 "util/configparser.y"
+#line 3746 "util/configparser.y"
/* parse helper routines could be here */
@@ -7269,4 +7391,19 @@ validate_respip_action(const char* action)
}
}
-
+static void
+validate_acl_action(const char* action)
+{
+ if(strcmp(action, "deny")!=0 &&
+ strcmp(action, "refuse")!=0 &&
+ strcmp(action, "deny_non_local")!=0 &&
+ strcmp(action, "refuse_non_local")!=0 &&
+ strcmp(action, "allow_setrd")!=0 &&
+ strcmp(action, "allow")!=0 &&
+ strcmp(action, "allow_snoop")!=0)
+ {
+ yyerror("expected deny, refuse, deny_non_local, "
+ "refuse_non_local, allow, allow_setrd or "
+ "allow_snoop as access control action");
+ }
+}
diff --git a/util/configparser.h b/util/configparser.h
index 5c051fc77363..2e62aa9f3166 100644
--- a/util/configparser.h
+++ b/util/configparser.h
@@ -378,7 +378,13 @@ extern int yydebug;
VAR_ZONEMD_REJECT_ABSENCE = 579, /* VAR_ZONEMD_REJECT_ABSENCE */
VAR_RPZ_SIGNAL_NXDOMAIN_RA = 580, /* VAR_RPZ_SIGNAL_NXDOMAIN_RA */
VAR_INTERFACE_AUTOMATIC_PORTS = 581, /* VAR_INTERFACE_AUTOMATIC_PORTS */
- VAR_EDE = 582 /* VAR_EDE */
+ VAR_EDE = 582, /* VAR_EDE */
+ VAR_INTERFACE_ACTION = 583, /* VAR_INTERFACE_ACTION */
+ VAR_INTERFACE_VIEW = 584, /* VAR_INTERFACE_VIEW */
+ VAR_INTERFACE_TAG = 585, /* VAR_INTERFACE_TAG */
+ VAR_INTERFACE_TAG_ACTION = 586, /* VAR_INTERFACE_TAG_ACTION */
+ VAR_INTERFACE_TAG_DATA = 587, /* VAR_INTERFACE_TAG_DATA */
+ VAR_PROXY_PROTOCOL_PORT = 588 /* VAR_PROXY_PROTOCOL_PORT */
};
typedef enum yytokentype yytoken_kind_t;
#endif
@@ -712,16 +718,22 @@ extern int yydebug;
#define VAR_RPZ_SIGNAL_NXDOMAIN_RA 580
#define VAR_INTERFACE_AUTOMATIC_PORTS 581
#define VAR_EDE 582
+#define VAR_INTERFACE_ACTION 583
+#define VAR_INTERFACE_VIEW 584
+#define VAR_INTERFACE_TAG 585
+#define VAR_INTERFACE_TAG_ACTION 586
+#define VAR_INTERFACE_TAG_DATA 587
+#define VAR_PROXY_PROTOCOL_PORT 588
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
union YYSTYPE
{
-#line 66 "util/configparser.y"
+#line 67 "util/configparser.y"
char* str;
-#line 725 "util/configparser.h"
+#line 737 "util/configparser.h"
};
typedef union YYSTYPE YYSTYPE;
diff --git a/util/configparser.y b/util/configparser.y
index c23534019e5e..3ecdad2ad254 100644
--- a/util/configparser.y
+++ b/util/configparser.y
@@ -52,6 +52,7 @@ int ub_c_lex(void);
void ub_c_error(const char *message);
static void validate_respip_action(const char* action);
+static void validate_acl_action(const char* action);
/* these need to be global, otherwise they cannot be used inside yacc */
extern struct config_parser_state* cfg_parser;
@@ -190,6 +191,9 @@ extern struct config_parser_state* cfg_parser;
%token VAR_EDNS_CLIENT_STRING_OPCODE VAR_NSID
%token VAR_ZONEMD_PERMISSIVE_MODE VAR_ZONEMD_CHECK VAR_ZONEMD_REJECT_ABSENCE
%token VAR_RPZ_SIGNAL_NXDOMAIN_RA VAR_INTERFACE_AUTOMATIC_PORTS VAR_EDE
+%token VAR_INTERFACE_ACTION VAR_INTERFACE_VIEW VAR_INTERFACE_TAG
+%token VAR_INTERFACE_TAG_ACTION VAR_INTERFACE_TAG_DATA
+%token VAR_PROXY_PROTOCOL_PORT
%%
toplevelvars: /* empty */ | toplevelvars toplevelvar ;
@@ -204,12 +208,14 @@ toplevelvar: serverstart contents_server | stubstart contents_stub |
force_toplevel: VAR_FORCE_TOPLEVEL
{
OUTYY(("\nP(force-toplevel)\n"));
+ cfg_parser->started_toplevel = 0;
}
;
/* server: declaration */
serverstart: VAR_SERVER
{
OUTYY(("\nP(server:)\n"));
+ cfg_parser->started_toplevel = 1;
}
;
contents_server: contents_server content_server
@@ -287,6 +293,8 @@ content_server: server_num_threads | server_verbosity | server_port |
server_disable_dnssec_lame_check | server_access_control_tag |
server_local_zone_override | server_access_control_tag_action |
server_access_control_tag_data | server_access_control_view |
+ server_interface_action | server_interface_view | server_interface_tag |
+ server_interface_tag_action | server_interface_tag_data |
server_qname_minimisation_strict |
server_pad_responses | server_pad_responses_block_size |
server_pad_queries | server_pad_queries_block_size |
@@ -313,13 +321,14 @@ content_server: server_num_threads | server_verbosity | server_port |
server_edns_client_string_opcode | server_nsid |
server_zonemd_permissive_mode | server_max_reuse_tcp_queries |
server_tcp_reuse_timeout | server_tcp_auth_query_timeout |
- server_interface_automatic_ports | server_ede
-
+ server_interface_automatic_ports | server_ede |
+ server_proxy_protocol_port
;
stubstart: VAR_STUB_ZONE
{
struct config_stub* s;
OUTYY(("\nP(stub_zone:)\n"));
+ cfg_parser->started_toplevel = 1;
s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
if(s) {
s->next = cfg_parser->cfg->stubs;
@@ -338,6 +347,7 @@ forwardstart: VAR_FORWARD_ZONE
{
struct config_stub* s;
OUTYY(("\nP(forward_zone:)\n"));
+ cfg_parser->started_toplevel = 1;
s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
if(s) {
s->next = cfg_parser->cfg->forwards;
@@ -356,6 +366,7 @@ viewstart: VAR_VIEW
{
struct config_view* s;
OUTYY(("\nP(view:)\n"));
+ cfg_parser->started_toplevel = 1;
s = (struct config_view*)calloc(1, sizeof(struct config_view));
if(s) {
s->next = cfg_parser->cfg->views;
@@ -376,6 +387,7 @@ authstart: VAR_AUTH_ZONE
{
struct config_auth* s;
OUTYY(("\nP(auth_zone:)\n"));
+ cfg_parser->started_toplevel = 1;
s = (struct config_auth*)calloc(1, sizeof(struct config_auth));
if(s) {
s->next = cfg_parser->cfg->auths;
@@ -474,6 +486,7 @@ rpzstart: VAR_RPZ
{
struct config_auth* s;
OUTYY(("\nP(rpz:)\n"));
+ cfg_parser->started_toplevel = 1;
s = (struct config_auth*)calloc(1, sizeof(struct config_auth));
if(s) {
s->next = cfg_parser->cfg->auths;
@@ -1842,21 +1855,18 @@ server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG
server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG
{
OUTYY(("P(server_access_control:%s %s)\n", $2, $3));
- if(strcmp($3, "deny")!=0 && strcmp($3, "refuse")!=0 &&
- strcmp($3, "deny_non_local")!=0 &&
- strcmp($3, "refuse_non_local")!=0 &&
- strcmp($3, "allow_setrd")!=0 &&
- strcmp($3, "allow")!=0 &&
- strcmp($3, "allow_snoop")!=0) {
- yyerror("expected deny, refuse, deny_non_local, "
- "refuse_non_local, allow, allow_setrd or "
- "allow_snoop in access control action");
- free($2);
- free($3);
- } else {
- if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3))
- fatal_exit("out of memory adding acl");
- }
+ validate_acl_action($3);
+ if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3))
+ fatal_exit("out of memory adding acl");
+ }
+ ;
+server_interface_action: VAR_INTERFACE_ACTION STRING_ARG STRING_ARG
+ {
+ OUTYY(("P(server_interface_action:%s %s)\n", $2, $3));
+ validate_acl_action($3);
+ if(!cfg_str2list_insert(
+ &cfg_parser->cfg->interface_actions, $2, $3))
+ fatal_exit("out of memory adding acl");
}
;
server_module_conf: VAR_MODULE_CONF STRING_ARG
@@ -2414,6 +2424,60 @@ server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG
}
}
;
+server_interface_tag: VAR_INTERFACE_TAG STRING_ARG STRING_ARG
+ {
+ size_t len = 0;
+ uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
+ &len);
+ free($3);
+ OUTYY(("P(server_interface_tag:%s)\n", $2));
+ if(!bitlist) {
+ yyerror("could not parse tags, (define-tag them first)");
+ free($2);
+ }
+ if(bitlist) {
+ if(!cfg_strbytelist_insert(
+ &cfg_parser->cfg->interface_tags,
+ $2, bitlist, len)) {
+ yyerror("out of memory");
+ free($2);
+ }
+ }
+ }
+ ;
+server_interface_tag_action: VAR_INTERFACE_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG
+ {
+ OUTYY(("P(server_interface_tag_action:%s %s %s)\n", $2, $3, $4));
+ if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_actions,
+ $2, $3, $4)) {
+ yyerror("out of memory");
+ free($2);
+ free($3);
+ free($4);
+ }
+ }
+ ;
+server_interface_tag_data: VAR_INTERFACE_TAG_DATA STRING_ARG STRING_ARG STRING_ARG
+ {
+ OUTYY(("P(server_interface_tag_data:%s %s %s)\n", $2, $3, $4));
+ if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_datas,
+ $2, $3, $4)) {
+ yyerror("out of memory");
+ free($2);
+ free($3);
+ free($4);
+ }
+ }
+ ;
+server_interface_view: VAR_INTERFACE_VIEW STRING_ARG STRING_ARG
+ {
+ OUTYY(("P(server_interface_view:%s %s)\n", $2, $3));
+ if(!cfg_str2list_insert(&cfg_parser->cfg->interface_view,
+ $2, $3)) {
+ yyerror("out of memory");
+ }
+ }
+ ;
server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG
{
size_t len = 0;
@@ -2761,6 +2825,13 @@ server_ede: VAR_EDE STRING_ARG
free($2);
}
;
+server_proxy_protocol_port: VAR_PROXY_PROTOCOL_PORT STRING_ARG
+ {
+ OUTYY(("P(server_proxy_protocol_port:%s)\n", $2));
+ if(!cfg_strlist_insert(&cfg_parser->cfg->proxy_protocol_port, $2))
+ yyerror("out of memory");
+ }
+ ;
stub_name: VAR_NAME STRING_ARG
{
OUTYY(("P(name:%s)\n", $2));
@@ -3103,6 +3174,7 @@ view_first: VAR_VIEW_FIRST STRING_ARG
rcstart: VAR_REMOTE_CONTROL
{
OUTYY(("\nP(remote-control:)\n"));
+ cfg_parser->started_toplevel = 1;
}
;
contents_rc: contents_rc content_rc
@@ -3175,6 +3247,7 @@ rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG
dtstart: VAR_DNSTAP
{
OUTYY(("\nP(dnstap:)\n"));
+ cfg_parser->started_toplevel = 1;
}
;
contents_dt: contents_dt content_dt
@@ -3357,6 +3430,7 @@ dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MES
pythonstart: VAR_PYTHON
{
OUTYY(("\nP(python:)\n"));
+ cfg_parser->started_toplevel = 1;
}
;
contents_py: contents_py content_py
@@ -3372,6 +3446,7 @@ py_script: VAR_PYTHON_SCRIPT STRING_ARG
dynlibstart: VAR_DYNLIB
{
OUTYY(("\nP(dynlib:)\n"));
+ cfg_parser->started_toplevel = 1;
}
;
contents_dl: contents_dl content_dl
@@ -3421,6 +3496,7 @@ server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG
dnscstart: VAR_DNSCRYPT
{
OUTYY(("\nP(dnscrypt:)\n"));
+ cfg_parser->started_toplevel = 1;
}
;
contents_dnsc: contents_dnsc content_dnsc
@@ -3530,6 +3606,7 @@ dnsc_dnscrypt_nonce_cache_slabs: VAR_DNSCRYPT_NONCE_CACHE_SLABS STRING_ARG
cachedbstart: VAR_CACHEDB
{
OUTYY(("\nP(cachedb:)\n"));
+ cfg_parser->started_toplevel = 1;
}
;
contents_cachedb: contents_cachedb content_cachedb
@@ -3629,6 +3706,7 @@ server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG
ipsetstart: VAR_IPSET
{
OUTYY(("\nP(ipset:)\n"));
+ cfg_parser->started_toplevel = 1;
}
;
contents_ipset: contents_ipset content_ipset
@@ -3685,4 +3763,19 @@ validate_respip_action(const char* action)
}
}
-
+static void
+validate_acl_action(const char* action)
+{
+ if(strcmp(action, "deny")!=0 &&
+ strcmp(action, "refuse")!=0 &&
+ strcmp(action, "deny_non_local")!=0 &&
+ strcmp(action, "refuse_non_local")!=0 &&
+ strcmp(action, "allow_setrd")!=0 &&
+ strcmp(action, "allow")!=0 &&
+ strcmp(action, "allow_snoop")!=0)
+ {
+ yyerror("expected deny, refuse, deny_non_local, "
+ "refuse_non_local, allow, allow_setrd or "
+ "allow_snoop as access control action");
+ }
+}
diff --git a/util/fptr_wlist.c b/util/fptr_wlist.c
index 05a22d402ee1..dc8ab6693876 100644
--- a/util/fptr_wlist.c
+++ b/util/fptr_wlist.c
@@ -221,6 +221,7 @@ fptr_whitelist_rbtree_cmp(int (*fptr) (const void *, const void *))
if(fptr == &mesh_state_compare) return 1;
else if(fptr == &mesh_state_ref_compare) return 1;
else if(fptr == &addr_tree_compare) return 1;
+ else if(fptr == &addr_tree_addrport_compare) return 1;
else if(fptr == &local_zone_cmp) return 1;
else if(fptr == &local_data_cmp) return 1;
else if(fptr == &fwd_cmp) return 1;
diff --git a/util/net_help.c b/util/net_help.c
index 8153dbdd1818..54fad6986f3c 100644
--- a/util/net_help.c
+++ b/util/net_help.c
@@ -233,12 +233,11 @@ log_addr(enum verbosity_value v, const char* str,
else verbose(v, "%s %s port %d", str, dest, (int)port);
}
-int
+int
extstrtoaddr(const char* str, struct sockaddr_storage* addr,
- socklen_t* addrlen)
+ socklen_t* addrlen, int port)
{
char* s;
- int port = UNBOUND_DNS_PORT;
if((s=strchr(str, '@'))) {
char buf[MAX_ADDR_STRLEN];
if(s-str >= MAX_ADDR_STRLEN) {
@@ -255,7 +254,6 @@ extstrtoaddr(const char* str, struct sockaddr_storage* addr,
return ipstrtoaddr(str, port, addr, addrlen);
}
-
int
ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
socklen_t* addrlen)
diff --git a/util/net_help.h b/util/net_help.h
index 4dd398460294..f1881b3ed0ca 100644
--- a/util/net_help.h
+++ b/util/net_help.h
@@ -96,6 +96,11 @@ extern uint16_t EDNS_ADVERTISED_SIZE;
/** return a random 16-bit number given a random source */
#define GET_RANDOM_ID(rnd) (((unsigned)ub_random(rnd)>>8) & 0xffff)
+/** define MSG_DONTWAIT for unsupported platforms */
+#ifndef MSG_DONTWAIT
+#define MSG_DONTWAIT 0
+#endif
+
/** minimal responses when positive answer */
extern int MINIMAL_RESPONSES;
@@ -178,10 +183,11 @@ void log_err_addr(const char* str, const char* err,
* @param str: the string
* @param addr: where to store sockaddr.
* @param addrlen: length of stored sockaddr is returned.
+ * @param port: default port.
* @return 0 on error.
*/
int extstrtoaddr(const char* str, struct sockaddr_storage* addr,
- socklen_t* addrlen);
+ socklen_t* addrlen, int port);
/**
* Convert ip address string and port to sockaddr.
diff --git a/util/netevent.c b/util/netevent.c
index 841e0978738f..da59a9d60bda 100644
--- a/util/netevent.c
+++ b/util/netevent.c
@@ -45,6 +45,7 @@
#include "util/net_help.h"
#include "util/tcp_conn_limit.h"
#include "util/fptr_wlist.h"
+#include "util/proxy_protocol.h"
#include "sldns/pkthdr.h"
#include "sldns/sbuffer.h"
#include "sldns/str2wire.h"
@@ -60,6 +61,9 @@
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#endif
#ifdef HAVE_OPENSSL_SSL_H
#include <openssl/ssl.h>
@@ -107,6 +111,9 @@
#define NUM_UDP_PER_SELECT 1
#endif
+/** timeout in millisec to wait for write to unblock, packets dropped after.*/
+#define SEND_BLOCKED_WAIT_TIMEOUT 200
+
/**
* The internal event structure for keeping ub_event info for the event.
* Possibly other structures (list, tree) this is part of.
@@ -132,6 +139,10 @@ struct internal_base {
struct ub_event* slow_accept;
/** true if slow_accept is enabled */
int slow_accept_enabled;
+ /** last log time for slow logging of file descriptor errors */
+ time_t last_slow_log;
+ /** last log time for slow logging of write wait failures */
+ time_t last_writewait_log;
};
/**
@@ -367,29 +378,83 @@ comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet,
* we want to send the answer, and we will wait for
* the ethernet interface buffer to have space. */
#ifndef USE_WINSOCK
- if(errno == EAGAIN ||
+ if(errno == EAGAIN || errno == EINTR ||
# ifdef EWOULDBLOCK
errno == EWOULDBLOCK ||
# endif
errno == ENOBUFS) {
#else
if(WSAGetLastError() == WSAEINPROGRESS ||
+ WSAGetLastError() == WSAEINTR ||
WSAGetLastError() == WSAENOBUFS ||
WSAGetLastError() == WSAEWOULDBLOCK) {
#endif
- int e;
- fd_set_block(c->fd);
- if (!is_connected) {
- sent = sendto(c->fd, (void*)sldns_buffer_begin(packet),
- sldns_buffer_remaining(packet), 0,
- addr, addrlen);
- } else {
- sent = send(c->fd, (void*)sldns_buffer_begin(packet),
- sldns_buffer_remaining(packet), 0);
+ /* if we set the fd blocking, other threads suddenly
+ * have a blocking fd that they operate on */
+ while(sent == -1 && (
+#ifndef USE_WINSOCK
+ errno == EAGAIN || errno == EINTR ||
+# ifdef EWOULDBLOCK
+ errno == EWOULDBLOCK ||
+# endif
+ errno == ENOBUFS
+#else
+ WSAGetLastError() == WSAEINPROGRESS ||
+ WSAGetLastError() == WSAEINTR ||
+ WSAGetLastError() == WSAENOBUFS ||
+ WSAGetLastError() == WSAEWOULDBLOCK
+#endif
+ )) {
+#if defined(HAVE_POLL) || defined(USE_WINSOCK)
+ struct pollfd p;
+ int pret;
+ memset(&p, 0, sizeof(p));
+ p.fd = c->fd;
+ p.events = POLLOUT | POLLERR | POLLHUP;
+# ifndef USE_WINSOCK
+ pret = poll(&p, 1, SEND_BLOCKED_WAIT_TIMEOUT);
+# else
+ pret = WSAPoll(&p, 1,
+ SEND_BLOCKED_WAIT_TIMEOUT);
+# endif
+ if(pret == 0) {
+ /* timer expired */
+ struct comm_base* b = c->ev->base;
+ if(b->eb->last_writewait_log+SLOW_LOG_TIME <=
+ b->eb->secs) {
+ b->eb->last_writewait_log = b->eb->secs;
+ verbose(VERB_OPS, "send udp blocked "
+ "for long, dropping packet.");
+ }
+ return 0;
+ } else if(pret < 0 &&
+#ifndef USE_WINSOCK
+ errno != EAGAIN && errno != EINTR &&
+# ifdef EWOULDBLOCK
+ errno != EWOULDBLOCK &&
+# endif
+ errno != ENOBUFS
+#else
+ WSAGetLastError() != WSAEINPROGRESS &&
+ WSAGetLastError() != WSAEINTR &&
+ WSAGetLastError() != WSAENOBUFS &&
+ WSAGetLastError() != WSAEWOULDBLOCK
+#endif
+ ) {
+ log_err("poll udp out failed: %s",
+ sock_strerror(errno));
+ return 0;
+ }
+#endif /* defined(HAVE_POLL) || defined(USE_WINSOCK) */
+ if (!is_connected) {
+ sent = sendto(c->fd, (void*)sldns_buffer_begin(packet),
+ sldns_buffer_remaining(packet), 0,
+ addr, addrlen);
+ } else {
+ sent = send(c->fd, (void*)sldns_buffer_begin(packet),
+ sldns_buffer_remaining(packet), 0);
+ }
}
- e = errno;
- fd_set_nonblock(c->fd);
- errno = e;
}
}
if(sent == -1) {
@@ -556,22 +621,74 @@ comm_point_send_udp_msg_if(struct comm_point *c, sldns_buffer* packet,
* we want to send the answer, and we will wait for
* the ethernet interface buffer to have space. */
#ifndef USE_WINSOCK
- if(errno == EAGAIN ||
+ if(errno == EAGAIN || errno == EINTR ||
# ifdef EWOULDBLOCK
errno == EWOULDBLOCK ||
# endif
errno == ENOBUFS) {
#else
if(WSAGetLastError() == WSAEINPROGRESS ||
+ WSAGetLastError() == WSAEINTR ||
WSAGetLastError() == WSAENOBUFS ||
WSAGetLastError() == WSAEWOULDBLOCK) {
#endif
- int e;
- fd_set_block(c->fd);
- sent = sendmsg(c->fd, &msg, 0);
- e = errno;
- fd_set_nonblock(c->fd);
- errno = e;
+ while(sent == -1 && (
+#ifndef USE_WINSOCK
+ errno == EAGAIN || errno == EINTR ||
+# ifdef EWOULDBLOCK
+ errno == EWOULDBLOCK ||
+# endif
+ errno == ENOBUFS
+#else
+ WSAGetLastError() == WSAEINPROGRESS ||
+ WSAGetLastError() == WSAEINTR ||
+ WSAGetLastError() == WSAENOBUFS ||
+ WSAGetLastError() == WSAEWOULDBLOCK
+#endif
+ )) {
+#if defined(HAVE_POLL) || defined(USE_WINSOCK)
+ struct pollfd p;
+ int pret;
+ memset(&p, 0, sizeof(p));
+ p.fd = c->fd;
+ p.events = POLLOUT | POLLERR | POLLHUP;
+# ifndef USE_WINSOCK
+ pret = poll(&p, 1, SEND_BLOCKED_WAIT_TIMEOUT);
+# else
+ pret = WSAPoll(&p, 1,
+ SEND_BLOCKED_WAIT_TIMEOUT);
+# endif
+ if(pret == 0) {
+ /* timer expired */
+ struct comm_base* b = c->ev->base;
+ if(b->eb->last_writewait_log+SLOW_LOG_TIME <=
+ b->eb->secs) {
+ b->eb->last_writewait_log = b->eb->secs;
+ verbose(VERB_OPS, "send udp blocked "
+ "for long, dropping packet.");
+ }
+ return 0;
+ } else if(pret < 0 &&
+#ifndef USE_WINSOCK
+ errno != EAGAIN && errno != EINTR &&
+# ifdef EWOULDBLOCK
+ errno != EWOULDBLOCK &&
+# endif
+ errno != ENOBUFS
+#else
+ WSAGetLastError() != WSAEINPROGRESS &&
+ WSAGetLastError() != WSAEINTR &&
+ WSAGetLastError() != WSAENOBUFS &&
+ WSAGetLastError() != WSAEWOULDBLOCK
+#endif
+ ) {
+ log_err("poll udp out failed: %s",
+ sock_strerror(errno));
+ return 0;
+ }
+#endif /* defined(HAVE_POLL) || defined(USE_WINSOCK) */
+ sent = sendmsg(c->fd, &msg, 0);
+ }
}
}
if(sent == -1) {
@@ -639,6 +756,67 @@ static int udp_recv_needs_log(int err)
return 1;
}
+/** Parses the PROXYv2 header from buf and updates the comm_reply struct.
+ * Returns 1 on success, 0 on failure. */
+static int consume_pp2_header(struct sldns_buffer* buf, struct comm_reply* rep,
+ int stream) {
+ size_t size;
+ struct pp2_header *header = pp2_read_header(buf);
+ if(header == NULL) return 0;
+ size = PP2_HEADER_SIZE + ntohs(header->len);
+ if((header->ver_cmd & 0xF) == PP2_CMD_LOCAL) {
+ /* A connection from the proxy itself.
+ * No need to do anything with addresses. */
+ goto done;
+ }
+ if(header->fam_prot == 0x00) {
+ /* Unspecified family and protocol. This could be used for
+ * health checks by proxies.
+ * No need to do anything with addresses. */
+ goto done;
+ }
+ /* Read the proxied address */
+ switch(header->fam_prot) {
+ case 0x11: /* AF_INET|STREAM */
+ case 0x12: /* AF_INET|DGRAM */
+ {
+ struct sockaddr_in* addr =
+ (struct sockaddr_in*)&rep->client_addr;
+ addr->sin_family = AF_INET;
+ addr->sin_addr.s_addr = header->addr.addr4.src_addr;
+ addr->sin_port = header->addr.addr4.src_port;
+ rep->client_addrlen = (socklen_t)sizeof(struct sockaddr_in);
+ }
+ /* Ignore the destination address; it should be us. */
+ break;
+ case 0x21: /* AF_INET6|STREAM */
+ case 0x22: /* AF_INET6|DGRAM */
+ {
+ struct sockaddr_in6* addr =
+ (struct sockaddr_in6*)&rep->client_addr;
+ memset(addr, 0, sizeof(*addr));
+ addr->sin6_family = AF_INET6;
+ memcpy(&addr->sin6_addr,
+ header->addr.addr6.src_addr, 16);
+ addr->sin6_port = header->addr.addr6.src_port;
+ rep->client_addrlen = (socklen_t)sizeof(struct sockaddr_in6);
+ }
+ /* Ignore the destination address; it should be us. */
+ break;
+ }
+ rep->is_proxied = 1;
+done:
+ if(!stream) {
+ /* We are reading a whole packet;
+ * Move the rest of the data to overwrite the PROXYv2 header */
+ /* XXX can we do better to avoid memmove? */
+ memmove(header, ((void*)header)+size,
+ sldns_buffer_limit(buf)-size);
+ sldns_buffer_set_limit(buf, sldns_buffer_limit(buf)-size);
+ }
+ return 1;
+}
+
void
comm_point_udp_ancil_callback(int fd, short event, void* arg)
{
@@ -665,11 +843,11 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg)
ub_comm_base_now(rep.c->ev->base);
for(i=0; i<NUM_UDP_PER_SELECT; i++) {
sldns_buffer_clear(rep.c->buffer);
- rep.addrlen = (socklen_t)sizeof(rep.addr);
+ rep.remote_addrlen = (socklen_t)sizeof(rep.remote_addr);
log_assert(fd != -1);
log_assert(sldns_buffer_remaining(rep.c->buffer) > 0);
- msg.msg_name = &rep.addr;
- msg.msg_namelen = (socklen_t)sizeof(rep.addr);
+ msg.msg_name = &rep.remote_addr;
+ msg.msg_namelen = (socklen_t)sizeof(rep.remote_addr);
iov[0].iov_base = sldns_buffer_begin(rep.c->buffer);
iov[0].iov_len = sldns_buffer_remaining(rep.c->buffer);
msg.msg_iov = iov;
@@ -679,7 +857,7 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg)
msg.msg_controllen = sizeof(ancil.buf);
#endif /* S_SPLINT_S */
msg.msg_flags = 0;
- rcv = recvmsg(fd, &msg, 0);
+ rcv = recvmsg(fd, &msg, MSG_DONTWAIT);
if(rcv == -1) {
if(errno != EAGAIN && errno != EINTR
&& udp_recv_needs_log(errno)) {
@@ -687,10 +865,11 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg)
}
return;
}
- rep.addrlen = msg.msg_namelen;
+ rep.remote_addrlen = msg.msg_namelen;
sldns_buffer_skip(rep.c->buffer, rcv);
sldns_buffer_flip(rep.c->buffer);
rep.srctype = 0;
+ rep.is_proxied = 0;
#ifndef S_SPLINT_S
for(cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
cmsg = CMSG_NXTHDR(&msg, cmsg)) {
@@ -720,11 +899,24 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg)
if(verbosity >= VERB_ALGO)
p_ancil("receive_udp on interface", &rep);
#endif /* S_SPLINT_S */
+
+ if(rep.c->pp2_enabled && !consume_pp2_header(rep.c->buffer,
+ &rep, 0)) {
+ log_err("proxy_protocol: could not consume PROXYv2 header");
+ return;
+ }
+ if(!rep.is_proxied) {
+ rep.client_addrlen = rep.remote_addrlen;
+ memmove(&rep.client_addr, &rep.remote_addr,
+ rep.remote_addrlen);
+ }
+
fptr_ok(fptr_whitelist_comm_point(rep.c->callback));
if((*rep.c->callback)(rep.c, rep.c->cb_arg, NETEVENT_NOERROR, &rep)) {
/* send back immediate reply */
(void)comm_point_send_udp_msg_if(rep.c, rep.c->buffer,
- (struct sockaddr*)&rep.addr, rep.addrlen, &rep);
+ (struct sockaddr*)&rep.remote_addr,
+ rep.remote_addrlen, &rep);
}
if(!rep.c || rep.c->fd == -1) /* commpoint closed */
break;
@@ -755,12 +947,12 @@ comm_point_udp_callback(int fd, short event, void* arg)
ub_comm_base_now(rep.c->ev->base);
for(i=0; i<NUM_UDP_PER_SELECT; i++) {
sldns_buffer_clear(rep.c->buffer);
- rep.addrlen = (socklen_t)sizeof(rep.addr);
+ rep.remote_addrlen = (socklen_t)sizeof(rep.remote_addr);
log_assert(fd != -1);
log_assert(sldns_buffer_remaining(rep.c->buffer) > 0);
rcv = recvfrom(fd, (void*)sldns_buffer_begin(rep.c->buffer),
- sldns_buffer_remaining(rep.c->buffer), 0,
- (struct sockaddr*)&rep.addr, &rep.addrlen);
+ sldns_buffer_remaining(rep.c->buffer), MSG_DONTWAIT,
+ (struct sockaddr*)&rep.remote_addr, &rep.remote_addrlen);
if(rcv == -1) {
#ifndef USE_WINSOCK
if(errno != EAGAIN && errno != EINTR
@@ -780,6 +972,19 @@ comm_point_udp_callback(int fd, short event, void* arg)
sldns_buffer_skip(rep.c->buffer, rcv);
sldns_buffer_flip(rep.c->buffer);
rep.srctype = 0;
+ rep.is_proxied = 0;
+
+ if(rep.c->pp2_enabled && !consume_pp2_header(rep.c->buffer,
+ &rep, 0)) {
+ log_err("proxy_protocol: could not consume PROXYv2 header");
+ return;
+ }
+ if(!rep.is_proxied) {
+ rep.client_addrlen = rep.remote_addrlen;
+ memmove(&rep.client_addr, &rep.remote_addr,
+ rep.remote_addrlen);
+ }
+
fptr_ok(fptr_whitelist_comm_point(rep.c->callback));
if((*rep.c->callback)(rep.c, rep.c->cb_arg, NETEVENT_NOERROR, &rep)) {
/* send back immediate reply */
@@ -789,7 +994,8 @@ comm_point_udp_callback(int fd, short event, void* arg)
buffer = rep.c->buffer;
#endif
(void)comm_point_send_udp_msg(rep.c, buffer,
- (struct sockaddr*)&rep.addr, rep.addrlen, 0);
+ (struct sockaddr*)&rep.remote_addr,
+ rep.remote_addrlen, 0);
}
if(!rep.c || rep.c->fd != fd) /* commpoint closed to -1 or reused for
another UDP port. Note rep.c cannot be reused with TCP fd. */
@@ -889,6 +1095,16 @@ int comm_point_perform_accept(struct comm_point* c,
struct timeval tv;
verbose(VERB_ALGO, "out of file descriptors: "
"slow accept");
+ ub_comm_base_now(b);
+ if(b->eb->last_slow_log+SLOW_LOG_TIME <=
+ b->eb->secs) {
+ b->eb->last_slow_log = b->eb->secs;
+ verbose(VERB_OPS, "accept failed, "
+ "slow down accept for %d "
+ "msec: %s",
+ NETEVENT_SLOW_ACCEPT_TIME,
+ sock_strerror(errno));
+ }
b->eb->slow_accept_enabled = 1;
fptr_ok(fptr_whitelist_stop_accept(
b->stop_accept));
@@ -909,6 +1125,9 @@ int comm_point_perform_accept(struct comm_point* c,
/* we do not want to log here,
* error: "event_add failed." */
}
+ } else {
+ log_err("accept, with no slow down, "
+ "failed: %s", sock_strerror(errno));
}
return -1;
}
@@ -1092,10 +1311,16 @@ comm_point_tcp_accept_callback(int fd, short event, void* arg)
}
log_assert(fd != -1);
(void)fd;
- new_fd = comm_point_perform_accept(c, &c_hdl->repinfo.addr,
- &c_hdl->repinfo.addrlen);
+ new_fd = comm_point_perform_accept(c, &c_hdl->repinfo.remote_addr,
+ &c_hdl->repinfo.remote_addrlen);
if(new_fd == -1)
return;
+ /* Copy remote_address to client_address.
+ * Simplest way/time for streams to do that. */
+ c_hdl->repinfo.client_addrlen = c_hdl->repinfo.remote_addrlen;
+ memmove(&c_hdl->repinfo.client_addr,
+ &c_hdl->repinfo.remote_addr,
+ c_hdl->repinfo.remote_addrlen);
if(c->ssl) {
c_hdl->ssl = incoming_ssl_fd(c->ssl, new_fd);
if(!c_hdl->ssl) {
@@ -1147,6 +1372,7 @@ reclaim_tcp_handler(struct comm_point* c)
c->tcp_more_read_again = NULL;
c->tcp_more_write_again = NULL;
c->tcp_byte_count = 0;
+ c->pp2_header_state = pp2_header_none;
sldns_buffer_clear(c->buffer);
}
@@ -1278,8 +1504,8 @@ ssl_handshake(struct comm_point* c)
return 0; /* silence reset by peer */
#endif
if(!tcp_connect_errno_needs_log(
- (struct sockaddr*)&c->repinfo.addr,
- c->repinfo.addrlen))
+ (struct sockaddr*)&c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen))
return 0; /* silence connect failures that
show up because after connect this is the
first system call that accesses the socket */
@@ -1291,8 +1517,9 @@ ssl_handshake(struct comm_point* c)
unsigned long err = ERR_get_error();
if(!squelch_err_ssl_handshake(err)) {
log_crypto_err_code("ssl handshake failed", err);
- log_addr(VERB_OPS, "ssl handshake failed", &c->repinfo.addr,
- c->repinfo.addrlen);
+ log_addr(VERB_OPS, "ssl handshake failed",
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
}
return 0;
}
@@ -1309,7 +1536,8 @@ ssl_handshake(struct comm_point* c)
if(!x) {
log_addr(VERB_ALGO, "SSL connection failed: "
"no certificate",
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
return 0;
}
log_cert(VERB_ALGO, "peer certificate", x);
@@ -1319,13 +1547,13 @@ ssl_handshake(struct comm_point* c)
snprintf(buf, sizeof(buf), "SSL connection "
"to %s authenticated",
SSL_get0_peername(c->ssl));
- log_addr(VERB_ALGO, buf, &c->repinfo.addr,
- c->repinfo.addrlen);
+ log_addr(VERB_ALGO, buf, &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
} else {
#endif
log_addr(VERB_ALGO, "SSL connection "
- "authenticated", &c->repinfo.addr,
- c->repinfo.addrlen);
+ "authenticated", &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
#ifdef HAVE_SSL_GET0_PEERNAME
}
#endif
@@ -1342,14 +1570,15 @@ ssl_handshake(struct comm_point* c)
}
log_addr(VERB_ALGO, "SSL connection failed: "
"failed to authenticate",
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
return 0;
}
} else {
/* unauthenticated, the verify peer flag was not set
* in c->ssl when the ssl object was created from ssl_ctx */
- log_addr(VERB_ALGO, "SSL connection", &c->repinfo.addr,
- c->repinfo.addrlen);
+ log_addr(VERB_ALGO, "SSL connection", &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
}
#ifdef HAVE_SSL_GET0_ALPN_SELECTED
@@ -1390,6 +1619,142 @@ ssl_handle_read(struct comm_point* c)
if(c->ssl_shake_state != comm_ssl_shake_none)
return 1;
}
+ if(c->pp2_enabled && c->pp2_header_state != pp2_header_done) {
+ struct pp2_header* header = NULL;
+ size_t want_read_size = 0;
+ size_t current_read_size = 0;
+ if(c->pp2_header_state == pp2_header_none) {
+ want_read_size = PP2_HEADER_SIZE;
+ if(sldns_buffer_remaining(c->buffer)<want_read_size) {
+ log_err_addr("proxy_protocol: not enough "
+ "buffer size to read PROXYv2 header", "",
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
+ return 0;
+ }
+ verbose(VERB_ALGO, "proxy_protocol: reading fixed "
+ "part of PROXYv2 header (len %lu)",
+ (unsigned long)want_read_size);
+ current_read_size = want_read_size;
+ if(c->tcp_byte_count < current_read_size) {
+ ERR_clear_error();
+ if((r=SSL_read(c->ssl, (void*)sldns_buffer_at(
+ c->buffer, c->tcp_byte_count),
+ current_read_size -
+ c->tcp_byte_count)) <= 0) {
+ int want = SSL_get_error(c->ssl, r);
+ if(want == SSL_ERROR_ZERO_RETURN) {
+ if(c->tcp_req_info)
+ return tcp_req_info_handle_read_close(c->tcp_req_info);
+ return 0; /* shutdown, closed */
+ } else if(want == SSL_ERROR_WANT_READ) {
+#ifdef USE_WINSOCK
+ ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ);
+#endif
+ return 1; /* read more later */
+ } else if(want == SSL_ERROR_WANT_WRITE) {
+ c->ssl_shake_state = comm_ssl_shake_hs_write;
+ comm_point_listen_for_rw(c, 0, 1);
+ return 1;
+ } else if(want == SSL_ERROR_SYSCALL) {
+#ifdef ECONNRESET
+ if(errno == ECONNRESET && verbosity < 2)
+ return 0; /* silence reset by peer */
+#endif
+ if(errno != 0)
+ log_err("SSL_read syscall: %s",
+ strerror(errno));
+ return 0;
+ }
+ log_crypto_err("could not SSL_read");
+ return 0;
+ }
+ c->tcp_byte_count += r;
+ if(c->tcp_byte_count != current_read_size) return 1;
+ c->pp2_header_state = pp2_header_init;
+ }
+ }
+ if(c->pp2_header_state == pp2_header_init) {
+ header = pp2_read_header(c->buffer);
+ if(!header) {
+ log_err("proxy_protocol: could not parse "
+ "PROXYv2 header");
+ return 0;
+ }
+ want_read_size = ntohs(header->len);
+ if(sldns_buffer_remaining(c->buffer) <
+ PP2_HEADER_SIZE + want_read_size) {
+ log_err_addr("proxy_protocol: not enough "
+ "buffer size to read PROXYv2 header", "",
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
+ return 0;
+ }
+ verbose(VERB_ALGO, "proxy_protocol: reading variable "
+ "part of PROXYv2 header (len %lu)",
+ (unsigned long)want_read_size);
+ current_read_size = PP2_HEADER_SIZE + want_read_size;
+ if(want_read_size == 0) {
+ /* nothing more to read; header is complete */
+ c->pp2_header_state = pp2_header_done;
+ } else if(c->tcp_byte_count < current_read_size) {
+ ERR_clear_error();
+ if((r=SSL_read(c->ssl, (void*)sldns_buffer_at(
+ c->buffer, c->tcp_byte_count),
+ current_read_size -
+ c->tcp_byte_count)) <= 0) {
+ int want = SSL_get_error(c->ssl, r);
+ if(want == SSL_ERROR_ZERO_RETURN) {
+ if(c->tcp_req_info)
+ return tcp_req_info_handle_read_close(c->tcp_req_info);
+ return 0; /* shutdown, closed */
+ } else if(want == SSL_ERROR_WANT_READ) {
+#ifdef USE_WINSOCK
+ ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ);
+#endif
+ return 1; /* read more later */
+ } else if(want == SSL_ERROR_WANT_WRITE) {
+ c->ssl_shake_state = comm_ssl_shake_hs_write;
+ comm_point_listen_for_rw(c, 0, 1);
+ return 1;
+ } else if(want == SSL_ERROR_SYSCALL) {
+#ifdef ECONNRESET
+ if(errno == ECONNRESET && verbosity < 2)
+ return 0; /* silence reset by peer */
+#endif
+ if(errno != 0)
+ log_err("SSL_read syscall: %s",
+ strerror(errno));
+ return 0;
+ }
+ log_crypto_err("could not SSL_read");
+ return 0;
+ }
+ c->tcp_byte_count += r;
+ if(c->tcp_byte_count != current_read_size) return 1;
+ c->pp2_header_state = pp2_header_done;
+ }
+ }
+ if(c->pp2_header_state != pp2_header_done || !header) {
+ log_err_addr("proxy_protocol: wrong state for the "
+ "PROXYv2 header", "", &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
+ return 0;
+ }
+ if(!consume_pp2_header(c->buffer, &c->repinfo, 1)) {
+ log_err_addr("proxy_protocol: could not consume "
+ "PROXYv2 header", "", &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
+ return 0;
+ }
+ verbose(VERB_ALGO, "proxy_protocol: successful read of "
+ "PROXYv2 header");
+ /* Clear and reset the buffer to read the following
+ * DNS packet(s). */
+ sldns_buffer_clear(c->buffer);
+ c->tcp_byte_count = 0;
+ return 1;
+ }
if(c->tcp_byte_count < sizeof(uint16_t)) {
/* read length bytes */
ERR_clear_error();
@@ -1649,16 +2014,18 @@ ssl_handle_it(struct comm_point* c, int is_write)
return ssl_handle_write(c);
}
-/** Handle tcp reading callback.
+/**
+ * Handle tcp reading callback.
* @param fd: file descriptor of socket.
* @param c: comm point to read from into buffer.
* @param short_ok: if true, very short packets are OK (for comm_local).
- * @return: 0 on error
+ * @return: 0 on error
*/
static int
comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok)
{
ssize_t r;
+ int recv_initial = 0;
log_assert(c->type == comm_tcp || c->type == comm_local);
if(c->ssl)
return ssl_handle_it(c, 0);
@@ -1666,78 +2033,111 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok)
return 0;
log_assert(fd != -1);
+ if(c->pp2_enabled && c->pp2_header_state != pp2_header_done) {
+ struct pp2_header* header = NULL;
+ size_t want_read_size = 0;
+ size_t current_read_size = 0;
+ if(c->pp2_header_state == pp2_header_none) {
+ want_read_size = PP2_HEADER_SIZE;
+ if(sldns_buffer_remaining(c->buffer)<want_read_size) {
+ log_err_addr("proxy_protocol: not enough "
+ "buffer size to read PROXYv2 header", "",
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
+ return 0;
+ }
+ verbose(VERB_ALGO, "proxy_protocol: reading fixed "
+ "part of PROXYv2 header (len %lu)",
+ (unsigned long)want_read_size);
+ current_read_size = want_read_size;
+ if(c->tcp_byte_count < current_read_size) {
+ r = recv(fd, (void*)sldns_buffer_at(c->buffer,
+ c->tcp_byte_count),
+ current_read_size-c->tcp_byte_count, MSG_DONTWAIT);
+ if(r == 0) {
+ if(c->tcp_req_info)
+ return tcp_req_info_handle_read_close(c->tcp_req_info);
+ return 0;
+ } else if(r == -1) {
+ goto recv_error_initial;
+ }
+ c->tcp_byte_count += r;
+ if(c->tcp_byte_count != current_read_size) return 1;
+ c->pp2_header_state = pp2_header_init;
+ }
+ }
+ if(c->pp2_header_state == pp2_header_init) {
+ header = pp2_read_header(c->buffer);
+ if(!header) {
+ log_err("proxy_protocol: could not parse "
+ "PROXYv2 header");
+ return 0;
+ }
+ want_read_size = ntohs(header->len);
+ if(sldns_buffer_remaining(c->buffer) <
+ PP2_HEADER_SIZE + want_read_size) {
+ log_err_addr("proxy_protocol: not enough "
+ "buffer size to read PROXYv2 header", "",
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
+ return 0;
+ }
+ verbose(VERB_ALGO, "proxy_protocol: reading variable "
+ "part of PROXYv2 header (len %lu)",
+ (unsigned long)want_read_size);
+ current_read_size = PP2_HEADER_SIZE + want_read_size;
+ if(want_read_size == 0) {
+ /* nothing more to read; header is complete */
+ c->pp2_header_state = pp2_header_done;
+ } else if(c->tcp_byte_count < current_read_size) {
+ r = recv(fd, (void*)sldns_buffer_at(c->buffer,
+ c->tcp_byte_count),
+ current_read_size-c->tcp_byte_count, MSG_DONTWAIT);
+ if(r == 0) {
+ if(c->tcp_req_info)
+ return tcp_req_info_handle_read_close(c->tcp_req_info);
+ return 0;
+ } else if(r == -1) {
+ goto recv_error;
+ }
+ c->tcp_byte_count += r;
+ if(c->tcp_byte_count != current_read_size) return 1;
+ c->pp2_header_state = pp2_header_done;
+ }
+ }
+ if(c->pp2_header_state != pp2_header_done || !header) {
+ log_err_addr("proxy_protocol: wrong state for the "
+ "PROXYv2 header", "", &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
+ return 0;
+ }
+ if(!consume_pp2_header(c->buffer, &c->repinfo, 1)) {
+ log_err_addr("proxy_protocol: could not consume "
+ "PROXYv2 header", "", &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
+ return 0;
+ }
+ verbose(VERB_ALGO, "proxy_protocol: successful read of "
+ "PROXYv2 header");
+ /* Clear and reset the buffer to read the following
+ * DNS packet(s). */
+ sldns_buffer_clear(c->buffer);
+ c->tcp_byte_count = 0;
+ return 1;
+ }
+
if(c->tcp_byte_count < sizeof(uint16_t)) {
/* read length bytes */
r = recv(fd,(void*)sldns_buffer_at(c->buffer,c->tcp_byte_count),
- sizeof(uint16_t)-c->tcp_byte_count, 0);
+ sizeof(uint16_t)-c->tcp_byte_count, MSG_DONTWAIT);
if(r == 0) {
if(c->tcp_req_info)
return tcp_req_info_handle_read_close(c->tcp_req_info);
return 0;
} else if(r == -1) {
-#ifndef USE_WINSOCK
- if(errno == EINTR || errno == EAGAIN)
- return 1;
-#ifdef ECONNRESET
- if(errno == ECONNRESET && verbosity < 2)
- return 0; /* silence reset by peer */
-#endif
-#ifdef ECONNREFUSED
- if(errno == ECONNREFUSED && verbosity < 2)
- return 0; /* silence reset by peer */
-#endif
-#ifdef ENETUNREACH
- if(errno == ENETUNREACH && verbosity < 2)
- return 0; /* silence it */
-#endif
-#ifdef EHOSTDOWN
- if(errno == EHOSTDOWN && verbosity < 2)
- return 0; /* silence it */
-#endif
-#ifdef EHOSTUNREACH
- if(errno == EHOSTUNREACH && verbosity < 2)
- return 0; /* silence it */
-#endif
-#ifdef ENETDOWN
- if(errno == ENETDOWN && verbosity < 2)
- return 0; /* silence it */
-#endif
-#ifdef EACCES
- if(errno == EACCES && verbosity < 2)
- return 0; /* silence it */
-#endif
-#ifdef ENOTCONN
- if(errno == ENOTCONN) {
- log_err_addr("read (in tcp s) failed and this could be because TCP Fast Open is enabled [--disable-tfo-client --disable-tfo-server] but does not work", sock_strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
- return 0;
- }
-#endif
-#else /* USE_WINSOCK */
- if(WSAGetLastError() == WSAECONNREFUSED && verbosity < 2)
- return 0;
- if(WSAGetLastError() == WSAEHOSTDOWN && verbosity < 2)
- return 0;
- if(WSAGetLastError() == WSAEHOSTUNREACH && verbosity < 2)
- return 0;
- if(WSAGetLastError() == WSAENETDOWN && verbosity < 2)
- return 0;
- if(WSAGetLastError() == WSAENETUNREACH && verbosity < 2)
- return 0;
- if(WSAGetLastError() == WSAECONNRESET)
- return 0;
- if(WSAGetLastError() == WSAEINPROGRESS)
- return 1;
- if(WSAGetLastError() == WSAEWOULDBLOCK) {
- ub_winsock_tcp_wouldblock(c->ev->ev,
- UB_EV_READ);
- return 1;
- }
-#endif
- log_err_addr("read (in tcp s)", sock_strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
- return 0;
- }
+ if(c->pp2_enabled) goto recv_error;
+ goto recv_error_initial;
+ }
c->tcp_byte_count += r;
if(c->tcp_byte_count != sizeof(uint16_t))
return 1;
@@ -1746,48 +2146,110 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok)
verbose(VERB_QUERY, "tcp: dropped larger than buffer");
return 0;
}
- sldns_buffer_set_limit(c->buffer,
+ sldns_buffer_set_limit(c->buffer,
sldns_buffer_read_u16_at(c->buffer, 0));
- if(!short_ok &&
+ if(!short_ok &&
sldns_buffer_limit(c->buffer) < LDNS_HEADER_SIZE) {
verbose(VERB_QUERY, "tcp: dropped bogus too short.");
return 0;
}
- verbose(VERB_ALGO, "Reading tcp query of length %d",
+ verbose(VERB_ALGO, "Reading tcp query of length %d",
(int)sldns_buffer_limit(c->buffer));
}
if(sldns_buffer_remaining(c->buffer) == 0)
- log_err("in comm_point_tcp_handle_read buffer_remaining is not > 0 as expected, continuing with (harmless) 0 length recv");
+ log_err("in comm_point_tcp_handle_read buffer_remaining is "
+ "not > 0 as expected, continuing with (harmless) 0 "
+ "length recv");
r = recv(fd, (void*)sldns_buffer_current(c->buffer),
- sldns_buffer_remaining(c->buffer), 0);
+ sldns_buffer_remaining(c->buffer), MSG_DONTWAIT);
if(r == 0) {
if(c->tcp_req_info)
return tcp_req_info_handle_read_close(c->tcp_req_info);
return 0;
} else if(r == -1) {
-#ifndef USE_WINSOCK
- if(errno == EINTR || errno == EAGAIN)
- return 1;
-#else /* USE_WINSOCK */
- if(WSAGetLastError() == WSAECONNRESET)
- return 0;
- if(WSAGetLastError() == WSAEINPROGRESS)
- return 1;
- if(WSAGetLastError() == WSAEWOULDBLOCK) {
- ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ);
- return 1;
- }
-#endif
- log_err_addr("read (in tcp r)", sock_strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
- return 0;
+ goto recv_error;
}
sldns_buffer_skip(c->buffer, r);
if(sldns_buffer_remaining(c->buffer) <= 0) {
tcp_callback_reader(c);
}
return 1;
+
+recv_error_initial:
+ recv_initial = 1;
+recv_error:
+#ifndef USE_WINSOCK
+ if(errno == EINTR || errno == EAGAIN)
+ return 1;
+ if(recv_initial) {
+#ifdef ECONNRESET
+ if(errno == ECONNRESET && verbosity < 2)
+ return 0; /* silence reset by peer */
+#endif
+#ifdef ECONNREFUSED
+ if(errno == ECONNREFUSED && verbosity < 2)
+ return 0; /* silence reset by peer */
+#endif
+#ifdef ENETUNREACH
+ if(errno == ENETUNREACH && verbosity < 2)
+ return 0; /* silence it */
+#endif
+#ifdef EHOSTDOWN
+ if(errno == EHOSTDOWN && verbosity < 2)
+ return 0; /* silence it */
+#endif
+#ifdef EHOSTUNREACH
+ if(errno == EHOSTUNREACH && verbosity < 2)
+ return 0; /* silence it */
+#endif
+#ifdef ENETDOWN
+ if(errno == ENETDOWN && verbosity < 2)
+ return 0; /* silence it */
+#endif
+#ifdef EACCES
+ if(errno == EACCES && verbosity < 2)
+ return 0; /* silence it */
+#endif
+#ifdef ENOTCONN
+ if(errno == ENOTCONN) {
+ log_err_addr("read (in tcp s) failed and this "
+ "could be because TCP Fast Open is "
+ "enabled [--disable-tfo-client "
+ "--disable-tfo-server] but does not "
+ "work", sock_strerror(errno),
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
+ return 0;
+ }
+#endif
+ }
+#else /* USE_WINSOCK */
+ if(recv_initial) {
+ if(WSAGetLastError() == WSAECONNREFUSED && verbosity < 2)
+ return 0;
+ if(WSAGetLastError() == WSAEHOSTDOWN && verbosity < 2)
+ return 0;
+ if(WSAGetLastError() == WSAEHOSTUNREACH && verbosity < 2)
+ return 0;
+ if(WSAGetLastError() == WSAENETDOWN && verbosity < 2)
+ return 0;
+ if(WSAGetLastError() == WSAENETUNREACH && verbosity < 2)
+ return 0;
+ }
+ if(WSAGetLastError() == WSAECONNRESET)
+ return 0;
+ if(WSAGetLastError() == WSAEINPROGRESS)
+ return 1;
+ if(WSAGetLastError() == WSAEWOULDBLOCK) {
+ ub_winsock_tcp_wouldblock(c->ev->ev,
+ UB_EV_READ);
+ return 1;
+ }
+#endif
+ log_err_addr("read (in tcp s)", sock_strerror(errno),
+ &c->repinfo.remote_addr, c->repinfo.remote_addrlen);
+ return 0;
}
/**
@@ -1833,7 +2295,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
return 0; /* silence lots of chatter in the logs */
else if(error != 0) {
log_err_addr("tcp connect", strerror(error),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
#else /* USE_WINSOCK */
/* examine error */
if(error == WSAEINPROGRESS)
@@ -1845,7 +2308,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
return 0;
else if(error != 0) {
log_err_addr("tcp connect", wsa_strerror(error),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
#endif /* USE_WINSOCK */
return 0;
}
@@ -1877,8 +2341,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
iov[1].iov_len = sldns_buffer_limit(buffer);
}
log_assert(iov[0].iov_len > 0);
- msg.msg_name = &c->repinfo.addr;
- msg.msg_namelen = c->repinfo.addrlen;
+ msg.msg_name = &c->repinfo.remote_addr;
+ msg.msg_namelen = c->repinfo.remote_addrlen;
msg.msg_iov = iov;
msg.msg_iovlen = 2;
r = sendmsg(fd, &msg, MSG_FASTOPEN);
@@ -1904,14 +2368,16 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
if(verbosity < 2)
return 0; /* silence lots of chatter in the logs */
log_err_addr("tcp sendmsg", strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
return 0;
}
verbose(VERB_ALGO, "tcp sendmsg for fastopen failed (with %s), try normal connect", strerror(errno));
/* fallthrough to nonFASTOPEN
* (MSG_FASTOPEN on Linux 3 produces EPIPE)
* we need to perform connect() */
- if(connect(fd, (struct sockaddr *)&c->repinfo.addr, c->repinfo.addrlen) == -1) {
+ if(connect(fd, (struct sockaddr *)&c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen) == -1) {
#ifdef EINPROGRESS
if(errno == EINPROGRESS)
return 1; /* wait until connect done*/
@@ -1922,9 +2388,12 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
return 1; /* wait until connect done*/
#endif
if(tcp_connect_errno_needs_log(
- (struct sockaddr *)&c->repinfo.addr, c->repinfo.addrlen)) {
+ (struct sockaddr *)&c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen)) {
log_err_addr("outgoing tcp: connect after EPIPE for fastopen",
- strerror(errno), &c->repinfo.addr, c->repinfo.addrlen);
+ strerror(errno),
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
}
return 0;
}
@@ -1989,10 +2458,12 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
#endif
# ifdef HAVE_WRITEV
log_err_addr("tcp writev", strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
# else /* HAVE_WRITEV */
log_err_addr("tcp send s", strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
# endif /* HAVE_WRITEV */
#else
if(WSAGetLastError() == WSAENOTCONN)
@@ -2008,7 +2479,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
return 0; /* silence reset by peer */
log_err_addr("tcp send s",
wsa_strerror(WSAGetLastError()),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
#endif
return 0;
}
@@ -2056,7 +2528,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
return 0; /* silence reset by peer */
#endif
log_err_addr("tcp send r", sock_strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen);
return 0;
}
if(c->tcp_write_and_read) {
@@ -2302,7 +2775,7 @@ http_read_more(int fd, struct comm_point* c)
ssize_t r;
log_assert(sldns_buffer_remaining(c->buffer) > 0);
r = recv(fd, (void*)sldns_buffer_current(c->buffer),
- sldns_buffer_remaining(c->buffer), 0);
+ sldns_buffer_remaining(c->buffer), MSG_DONTWAIT);
if(r == 0) {
return 0;
} else if(r == -1) {
@@ -2320,7 +2793,7 @@ http_read_more(int fd, struct comm_point* c)
}
#endif
log_err_addr("read (in http r)", sock_strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr, c->repinfo.remote_addrlen);
return 0;
}
verbose(VERB_ALGO, "http read more skip to %d + %d",
@@ -2740,7 +3213,7 @@ ssize_t http2_recv_cb(nghttp2_session* ATTR_UNUSED(session), uint8_t* buf,
}
#endif /* HAVE_SSL */
- ret = recv(h2_session->c->fd, buf, len, 0);
+ ret = recv(h2_session->c->fd, buf, len, MSG_DONTWAIT);
if(ret == 0) {
return NGHTTP2_ERR_EOF;
} else if(ret < 0) {
@@ -2752,8 +3225,8 @@ ssize_t http2_recv_cb(nghttp2_session* ATTR_UNUSED(session), uint8_t* buf,
return NGHTTP2_ERR_CALLBACK_FAILURE;
#endif
log_err_addr("could not http2 recv: %s", strerror(errno),
- &h2_session->c->repinfo.addr,
- h2_session->c->repinfo.addrlen);
+ &h2_session->c->repinfo.remote_addr,
+ h2_session->c->repinfo.remote_addrlen);
#else /* USE_WINSOCK */
if(WSAGetLastError() == WSAECONNRESET)
return NGHTTP2_ERR_CALLBACK_FAILURE;
@@ -2766,8 +3239,8 @@ ssize_t http2_recv_cb(nghttp2_session* ATTR_UNUSED(session), uint8_t* buf,
}
log_err_addr("could not http2 recv: %s",
wsa_strerror(WSAGetLastError()),
- &h2_session->c->repinfo.addr,
- h2_session->c->repinfo.addrlen);
+ &h2_session->c->repinfo.remote_addr,
+ h2_session->c->repinfo.remote_addrlen);
#endif
return NGHTTP2_ERR_CALLBACK_FAILURE;
}
@@ -2789,8 +3262,8 @@ comm_point_http2_handle_read(int ATTR_UNUSED(fd), struct comm_point* c)
if(ret != NGHTTP2_ERR_EOF &&
ret != NGHTTP2_ERR_CALLBACK_FAILURE) {
char a[256];
- addr_to_str(&c->repinfo.addr, c->repinfo.addrlen,
- a, sizeof(a));
+ addr_to_str(&c->repinfo.remote_addr,
+ c->repinfo.remote_addrlen, a, sizeof(a));
verbose(VERB_QUERY, "http2: session_recv from %s failed, "
"error: %s", a, nghttp2_strerror(ret));
}
@@ -2938,7 +3411,7 @@ http_check_connect(int fd, struct comm_point* c)
return 0; /* silence lots of chatter in the logs */
else if(error != 0) {
log_err_addr("http connect", strerror(error),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr, c->repinfo.remote_addrlen);
#else /* USE_WINSOCK */
/* examine error */
if(error == WSAEINPROGRESS)
@@ -2950,7 +3423,7 @@ http_check_connect(int fd, struct comm_point* c)
return 0;
else if(error != 0) {
log_err_addr("http connect", wsa_strerror(error),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr, c->repinfo.remote_addrlen);
#endif /* USE_WINSOCK */
return 0;
}
@@ -3020,7 +3493,7 @@ http_write_more(int fd, struct comm_point* c)
}
#endif
log_err_addr("http send r", sock_strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
+ &c->repinfo.remote_addr, c->repinfo.remote_addrlen);
return 0;
}
sldns_buffer_skip(c->buffer, r);
@@ -3084,8 +3557,8 @@ ssize_t http2_send_cb(nghttp2_session* ATTR_UNUSED(session), const uint8_t* buf,
return NGHTTP2_ERR_CALLBACK_FAILURE;
#endif
log_err_addr("could not http2 write: %s", strerror(errno),
- &h2_session->c->repinfo.addr,
- h2_session->c->repinfo.addrlen);
+ &h2_session->c->repinfo.remote_addr,
+ h2_session->c->repinfo.remote_addrlen);
#else /* USE_WINSOCK */
if(WSAGetLastError() == WSAENOTCONN)
return NGHTTP2_ERR_WOULDBLOCK;
@@ -3100,8 +3573,8 @@ ssize_t http2_send_cb(nghttp2_session* ATTR_UNUSED(session), const uint8_t* buf,
return NGHTTP2_ERR_CALLBACK_FAILURE;
log_err_addr("could not http2 write: %s",
wsa_strerror(WSAGetLastError()),
- &h2_session->c->repinfo.addr,
- h2_session->c->repinfo.addrlen);
+ &h2_session->c->repinfo.remote_addr,
+ h2_session->c->repinfo.remote_addrlen);
#endif
return NGHTTP2_ERR_CALLBACK_FAILURE;
}
@@ -3281,7 +3754,8 @@ void comm_point_raw_handle_callback(int ATTR_UNUSED(fd),
struct comm_point*
comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer,
- comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket)
+ int pp2_enabled, comm_point_callback_type* callback,
+ void* callback_arg, struct unbound_socket* socket)
{
struct comm_point* c = (struct comm_point*)calloc(1,
sizeof(struct comm_point));
@@ -3321,6 +3795,8 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer,
c->callback = callback;
c->cb_arg = callback_arg;
c->socket = socket;
+ c->pp2_enabled = pp2_enabled;
+ c->pp2_header_state = pp2_header_none;
evbits = UB_EV_READ | UB_EV_PERSIST;
/* ub_event stuff */
c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
@@ -3340,8 +3816,8 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer,
}
struct comm_point*
-comm_point_create_udp_ancil(struct comm_base *base, int fd,
- sldns_buffer* buffer,
+comm_point_create_udp_ancil(struct comm_base *base, int fd,
+ sldns_buffer* buffer, int pp2_enabled,
comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket)
{
struct comm_point* c = (struct comm_point*)calloc(1,
@@ -3382,6 +3858,8 @@ comm_point_create_udp_ancil(struct comm_base *base, int fd,
c->callback = callback;
c->cb_arg = callback_arg;
c->socket = socket;
+ c->pp2_enabled = pp2_enabled;
+ c->pp2_header_state = pp2_header_none;
evbits = UB_EV_READ | UB_EV_PERSIST;
/* ub_event stuff */
c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
@@ -3461,6 +3939,8 @@ comm_point_create_tcp_handler(struct comm_base *base,
c->callback = callback;
c->cb_arg = callback_arg;
c->socket = socket;
+ c->pp2_enabled = parent->pp2_enabled;
+ c->pp2_header_state = pp2_header_none;
if(spoolbuf) {
c->tcp_req_info = tcp_req_info_create(spoolbuf);
if(!c->tcp_req_info) {
@@ -3556,6 +4036,8 @@ comm_point_create_http_handler(struct comm_base *base,
c->callback = callback;
c->cb_arg = callback_arg;
c->socket = socket;
+ c->pp2_enabled = 0;
+ c->pp2_header_state = pp2_header_none;
c->http_min_version = http_version_2;
c->http2_stream_max_qbuffer_size = bufsize;
@@ -3620,7 +4102,8 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num,
uint32_t http_max_streams, char* http_endpoint,
struct tcl_list* tcp_conn_limit, size_t bufsize,
struct sldns_buffer* spoolbuf, enum listen_type port_type,
- comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket)
+ int pp2_enabled, comm_point_callback_type* callback,
+ void* callback_arg, struct unbound_socket* socket)
{
struct comm_point* c = (struct comm_point*)calloc(1,
sizeof(struct comm_point));
@@ -3671,6 +4154,8 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num,
c->callback = NULL;
c->cb_arg = NULL;
c->socket = socket;
+ c->pp2_enabled = (port_type==listen_type_http?0:pp2_enabled);
+ c->pp2_header_state = pp2_header_none;
evbits = UB_EV_READ | UB_EV_PERSIST;
/* ub_event stuff */
c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
@@ -3763,6 +4248,8 @@ comm_point_create_tcp_out(struct comm_base *base, size_t bufsize,
c->repinfo.c = c;
c->callback = callback;
c->cb_arg = callback_arg;
+ c->pp2_enabled = 0;
+ c->pp2_header_state = pp2_header_none;
evbits = UB_EV_PERSIST | UB_EV_WRITE;
c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
comm_point_tcp_handle_callback, c);
@@ -3829,6 +4316,8 @@ comm_point_create_http_out(struct comm_base *base, size_t bufsize,
c->repinfo.c = c;
c->callback = callback;
c->cb_arg = callback_arg;
+ c->pp2_enabled = 0;
+ c->pp2_header_state = pp2_header_none;
evbits = UB_EV_PERSIST | UB_EV_WRITE;
c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
comm_point_http_handle_callback, c);
@@ -3892,6 +4381,8 @@ comm_point_create_local(struct comm_base *base, int fd, size_t bufsize,
#endif
c->callback = callback;
c->cb_arg = callback_arg;
+ c->pp2_enabled = 0;
+ c->pp2_header_state = pp2_header_none;
/* ub_event stuff */
evbits = UB_EV_PERSIST | UB_EV_READ;
c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
@@ -3953,6 +4444,8 @@ comm_point_create_raw(struct comm_base* base, int fd, int writing,
#endif
c->callback = callback;
c->cb_arg = callback_arg;
+ c->pp2_enabled = 0;
+ c->pp2_header_state = pp2_header_none;
/* ub_event stuff */
if(writing)
evbits = UB_EV_PERSIST | UB_EV_WRITE;
@@ -4068,20 +4561,21 @@ comm_point_send_reply(struct comm_reply *repinfo)
#endif
if(repinfo->c->type == comm_udp) {
if(repinfo->srctype)
- comm_point_send_udp_msg_if(repinfo->c,
- buffer, (struct sockaddr*)&repinfo->addr,
- repinfo->addrlen, repinfo);
+ comm_point_send_udp_msg_if(repinfo->c, buffer,
+ (struct sockaddr*)&repinfo->remote_addr,
+ repinfo->remote_addrlen, repinfo);
else
comm_point_send_udp_msg(repinfo->c, buffer,
- (struct sockaddr*)&repinfo->addr, repinfo->addrlen, 0);
+ (struct sockaddr*)&repinfo->remote_addr,
+ repinfo->remote_addrlen, 0);
#ifdef USE_DNSTAP
/*
* sending src (client)/dst (local service) addresses over DNSTAP from udp callback
*/
if(repinfo->c->dtenv != NULL && repinfo->c->dtenv->log_client_response_messages) {
log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen);
- log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen);
- dt_msg_send_client_response(repinfo->c->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type, repinfo->c->buffer);
+ log_addr(VERB_ALGO, "response to client", &repinfo->client_addr, repinfo->client_addrlen);
+ dt_msg_send_client_response(repinfo->c->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type, repinfo->c->buffer);
}
#endif
} else {
@@ -4091,8 +4585,8 @@ comm_point_send_reply(struct comm_reply *repinfo)
*/
if(repinfo->c->tcp_parent->dtenv != NULL && repinfo->c->tcp_parent->dtenv->log_client_response_messages) {
log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen);
- log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen);
- dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type,
+ log_addr(VERB_ALGO, "response to client", &repinfo->client_addr, repinfo->client_addrlen);
+ dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type,
( repinfo->c->tcp_req_info? repinfo->c->tcp_req_info->spool_buffer: repinfo->c->buffer ));
}
#endif
diff --git a/util/netevent.h b/util/netevent.h
index 9f4d28ba9f8f..3e7849c13949 100644
--- a/util/netevent.h
+++ b/util/netevent.h
@@ -102,6 +102,8 @@ typedef int comm_point_callback_type(struct comm_point*, void*, int,
/** timeout to slow accept calls when not possible, in msec. */
#define NETEVENT_SLOW_ACCEPT_TIME 2000
+/** timeout to slow down log print, so it does not spam the logs, in sec */
+#define SLOW_LOG_TIME 10
/**
* A communication point dispatcher. Thread specific.
@@ -126,10 +128,11 @@ struct comm_reply {
/** the comm_point with fd to send reply on to. */
struct comm_point* c;
/** the address (for UDP based communication) */
- struct sockaddr_storage addr;
+ struct sockaddr_storage remote_addr;
/** length of address */
- socklen_t addrlen;
- /** return type 0 (none), 4(IP4), 6(IP6) */
+ socklen_t remote_addrlen;
+ /** return type 0 (none), 4(IP4), 6(IP6)
+ * used only with listen_type_udp_ancil* */
int srctype;
/* DnsCrypt context */
#ifdef USE_DNSCRYPT
@@ -153,6 +156,13 @@ struct comm_reply {
pktinfo;
/** max udp size for udp packets */
size_t max_udp_size;
+ /* if set, the request came through a proxy */
+ int is_proxied;
+ /** the client address
+ * the same as remote_addr if not proxied */
+ struct sockaddr_storage client_addr;
+ /** the original address length */
+ socklen_t client_addrlen;
};
/**
@@ -276,6 +286,19 @@ struct comm_point {
/** variable with type of socket, UDP,TCP-accept,TCP,pipe */
type;
+ /* -------- PROXYv2 ------- */
+ /** if set, PROXYv2 is expected on this connection */
+ int pp2_enabled;
+ /** header state for the PROXYv2 header (for TCP) */
+ enum {
+ /** no header encounter yet */
+ pp2_header_none = 0,
+ /** read the static part of the header */
+ pp2_header_init,
+ /** read the full header */
+ pp2_header_done
+ } pp2_header_state;
+
/* ---------- Behaviour ----------- */
/** if set the connection is NOT closed on delete. */
int do_not_close;
@@ -494,8 +517,9 @@ struct ub_event_base* comm_base_internal(struct comm_base* b);
* Create an UDP comm point. Calls malloc.
* setups the structure with the parameters you provide.
* @param base: in which base to alloc the commpoint.
- * @param fd : file descriptor of open UDP socket.
+ * @param fd: file descriptor of open UDP socket.
* @param buffer: shared buffer by UDP sockets from this thread.
+ * @param pp2_enabled: if the comm point will support PROXYv2.
* @param callback: callback function pointer.
* @param callback_arg: will be passed to your callback function.
* @param socket: and opened socket properties will be passed to your callback function.
@@ -503,7 +527,7 @@ struct ub_event_base* comm_base_internal(struct comm_base* b);
* Sets timeout to NULL. Turns off TCP options.
*/
struct comm_point* comm_point_create_udp(struct comm_base* base,
- int fd, struct sldns_buffer* buffer,
+ int fd, struct sldns_buffer* buffer, int pp2_enabled,
comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket);
/**
@@ -511,8 +535,9 @@ struct comm_point* comm_point_create_udp(struct comm_base* base,
* Uses recvmsg instead of recv to get udp message.
* setups the structure with the parameters you provide.
* @param base: in which base to alloc the commpoint.
- * @param fd : file descriptor of open UDP socket.
+ * @param fd: file descriptor of open UDP socket.
* @param buffer: shared buffer by UDP sockets from this thread.
+ * @param pp2_enabled: if the comm point will support PROXYv2.
* @param callback: callback function pointer.
* @param callback_arg: will be passed to your callback function.
* @param socket: and opened socket properties will be passed to your callback function.
@@ -520,7 +545,7 @@ struct comm_point* comm_point_create_udp(struct comm_base* base,
* Sets timeout to NULL. Turns off TCP options.
*/
struct comm_point* comm_point_create_udp_ancil(struct comm_base* base,
- int fd, struct sldns_buffer* buffer,
+ int fd, struct sldns_buffer* buffer, int pp2_enabled,
comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket);
/**
@@ -542,6 +567,7 @@ struct comm_point* comm_point_create_udp_ancil(struct comm_base* base,
* or NULL to not create those structures in the tcp handlers.
* @param port_type: the type of port we are creating a TCP listener for. Used
* to select handler type to use.
+ * @param pp2_enabled: if the comm point will support PROXYv2.
* @param callback: callback function pointer for TCP handlers.
* @param callback_arg: will be passed to your callback function.
* @param socket: and opened socket properties will be passed to your callback function.
@@ -555,7 +581,7 @@ struct comm_point* comm_point_create_tcp(struct comm_base* base,
uint32_t http_max_streams, char* http_endpoint,
struct tcl_list* tcp_conn_limit,
size_t bufsize, struct sldns_buffer* spoolbuf,
- enum listen_type port_type,
+ enum listen_type port_type, int pp2_enabled,
comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket);
/**
diff --git a/util/proxy_protocol.c b/util/proxy_protocol.c
new file mode 100644
index 000000000000..757c5141db96
--- /dev/null
+++ b/util/proxy_protocol.c
@@ -0,0 +1,139 @@
+/*
+ * util/proxy_protocol.c - event notification
+ *
+ * Copyright (c) 2022, NLnet Labs. 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.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains PROXY protocol functions.
+ */
+#include "config.h"
+#include "util/log.h"
+#include "util/proxy_protocol.h"
+
+int
+pp2_write_to_buf(struct sldns_buffer* buf, struct sockaddr_storage* src,
+ int stream)
+{
+ int af;
+ if(!src) return 0;
+ af = (int)((struct sockaddr_in*)src)->sin_family;
+ if(sldns_buffer_remaining(buf) <
+ PP2_HEADER_SIZE + (af==AF_INET?12:36)) {
+ return 0;
+ }
+ /* sig */
+ sldns_buffer_write(buf, PP2_SIG, PP2_SIG_LEN);
+ /* version and command */
+ sldns_buffer_write_u8(buf, (PP2_VERSION << 4) | PP2_CMD_PROXY);
+ if(af==AF_INET) {
+ /* family and protocol */
+ sldns_buffer_write_u8(buf,
+ (PP2_AF_INET<<4) |
+ (stream?PP2_PROT_STREAM:PP2_PROT_DGRAM));
+ /* length */
+ sldns_buffer_write_u16(buf, 12);
+ /* src addr */
+ sldns_buffer_write(buf,
+ &((struct sockaddr_in*)src)->sin_addr.s_addr, 4);
+ /* dst addr */
+ sldns_buffer_write_u32(buf, 0);
+ /* src port */
+ sldns_buffer_write(buf,
+ &((struct sockaddr_in*)src)->sin_port, 2);
+ /* dst port */
+ sldns_buffer_write_u16(buf, 0);
+ } else {
+ /* family and protocol */
+ sldns_buffer_write_u8(buf,
+ (PP2_AF_INET6<<4) |
+ (stream?PP2_PROT_STREAM:PP2_PROT_DGRAM));
+ /* length */
+ sldns_buffer_write_u16(buf, 36);
+ /* src addr */
+ sldns_buffer_write(buf,
+ &((struct sockaddr_in6*)src)->sin6_addr, 16);
+ /* dst addr */
+ sldns_buffer_set_at(buf,
+ sldns_buffer_position(buf), 0, 16);
+ sldns_buffer_skip(buf, 16);
+ /* src port */
+ sldns_buffer_write(buf,
+ &((struct sockaddr_in6*)src)->sin6_port, 2);
+ /* dst port */
+ sldns_buffer_write_u16(buf, 0);
+ }
+ return 1;
+}
+
+struct pp2_header*
+pp2_read_header(struct sldns_buffer* buf)
+{
+ size_t size;
+ struct pp2_header* header = (struct pp2_header*)sldns_buffer_begin(buf);
+ /* Try to fail all the unsupported cases first. */
+ if(sldns_buffer_remaining(buf) < PP2_HEADER_SIZE) {
+ log_err("proxy_protocol: not enough space for header");
+ return NULL;
+ }
+ /* Check for PROXYv2 header */
+ if(memcmp(header, PP2_SIG, PP2_SIG_LEN) != 0 ||
+ ((header->ver_cmd & 0xF0)>>4) != PP2_VERSION) {
+ log_err("proxy_protocol: could not match PROXYv2 header");
+ return NULL;
+ }
+ /* Check the length */
+ size = PP2_HEADER_SIZE + ntohs(header->len);
+ if(sldns_buffer_remaining(buf) < size) {
+ log_err("proxy_protocol: not enough space for header");
+ return NULL;
+ }
+ /* Check for supported commands */
+ if((header->ver_cmd & 0xF) != PP2_CMD_LOCAL &&
+ (header->ver_cmd & 0xF) != PP2_CMD_PROXY) {
+ log_err("proxy_protocol: unsupported command");
+ return NULL;
+ }
+ /* Check for supported family and protocol */
+ if(header->fam_prot != 0x00 /* AF_UNSPEC|UNSPEC */ &&
+ header->fam_prot != 0x11 /* AF_INET|STREAM */ &&
+ header->fam_prot != 0x12 /* AF_INET|DGRAM */ &&
+ header->fam_prot != 0x21 /* AF_INET6|STREAM */ &&
+ header->fam_prot != 0x22 /* AF_INET6|DGRAM */) {
+ log_err("proxy_protocol: unsupported family and protocol");
+ return NULL;
+ }
+ /* We have a correct header */
+ return header;
+}
diff --git a/util/proxy_protocol.h b/util/proxy_protocol.h
new file mode 100644
index 000000000000..13cab9d7438e
--- /dev/null
+++ b/util/proxy_protocol.h
@@ -0,0 +1,131 @@
+/*
+ * util/proxy_protocol.h - PROXY protocol
+ *
+ * Copyright (c) 2022, NLnet Labs. 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.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains PROXY protocol structs and functions.
+ * Only v2 is supported. TLVs are not currently supported.
+ */
+#ifndef PROXY_PROTOCOL_H
+#define PROXY_PROTOCOL_H
+
+#include "sldns/sbuffer.h"
+
+/** PROXYv2 minimum header size */
+#define PP2_HEADER_SIZE 16
+
+/** PROXYv2 header signature */
+#define PP2_SIG "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A"
+#define PP2_SIG_LEN 12
+
+/** PROXYv2 version */
+#define PP2_VERSION 0x2
+
+/**
+ * PROXYv2 command.
+ */
+enum pp2_command {
+ PP2_CMD_LOCAL = 0x0,
+ PP2_CMD_PROXY = 0x1
+};
+
+/**
+ * PROXYv2 address family.
+ */
+enum pp2_af {
+ PP2_AF_UNSPEC = 0x0,
+ PP2_AF_INET = 0x1,
+ PP2_AF_INET6 = 0x2,
+ PP2_AF_UNIX = 0x3
+};
+
+/**
+ * PROXYv2 protocol.
+ */
+enum pp2_protocol {
+ PP2_PROT_UNSPEC = 0x0,
+ PP2_PROT_STREAM = 0x1,
+ PP2_PROT_DGRAM = 0x2
+};
+
+/**
+ * PROXYv2 header.
+ */
+struct pp2_header {
+ uint8_t sig[PP2_SIG_LEN];
+ uint8_t ver_cmd;
+ uint8_t fam_prot;
+ uint16_t len;
+ union {
+ struct { /* for TCP/UDP over IPv4, len = 12 */
+ uint32_t src_addr;
+ uint32_t dst_addr;
+ uint16_t src_port;
+ uint16_t dst_port;
+ } addr4;
+ struct { /* for TCP/UDP over IPv6, len = 36 */
+ uint8_t src_addr[16];
+ uint8_t dst_addr[16];
+ uint16_t src_port;
+ uint16_t dst_port;
+ } addr6;
+ struct { /* for AF_UNIX sockets, len = 216 */
+ uint8_t src_addr[108];
+ uint8_t dst_addr[108];
+ } addru;
+ } addr;
+};
+
+/**
+ * Write a PROXYv2 header at the current position of the buffer.
+ * @param buf: the buffer to write to.
+ * @param src: the source address.
+ * @param stream: if the protocol is stream or datagram.
+ * @return 1 on success, 0 on failure.
+ */
+int pp2_write_to_buf(struct sldns_buffer* buf, struct sockaddr_storage* src,
+ int stream);
+
+/**
+ * Read a PROXYv2 header from the current position of the buffer.
+ * It does initial validation and returns a pointer to the buffer position on
+ * success.
+ * @param buf: the buffer to read from.
+ * @return the pointer to the buffer position on success, NULL on error.
+ */
+struct pp2_header* pp2_read_header(struct sldns_buffer* buf);
+
+#endif /* PROXY_PROTOCOL_H */
diff --git a/util/storage/dnstree.c b/util/storage/dnstree.c
index f883044afa4b..eef393f91b69 100644
--- a/util/storage/dnstree.c
+++ b/util/storage/dnstree.c
@@ -71,6 +71,14 @@ int addr_tree_compare(const void* k1, const void* k2)
return 0;
}
+int addr_tree_addrport_compare(const void* k1, const void* k2)
+{
+ struct addr_tree_node* n1 = (struct addr_tree_node*)k1;
+ struct addr_tree_node* n2 = (struct addr_tree_node*)k2;
+ return sockaddr_cmp(&n1->addr, n1->addrlen, &n2->addr,
+ n2->addrlen);
+}
+
void name_tree_init(rbtree_type* tree)
{
rbtree_init(tree, &name_tree_compare);
@@ -81,6 +89,11 @@ void addr_tree_init(rbtree_type* tree)
rbtree_init(tree, &addr_tree_compare);
}
+void addr_tree_addrport_init(rbtree_type* tree)
+{
+ rbtree_init(tree, &addr_tree_addrport_compare);
+}
+
int name_tree_insert(rbtree_type* tree, struct name_tree_node* node,
uint8_t* name, size_t len, int labs, uint16_t dclass)
{
diff --git a/util/storage/dnstree.h b/util/storage/dnstree.h
index d54602fd7ddf..8aaa94098bc7 100644
--- a/util/storage/dnstree.h
+++ b/util/storage/dnstree.h
@@ -154,6 +154,13 @@ int name_tree_next_root(rbtree_type* tree, uint16_t* dclass);
void addr_tree_init(rbtree_type* tree);
/**
+ * Init addr tree to be empty.
+ * The comparison function to be used is addr_tree_addrport_compare.
+ * @param tree: to init.
+ */
+void addr_tree_addrport_init(rbtree_type* tree);
+
+/**
* insert element into addr tree.
* @param tree: addr tree
* @param node: node element (at start of a structure that caller
@@ -207,4 +214,7 @@ int name_tree_compare(const void* k1, const void* k2);
/** compare addr tree nodes */
int addr_tree_compare(const void* k1, const void* k2);
+/** compare addr tree nodes (address and port only) */
+int addr_tree_addrport_compare(const void* k1, const void* k2);
+
#endif /* UTIL_STORAGE_DNSTREE_H */
diff --git a/util/tube.c b/util/tube.c
index 40556e72020b..43455feefb7f 100644
--- a/util/tube.c
+++ b/util/tube.c
@@ -424,6 +424,28 @@ int tube_wait(struct tube* tube)
return pollit(tube->sr, NULL);
}
+int tube_wait_timeout(struct tube* tube, int msec)
+{
+ struct timeval t;
+ int fd = tube->sr;
+ fd_set r;
+ t.tv_sec = msec/1000;
+ t.tv_usec = (msec%1000)*1000;
+#ifndef S_SPLINT_S
+ FD_ZERO(&r);
+ FD_SET(FD_SET_T fd, &r);
+#endif
+ while(1) {
+ if(select(fd+1, &r, NULL, NULL, &t) == -1) {
+ if(errno == EAGAIN || errno == EINTR)
+ continue;
+ return -1;
+ }
+ break;
+ }
+ return (int)(FD_ISSET(fd, &r));
+}
+
int tube_read_fd(struct tube* tube)
{
return tube->sr;
@@ -649,6 +671,26 @@ int tube_wait(struct tube* tube)
return 1;
}
+int tube_wait_timeout(struct tube* tube, int msec)
+{
+ /* block on eventhandle */
+ DWORD res = WSAWaitForMultipleEvents(
+ 1 /* one event in array */,
+ &tube->event /* the event to wait for, our pipe signal */,
+ 0 /* wait for all events is false */,
+ msec /* wait for timeout */,
+ 0 /* we are not alertable for IO completion routines */
+ );
+ if(res == WSA_WAIT_TIMEOUT) {
+ return 0;
+ }
+ if(res == WSA_WAIT_IO_COMPLETION) {
+ /* a bit unexpected, since we were not alertable */
+ return -1;
+ }
+ return 1;
+}
+
int tube_read_fd(struct tube* ATTR_UNUSED(tube))
{
/* nothing sensible on Windows */
diff --git a/util/tube.h b/util/tube.h
index 5b1fdb8e8f46..5e4fb86445c9 100644
--- a/util/tube.h
+++ b/util/tube.h
@@ -205,6 +205,14 @@ int tube_poll(struct tube* tube);
int tube_wait(struct tube* tube);
/**
+ * Wait for data to be ready with a timeout.
+ * @param tube: the tube to wait on.
+ * @param msec: timeout in milliseconds.
+ * @return 1 if there is something to read within timeout, readability.
+ * 0 on a timeout. On failures -1, like errors. */
+int tube_wait_timeout(struct tube* tube, int msec);
+
+/**
* Get FD that is readable when new information arrives.
* @param tube
* @return file descriptor.