diff options
author | Florian Obser <florian@cvs.openbsd.org> | 2021-08-14 07:32:48 +0000 |
---|---|---|
committer | Florian Obser <florian@cvs.openbsd.org> | 2021-08-14 07:32:48 +0000 |
commit | b51c864806a066ce617dfcd65951540e719ab080 (patch) | |
tree | 0194a2abf0ac5fd2ba03a98b8bd73dc2a3db532c /sbin | |
parent | d8fb84208eb13bb884baa554125344b1c940ce20 (diff) |
sync to unbound 1.13.2
OK sthen
Diffstat (limited to 'sbin')
65 files changed, 7820 insertions, 3553 deletions
diff --git a/sbin/unwind/libunbound/config.h b/sbin/unwind/libunbound/config.h index 8043b28f056..435139a9ee4 100644 --- a/sbin/unwind/libunbound/config.h +++ b/sbin/unwind/libunbound/config.h @@ -29,6 +29,9 @@ /* Whether daemon is deprecated */ /* #undef DEPRECATED_DAEMON */ +/* Deprecate RSA 1024 bit length, makes that an unsupported key */ +/* #undef DEPRECATE_RSA_1024 */ + /* Define this to enable kernel based UDP source port randomization. */ #define DISABLE_EXPLICIT_PORT_RANDOMISATION 1 @@ -218,7 +221,7 @@ #define HAVE_EVP_CLEANUP 1 /* Define to 1 if you have the `EVP_DigestVerify' function. */ -/* #undef HAVE_EVP_DIGESTVERIFY */ +#define HAVE_EVP_DIGESTVERIFY 1 /* Define to 1 if you have the `EVP_dss1' function. */ #define HAVE_EVP_DSS1 1 @@ -427,6 +430,9 @@ /* Define to 1 if you have the `OPENSSL_init_ssl' function. */ #define HAVE_OPENSSL_INIT_SSL 1 +/* Define to 1 if you have the <openssl/param_build.h> header file. */ +/* #undef HAVE_OPENSSL_PARAM_BUILD_H */ + /* Define to 1 if you have the <openssl/rand.h> header file. */ #define HAVE_OPENSSL_RAND_H 1 @@ -436,6 +442,9 @@ /* Define to 1 if you have the <openssl/ssl.h> header file. */ #define HAVE_OPENSSL_SSL_H 1 +/* Define to 1 if you have the `OSSL_PARAM_BLD_new' function. */ +/* #undef HAVE_OSSL_PARAM_BLD_NEW */ + /* Define if you have POSIX threads libraries and header files. */ /* #undef HAVE_PTHREAD */ @@ -517,6 +526,9 @@ /* Define if you have the SSL libraries installed. */ #define HAVE_SSL /**/ +/* Define to 1 if you have the `SSL_CTX_set_alpn_protos' function. */ +#define HAVE_SSL_CTX_SET_ALPN_PROTOS 1 + /* Define to 1 if you have the `SSL_CTX_set_alpn_select_cb' function. */ #define HAVE_SSL_CTX_SET_ALPN_SELECT_CB 1 @@ -530,8 +542,14 @@ function. */ /* #undef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB */ +/* Define to 1 if you have the `SSL_get0_alpn_selected' function. */ +#define HAVE_SSL_GET0_ALPN_SELECTED 1 + /* Define to 1 if you have the `SSL_get0_peername' function. */ -/* #undef HAVE_SSL_GET0_PEERNAME */ +#define HAVE_SSL_GET0_PEERNAME 1 + +/* Define to 1 if you have the `SSL_get1_peer_certificate' function. */ +/* #undef HAVE_SSL_GET1_PEER_CERTIFICATE */ /* Define to 1 if you have the `SSL_set1_host' function. */ #define HAVE_SSL_SET1_HOST 1 @@ -730,7 +748,7 @@ #define PACKAGE_NAME "unbound" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "unbound 1.13.1" +#define PACKAGE_STRING "unbound 1.13.2" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "unbound" @@ -739,7 +757,7 @@ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "1.13.1" +#define PACKAGE_VERSION "1.13.2" /* default pidfile location */ #define PIDFILE "" @@ -762,7 +780,7 @@ #define ROOT_CERT_FILE "/var/unbound/etc/icannbundle.pem" /* version number for resource files */ -#define RSRC_PACKAGE_VERSION 1,13,1,0 +#define RSRC_PACKAGE_VERSION 1,13,2,0 /* Directory to chdir to */ #define RUN_DIR "/var/unbound/etc" @@ -848,6 +866,14 @@ /* Define if you enable libevent */ #define USE_LIBEVENT 1 +/* Define this to enable use of /proc/sys/net/ipv4/ip_local_port_range as a + default outgoing port range. This is only for the libunbound on Linux and + does not affect unbound resolving daemon itself. This may severely limit + the number of available outgoing ports and thus decrease randomness. Define + this only when the target system restricts (e.g. some of SELinux enabled + distributions) the use of non-ephemeral ports. */ +/* #undef USE_LINUX_IP_LOCAL_PORT_RANGE */ + /* Define if you want to use internal select based events */ /* #undef USE_MINI_EVENT */ diff --git a/sbin/unwind/libunbound/dnstap/dnstap.h b/sbin/unwind/libunbound/dnstap/dnstap.h index 783b8c51430..449fae727ea 100644 --- a/sbin/unwind/libunbound/dnstap/dnstap.h +++ b/sbin/unwind/libunbound/dnstap/dnstap.h @@ -123,12 +123,14 @@ dt_delete(struct dt_env *env); * Create and send a new dnstap "Message" event of type CLIENT_QUERY. * @param env: dnstap environment object. * @param qsock: address/port of client. + * @param rsock: local (service) address/port. * @param cptype: comm_udp or comm_tcp. * @param qmsg: query message. */ void dt_msg_send_client_query(struct dt_env *env, struct sockaddr_storage *qsock, + struct sockaddr_storage *rsock, enum comm_point_type cptype, struct sldns_buffer *qmsg); @@ -136,12 +138,14 @@ dt_msg_send_client_query(struct dt_env *env, * Create and send a new dnstap "Message" event of type CLIENT_RESPONSE. * @param env: dnstap environment object. * @param qsock: address/port of client. + * @param rsock: local (service) address/port. * @param cptype: comm_udp or comm_tcp. * @param rmsg: response message. */ void dt_msg_send_client_response(struct dt_env *env, struct sockaddr_storage *qsock, + struct sockaddr_storage *rsock, enum comm_point_type cptype, struct sldns_buffer *rmsg); @@ -150,7 +154,8 @@ dt_msg_send_client_response(struct dt_env *env, * FORWARDER_QUERY. The type used is dependent on the value of the RD bit * in the query header. * @param env: dnstap environment object. - * @param rsock: address/port of server the query is being sent to. + * @param rsock: address/port of server (upstream) the query is being sent to. + * @param qsock: address/port of server (local) the query is being sent from. * @param cptype: comm_udp or comm_tcp. * @param zone: query zone. * @param zone_len: length of zone. @@ -159,6 +164,7 @@ dt_msg_send_client_response(struct dt_env *env, void dt_msg_send_outside_query(struct dt_env *env, struct sockaddr_storage *rsock, + struct sockaddr_storage *qsock, enum comm_point_type cptype, uint8_t *zone, size_t zone_len, struct sldns_buffer *qmsg); @@ -168,7 +174,8 @@ dt_msg_send_outside_query(struct dt_env *env, * FORWARDER_RESPONSE. The type used is dependent on the value of the RD bit * in the query header. * @param env: dnstap environment object. - * @param rsock: address/port of server the response was received from. + * @param rsock: address/port of server (upstream) the response was received from. + * @param qsock: address/port of server (local) the response was received to. * @param cptype: comm_udp or comm_tcp. * @param zone: query zone. * @param zone_len: length of zone. @@ -181,6 +188,7 @@ dt_msg_send_outside_query(struct dt_env *env, void dt_msg_send_outside_response(struct dt_env *env, struct sockaddr_storage *rsock, + struct sockaddr_storage *qsock, enum comm_point_type cptype, uint8_t *zone, size_t zone_len, uint8_t *qbuf, size_t qbuf_len, diff --git a/sbin/unwind/libunbound/iterator/iter_scrub.c b/sbin/unwind/libunbound/iterator/iter_scrub.c index aae934dd44f..f093c1bf999 100644 --- a/sbin/unwind/libunbound/iterator/iter_scrub.c +++ b/sbin/unwind/libunbound/iterator/iter_scrub.c @@ -640,25 +640,37 @@ store_rrset(sldns_buffer* pkt, struct msg_parse* msg, struct module_env* env, /** * Check if right hand name in NSEC is within zone + * @param pkt: the packet buffer for decompression. * @param rrset: the NSEC rrset * @param zonename: the zone name. * @return true if BAD. */ -static int sanitize_nsec_is_overreach(struct rrset_parse* rrset, - uint8_t* zonename) +static int sanitize_nsec_is_overreach(sldns_buffer* pkt, + struct rrset_parse* rrset, uint8_t* zonename) { struct rr_parse* rr; uint8_t* rhs; size_t len; log_assert(rrset->type == LDNS_RR_TYPE_NSEC); for(rr = rrset->rr_first; rr; rr = rr->next) { + size_t pos = sldns_buffer_position(pkt); + size_t rhspos; rhs = rr->ttl_data+4+2; len = sldns_read_uint16(rr->ttl_data+4); - if(!dname_valid(rhs, len)) { - /* malformed domain name in rdata */ + rhspos = rhs-sldns_buffer_begin(pkt); + sldns_buffer_set_position(pkt, rhspos); + if(pkt_dname_len(pkt) == 0) { + /* malformed */ + sldns_buffer_set_position(pkt, pos); return 1; } - if(!dname_subdomain_c(rhs, zonename)) { + if(sldns_buffer_position(pkt)-rhspos > len) { + /* outside of rdata boundaries */ + sldns_buffer_set_position(pkt, pos); + return 1; + } + sldns_buffer_set_position(pkt, pos); + if(!pkt_sub(pkt, rhs, zonename)) { /* overreaching */ return 1; } @@ -791,7 +803,7 @@ scrub_sanitize(sldns_buffer* pkt, struct msg_parse* msg, } /* check if right hand side of NSEC is within zone */ if(rrset->type == LDNS_RR_TYPE_NSEC && - sanitize_nsec_is_overreach(rrset, zonename)) { + sanitize_nsec_is_overreach(pkt, rrset, zonename)) { remove_rrset("sanitize: removing overreaching NSEC " "RRset:", pkt, msg, prev, &rrset); continue; diff --git a/sbin/unwind/libunbound/iterator/iter_utils.c b/sbin/unwind/libunbound/iterator/iter_utils.c index 7bc67da69b2..668f898eb0f 100644 --- a/sbin/unwind/libunbound/iterator/iter_utils.c +++ b/sbin/unwind/libunbound/iterator/iter_utils.c @@ -50,6 +50,7 @@ #include "services/cache/infra.h" #include "services/cache/dns.h" #include "services/cache/rrset.h" +#include "services/outside_network.h" #include "util/net_help.h" #include "util/module.h" #include "util/log.h" @@ -439,6 +440,7 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env, prev = NULL; a = dp->result_list; for(i = 0; i < got_num; i++) { + if(!a) break; /* robustness */ swap_to_front = 0; if(a->addr.ss_family != AF_INET6 && attempt == -1) { /* if we only have ip4 at low attempt count, @@ -496,6 +498,7 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env, prev = NULL; a = dp->result_list; for(i = 0; i < got_num; i++) { + if(!a) break; /* robustness */ swap_to_front = 0; if(a->addr.ss_family != AF_INET && attempt == -1) { /* if we only have ip6 at low attempt count, @@ -1390,7 +1393,8 @@ int iter_dp_cangodown(struct query_info* qinfo, struct delegpt* dp) } int -iter_stub_fwd_no_cache(struct module_qstate *qstate, struct query_info *qinf) +iter_stub_fwd_no_cache(struct module_qstate *qstate, struct query_info *qinf, + uint8_t** retdpname, size_t* retdpnamelen) { struct iter_hints_stub *stub; struct delegpt *dp; @@ -1419,6 +1423,10 @@ iter_stub_fwd_no_cache(struct module_qstate *qstate, struct query_info *qinf) dname_str(stub->dp->name, dpname); verbose(VERB_ALGO, "stub for %s %s has no_cache", qname, dpname); } + if(retdpname) { + *retdpname = stub->dp->name; + *retdpnamelen = stub->dp->namelen; + } return (stub->dp->no_cache); } @@ -1431,7 +1439,31 @@ iter_stub_fwd_no_cache(struct module_qstate *qstate, struct query_info *qinf) dname_str(dp->name, dpname); verbose(VERB_ALGO, "forward for %s %s has no_cache", qname, dpname); } + if(retdpname) { + *retdpname = dp->name; + *retdpnamelen = dp->namelen; + } return (dp->no_cache); } + if(retdpname) { + *retdpname = NULL; + *retdpnamelen = 0; + } return 0; } + +void iterator_set_ip46_support(struct module_stack* mods, + struct module_env* env, struct outside_network* outnet) +{ + int m = modstack_find(mods, "iterator"); + struct iter_env* ie = NULL; + if(m == -1) + return; + ie = (struct iter_env*)env->modinfo[m]; + if(outnet->pending == NULL) + return; /* we are in testbound, no rbtree for UDP */ + if(outnet->num_ip4 == 0) + ie->supports_ipv4 = 0; + if(outnet->num_ip6 == 0) + ie->supports_ipv6 = 0; +} diff --git a/sbin/unwind/libunbound/iterator/iter_utils.h b/sbin/unwind/libunbound/iterator/iter_utils.h index f771930bba2..509d2921e30 100644 --- a/sbin/unwind/libunbound/iterator/iter_utils.h +++ b/sbin/unwind/libunbound/iterator/iter_utils.h @@ -59,6 +59,8 @@ struct reply_info; struct module_qstate; struct sock_list; struct ub_packed_rrset_key; +struct module_stack; +struct outside_network; /** * Process config options and set iterator module state. @@ -130,7 +132,7 @@ struct dns_msg* dns_copy_msg(struct dns_msg* from, struct regional* regional); * can be prefetch-updates. * @param region: to copy modified (cache is better) rrs back to. * @param flags: with BIT_CD for dns64 AAAA translated queries. - * @return void, because we are not interested in alloc errors, + * return void, because we are not interested in alloc errors, * the iterator and validator can operate on the results in their * scratch space (the qstate.region) and are not dependent on the cache. * It is useful to log the alloc failure (for the server operator), @@ -380,9 +382,26 @@ int iter_dp_cangodown(struct query_info* qinfo, struct delegpt* dp); * Lookup if no_cache is set in stub or fwd. * @param qstate: query state with env with hints and fwds. * @param qinf: query name to lookup for. + * @param retdpname: returns NULL or the deepest enclosing name of fwd or stub. + * This is the name under which the closest lookup is going to happen. + * Used for NXDOMAIN checks, above that it is an nxdomain from a + * different server and zone. You can pass NULL to not get it. + * @param retdpnamelen: returns the length of the dpname. * @return true if no_cache is set in stub or fwd. */ int iter_stub_fwd_no_cache(struct module_qstate *qstate, - struct query_info *qinf); + struct query_info *qinf, uint8_t** retdpname, size_t* retdpnamelen); + +/** + * Set support for IP4 and IP6 depending on outgoing interfaces + * in the outside network. If none, no support, so no use to lookup + * the AAAA and then attempt to use it if there is no outgoing-interface + * for it. + * @param mods: modstack to find iterator module in. + * @param env: module env, find iterator module (if one) in there. + * @param outnet: outside network structure. + */ +void iterator_set_ip46_support(struct module_stack* mods, + struct module_env* env, struct outside_network* outnet); #endif /* ITERATOR_ITER_UTILS_H */ diff --git a/sbin/unwind/libunbound/iterator/iterator.c b/sbin/unwind/libunbound/iterator/iterator.c index 99d02011784..f0105ad4b08 100644 --- a/sbin/unwind/libunbound/iterator/iterator.c +++ b/sbin/unwind/libunbound/iterator/iterator.c @@ -585,6 +585,60 @@ handle_cname_response(struct module_qstate* qstate, struct iter_qstate* iq, return 1; } +/** add response specific error information for log servfail */ +static void +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)) { + char from[256], frm[512]; + if(qstate->reply && qstate->reply->addrlen != 0) + addr_to_str(&qstate->reply->addr, qstate->reply->addrlen, + from, sizeof(from)); + else + addr_to_str(&iq->fail_reply->addr, iq->fail_reply->addrlen, + from, sizeof(from)); + snprintf(frm, sizeof(frm), "from %s", from); + errinf(qstate, frm); + } + if(iq->scrub_failures || iq->parse_failures) { + if(iq->scrub_failures) + errinf(qstate, "upstream response failed scrub"); + if(iq->parse_failures) + errinf(qstate, "could not parse upstream response"); + } else if(iq->response == NULL && iq->timeout_count != 0) { + errinf(qstate, "upstream server timeout"); + } else if(iq->response == NULL) { + errinf(qstate, "no server to query"); + if(iq->dp) { + if(iq->dp->target_list == NULL) + errinf(qstate, "no addresses for nameservers"); + else errinf(qstate, "nameserver addresses not usable"); + if(iq->dp->nslist == NULL) + errinf(qstate, "have no nameserver names"); + if(iq->dp->bogus) + errinf(qstate, "NS record was dnssec bogus"); + } + } + if(iq->response && iq->response->rep) { + if(FLAGS_GET_RCODE(iq->response->rep->flags) != 0) { + char rcode[256], rc[32]; + (void)sldns_wire2str_rcode_buf( + FLAGS_GET_RCODE(iq->response->rep->flags), + rc, sizeof(rc)); + snprintf(rcode, sizeof(rcode), "got %s", rc); + errinf(qstate, rcode); + } else { + /* rcode NOERROR */ + if(iq->response->rep->an_numrrsets == 0) { + errinf(qstate, "nodata answer"); + } + } + } +} + /** see if last resort is possible - does config allow queries to parent */ static int can_have_last_resort(struct module_env* env, uint8_t* nm, size_t nmlen, @@ -1228,8 +1282,8 @@ static int processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq, struct iter_env* ie, int id) { - uint8_t* delname; - size_t delnamelen; + uint8_t* delname, *dpname=NULL; + size_t delnamelen, dpnamelen=0; struct dns_msg* msg = NULL; log_query_info(VERB_DETAIL, "resolving", &qstate->qinfo); @@ -1283,7 +1337,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq, /* This either results in a query restart (CNAME cache response), a * terminating response (ANSWER), or a cache miss (null). */ - if (iter_stub_fwd_no_cache(qstate, &iq->qchase)) { + if (iter_stub_fwd_no_cache(qstate, &iq->qchase, &dpname, &dpnamelen)) { /* Asked to not query cache. */ verbose(VERB_ALGO, "no-cache set, going to the network"); qstate->no_cache_lookup = 1; @@ -1298,7 +1352,8 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq, msg = dns_cache_lookup(qstate->env, iq->qchase.qname, iq->qchase.qname_len, iq->qchase.qtype, iq->qchase.qclass, qstate->query_flags, - qstate->region, qstate->env->scratch, 0); + qstate->region, qstate->env->scratch, 0, dpname, + dpnamelen); if(!msg && qstate->env->neg_cache && iter_qname_indicates_dnssec(qstate->env, &iq->qchase)) { /* lookup in negative cache; may result in @@ -1921,6 +1976,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq, * of a response. */ errinf(qstate, "all the configured stub or forward servers failed,"); errinf_dname(qstate, "at zone", iq->dp->name); + errinf_reply(qstate, iq); verbose(VERB_QUERY, "configured stub or forward servers failed -- returning SERVFAIL"); return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL); } @@ -2067,6 +2123,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq, errinf(qstate, "all servers for this domain failed,"); errinf_dname(qstate, "at zone", iq->dp->name); + errinf_reply(qstate, iq); verbose(VERB_QUERY, "out of query targets -- returning SERVFAIL"); /* fail -- no more targets, no more hope of targets, no hope * of a response. */ @@ -2288,7 +2345,8 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, iq->qinfo_out.qname, iq->qinfo_out.qname_len, iq->qinfo_out.qtype, iq->qinfo_out.qclass, qstate->query_flags, qstate->region, - qstate->env->scratch, 0); + qstate->env->scratch, 0, iq->dp->name, + iq->dp->namelen); if(msg && FLAGS_GET_RCODE(msg->rep->flags) == LDNS_RCODE_NOERROR) /* no need to send query if it is already @@ -2611,7 +2669,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, (iq->dp->ssl_upstream || qstate->env->cfg->ssl_upstream), target->tls_auth_name, qstate); if(!outq) { - log_addr(VERB_DETAIL, "error sending query to auth server", + log_addr(VERB_QUERY, "error sending query to auth server", &target->addr, target->addrlen); if(!(iq->chase_flags & BIT_RD) && !iq->ratelimit_ok) infra_ratelimit_dec(qstate->env->infra_cache, iq->dp->name, @@ -2957,6 +3015,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, qstate->env->detach_subs)); (*qstate->env->detach_subs)(qstate); iq->num_target_queries = 0; + iq->response = NULL; + iq->fail_reply = NULL; verbose(VERB_ALGO, "cleared outbound list for next round"); return next_state(iq, QUERYTARGETS_STATE); } else if(type == RESPONSE_TYPE_CNAME) { @@ -3720,6 +3780,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, } /* parse message */ + iq->fail_reply = qstate->reply; prs = (struct msg_parse*)regional_alloc(qstate->env->scratch, sizeof(struct msg_parse)); if(!prs) { @@ -3733,12 +3794,15 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, sldns_buffer_set_position(pkt, 0); if(parse_packet(pkt, prs, qstate->env->scratch) != LDNS_RCODE_NOERROR) { verbose(VERB_ALGO, "parse error on reply packet"); + iq->parse_failures++; goto handle_it; } /* edns is not examined, but removed from message to help cache */ if(parse_extract_edns(prs, &edns, qstate->env->scratch) != - LDNS_RCODE_NOERROR) + LDNS_RCODE_NOERROR) { + iq->parse_failures++; goto handle_it; + } /* Copy the edns options we may got from the back end */ if(edns.opt_list) { @@ -3772,6 +3836,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, iq->num_current_queries--; verbose(VERB_DETAIL, "Capsforid: scrub failed, starting fallback with no response"); } + iq->scrub_failures++; goto handle_it; } diff --git a/sbin/unwind/libunbound/iterator/iterator.h b/sbin/unwind/libunbound/iterator/iterator.h index 342ac207e82..dc5e57527d8 100644 --- a/sbin/unwind/libunbound/iterator/iterator.h +++ b/sbin/unwind/libunbound/iterator/iterator.h @@ -61,7 +61,7 @@ struct rbtree_type; * its subqueries */ #define MAX_TARGET_NX 5 /** max number of query restarts. Determines max number of CNAME chain. */ -#define MAX_RESTART_COUNT 8 +#define MAX_RESTART_COUNT 11 /** max number of referrals. Makes sure resolver does not run away */ #define MAX_REFERRAL_COUNT 130 /** max number of queries-sent-out. Make sure large NS set does not loop */ @@ -406,6 +406,12 @@ struct iter_qstate { int auth_zone_response; /** True if the auth_zones should not be consulted for the query */ int auth_zone_avoid; + /** true if there have been scrubbing failures of reply packets */ + int scrub_failures; + /** true if there have been parse failures of reply packets */ + int parse_failures; + /** a failure printout address for last received answer */ + struct comm_reply* fail_reply; }; /** diff --git a/sbin/unwind/libunbound/libunbound/context.c b/sbin/unwind/libunbound/libunbound/context.c index cff2831a77c..e589c6ae28d 100644 --- a/sbin/unwind/libunbound/libunbound/context.c +++ b/sbin/unwind/libunbound/libunbound/context.c @@ -69,6 +69,7 @@ context_finalize(struct ub_ctx* ctx) } else { log_init(cfg->logfile, cfg->use_syslog, NULL); } + cfg_apply_local_port_policy(cfg, 65536); config_apply(cfg); if(!modstack_setup(&ctx->mods, cfg->module_conf, ctx->env)) return UB_INITFAIL; @@ -78,7 +79,8 @@ context_finalize(struct ub_ctx* ctx) return UB_NOMEM; if(!local_zones_apply_cfg(ctx->local_zones, cfg)) return UB_INITFAIL; - if(!auth_zones_apply_cfg(ctx->env->auth_zones, cfg, 1, &is_rpz)) + if(!auth_zones_apply_cfg(ctx->env->auth_zones, cfg, 1, &is_rpz, + ctx->env, &ctx->mods)) return UB_INITFAIL; if(!edns_strings_apply_cfg(ctx->env->edns_strings, cfg)) return UB_INITFAIL; diff --git a/sbin/unwind/libunbound/libunbound/libworker.c b/sbin/unwind/libunbound/libunbound/libworker.c index 7f46df386ab..8a9ca941948 100644 --- a/sbin/unwind/libunbound/libunbound/libworker.c +++ b/sbin/unwind/libunbound/libunbound/libworker.c @@ -241,7 +241,9 @@ libworker_setup(struct ub_ctx* ctx, int is_bg, struct ub_event_base* eb) ports, numports, cfg->unwanted_threshold, cfg->outgoing_tcp_mss, &libworker_alloc_cleanup, w, cfg->do_udp || cfg->udp_upstream_without_downstream, w->sslctx, - cfg->delay_close, cfg->tls_use_sni, NULL, cfg->udp_connect); + cfg->delay_close, cfg->tls_use_sni, NULL, cfg->udp_connect, + cfg->max_reuse_tcp_queries, cfg->tcp_reuse_timeout, + cfg->tcp_auth_query_timeout); w->env->outnet = w->back; if(!w->is_bg || w->is_bg_thread) { lock_basic_unlock(&ctx->cfglock); @@ -454,8 +456,15 @@ fill_res(struct ub_result* res, struct ub_packed_rrset_key* answer, if(rep->rrset_count != 0) res->ttl = (int)rep->ttl; res->data = (char**)calloc(1, sizeof(char*)); + if(!res->data) + return 0; /* out of memory */ res->len = (int*)calloc(1, sizeof(int)); - return (res->data && res->len); + if(!res->len) { + free(res->data); + res->data = NULL; + return 0; /* out of memory */ + } + return 1; } data = (struct packed_rrset_data*)answer->entry.data; if(query_dname_compare(rq->qname, answer->rk.dname) != 0) { @@ -463,15 +472,30 @@ fill_res(struct ub_result* res, struct ub_packed_rrset_key* answer, return 0; /* out of memory */ } else res->canonname = NULL; res->data = (char**)calloc(data->count+1, sizeof(char*)); + if(!res->data) + return 0; /* out of memory */ res->len = (int*)calloc(data->count+1, sizeof(int)); - if(!res->data || !res->len) + if(!res->len) { + free(res->data); + res->data = NULL; return 0; /* out of memory */ + } for(i=0; i<data->count; i++) { /* remove rdlength from rdata */ res->len[i] = (int)(data->rr_len[i] - 2); res->data[i] = memdup(data->rr_data[i]+2, (size_t)res->len[i]); - if(!res->data[i]) + if(!res->data[i]) { + size_t j; + for(j=0; j<i; j++) { + free(res->data[j]); + res->data[j] = NULL; + } + free(res->data); + res->data = NULL; + free(res->len); + res->len = NULL; return 0; /* out of memory */ + } } /* ttl for positive answers, from CNAME and answer RRs */ if(data->count != 0) { @@ -877,35 +901,6 @@ struct outbound_entry* libworker_send_query(struct query_info* qinfo, } int -libworker_handle_reply(struct comm_point* c, void* arg, int error, - struct comm_reply* reply_info) -{ - struct module_qstate* q = (struct module_qstate*)arg; - struct libworker* lw = (struct libworker*)q->env->worker; - struct outbound_entry e; - e.qstate = q; - e.qsent = NULL; - - if(error != 0) { - mesh_report_reply(lw->env->mesh, &e, reply_info, error); - return 0; - } - /* sanity check. */ - if(!LDNS_QR_WIRE(sldns_buffer_begin(c->buffer)) - || LDNS_OPCODE_WIRE(sldns_buffer_begin(c->buffer)) != - LDNS_PACKET_QUERY - || LDNS_QDCOUNT(sldns_buffer_begin(c->buffer)) > 1) { - /* error becomes timeout for the module as if this reply - * never arrived. */ - mesh_report_reply(lw->env->mesh, &e, reply_info, - NETEVENT_TIMEOUT); - return 0; - } - mesh_report_reply(lw->env->mesh, &e, reply_info, NETEVENT_NOERROR); - return 0; -} - -int libworker_handle_service_reply(struct comm_point* c, void* arg, int error, struct comm_reply* reply_info) { @@ -947,14 +942,6 @@ int worker_handle_request(struct comm_point* ATTR_UNUSED(c), return 0; } -int worker_handle_reply(struct comm_point* ATTR_UNUSED(c), - void* ATTR_UNUSED(arg), int ATTR_UNUSED(error), - struct comm_reply* ATTR_UNUSED(reply_info)) -{ - log_assert(0); - return 0; -} - int worker_handle_service_reply(struct comm_point* ATTR_UNUSED(c), void* ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply* ATTR_UNUSED(reply_info)) diff --git a/sbin/unwind/libunbound/libunbound/worker.h b/sbin/unwind/libunbound/libunbound/worker.h index fe1d51878a8..bf7473861af 100644 --- a/sbin/unwind/libunbound/libunbound/worker.h +++ b/sbin/unwind/libunbound/libunbound/worker.h @@ -75,10 +75,6 @@ struct outbound_entry* libworker_send_query(struct query_info* qinfo, size_t zonelen, int ssl_upstream, char* tls_auth_name, struct module_qstate* q); -/** process incoming replies from the network */ -int libworker_handle_reply(struct comm_point* c, void* arg, int error, - struct comm_reply* reply_info); - /** process incoming serviced query replies from the network */ int libworker_handle_service_reply(struct comm_point* c, void* arg, int error, struct comm_reply* reply_info); @@ -146,10 +142,6 @@ void worker_handle_control_cmd(struct tube* tube, uint8_t* msg, size_t len, int worker_handle_request(struct comm_point* c, void* arg, int error, struct comm_reply* repinfo); -/** process incoming replies from the network */ -int worker_handle_reply(struct comm_point* c, void* arg, int error, - struct comm_reply* reply_info); - /** process incoming serviced query replies from the network */ int worker_handle_service_reply(struct comm_point* c, void* arg, int error, struct comm_reply* reply_info); diff --git a/sbin/unwind/libunbound/respip/respip.c b/sbin/unwind/libunbound/respip/respip.c index 8fe82cdeec2..aae41f5d636 100644 --- a/sbin/unwind/libunbound/respip/respip.c +++ b/sbin/unwind/libunbound/respip/respip.c @@ -129,7 +129,7 @@ respip_sockaddr_delete(struct respip_set* set, struct resp_addr* node) struct resp_addr* prev; prev = (struct resp_addr*)rbtree_previous((struct rbnode_type*)node); lock_rw_destroy(&node->lock); - rbtree_delete(&set->ip_tree, node); + (void)rbtree_delete(&set->ip_tree, node); /* no free'ing, all allocated in region */ if(!prev) addr_tree_init_parents((rbtree_type*)set); diff --git a/sbin/unwind/libunbound/services/authzone.c b/sbin/unwind/libunbound/services/authzone.c index 2ef782c1f45..e6e3a8cff9b 100644 --- a/sbin/unwind/libunbound/services/authzone.c +++ b/sbin/unwind/libunbound/services/authzone.c @@ -67,7 +67,11 @@ #include "sldns/parseutil.h" #include "sldns/keyraw.h" #include "validator/val_nsec3.h" +#include "validator/val_nsec.h" #include "validator/val_secalgo.h" +#include "validator/val_sigcrypt.h" +#include "validator/val_anchor.h" +#include "validator/val_utils.h" #include <ctype.h> /** bytes to use for NSEC3 hash buffer. 20 for sha1 */ @@ -1741,9 +1745,45 @@ int auth_zone_write_file(struct auth_zone* z, const char* fname) return 1; } +/** offline verify for zonemd, while reading a zone file to immediately + * spot bad hashes in zonefile as they are read. + * Creates temp buffers, but uses anchors and validation environment + * from the module_env. */ +static void +zonemd_offline_verify(struct auth_zone* z, struct module_env* env_for_val, + struct module_stack* mods) +{ + struct module_env env; + time_t now = 0; + if(!z->zonemd_check) + return; + env = *env_for_val; + env.scratch_buffer = sldns_buffer_new(env.cfg->msg_buffer_size); + if(!env.scratch_buffer) { + log_err("out of memory"); + goto clean_exit; + } + env.scratch = regional_create(); + if(!env.now) { + env.now = &now; + now = time(NULL); + } + if(!env.scratch) { + log_err("out of memory"); + goto clean_exit; + } + auth_zone_verify_zonemd(z, &env, mods, NULL, 1, 0); + +clean_exit: + /* clean up and exit */ + sldns_buffer_free(env.scratch_buffer); + regional_destroy(env.scratch); +} + /** read all auth zones from file (if they have) */ static int -auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg) +auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg, + struct module_env* env, struct module_stack* mods) { struct auth_zone* z; lock_rw_wrlock(&az->lock); @@ -1754,12 +1794,162 @@ auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg) lock_rw_unlock(&az->lock); return 0; } + if(z->zonefile && z->zonefile[0]!=0 && env) + zonemd_offline_verify(z, env, mods); lock_rw_unlock(&z->lock); } lock_rw_unlock(&az->lock); return 1; } +/** fetch the content of a ZONEMD RR from the rdata */ +static int zonemd_fetch_parameters(struct auth_rrset* zonemd_rrset, size_t i, + uint32_t* serial, int* scheme, int* hashalgo, uint8_t** hash, + size_t* hashlen) +{ + size_t rr_len; + uint8_t* rdata; + if(i >= zonemd_rrset->data->count) + return 0; + rr_len = zonemd_rrset->data->rr_len[i]; + if(rr_len < 2+4+1+1) + return 0; /* too short, for rdlen+serial+scheme+algo */ + rdata = zonemd_rrset->data->rr_data[i]; + *serial = sldns_read_uint32(rdata+2); + *scheme = rdata[6]; + *hashalgo = rdata[7]; + *hashlen = rr_len - 8; + if(*hashlen == 0) + *hash = NULL; + else *hash = rdata+8; + return 1; +} + +/** + * See if the ZONEMD scheme, hash occurs more than once. + * @param zonemd_rrset: the zonemd rrset to check with the RRs in it. + * @param index: index of the original, this is allowed to have that + * scheme and hashalgo, but other RRs should not have it. + * @param scheme: the scheme to check for. + * @param hashalgo: the hash algorithm to check for. + * @return true if it occurs more than once. + */ +static int zonemd_is_duplicate_scheme_hash(struct auth_rrset* zonemd_rrset, + size_t index, int scheme, int hashalgo) +{ + size_t j; + for(j=0; j<zonemd_rrset->data->count; j++) { + uint32_t serial2 = 0; + int scheme2 = 0, hashalgo2 = 0; + uint8_t* hash2 = NULL; + size_t hashlen2 = 0; + if(index == j) { + /* this is the original */ + continue; + } + if(!zonemd_fetch_parameters(zonemd_rrset, j, &serial2, + &scheme2, &hashalgo2, &hash2, &hashlen2)) { + /* malformed, skip it */ + continue; + } + if(scheme == scheme2 && hashalgo == hashalgo2) { + /* duplicate scheme, hash */ + verbose(VERB_ALGO, "zonemd duplicate for scheme %d " + "and hash %d", scheme, hashalgo); + return 1; + } + } + return 0; +} + +/** + * Check ZONEMDs if present for the auth zone. Depending on config + * it can warn or fail on that. Checks the hash of the ZONEMD. + * @param z: auth zone to check for. + * caller must hold lock on zone. + * @param env: module env for temp buffers. + * @param reason: returned on failure. + * @return false on failure, true if hash checks out. + */ +static int auth_zone_zonemd_check_hash(struct auth_zone* z, + struct module_env* env, char** reason) +{ + /* loop over ZONEMDs and see which one is valid. if not print + * failure (depending on config) */ + struct auth_data* apex; + struct auth_rrset* zonemd_rrset; + size_t i; + struct regional* region = NULL; + struct sldns_buffer* buf = NULL; + uint32_t soa_serial = 0; + region = env->scratch; + regional_free_all(region); + buf = env->scratch_buffer; + if(!auth_zone_get_serial(z, &soa_serial)) { + *reason = "zone has no SOA serial"; + return 0; + } + + apex = az_find_name(z, z->name, z->namelen); + if(!apex) { + *reason = "zone has no apex"; + return 0; + } + zonemd_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_ZONEMD); + if(!zonemd_rrset || zonemd_rrset->data->count==0) { + *reason = "zone has no ZONEMD"; + return 0; /* no RRset or no RRs in rrset */ + } + + /* we have a ZONEMD, check if it is correct */ + for(i=0; i<zonemd_rrset->data->count; i++) { + uint32_t serial = 0; + int scheme = 0, hashalgo = 0; + uint8_t* hash = NULL; + size_t hashlen = 0; + if(!zonemd_fetch_parameters(zonemd_rrset, i, &serial, &scheme, + &hashalgo, &hash, &hashlen)) { + /* malformed RR */ + *reason = "ZONEMD rdata malformed"; + continue; + } + /* check for duplicates */ + if(zonemd_is_duplicate_scheme_hash(zonemd_rrset, i, scheme, + hashalgo)) { + /* duplicate hash of the same scheme,hash + * is not allowed. */ + *reason = "ZONEMD RRSet contains more than one RR " + "with the same scheme and hash algorithm"; + continue; + } + regional_free_all(region); + if(serial != soa_serial) { + *reason = "ZONEMD serial is wrong"; + continue; + } + if(auth_zone_generate_zonemd_check(z, scheme, hashalgo, + hash, hashlen, region, buf, reason)) { + /* success */ + if(verbosity >= VERB_ALGO) { + char zstr[255+1]; + dname_str(z->name, zstr); + verbose(VERB_ALGO, "auth-zone %s ZONEMD hash is correct", zstr); + } + return 1; + } + /* try next one */ + } + /* fail, we may have reason */ + if(!*reason) + *reason = "no ZONEMD records found"; + if(verbosity >= VERB_ALGO) { + char zstr[255+1]; + dname_str(z->name, zstr); + verbose(VERB_ALGO, "auth-zone %s ZONEMD failed: %s", zstr, *reason); + } + return 0; +} + /** find serial number of zone or false if none */ int auth_zone_get_serial(struct auth_zone* z, uint32_t* serial) @@ -1779,7 +1969,7 @@ auth_zone_get_serial(struct auth_zone* z, uint32_t* serial) } /** Find auth_zone SOA and populate the values in xfr(soa values). */ -static int +int xfr_find_soa(struct auth_zone* z, struct auth_xfer* xfr) { struct auth_data* apex; @@ -1908,6 +2098,8 @@ auth_zones_cfg(struct auth_zones* az, struct config_auth* c) z->for_downstream = c->for_downstream; z->for_upstream = c->for_upstream; z->fallback_enabled = c->fallback_enabled; + z->zonemd_check = c->zonemd_check; + z->zonemd_reject_absence = c->zonemd_reject_absence; if(c->isrpz && !z->rpz){ if(!(z->rpz = rpz_create(c))){ fatal_exit("Could not setup RPZ zones"); @@ -2000,7 +2192,8 @@ az_delete_deleted_zones(struct auth_zones* az) } int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg, - int setup, int* is_rpz) + int setup, int* is_rpz, struct module_env* env, + struct module_stack* mods) { struct config_auth* p; az_setall_deleted(az); @@ -2016,7 +2209,7 @@ int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg, } } az_delete_deleted_zones(az); - if(!auth_zones_read_zones(az, cfg)) + if(!auth_zones_read_zones(az, cfg, env, mods)) return 0; if(setup) { if(!auth_zones_setup_zones(az)) @@ -4959,6 +5152,9 @@ xfr_write_after_update(struct auth_xfer* xfr, struct module_env* env) lock_rw_unlock(&z->lock); return; } +#ifdef UB_ON_WINDOWS + (void)unlink(zfilename); /* windows does not replace file with rename() */ +#endif if(rename(tmpfile, zfilename) < 0) { log_err("could not rename(%s, %s): %s", tmpfile, zfilename, strerror(errno)); @@ -4969,6 +5165,28 @@ xfr_write_after_update(struct auth_xfer* xfr, struct module_env* env) lock_rw_unlock(&z->lock); } +/** reacquire locks and structures. Starts with no locks, ends + * with xfr and z locks, if fail, no z lock */ +static int xfr_process_reacquire_locks(struct auth_xfer* xfr, + struct module_env* env, struct auth_zone** z) +{ + /* release xfr lock, then, while holding az->lock grab both + * z->lock and xfr->lock */ + lock_rw_rdlock(&env->auth_zones->lock); + *z = auth_zone_find(env->auth_zones, xfr->name, xfr->namelen, + xfr->dclass); + if(!*z) { + lock_rw_unlock(&env->auth_zones->lock); + lock_basic_lock(&xfr->lock); + *z = NULL; + return 0; + } + lock_rw_wrlock(&(*z)->lock); + lock_basic_lock(&xfr->lock); + lock_rw_unlock(&env->auth_zones->lock); + return 1; +} + /** process chunk list and update zone in memory, * return false if it did not work */ static int @@ -4978,21 +5196,12 @@ xfr_process_chunk_list(struct auth_xfer* xfr, struct module_env* env, struct auth_zone* z; /* obtain locks and structures */ - /* release xfr lock, then, while holding az->lock grab both - * z->lock and xfr->lock */ lock_basic_unlock(&xfr->lock); - lock_rw_rdlock(&env->auth_zones->lock); - z = auth_zone_find(env->auth_zones, xfr->name, xfr->namelen, - xfr->dclass); - if(!z) { - lock_rw_unlock(&env->auth_zones->lock); + if(!xfr_process_reacquire_locks(xfr, env, &z)) { /* the zone is gone, ignore xfr results */ - lock_basic_lock(&xfr->lock); return 0; } - lock_rw_wrlock(&z->lock); - lock_basic_lock(&xfr->lock); - lock_rw_unlock(&env->auth_zones->lock); + /* holding xfr and z locks */ /* apply data */ if(xfr->task_transfer->master->http) { @@ -5027,6 +5236,35 @@ xfr_process_chunk_list(struct auth_xfer* xfr, struct module_env* env, " (or malformed RR)", xfr->task_transfer->master->host); return 0; } + + /* release xfr lock while verifying zonemd because it may have + * to spawn lookups in the state machines */ + lock_basic_unlock(&xfr->lock); + /* holding z lock */ + auth_zone_verify_zonemd(z, env, &env->mesh->mods, NULL, 0, 0); + if(z->zone_expired) { + char zname[256]; + /* ZONEMD must have failed */ + /* reacquire locks, so we hold xfr lock on exit of routine, + * and both xfr and z again after releasing xfr for potential + * state machine mesh callbacks */ + lock_rw_unlock(&z->lock); + if(!xfr_process_reacquire_locks(xfr, env, &z)) + return 0; + dname_str(xfr->name, zname); + verbose(VERB_ALGO, "xfr from %s: ZONEMD failed for %s, transfer is failed", xfr->task_transfer->master->host, zname); + xfr->zone_expired = 1; + lock_rw_unlock(&z->lock); + return 0; + } + /* reacquire locks, so we hold xfr lock on exit of routine, + * and both xfr and z again after releasing xfr for potential + * state machine mesh callbacks */ + lock_rw_unlock(&z->lock); + if(!xfr_process_reacquire_locks(xfr, env, &z)) + return 0; + /* holding xfr and z locks */ + if(xfr->have_zone) xfr->lease_time = *env->now; @@ -5188,7 +5426,7 @@ xfr_transfer_init_fetch(struct auth_xfer* xfr, struct module_env* env) xfr->task_transfer->cp = outnet_comm_point_for_http( env->outnet, auth_xfer_transfer_http_callback, xfr, &addr, addrlen, -1, master->ssl, master->host, - master->file); + master->file, env->cfg); if(!xfr->task_transfer->cp) { char zname[255+1], as[256]; dname_str(xfr->name, zname); @@ -5210,7 +5448,7 @@ xfr_transfer_init_fetch(struct auth_xfer* xfr, struct module_env* env) /* perform AXFR/IXFR */ /* set the packet to be written */ /* create new ID */ - xfr->task_transfer->id = (uint16_t)(ub_random(env->rnd)&0xffff); + xfr->task_transfer->id = GET_RANDOM_ID(env->rnd); xfr_create_ixfr_packet(xfr, env->scratch_buffer, xfr->task_transfer->id, master); @@ -6060,7 +6298,7 @@ xfr_probe_send_probe(struct auth_xfer* xfr, struct module_env* env, /* create new ID for new probes, but not on timeout retries, * this means we'll accept replies to previous retries to same ip */ if(timeout == AUTH_PROBE_TIMEOUT) - xfr->task_probe->id = (uint16_t)(ub_random(env->rnd)&0xffff); + xfr->task_probe->id = GET_RANDOM_ID(env->rnd); xfr_create_soa_probe_packet(xfr, env->scratch_buffer, xfr->task_probe->id); /* we need to remove the cp if we have a different ip4/ip6 type now */ @@ -6933,12 +7171,14 @@ xfer_set_masters(struct auth_master** list, struct config_auth* c, if(with_http) for(p = c->urls; p; p = p->next) { m = auth_master_new(&list); + if(!m) return 0; m->http = 1; if(!parse_url(p->str, &m->host, &m->file, &m->port, &m->ssl)) return 0; } for(p = c->masters; p; p = p->next) { m = auth_master_new(&list); + if(!m) return 0; m->ixfr = 1; /* this flag is not configurable */ m->host = strdup(p->str); if(!m->host) { @@ -6948,6 +7188,7 @@ xfer_set_masters(struct auth_master** list, struct config_auth* c, } for(p = c->allow_notify; p; p = p->next) { m = auth_master_new(&list); + if(!m) return 0; m->allow_notify = 1; m->host = strdup(p->str); if(!m->host) { @@ -6972,3 +7213,1131 @@ compare_serial(uint32_t a, uint32_t b) return 1; } } + +int zonemd_hashalgo_supported(int hashalgo) +{ + if(hashalgo == ZONEMD_ALGO_SHA384) return 1; + if(hashalgo == ZONEMD_ALGO_SHA512) return 1; + return 0; +} + +int zonemd_scheme_supported(int scheme) +{ + if(scheme == ZONEMD_SCHEME_SIMPLE) return 1; + return 0; +} + +/** initialize hash for hashing with zonemd hash algo */ +static struct secalgo_hash* zonemd_digest_init(int hashalgo, char** reason) +{ + struct secalgo_hash *h; + if(hashalgo == ZONEMD_ALGO_SHA384) { + /* sha384 */ + h = secalgo_hash_create_sha384(); + if(!h) + *reason = "digest sha384 could not be created"; + return h; + } else if(hashalgo == ZONEMD_ALGO_SHA512) { + /* sha512 */ + h = secalgo_hash_create_sha512(); + if(!h) + *reason = "digest sha512 could not be created"; + return h; + } + /* unknown hash algo */ + *reason = "unsupported algorithm"; + return NULL; +} + +/** update the hash for zonemd */ +static int zonemd_digest_update(int hashalgo, struct secalgo_hash* h, + uint8_t* data, size_t len, char** reason) +{ + if(hashalgo == ZONEMD_ALGO_SHA384) { + if(!secalgo_hash_update(h, data, len)) { + *reason = "digest sha384 failed"; + return 0; + } + return 1; + } else if(hashalgo == ZONEMD_ALGO_SHA512) { + if(!secalgo_hash_update(h, data, len)) { + *reason = "digest sha512 failed"; + return 0; + } + return 1; + } + /* unknown hash algo */ + *reason = "unsupported algorithm"; + return 0; +} + +/** finish the hash for zonemd */ +static int zonemd_digest_finish(int hashalgo, struct secalgo_hash* h, + uint8_t* result, size_t hashlen, size_t* resultlen, char** reason) +{ + if(hashalgo == ZONEMD_ALGO_SHA384) { + if(hashlen < 384/8) { + *reason = "digest buffer too small for sha384"; + return 0; + } + if(!secalgo_hash_final(h, result, hashlen, resultlen)) { + *reason = "digest sha384 finish failed"; + return 0; + } + return 1; + } else if(hashalgo == ZONEMD_ALGO_SHA512) { + if(hashlen < 512/8) { + *reason = "digest buffer too small for sha512"; + return 0; + } + if(!secalgo_hash_final(h, result, hashlen, resultlen)) { + *reason = "digest sha512 finish failed"; + return 0; + } + return 1; + } + /* unknown algo */ + *reason = "unsupported algorithm"; + return 0; +} + +/** add rrsets from node to the list */ +static size_t authdata_rrsets_to_list(struct auth_rrset** array, + size_t arraysize, struct auth_rrset* first) +{ + struct auth_rrset* rrset = first; + size_t num = 0; + while(rrset) { + if(num >= arraysize) + return num; + array[num] = rrset; + num++; + rrset = rrset->next; + } + return num; +} + +/** compare rr list entries */ +static int rrlist_compare(const void* arg1, const void* arg2) +{ + struct auth_rrset* r1 = *(struct auth_rrset**)arg1; + struct auth_rrset* r2 = *(struct auth_rrset**)arg2; + uint16_t t1, t2; + if(r1 == NULL) t1 = LDNS_RR_TYPE_RRSIG; + else t1 = r1->type; + if(r2 == NULL) t2 = LDNS_RR_TYPE_RRSIG; + else t2 = r2->type; + if(t1 < t2) + return -1; + if(t1 > t2) + return 1; + return 0; +} + +/** add type RRSIG to rr list if not one there already, + * this is to perform RRSIG collate processing at that point. */ +static void addrrsigtype_if_needed(struct auth_rrset** array, + size_t arraysize, size_t* rrnum, struct auth_data* node) +{ + if(az_domain_rrset(node, LDNS_RR_TYPE_RRSIG)) + return; /* already one there */ + if((*rrnum) >= arraysize) + return; /* array too small? */ + array[*rrnum] = NULL; /* nothing there, but need entry in list */ + (*rrnum)++; +} + +/** collate the RRs in an RRset using the simple scheme */ +static int zonemd_simple_rrset(struct auth_zone* z, int hashalgo, + struct secalgo_hash* h, struct auth_data* node, + struct auth_rrset* rrset, struct regional* region, + struct sldns_buffer* buf, char** reason) +{ + /* canonicalize */ + struct ub_packed_rrset_key key; + memset(&key, 0, sizeof(key)); + key.entry.key = &key; + key.entry.data = rrset->data; + key.rk.dname = node->name; + key.rk.dname_len = node->namelen; + key.rk.type = htons(rrset->type); + key.rk.rrset_class = htons(z->dclass); + if(!rrset_canonicalize_to_buffer(region, buf, &key)) { + *reason = "out of memory"; + return 0; + } + regional_free_all(region); + + /* hash */ + if(!zonemd_digest_update(hashalgo, h, sldns_buffer_begin(buf), + sldns_buffer_limit(buf), reason)) { + return 0; + } + return 1; +} + +/** count number of RRSIGs in a domain name rrset list */ +static size_t zonemd_simple_count_rrsig(struct auth_rrset* rrset, + struct auth_rrset** rrlist, size_t rrnum, + struct auth_zone* z, struct auth_data* node) +{ + size_t i, count = 0; + if(rrset) { + size_t j; + for(j = 0; j<rrset->data->count; j++) { + if(rrsig_rdata_get_type_covered(rrset->data-> + rr_data[j], rrset->data->rr_len[j]) == + LDNS_RR_TYPE_ZONEMD && + query_dname_compare(z->name, node->name)==0) { + /* omit RRSIGs over type ZONEMD at apex */ + continue; + } + count++; + } + } + for(i=0; i<rrnum; i++) { + if(rrlist[i] && rrlist[i]->type == LDNS_RR_TYPE_ZONEMD && + query_dname_compare(z->name, node->name)==0) { + /* omit RRSIGs over type ZONEMD at apex */ + continue; + } + count += (rrlist[i]?rrlist[i]->data->rrsig_count:0); + } + return count; +} + +/** allocate sparse rrset data for the number of entries in tepm region */ +static int zonemd_simple_rrsig_allocs(struct regional* region, + struct packed_rrset_data* data, size_t count) +{ + data->rr_len = regional_alloc(region, sizeof(*data->rr_len) * count); + if(!data->rr_len) { + return 0; + } + data->rr_ttl = regional_alloc(region, sizeof(*data->rr_ttl) * count); + if(!data->rr_ttl) { + return 0; + } + data->rr_data = regional_alloc(region, sizeof(*data->rr_data) * count); + if(!data->rr_data) { + return 0; + } + return 1; +} + +/** add the RRSIGs from the rrs in the domain into the data */ +static void add_rrlist_rrsigs_into_data(struct packed_rrset_data* data, + size_t* done, struct auth_rrset** rrlist, size_t rrnum, + struct auth_zone* z, struct auth_data* node) +{ + size_t i; + for(i=0; i<rrnum; i++) { + size_t j; + if(!rrlist[i]) + continue; + if(rrlist[i] && rrlist[i]->type == LDNS_RR_TYPE_ZONEMD && + query_dname_compare(z->name, node->name)==0) { + /* omit RRSIGs over type ZONEMD at apex */ + continue; + } + for(j = 0; j<rrlist[i]->data->rrsig_count; j++) { + data->rr_len[*done] = rrlist[i]->data->rr_len[rrlist[i]->data->count + j]; + data->rr_ttl[*done] = rrlist[i]->data->rr_ttl[rrlist[i]->data->count + j]; + /* reference the rdata in the rrset, no need to + * copy it, it is no longer needed at the end of + * the routine */ + data->rr_data[*done] = rrlist[i]->data->rr_data[rrlist[i]->data->count + j]; + (*done)++; + } + } +} + +static void add_rrset_into_data(struct packed_rrset_data* data, + size_t* done, struct auth_rrset* rrset, + struct auth_zone* z, struct auth_data* node) +{ + if(rrset) { + size_t j; + for(j = 0; j<rrset->data->count; j++) { + if(rrsig_rdata_get_type_covered(rrset->data-> + rr_data[j], rrset->data->rr_len[j]) == + LDNS_RR_TYPE_ZONEMD && + query_dname_compare(z->name, node->name)==0) { + /* omit RRSIGs over type ZONEMD at apex */ + continue; + } + data->rr_len[*done] = rrset->data->rr_len[j]; + data->rr_ttl[*done] = rrset->data->rr_ttl[j]; + /* reference the rdata in the rrset, no need to + * copy it, it is no longer need at the end of + * the routine */ + data->rr_data[*done] = rrset->data->rr_data[j]; + (*done)++; + } + } +} + +/** collate the RRSIGs using the simple scheme */ +static int zonemd_simple_rrsig(struct auth_zone* z, int hashalgo, + struct secalgo_hash* h, struct auth_data* node, + struct auth_rrset* rrset, struct auth_rrset** rrlist, size_t rrnum, + struct regional* region, struct sldns_buffer* buf, char** reason) +{ + /* the rrset pointer can be NULL, this means it is type RRSIG and + * there is no ordinary type RRSIG there. The RRSIGs are stored + * with the RRsets in their data. + * + * The RRset pointer can be nonNULL. This happens if there is + * no RR that is covered by the RRSIG for the domain. Then this + * RRSIG RR is stored in an rrset of type RRSIG. The other RRSIGs + * are stored in the rrset entries for the RRs in the rr list for + * the domain node. We need to collate the rrset's data, if any, and + * the rrlist's rrsigs */ + /* if this is the apex, omit RRSIGs that cover type ZONEMD */ + /* build rrsig rrset */ + size_t done = 0; + struct ub_packed_rrset_key key; + struct packed_rrset_data data; + memset(&key, 0, sizeof(key)); + memset(&data, 0, sizeof(data)); + key.entry.key = &key; + key.entry.data = &data; + key.rk.dname = node->name; + key.rk.dname_len = node->namelen; + key.rk.type = htons(LDNS_RR_TYPE_RRSIG); + key.rk.rrset_class = htons(z->dclass); + data.count = zonemd_simple_count_rrsig(rrset, rrlist, rrnum, z, node); + if(!zonemd_simple_rrsig_allocs(region, &data, data.count)) { + *reason = "out of memory"; + regional_free_all(region); + return 0; + } + /* all the RRSIGs stored in the other rrsets for this domain node */ + add_rrlist_rrsigs_into_data(&data, &done, rrlist, rrnum, z, node); + /* plus the RRSIGs stored in an rrset of type RRSIG for this node */ + add_rrset_into_data(&data, &done, rrset, z, node); + + /* canonicalize */ + if(!rrset_canonicalize_to_buffer(region, buf, &key)) { + *reason = "out of memory"; + regional_free_all(region); + return 0; + } + regional_free_all(region); + + /* hash */ + if(!zonemd_digest_update(hashalgo, h, sldns_buffer_begin(buf), + sldns_buffer_limit(buf), reason)) { + return 0; + } + return 1; +} + +/** collate a domain's rrsets using the simple scheme */ +static int zonemd_simple_domain(struct auth_zone* z, int hashalgo, + struct secalgo_hash* h, struct auth_data* node, + struct regional* region, struct sldns_buffer* buf, char** reason) +{ + const size_t rrlistsize = 65536; + struct auth_rrset* rrlist[rrlistsize]; + size_t i, rrnum = 0; + /* see if the domain is out of scope, the zone origin, + * that would be omitted */ + if(!dname_subdomain_c(node->name, z->name)) + return 1; /* continue */ + /* loop over the rrsets in ascending order. */ + rrnum = authdata_rrsets_to_list(rrlist, rrlistsize, node->rrsets); + addrrsigtype_if_needed(rrlist, rrlistsize, &rrnum, node); + qsort(rrlist, rrnum, sizeof(*rrlist), rrlist_compare); + for(i=0; i<rrnum; i++) { + if(rrlist[i] && rrlist[i]->type == LDNS_RR_TYPE_ZONEMD && + query_dname_compare(z->name, node->name) == 0) { + /* omit type ZONEMD at apex */ + continue; + } + if(rrlist[i] == NULL || rrlist[i]->type == + LDNS_RR_TYPE_RRSIG) { + if(!zonemd_simple_rrsig(z, hashalgo, h, node, + rrlist[i], rrlist, rrnum, region, buf, reason)) + return 0; + } else if(!zonemd_simple_rrset(z, hashalgo, h, node, + rrlist[i], region, buf, reason)) { + return 0; + } + } + return 1; +} + +/** collate the zone using the simple scheme */ +static int zonemd_simple_collate(struct auth_zone* z, int hashalgo, + struct secalgo_hash* h, struct regional* region, + struct sldns_buffer* buf, char** reason) +{ + /* our tree is sorted in canonical order, so we can just loop over + * the tree */ + struct auth_data* n; + RBTREE_FOR(n, struct auth_data*, &z->data) { + if(!zonemd_simple_domain(z, hashalgo, h, n, region, buf, + reason)) + return 0; + } + return 1; +} + +int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme, + int hashalgo, uint8_t* hash, size_t hashlen, size_t* resultlen, + struct regional* region, struct sldns_buffer* buf, char** reason) +{ + struct secalgo_hash* h = zonemd_digest_init(hashalgo, reason); + if(!h) { + if(!*reason) + *reason = "digest init fail"; + return 0; + } + if(scheme == ZONEMD_SCHEME_SIMPLE) { + if(!zonemd_simple_collate(z, hashalgo, h, region, buf, reason)) { + if(!*reason) *reason = "scheme simple collate fail"; + secalgo_hash_delete(h); + return 0; + } + } + if(!zonemd_digest_finish(hashalgo, h, hash, hashlen, resultlen, + reason)) { + secalgo_hash_delete(h); + *reason = "digest finish fail"; + return 0; + } + secalgo_hash_delete(h); + return 1; +} + +int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, + int hashalgo, uint8_t* hash, size_t hashlen, struct regional* region, + struct sldns_buffer* buf, char** reason) +{ + uint8_t gen[512]; + size_t genlen = 0; + if(!zonemd_hashalgo_supported(hashalgo)) { + *reason = "unsupported algorithm"; + return 0; + } + if(!zonemd_scheme_supported(scheme)) { + *reason = "unsupported scheme"; + return 0; + } + if(hashlen < 12) { + /* the ZONEMD draft requires digests to fail if too small */ + *reason = "digest length too small, less than 12"; + return 0; + } + /* generate digest */ + if(!auth_zone_generate_zonemd_hash(z, scheme, hashalgo, gen, + sizeof(gen), &genlen, region, buf, reason)) { + /* reason filled in by zonemd hash routine */ + return 0; + } + /* check digest length */ + if(hashlen != genlen) { + *reason = "incorrect digest length"; + if(verbosity >= VERB_ALGO) { + verbose(VERB_ALGO, "zonemd scheme=%d hashalgo=%d", + scheme, hashalgo); + log_hex("ZONEMD should be ", gen, genlen); + log_hex("ZONEMD to check is", hash, hashlen); + } + return 0; + } + /* check digest */ + if(memcmp(hash, gen, genlen) != 0) { + *reason = "incorrect digest"; + if(verbosity >= VERB_ALGO) { + verbose(VERB_ALGO, "zonemd scheme=%d hashalgo=%d", + scheme, hashalgo); + log_hex("ZONEMD should be ", gen, genlen); + log_hex("ZONEMD to check is", hash, hashlen); + } + return 0; + } + return 1; +} + +/** log auth zone message with zone name in front. */ +static void auth_zone_log(uint8_t* name, enum verbosity_value level, + const char* format, ...) ATTR_FORMAT(printf, 3, 4); +static void auth_zone_log(uint8_t* name, enum verbosity_value level, + const char* format, ...) +{ + va_list args; + va_start(args, format); + if(verbosity >= level) { + char str[255+1]; + char msg[MAXSYSLOGMSGLEN]; + dname_str(name, str); + vsnprintf(msg, sizeof(msg), format, args); + verbose(level, "auth zone %s %s", str, msg); + } + va_end(args); +} + +/** ZONEMD, dnssec verify the rrset with the dnskey */ +static int zonemd_dnssec_verify_rrset(struct auth_zone* z, + struct module_env* env, struct module_stack* mods, + struct ub_packed_rrset_key* dnskey, struct auth_data* node, + struct auth_rrset* rrset, char** why_bogus) +{ + struct ub_packed_rrset_key pk; + enum sec_status sec; + struct val_env* ve; + int m; + m = modstack_find(mods, "validator"); + if(m == -1) { + auth_zone_log(z->name, VERB_ALGO, "zonemd dnssec verify: have " + "DNSKEY chain of trust, but no validator module"); + return 0; + } + ve = (struct val_env*)env->modinfo[m]; + + memset(&pk, 0, sizeof(pk)); + pk.entry.key = &pk; + pk.entry.data = rrset->data; + pk.rk.dname = node->name; + pk.rk.dname_len = node->namelen; + pk.rk.type = htons(rrset->type); + pk.rk.rrset_class = htons(z->dclass); + if(verbosity >= VERB_ALGO) { + char typestr[32]; + typestr[0]=0; + sldns_wire2str_type_buf(rrset->type, typestr, sizeof(typestr)); + auth_zone_log(z->name, VERB_ALGO, + "zonemd: verify %s RRset with DNSKEY", typestr); + } + sec = dnskeyset_verify_rrset(env, ve, &pk, dnskey, NULL, why_bogus, + LDNS_SECTION_ANSWER, NULL); + if(sec == sec_status_secure) { + return 1; + } + if(why_bogus) + auth_zone_log(z->name, VERB_ALGO, "DNSSEC verify was bogus: %s", *why_bogus); + return 0; +} + +/** check for nsec3, the RR with params equal, if bitmap has the type */ +static int nsec3_of_param_has_type(struct auth_rrset* nsec3, int algo, + size_t iter, uint8_t* salt, size_t saltlen, uint16_t rrtype) +{ + int i, count = (int)nsec3->data->count; + struct ub_packed_rrset_key pk; + memset(&pk, 0, sizeof(pk)); + pk.entry.data = nsec3->data; + for(i=0; i<count; i++) { + int rralgo; + size_t rriter, rrsaltlen; + uint8_t* rrsalt; + if(!nsec3_get_params(&pk, i, &rralgo, &rriter, &rrsalt, + &rrsaltlen)) + continue; /* no parameters, malformed */ + if(rralgo != algo || rriter != iter || rrsaltlen != saltlen) + continue; /* different parameters */ + if(saltlen != 0) { + if(rrsalt == NULL || salt == NULL) + continue; + if(memcmp(rrsalt, salt, saltlen) != 0) + continue; /* different salt parameters */ + } + if(nsec3_has_type(&pk, i, rrtype)) + return 1; + } + return 0; +} + +/** Verify the absence of ZONEMD with DNSSEC by checking NSEC, NSEC3 type flag. + * return false on failure, reason contains description of failure. */ +static int zonemd_check_dnssec_absence(struct auth_zone* z, + struct module_env* env, struct module_stack* mods, + struct ub_packed_rrset_key* dnskey, struct auth_data* apex, + char** reason, char** why_bogus) +{ + struct auth_rrset* nsec = NULL; + if(!apex) { + *reason = "zone has no apex domain but ZONEMD missing"; + return 0; + } + nsec = az_domain_rrset(apex, LDNS_RR_TYPE_NSEC); + if(nsec) { + struct ub_packed_rrset_key pk; + /* dnssec verify the NSEC */ + if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex, + nsec, why_bogus)) { + *reason = "DNSSEC verify failed for NSEC RRset"; + return 0; + } + /* check type bitmap */ + memset(&pk, 0, sizeof(pk)); + pk.entry.data = nsec->data; + if(nsec_has_type(&pk, LDNS_RR_TYPE_ZONEMD)) { + *reason = "DNSSEC NSEC bitmap says type ZONEMD exists"; + return 0; + } + auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC NSEC verification of absence of ZONEMD secure"); + } else { + /* NSEC3 perhaps ? */ + int algo; + size_t iter, saltlen; + uint8_t* salt; + struct auth_rrset* nsec3param = az_domain_rrset(apex, + LDNS_RR_TYPE_NSEC3PARAM); + struct auth_data* match; + struct auth_rrset* nsec3; + if(!nsec3param) { + *reason = "zone has no NSEC information but ZONEMD missing"; + return 0; + } + if(!az_nsec3_param(z, &algo, &iter, &salt, &saltlen)) { + *reason = "zone has no NSEC information but ZONEMD missing"; + return 0; + } + /* find the NSEC3 record */ + match = az_nsec3_find_exact(z, z->name, z->namelen, algo, + iter, salt, saltlen); + if(!match) { + *reason = "zone has no NSEC3 domain for the apex but ZONEMD missing"; + return 0; + } + nsec3 = az_domain_rrset(match, LDNS_RR_TYPE_NSEC3); + if(!nsec3) { + *reason = "zone has no NSEC3 RRset for the apex but ZONEMD missing"; + return 0; + } + /* dnssec verify the NSEC3 */ + if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, match, + nsec3, why_bogus)) { + *reason = "DNSSEC verify failed for NSEC3 RRset"; + return 0; + } + /* check type bitmap */ + if(nsec3_of_param_has_type(nsec3, algo, iter, salt, saltlen, + LDNS_RR_TYPE_ZONEMD)) { + *reason = "DNSSEC NSEC3 bitmap says type ZONEMD exists"; + return 0; + } + auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC NSEC3 verification of absence of ZONEMD secure"); + } + + return 1; +} + +/** Verify the SOA and ZONEMD DNSSEC signatures. + * return false on failure, reason contains description of failure. */ +static int zonemd_check_dnssec_soazonemd(struct auth_zone* z, + struct module_env* env, struct module_stack* mods, + struct ub_packed_rrset_key* dnskey, struct auth_data* apex, + struct auth_rrset* zonemd_rrset, char** reason, char** why_bogus) +{ + struct auth_rrset* soa; + if(!apex) { + *reason = "zone has no apex domain"; + return 0; + } + soa = az_domain_rrset(apex, LDNS_RR_TYPE_SOA); + if(!soa) { + *reason = "zone has no SOA RRset"; + return 0; + } + if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex, soa, + why_bogus)) { + *reason = "DNSSEC verify failed for SOA RRset"; + return 0; + } + if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex, + zonemd_rrset, why_bogus)) { + *reason = "DNSSEC verify failed for ZONEMD RRset"; + return 0; + } + auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC verification of SOA and ZONEMD RRsets secure"); + return 1; +} + +/** + * Fail the ZONEMD verification. + * @param z: auth zone that fails. + * @param env: environment with config, to ignore failure or not. + * @param reason: failure string description. + * @param why_bogus: failure string for DNSSEC verification failure. + * @param result: strdup result in here if not NULL. + */ +static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env, + char* reason, char* why_bogus, char** result) +{ + char zstr[255+1]; + /* if fail: log reason, and depending on config also take action + * and drop the zone, eg. it is gone from memory, set zone_expired */ + dname_str(z->name, zstr); + if(!reason) reason = "verification failed"; + if(result) { + if(why_bogus) { + char res[1024]; + snprintf(res, sizeof(res), "%s: %s", reason, + why_bogus); + *result = strdup(res); + } else { + *result = strdup(reason); + } + if(!*result) log_err("out of memory"); + } else { + log_warn("auth zone %s: ZONEMD verification failed: %s", zstr, reason); + } + + if(env->cfg->zonemd_permissive_mode) { + verbose(VERB_ALGO, "zonemd-permissive-mode enabled, " + "not blocking zone %s", zstr); + return; + } + + /* expired means the zone gives servfail and is not used by + * lookup if fallback_enabled*/ + z->zone_expired = 1; +} + +/** + * Verify the zonemd with DNSSEC and hash check, with given key. + * @param z: auth zone. + * @param env: environment with config and temp buffers. + * @param mods: module stack with validator env for verification. + * @param dnskey: dnskey that we can use, or NULL. If nonnull, the key + * has been verified and is the start of the chain of trust. + * @param is_insecure: if true, the dnskey is not used, the zone is insecure. + * And dnssec is not used. It is DNSSEC secure insecure or not under + * a trust anchor. + * @param result: if not NULL result reason copied here. + */ +static void +auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, + struct module_stack* mods, struct ub_packed_rrset_key* dnskey, + int is_insecure, char** result) +{ + char* reason = NULL, *why_bogus = NULL; + struct auth_data* apex = NULL; + struct auth_rrset* zonemd_rrset = NULL; + int zonemd_absent = 0, zonemd_absence_dnssecok = 0; + + /* see if ZONEMD is present or absent. */ + apex = az_find_name(z, z->name, z->namelen); + if(!apex) { + zonemd_absent = 1; + } else { + zonemd_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_ZONEMD); + if(!zonemd_rrset || zonemd_rrset->data->count==0) { + zonemd_absent = 1; + zonemd_rrset = NULL; + } + } + + /* if no DNSSEC, done. */ + /* if no ZONEMD, and DNSSEC, use DNSKEY to verify NSEC or NSEC3 for + * zone apex. Check ZONEMD bit is turned off or else fail */ + /* if ZONEMD, and DNSSEC, check DNSSEC signature on SOA and ZONEMD, + * or else fail */ + if(!dnskey && !is_insecure) { + auth_zone_zonemd_fail(z, env, "DNSKEY missing", NULL, result); + return; + } else if(!zonemd_rrset && dnskey && !is_insecure) { + /* fetch, DNSSEC verify, and check NSEC/NSEC3 */ + if(!zonemd_check_dnssec_absence(z, env, mods, dnskey, apex, + &reason, &why_bogus)) { + auth_zone_zonemd_fail(z, env, reason, why_bogus, result); + return; + } + zonemd_absence_dnssecok = 1; + } else if(zonemd_rrset && dnskey && !is_insecure) { + /* check DNSSEC verify of SOA and ZONEMD */ + if(!zonemd_check_dnssec_soazonemd(z, env, mods, dnskey, apex, + zonemd_rrset, &reason, &why_bogus)) { + auth_zone_zonemd_fail(z, env, reason, why_bogus, result); + return; + } + } + + if(zonemd_absent && z->zonemd_reject_absence) { + auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config", NULL, result); + return; + } + if(zonemd_absent && zonemd_absence_dnssecok) { + auth_zone_log(z->name, VERB_ALGO, "DNSSEC verified nonexistence of ZONEMD"); + if(result) { + *result = strdup("DNSSEC verified nonexistence of ZONEMD"); + if(!*result) log_err("out of memory"); + } + return; + } + if(zonemd_absent) { + auth_zone_log(z->name, VERB_ALGO, "no ZONEMD present"); + if(result) { + *result = strdup("no ZONEMD present"); + if(!*result) log_err("out of memory"); + } + return; + } + + /* check ZONEMD checksum and report or else fail. */ + if(!auth_zone_zonemd_check_hash(z, env, &reason)) { + auth_zone_zonemd_fail(z, env, reason, NULL, result); + return; + } + + /* success! log the success */ + auth_zone_log(z->name, VERB_ALGO, "ZONEMD verification successful"); + if(result) { + *result = strdup("ZONEMD verification successful"); + if(!*result) log_err("out of memory"); + } +} + +/** + * verify the zone DNSKEY rrset from the trust anchor + * This is possible because the anchor is for the zone itself, and can + * thus apply straight to the zone DNSKEY set. + * @param z: the auth zone. + * @param env: environment with time and temp buffers. + * @param mods: module stack for validator environment for dnssec validation. + * @param anchor: trust anchor to use + * @param is_insecure: returned, true if the zone is securely insecure. + * @param why_bogus: if the routine fails, returns the failure reason. + * @param keystorage: where to store the ub_packed_rrset_key that is created + * on success. A pointer to it is returned on success. + * @return the dnskey RRset, reference to zone data and keystorage, or + * NULL on failure. + */ +static struct ub_packed_rrset_key* +zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env, + struct module_stack* mods, struct trust_anchor* anchor, + int* is_insecure, char** why_bogus, + struct ub_packed_rrset_key* keystorage) +{ + struct auth_data* apex; + struct auth_rrset* dnskey_rrset; + enum sec_status sec; + struct val_env* ve; + int m; + + apex = az_find_name(z, z->name, z->namelen); + if(!apex) { + *why_bogus = "have trust anchor, but zone has no apex domain for DNSKEY"; + return 0; + } + dnskey_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_DNSKEY); + if(!dnskey_rrset || dnskey_rrset->data->count==0) { + *why_bogus = "have trust anchor, but zone has no DNSKEY"; + return 0; + } + + m = modstack_find(mods, "validator"); + if(m == -1) { + *why_bogus = "have trust anchor, but no validator module"; + return 0; + } + ve = (struct val_env*)env->modinfo[m]; + + memset(keystorage, 0, sizeof(*keystorage)); + keystorage->entry.key = keystorage; + keystorage->entry.data = dnskey_rrset->data; + keystorage->rk.dname = apex->name; + keystorage->rk.dname_len = apex->namelen; + keystorage->rk.type = htons(LDNS_RR_TYPE_DNSKEY); + keystorage->rk.rrset_class = htons(z->dclass); + auth_zone_log(z->name, VERB_QUERY, + "zonemd: verify DNSKEY RRset with trust anchor"); + sec = val_verify_DNSKEY_with_TA(env, ve, keystorage, anchor->ds_rrset, + anchor->dnskey_rrset, NULL, why_bogus, NULL); + regional_free_all(env->scratch); + if(sec == sec_status_secure) { + /* success */ + *is_insecure = 0; + return keystorage; + } else if(sec == sec_status_insecure) { + /* insecure */ + *is_insecure = 1; + } else { + /* bogus */ + *is_insecure = 0; + auth_zone_log(z->name, VERB_ALGO, + "zonemd: verify DNSKEY RRset with trust anchor failed: %s", *why_bogus); + } + return NULL; +} + +/** callback for ZONEMD lookup of DNSKEY */ +void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf, + enum sec_status sec, char* why_bogus, int ATTR_UNUSED(was_ratelimited)) +{ + struct auth_zone* z = (struct auth_zone*)arg; + struct module_env* env; + char* reason = NULL; + struct ub_packed_rrset_key* dnskey = NULL; + int is_insecure = 0; + + lock_rw_wrlock(&z->lock); + env = z->zonemd_callback_env; + /* release the env variable so another worker can pick up the + * ZONEMD verification task if it wants to */ + z->zonemd_callback_env = NULL; + if(!env || env->outnet->want_to_quit || z->zone_deleted) { + lock_rw_unlock(&z->lock); + return; /* stop on quit */ + } + + /* process result */ + if(sec == sec_status_bogus) { + reason = why_bogus; + if(!reason) + reason = "lookup of DNSKEY was bogus"; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was bogus: %s", reason); + } else if(rcode == LDNS_RCODE_NOERROR) { + uint16_t wanted_qtype = LDNS_RR_TYPE_DNSKEY; + struct regional* temp = env->scratch; + struct query_info rq; + struct reply_info* rep; + memset(&rq, 0, sizeof(rq)); + rep = parse_reply_in_temp_region(buf, temp, &rq); + if(rep && rq.qtype == wanted_qtype && + query_dname_compare(z->name, rq.qname) == 0 && + FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NOERROR) { + /* parsed successfully */ + struct ub_packed_rrset_key* answer = + reply_find_answer_rrset(&rq, rep); + if(answer && sec == sec_status_secure) { + dnskey = answer; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was secure"); + } else if(sec == sec_status_secure && !answer) { + is_insecure = 1; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY has no content, but is secure, treat as insecure"); + } else if(sec == sec_status_insecure) { + is_insecure = 1; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was insecure"); + } else if(sec == sec_status_indeterminate) { + is_insecure = 1; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was indeterminate, treat as insecure"); + } else { + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY has nodata"); + reason = "lookup of DNSKEY has nodata"; + } + } else if(rep && rq.qtype == wanted_qtype && + query_dname_compare(z->name, rq.qname) == 0 && + FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NXDOMAIN && + sec == sec_status_secure) { + /* secure nxdomain, so the zone is like some RPZ zone + * that does not exist in the wider internet, with + * a secure nxdomain answer outside of it. So we + * treat the zonemd zone without a dnssec chain of + * trust, as insecure. */ + is_insecure = 1; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was secure NXDOMAIN, treat as insecure"); + } else if(rep && rq.qtype == wanted_qtype && + query_dname_compare(z->name, rq.qname) == 0 && + FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NXDOMAIN && + sec == sec_status_insecure) { + is_insecure = 1; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was insecure NXDOMAIN, treat as insecure"); + } else if(rep && rq.qtype == wanted_qtype && + query_dname_compare(z->name, rq.qname) == 0 && + FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NXDOMAIN && + sec == sec_status_indeterminate) { + is_insecure = 1; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was indeterminate NXDOMAIN, treat as insecure"); + } else { + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY has no answer"); + reason = "lookup of DNSKEY has no answer"; + } + } else { + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY failed"); + reason = "lookup of DNSKEY failed"; + } + + if(reason) { + auth_zone_zonemd_fail(z, env, reason, NULL, NULL); + lock_rw_unlock(&z->lock); + return; + } + + auth_zone_verify_zonemd_with_key(z, env, &env->mesh->mods, dnskey, + is_insecure, NULL); + regional_free_all(env->scratch); + lock_rw_unlock(&z->lock); +} + +/** lookup DNSKEY for ZONEMD verification */ +static int +zonemd_lookup_dnskey(struct auth_zone* z, struct module_env* env) +{ + struct query_info qinfo; + uint16_t qflags = BIT_RD; + struct edns_data edns; + sldns_buffer* buf = env->scratch_buffer; + + if(z->zonemd_callback_env) { + /* another worker is already working on the callback + * for the DNSKEY lookup for ZONEMD verification. + * We do not also have to do ZONEMD verification, let that + * worker do it */ + auth_zone_log(z->name, VERB_ALGO, + "zonemd needs lookup of DNSKEY and that already worked on by another worker"); + return 1; + } + + /* use mesh_new_callback to lookup the DNSKEY, + * and then wait for them to be looked up (in cache, or query) */ + qinfo.qname_len = z->namelen; + qinfo.qname = z->name; + qinfo.qclass = z->dclass; + qinfo.qtype = LDNS_RR_TYPE_DNSKEY; + qinfo.local_alias = NULL; + if(verbosity >= VERB_ALGO) { + char buf1[512]; + char buf2[LDNS_MAX_DOMAINLEN+1]; + dname_str(z->name, buf2); + snprintf(buf1, sizeof(buf1), "auth zone %s: lookup DNSKEY " + "for zonemd verification", buf2); + log_query_info(VERB_ALGO, buf1, &qinfo); + } + edns.edns_present = 1; + edns.ext_rcode = 0; + edns.edns_version = 0; + edns.bits = EDNS_DO; + edns.opt_list = NULL; + if(sldns_buffer_capacity(buf) < 65535) + edns.udp_size = (uint16_t)sldns_buffer_capacity(buf); + else edns.udp_size = 65535; + + /* store the worker-specific module env for the callback. + * We can then reference this when the callback executes */ + z->zonemd_callback_env = env; + /* the callback can be called straight away */ + lock_rw_unlock(&z->lock); + if(!mesh_new_callback(env->mesh, &qinfo, qflags, &edns, buf, 0, + &auth_zonemd_dnskey_lookup_callback, z)) { + lock_rw_wrlock(&z->lock); + log_err("out of memory lookup up dnskey for zonemd"); + return 0; + } + lock_rw_wrlock(&z->lock); + return 1; +} + +void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, + struct module_stack* mods, char** result, int offline, int only_online) +{ + char* reason = NULL, *why_bogus = NULL; + struct trust_anchor* anchor = NULL; + struct ub_packed_rrset_key* dnskey = NULL; + struct ub_packed_rrset_key keystorage; + int is_insecure = 0; + /* verify the ZONEMD if present. + * If not present check if absence is allowed by DNSSEC */ + if(!z->zonemd_check) + return; + + /* if zone is under a trustanchor */ + /* is it equal to trustanchor - get dnskey's verified */ + /* else, find chain of trust by fetching DNSKEYs lookup for zone */ + /* result if that, if insecure, means no DNSSEC for the ZONEMD, + * otherwise we have the zone DNSKEY for the DNSSEC verification. */ + if(env->anchors) + anchor = anchors_lookup(env->anchors, z->name, z->namelen, + z->dclass); + if(anchor && anchor->numDS == 0 && anchor->numDNSKEY == 0) { + /* domain-insecure trust anchor for unsigned zones */ + lock_basic_unlock(&anchor->lock); + if(only_online) + return; + dnskey = NULL; + is_insecure = 1; + } else if(anchor && query_dname_compare(z->name, anchor->name) == 0) { + if(only_online) { + lock_basic_unlock(&anchor->lock); + return; + } + /* equal to trustanchor, no need for online lookups */ + dnskey = zonemd_get_dnskey_from_anchor(z, env, mods, anchor, + &is_insecure, &why_bogus, &keystorage); + lock_basic_unlock(&anchor->lock); + if(!dnskey && !reason && !is_insecure) { + reason = "verify DNSKEY RRset with trust anchor failed"; + } + } else if(anchor) { + lock_basic_unlock(&anchor->lock); + /* perform online lookups */ + if(offline) + return; + /* setup online lookups, and wait for them */ + if(zonemd_lookup_dnskey(z, env)) { + /* wait for the lookup */ + return; + } + reason = "could not lookup DNSKEY for chain of trust"; + } else { + /* the zone is not under a trust anchor */ + if(only_online) + return; + dnskey = NULL; + is_insecure = 1; + } + + if(reason) { + auth_zone_zonemd_fail(z, env, reason, why_bogus, result); + return; + } + + auth_zone_verify_zonemd_with_key(z, env, mods, dnskey, is_insecure, + result); + regional_free_all(env->scratch); +} + +void auth_zones_pickup_zonemd_verify(struct auth_zones* az, + struct module_env* env) +{ + struct auth_zone key; + uint8_t savezname[255+1]; + size_t savezname_len; + struct auth_zone* z; + key.node.key = &key; + lock_rw_rdlock(&az->lock); + RBTREE_FOR(z, struct auth_zone*, &az->ztree) { + lock_rw_wrlock(&z->lock); + if(!z->zonemd_check) { + lock_rw_unlock(&z->lock); + continue; + } + key.dclass = z->dclass; + key.namelabs = z->namelabs; + if(z->namelen > sizeof(savezname)) { + lock_rw_unlock(&z->lock); + log_err("auth_zones_pickup_zonemd_verify: zone name too long"); + continue; + } + savezname_len = z->namelen; + memmove(savezname, z->name, z->namelen); + lock_rw_unlock(&az->lock); + auth_zone_verify_zonemd(z, env, &env->mesh->mods, NULL, 0, 1); + lock_rw_unlock(&z->lock); + lock_rw_rdlock(&az->lock); + /* find the zone we had before, it is not deleted, + * because we have a flag for that that is processed at + * apply_cfg time */ + key.namelen = savezname_len; + key.name = savezname; + z = (struct auth_zone*)rbtree_search(&az->ztree, &key); + if(!z) + break; + } + lock_rw_unlock(&az->lock); +} diff --git a/sbin/unwind/libunbound/services/authzone.h b/sbin/unwind/libunbound/services/authzone.h index 3d94f30d620..ffe234d59b5 100644 --- a/sbin/unwind/libunbound/services/authzone.h +++ b/sbin/unwind/libunbound/services/authzone.h @@ -132,8 +132,17 @@ struct auth_zone { /** for upstream: this zone answers queries that unbound intends to * send upstream. */ int for_upstream; + /** check ZONEMD records */ + int zonemd_check; + /** reject absence of ZONEMD records */ + int zonemd_reject_absence; /** RPZ zones */ struct rpz* rpz; + /** store the env (worker thread specific) for the zonemd callbacks + * from the mesh with the results of the lookup, if nonNULL, some + * worker has already picked up the zonemd verification task and + * this worker does not have to do it as well. */ + struct module_env* zonemd_callback_env; /** zone has been deleted */ int zone_deleted; /** deletelist pointer, unused normally except during delete */ @@ -474,10 +483,13 @@ struct auth_zones* auth_zones_create(void); * @param cfg: config to apply. * @param setup: if true, also sets up values in the auth zones structure * @param is_rpz: set to 1 if at least one RPZ zone is configured. + * @param env: environment for offline verification. + * @param mods: modules in environment. * @return false on failure. */ int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg, - int setup, int* is_rpz); + int setup, int* is_rpz, struct module_env* env, + struct module_stack* mods); /** initial pick up of worker timeouts, ties events to worker event loop * @param az: auth zones structure @@ -625,6 +637,9 @@ int auth_zone_read_zonefile(struct auth_zone* z, struct config_file* cfg); /** find serial number of zone or false if none (no SOA record) */ int auth_zone_get_serial(struct auth_zone* z, uint32_t* serial); +/** Find auth_zone SOA and populate the values in xfr(soa values). */ +int xfr_find_soa(struct auth_zone* z, struct auth_xfer* xfr); + /** compare auth_zones for sorted rbtree */ int auth_zone_cmp(const void* z1, const void* z2); @@ -685,4 +700,83 @@ void auth_xfer_transfer_lookup_callback(void* arg, int rcode, */ int compare_serial(uint32_t a, uint32_t b); +/** + * Generate ZONEMD digest for the auth zone. + * @param z: the auth zone to digest. + * omits zonemd at apex and its RRSIG from the digest. + * @param scheme: the collation scheme to use. Numbers as defined for ZONEMD. + * @param hashalgo: the hash algo, from the registry defined for ZONEMD type. + * @param hash: the result buffer. + * @param buflen: size of the result buffer, must be large enough. or the + * routine fails. + * @param resultlen: size of the hash in the result buffer of the result. + * @param region: temp region for allocs during canonicalisation. + * @param buf: temp buffer during canonicalisation. + * @param reason: failure reason, returns a string, NULL on success. + * @return false on failure. + */ +int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme, + int hashalgo, uint8_t* hash, size_t buflen, size_t* resultlen, + struct regional* region, struct sldns_buffer* buf, char** reason); + +/** ZONEMD scheme definitions */ +#define ZONEMD_SCHEME_SIMPLE 1 + +/** ZONEMD hash algorithm definition for SHA384 */ +#define ZONEMD_ALGO_SHA384 1 +/** ZONEMD hash algorithm definition for SHA512 */ +#define ZONEMD_ALGO_SHA512 2 + +/** returns true if a zonemd hash algo is supported */ +int zonemd_hashalgo_supported(int hashalgo); +/** returns true if a zonemd scheme is supported */ +int zonemd_scheme_supported(int scheme); + +/** + * Check ZONEMD digest for the auth zone. + * @param z: auth zone to digest. + * @param scheme: zonemd scheme. + * @param hashalgo: zonemd hash algorithm. + * @param hash: the hash to check. + * @param hashlen: length of hash buffer. + * @param region: temp region for allocs during canonicalisation. + * @param buf: temp buffer during canonicalisation. + * @param reason: string returned with failure reason. + * @return false on failure. + */ +int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, + int hashalgo, uint8_t* hash, size_t hashlen, struct regional* region, + struct sldns_buffer* buf, char** reason); + +/** + * Perform ZONEMD checks and verification for the auth zone. + * This includes DNSSEC verification if applicable. + * @param z: auth zone to check. Caller holds lock. wrlock. + * @param env: with temp region, buffer and config. + * @param mods: module stack for validator env. + * @param result: if not NULL, result string strdupped in here. + * @param offline: if true, there is no spawned lookup when online is needed. + * Those zones are skipped for ZONEMD checking. + * @param only_online: if true, only for ZONEMD that need online lookup + * of DNSKEY chain of trust are processed. + */ +void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, + struct module_stack* mods, char** result, int offline, + int only_online); + +/** mesh callback for zonemd on lookup of dnskey */ +void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, + struct sldns_buffer* buf, enum sec_status sec, char* why_bogus, + int was_ratelimited); + +/** + * Check the ZONEMD records that need online DNSSEC chain lookups, + * for them spawn the lookup process to get it checked out. + * Attaches the lookup process to the worker event base and mesh state. + * @param az: auth zones, every zones is checked. + * @param env: env of the worker where the task is attached. + */ +void auth_zones_pickup_zonemd_verify(struct auth_zones* az, + struct module_env* env); + #endif /* SERVICES_AUTHZONE_H */ diff --git a/sbin/unwind/libunbound/services/cache/dns.c b/sbin/unwind/libunbound/services/cache/dns.c index f3149b614b5..5b64fe47520 100644 --- a/sbin/unwind/libunbound/services/cache/dns.c +++ b/sbin/unwind/libunbound/services/cache/dns.c @@ -801,7 +801,7 @@ struct dns_msg* dns_cache_lookup(struct module_env* env, uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags, struct regional* region, struct regional* scratch, - int no_partial) + int no_partial, uint8_t* dpname, size_t dpnamelen) { struct lruhash_entry* e; struct query_info k; @@ -923,6 +923,9 @@ dns_cache_lookup(struct module_env* env, * the same. We search upwards for NXDOMAINs. */ if(env->cfg->harden_below_nxdomain) { while(!dname_is_root(k.qname)) { + if(dpname && dpnamelen + && !dname_subdomain_c(k.qname, dpname)) + break; /* no synth nxdomain above the stub */ dname_remove_label(&k.qname, &k.qname_len); h = query_info_hash(&k, flags); e = slabhash_lookup(env->msg_cache, h, &k, 0); diff --git a/sbin/unwind/libunbound/services/cache/dns.h b/sbin/unwind/libunbound/services/cache/dns.h index f1b77fb36c0..bece8370296 100644 --- a/sbin/unwind/libunbound/services/cache/dns.h +++ b/sbin/unwind/libunbound/services/cache/dns.h @@ -164,6 +164,8 @@ struct dns_msg* tomsg(struct module_env* env, struct query_info* q, * @param scratch: where to allocate temporary data. * @param no_partial: if true, only complete messages and not a partial * one (with only the start of the CNAME chain and not the rest). + * @param dpname: if not NULL, do not return NXDOMAIN above this name. + * @param dpnamelen: length of dpname. * @return new response message (alloced in region, rrsets do not have IDs). * or NULL on error or if not found in cache. * TTLs are made relative to the current time. @@ -171,7 +173,7 @@ struct dns_msg* tomsg(struct module_env* env, struct query_info* q, struct dns_msg* dns_cache_lookup(struct module_env* env, uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags, struct regional* region, struct regional* scratch, - int no_partial); + int no_partial, uint8_t* dpname, size_t dpnamelen); /** * find and add A and AAAA records for missing nameservers in delegpt diff --git a/sbin/unwind/libunbound/services/cache/infra.c b/sbin/unwind/libunbound/services/cache/infra.c index 2d16bcd6e40..518e69622f8 100644 --- a/sbin/unwind/libunbound/services/cache/infra.c +++ b/sbin/unwind/libunbound/services/cache/infra.c @@ -236,6 +236,9 @@ infra_create(struct config_file* cfg) sizeof(struct infra_cache)); size_t maxmem = cfg->infra_cache_numhosts * (sizeof(struct infra_key)+ sizeof(struct infra_data)+INFRA_BYTES_NAME); + if(!infra) { + return NULL; + } infra->hosts = slabhash_create(cfg->infra_cache_slabs, INFRA_HOST_STARTSIZE, maxmem, &infra_sizefunc, &infra_compfunc, &infra_delkeyfunc, &infra_deldatafunc, NULL); diff --git a/sbin/unwind/libunbound/services/listen_dnsport.c b/sbin/unwind/libunbound/services/listen_dnsport.c index b790660f239..b43def56750 100644 --- a/sbin/unwind/libunbound/services/listen_dnsport.c +++ b/sbin/unwind/libunbound/services/listen_dnsport.c @@ -133,6 +133,16 @@ verbose_print_addr(struct addrinfo *addr) } } +void +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"); + } +} + #ifdef HAVE_SYSTEMD static int systemd_get_activated(int family, int socktype, int listen, @@ -442,6 +452,10 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, if(err != NULL) log_warn("error setting IP DiffServ codepoint %d on UDP socket: %s", dscp, err); if(family == AF_INET6) { +# if defined(IPV6_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT) + int omit6_set = 0; + int action; +# endif # if defined(IPV6_V6ONLY) if(v6only) { int val=(v6only==2)?0:1; @@ -490,6 +504,39 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, return -1; } # endif /* IPv6 MTU */ +# if defined(IPV6_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT) +# if defined(IP_PMTUDISC_OMIT) + action = IP_PMTUDISC_OMIT; + if (setsockopt(s, IPPROTO_IPV6, IPV6_MTU_DISCOVER, + &action, (socklen_t)sizeof(action)) < 0) { + + if (errno != EINVAL) { + log_err("setsockopt(..., IPV6_MTU_DISCOVER, IP_PMTUDISC_OMIT...) failed: %s", + strerror(errno)); + sock_close(s); + *noproto = 0; + *inuse = 0; + return -1; + } + } + else + { + omit6_set = 1; + } +# endif + if (omit6_set == 0) { + action = IP_PMTUDISC_DONT; + if (setsockopt(s, IPPROTO_IPV6, IPV6_MTU_DISCOVER, + &action, (socklen_t)sizeof(action)) < 0) { + log_err("setsockopt(..., IPV6_MTU_DISCOVER, IP_PMTUDISC_DONT...) failed: %s", + strerror(errno)); + sock_close(s); + *noproto = 0; + *inuse = 0; + return -1; + } + } +# endif /* IPV6_MTU_DISCOVER */ } else if(family == AF_INET) { # if defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT) /* linux 3.15 has IP_PMTUDISC_OMIT, Hannes Frederic Sowa made it so that @@ -916,7 +963,7 @@ static int make_sock(int stype, const char* ifname, const char* port, struct addrinfo *hints, int v6only, int* noip6, size_t rcv, size_t snd, int* reuseport, int transparent, int tcp_mss, int nodelay, int freebind, - int use_systemd, int dscp) + int use_systemd, int dscp, struct unbound_socket* ub_sock) { struct addrinfo *res = NULL; int r, s, inuse, noproto; @@ -958,7 +1005,11 @@ make_sock(int stype, const char* ifname, const char* port, *noip6 = 1; } } - freeaddrinfo(res); + + ub_sock->addr = res; + ub_sock->s = s; + ub_sock->fam = hints->ai_family; + return s; } @@ -967,7 +1018,7 @@ static int make_sock_port(int stype, const char* ifname, const char* port, struct addrinfo *hints, int v6only, int* noip6, size_t rcv, size_t snd, int* reuseport, int transparent, int tcp_mss, int nodelay, int freebind, - int use_systemd, int dscp) + int use_systemd, int dscp, struct unbound_socket* ub_sock) { char* s = strchr(ifname, '@'); if(s) { @@ -990,11 +1041,11 @@ make_sock_port(int stype, const char* ifname, const char* port, p[strlen(s+1)]=0; return make_sock(stype, newif, p, hints, v6only, noip6, rcv, snd, reuseport, transparent, tcp_mss, nodelay, freebind, - use_systemd, dscp); + use_systemd, dscp, ub_sock); } return make_sock(stype, ifname, port, hints, v6only, noip6, rcv, snd, reuseport, transparent, tcp_mss, nodelay, freebind, use_systemd, - dscp); + dscp, ub_sock); } /** @@ -1002,10 +1053,11 @@ 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 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) +port_insert(struct listen_port** list, int s, enum listen_type ftype, struct unbound_socket* ub_sock) { struct listen_port* item = (struct listen_port*)malloc( sizeof(struct listen_port)); @@ -1014,6 +1066,7 @@ port_insert(struct listen_port** list, int s, enum listen_type ftype) item->next = *list; item->fd = s; item->ftype = ftype; + item->socket = ub_sock; *list = item; return 1; } @@ -1043,7 +1096,7 @@ set_recvpktinfo(int s, int family) return 0; } # else - log_err("no IPV6_RECVPKTINFO and no IPV6_PKTINFO option, please " + log_err("no IPV6_RECVPKTINFO and IPV6_PKTINFO options, please " "disable interface-automatic or do-ip6 in config"); return 0; # endif /* defined IPV6_RECVPKTINFO */ @@ -1093,18 +1146,6 @@ if_is_ssl(const char* ifname, const char* port, int ssl_port, return 0; } -/** see if interface is https, its port number == the https port number */ -static int -if_is_https(const char* ifname, const char* port, int https_port) -{ - char* p = strchr(ifname, '@'); - if(!p && atoi(port) == https_port) - return 1; - if(p && atoi(p+1) == https_port) - return 1; - return 0; -} - /** * Helper for ports_open. Creates one interface (or NULL for default). * @param ifname: The interface ip address. @@ -1142,6 +1183,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, int s, noip6=0; int is_https = if_is_https(ifname, port, https_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) || @@ -1153,10 +1195,16 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, if(!do_udp && !do_tcp) return 0; + 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, &noip6, rcv, snd, reuseport, transparent, - tcp_mss, nodelay, freebind, use_systemd, dscp)) == -1) { + tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock)) == -1) { + freeaddrinfo(ub_sock->addr); + free(ub_sock); if(noip6) { log_warn("IPv6 protocol not available"); return 1; @@ -1166,18 +1214,27 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, /* getting source addr packet info is highly non-portable */ if(!set_recvpktinfo(s, hints->ai_family)) { sock_close(s); + freeaddrinfo(ub_sock->addr); + free(ub_sock); return 0; } if(!port_insert(list, s, - is_dnscrypt?listen_type_udpancil_dnscrypt:listen_type_udpancil)) { + is_dnscrypt?listen_type_udpancil_dnscrypt:listen_type_udpancil, ub_sock)) { sock_close(s); + freeaddrinfo(ub_sock->addr); + free(ub_sock); return 0; } } else if(do_udp) { + ub_sock = calloc(1, sizeof(struct unbound_socket)); + if(!ub_sock) + return 0; /* regular udp socket */ if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1, &noip6, rcv, snd, reuseport, transparent, - tcp_mss, nodelay, freebind, use_systemd, dscp)) == -1) { + tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock)) == -1) { + freeaddrinfo(ub_sock->addr); + free(ub_sock); if(noip6) { log_warn("IPv6 protocol not available"); return 1; @@ -1185,8 +1242,10 @@ 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)) { + is_dnscrypt?listen_type_udp_dnscrypt:listen_type_udp, ub_sock)) { sock_close(s); + freeaddrinfo(ub_sock->addr); + free(ub_sock); return 0; } } @@ -1194,6 +1253,9 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, int is_ssl = if_is_ssl(ifname, port, ssl_port, tls_additional_port); enum listen_type port_type; + ub_sock = calloc(1, sizeof(struct unbound_socket)); + if(!ub_sock) + return 0; if(is_ssl) port_type = listen_type_ssl; else if(is_https) @@ -1204,7 +1266,9 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, port_type = listen_type_tcp; if((s = make_sock_port(SOCK_STREAM, ifname, port, hints, 1, &noip6, 0, 0, reuseport, transparent, tcp_mss, nodelay, - freebind, use_systemd, dscp)) == -1) { + freebind, use_systemd, dscp, ub_sock)) == -1) { + freeaddrinfo(ub_sock->addr); + free(ub_sock); if(noip6) { /*log_warn("IPv6 protocol not available");*/ return 1; @@ -1213,8 +1277,10 @@ 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)) { + if(!port_insert(list, s, port_type, ub_sock)) { sock_close(s); + freeaddrinfo(ub_sock->addr); + free(ub_sock); return 0; } } @@ -1280,14 +1346,14 @@ 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); + front->udp_buff, 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->ftype, 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, @@ -1295,7 +1361,7 @@ 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->ftype, cb, cb_arg, ports->socket); if(http_notls && ports->ftype == listen_type_http) cp->ssl = NULL; else @@ -1322,7 +1388,7 @@ 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); + front->udp_buff, cb, cb_arg, ports->socket); if(!cp) { log_err("can't create commpoint"); listen_delete(front); @@ -1506,13 +1572,12 @@ resolve_ifa_name(struct ifaddrs *ifas, const char *search_ifa, char ***ip_addres } #endif /* HAVE_GETIFADDRS */ -int resolve_interface_names(struct config_file* cfg, char*** resif, - int* num_resif) +int resolve_interface_names(char** ifs, int num_ifs, + struct config_strlist* list, char*** resif, int* num_resif) { #ifdef HAVE_GETIFADDRS - int i; struct ifaddrs *addrs = NULL; - if(cfg->num_ifs == 0) { + if(num_ifs == 0 && list == NULL) { *resif = NULL; *num_resif = 0; return 1; @@ -1523,38 +1588,73 @@ int resolve_interface_names(struct config_file* cfg, char*** resif, freeifaddrs(addrs); return 0; } - for(i=0; i<cfg->num_ifs; i++) { - if(!resolve_ifa_name(addrs, cfg->ifs[i], resif, num_resif)) { - freeifaddrs(addrs); - config_del_strarray(*resif, *num_resif); - *resif = NULL; - *num_resif = 0; - return 0; + if(ifs) { + int i; + for(i=0; i<num_ifs; i++) { + if(!resolve_ifa_name(addrs, ifs[i], resif, num_resif)) { + freeifaddrs(addrs); + config_del_strarray(*resif, *num_resif); + *resif = NULL; + *num_resif = 0; + return 0; + } } } + if(list) { + struct config_strlist* p; + for(p = list; p; p = p->next) { + if(!resolve_ifa_name(addrs, p->str, resif, num_resif)) { + freeifaddrs(addrs); + config_del_strarray(*resif, *num_resif); + *resif = NULL; + *num_resif = 0; + return 0; + } +} + } freeifaddrs(addrs); return 1; #else - int i; - if(cfg->num_ifs == 0) { + struct config_strlist* p; + if(num_ifs == 0 && list == NULL) { *resif = NULL; *num_resif = 0; return 1; } - *num_resif = cfg->num_ifs; + *num_resif = num_ifs; + for(p = list; p; p = p->next) { + (*num_resif)++; + } *resif = calloc(*num_resif, sizeof(**resif)); if(!*resif) { log_err("out of memory"); return 0; } - for(i=0; i<*num_resif; i++) { - (*resif)[i] = strdup(cfg->ifs[i]); - if(!((*resif)[i])) { - log_err("out of memory"); - config_del_strarray(*resif, *num_resif); - *resif = NULL; - *num_resif = 0; - return 0; + if(ifs) { + int i; + for(i=0; i<num_ifs; i++) { + (*resif)[i] = strdup(ifs[i]); + if(!((*resif)[i])) { + log_err("out of memory"); + config_del_strarray(*resif, *num_resif); + *resif = NULL; + *num_resif = 0; + return 0; + } + } + } + if(list) { + int idx = num_ifs; + for(p = list; p; p = p->next) { + (*resif)[idx] = strdup(p->str); + if(!((*resif)[idx])) { + log_err("out of memory"); + config_del_strarray(*resif, *num_resif); + *resif = NULL; + *num_resif = 0; + return 0; + } + idx++; } } return 1; @@ -1656,6 +1756,7 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, } } } + return list; } @@ -1667,6 +1768,11 @@ void listening_ports_free(struct listen_port* list) if(list->fd != -1) { sock_close(list->fd); } + /* rc_ports don't have ub_socket */ + if(list->socket) { + freeaddrinfo(list->socket->addr); + free(list->socket); + } free(list); list = nx; } @@ -2371,6 +2477,10 @@ static int http2_query_read_done(struct http2_session* h2_session, "buffer already assigned to stream"); return -1; } + + /* the c->buffer might be used by mesh_send_reply and no be cleard + * need to be cleared before use */ + sldns_buffer_clear(h2_session->c->buffer); if(sldns_buffer_remaining(h2_session->c->buffer) < sldns_buffer_remaining(h2_stream->qbuffer)) { /* qbuffer will be free'd in frame close cb */ @@ -2572,18 +2682,45 @@ static int http2_buffer_uri_query(struct http2_session* h2_session, return 0; } - if(!(b64len = sldns_b64url_pton( - (char const *)start, length, - sldns_buffer_current(h2_stream->qbuffer), - expectb64len)) || b64len < 0) { - lock_basic_lock(&http2_query_buffer_count_lock); - http2_query_buffer_count -= expectb64len; - lock_basic_unlock(&http2_query_buffer_count_lock); - sldns_buffer_free(h2_stream->qbuffer); - h2_stream->qbuffer = NULL; - /* return without error, method can be an - * unknown POST */ - return 1; + if(sldns_b64_contains_nonurl((char const*)start, length)) { + char buf[65536+4]; + verbose(VERB_ALGO, "HTTP2 stream contains wrong b64 encoding"); + /* copy to the scratch buffer temporarily to terminate the + * string with a zero */ + if(length+1 > sizeof(buf)) { + /* too long */ + lock_basic_lock(&http2_query_buffer_count_lock); + http2_query_buffer_count -= expectb64len; + lock_basic_unlock(&http2_query_buffer_count_lock); + sldns_buffer_free(h2_stream->qbuffer); + h2_stream->qbuffer = NULL; + return 1; + } + memmove(buf, start, length); + buf[length] = 0; + if(!(b64len = sldns_b64_pton(buf, sldns_buffer_current( + h2_stream->qbuffer), expectb64len)) || b64len < 0) { + lock_basic_lock(&http2_query_buffer_count_lock); + http2_query_buffer_count -= expectb64len; + lock_basic_unlock(&http2_query_buffer_count_lock); + sldns_buffer_free(h2_stream->qbuffer); + h2_stream->qbuffer = NULL; + return 1; + } + } else { + if(!(b64len = sldns_b64url_pton( + (char const *)start, length, + sldns_buffer_current(h2_stream->qbuffer), + expectb64len)) || b64len < 0) { + lock_basic_lock(&http2_query_buffer_count_lock); + http2_query_buffer_count -= expectb64len; + lock_basic_unlock(&http2_query_buffer_count_lock); + sldns_buffer_free(h2_stream->qbuffer); + h2_stream->qbuffer = NULL; + /* return without error, method can be an + * unknown POST */ + return 1; + } } sldns_buffer_skip(h2_stream->qbuffer, (size_t)b64len); return 1; diff --git a/sbin/unwind/libunbound/services/listen_dnsport.h b/sbin/unwind/libunbound/services/listen_dnsport.h index f438ff4580f..1e51be9bfca 100644 --- a/sbin/unwind/libunbound/services/listen_dnsport.h +++ b/sbin/unwind/libunbound/services/listen_dnsport.h @@ -102,6 +102,18 @@ enum listen_type { listen_type_http }; +/* + * socket properties (just like NSD nsd_socket structure definition) + */ +struct unbound_socket { + /** socket-address structure */ + struct addrinfo * addr; + /** socket descriptor returned by socket() syscall */ + int s; + /** address family (AF_INET/IF_INET6) */ + int fam; +}; + /** * Single linked list to store shared ports that have been * opened for use by all threads. @@ -113,6 +125,8 @@ 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 */ + struct unbound_socket* socket; }; /** @@ -136,16 +150,19 @@ struct listen_port* listening_ports_open(struct config_file* cfg, */ void listening_ports_free(struct listen_port* list); +struct config_strlist; /** * Resolve interface names in config and store result IP addresses - * @param cfg: config + * @param ifs: array of interfaces. The list of interface names, if not NULL. + * @param num_ifs: length of ifs array. + * @param list: if not NULL, this is used as the list of interface names. * @param resif: string array (malloced array of malloced strings) with * result. NULL if cfg has none. * @param num_resif: length of resif. Zero if cfg has zero num_ifs. * @return 0 on failure. */ -int resolve_interface_names(struct config_file* cfg, char*** resif, - int* num_resif); +int resolve_interface_names(char** ifs, int num_ifs, + struct config_strlist* list, char*** resif, int* num_resif); /** * Create commpoints with for this thread for the shared ports. @@ -424,4 +441,9 @@ int http2_submit_dns_response(void* v); char* set_ip_dscp(int socket, int addrfamily, int ds); +/** for debug and profiling purposes only + * @param ub_sock: the structure containing created socket info we want to print or log for + */ +void verbose_print_unbound_socket(struct unbound_socket* ub_sock); + #endif /* LISTEN_DNSPORT_H */ diff --git a/sbin/unwind/libunbound/services/localzone.c b/sbin/unwind/libunbound/services/localzone.c index fd2ff2bb67f..54f55ab810e 100644 --- a/sbin/unwind/libunbound/services/localzone.c +++ b/sbin/unwind/libunbound/services/localzone.c @@ -745,9 +745,15 @@ static int lz_enter_zones(struct local_zones* zones, struct config_file* cfg) { struct config_str2list* p; +#ifndef THREADS_DISABLED struct local_zone* z; +#endif for(p = cfg->local_zones; p; p = p->next) { - if(!(z=lz_enter_zone(zones, p->str, p->str2, + if(!( +#ifndef THREADS_DISABLED + z= +#endif + lz_enter_zone(zones, p->str, p->str2, LDNS_RR_CLASS_IN))) return 0; lock_rw_unlock(&z->lock); @@ -1027,7 +1033,9 @@ lz_setup_implicit(struct local_zones* zones, struct config_file* cfg) } if(have_name) { uint8_t* n2; +#ifndef THREADS_DISABLED struct local_zone* z; +#endif /* allocate zone of smallest shared topdomain to contain em */ n2 = nm; dname_remove_labels(&n2, &nmlen, nmlabs - match); @@ -1039,7 +1047,11 @@ lz_setup_implicit(struct local_zones* zones, struct config_file* cfg) } log_nametypeclass(VERB_ALGO, "implicit transparent local-zone", n2, 0, dclass); - if(!(z=lz_enter_zone_dname(zones, n2, nmlen, match, + if(!( +#ifndef THREADS_DISABLED + z= +#endif + lz_enter_zone_dname(zones, n2, nmlen, match, local_zone_transparent, dclass))) { return 0; } diff --git a/sbin/unwind/libunbound/services/localzone.h b/sbin/unwind/libunbound/services/localzone.h index 3da5c8754bf..b52d81dc72c 100644 --- a/sbin/unwind/libunbound/services/localzone.h +++ b/sbin/unwind/libunbound/services/localzone.h @@ -158,7 +158,7 @@ struct local_zone { rbtree_type data; /** if data contains zone apex SOA data, this is a ptr to it. */ struct ub_packed_rrset_key* soa; - /** if data contains zone apex SOA data, this is a prt to an + /** if data contains zone apex SOA data, this is a ptr to an * artificial negative SOA rrset (TTL is the minimum of the TTL and the * SOA.MINIMUM). */ struct ub_packed_rrset_key* soa_negative; diff --git a/sbin/unwind/libunbound/services/mesh.c b/sbin/unwind/libunbound/services/mesh.c index 91d23debf35..5679a8b64e5 100644 --- a/sbin/unwind/libunbound/services/mesh.c +++ b/sbin/unwind/libunbound/services/mesh.c @@ -99,7 +99,7 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, size_t d) { #ifndef S_SPLINT_S size_t leftover; - if(d == 0) { + if(d <= 0) { avg->tv_sec = 0; avg->tv_usec = 0; return; @@ -108,7 +108,13 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, size_t d) avg->tv_usec = sum->tv_usec / d; /* handle fraction from seconds divide */ leftover = sum->tv_sec - avg->tv_sec*d; - avg->tv_usec += (leftover*1000000)/d; + if(leftover <= 0) + leftover = 0; + avg->tv_usec += (((long long)leftover)*((long long)1000000))/d; + if(avg->tv_sec < 0) + avg->tv_sec = 0; + if(avg->tv_usec < 0) + avg->tv_usec = 0; #endif } @@ -433,7 +439,7 @@ mesh_serve_expired_init(struct mesh_state* mstate, int timeout) mstate->s.serve_expired_data->get_cached_answer = mstate->s.serve_expired_data->get_cached_answer? mstate->s.serve_expired_data->get_cached_answer: - mesh_serve_expired_lookup; + &mesh_serve_expired_lookup; /* In case this timer already popped, start it again */ if(!mstate->s.serve_expired_data->timer) { @@ -1813,8 +1819,7 @@ mesh_detect_cycle(struct module_qstate* qstate, struct query_info* qinfo, { struct mesh_area* mesh = qstate->env->mesh; struct mesh_state* dep_m = NULL; - if(!mesh_state_is_unique(qstate->mesh_info)) - dep_m = mesh_area_find(mesh, NULL, qinfo, flags, prime, valrec); + dep_m = mesh_area_find(mesh, NULL, qinfo, flags, prime, valrec); return mesh_detect_cycle_found(qstate, dep_m); } @@ -1941,7 +1946,7 @@ mesh_serve_expired_callback(void* arg) while(1) { fptr_ok(fptr_whitelist_serve_expired_lookup( qstate->serve_expired_data->get_cached_answer)); - msg = qstate->serve_expired_data->get_cached_answer(qstate, + msg = (*qstate->serve_expired_data->get_cached_answer)(qstate, lookup_qinfo); if(!msg) return; diff --git a/sbin/unwind/libunbound/services/modstack.c b/sbin/unwind/libunbound/services/modstack.c index a600549b16c..da8e623c16d 100644 --- a/sbin/unwind/libunbound/services/modstack.c +++ b/sbin/unwind/libunbound/services/modstack.c @@ -88,57 +88,56 @@ count_modules(const char* s) return num; } -void +void modstack_init(struct module_stack* stack) { stack->num = 0; stack->mod = NULL; } -int +int modstack_config(struct module_stack* stack, const char* module_conf) { - int i; - verbose(VERB_QUERY, "module config: \"%s\"", module_conf); - stack->num = count_modules(module_conf); - if(stack->num == 0) { - log_err("error: no modules specified"); - return 0; - } - if(stack->num > MAX_MODULE) { - log_err("error: too many modules (%d max %d)", - stack->num, MAX_MODULE); - return 0; - } - stack->mod = (struct module_func_block**)calloc((size_t) - stack->num, sizeof(struct module_func_block*)); - if(!stack->mod) { - log_err("out of memory"); - return 0; - } - for(i=0; i<stack->num; i++) { - stack->mod[i] = module_factory(&module_conf); - if(!stack->mod[i]) { + int i; + verbose(VERB_QUERY, "module config: \"%s\"", module_conf); + stack->num = count_modules(module_conf); + if(stack->num == 0) { + log_err("error: no modules specified"); + return 0; + } + if(stack->num > MAX_MODULE) { + log_err("error: too many modules (%d max %d)", + stack->num, MAX_MODULE); + return 0; + } + stack->mod = (struct module_func_block**)calloc((size_t) + stack->num, sizeof(struct module_func_block*)); + if(!stack->mod) { + log_err("out of memory"); + return 0; + } + for(i=0; i<stack->num; i++) { + stack->mod[i] = module_factory(&module_conf); + if(!stack->mod[i]) { char md[256]; snprintf(md, sizeof(md), "%s", module_conf); if(strchr(md, ' ')) *(strchr(md, ' ')) = 0; if(strchr(md, '\t')) *(strchr(md, '\t')) = 0; - log_err("Unknown value in module-config, module: '%s'." + log_err("Unknown value in module-config, module: '%s'." " This module is not present (not compiled in)," - " See the list of linked modules with unbound -h", - md); - return 0; - } - } - return 1; + " See the list of linked modules with unbound -V", md); + return 0; + } + } + return 1; } /** The list of module names */ const char** module_list_avail(void) { - /* these are the modules available */ - static const char* names[] = { + /* these are the modules available */ + static const char* names[] = { "dns64", #ifdef WITH_PYTHONMODULE "python", @@ -156,7 +155,7 @@ module_list_avail(void) "subnetcache", #endif #ifdef USE_IPSET - "ipset", + "ipset", #endif "respip", "validator", diff --git a/sbin/unwind/libunbound/services/outside_network.c b/sbin/unwind/libunbound/services/outside_network.c index 6c6b42ccbdb..a3f982e7218 100644 --- a/sbin/unwind/libunbound/services/outside_network.c +++ b/sbin/unwind/libunbound/services/outside_network.c @@ -90,8 +90,8 @@ static int randomize_and_send_udp(struct pending* pend, sldns_buffer* packet, static void waiting_list_remove(struct outside_network* outnet, struct waiting_tcp* w); -/** remove reused element from tree and lru list */ -static void reuse_tcp_remove_tree_list(struct outside_network* outnet, +/** select a DNS ID for a TCP stream */ +static uint16_t tcp_select_id(struct outside_network* outnet, struct reuse_tcp* reuse); int @@ -198,15 +198,17 @@ waiting_tcp_delete(struct waiting_tcp* w) * Pick random outgoing-interface of that family, and bind it. * port set to 0 so OS picks a port number for us. * if it is the ANY address, do not bind. + * @param pend: pending tcp structure, for storing the local address choice. * @param w: tcp structure with destination address. * @param s: socket fd. * @return false on error, socket closed. */ static int -pick_outgoing_tcp(struct waiting_tcp* w, int s) +pick_outgoing_tcp(struct pending_tcp* pend, struct waiting_tcp* w, int s) { struct port_if* pi = NULL; int num; + pend->pi = NULL; #ifdef INET6 if(addr_is_ip6(&w->addr, w->addrlen)) num = w->outnet->num_ip6; @@ -226,6 +228,7 @@ pick_outgoing_tcp(struct waiting_tcp* w, int s) #endif pi = &w->outnet->ip4_ifs[ub_random_max(w->outnet->rnd, num)]; log_assert(pi); + pend->pi = pi; if(addr_is_any(&pi->addr, pi->addrlen)) { /* binding to the ANY interface is for listening sockets */ return 1; @@ -235,7 +238,14 @@ pick_outgoing_tcp(struct waiting_tcp* w, int s) ((struct sockaddr_in6*)&pi->addr)->sin6_port = 0; else ((struct sockaddr_in*)&pi->addr)->sin_port = 0; if(bind(s, (struct sockaddr*)&pi->addr, pi->addrlen) != 0) { - log_err("outgoing tcp: bind: %s", sock_strerror(errno)); +#ifndef USE_WINSOCK +#ifdef EADDRNOTAVAIL + if(!(verbosity < 4 && errno == EADDRNOTAVAIL)) +#endif +#else /* USE_WINSOCK */ + if(!(verbosity < 4 && WSAGetLastError() == WSAEADDRNOTAVAIL)) +#endif + log_err("outgoing tcp: bind: %s", sock_strerror(errno)); sock_close(s); return 0; } @@ -337,6 +347,8 @@ log_reuse_tcp(enum verbosity_value v, const char* msg, struct reuse_tcp* reuse) uint16_t port; char addrbuf[128]; if(verbosity < v) return; + if(!reuse || !reuse->pending || !reuse->pending->c) + return; addr_to_str(&reuse->addr, reuse->addrlen, addrbuf, sizeof(addrbuf)); port = ntohs(((struct sockaddr_in*)&reuse->addr)->sin_port); verbose(v, "%s %s#%u fd %d", msg, addrbuf, (unsigned)port, @@ -356,6 +368,8 @@ static struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse) w->write_wait_next->write_wait_prev = NULL; else reuse->write_wait_last = NULL; w->write_wait_queued = 0; + w->write_wait_next = NULL; + w->write_wait_prev = NULL; return w; } @@ -363,6 +377,8 @@ static struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse) static void reuse_write_wait_remove(struct reuse_tcp* reuse, struct waiting_tcp* w) { + log_assert(w); + log_assert(w->write_wait_queued); if(!w) return; if(!w->write_wait_queued) @@ -370,10 +386,16 @@ static void reuse_write_wait_remove(struct reuse_tcp* reuse, if(w->write_wait_prev) w->write_wait_prev->write_wait_next = w->write_wait_next; else reuse->write_wait_first = w->write_wait_next; + log_assert(!w->write_wait_prev || + w->write_wait_prev->write_wait_next != w->write_wait_prev); if(w->write_wait_next) w->write_wait_next->write_wait_prev = w->write_wait_prev; else reuse->write_wait_last = w->write_wait_prev; + log_assert(!w->write_wait_next + || w->write_wait_next->write_wait_prev != w->write_wait_next); w->write_wait_queued = 0; + w->write_wait_next = NULL; + w->write_wait_prev = NULL; } /** push the element after the last on the writewait list */ @@ -384,6 +406,8 @@ static void reuse_write_wait_push_back(struct reuse_tcp* reuse, log_assert(!w->write_wait_queued); if(reuse->write_wait_last) { reuse->write_wait_last->write_wait_next = w; + log_assert(reuse->write_wait_last->write_wait_next != + reuse->write_wait_last); w->write_wait_prev = reuse->write_wait_last; } else { reuse->write_wait_first = w; @@ -396,9 +420,18 @@ static void reuse_write_wait_push_back(struct reuse_tcp* reuse, void reuse_tree_by_id_insert(struct reuse_tcp* reuse, struct waiting_tcp* w) { +#ifdef UNBOUND_DEBUG + rbnode_type* added; +#endif log_assert(w->id_node.key == NULL); w->id_node.key = w; +#ifdef UNBOUND_DEBUG + added = +#else + (void) +#endif rbtree_insert(&reuse->tree_by_id, &w->id_node); + log_assert(added); /* should have been added */ } /** find element in tree by id */ @@ -424,34 +457,45 @@ tree_by_id_get_id(rbnode_type* node) } /** insert into reuse tcp tree and LRU, false on failure (duplicate) */ -static int +int reuse_tcp_insert(struct outside_network* outnet, struct pending_tcp* pend_tcp) { log_reuse_tcp(VERB_CLIENT, "reuse_tcp_insert", &pend_tcp->reuse); if(pend_tcp->reuse.item_on_lru_list) { if(!pend_tcp->reuse.node.key) - log_err("internal error: reuse_tcp_insert: on lru list without key"); + log_err("internal error: reuse_tcp_insert: " + "in lru list without key"); return 1; } pend_tcp->reuse.node.key = &pend_tcp->reuse; pend_tcp->reuse.pending = pend_tcp; if(!rbtree_insert(&outnet->tcp_reuse, &pend_tcp->reuse.node)) { - /* this is a duplicate connection, close this one */ - verbose(VERB_CLIENT, "reuse_tcp_insert: duplicate connection"); - pend_tcp->reuse.node.key = NULL; - return 0; + /* We are not in the LRU list but we are already in the + * tcp_reuse tree, strange. + * Continue to add ourselves to the LRU list. */ + log_err("internal error: reuse_tcp_insert: in lru list but " + "not in the tree"); } /* insert into LRU, first is newest */ pend_tcp->reuse.lru_prev = NULL; if(outnet->tcp_reuse_first) { pend_tcp->reuse.lru_next = outnet->tcp_reuse_first; + log_assert(pend_tcp->reuse.lru_next != &pend_tcp->reuse); outnet->tcp_reuse_first->lru_prev = &pend_tcp->reuse; + log_assert(outnet->tcp_reuse_first->lru_prev != + outnet->tcp_reuse_first); } else { pend_tcp->reuse.lru_next = NULL; outnet->tcp_reuse_last = &pend_tcp->reuse; } outnet->tcp_reuse_first = &pend_tcp->reuse; pend_tcp->reuse.item_on_lru_list = 1; + log_assert((!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) || + (outnet->tcp_reuse_first && outnet->tcp_reuse_last)); + log_assert(outnet->tcp_reuse_first != outnet->tcp_reuse_first->lru_next && + outnet->tcp_reuse_first != outnet->tcp_reuse_first->lru_prev); + log_assert(outnet->tcp_reuse_last != outnet->tcp_reuse_last->lru_next && + outnet->tcp_reuse_last != outnet->tcp_reuse_last->lru_prev); return 1; } @@ -511,7 +555,7 @@ reuse_tcp_find(struct outside_network* outnet, struct sockaddr_storage* addr, while(result && result != RBTREE_NULL && reuse_cmp_addrportssl(result->key, &key_p.reuse) == 0) { if(((struct reuse_tcp*)result)->tree_by_id.count < - MAX_REUSE_TCP_QUERIES) { + outnet->max_reuse_tcp_queries) { /* same address, port, ssl-yes-or-no, and has * space for another query */ return (struct reuse_tcp*)result; @@ -567,7 +611,7 @@ outnet_tcp_take_into_use(struct waiting_tcp* w) if(s == -1) return 0; - if(!pick_outgoing_tcp(w, s)) + if(!pick_outgoing_tcp(pend, w, s)) return 0; fd_set_nonblock(s); @@ -689,28 +733,65 @@ outnet_tcp_take_into_use(struct waiting_tcp* w) /** Touch the lru of a reuse_tcp element, it is in use. * This moves it to the front of the list, where it is not likely to * be closed. Items at the back of the list are closed to make space. */ -static void +void reuse_tcp_lru_touch(struct outside_network* outnet, struct reuse_tcp* reuse) { if(!reuse->item_on_lru_list) { log_err("internal error: we need to touch the lru_list but item not in list"); return; /* not on the list, no lru to modify */ } + log_assert(reuse->lru_prev || + (!reuse->lru_prev && outnet->tcp_reuse_first == reuse)); if(!reuse->lru_prev) return; /* already first in the list */ /* remove at current position */ /* since it is not first, there is a previous element */ reuse->lru_prev->lru_next = reuse->lru_next; + log_assert(reuse->lru_prev->lru_next != reuse->lru_prev); if(reuse->lru_next) reuse->lru_next->lru_prev = reuse->lru_prev; else outnet->tcp_reuse_last = reuse->lru_prev; + log_assert(!reuse->lru_next || reuse->lru_next->lru_prev != reuse->lru_next); + log_assert(outnet->tcp_reuse_last != outnet->tcp_reuse_last->lru_next && + outnet->tcp_reuse_last != outnet->tcp_reuse_last->lru_prev); /* insert at the front */ reuse->lru_prev = NULL; reuse->lru_next = outnet->tcp_reuse_first; + if(outnet->tcp_reuse_first) { + outnet->tcp_reuse_first->lru_prev = reuse; + } + log_assert(reuse->lru_next != reuse); /* since it is not first, it is not the only element and * lru_next is thus not NULL and thus reuse is now not the last in * the list, so outnet->tcp_reuse_last does not need to be modified */ outnet->tcp_reuse_first = reuse; + log_assert(outnet->tcp_reuse_first != outnet->tcp_reuse_first->lru_next && + outnet->tcp_reuse_first != outnet->tcp_reuse_first->lru_prev); + log_assert((!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) || + (outnet->tcp_reuse_first && outnet->tcp_reuse_last)); +} + +/** Snip the last reuse_tcp element off of the LRU list */ +struct reuse_tcp* +reuse_tcp_lru_snip(struct outside_network* outnet) +{ + struct reuse_tcp* reuse = outnet->tcp_reuse_last; + if(!reuse) return NULL; + /* snip off of LRU */ + log_assert(reuse->lru_next == NULL); + if(reuse->lru_prev) { + outnet->tcp_reuse_last = reuse->lru_prev; + reuse->lru_prev->lru_next = NULL; + } else { + outnet->tcp_reuse_last = NULL; + outnet->tcp_reuse_first = NULL; + } + log_assert((!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) || + (outnet->tcp_reuse_first && outnet->tcp_reuse_last)); + reuse->item_on_lru_list = 0; + reuse->lru_next = NULL; + reuse->lru_prev = NULL; + return reuse; } /** call callback on waiting_tcp, if not NULL */ @@ -718,30 +799,89 @@ static void waiting_tcp_callback(struct waiting_tcp* w, struct comm_point* c, int error, struct comm_reply* reply_info) { - if(w->cb) { + if(w && w->cb) { fptr_ok(fptr_whitelist_pending_tcp(w->cb)); (void)(*w->cb)(c, w->cb_arg, error, reply_info); } } +/** add waiting_tcp element to the outnet tcp waiting list */ +static void +outnet_add_tcp_waiting(struct outside_network* outnet, struct waiting_tcp* w) +{ + struct timeval tv; + log_assert(!w->on_tcp_waiting_list); + if(w->on_tcp_waiting_list) + return; + w->next_waiting = NULL; + if(outnet->tcp_wait_last) + outnet->tcp_wait_last->next_waiting = w; + else outnet->tcp_wait_first = w; + outnet->tcp_wait_last = w; + w->on_tcp_waiting_list = 1; +#ifndef S_SPLINT_S + tv.tv_sec = w->timeout/1000; + tv.tv_usec = (w->timeout%1000)*1000; +#endif + 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, + struct waiting_tcp* w, int reset_timer) +{ + struct timeval tv; + log_assert(!w->on_tcp_waiting_list); + if(w->on_tcp_waiting_list) + return; + w->next_waiting = outnet->tcp_wait_first; + if(!outnet->tcp_wait_last) + outnet->tcp_wait_last = w; + outnet->tcp_wait_first = w; + w->on_tcp_waiting_list = 1; + if(reset_timer) { +#ifndef S_SPLINT_S + tv.tv_sec = w->timeout/1000; + tv.tv_usec = (w->timeout%1000)*1000; +#endif + comm_timer_set(w->timer, &tv); + } + log_assert( + (!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) || + (outnet->tcp_reuse_first && outnet->tcp_reuse_last)); +} + /** see if buffers can be used to service TCP queries */ static void use_free_buffer(struct outside_network* outnet) { struct waiting_tcp* w; - while(outnet->tcp_free && outnet->tcp_wait_first - && !outnet->want_to_quit) { + while(outnet->tcp_wait_first && !outnet->want_to_quit) { +#ifdef USE_DNSTAP + 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; + 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 */ + w->id = tcp_select_id(outnet, reuse); + LDNS_ID_SET(w->pkt, w->id); if(reuse) { log_reuse_tcp(VERB_CLIENT, "use free buffer for waiting tcp: " "found reuse", reuse); +#ifdef USE_DNSTAP + pend_tcp = reuse->pending; +#endif reuse_tcp_lru_touch(outnet, reuse); comm_timer_disable(w->timer); w->next_waiting = (void*)reuse->pending; @@ -758,7 +898,7 @@ use_free_buffer(struct outside_network* outnet) reuse->pending->c->fd, reuse->pending, w); } - } else { + } else if(outnet->tcp_free) { struct pending_tcp* pend = w->outnet->tcp_free; rbtree_init(&pend->reuse.tree_by_id, reuse_id_cmp); pend->reuse.pending = pend; @@ -768,37 +908,47 @@ use_free_buffer(struct outside_network* outnet) waiting_tcp_callback(w, NULL, NETEVENT_CLOSED, NULL); waiting_tcp_delete(w); +#ifdef USE_DNSTAP + w = NULL; +#endif } +#ifdef USE_DNSTAP + pend_tcp = pend; +#endif + } else { + /* no reuse and no free buffer, put back at the start */ + outnet_add_tcp_waiting_first(outnet, w, 0); + break; + } +#ifdef USE_DNSTAP + if(outnet->dtenv && pend_tcp && w && w->sq && + (outnet->dtenv->log_resolver_query_messages || + outnet->dtenv->log_forwarder_query_messages)) { + sldns_buffer tmp; + sldns_buffer_init_frm_data(&tmp, w->pkt, w->pkt_len); + dt_msg_send_outside_query(outnet->dtenv, &w->sq->addr, + &pend_tcp->pi->addr, comm_tcp, w->sq->zone, + w->sq->zonelen, &tmp); } - } -} - -/** add waiting_tcp element to the outnet tcp waiting list */ -static void -outnet_add_tcp_waiting(struct outside_network* outnet, struct waiting_tcp* w) -{ - struct timeval tv; - if(w->on_tcp_waiting_list) - return; - w->next_waiting = NULL; - if(outnet->tcp_wait_last) - outnet->tcp_wait_last->next_waiting = w; - else outnet->tcp_wait_first = w; - outnet->tcp_wait_last = w; - w->on_tcp_waiting_list = 1; -#ifndef S_SPLINT_S - tv.tv_sec = w->timeout/1000; - tv.tv_usec = (w->timeout%1000)*1000; #endif - comm_timer_set(w->timer, &tv); + } } /** delete element from tree by id */ static void reuse_tree_by_id_delete(struct reuse_tcp* reuse, struct waiting_tcp* w) { +#ifdef UNBOUND_DEBUG + rbnode_type* rem; +#endif log_assert(w->id_node.key != NULL); +#ifdef UNBOUND_DEBUG + rem = +#else + (void) +#endif rbtree_delete(&reuse->tree_by_id, w); + log_assert(rem); /* should have been there */ w->id_node.key = NULL; } @@ -857,15 +1007,24 @@ reuse_move_writewait_away(struct outside_network* outnet, } /** remove reused element from tree and lru list */ -static void +void reuse_tcp_remove_tree_list(struct outside_network* outnet, struct reuse_tcp* reuse) { verbose(VERB_CLIENT, "reuse_tcp_remove_tree_list"); if(reuse->node.key) { /* delete it from reuse tree */ - (void)rbtree_delete(&outnet->tcp_reuse, reuse); + if(!rbtree_delete(&outnet->tcp_reuse, reuse)) { + /* should not be possible, it should be there */ + char buf[256]; + addr_to_str(&reuse->addr, reuse->addrlen, buf, + sizeof(buf)); + log_err("reuse tcp delete: node not present, internal error, %s ssl %d lru %d", buf, reuse->is_ssl, reuse->item_on_lru_list); + } reuse->node.key = NULL; + /* defend against loops on broken tree by zeroing the + * rbnode structure */ + memset(&reuse->node, 0, sizeof(reuse->node)); } /* delete from reuse list */ if(reuse->item_on_lru_list) { @@ -874,21 +1033,38 @@ reuse_tcp_remove_tree_list(struct outside_network* outnet, * and thus have a pending pointer to the struct */ log_assert(reuse->lru_prev->pending); reuse->lru_prev->lru_next = reuse->lru_next; + log_assert(reuse->lru_prev->lru_next != reuse->lru_prev); } else { log_assert(!reuse->lru_next || reuse->lru_next->pending); outnet->tcp_reuse_first = reuse->lru_next; + log_assert(!outnet->tcp_reuse_first || + (outnet->tcp_reuse_first != + outnet->tcp_reuse_first->lru_next && + outnet->tcp_reuse_first != + outnet->tcp_reuse_first->lru_prev)); } if(reuse->lru_next) { /* assert that members of the lru list are waiting * and thus have a pending pointer to the struct */ log_assert(reuse->lru_next->pending); reuse->lru_next->lru_prev = reuse->lru_prev; + log_assert(reuse->lru_next->lru_prev != reuse->lru_next); } else { log_assert(!reuse->lru_prev || reuse->lru_prev->pending); outnet->tcp_reuse_last = reuse->lru_prev; - } + log_assert(!outnet->tcp_reuse_last || + (outnet->tcp_reuse_last != + outnet->tcp_reuse_last->lru_next && + outnet->tcp_reuse_last != + outnet->tcp_reuse_last->lru_prev)); + } + log_assert((!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) || + (outnet->tcp_reuse_first && outnet->tcp_reuse_last)); reuse->item_on_lru_list = 0; + reuse->lru_next = NULL; + reuse->lru_prev = NULL; } + reuse->pending = NULL; } /** helper function that deletes an element from the tree of readwait @@ -915,8 +1091,12 @@ decommission_pending_tcp(struct outside_network* outnet, struct pending_tcp* pend) { verbose(VERB_CLIENT, "decommission_pending_tcp"); - pend->next_free = outnet->tcp_free; - outnet->tcp_free = pend; + /* A certain code path can lead here twice for the same pending_tcp + * creating a loop in the free pending_tcp list. */ + if(outnet->tcp_free != pend) { + pend->next_free = outnet->tcp_free; + outnet->tcp_free = pend; + } if(pend->reuse.node.key) { /* needs unlink from the reuse tree to get deleted */ reuse_tcp_remove_tree_list(outnet, &pend->reuse); @@ -977,22 +1157,22 @@ static void reuse_cb_and_decommission(struct outside_network* outnet, /** set timeout on tcp fd and setup read event to catch incoming dns msgs */ static void -reuse_tcp_setup_timeout(struct pending_tcp* pend_tcp) +reuse_tcp_setup_timeout(struct pending_tcp* pend_tcp, int tcp_reuse_timeout) { log_reuse_tcp(VERB_CLIENT, "reuse_tcp_setup_timeout", &pend_tcp->reuse); - comm_point_start_listening(pend_tcp->c, -1, REUSE_TIMEOUT); + comm_point_start_listening(pend_tcp->c, -1, tcp_reuse_timeout); } /** set timeout on tcp fd and setup read event to catch incoming dns msgs */ static void -reuse_tcp_setup_read_and_timeout(struct pending_tcp* pend_tcp) +reuse_tcp_setup_read_and_timeout(struct pending_tcp* pend_tcp, int tcp_reuse_timeout) { log_reuse_tcp(VERB_CLIENT, "reuse_tcp_setup_readtimeout", &pend_tcp->reuse); sldns_buffer_clear(pend_tcp->c->buffer); pend_tcp->c->tcp_is_reading = 1; pend_tcp->c->tcp_byte_count = 0; comm_point_stop_listening(pend_tcp->c); - comm_point_start_listening(pend_tcp->c, -1, REUSE_TIMEOUT); + comm_point_start_listening(pend_tcp->c, -1, tcp_reuse_timeout); } int @@ -1002,6 +1182,7 @@ outnet_tcp_cb(struct comm_point* c, void* arg, int error, struct pending_tcp* pend = (struct pending_tcp*)arg; struct outside_network* outnet = pend->reuse.outnet; struct waiting_tcp* w = NULL; + log_assert(pend->reuse.item_on_lru_list && pend->reuse.node.key); verbose(VERB_ALGO, "outnettcp cb"); if(error == NETEVENT_TIMEOUT) { if(pend->c->tcp_write_and_read) { @@ -1048,7 +1229,7 @@ outnet_tcp_cb(struct comm_point* c, void* arg, int error, pend->reuse.cp_more_write_again = 0; pend->c->tcp_is_reading = 1; comm_point_stop_listening(pend->c); - reuse_tcp_setup_timeout(pend); + reuse_tcp_setup_timeout(pend, outnet->tcp_reuse_timeout); } return 0; } else if(error != NETEVENT_NOERROR) { @@ -1101,7 +1282,7 @@ outnet_tcp_cb(struct comm_point* c, void* arg, int error, * and there could be more bytes to read on the input */ if(pend->reuse.tree_by_id.count != 0) pend->reuse.cp_more_read_again = 1; - reuse_tcp_setup_read_and_timeout(pend); + reuse_tcp_setup_read_and_timeout(pend, outnet->tcp_reuse_timeout); return 0; } verbose(VERB_CLIENT, "outnet_tcp_cb reuse after cb: decommission it"); @@ -1369,7 +1550,8 @@ outside_network_create(struct comm_base *base, size_t bufsize, int numavailports, size_t unwanted_threshold, int tcp_mss, void (*unwanted_action)(void*), void* unwanted_param, int do_udp, void* sslctx, int delayclose, int tls_use_sni, struct dt_env* dtenv, - int udp_connect) + int udp_connect, int max_reuse_tcp_queries, int tcp_reuse_timeout, + int tcp_auth_query_timeout) { struct outside_network* outnet = (struct outside_network*) calloc(1, sizeof(struct outside_network)); @@ -1381,6 +1563,9 @@ outside_network_create(struct comm_base *base, size_t bufsize, comm_base_timept(base, &outnet->now_secs, &outnet->now_tv); outnet->base = base; outnet->num_tcp = num_tcp; + outnet->max_reuse_tcp_queries = max_reuse_tcp_queries; + outnet->tcp_reuse_timeout= tcp_reuse_timeout; + outnet->tcp_auth_query_timeout = tcp_auth_query_timeout; outnet->num_tcp_outgoing = 0; outnet->infra = infra; outnet->rnd = rnd; @@ -1457,7 +1642,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); + outnet->udp_buff, outnet_udp_cb, outnet, NULL); if(!pc->cp) { log_err("malloc failed"); free(pc); @@ -1609,22 +1794,19 @@ outside_network_delete(struct outside_network* outnet) size_t i; for(i=0; i<outnet->num_tcp; i++) if(outnet->tcp_conns[i]) { - if(outnet->tcp_conns[i]->query && - !outnet->tcp_conns[i]->query-> - on_tcp_waiting_list) { + struct pending_tcp* pend; + pend = outnet->tcp_conns[i]; + if(pend->reuse.item_on_lru_list) { /* delete waiting_tcp elements that * the tcp conn is working on */ - struct pending_tcp* pend = - (struct pending_tcp*)outnet-> - tcp_conns[i]->query-> - next_waiting; decommission_pending_tcp(outnet, pend); } comm_point_delete(outnet->tcp_conns[i]->c); - waiting_tcp_delete(outnet->tcp_conns[i]->query); free(outnet->tcp_conns[i]); + outnet->tcp_conns[i] = NULL; } free(outnet->tcp_conns); + outnet->tcp_conns = NULL; } if(outnet->tcp_wait_first) { struct waiting_tcp* p = outnet->tcp_wait_first, *np; @@ -1742,14 +1924,14 @@ select_id(struct outside_network* outnet, struct pending* pend, sldns_buffer* packet) { int id_tries = 0; - pend->id = ((unsigned)ub_random(outnet->rnd)>>8) & 0xffff; + pend->id = GET_RANDOM_ID(outnet->rnd); LDNS_ID_SET(sldns_buffer_begin(packet), pend->id); /* insert in tree */ pend->node.key = pend; while(!rbtree_insert(outnet->pending, &pend->node)) { /* change ID to avoid collision */ - pend->id = ((unsigned)ub_random(outnet->rnd)>>8) & 0xffff; + pend->id = GET_RANDOM_ID(outnet->rnd); LDNS_ID_SET(sldns_buffer_begin(packet), pend->id); id_tries++; if(id_tries == MAX_ID_RETRY) { @@ -1779,6 +1961,7 @@ static int udp_connect_needs_log(int err) # ifdef ENETDOWN case ENETDOWN: # endif + case EPERM: if(verbosity >= VERB_ALGO) return 1; return 0; @@ -1931,11 +2114,21 @@ randomize_and_send_udp(struct pending* pend, sldns_buffer* packet, int timeout) comm_timer_set(pend->timer, &tv); #ifdef USE_DNSTAP + /* + * sending src (local service)/dst (upstream) addresses over DNSTAP + * There are no chances to get the src (local service) addr if unbound + * is not configured with specific outgoing IP-addresses. So we will + * pass 0.0.0.0 (::) to argument for + * dt_msg_send_outside_query()/dt_msg_send_outside_response() calls. + */ if(outnet->dtenv && (outnet->dtenv->log_resolver_query_messages || - outnet->dtenv->log_forwarder_query_messages)) - dt_msg_send_outside_query(outnet->dtenv, &pend->addr, comm_udp, - pend->sq->zone, pend->sq->zonelen, packet); + outnet->dtenv->log_forwarder_query_messages)) { + log_addr(VERB_ALGO, "from local addr", &pend->pc->pif->addr, pend->pc->pif->addrlen); + log_addr(VERB_ALGO, "request to upstream", &pend->addr, pend->addrlen); + dt_msg_send_outside_query(outnet->dtenv, &pend->addr, &pend->pc->pif->addr, comm_udp, + pend->sq->zone, pend->sq->zonelen, packet); + } #endif return 1; } @@ -2011,24 +2204,20 @@ outnet_tcptimer(void* arg) static void reuse_tcp_close_oldest(struct outside_network* outnet) { - struct pending_tcp* pend; + struct reuse_tcp* reuse; verbose(VERB_CLIENT, "reuse_tcp_close_oldest"); - if(!outnet->tcp_reuse_last) return; - pend = outnet->tcp_reuse_last->pending; - - /* snip off of LRU */ - log_assert(pend->reuse.lru_next == NULL); - if(pend->reuse.lru_prev) { - outnet->tcp_reuse_last = pend->reuse.lru_prev; - pend->reuse.lru_prev->lru_next = NULL; - } else { - outnet->tcp_reuse_last = NULL; - outnet->tcp_reuse_first = NULL; - } - pend->reuse.item_on_lru_list = 0; - + reuse = reuse_tcp_lru_snip(outnet); + if(!reuse) return; /* free up */ - reuse_cb_and_decommission(outnet, pend, NETEVENT_CLOSED); + reuse_cb_and_decommission(outnet, reuse->pending, NETEVENT_CLOSED); +} + +static uint16_t +tcp_select_id(struct outside_network* outnet, struct reuse_tcp* reuse) +{ + if(reuse) + return reuse_tcp_select_id(reuse, outnet); + return GET_RANDOM_ID(outnet->rnd); } /** find spare ID value for reuse tcp stream. That is random and also does @@ -2044,13 +2233,13 @@ reuse_tcp_select_id(struct reuse_tcp* reuse, struct outside_network* outnet) /* make really sure the tree is not empty */ if(reuse->tree_by_id.count == 0) { - id = ((unsigned)ub_random(outnet->rnd)>>8) & 0xffff; + id = GET_RANDOM_ID(outnet->rnd); return id; } /* try to find random empty spots by picking them */ for(i = 0; i<try_random; i++) { - id = ((unsigned)ub_random(outnet->rnd)>>8) & 0xffff; + id = GET_RANDOM_ID(outnet->rnd); if(!reuse_tcp_by_id_find(reuse, id)) { return id; } @@ -2126,6 +2315,7 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet, reuse_tcp_lru_touch(sq->outnet, reuse); } + log_assert(!reuse || (reuse && pend)); /* if !pend but we have reuse streams, close a reuse stream * to be able to open a new one to this target, no use waiting * to reuse a file descriptor while another query needs to use @@ -2133,6 +2323,7 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet, if(!pend) { reuse_tcp_close_oldest(sq->outnet); pend = sq->outnet->tcp_free; + log_assert(!reuse || (pend == reuse->pending)); } /* allocate space to store query */ @@ -2148,9 +2339,7 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet, w->pkt = (uint8_t*)w + sizeof(struct waiting_tcp); w->pkt_len = sldns_buffer_limit(packet); memmove(w->pkt, sldns_buffer_begin(packet), w->pkt_len); - if(reuse) - w->id = reuse_tcp_select_id(reuse, sq->outnet); - else w->id = ((unsigned)ub_random(sq->outnet->rnd)>>8) & 0xffff; + w->id = tcp_select_id(sq->outnet, reuse); LDNS_ID_SET(w->pkt, w->id); memcpy(&w->addr, &sq->addr, sq->addrlen); w->addrlen = sq->addrlen; @@ -2167,9 +2356,13 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet, w->write_wait_next = NULL; w->write_wait_queued = 0; w->error_count = 0; +#ifdef USE_DNSTAP + w->sq = NULL; +#endif if(pend) { /* we have a buffer available right now */ if(reuse) { + log_assert(reuse == &pend->reuse); /* reuse existing fd, write query and continue */ /* store query in tree by id */ verbose(VERB_CLIENT, "pending_tcp_query: reuse, store"); @@ -2201,20 +2394,28 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet, return NULL; } } +#ifdef USE_DNSTAP + if(sq->outnet->dtenv && + (sq->outnet->dtenv->log_resolver_query_messages || + sq->outnet->dtenv->log_forwarder_query_messages)) { + /* use w->pkt, because it has the ID value */ + sldns_buffer tmp; + sldns_buffer_init_frm_data(&tmp, w->pkt, w->pkt_len); + dt_msg_send_outside_query(sq->outnet->dtenv, &sq->addr, + &pend->pi->addr, comm_tcp, sq->zone, + sq->zonelen, &tmp); + } +#endif } else { /* queue up */ /* waiting for a buffer on the outside network buffer wait * list */ verbose(VERB_CLIENT, "pending_tcp_query: queue to wait"); - outnet_add_tcp_waiting(sq->outnet, w); - } #ifdef USE_DNSTAP - if(sq->outnet->dtenv && - (sq->outnet->dtenv->log_resolver_query_messages || - sq->outnet->dtenv->log_forwarder_query_messages)) - dt_msg_send_outside_query(sq->outnet->dtenv, &sq->addr, - comm_tcp, sq->zone, sq->zonelen, packet); + w->sq = sq; #endif + outnet_add_tcp_waiting(sq->outnet, w); + } return w; } @@ -2348,6 +2549,9 @@ waiting_list_remove(struct outside_network* outnet, struct waiting_tcp* w) 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, @@ -2386,7 +2590,7 @@ reuse_tcp_remove_serviced_keep(struct waiting_tcp* w, if(!reuse_tcp_insert(sq->outnet, pend_tcp)) { return 0; } - reuse_tcp_setup_timeout(pend_tcp); + reuse_tcp_setup_timeout(pend_tcp, sq->outnet->tcp_reuse_timeout); return 1; } return 0; @@ -2720,6 +2924,15 @@ serviced_tcp_callback(struct comm_point* c, void* arg, int error, { struct serviced_query* sq = (struct serviced_query*)arg; struct comm_reply r2; +#ifdef USE_DNSTAP + struct waiting_tcp* w = (struct waiting_tcp*)sq->pending; + struct pending_tcp* pend_tcp = NULL; + struct port_if* pi = NULL; + if(!w->on_tcp_waiting_list && w->next_waiting) { + pend_tcp = (struct pending_tcp*)w->next_waiting; + pi = pend_tcp->pi; + } +#endif sq->pending = NULL; /* removed after this callback */ if(error != NETEVENT_NOERROR) log_addr(VERB_QUERY, "tcp error for address", @@ -2728,12 +2941,19 @@ serviced_tcp_callback(struct comm_point* c, void* arg, int error, infra_update_tcp_works(sq->outnet->infra, &sq->addr, sq->addrlen, sq->zone, sq->zonelen); #ifdef USE_DNSTAP - if(error==NETEVENT_NOERROR && sq->outnet->dtenv && + /* + * sending src (local service)/dst (upstream) addresses over DNSTAP + */ + if(error==NETEVENT_NOERROR && pi && sq->outnet->dtenv && (sq->outnet->dtenv->log_resolver_response_messages || - sq->outnet->dtenv->log_forwarder_response_messages)) + sq->outnet->dtenv->log_forwarder_response_messages)) { + log_addr(VERB_ALGO, "response from upstream", &sq->addr, sq->addrlen); + log_addr(VERB_ALGO, "to local addr", &pi->addr, pi->addrlen); dt_msg_send_outside_response(sq->outnet->dtenv, &sq->addr, - c->type, sq->zone, sq->zonelen, sq->qbuf, sq->qbuflen, - &sq->last_sent_time, sq->outnet->now_tv, c->buffer); + &pi->addr, c->type, sq->zone, sq->zonelen, sq->qbuf, + sq->qbuflen, &sq->last_sent_time, sq->outnet->now_tv, + c->buffer); + } #endif if(error==NETEVENT_NOERROR && sq->status == serviced_query_TCP_EDNS && (LDNS_RCODE_WIRE(sldns_buffer_begin(c->buffer)) == @@ -2804,7 +3024,7 @@ serviced_tcp_initiate(struct serviced_query* sq, sldns_buffer* buff) sq->status==serviced_query_TCP_EDNS?"EDNS":""); serviced_encode(sq, buff, sq->status == serviced_query_TCP_EDNS); sq->last_sent_time = *sq->outnet->now_tv; - sq->pending = pending_tcp_query(sq, buff, TCP_AUTH_QUERY_TIMEOUT, + sq->pending = pending_tcp_query(sq, buff, sq->outnet->tcp_auth_query_timeout, serviced_tcp_callback, sq); if(!sq->pending) { /* delete from tree so that a retry by above layer does not @@ -2832,10 +3052,10 @@ serviced_tcp_send(struct serviced_query* sq, sldns_buffer* buff) sq->last_sent_time = *sq->outnet->now_tv; if(sq->tcp_upstream || sq->ssl_upstream) { timeout = rtt; - if(rtt >= UNKNOWN_SERVER_NICENESS && rtt < TCP_AUTH_QUERY_TIMEOUT) - timeout = TCP_AUTH_QUERY_TIMEOUT; + if(rtt >= UNKNOWN_SERVER_NICENESS && rtt < sq->outnet->tcp_auth_query_timeout) + timeout = sq->outnet->tcp_auth_query_timeout; } else { - timeout = TCP_AUTH_QUERY_TIMEOUT; + timeout = sq->outnet->tcp_auth_query_timeout; } sq->pending = pending_tcp_query(sq, buff, timeout, serviced_tcp_callback, sq); @@ -2887,6 +3107,10 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error, struct serviced_query* sq = (struct serviced_query*)arg; struct outside_network* outnet = sq->outnet; struct timeval now = *sq->outnet->now_tv; +#ifdef USE_DNSTAP + struct pending* p = (struct pending*)sq->pending; + struct port_if* pi = p->pc->pif; +#endif sq->pending = NULL; /* removed after callback */ if(error == NETEVENT_TIMEOUT) { @@ -2924,12 +3148,18 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error, return 0; } #ifdef USE_DNSTAP + /* + * sending src (local service)/dst (upstream) addresses over DNSTAP + */ if(error == NETEVENT_NOERROR && outnet->dtenv && (outnet->dtenv->log_resolver_response_messages || - outnet->dtenv->log_forwarder_response_messages)) - dt_msg_send_outside_response(outnet->dtenv, &sq->addr, c->type, - sq->zone, sq->zonelen, sq->qbuf, sq->qbuflen, - &sq->last_sent_time, sq->outnet->now_tv, c->buffer); + outnet->dtenv->log_forwarder_response_messages)) { + log_addr(VERB_ALGO, "response from upstream", &sq->addr, sq->addrlen); + log_addr(VERB_ALGO, "to local addr", &pi->addr, pi->addrlen); + dt_msg_send_outside_response(outnet->dtenv, &sq->addr, &pi->addr, c->type, + sq->zone, sq->zonelen, sq->qbuf, sq->qbuflen, + &sq->last_sent_time, sq->outnet->now_tv, c->buffer); + } #endif if( (sq->status == serviced_query_UDP_EDNS ||sq->status == serviced_query_UDP_EDNS_FRAG) @@ -3203,7 +3433,7 @@ outnet_comm_point_for_udp(struct outside_network* outnet, return NULL; } cp = comm_point_create_udp(outnet->base, fd, outnet->udp_buff, - cb, cb_arg); + cb, cb_arg, NULL); if(!cp) { log_err("malloc failure"); close(fd); @@ -3309,15 +3539,28 @@ outnet_comm_point_for_tcp(struct outside_network* outnet, return cp; } +/** setup the User-Agent HTTP header based on http-user-agent configuration */ +static void +setup_http_user_agent(sldns_buffer* buf, struct config_file* cfg) +{ + if(cfg->hide_http_user_agent) return; + if(cfg->http_user_agent==NULL || cfg->http_user_agent[0] == 0) { + sldns_buffer_printf(buf, "User-Agent: %s/%s\r\n", PACKAGE_NAME, + PACKAGE_VERSION); + } else { + sldns_buffer_printf(buf, "User-Agent: %s\r\n", cfg->http_user_agent); + } +} + /** setup http request headers in buffer for sending query to destination */ static int -setup_http_request(sldns_buffer* buf, char* host, char* path) +setup_http_request(sldns_buffer* buf, char* host, char* path, + struct config_file* cfg) { sldns_buffer_clear(buf); sldns_buffer_printf(buf, "GET /%s HTTP/1.1\r\n", path); sldns_buffer_printf(buf, "Host: %s\r\n", host); - sldns_buffer_printf(buf, "User-Agent: unbound/%s\r\n", - PACKAGE_VERSION); + setup_http_user_agent(buf, cfg); /* We do not really do multiple queries per connection, * but this header setting is also not needed. * sldns_buffer_printf(buf, "Connection: close\r\n") */ @@ -3333,7 +3576,7 @@ struct comm_point* outnet_comm_point_for_http(struct outside_network* outnet, comm_point_callback_type* cb, void* cb_arg, struct sockaddr_storage* to_addr, socklen_t to_addrlen, int timeout, - int ssl, char* host, char* path) + int ssl, char* host, char* path, struct config_file* cfg) { /* cp calls cb with err=NETEVENT_DONE when transfer is done */ struct comm_point* cp; @@ -3369,7 +3612,7 @@ outnet_comm_point_for_http(struct outside_network* outnet, comm_point_start_listening(cp, fd, timeout); /* setup http request in cp->buffer */ - if(!setup_http_request(cp->buffer, host, path)) { + if(!setup_http_request(cp->buffer, host, path, cfg)) { log_err("error setting up http request"); comm_point_delete(cp); return NULL; diff --git a/sbin/unwind/libunbound/services/outside_network.h b/sbin/unwind/libunbound/services/outside_network.h index fe287af4fcc..d0d532e6425 100644 --- a/sbin/unwind/libunbound/services/outside_network.h +++ b/sbin/unwind/libunbound/services/outside_network.h @@ -63,6 +63,7 @@ struct edns_option; struct module_env; struct module_qstate; struct query_info; +struct config_file; /** * Send queries to outside servers and wait for answers from servers. @@ -158,6 +159,12 @@ struct outside_network { size_t num_tcp; /** number of tcp communication points in use. */ size_t num_tcp_outgoing; + /** max number of queries on a reuse connection */ + size_t max_reuse_tcp_queries; + /** timeout for REUSE entries in milliseconds. */ + int tcp_reuse_timeout; + /** timeout in milliseconds for TCP queries to auth servers. */ + int tcp_auth_query_timeout; /** * tree of still-open and waiting tcp connections for reuse. * can be closed and reopened to get a new tcp connection. @@ -295,11 +302,6 @@ struct reuse_tcp { struct outside_network* outnet; }; -/** max number of queries on a reuse connection */ -#define MAX_REUSE_TCP_QUERIES 200 -/** timeout for REUSE entries in milliseconds. */ -#define REUSE_TIMEOUT 60000 - /** * A query that has an answer pending for it. */ @@ -344,6 +346,8 @@ struct pending { struct pending_tcp { /** next in list of free tcp comm points, or NULL. */ struct pending_tcp* next_free; + /** port for of the outgoing interface that is used */ + struct port_if* pi; /** tcp comm point it was sent on (and reply must come back on). */ struct comm_point* c; /** the query being serviced, NULL if the pending_tcp is unused. */ @@ -408,6 +412,10 @@ struct waiting_tcp { char* tls_auth_name; /** the packet was involved in an error, to stop looping errors */ int error_count; +#ifdef USE_DNSTAP + /** serviced query pointer for dnstap to get logging info, if nonNULL*/ + struct serviced_query* sq; +#endif }; /** @@ -534,6 +542,9 @@ struct serviced_query { * @param tls_use_sni: if SNI is used for TLS connections. * @param dtenv: environment to send dnstap events with (if enabled). * @param udp_connect: if the udp_connect option is enabled. + * @param max_reuse_tcp_queries: max number of queries on a reuse connection. + * @param tcp_reuse_timeout: timeout for REUSE entries in milliseconds. + * @param tcp_auth_query_timeout: timeout in milliseconds for TCP queries to auth servers. * @return: the new structure (with no pending answers) or NULL on error. */ struct outside_network* outside_network_create(struct comm_base* base, @@ -543,7 +554,8 @@ struct outside_network* outside_network_create(struct comm_base* base, int numavailports, size_t unwanted_threshold, int tcp_mss, void (*unwanted_action)(void*), void* unwanted_param, int do_udp, void* sslctx, int delayclose, int tls_use_sni, struct dt_env *dtenv, - int udp_connect); + int udp_connect, int max_reuse_tcp_queries, int tcp_reuse_timeout, + int tcp_auth_query_timeout); /** * Delete outside_network structure. @@ -670,12 +682,28 @@ struct waiting_tcp* reuse_tcp_by_id_find(struct reuse_tcp* reuse, uint16_t id); /** insert element in tree by id */ void reuse_tree_by_id_insert(struct reuse_tcp* reuse, struct waiting_tcp* w); +/** insert element in tcp_reuse tree and LRU list */ +int reuse_tcp_insert(struct outside_network* outnet, + struct pending_tcp* pend_tcp); + +/** touch the LRU of the element */ +void reuse_tcp_lru_touch(struct outside_network* outnet, + struct reuse_tcp* reuse); + +/** remove element from tree and LRU list */ +void reuse_tcp_remove_tree_list(struct outside_network* outnet, + struct reuse_tcp* reuse); + +/** snip the last reuse_tcp element off of the LRU list if any */ +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); /** 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, int tcp_mss, int dscp); +int outnet_get_tcp_fd(struct sockaddr_storage* addr, socklen_t addrlen, + int tcp_mss, int dscp); /** * Create udp commpoint suitable for sending packets to the destination. @@ -729,12 +757,13 @@ struct comm_point* outnet_comm_point_for_tcp(struct outside_network* outnet, * @param ssl: set to true for https. * @param host: hostname to use for the destination. part of http request. * @param path: pathname to lookup, eg. name of the file on the destination. + * @param cfg: running configuration for User-Agent setup. * @return http_out commpoint, or NULL. */ struct comm_point* outnet_comm_point_for_http(struct outside_network* outnet, comm_point_callback_type* cb, void* cb_arg, struct sockaddr_storage* to_addr, socklen_t to_addrlen, int timeout, - int ssl, char* host, char* path); + int ssl, char* host, char* path, struct config_file* cfg); /** connect tcp connection to addr, 0 on failure */ int outnet_tcp_connect(int s, struct sockaddr_storage* addr, socklen_t addrlen); diff --git a/sbin/unwind/libunbound/services/rpz.c b/sbin/unwind/libunbound/services/rpz.c index 2b6b0ac3fcc..3a1ec00d7d3 100644 --- a/sbin/unwind/libunbound/services/rpz.c +++ b/sbin/unwind/libunbound/services/rpz.c @@ -162,6 +162,7 @@ rpz_rr_to_action(uint16_t rr_type, uint8_t* rdatawl, size_t rdatalen) case LDNS_RR_TYPE_RRSIG: case LDNS_RR_TYPE_NSEC: case LDNS_RR_TYPE_NSEC3: + case LDNS_RR_TYPE_NSEC3PARAM: return RPZ_INVALID_ACTION; case LDNS_RR_TYPE_CNAME: break; @@ -479,8 +480,21 @@ rpz_insert_qname_trigger(struct rpz* r, uint8_t* dname, size_t dnamelen, int newzone = 0; if(a == RPZ_TCP_ONLY_ACTION || a == RPZ_INVALID_ACTION) { - verbose(VERB_ALGO, "RPZ: skipping unsupported action: %s", - rpz_action_to_string(a)); + char str[255+1]; + if(rrtype == LDNS_RR_TYPE_SOA || rrtype == LDNS_RR_TYPE_NS || + rrtype == LDNS_RR_TYPE_DNAME || + rrtype == LDNS_RR_TYPE_DNSKEY || + rrtype == LDNS_RR_TYPE_RRSIG || + rrtype == LDNS_RR_TYPE_NSEC || + rrtype == LDNS_RR_TYPE_NSEC3PARAM || + rrtype == LDNS_RR_TYPE_NSEC3 || + rrtype == LDNS_RR_TYPE_DS) { + free(dname); + return; /* no need to log these types as unsupported */ + } + dname_str(dname, str); + verbose(VERB_ALGO, "RPZ: qname trigger, %s skipping unsupported action: %s", + str, rpz_action_to_string(a)); free(dname); return; } @@ -552,8 +566,10 @@ rpz_insert_response_ip_trigger(struct rpz* r, uint8_t* dname, size_t dnamelen, if(a == RPZ_TCP_ONLY_ACTION || a == RPZ_INVALID_ACTION || respa == respip_invalid) { - verbose(VERB_ALGO, "RPZ: skipping unsupported action: %s", - rpz_action_to_string(a)); + char str[255+1]; + dname_str(dname, str); + verbose(VERB_ALGO, "RPZ: respip trigger, %s skipping unsupported action: %s", + str, rpz_action_to_string(a)); return 0; } @@ -702,7 +718,7 @@ rpz_find_zone(struct rpz* r, uint8_t* qname, size_t qname_len, uint16_t qclass, * zone match, append '*' to that and do another lookup. */ ce = dname_get_shared_topdomain(z->name, qname); - if(!ce /* should not happen */ || !*ce /* root */) { + if(!ce /* should not happen */) { lock_rw_unlock(&z->lock); if(zones_keep_lock) { lock_rw_unlock(&r->local_zones->lock); diff --git a/sbin/unwind/libunbound/sldns/keyraw.c b/sbin/unwind/libunbound/sldns/keyraw.c index 2ec225bc5bd..b1e60d8b52a 100644 --- a/sbin/unwind/libunbound/sldns/keyraw.c +++ b/sbin/unwind/libunbound/sldns/keyraw.c @@ -26,11 +26,15 @@ #ifdef HAVE_OPENSSL_BN_H #include <openssl/bn.h> #endif -#ifdef HAVE_OPENSSL_RSA_H -#include <openssl/rsa.h> -#endif -#ifdef HAVE_OPENSSL_DSA_H -#include <openssl/dsa.h> +#ifdef HAVE_OPENSSL_PARAM_BUILD_H +# include <openssl/param_build.h> +#else +# ifdef HAVE_OPENSSL_RSA_H +# include <openssl/rsa.h> +# endif +# ifdef HAVE_OPENSSL_DSA_H +# include <openssl/dsa.h> +# endif #endif #endif /* HAVE_SSL */ @@ -191,45 +195,59 @@ void sldns_key_EVP_unload_gost(void) } #endif /* USE_GOST */ -DSA * -sldns_key_buf2dsa_raw(unsigned char* key, size_t len) +/* Retrieve params as BIGNUM from raw buffer */ +static int +sldns_key_dsa_buf_bignum(unsigned char* key, size_t len, BIGNUM** p, + BIGNUM** q, BIGNUM** g, BIGNUM** y) { uint8_t T; uint16_t length; uint16_t offset; - DSA *dsa; - BIGNUM *Q; BIGNUM *P; - BIGNUM *G; BIGNUM *Y; if(len == 0) - return NULL; + return 0; T = (uint8_t)key[0]; length = (64 + T * 8); offset = 1; if (T > 8) { - return NULL; + return 0; } if(len < (size_t)1 + SHA_DIGEST_LENGTH + 3*length) - return NULL; + return 0; - Q = BN_bin2bn(key+offset, SHA_DIGEST_LENGTH, NULL); + *q = BN_bin2bn(key+offset, SHA_DIGEST_LENGTH, NULL); offset += SHA_DIGEST_LENGTH; - P = BN_bin2bn(key+offset, (int)length, NULL); + *p = BN_bin2bn(key+offset, (int)length, NULL); offset += length; - G = BN_bin2bn(key+offset, (int)length, NULL); + *g = BN_bin2bn(key+offset, (int)length, NULL); offset += length; - Y = BN_bin2bn(key+offset, (int)length, NULL); + *y = BN_bin2bn(key+offset, (int)length, NULL); + + if(!*q || !*p || !*g || !*y) { + BN_free(*q); + BN_free(*p); + BN_free(*g); + BN_free(*y); + return 0; + } + return 1; +} +#ifndef HAVE_OSSL_PARAM_BLD_NEW +DSA * +sldns_key_buf2dsa_raw(unsigned char* key, size_t len) +{ + DSA *dsa; + BIGNUM *Q=NULL, *P=NULL, *G=NULL, *Y=NULL; + if(!sldns_key_dsa_buf_bignum(key, len, &P, &Q, &G, &Y)) { + return NULL; + } /* create the key and set its properties */ - if(!Q || !P || !G || !Y || !(dsa = DSA_new())) { - BN_free(Q); - BN_free(P); - BN_free(G); - BN_free(Y); + if(!(dsa = DSA_new())) { return NULL; } #if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) @@ -261,22 +279,111 @@ sldns_key_buf2dsa_raw(unsigned char* key, size_t len) return dsa; } +#endif /* HAVE_OSSL_PARAM_BLD_NEW */ -RSA * -sldns_key_buf2rsa_raw(unsigned char* key, size_t len) +EVP_PKEY *sldns_key_dsa2pkey_raw(unsigned char* key, size_t len) +{ +#ifdef HAVE_OSSL_PARAM_BLD_NEW + EVP_PKEY* evp_key = NULL; + EVP_PKEY_CTX* ctx; + BIGNUM *p=NULL, *q=NULL, *g=NULL, *y=NULL; + OSSL_PARAM_BLD* param_bld; + OSSL_PARAM* params = NULL; + if(!sldns_key_dsa_buf_bignum(key, len, &p, &q, &g, &y)) { + return NULL; + } + + param_bld = OSSL_PARAM_BLD_new(); + if(!param_bld) { + BN_free(p); + BN_free(q); + BN_free(g); + BN_free(y); + return NULL; + } + if(!OSSL_PARAM_BLD_push_BN(param_bld, "p", p) || + !OSSL_PARAM_BLD_push_BN(param_bld, "g", g) || + !OSSL_PARAM_BLD_push_BN(param_bld, "q", q) || + !OSSL_PARAM_BLD_push_BN(param_bld, "pub", y)) { + OSSL_PARAM_BLD_free(param_bld); + BN_free(p); + BN_free(q); + BN_free(g); + BN_free(y); + return NULL; + } + params = OSSL_PARAM_BLD_to_param(param_bld); + OSSL_PARAM_BLD_free(param_bld); + + ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL); + if(!ctx) { + OSSL_PARAM_free(params); + BN_free(p); + BN_free(q); + BN_free(g); + BN_free(y); + return NULL; + } + if(EVP_PKEY_fromdata_init(ctx) <= 0) { + EVP_PKEY_CTX_free(ctx); + OSSL_PARAM_free(params); + BN_free(p); + BN_free(q); + BN_free(g); + BN_free(y); + return NULL; + } + if(EVP_PKEY_fromdata(ctx, &evp_key, EVP_PKEY_PUBLIC_KEY, params) <= 0) { + EVP_PKEY_CTX_free(ctx); + OSSL_PARAM_free(params); + BN_free(p); + BN_free(q); + BN_free(g); + BN_free(y); + return NULL; + } + + EVP_PKEY_CTX_free(ctx); + OSSL_PARAM_free(params); + BN_free(p); + BN_free(q); + BN_free(g); + BN_free(y); + return evp_key; +#else + DSA* dsa; + EVP_PKEY* evp_key = EVP_PKEY_new(); + if(!evp_key) { + return NULL; + } + dsa = sldns_key_buf2dsa_raw(key, len); + if(!dsa) { + EVP_PKEY_free(evp_key); + return NULL; + } + if(EVP_PKEY_assign_DSA(evp_key, dsa) == 0) { + DSA_free(dsa); + EVP_PKEY_free(evp_key); + return NULL; + } + return evp_key; +#endif +} + +/* Retrieve params as BIGNUM from raw buffer, n is modulus, e is exponent */ +static int +sldns_key_rsa_buf_bignum(unsigned char* key, size_t len, BIGNUM** n, + BIGNUM** e) { uint16_t offset; uint16_t exp; uint16_t int16; - RSA *rsa; - BIGNUM *modulus; - BIGNUM *exponent; if (len == 0) - return NULL; + return 0; if (key[0] == 0) { if(len < 3) - return NULL; + return 0; memmove(&int16, key+1, 2); exp = ntohs(int16); offset = 3; @@ -287,23 +394,34 @@ sldns_key_buf2rsa_raw(unsigned char* key, size_t len) /* key length at least one */ if(len < (size_t)offset + exp + 1) - return NULL; + return 0; /* Exponent */ - exponent = BN_new(); - if(!exponent) return NULL; - (void) BN_bin2bn(key+offset, (int)exp, exponent); + *e = BN_new(); + if(!*e) return 0; + (void) BN_bin2bn(key+offset, (int)exp, *e); offset += exp; /* Modulus */ - modulus = BN_new(); - if(!modulus) { - BN_free(exponent); - return NULL; + *n = BN_new(); + if(!*n) { + BN_free(*e); + return 0; } /* length of the buffer must match the key length! */ - (void) BN_bin2bn(key+offset, (int)(len - offset), modulus); + (void) BN_bin2bn(key+offset, (int)(len - offset), *n); + return 1; +} +#ifndef HAVE_OSSL_PARAM_BLD_NEW +RSA * +sldns_key_buf2rsa_raw(unsigned char* key, size_t len) +{ + BIGNUM* modulus = NULL; + BIGNUM* exponent = NULL; + RSA *rsa; + if(!sldns_key_rsa_buf_bignum(key, len, &modulus, &exponent)) + return NULL; rsa = RSA_new(); if(!rsa) { BN_free(exponent); @@ -327,6 +445,88 @@ sldns_key_buf2rsa_raw(unsigned char* key, size_t len) return rsa; } +#endif /* HAVE_OSSL_PARAM_BLD_NEW */ + +EVP_PKEY* sldns_key_rsa2pkey_raw(unsigned char* key, size_t len) +{ +#ifdef HAVE_OSSL_PARAM_BLD_NEW + EVP_PKEY* evp_key = NULL; + EVP_PKEY_CTX* ctx; + BIGNUM *n=NULL, *e=NULL; + OSSL_PARAM_BLD* param_bld; + OSSL_PARAM* params = NULL; + + if(!sldns_key_rsa_buf_bignum(key, len, &n, &e)) { + return NULL; + } + + param_bld = OSSL_PARAM_BLD_new(); + if(!param_bld) { + BN_free(n); + BN_free(e); + return NULL; + } + if(!OSSL_PARAM_BLD_push_BN(param_bld, "n", n)) { + OSSL_PARAM_BLD_free(param_bld); + BN_free(n); + BN_free(e); + return NULL; + } + if(!OSSL_PARAM_BLD_push_BN(param_bld, "e", e)) { + OSSL_PARAM_BLD_free(param_bld); + BN_free(n); + BN_free(e); + return NULL; + } + params = OSSL_PARAM_BLD_to_param(param_bld); + OSSL_PARAM_BLD_free(param_bld); + + ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL); + if(!ctx) { + OSSL_PARAM_free(params); + BN_free(n); + BN_free(e); + return NULL; + } + if(EVP_PKEY_fromdata_init(ctx) <= 0) { + EVP_PKEY_CTX_free(ctx); + OSSL_PARAM_free(params); + BN_free(n); + BN_free(e); + return NULL; + } + if(EVP_PKEY_fromdata(ctx, &evp_key, EVP_PKEY_PUBLIC_KEY, params) <= 0) { + EVP_PKEY_CTX_free(ctx); + OSSL_PARAM_free(params); + BN_free(n); + BN_free(e); + return NULL; + } + + EVP_PKEY_CTX_free(ctx); + OSSL_PARAM_free(params); + BN_free(n); + BN_free(e); + return evp_key; +#else + RSA* rsa; + EVP_PKEY *evp_key = EVP_PKEY_new(); + if(!evp_key) { + return NULL; + } + rsa = sldns_key_buf2rsa_raw(key, len); + if(!rsa) { + EVP_PKEY_free(evp_key); + return NULL; + } + if(EVP_PKEY_assign_RSA(evp_key, rsa) == 0) { + RSA_free(rsa); + EVP_PKEY_free(evp_key); + return NULL; + } + return evp_key; +#endif +} #ifdef USE_GOST EVP_PKEY* @@ -357,6 +557,62 @@ sldns_gost2pkey_raw(unsigned char* key, size_t keylen) EVP_PKEY* sldns_ecdsa2pkey_raw(unsigned char* key, size_t keylen, uint8_t algo) { +#ifdef HAVE_OSSL_PARAM_BLD_NEW + unsigned char buf[256+2]; /* sufficient for 2*384/8+1 */ + EVP_PKEY *evp_key = NULL; + EVP_PKEY_CTX* ctx; + OSSL_PARAM_BLD* param_bld; + OSSL_PARAM* params = NULL; + char* group = NULL; + + /* check length, which uncompressed must be 2 bignums */ + if(algo == LDNS_ECDSAP256SHA256) { + if(keylen != 2*256/8) return NULL; + group = "prime256v1"; + } else if(algo == LDNS_ECDSAP384SHA384) { + if(keylen != 2*384/8) return NULL; + group = "P-384"; + } else { + return NULL; + } + if(keylen+1 > sizeof(buf)) { /* sanity check */ + return NULL; + } + /* prepend the 0x04 for uncompressed format */ + buf[0] = POINT_CONVERSION_UNCOMPRESSED; + memmove(buf+1, key, keylen); + + param_bld = OSSL_PARAM_BLD_new(); + if(!param_bld) { + return NULL; + } + if(!OSSL_PARAM_BLD_push_utf8_string(param_bld, "group", group, 0) || + !OSSL_PARAM_BLD_push_octet_string(param_bld, "pub", buf, keylen+1)) { + OSSL_PARAM_BLD_free(param_bld); + return NULL; + } + params = OSSL_PARAM_BLD_to_param(param_bld); + OSSL_PARAM_BLD_free(param_bld); + + ctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL); + if(!ctx) { + OSSL_PARAM_free(params); + return NULL; + } + if(EVP_PKEY_fromdata_init(ctx) <= 0) { + EVP_PKEY_CTX_free(ctx); + OSSL_PARAM_free(params); + return NULL; + } + if(EVP_PKEY_fromdata(ctx, &evp_key, EVP_PKEY_PUBLIC_KEY, params) <= 0) { + EVP_PKEY_CTX_free(ctx); + OSSL_PARAM_free(params); + return NULL; + } + EVP_PKEY_CTX_free(ctx); + OSSL_PARAM_free(params); + return evp_key; +#else unsigned char buf[256+2]; /* sufficient for 2*384/8+1 */ const unsigned char* pp = buf; EVP_PKEY *evp_key; @@ -393,6 +649,7 @@ sldns_ecdsa2pkey_raw(unsigned char* key, size_t keylen, uint8_t algo) return NULL; } return evp_key; +#endif /* HAVE_OSSL_PARAM_BLD_NEW */ } #endif /* USE_ECDSA */ diff --git a/sbin/unwind/libunbound/sldns/keyraw.h b/sbin/unwind/libunbound/sldns/keyraw.h index 989b02ce052..b1f19740cd6 100644 --- a/sbin/unwind/libunbound/sldns/keyraw.h +++ b/sbin/unwind/libunbound/sldns/keyraw.h @@ -57,6 +57,7 @@ int sldns_key_EVP_load_gost_id(void); /** Release the engine reference held for the GOST engine. */ void sldns_key_EVP_unload_gost(void); +#ifndef HAVE_OSSL_PARAM_BLD_NEW /** * Like sldns_key_buf2dsa, but uses raw buffer. * \param[in] key the uncompressed wireformat of the key. @@ -64,6 +65,15 @@ void sldns_key_EVP_unload_gost(void); * \return a DSA * structure with the key material */ DSA *sldns_key_buf2dsa_raw(unsigned char* key, size_t len); +#endif + +/** + * Converts a holding buffer with DSA key material to EVP PKEY in openssl. + * \param[in] key the uncompressed wireformat of the key. + * \param[in] len length of key data + * \return the key or NULL on error. + */ +EVP_PKEY *sldns_key_dsa2pkey_raw(unsigned char* key, size_t len); /** * Converts a holding buffer with key material to EVP PKEY in openssl. @@ -84,6 +94,7 @@ EVP_PKEY* sldns_gost2pkey_raw(unsigned char* key, size_t keylen); */ EVP_PKEY* sldns_ecdsa2pkey_raw(unsigned char* key, size_t keylen, uint8_t algo); +#ifndef HAVE_OSSL_PARAM_BLD_NEW /** * Like sldns_key_buf2rsa, but uses raw buffer. * \param[in] key the uncompressed wireformat of the key. @@ -91,6 +102,15 @@ EVP_PKEY* sldns_ecdsa2pkey_raw(unsigned char* key, size_t keylen, uint8_t algo); * \return a RSA * structure with the key material */ RSA *sldns_key_buf2rsa_raw(unsigned char* key, size_t len); +#endif + +/** + * Converts a holding buffer with RSA key material to EVP PKEY in openssl. + * \param[in] key the uncompressed wireformat of the key. + * \param[in] len length of key data + * \return the key or NULL on error. + */ +EVP_PKEY* sldns_key_rsa2pkey_raw(unsigned char* key, size_t len); /** * Converts a holding buffer with key material to EVP PKEY in openssl. diff --git a/sbin/unwind/libunbound/sldns/parse.c b/sbin/unwind/libunbound/sldns/parse.c index f4de8602fd6..491c8f51bf1 100644 --- a/sbin/unwind/libunbound/sldns/parse.c +++ b/sbin/unwind/libunbound/sldns/parse.c @@ -149,6 +149,9 @@ sldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *l if (c != '\0' && c != '\n') { *t++ = c; } + if (c == '\n' && line_nr) { + *line_nr = *line_nr + 1; + } if (c == '\\' && prev_c == '\\') prev_c = 0; else prev_c = c; diff --git a/sbin/unwind/libunbound/sldns/parse.h b/sbin/unwind/libunbound/sldns/parse.h index 44236bfd495..fa8f51a924c 100644 --- a/sbin/unwind/libunbound/sldns/parse.h +++ b/sbin/unwind/libunbound/sldns/parse.h @@ -153,7 +153,6 @@ int sldns_bgetc(struct sldns_buffer *buffer); * the position to the first character that is not in *s. * \param[in] *buffer buffer to use * \param[in] *s characters to skip - * \return void */ void sldns_bskipcs(struct sldns_buffer *buffer, const char *s); @@ -162,7 +161,6 @@ void sldns_bskipcs(struct sldns_buffer *buffer, const char *s); * the position to the first character that is not in *s. * \param[in] *fp file to use * \param[in] *s characters to skip - * \return void */ void sldns_fskipcs(FILE *fp, const char *s); @@ -173,7 +171,6 @@ void sldns_fskipcs(FILE *fp, const char *s); * \param[in] *fp file to use * \param[in] *s characters to skip * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return void */ void sldns_fskipcs_l(FILE *fp, const char *s, int *line_nr); diff --git a/sbin/unwind/libunbound/sldns/parseutil.c b/sbin/unwind/libunbound/sldns/parseutil.c index 9f289d3596c..ba71df55d50 100644 --- a/sbin/unwind/libunbound/sldns/parseutil.c +++ b/sbin/unwind/libunbound/sldns/parseutil.c @@ -790,3 +790,18 @@ int sldns_b64url_pton(char const *src, size_t srcsize, uint8_t *target, } return sldns_b64_pton_base(src, srcsize, target, targsize, 1); } + +int sldns_b64_contains_nonurl(char const *src, size_t srcsize) +{ + const char* s = src; + while(*s && srcsize) { + char d = *s++; + srcsize--; + /* the '+' and the '/' and padding '=' is not allowed in b64 + * url encoding */ + if(d == '+' || d == '/' || d == '=') { + return 1; + } + } + return 0; +} diff --git a/sbin/unwind/libunbound/sldns/parseutil.h b/sbin/unwind/libunbound/sldns/parseutil.h index 7eb23317f28..74d7c727571 100644 --- a/sbin/unwind/libunbound/sldns/parseutil.h +++ b/sbin/unwind/libunbound/sldns/parseutil.h @@ -102,6 +102,7 @@ size_t sldns_b64_pton_calculate_size(size_t srcsize); int sldns_b64_pton(char const *src, uint8_t *target, size_t targsize); int sldns_b64url_pton(char const *src, size_t srcsize, uint8_t *target, size_t targsize); +int sldns_b64_contains_nonurl(char const *src, size_t srcsize); /** * calculates the size needed to store the result of b32_ntop diff --git a/sbin/unwind/libunbound/sldns/rrdef.c b/sbin/unwind/libunbound/sldns/rrdef.c index 0af015f4b3b..fe5c8e104a8 100644 --- a/sbin/unwind/libunbound/sldns/rrdef.c +++ b/sbin/unwind/libunbound/sldns/rrdef.c @@ -150,6 +150,12 @@ static const sldns_rdf_type type_openpgpkey_wireformat[] = { static const sldns_rdf_type type_csync_wireformat[] = { LDNS_RDF_TYPE_INT32, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_NSEC }; +static const sldns_rdf_type type_zonemd_wireformat[] = { + LDNS_RDF_TYPE_INT32, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX +}; +static const sldns_rdf_type type_svcb_wireformat[] = { + LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME +}; /* nsec3 is some vars, followed by same type of data of nsec */ static const sldns_rdf_type type_nsec3_wireformat[] = { /* LDNS_RDF_TYPE_NSEC3_VARS, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC*/ @@ -372,9 +378,12 @@ static sldns_rr_descriptor rdata_field_descriptors[] = { {LDNS_RR_TYPE_OPENPGPKEY, "OPENPGPKEY", 1, 1, type_openpgpkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, /* 62 */ {LDNS_RR_TYPE_CSYNC, "CSYNC", 3, 3, type_csync_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{(enum sldns_enum_rr_type)0, "TYPE63", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{(enum sldns_enum_rr_type)0, "TYPE64", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{(enum sldns_enum_rr_type)0, "TYPE65", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, + /* 63 */ + {LDNS_RR_TYPE_ZONEMD, "ZONEMD", 4, 4, type_zonemd_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, + /* 64 */ + {LDNS_RR_TYPE_SVCB, "SVCB", 2, 2, type_svcb_wireformat, LDNS_RDF_TYPE_SVCPARAM, LDNS_RR_NO_COMPRESS, 0 }, + /* 65 */ + {LDNS_RR_TYPE_HTTPS, "HTTPS", 2, 2, type_svcb_wireformat, LDNS_RDF_TYPE_SVCPARAM, LDNS_RR_NO_COMPRESS, 0 }, {(enum sldns_enum_rr_type)0, "TYPE66", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, {(enum sldns_enum_rr_type)0, "TYPE67", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, {(enum sldns_enum_rr_type)0, "TYPE68", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, diff --git a/sbin/unwind/libunbound/sldns/rrdef.h b/sbin/unwind/libunbound/sldns/rrdef.h index e084f354a8a..42d5de064ee 100644 --- a/sbin/unwind/libunbound/sldns/rrdef.h +++ b/sbin/unwind/libunbound/sldns/rrdef.h @@ -195,6 +195,9 @@ enum sldns_enum_rr_type LDNS_RR_TYPE_CDNSKEY = 60, /** RFC 7344 */ LDNS_RR_TYPE_OPENPGPKEY = 61, /* RFC 7929 */ LDNS_RR_TYPE_CSYNC = 62, /* RFC 7477 */ + LDNS_RR_TYPE_ZONEMD = 63, /* draft-ietf-dnsop-dns-zone-digest-12 */ + LDNS_RR_TYPE_SVCB = 64, /* draft-ietf-dnsop-svcb-https-04 */ + LDNS_RR_TYPE_HTTPS = 65, /* draft-ietf-dnsop-svcb-https-04 */ LDNS_RR_TYPE_SPF = 99, /* RFC 4408 */ @@ -352,8 +355,13 @@ enum sldns_enum_rdf_type /** TSIG extended 16bit error value */ LDNS_RDF_TYPE_TSIGERROR, + /* draft-ietf-dnsop-svcb-https-05: + * each SvcParam consisting of a SvcParamKey=SvcParamValue pair or + * a standalone SvcParamKey */ + LDNS_RDF_TYPE_SVCPARAM, + /* Aliases */ - LDNS_RDF_TYPE_BITMAP = LDNS_RDF_TYPE_NSEC + LDNS_RDF_TYPE_BITMAP = LDNS_RDF_TYPE_NSEC, }; typedef enum sldns_enum_rdf_type sldns_rdf_type; diff --git a/sbin/unwind/libunbound/sldns/sbuffer.h b/sbin/unwind/libunbound/sldns/sbuffer.h index 5dbe988cd1b..1b7fe370cc4 100644 --- a/sbin/unwind/libunbound/sldns/sbuffer.h +++ b/sbin/unwind/libunbound/sldns/sbuffer.h @@ -202,7 +202,6 @@ INLINE void sldns_buffer_clear(sldns_buffer *buffer) * the position is set to 0. * * \param[in] buffer the buffer to flip - * \return void */ INLINE void sldns_buffer_flip(sldns_buffer *buffer) { @@ -732,7 +731,6 @@ int sldns_buffer_printf(sldns_buffer *buffer, const char *format, ...) /** * frees the buffer. * \param[in] *buffer the buffer to be freed - * \return void */ void sldns_buffer_free(sldns_buffer *buffer); diff --git a/sbin/unwind/libunbound/sldns/str2wire.c b/sbin/unwind/libunbound/sldns/str2wire.c index 977cda28a2d..fbd615cbfd7 100644 --- a/sbin/unwind/libunbound/sldns/str2wire.c +++ b/sbin/unwind/libunbound/sldns/str2wire.c @@ -29,7 +29,6 @@ #define RET_ERR(e, off) ((int)((e)|((off)<<LDNS_WIREPARSE_SHIFT))) /** Move parse error but keep its ID */ #define RET_ERR_SHIFT(e, move) RET_ERR(LDNS_WIREPARSE_ERROR(e), LDNS_WIREPARSE_OFFSET(e)+(move)); -#define LDNS_IP6ADDRLEN (128/8) /* * No special care is taken, all dots are translated into @@ -615,6 +614,122 @@ sldns_affix_token(sldns_buffer* strbuf, char* token, size_t* token_len, return 1; } +static int sldns_str2wire_svcparam_key_cmp(const void *a, const void *b) +{ + return sldns_read_uint16(*(uint8_t**) a) + - sldns_read_uint16(*(uint8_t**) b); +} + +/** + * Add constraints to the SVCB RRs which involve the whole set + */ +static int sldns_str2wire_check_svcbparams(uint8_t* rdata, uint16_t rdata_len) +{ + size_t nparams = 0, i; + uint8_t new_rdata[LDNS_MAX_RDFLEN]; + uint8_t* new_rdata_ptr = new_rdata; + uint8_t* svcparams[MAX_NUMBER_OF_SVCPARAMS]; + uint8_t* rdata_ptr = rdata; + uint16_t rdata_remaining = rdata_len; + + /* find the SvcParams */ + while (rdata_remaining) { + uint16_t svcbparam_len; + + svcparams[nparams] = rdata_ptr; + if (rdata_remaining < 4) + return LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA; + svcbparam_len = sldns_read_uint16(rdata_ptr + 2); + rdata_remaining -= 4; + rdata_ptr += 4; + + if (rdata_remaining < svcbparam_len) + return LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA; + rdata_remaining -= svcbparam_len; + rdata_ptr += svcbparam_len; + + nparams += 1; + if (nparams >= MAX_NUMBER_OF_SVCPARAMS) + return LDNS_WIREPARSE_ERR_SVCB_TOO_MANY_PARAMS; + } + + /* In draft-ietf-dnsop-svcb-https-06 Section 7: + * + * In wire format, the keys are represented by their numeric + * values in network byte order, concatenated in ascending order. + */ + qsort((void *)svcparams + ,nparams + ,sizeof(uint8_t*) + ,sldns_str2wire_svcparam_key_cmp); + + + /* The code below revolves around sematic errors in the SVCParam set. + * So long as we do not distinguish between running Unbound as a primary + * or as a secondary, we default to secondary behavior and we ignore the + * sematic errors. */ + +#ifdef SVCB_SEMANTIC_ERRORS + { + uint8_t* mandatory = NULL; + /* In draft-ietf-dnsop-svcb-https-06 Section 7: + * + * Keys (...) MUST NOT appear more than once. + * + * If they key has already been seen, we have a duplicate + */ + for(i=0; i < nparams; i++) { + uint16_t key = sldns_read_uint16(svcparams[i]); + if(i + 1 < nparams && key == sldns_read_uint16(svcparams[i+1])) + return LDNS_WIREPARSE_ERR_SVCB_DUPLICATE_KEYS; + if(key == SVCB_KEY_MANDATORY) + mandatory = svcparams[i]; + } + + /* 4. verify that all the SvcParamKeys in mandatory are present */ + if(mandatory) { + /* Divide by sizeof(uint16_t)*/ + uint16_t mandatory_nkeys = sldns_read_uint16(mandatory + 2) / sizeof(uint16_t); + + /* Guaranteed by sldns_str2wire_svcparam_key_value */ + assert(mandatory_nkeys > 0); + + for(i=0; i < mandatory_nkeys; i++) { + uint16_t mandatory_key = sldns_read_uint16( + mandatory + + 2 * sizeof(uint16_t) + + i * sizeof(uint16_t)); + uint8_t found = 0; + size_t j; + + for(j=0; j < nparams; j++) { + if(mandatory_key == sldns_read_uint16(svcparams[j])) { + found = 1; + break; + } + } + + if(!found) + return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_MISSING_PARAM; + } + } + } +#endif + /* Write rdata in correct order */ + for (i = 0; i < nparams; i++) { + uint16_t svcparam_len = sldns_read_uint16(svcparams[i] + 2) + + 2 * sizeof(uint16_t); + + if ((unsigned)(new_rdata_ptr - new_rdata) + svcparam_len > sizeof(new_rdata)) + return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; + + memcpy(new_rdata_ptr, svcparams[i], svcparam_len); + new_rdata_ptr += svcparam_len; + } + memcpy(rdata, new_rdata, rdata_len); + return LDNS_WIREPARSE_ERR_OK; +} + /** parse rdata from string into rr buffer(-remainder after dname). */ static int rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len, @@ -712,6 +827,42 @@ rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len, /* write rdata length */ sldns_write_uint16(rr+dname_len+8, (uint16_t)(rr_cur_len-dname_len-10)); *rr_len = rr_cur_len; + /* SVCB/HTTPS handling */ + if (rr_type == LDNS_RR_TYPE_SVCB || rr_type == LDNS_RR_TYPE_HTTPS) { + size_t rdata_len = rr_cur_len - dname_len - 10; + uint8_t *rdata = rr+dname_len + 10; + + /* skip 1st rdata field SvcPriority (uint16_t) */ + if (rdata_len < sizeof(uint16_t)) + return LDNS_WIREPARSE_ERR_OK; + + rdata_len -= sizeof(uint16_t); + rdata += sizeof(uint16_t); + + /* skip 2nd rdata field dname */ + while (rdata_len && *rdata != 0) { + uint8_t label_len; + + if (*rdata & 0xC0) + return LDNS_WIREPARSE_ERR_OK; + + label_len = *rdata + 1; + if (rdata_len < label_len) + return LDNS_WIREPARSE_ERR_OK; + + rdata_len -= label_len; + rdata += label_len; + } + /* The root label is one more character, so smaller + * than 1 + 1 means no Svcparam Keys */ + if (rdata_len < 2 || *rdata != 0) + return LDNS_WIREPARSE_ERR_OK; + + rdata_len -= 1; + rdata += 1; + return sldns_str2wire_check_svcbparams(rdata, rdata_len); + + } return LDNS_WIREPARSE_ERR_OK; } @@ -929,11 +1080,533 @@ int sldns_fp2wire_rr_buf(FILE* in, uint8_t* rr, size_t* len, size_t* dname_len, memmove(parse_state->prev_rr, rr, *dname_len); parse_state->prev_rr_len = (*dname_len); } + if(r == LDNS_WIREPARSE_ERR_OK && parse_state) { + parse_state->default_ttl = sldns_wirerr_get_ttl( + rr, *len, *dname_len); + } return r; } return LDNS_WIREPARSE_ERR_OK; } +static int +sldns_str2wire_svcparam_key_lookup(const char *key, size_t key_len) +{ + char buf[64]; + char *endptr; + unsigned long int key_value; + + if (key_len >= 4 && key_len <= 8 && !strncmp(key, "key", 3)) { + memcpy(buf, key + 3, key_len - 3); + buf[key_len - 3] = 0; + key_value = strtoul(buf, &endptr, 10); + + if (endptr > buf /* digits seen */ + && *endptr == 0 /* no non-digit chars after digits */ + && key_value <= 65535) /* no overflow */ + return key_value; + + } else switch (key_len) { + case sizeof("mandatory")-1: + if (!strncmp(key, "mandatory", sizeof("mandatory")-1)) + return SVCB_KEY_MANDATORY; + if (!strncmp(key, "echconfig", sizeof("echconfig")-1)) + return SVCB_KEY_ECH; /* allow "echconfig as well as "ech" */ + break; + + case sizeof("alpn")-1: + if (!strncmp(key, "alpn", sizeof("alpn")-1)) + return SVCB_KEY_ALPN; + if (!strncmp(key, "port", sizeof("port")-1)) + return SVCB_KEY_PORT; + break; + + case sizeof("no-default-alpn")-1: + if (!strncmp( key , "no-default-alpn" + , sizeof("no-default-alpn")-1)) + return SVCB_KEY_NO_DEFAULT_ALPN; + break; + + case sizeof("ipv4hint")-1: + if (!strncmp(key, "ipv4hint", sizeof("ipv4hint")-1)) + return SVCB_KEY_IPV4HINT; + if (!strncmp(key, "ipv6hint", sizeof("ipv6hint")-1)) + return SVCB_KEY_IPV6HINT; + break; + + case sizeof("ech")-1: + if (!strncmp(key, "ech", sizeof("ech")-1)) + return SVCB_KEY_ECH; + break; + + default: + break; + } + + /* Although the returned value might be used by the caller, + * the parser has erred, so the zone will not be loaded. + */ + return -1; +} + +static int +sldns_str2wire_svcparam_port(const char* val, uint8_t* rd, size_t* rd_len) +{ + unsigned long int port; + char *endptr; + + if (*rd_len < 6) + return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; + + port = strtoul(val, &endptr, 10); + + if (endptr > val /* digits seen */ + && *endptr == 0 /* no non-digit chars after digits */ + && port <= 65535) { /* no overflow */ + + sldns_write_uint16(rd, SVCB_KEY_PORT); + sldns_write_uint16(rd + 2, sizeof(uint16_t)); + sldns_write_uint16(rd + 4, port); + *rd_len = 6; + + return LDNS_WIREPARSE_ERR_OK; + } + + return LDNS_WIREPARSE_ERR_SVCB_PORT_VALUE_SYNTAX; +} + +static int +sldns_str2wire_svcbparam_ipv4hint(const char* val, uint8_t* rd, size_t* rd_len) +{ + size_t count; + char ip_str[INET_ADDRSTRLEN+1]; + char *next_ip_str; + size_t i; + + for (i = 0, count = 1; val[i]; i++) { + if (val[i] == ',') + count += 1; + if (count > SVCB_MAX_COMMA_SEPARATED_VALUES) { + return LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_ADDRESSES; + } + } + + if (*rd_len < (LDNS_IP4ADDRLEN * count) + 4) + return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; + + /* count is number of comma's in val + 1; so the actual number of IPv4 + * addresses in val + */ + sldns_write_uint16(rd, SVCB_KEY_IPV4HINT); + sldns_write_uint16(rd + 2, LDNS_IP4ADDRLEN * count); + *rd_len = 4; + + while (count) { + if (!(next_ip_str = strchr(val, ','))) { + if (inet_pton(AF_INET, val, rd + *rd_len) != 1) + break; + *rd_len += LDNS_IP4ADDRLEN; + + assert(count == 1); + + } else if (next_ip_str - val >= (int)sizeof(ip_str)) + break; + + else { + memcpy(ip_str, val, next_ip_str - val); + ip_str[next_ip_str - val] = 0; + if (inet_pton(AF_INET, ip_str, rd + *rd_len) != 1) { + break; + } + *rd_len += LDNS_IP4ADDRLEN; + + val = next_ip_str + 1; + } + count--; + } + if (count) /* verify that we parsed all values */ + return LDNS_WIREPARSE_ERR_SYNTAX_IP4; + + return LDNS_WIREPARSE_ERR_OK; +} + +static int +sldns_str2wire_svcbparam_ipv6hint(const char* val, uint8_t* rd, size_t* rd_len) +{ + size_t count; + char ip_str[INET6_ADDRSTRLEN+1]; + char *next_ip_str; + size_t i; + + for (i = 0, count = 1; val[i]; i++) { + if (val[i] == ',') + count += 1; + if (count > SVCB_MAX_COMMA_SEPARATED_VALUES) { + return LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_ADDRESSES; + } + } + + if (*rd_len < (LDNS_IP6ADDRLEN * count) + 4) + return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; + + /* count is number of comma's in val + 1; so the actual number of IPv6 + * addresses in val + */ + sldns_write_uint16(rd, SVCB_KEY_IPV6HINT); + sldns_write_uint16(rd + 2, LDNS_IP6ADDRLEN * count); + *rd_len = 4; + + while (count) { + if (!(next_ip_str = strchr(val, ','))) { + if (inet_pton(AF_INET6, val, rd + *rd_len) != 1) + break; + *rd_len += LDNS_IP6ADDRLEN; + + assert(count == 1); + + } else if (next_ip_str - val >= (int)sizeof(ip_str)) + break; + + else { + memcpy(ip_str, val, next_ip_str - val); + ip_str[next_ip_str - val] = 0; + if (inet_pton(AF_INET6, ip_str, rd + *rd_len) != 1) { + break; + } + *rd_len += LDNS_IP6ADDRLEN; + + val = next_ip_str + 1; + } + count--; + } + if (count) /* verify that we parsed all values */ + return LDNS_WIREPARSE_ERR_SYNTAX_IP6; + + return LDNS_WIREPARSE_ERR_OK; +} + +/* compare function used for sorting uint16_t's */ +static int +sldns_network_uint16_cmp(const void *a, const void *b) +{ + return ((int)sldns_read_uint16(a)) - ((int)sldns_read_uint16(b)); +} + +static int +sldns_str2wire_svcbparam_mandatory(const char* val, uint8_t* rd, size_t* rd_len) +{ + size_t i, count, val_len; + char* next_key; + + val_len = strlen(val); + + for (i = 0, count = 1; val[i]; i++) { + if (val[i] == ',') + count += 1; + if (count > SVCB_MAX_COMMA_SEPARATED_VALUES) { + return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_TOO_MANY_KEYS; + } + } + if (sizeof(uint16_t) * (count + 2) > *rd_len) + return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; + + sldns_write_uint16(rd, SVCB_KEY_MANDATORY); + sldns_write_uint16(rd + 2, sizeof(uint16_t) * count); + *rd_len = 4; + + while (1) { + int svcparamkey; + + if (!(next_key = strchr(val, ','))) { + svcparamkey = sldns_str2wire_svcparam_key_lookup(val, val_len); + + if (svcparamkey < 0) { + return LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY; + } + + sldns_write_uint16(rd + *rd_len, svcparamkey); + *rd_len += 2; + break; + } else { + svcparamkey = sldns_str2wire_svcparam_key_lookup(val, next_key - val); + + if (svcparamkey < 0) { + return LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY; + } + + sldns_write_uint16(rd + *rd_len, + svcparamkey); + *rd_len += 2; + } + + val_len -= next_key - val + 1; + val = next_key + 1; /* skip the comma */ + } + + /* In draft-ietf-dnsop-svcb-https-06 Section 7: + * + * "In wire format, the keys are represented by their numeric + * values in network byte order, concatenated in ascending order." + */ + qsort((void *)(rd + 4), count, sizeof(uint16_t), sldns_network_uint16_cmp); + + /* The code below revolves around sematic errors in the SVCParam set. + * So long as we do not distinguish between running Unbound as a primary + * or as a secondary, we default to secondary behavior and we ignore the + * semantic errors. */ +#ifdef SVCB_SEMANTIC_ERRORS + /* In draft-ietf-dnsop-svcb-https-06 Section 8 + * automatically mandatory MUST NOT appear in its own value-list + */ + if (sldns_read_uint16(rd + 4) == SVCB_KEY_MANDATORY) + return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY; + + /* Guarantee key uniqueness. After the sort we only need to + * compare neighbouring keys */ + if (count > 1) { + for (i = 0; i < count - 1; i++) { + uint8_t* current_pos = (rd + 4 + (sizeof(uint16_t) * i)); + uint16_t key = sldns_read_uint16(current_pos); + + if (key == sldns_read_uint16(current_pos + 2)) { + return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_DUPLICATE_KEY; + } + } + } +#endif + return LDNS_WIREPARSE_ERR_OK; +} + +static int +sldns_str2wire_svcbparam_ech_value(const char* val, uint8_t* rd, size_t* rd_len) +{ + uint8_t buffer[LDNS_MAX_RDFLEN]; + int wire_len; + + /* single 0 represents empty buffer */ + if(strcmp(val, "0") == 0) { + if (*rd_len < 4) + return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; + sldns_write_uint16(rd, SVCB_KEY_ECH); + sldns_write_uint16(rd + 2, 0); + + return LDNS_WIREPARSE_ERR_OK; + } + + wire_len = sldns_b64_pton(val, buffer, LDNS_MAX_RDFLEN); + + if (wire_len <= 0) { + return LDNS_WIREPARSE_ERR_SYNTAX_B64; + } else if ((unsigned)wire_len + 4 > *rd_len) { + return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; + } else { + sldns_write_uint16(rd, SVCB_KEY_ECH); + sldns_write_uint16(rd + 2, wire_len); + memcpy(rd + 4, buffer, wire_len); + *rd_len = 4 + wire_len; + + return LDNS_WIREPARSE_ERR_OK; + } +} + +static const char* +sldns_str2wire_svcbparam_parse_next_unescaped_comma(const char *val) +{ + while (*val) { + /* Only return when the comma is not escaped*/ + if (*val == '\\'){ + ++val; + if (!*val) + break; + } else if (*val == ',') + return val; + + val++; + } + return NULL; +} + +/* The source is already properly unescaped, this double unescaping is purely to allow for + * comma's in comma seperated alpn lists. + * + * In draft-ietf-dnsop-svcb-https-06 Section 7: + * To enable simpler parsing, this SvcParamValue MUST NOT contain escape sequences. + */ +static size_t +sldns_str2wire_svcbparam_parse_copy_unescaped(uint8_t *dst, + const char *src, size_t len) +{ + uint8_t *orig_dst = dst; + + while (len) { + if (*src == '\\') { + src++; + len--; + if (!len) + break; + } + *dst++ = *src++; + len--; + } + return (size_t)(dst - orig_dst); +} + +static int +sldns_str2wire_svcbparam_alpn_value(const char* val, + uint8_t* rd, size_t* rd_len) +{ + uint8_t unescaped_dst[LDNS_MAX_RDFLEN]; + uint8_t *dst = unescaped_dst; + const char *next_str; + size_t str_len; + size_t dst_len; + size_t val_len; + + val_len = strlen(val); + + if (val_len > sizeof(unescaped_dst)) { + return LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE; + } + while (val_len) { + size_t key_len; + + str_len = (next_str = sldns_str2wire_svcbparam_parse_next_unescaped_comma(val)) + ? (size_t)(next_str - val) : val_len; + + if (str_len > 255) { + return LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE; + } + + key_len = sldns_str2wire_svcbparam_parse_copy_unescaped(dst + 1, val, str_len); + *dst++ = key_len; + dst += key_len; + + if (!next_str) + break; + + /* skip the comma in the next iteration */ + val_len -= next_str - val + 1; + val = next_str + 1; + } + dst_len = dst - unescaped_dst; + if (*rd_len < 4 + dst_len) + return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; + sldns_write_uint16(rd, SVCB_KEY_ALPN); + sldns_write_uint16(rd + 2, dst_len); + memcpy(rd + 4, unescaped_dst, dst_len); + *rd_len = 4 + dst_len; + + return LDNS_WIREPARSE_ERR_OK; +} + +static int +sldns_str2wire_svcparam_value(const char *key, size_t key_len, + const char *val, uint8_t* rd, size_t* rd_len) +{ + size_t str_len; + int svcparamkey = sldns_str2wire_svcparam_key_lookup(key, key_len); + + if (svcparamkey < 0) { + return LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY; + } + + /* key without value */ + if (val == NULL) { + switch (svcparamkey) { +#ifdef SVCB_SEMANTIC_ERRORS + case SVCB_KEY_MANDATORY: + case SVCB_KEY_ALPN: + case SVCB_KEY_PORT: + case SVCB_KEY_IPV4HINT: + case SVCB_KEY_IPV6HINT: + return LDNS_WIREPARSE_ERR_SVCB_MISSING_PARAM; +#endif + default: + if (*rd_len < 4) + return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; + sldns_write_uint16(rd, svcparamkey); + sldns_write_uint16(rd + 2, 0); + *rd_len = 4; + + return LDNS_WIREPARSE_ERR_OK; + } + } + + /* value is non-empty */ + switch (svcparamkey) { + case SVCB_KEY_PORT: + return sldns_str2wire_svcparam_port(val, rd, rd_len); + case SVCB_KEY_IPV4HINT: + return sldns_str2wire_svcbparam_ipv4hint(val, rd, rd_len); + case SVCB_KEY_IPV6HINT: + return sldns_str2wire_svcbparam_ipv6hint(val, rd, rd_len); + case SVCB_KEY_MANDATORY: + return sldns_str2wire_svcbparam_mandatory(val, rd, rd_len); +#ifdef SVCB_SEMANTIC_ERRORS + case SVCB_KEY_NO_DEFAULT_ALPN: + return LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE; +#endif + case SVCB_KEY_ECH: + return sldns_str2wire_svcbparam_ech_value(val, rd, rd_len); + case SVCB_KEY_ALPN: + return sldns_str2wire_svcbparam_alpn_value(val, rd, rd_len); + default: + str_len = strlen(val); + if (*rd_len < 4 + str_len) + return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; + sldns_write_uint16(rd, svcparamkey); + sldns_write_uint16(rd + 2, str_len); + memcpy(rd + 4, val, str_len); + *rd_len = 4 + str_len; + + return LDNS_WIREPARSE_ERR_OK; + } + + return LDNS_WIREPARSE_ERR_GENERAL; +} + +int sldns_str2wire_svcparam_buf(const char* str, uint8_t* rd, size_t* rd_len) +{ + const char* eq_pos; + char unescaped_val[LDNS_MAX_RDFLEN]; + char* val_out = unescaped_val; + const char* val_in; + + eq_pos = strchr(str, '='); + + /* case: key=value */ + if (eq_pos != NULL && eq_pos[1]) { + val_in = eq_pos + 1; + + /* unescape characters and "" blocks */ + if (*val_in == '"') { + val_in++; + while (*val_in != '"' + && (unsigned)(val_out - unescaped_val + 1) < sizeof(unescaped_val) + && sldns_parse_char( (uint8_t*) val_out, &val_in)) { + val_out++; + } + } else { + while ((unsigned)(val_out - unescaped_val + 1) < sizeof(unescaped_val) + && sldns_parse_char( (uint8_t*) val_out, &val_in)) { + val_out++; + } + } + *val_out = 0; + + return sldns_str2wire_svcparam_value(str, eq_pos - str, + unescaped_val[0] ? unescaped_val : NULL, rd, rd_len); + } + /* case: key= */ + else if (eq_pos != NULL && !(eq_pos[1])) { + return sldns_str2wire_svcparam_value(str, eq_pos - str, NULL, rd, rd_len); + } + /* case: key */ + else { + return sldns_str2wire_svcparam_value(str, strlen(str), NULL, rd, rd_len); + } +} + int sldns_str2wire_rdf_buf(const char* str, uint8_t* rd, size_t* len, sldns_rdf_type rdftype) { @@ -1006,6 +1679,8 @@ int sldns_str2wire_rdf_buf(const char* str, uint8_t* rd, size_t* len, return sldns_str2wire_hip_buf(str, rd, len); case LDNS_RDF_TYPE_INT16_DATA: return sldns_str2wire_int16_data_buf(str, rd, len); + case LDNS_RDF_TYPE_SVCPARAM: + return sldns_str2wire_svcparam_buf(str, rd, len); case LDNS_RDF_TYPE_UNKNOWN: case LDNS_RDF_TYPE_SERVICE: return LDNS_WIREPARSE_ERR_NOT_IMPL; @@ -1491,13 +2166,17 @@ static int loc_parse_cm(char* my_str, char** endstr, uint8_t* m, uint8_t* e) { uint32_t meters = 0, cm = 0, val; + char* cm_endstr; while (isblank((unsigned char)*my_str)) { my_str++; } meters = (uint32_t)strtol(my_str, &my_str, 10); if (*my_str == '.') { my_str++; - cm = (uint32_t)strtol(my_str, &my_str, 10); + cm = (uint32_t)strtol(my_str, &cm_endstr, 10); + if(cm_endstr == my_str + 1) + cm *= 10; + my_str = cm_endstr; } if (meters >= 1) { *e = 2; diff --git a/sbin/unwind/libunbound/sldns/str2wire.h b/sbin/unwind/libunbound/sldns/str2wire.h index 70070e4f575..0c316498956 100644 --- a/sbin/unwind/libunbound/sldns/str2wire.h +++ b/sbin/unwind/libunbound/sldns/str2wire.h @@ -23,10 +23,27 @@ extern "C" { #endif struct sldns_struct_lookup_table; +#define LDNS_IP4ADDRLEN (32/8) +#define LDNS_IP6ADDRLEN (128/8) + /** buffer to read an RR, cannot be larger than 64K because of packet size */ #define LDNS_RR_BUF_SIZE 65535 /* bytes */ #define LDNS_DEFAULT_TTL 3600 +/* SVCB keys currently defined in draft-ietf-dnsop-svcb-https */ +#define SVCB_KEY_MANDATORY 0 +#define SVCB_KEY_ALPN 1 +#define SVCB_KEY_NO_DEFAULT_ALPN 2 +#define SVCB_KEY_PORT 3 +#define SVCB_KEY_IPV4HINT 4 +#define SVCB_KEY_ECH 5 +#define SVCB_KEY_IPV6HINT 6 +#define SVCPARAMKEY_COUNT 7 + +#define MAX_NUMBER_OF_SVCPARAMS 64 + +#define SVCB_MAX_COMMA_SEPARATED_VALUES 1000 + /* * To convert class and type to string see * sldns_get_rr_class_by_name(str) @@ -204,6 +221,20 @@ uint8_t* sldns_wirerr_get_rdatawl(uint8_t* rr, size_t len, size_t dname_len); #define LDNS_WIREPARSE_ERR_SYNTAX_INTEGER_OVERFLOW 370 #define LDNS_WIREPARSE_ERR_INCLUDE 371 #define LDNS_WIREPARSE_ERR_PARENTHESIS 372 +#define LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY 373 +#define LDNS_WIREPARSE_ERR_SVCB_MISSING_PARAM 374 +#define LDNS_WIREPARSE_ERR_SVCB_TOO_MANY_PARAMS 375 +#define LDNS_WIREPARSE_ERR_SVCB_DUPLICATE_KEYS 376 +#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_TOO_MANY_KEYS 377 +#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_MISSING_PARAM 378 +#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_DUPLICATE_KEY 379 +#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY 380 +#define LDNS_WIREPARSE_ERR_SVCB_PORT_VALUE_SYNTAX 381 +#define LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_ADDRESSES 382 +#define LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_ADDRESSES 383 +#define LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE 384 +#define LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE 385 +#define LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA 386 /** * Get reference to a constant string for the (parse) error. diff --git a/sbin/unwind/libunbound/sldns/wire2str.c b/sbin/unwind/libunbound/sldns/wire2str.c index d0d1632d407..6a177ec0b06 100644 --- a/sbin/unwind/libunbound/sldns/wire2str.c +++ b/sbin/unwind/libunbound/sldns/wire2str.c @@ -149,6 +149,30 @@ static sldns_lookup_table sldns_wireparse_errors_data[] = { { LDNS_WIREPARSE_ERR_SYNTAX_INTEGER_OVERFLOW, "Syntax error, integer overflow" }, { LDNS_WIREPARSE_ERR_INCLUDE, "$INCLUDE directive was seen in the zone" }, { LDNS_WIREPARSE_ERR_PARENTHESIS, "Parse error, parenthesis mismatch" }, + { LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY, "Unknown SvcParamKey"}, + { LDNS_WIREPARSE_ERR_SVCB_MISSING_PARAM, "SvcParam is missing a SvcParamValue"}, + { LDNS_WIREPARSE_ERR_SVCB_DUPLICATE_KEYS, "Duplicate SVCB key found"}, + { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_TOO_MANY_KEYS, "Too many keys in mandatory" }, + { LDNS_WIREPARSE_ERR_SVCB_TOO_MANY_PARAMS, + "Too many SvcParams. Unbound only allows 63 entries" }, + { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_MISSING_PARAM, + "Mandatory SvcParamKey is missing"}, + { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_DUPLICATE_KEY, + "Keys in SvcParam mandatory MUST be unique" }, + { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY, + "mandatory MUST not be included as mandatory parameter" }, + { LDNS_WIREPARSE_ERR_SVCB_PORT_VALUE_SYNTAX, + "Could not parse port SvcParamValue" }, + { LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_ADDRESSES, + "Too many IPv4 addresses in ipv4hint" }, + { LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_ADDRESSES, + "Too many IPv6 addresses in ipv6hint" }, + { LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE, + "Alpn strings need to be smaller than 255 chars"}, + { LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE, + "No-default-alpn should not have a value" }, + { LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA, + "General SVCParam error" }, { 0, NULL } }; sldns_lookup_table* sldns_wireparse_errors = sldns_wireparse_errors_data; @@ -196,6 +220,12 @@ static sldns_lookup_table sldns_tsig_errors_data[] = { }; sldns_lookup_table* sldns_tsig_errors = sldns_tsig_errors_data; +/* draft-ietf-dnsop-svcb-https-06: 6. Initial SvcParamKeys */ +const char *svcparamkey_strs[] = { + "mandatory", "alpn", "no-default-alpn", "port", + "ipv4hint", "ech", "ipv6hint" +}; + char* sldns_wire2str_pkt(uint8_t* data, size_t len) { size_t slen = (size_t)sldns_wire2str_pkt_buf(data, len, NULL, 0); @@ -940,6 +970,253 @@ int sldns_wire2str_ttl_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen) return sldns_str_print(s, slen, "%u", (unsigned)ttl); } +static int +sldns_print_svcparamkey(char** s, size_t* slen, uint16_t svcparamkey) +{ + if (svcparamkey < SVCPARAMKEY_COUNT) { + return sldns_str_print(s, slen, "%s", svcparamkey_strs[svcparamkey]); + } + else { + return sldns_str_print(s, slen, "key%d", (int)svcparamkey); + } +} + +static int sldns_wire2str_svcparam_port2str(char** s, + size_t* slen, uint16_t data_len, uint8_t* data) +{ + int w = 0; + + if (data_len != 2) + return -1; /* wireformat error, a short is 2 bytes */ + w = sldns_str_print(s, slen, "=%d", (int)sldns_read_uint16(data)); + + return w; +} + +static int sldns_wire2str_svcparam_ipv4hint2str(char** s, + size_t* slen, uint16_t data_len, uint8_t* data) +{ + char ip_str[INET_ADDRSTRLEN + 1]; + + int w = 0; + + assert(data_len > 0); + + if ((data_len % LDNS_IP4ADDRLEN) == 0) { + if (inet_ntop(AF_INET, data, ip_str, sizeof(ip_str)) == NULL) + return -1; /* wireformat error, incorrect size or inet family */ + + w += sldns_str_print(s, slen, "=%s", ip_str); + data += LDNS_IP4ADDRLEN; + + while ((data_len -= LDNS_IP4ADDRLEN) > 0) { + if (inet_ntop(AF_INET, data, ip_str, sizeof(ip_str)) == NULL) + return -1; /* wireformat error, incorrect size or inet family */ + + w += sldns_str_print(s, slen, ",%s", ip_str); + data += LDNS_IP4ADDRLEN; + } + } else + return -1; + + return w; +} + +static int sldns_wire2str_svcparam_ipv6hint2str(char** s, + size_t* slen, uint16_t data_len, uint8_t* data) +{ + char ip_str[INET6_ADDRSTRLEN + 1]; + + int w = 0; + + assert(data_len > 0); + + if ((data_len % LDNS_IP6ADDRLEN) == 0) { + if (inet_ntop(AF_INET6, data, ip_str, sizeof(ip_str)) == NULL) + return -1; /* wireformat error, incorrect size or inet family */ + + w += sldns_str_print(s, slen, "=%s", ip_str); + data += LDNS_IP6ADDRLEN; + + while ((data_len -= LDNS_IP6ADDRLEN) > 0) { + if (inet_ntop(AF_INET6, data, ip_str, sizeof(ip_str)) == NULL) + return -1; /* wireformat error, incorrect size or inet family */ + + w += sldns_str_print(s, slen, ",%s", ip_str); + data += LDNS_IP6ADDRLEN; + } + } else + return -1; + + return w; +} + +static int sldns_wire2str_svcparam_mandatory2str(char** s, + size_t* slen, uint16_t data_len, uint8_t* data) +{ + int w = 0; + + assert(data_len > 0); + + if (data_len % sizeof(uint16_t)) + return -1; // wireformat error, data_len must be multiple of shorts + w += sldns_str_print(s, slen, "="); + w += sldns_print_svcparamkey(s, slen, sldns_read_uint16(data)); + data += 2; + + while ((data_len -= sizeof(uint16_t))) { + w += sldns_str_print(s, slen, ","); + w += sldns_print_svcparamkey(s, slen, sldns_read_uint16(data)); + data += 2; + } + + return w; +} + +static int sldns_wire2str_svcparam_alpn2str(char** s, + size_t* slen, uint16_t data_len, uint8_t* data) +{ + uint8_t *dp = (void *)data; + int w = 0; + + assert(data_len > 0); /* Guaranteed by sldns_wire2str_svcparam_scan */ + + w += sldns_str_print(s, slen, "=\""); + while (data_len) { + /* alpn is list of length byte (str_len) followed by a string of that size */ + uint8_t i, str_len = *dp++; + + if (str_len > --data_len) + return -1; + + for (i = 0; i < str_len; i++) { + if (dp[i] == '"' || dp[i] == '\\') + w += sldns_str_print(s, slen, "\\\\\\%c", dp[i]); + + else if (dp[i] == ',') + w += sldns_str_print(s, slen, "\\\\%c", dp[i]); + + else if (!isprint(dp[i])) + w += sldns_str_print(s, slen, "\\%03u", (unsigned) dp[i]); + + else + w += sldns_str_print(s, slen, "%c", dp[i]); + } + dp += str_len; + if ((data_len -= str_len)) + w += sldns_str_print(s, slen, "%s", ","); + } + w += sldns_str_print(s, slen, "\""); + + return w; +} + +static int sldns_wire2str_svcparam_ech2str(char** s, + size_t* slen, uint16_t data_len, uint8_t* data) +{ + int size; + int w = 0; + + assert(data_len > 0); /* Guaranteed by sldns_wire2str_svcparam_scan */ + + w += sldns_str_print(s, slen, "=\""); + + if ((size = sldns_b64_ntop(data, data_len, *s, *slen)) < 0) + return -1; + + (*s) += size; + (*slen) -= size; + + w += sldns_str_print(s, slen, "\""); + + return w + size; +} + +int sldns_wire2str_svcparam_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen) +{ + uint8_t ch; + uint16_t svcparamkey, data_len; + int written_chars = 0; + int r, i; + + /* verify that we have enough data to read svcparamkey and data_len */ + if(*dlen < 4) + return -1; + + svcparamkey = sldns_read_uint16(*d); + data_len = sldns_read_uint16(*d+2); + *d += 4; + *dlen -= 4; + + /* verify that we have data_len data */ + if (data_len > *dlen) + return -1; + + written_chars += sldns_print_svcparamkey(s, slen, svcparamkey); + if (!data_len) { + + /* Some SvcParams MUST have values */ + switch (svcparamkey) { + case SVCB_KEY_ALPN: + case SVCB_KEY_PORT: + case SVCB_KEY_IPV4HINT: + case SVCB_KEY_IPV6HINT: + case SVCB_KEY_MANDATORY: + return -1; + default: + return written_chars; + } + } + + switch (svcparamkey) { + case SVCB_KEY_PORT: + r = sldns_wire2str_svcparam_port2str(s, slen, data_len, *d); + break; + case SVCB_KEY_IPV4HINT: + r = sldns_wire2str_svcparam_ipv4hint2str(s, slen, data_len, *d); + break; + case SVCB_KEY_IPV6HINT: + r = sldns_wire2str_svcparam_ipv6hint2str(s, slen, data_len, *d); + break; + case SVCB_KEY_MANDATORY: + r = sldns_wire2str_svcparam_mandatory2str(s, slen, data_len, *d); + break; + case SVCB_KEY_NO_DEFAULT_ALPN: + return -1; /* wireformat error, should not have a value */ + case SVCB_KEY_ALPN: + r = sldns_wire2str_svcparam_alpn2str(s, slen, data_len, *d); + break; + case SVCB_KEY_ECH: + r = sldns_wire2str_svcparam_ech2str(s, slen, data_len, *d); + break; + default: + r = sldns_str_print(s, slen, "=\""); + + for (i = 0; i < data_len; i++) { + ch = (*d)[i]; + + if (ch == '"' || ch == '\\') + r += sldns_str_print(s, slen, "\\%c", ch); + + else if (!isprint(ch)) + r += sldns_str_print(s, slen, "\\%03u", (unsigned) ch); + + else + r += sldns_str_print(s, slen, "%c", ch); + + } + r += sldns_str_print(s, slen, "\""); + break; + } + if (r <= 0) + return -1; /* wireformat error */ + + written_chars += r; + *d += data_len; + *dlen -= data_len; + return written_chars; +} + int sldns_wire2str_rdf_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen, int rdftype, uint8_t* pkt, size_t pktlen, int* comprloop) { @@ -1017,6 +1294,8 @@ int sldns_wire2str_rdf_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen, return sldns_wire2str_tag_scan(d, dlen, s, slen); case LDNS_RDF_TYPE_LONG_STR: return sldns_wire2str_long_str_scan(d, dlen, s, slen); + case LDNS_RDF_TYPE_SVCPARAM: + return sldns_wire2str_svcparam_scan(d, dlen, s, slen); case LDNS_RDF_TYPE_TSIGERROR: return sldns_wire2str_tsigerror_scan(d, dlen, s, slen); } diff --git a/sbin/unwind/libunbound/sldns/wire2str.h b/sbin/unwind/libunbound/sldns/wire2str.h index 0167fe7c1e2..b1ad459e378 100644 --- a/sbin/unwind/libunbound/sldns/wire2str.h +++ b/sbin/unwind/libunbound/sldns/wire2str.h @@ -495,6 +495,18 @@ int sldns_wire2str_dname_buf(uint8_t* dname, size_t dname_len, char* str, size_t len); /** + * Convert wire SVCB to a string with user buffer. + * @param d: the SVCB data in uncompressed wireformat. + * @param dlen: length of the SVCB data. + * @param s: the string to write to. + * @param slen: length of string. + * @return the number of characters for this element, excluding zerobyte. + * Is larger or equal than str_len if output was truncated. + */ +int sldns_wire2str_svcparam_scan(uint8_t** d, size_t* dlen, char** s, + size_t* slen); + +/** * Scan wireformat rdf field to string, with user buffers. * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). * @param data: wireformat data. diff --git a/sbin/unwind/libunbound/util/config_file.c b/sbin/unwind/libunbound/util/config_file.c index 2fb8d0d2acc..4725e7db68d 100644 --- a/sbin/unwind/libunbound/util/config_file.c +++ b/sbin/unwind/libunbound/util/config_file.c @@ -105,11 +105,14 @@ config_create(void) cfg->do_ip6 = 1; cfg->do_udp = 1; cfg->do_tcp = 1; + cfg->tcp_reuse_timeout = 60 * 1000; /* 60s in milisecs */ + cfg->max_reuse_tcp_queries = 200; cfg->tcp_upstream = 0; cfg->udp_upstream_without_downstream = 0; cfg->tcp_mss = 0; cfg->outgoing_tcp_mss = 0; cfg->tcp_idle_timeout = 30 * 1000; /* 30s in millisecs */ + cfg->tcp_auth_query_timeout = 3 * 1000; /* 3s in millisecs */ cfg->do_tcp_keepalive = 0; cfg->tcp_keepalive_timeout = 120 * 1000; /* 120s in millisecs */ cfg->ssl_service_key = NULL; @@ -235,8 +238,10 @@ config_create(void) cfg->hide_identity = 0; cfg->hide_version = 0; cfg->hide_trustanchor = 0; + cfg->hide_http_user_agent = 0; cfg->identity = NULL; cfg->version = NULL; + cfg->http_user_agent = NULL; cfg->nsid_cfg_str = NULL; cfg->nsid = NULL; cfg->nsid_len = 0; @@ -250,6 +255,7 @@ config_create(void) cfg->val_date_override = 0; cfg->val_sig_skew_min = 3600; /* at least daylight savings trouble */ cfg->val_sig_skew_max = 86400; /* at most timezone settings trouble */ + cfg->val_max_restart = 5; cfg->val_clean_additional = 1; cfg->val_log_level = 0; cfg->val_log_squelch = 0; @@ -262,6 +268,7 @@ config_create(void) cfg->serve_expired_reply_ttl = 30; cfg->serve_expired_client_timeout = 0; cfg->serve_original_ttl = 0; + cfg->zonemd_permissive_mode = 0; cfg->add_holddown = 30*24*3600; cfg->del_holddown = 30*24*3600; cfg->keep_missing = 366*24*3600; /* one year plus a little leeway */ @@ -305,7 +312,7 @@ config_create(void) if(!(cfg->module_conf = strdup("validator iterator"))) goto error_exit; #endif if(!(cfg->val_nsec3_key_iterations = - strdup("1024 150 2048 500 4096 2500"))) goto error_exit; + strdup("1024 150 2048 150 4096 150"))) goto error_exit; #if defined(DNSTAP_SOCKET_PATH) if(!(cfg->dnstap_socket_path = strdup(DNSTAP_SOCKET_PATH))) goto error_exit; @@ -516,7 +523,10 @@ int config_set_option(struct config_file* cfg, const char* opt, udp_upstream_without_downstream) else S_NUMBER_NONZERO("tcp-mss:", tcp_mss) else S_NUMBER_NONZERO("outgoing-tcp-mss:", outgoing_tcp_mss) + else S_NUMBER_NONZERO("tcp-auth-query-timeout:", tcp_auth_query_timeout) else S_NUMBER_NONZERO("tcp-idle-timeout:", tcp_idle_timeout) + else S_NUMBER_NONZERO("max-reuse-tcp-queries:", max_reuse_tcp_queries) + else S_NUMBER_NONZERO("tcp-reuse-timeout:", tcp_reuse_timeout) else S_YNO("edns-tcp-keepalive:", do_tcp_keepalive) else S_NUMBER_NONZERO("edns-tcp-keepalive-timeout:", tcp_keepalive_timeout) else S_YNO("ssl-upstream:", ssl_upstream) @@ -587,8 +597,10 @@ int config_set_option(struct config_file* cfg, const char* opt, else S_YNO("hide-identity:", hide_identity) else S_YNO("hide-version:", hide_version) else S_YNO("hide-trustanchor:", hide_trustanchor) + else S_YNO("hide-http-user-agent:", hide_http_user_agent) else S_STR("identity:", identity) else S_STR("version:", version) + else S_STR("http-user-agent:", http_user_agent) else if(strcmp(opt, "nsid:") == 0) { free(cfg->nsid_cfg_str); if (!(cfg->nsid_cfg_str = strdup(val))) @@ -649,6 +661,7 @@ int config_set_option(struct config_file* cfg, const char* opt, else S_NUMBER_OR_ZERO("serve-expired-client-timeout:", serve_expired_client_timeout) else S_YNO("serve-original-ttl:", serve_original_ttl) else S_STR("val-nsec3-keysize-iterations:", val_nsec3_key_iterations) + else S_YNO("zonemd-permissive-mode:", zonemd_permissive_mode) else S_UNSIGNED_OR_ZERO("add-holddown:", add_holddown) else S_UNSIGNED_OR_ZERO("del-holddown:", del_holddown) else S_UNSIGNED_OR_ZERO("keep-missing:", keep_missing) @@ -756,12 +769,14 @@ int config_set_option(struct config_file* cfg, const char* opt, #endif else if(strcmp(opt, "define-tag:") ==0) { return config_add_tag(cfg, val); - /* val_sig_skew_min and max are copied into val_env during init, - * so this does not update val_env with set_option */ + /* val_sig_skew_min, max and val_max_restart are copied into val_env + * during init so this does not update val_env with set_option */ } else if(strcmp(opt, "val-sig-skew-min:") == 0) { IS_NUMBER_OR_ZERO; cfg->val_sig_skew_min = (int32_t)atoi(val); } else if(strcmp(opt, "val-sig-skew-max:") == 0) { IS_NUMBER_OR_ZERO; cfg->val_sig_skew_max = (int32_t)atoi(val); } + else if(strcmp(opt, "val-max-restart:") == 0) + { IS_NUMBER_OR_ZERO; cfg->val_max_restart = (int32_t)atoi(val); } else if (strcmp(opt, "outgoing-interface:") == 0) { char* d = strdup(val); char** oi = @@ -1005,7 +1020,10 @@ config_get_option(struct config_file* cfg, const char* opt, else O_YNO(opt, "udp-upstream-without-downstream", udp_upstream_without_downstream) else O_DEC(opt, "tcp-mss", tcp_mss) else O_DEC(opt, "outgoing-tcp-mss", outgoing_tcp_mss) + else O_DEC(opt, "tcp-auth-query-timeout", tcp_auth_query_timeout) else O_DEC(opt, "tcp-idle-timeout", tcp_idle_timeout) + else O_DEC(opt, "max-reuse-tcp-queries", max_reuse_tcp_queries) + else O_DEC(opt, "tcp-reuse-timeout", tcp_reuse_timeout) else O_YNO(opt, "edns-tcp-keepalive", do_tcp_keepalive) else O_DEC(opt, "edns-tcp-keepalive-timeout", tcp_keepalive_timeout) else O_YNO(opt, "ssl-upstream", ssl_upstream) @@ -1041,8 +1059,10 @@ config_get_option(struct config_file* cfg, const char* opt, else O_YNO(opt, "hide-identity", hide_identity) else O_YNO(opt, "hide-version", hide_version) else O_YNO(opt, "hide-trustanchor", hide_trustanchor) + else O_YNO(opt, "hide-http-user-agent", hide_http_user_agent) else O_STR(opt, "identity", identity) else O_STR(opt, "version", version) + else O_STR(opt, "http-user-agent", http_user_agent) else O_STR(opt, "nsid", nsid_cfg_str) else O_STR(opt, "target-fetch-policy", target_fetch_policy) else O_YNO(opt, "harden-short-bufsize", harden_short_bufsize) @@ -1070,6 +1090,7 @@ config_get_option(struct config_file* cfg, const char* opt, else O_DEC(opt, "serve-expired-client-timeout", serve_expired_client_timeout) else O_YNO(opt, "serve-original-ttl", serve_original_ttl) else O_STR(opt, "val-nsec3-keysize-iterations",val_nsec3_key_iterations) + else O_YNO(opt, "zonemd-permissive-mode", zonemd_permissive_mode) else O_UNS(opt, "add-holddown", add_holddown) else O_UNS(opt, "del-holddown", del_holddown) else O_UNS(opt, "keep-missing", keep_missing) @@ -1178,6 +1199,7 @@ config_get_option(struct config_file* cfg, const char* opt, else O_DEC(opt, "fast-server-permil", fast_server_permil) else O_DEC(opt, "val-sig-skew-min", val_sig_skew_min) else O_DEC(opt, "val-sig-skew-max", val_sig_skew_max) + else O_DEC(opt, "val-max-restart", val_max_restart) else O_YNO(opt, "qname-minimisation", qname_minimisation) else O_YNO(opt, "qname-minimisation-strict", qname_minimisation_strict) else O_IFC(opt, "define-tag", num_tags, tagname) @@ -1516,6 +1538,7 @@ config_delete(struct config_file* cfg) #endif free(cfg->identity); free(cfg->version); + free(cfg->http_user_agent); free(cfg->nsid_cfg_str); free(cfg->nsid); free(cfg->module_conf); @@ -1681,6 +1704,37 @@ int cfg_condense_ports(struct config_file* cfg, int** avail) return num; } +void cfg_apply_local_port_policy(struct config_file* cfg, int num) { +(void)cfg; +(void)num; +#ifdef USE_LINUX_IP_LOCAL_PORT_RANGE + { + int i = 0; + FILE* range_fd; + if ((range_fd = fopen(LINUX_IP_LOCAL_PORT_RANGE_PATH, "r")) != NULL) { + int min_port = 0; + int max_port = num - 1; + if (fscanf(range_fd, "%d %d", &min_port, &max_port) == 2) { + for(i=0; i<min_port; i++) { + cfg->outgoing_avail_ports[i] = 0; + } + for(i=max_port+1; i<num; i++) { + cfg->outgoing_avail_ports[i] = 0; + } + } else { + log_err("unexpected port range in %s", + LINUX_IP_LOCAL_PORT_RANGE_PATH); + } + fclose(range_fd); + } else { + log_err("failed to read from file: %s (%s)", + LINUX_IP_LOCAL_PORT_RANGE_PATH, + strerror(errno)); + } + } +#endif +} + /** print error with file and line number */ static void ub_c_error_va_list(const char *fmt, va_list args) { @@ -2605,3 +2659,27 @@ int options_remote_is_address(struct config_file* cfg) return (cfg->control_ifs.first->str[0] != '/'); } +/** see if interface is https, its port number == the https port number */ +int +if_is_https(const char* ifname, const char* port, int https_port) +{ + char* p = strchr(ifname, '@'); + if(!p && atoi(port) == https_port) + return 1; + if(p && atoi(p+1) == https_port) + return 1; + return 0; +} + +/** see if config contains https turned on */ +int cfg_has_https(struct config_file* cfg) +{ + int i; + char portbuf[32]; + snprintf(portbuf, sizeof(portbuf), "%d", cfg->port); + for(i = 0; i<cfg->num_ifs; i++) { + if(if_is_https(cfg->ifs[i], portbuf, cfg->https_port)) + return 1; + } + return 0; +} diff --git a/sbin/unwind/libunbound/util/config_file.h b/sbin/unwind/libunbound/util/config_file.h index 7cf27cc2c3e..aed6812dafe 100644 --- a/sbin/unwind/libunbound/util/config_file.h +++ b/sbin/unwind/libunbound/util/config_file.h @@ -93,6 +93,12 @@ struct config_file { int do_udp; /** do tcp query support. */ int do_tcp; + /** max number of queries on a reuse connection. */ + size_t max_reuse_tcp_queries; + /** timeout for REUSE entries in milliseconds. */ + int tcp_reuse_timeout; + /** timeout in milliseconds for TCP queries to auth servers. */ + int tcp_auth_query_timeout; /** tcp upstream queries (no UDP upstream queries) */ int tcp_upstream; /** udp upstream enabled when no UDP downstream is enabled (do_udp no)*/ @@ -334,10 +340,14 @@ struct config_file { int hide_version; /** do not report trustanchor (trustanchor.unbound) */ int hide_trustanchor; + /** do not report the User-Agent HTTP header */ + int hide_http_user_agent; /** identity, hostname is returned if "". */ char* identity; /** version, package version returned if "". */ char* version; + /** User-Agent for HTTP header */ + char* http_user_agent; /** nsid */ char *nsid_cfg_str; uint8_t *nsid; @@ -367,6 +377,8 @@ struct config_file { int32_t val_sig_skew_min; /** the maximum for signature clock skew */ int32_t val_sig_skew_max; + /** max number of query restarts, number of IPs to probe */ + int32_t val_max_restart; /** this value sets the number of seconds before revalidating bogus */ int bogus_ttl; /** should validator clean additional section for secure msgs */ @@ -396,6 +408,8 @@ struct config_file { int serve_original_ttl; /** nsec3 maximum iterations per key size, string */ char* val_nsec3_key_iterations; + /** if zonemd failures are permitted, only logged */ + int zonemd_permissive_mode; /** autotrust add holddown time, in seconds */ unsigned int add_holddown; /** autotrust del holddown time, in seconds */ @@ -727,6 +741,10 @@ struct config_auth { /** Always reply with this CNAME target if the cname override action is * used */ char* rpz_cname; + /** Check ZONEMD records for this zone */ + int zonemd_check; + /** Reject absence of ZONEMD records, zone must have one */ + int zonemd_reject_absence; }; /** @@ -1173,6 +1191,13 @@ int cfg_mark_ports(const char* str, int allow, int* avail, int num); int cfg_condense_ports(struct config_file* cfg, int** avail); /** + * Apply system specific port range policy. + * @param cfg: config file. + * @param num: size of the array (65536). + */ +void cfg_apply_local_port_policy(struct config_file* cfg, int num); + +/** * Scan ports available * @param avail: the array from cfg. * @param num: size of the array (65536). @@ -1301,5 +1326,19 @@ void w_config_adjust_directory(struct config_file* cfg); /** debug option for unit tests. */ extern int fake_dsa, fake_sha1; +/** see if interface is https, its port number == the https port number */ +int if_is_https(const char* ifname, const char* port, int https_port); + +/** + * Return true if the config contains settings that enable https. + * @param cfg: config information. + * @return true if https ports are used for server. + */ +int cfg_has_https(struct config_file* cfg); + +#ifdef USE_LINUX_IP_LOCAL_PORT_RANGE +#define LINUX_IP_LOCAL_PORT_RANGE_PATH "/proc/sys/net/ipv4/ip_local_port_range" +#endif + #endif /* UTIL_CONFIG_FILE_H */ diff --git a/sbin/unwind/libunbound/util/configlexer.c b/sbin/unwind/libunbound/util/configlexer.c index 6b0f3350839..186860b471f 100644 --- a/sbin/unwind/libunbound/util/configlexer.c +++ b/sbin/unwind/libunbound/util/configlexer.c @@ -5,7 +5,7 @@ #define YY_INT_ALIGNED short int -/* $OpenBSD: configlexer.c,v 1.10 2021/03/16 18:38:05 florian Exp $ */ +/* $OpenBSD: configlexer.c,v 1.11 2021/08/14 07:32:46 florian Exp $ */ /* A lexical scanner generated by flex */ @@ -27,7 +27,7 @@ /* end standard C headers. */ -/* $OpenBSD: configlexer.c,v 1.10 2021/03/16 18:38:05 florian Exp $ */ +/* $OpenBSD: configlexer.c,v 1.11 2021/08/14 07:32:46 florian Exp $ */ /* flex integer type definitions */ @@ -368,8 +368,8 @@ static void yy_fatal_error (yyconst char msg[] ); *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 343 -#define YY_END_OF_BUFFER 344 +#define YY_NUM_RULES 352 +#define YY_END_OF_BUFFER 353 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -377,377 +377,391 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[3354] = +static yyconst flex_int16_t yy_accept[3484] = { 0, - 1, 1, 317, 317, 321, 321, 325, 325, 329, 329, - 1, 1, 333, 333, 337, 337, 344, 341, 1, 315, - 315, 342, 2, 342, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 317, 318, 318, 319, - 342, 321, 322, 322, 323, 342, 328, 325, 326, 326, - 327, 342, 329, 330, 330, 331, 342, 340, 316, 2, - 320, 342, 340, 336, 333, 334, 334, 335, 342, 337, - 338, 338, 339, 342, 341, 0, 1, 2, 2, 2, - 2, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 317, - 0, 321, 0, 328, 0, 325, 329, 0, 340, 0, - 2, 2, 340, 336, 0, 333, 337, 0, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 340, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 125, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 134, - 341, 341, 341, 341, 341, 341, 341, 340, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 109, 341, 314, 341, - 341, 341, 341, 341, 341, 341, 8, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 126, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 139, 341, 340, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 307, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 340, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 64, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 239, 341, 14, 15, 341, 19, 18, 341, 341, 223, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 132, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 221, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 3, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 340, 341, 341, 341, 341, 341, 341, 341, 301, 341, - 341, 300, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 324, - 341, 341, 341, 341, 341, 341, 341, 341, 63, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 67, 341, 270, 341, 341, - - 341, 341, 341, 341, 341, 341, 308, 309, 341, 341, - 341, 341, 341, 341, 341, 68, 341, 341, 133, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 129, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 210, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 21, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 158, 341, 341, 340, 324, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 107, 341, 341, 341, 341, 341, 341, 341, 278, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 182, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 157, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 106, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 32, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 33, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 65, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 131, 340, 341, 341, - - 341, 341, 341, 124, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 66, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 243, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 183, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 54, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 261, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 58, 341, 59, - 341, 341, 341, 341, 341, 110, 341, 111, 341, 341, - 341, 341, 108, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 7, 341, 340, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 232, 341, 341, 341, 341, 160, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 244, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 45, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 55, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 202, 341, 201, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 16, 17, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 69, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 209, 341, 341, 341, - 341, 341, 341, 113, 341, 112, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 193, 341, - - 341, 341, 341, 341, 341, 341, 341, 140, 340, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 101, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 89, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 222, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 94, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 62, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 196, 197, 341, 341, 341, - 272, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 6, 341, 341, 341, 341, 341, 341, - 291, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 276, 341, - 341, 341, 341, 341, 341, 302, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 42, 341, 341, - 341, 341, 44, 341, 341, 341, 90, 341, 341, 341, - - 341, 341, 52, 341, 341, 341, 341, 341, 341, 341, - 340, 341, 189, 341, 341, 341, 135, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 214, 341, 190, - 341, 341, 341, 229, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 53, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 137, 118, 341, 119, 341, - 341, 341, 117, 341, 341, 341, 341, 341, 341, 341, - 341, 155, 341, 341, 50, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 260, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 191, 341, 341, 341, 341, 341, 194, 341, 200, - 341, 341, 341, 341, 341, 228, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 105, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 130, 341, 341, 341, 341, 341, 341, 341, 60, - 341, 341, 341, 26, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 20, 341, 341, 341, 341, 341, 341, - 27, 36, 341, 165, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 340, 341, 341, - 341, 341, 341, 341, 77, 79, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 280, - 341, 341, 341, 341, 240, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 120, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 154, 341, 46, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 295, 341, 341, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 159, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 289, 341, 341, 341, 220, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 305, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 176, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 114, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 171, - 341, 184, 341, 341, 341, 341, 340, 341, 143, 341, - 341, 341, 341, 341, 100, 341, 341, 341, 341, 212, - - 341, 341, 341, 341, 341, 341, 230, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 252, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 136, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 175, - 341, 341, 341, 341, 341, 341, 80, 341, 81, 341, - 341, 341, 341, 341, 61, 298, 341, 341, 341, 341, - 341, 88, 185, 341, 203, 341, 233, 341, 341, 195, - 273, 341, 341, 341, 341, 341, 73, 341, 187, 341, - 341, 341, 341, 341, 9, 341, 341, 341, 341, 341, - - 104, 341, 341, 341, 341, 265, 341, 341, 341, 341, - 211, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 340, 341, 341, - 341, 341, 174, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 161, 341, 279, 341, 341, 341, 341, - 341, 251, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 224, 341, 341, 341, 341, 341, 271, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 299, 341, 186, 341, 341, 341, 341, 341, 341, 341, - 72, 74, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 103, 341, 341, 341, 341, 263, 341, 341, 341, - 341, 275, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 216, 34, 28, 30, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 35, 341, 29, - 31, 341, 341, 341, 341, 341, 341, 341, 341, 99, - - 341, 341, 341, 341, 341, 341, 340, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 218, 215, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 71, 341, - 341, 341, 138, 341, 121, 341, 341, 341, 341, 341, - 341, 341, 341, 156, 47, 341, 341, 341, 332, 13, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 293, 341, 296, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 12, 341, 341, 22, 341, 341, 341, - 341, 341, 269, 341, 341, 341, 341, 277, 341, 341, - - 341, 75, 341, 226, 341, 341, 341, 341, 341, 217, - 341, 341, 70, 341, 341, 341, 341, 23, 341, 43, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 170, 169, 332, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 219, 213, 341, 231, 341, 341, - 281, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 82, 341, 341, 341, 341, 264, 341, - 341, 341, 341, 199, 341, 341, 341, 341, 225, 341, - - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 303, 304, 167, 341, 341, 76, 341, 341, 341, 341, - 177, 341, 341, 341, 115, 116, 341, 341, 341, 341, - 162, 341, 164, 341, 204, 341, 341, 341, 341, 168, - 341, 341, 234, 341, 341, 341, 341, 341, 341, 341, - 145, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 242, 341, 341, 341, 341, 341, 341, - 341, 312, 341, 24, 341, 274, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 86, 205, 341, 341, 262, 341, 297, 341, 198, 341, - - 341, 341, 341, 56, 341, 341, 341, 341, 341, 341, - 4, 341, 341, 341, 341, 128, 144, 341, 341, 341, - 181, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 237, 37, 38, 341, - 341, 341, 341, 341, 341, 341, 282, 341, 341, 341, - 341, 341, 341, 341, 250, 341, 341, 341, 341, 341, - 341, 341, 341, 208, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 85, 341, 57, 268, - 341, 238, 341, 341, 341, 341, 11, 341, 341, 341, - 341, 341, 341, 341, 341, 127, 341, 341, 341, 341, - - 206, 91, 341, 40, 341, 341, 341, 341, 341, 341, - 341, 341, 173, 341, 341, 341, 341, 341, 147, 341, - 341, 341, 341, 241, 341, 341, 341, 341, 341, 249, - 341, 341, 341, 341, 141, 341, 341, 341, 122, 123, - 341, 341, 341, 93, 97, 92, 341, 341, 341, 341, - 83, 341, 341, 341, 341, 341, 10, 341, 341, 341, - 341, 341, 266, 306, 341, 341, 341, 341, 311, 39, - 341, 341, 341, 341, 341, 172, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 98, - - 96, 341, 51, 341, 341, 84, 294, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 192, 341, 341, 341, - 341, 341, 207, 341, 341, 341, 341, 341, 341, 341, - 341, 163, 78, 341, 341, 341, 341, 341, 283, 341, - 341, 341, 341, 341, 341, 341, 246, 341, 341, 245, - 142, 341, 341, 95, 48, 341, 148, 149, 152, 153, - 150, 151, 87, 292, 341, 341, 267, 341, 341, 341, - 341, 166, 341, 341, 341, 341, 341, 236, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 179, 178, - - 41, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 290, 341, 341, 341, 341, 102, 341, - 235, 341, 259, 287, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 313, 341, 49, 5, 341, - 341, 227, 341, 341, 288, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 247, 25, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 248, 341, - 341, 341, 146, 341, 341, 341, 341, 341, 341, 341, - 341, 180, 341, 188, 341, 341, 341, 341, 341, 341, - - 341, 341, 341, 284, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 310, 341, 341, 255, 341, 341, 341, 341, 341, - 285, 341, 341, 341, 341, 341, 341, 286, 341, 341, - 341, 253, 341, 256, 257, 341, 341, 341, 341, 341, - 254, 258, 0 + 1, 1, 326, 326, 330, 330, 334, 334, 338, 338, + 1, 1, 342, 342, 346, 346, 353, 350, 1, 324, + 324, 351, 2, 351, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 326, 327, 327, 328, + 351, 330, 331, 331, 332, 351, 337, 334, 335, 335, + 336, 351, 338, 339, 339, 340, 351, 349, 325, 2, + 329, 351, 349, 345, 342, 343, 343, 344, 351, 346, + 347, 347, 348, 351, 350, 0, 1, 2, 2, 2, + 2, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 326, + 0, 330, 0, 337, 0, 334, 338, 0, 349, 0, + 2, 2, 349, 345, 0, 342, 346, 0, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 349, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 128, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 137, + 350, 350, 350, 350, 350, 350, 350, 349, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 112, 350, 323, + 350, 350, 350, 350, 350, 350, 350, 8, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 129, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 142, 350, 350, 349, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 316, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 349, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 67, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 248, 350, 14, 15, 350, 19, 18, 350, + 350, 232, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 135, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 230, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 3, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 349, + 350, 350, 350, 350, 350, 350, 350, 310, 350, 350, + 309, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 333, 350, 350, 350, 350, 350, 350, 350, 350, 66, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 70, 350, 279, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 317, 318, + 350, 350, 350, 350, 350, 350, 350, 71, 350, 350, + 136, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 132, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 219, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 21, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 162, + 350, 350, 350, 350, 350, 349, 333, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 110, 350, + 350, 350, 350, 350, 350, 350, 287, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 188, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 161, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 109, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 35, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 36, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 68, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 134, 350, 350, 350, 349, 350, 350, 350, 350, 350, + 127, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 69, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 252, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 189, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 57, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 270, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 61, 350, 62, + + 350, 350, 350, 350, 350, 113, 350, 114, 350, 350, + 350, 350, 111, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 7, 350, 350, 350, 350, + 349, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 241, + 350, 350, 350, 350, 165, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 253, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 48, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 58, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 211, 350, 210, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 16, 17, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 72, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 218, 350, 350, 350, 350, + 350, 350, 116, 350, 115, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 202, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 143, + 350, 350, 350, 349, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 104, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 92, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 231, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 97, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 65, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 205, 206, 350, 350, 350, 281, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 6, 350, 350, 350, 350, 350, 350, 300, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 285, 350, 350, 350, + 350, 350, 350, 311, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 45, 350, 350, + 350, 350, 47, 350, 350, 350, 93, 350, 350, 350, + 350, 350, 55, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 349, 350, 198, 350, 350, 350, + 138, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 223, 350, 199, 350, 350, 350, 238, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 56, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 140, + 121, 350, 122, 350, 350, 350, 120, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 158, 350, 350, 53, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 269, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 200, 350, 350, + 350, 350, 350, 203, 350, 209, 350, 350, 350, 350, + 350, 350, 237, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 108, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 133, 350, + 350, 350, 350, 350, 350, 350, 63, 350, 350, 350, + 29, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 20, 350, 350, 350, 350, 350, 350, 30, + 39, 350, 170, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 196, 350, 350, + 349, 350, 350, 350, 350, 350, 350, 80, 82, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 289, 350, 350, 350, 350, 249, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 123, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 157, 350, 49, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 304, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 164, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 298, + + 350, 350, 350, 229, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 314, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 182, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 117, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 177, 350, 190, + 350, 350, 350, 350, 350, 350, 350, 349, 350, 146, + 350, 350, 350, 350, 350, 103, 350, 350, 350, 350, + 221, 350, 350, 350, 350, 350, 350, 239, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 261, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 139, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 181, 350, 350, 350, 350, 350, 350, 83, + 350, 84, 350, 350, 350, 350, 350, 64, 307, 350, + 350, 350, 350, 350, 91, 191, 350, 212, 350, 242, + 350, 350, 204, 282, 350, 350, 350, 350, 350, 350, + 76, 350, 193, 350, 350, 350, 350, 350, 9, 350, + 350, 350, 350, 350, 107, 350, 350, 350, 350, 274, + 350, 350, 350, 350, 220, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 349, 350, 350, 350, + 350, 180, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 166, 350, 288, 350, 350, 350, 350, 350, + 260, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 233, 350, 350, 350, 350, 350, 280, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 163, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 308, 350, 192, 350, 350, 350, 350, 350, 350, + 350, 350, 75, 77, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 106, 350, 350, 350, 350, 272, 350, + 350, 350, 350, 284, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 225, 37, 31, 33, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 38, 350, 32, 34, 350, 350, 350, 350, 350, + 350, 350, 350, 102, 350, 176, 350, 350, 350, 350, + + 350, 350, 350, 349, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 227, 224, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 74, 350, 350, 350, 141, + 350, 124, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 159, 50, 350, 350, 350, 341, 13, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 302, 350, + 305, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 12, 350, 350, 22, 350, 350, 350, 350, + 350, 278, 350, 350, 350, 350, 286, 350, 350, 350, + + 78, 350, 235, 350, 350, 350, 350, 350, 226, 350, + 350, 73, 350, 350, 350, 350, 350, 23, 350, 350, + 46, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 175, 174, 350, 350, 341, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 228, 222, 350, + 240, 350, 350, 290, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 85, 350, 350, + 350, 350, 273, 350, 350, 350, 350, 208, 350, 350, + + 350, 350, 350, 234, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 312, 313, 172, 350, 350, + 79, 350, 350, 350, 350, 183, 350, 350, 350, 118, + 119, 350, 350, 350, 25, 350, 350, 167, 350, 169, + 350, 213, 350, 350, 350, 350, 173, 350, 350, 350, + 350, 243, 350, 350, 350, 350, 350, 350, 350, 148, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 251, 350, 350, 350, 350, 350, 350, 350, + 321, 350, 27, 350, 283, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + + 89, 214, 350, 350, 271, 350, 306, 350, 207, 350, + 350, 350, 350, 350, 59, 350, 350, 350, 350, 350, + 350, 4, 350, 350, 350, 350, 131, 147, 350, 350, + 350, 187, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 246, 40, 41, 350, 350, 350, 350, 350, 350, 350, + 291, 350, 350, 350, 350, 350, 350, 350, 259, 350, + 350, 350, 350, 350, 350, 350, 350, 217, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 88, 350, 60, 277, 350, 247, 350, 350, 350, + + 350, 350, 11, 350, 350, 350, 350, 350, 350, 350, + 350, 130, 350, 350, 350, 350, 215, 94, 350, 350, + 43, 350, 350, 350, 350, 350, 350, 350, 350, 179, + 350, 350, 350, 350, 350, 350, 350, 150, 350, 350, + 350, 350, 250, 350, 350, 350, 350, 350, 258, 350, + 350, 350, 350, 144, 350, 350, 350, 125, 126, 350, + 350, 350, 96, 100, 95, 160, 350, 350, 350, 350, + 86, 350, 350, 350, 350, 350, 350, 10, 350, 350, + 350, 350, 350, 275, 315, 350, 350, 350, 350, 350, + 320, 42, 350, 350, 350, 350, 350, 178, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 101, 99, 350, 54, 350, 350, 87, + 303, 350, 350, 350, 350, 24, 350, 350, 350, 350, + 350, 201, 350, 350, 350, 350, 350, 216, 350, 350, + 350, 350, 350, 350, 350, 350, 197, 350, 350, 168, + 81, 350, 350, 350, 350, 350, 292, 350, 350, 350, + 350, 350, 350, 350, 255, 350, 350, 254, 145, 350, + 350, 98, 51, 350, 151, 152, 155, 156, 153, 154, + 90, 301, 350, 350, 276, 350, 350, 350, 26, 350, + + 171, 350, 350, 350, 350, 195, 350, 245, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 185, 184, + 44, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 299, 350, 350, 350, 350, 105, 350, + 244, 350, 268, 296, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 322, 350, 52, 5, 350, + 350, 236, 350, 350, 297, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 256, 28, 350, 350, 350, 350, + + 350, 350, 350, 350, 350, 350, 350, 350, 257, 350, + 350, 350, 149, 350, 350, 350, 350, 350, 350, 350, + 350, 186, 350, 194, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 293, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 319, 350, 350, 264, 350, 350, 350, 350, 350, + 294, 350, 350, 350, 350, 350, 350, 295, 350, 350, + 350, 262, 350, 265, 266, 350, 350, 350, 350, 350, + 263, 267, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -790,17 +804,17 @@ static yyconst flex_int32_t yy_meta[41] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; -static yyconst flex_int16_t yy_base[3372] = +static yyconst flex_int16_t yy_base[3502] = { 0, 0, 0, 38, 41, 44, 46, 59, 65, 71, 77, - 90, 112, 96, 118, 124, 136, 4327, 4282, 81, 6547, - 6547, 6547, 129, 52, 130, 63, 131, 152, 70, 140, + 90, 112, 96, 118, 124, 136, 5204, 5022, 81, 6793, + 6793, 6793, 129, 52, 130, 63, 131, 152, 70, 140, 149, 156, 57, 88, 76, 173, 175, 95, 197, 145, - 185, 199, 208, 213, 178, 123, 4186, 6547, 6547, 6547, - 107, 4109, 6547, 6547, 6547, 154, 4045, 3722, 6547, 6547, - 6547, 245, 3578, 6547, 6547, 6547, 163, 3220, 6547, 249, - 6547, 253, 148, 2696, 2594, 6547, 6547, 6547, 257, 2157, - 6547, 6547, 6547, 233, 1707, 263, 201, 0, 267, 0, + 185, 199, 208, 213, 178, 123, 4580, 6793, 6793, 6793, + 107, 3835, 6793, 6793, 6793, 154, 3459, 3338, 6793, 6793, + 6793, 245, 3159, 6793, 6793, 6793, 163, 2930, 6793, 249, + 6793, 253, 148, 2502, 2483, 6793, 6793, 6793, 257, 2236, + 6793, 6793, 6793, 233, 1695, 263, 201, 0, 267, 0, 0, 165, 191, 221, 252, 205, 181, 265, 92, 261, 216, 263, 271, 272, 210, 279, 274, 282, 278, 291, @@ -808,8 +822,8 @@ static yyconst flex_int16_t yy_base[3372] = 317, 311, 315, 319, 321, 331, 327, 332, 336, 322, 339, 337, 346, 345, 347, 348, 353, 351, 357, 284, 358, 359, 369, 360, 380, 365, 381, 379, 375, 366, - 367, 389, 390, 394, 393, 395, 396, 403, 404, 1665, - 419, 1172, 422, 924, 429, 854, 832, 433, 781, 437, + 367, 389, 390, 394, 393, 395, 396, 403, 404, 1436, + 419, 1297, 422, 1003, 429, 930, 888, 433, 775, 437, 441, 0, 433, 705, 447, 479, 287, 452, 411, 445, 426, 446, 447, 448, 449, 450, 451, 453, 452, 456, 470, 234, 463, 473, 481, 479, 476, 483, 486, 487, @@ -828,719 +842,749 @@ static yyconst flex_int16_t yy_base[3372] = 697, 700, 708, 704, 713, 712, 721, 716, 722, 719, 731, 732, 727, 717, 728, 729, 733, 736, 730, 740, 738, 741, 745, 743, 750, 752, 760, 755, 756, 771, - 763, 766, 762, 773, 774, 769, 775, 793, 798, 799, - 786, 800, 801, 804, 803, 805, 807, 808, 809, 818, - 811, 823, 815, 824, 825, 829, 836, 834, 6547, 831, - 833, 847, 848, 849, 852, 765, 856, 858, 839, 868, - 864, 861, 870, 892, 865, 878, 869, 871, 874, 6547, - 887, 880, 916, 882, 889, 902, 903, 900, 904, 905, - 917, 910, 933, 850, 914, 922, 943, 939, 925, 938, - - 940, 907, 941, 948, 949, 946, 951, 953, 960, 952, - 957, 959, 971, 961, 970, 972, 965, 974, 980, 985, - 987, 992, 975, 984, 995, 978, 990, 998, 1008, 1003, - 1001, 1009, 1012, 1015, 1023, 1019, 1027, 1028, 1002, 1029, - 1030, 1035, 1031, 1038, 1041, 1039, 1042, 1051, 1049, 1047, - 1048, 1054, 1055, 1056, 1058, 1061, 1064, 1063, 1068, 1072, - 1066, 1073, 1079, 1067, 1085, 1077, 6547, 1089, 6547, 1080, - 1083, 1087, 1092, 1093, 1094, 1095, 6547, 1097, 1100, 1102, - 1105, 1109, 1111, 1110, 1116, 1112, 1123, 1124, 1125, 1128, - 1135, 1130, 1133, 1138, 1137, 1140, 1141, 1144, 1142, 1147, - - 1149, 1148, 1154, 1155, 1158, 1175, 6547, 1157, 1167, 1162, - 1159, 1168, 1169, 1187, 1185, 1188, 1186, 1190, 1203, 1198, - 1204, 1206, 1207, 1160, 1210, 1212, 1214, 1216, 1217, 1218, - 1219, 1221, 1222, 1223, 1225, 1224, 1228, 6547, 1226, 1236, - 1247, 1242, 1245, 1246, 1248, 1249, 1161, 1251, 1250, 1106, - 517, 1253, 1257, 1258, 1259, 1272, 1267, 1270, 1268, 1269, - 1275, 1274, 1276, 1278, 1287, 1283, 1289, 1291, 1299, 1298, - 1301, 1308, 1310, 1303, 1305, 1311, 1307, 1306, 1313, 1315, - 1322, 1316, 1319, 1326, 1329, 1328, 1331, 1335, 1320, 1336, - 1333, 1341, 1342, 1343, 1344, 1351, 1350, 1346, 1358, 1353, - - 1356, 1354, 1352, 1373, 1374, 1363, 1365, 6547, 1381, 1367, - 1382, 1383, 1384, 1388, 1390, 1386, 1392, 1393, 1394, 1396, - 1397, 1399, 1403, 1404, 1405, 1406, 1408, 1419, 1416, 1411, - 1427, 1426, 1428, 1418, 1430, 1432, 1431, 1440, 1438, 1441, - 1439, 1445, 1446, 1453, 1448, 1449, 1454, 1463, 1456, 1455, - 1460, 1458, 1466, 1469, 1468, 1483, 1472, 1480, 1488, 1489, - 1479, 1491, 1481, 1492, 1496, 1497, 1498, 1499, 1501, 1508, - 1503, 1510, 1505, 1509, 1511, 1506, 1522, 1512, 1523, 1526, - 1530, 1513, 1528, 1531, 1533, 1536, 1537, 1538, 1539, 1541, - 1545, 1543, 1549, 1548, 1550, 1554, 1560, 1561, 1563, 1564, - - 1567, 1568, 1571, 1570, 1573, 1581, 1572, 1582, 1584, 1585, - 1587, 1588, 1592, 1591, 1598, 1595, 1601, 1603, 1605, 1604, - 1607, 1611, 1614, 1616, 1608, 6547, 1615, 1628, 1623, 1626, - 1624, 1627, 1629, 1637, 1632, 1635, 1633, 1638, 1639, 1664, - 6547, 1641, 6547, 6547, 1644, 6547, 6547, 1645, 1649, 6547, - 1662, 1648, 1658, 1646, 1670, 1677, 1679, 1667, 1675, 1660, - 1687, 1691, 1694, 1696, 1682, 1697, 1688, 1702, 1708, 1653, - 1704, 1705, 1711, 1721, 1716, 1724, 1718, 1726, 1727, 1729, - 1732, 1736, 1738, 1740, 1739, 1743, 1744, 1745, 1747, 1746, - 1749, 1752, 1755, 1756, 1753, 1758, 1759, 1774, 1772, 1761, - - 1779, 6547, 1775, 1782, 1789, 1785, 1792, 1784, 1788, 1791, - 1764, 1796, 1793, 1797, 1798, 1800, 1802, 1805, 1804, 1809, - 1810, 1806, 1812, 1822, 1813, 6547, 1817, 1818, 1824, 1825, - 1828, 1831, 1833, 1829, 1835, 1836, 1839, 1847, 1849, 1840, - 1842, 1844, 1851, 1854, 1856, 6547, 1862, 1858, 1863, 1865, - 1866, 1868, 1869, 1871, 1874, 1873, 1876, 1877, 1878, 1879, - 1886, 1883, 1885, 1890, 1891, 1895, 1900, 1902, 1904, 1906, - 1908, 1910, 1911, 1912, 1913, 1915, 1916, 1924, 1927, 1923, - 1928, 1925, 1920, 1944, 1947, 1929, 1931, 1942, 1943, 1945, - 1951, 1955, 1953, 1946, 1957, 1965, 1958, 1961, 1963, 1967, - - 1974, 1969, 1971, 1976, 1979, 1980, 1982, 1983, 6547, 1985, - 1989, 6547, 1986, 1988, 1990, 2012, 1991, 1993, 1995, 2005, - 1994, 2014, 1998, 2006, 2022, 2016, 2032, 2025, 2024, 2035, - 2029, 2037, 2036, 2040, 2041, 2043, 2046, 2047, 2053, 2049, - 2063, 2067, 2066, 2073, 2075, 2050, 2058, 2062, 2081, 2071, - 2074, 2070, 2076, 2085, 2091, 2090, 2078, 2093, 2094, 2099, - 2103, 2104, 2102, 2105, 2106, 2108, 2111, 2116, 2117, 6547, - 2124, 2125, 2119, 2127, 2121, 2135, 2131, 2130, 6547, 2133, - 2139, 2140, 2147, 2143, 2144, 2145, 2146, 2151, 2153, 2155, - 2159, 2160, 2158, 2154, 2176, 6547, 2161, 6547, 2172, 2162, - - 2174, 2175, 2178, 2179, 2180, 2183, 6547, 6547, 2187, 2181, - 2197, 2201, 2191, 2184, 2202, 6547, 2203, 2210, 6547, 2207, - 2213, 2206, 2205, 2212, 2214, 2217, 2218, 2227, 2222, 2229, - 2224, 2226, 2234, 6547, 2235, 2236, 2240, 2241, 2237, 2243, - 2244, 2250, 2247, 6547, 2254, 2251, 2256, 2264, 2266, 2261, - 2263, 2268, 2272, 2269, 2274, 2275, 2276, 2277, 2284, 2286, - 2283, 2289, 2291, 2298, 6547, 2282, 2285, 2303, 2299, 2302, - 2306, 2307, 2308, 2309, 2310, 2311, 1996, 2312, 2318, 2319, - 2320, 2327, 2329, 2322, 2325, 2333, 2324, 2334, 2335, 2342, - 2340, 2341, 2344, 2345, 6547, 2346, 2352, 2349, 171, 2353, - - 2356, 2354, 2355, 2359, 2362, 2357, 2378, 2379, 2364, 2376, - 2382, 2383, 2375, 2385, 2386, 2387, 2374, 2390, 2392, 2394, - 6547, 2396, 2398, 2400, 2401, 2403, 2404, 2406, 6547, 2410, - 2426, 2423, 2430, 2408, 2405, 2431, 2417, 2421, 2432, 2433, - 2435, 2437, 2440, 2442, 2444, 2443, 6547, 2447, 2448, 2452, - 2450, 2458, 2460, 2459, 2451, 2461, 2465, 2467, 2471, 2473, - 2469, 2472, 2474, 2475, 2477, 2482, 2478, 2485, 2487, 2488, - 2489, 2490, 2492, 2494, 2499, 2500, 6547, 2507, 2506, 2504, - 2509, 2510, 2512, 2522, 2513, 2532, 2515, 2523, 2516, 2535, - 2538, 2540, 2524, 2548, 2544, 2549, 2541, 2558, 2555, 2559, - - 2562, 2556, 2565, 2567, 2568, 2569, 2571, 2573, 2574, 2575, - 2576, 2584, 2591, 2581, 2592, 2590, 2595, 2583, 2601, 2614, - 2598, 6547, 2603, 2605, 2613, 2615, 2622, 2617, 2618, 2623, - 2619, 2625, 2627, 2629, 2630, 2638, 2635, 2637, 2639, 2642, - 2641, 2643, 2649, 2650, 2651, 2654, 2658, 2660, 2662, 2663, - 6547, 2664, 2666, 2669, 2670, 2673, 2674, 2678, 2680, 2682, - 2683, 2684, 2686, 2689, 2690, 2691, 2692, 2698, 2699, 2695, - 6547, 2700, 2702, 2710, 2706, 2714, 2708, 2718, 2721, 2722, - 2725, 2728, 2712, 2729, 2731, 2732, 6547, 2740, 2742, 2739, - 2743, 2741, 2746, 2747, 2749, 2751, 6547, 2752, 2753, 2754, - - 2761, 2762, 2757, 6547, 2766, 2764, 2759, 2768, 2769, 2772, - 2774, 2775, 2770, 2780, 2782, 2789, 2796, 2783, 2793, 6547, - 2785, 2803, 2791, 2799, 2807, 2787, 2810, 2811, 2812, 2813, - 2814, 2818, 6547, 2827, 2819, 2824, 2834, 2830, 2831, 2836, - 2837, 2838, 2840, 2839, 2841, 2844, 6547, 2847, 2845, 2848, - 2850, 2852, 2853, 2855, 2868, 2860, 2865, 2867, 2870, 2873, - 2875, 2877, 2869, 2878, 2879, 2880, 2886, 2890, 2891, 2892, - 2895, 2899, 2904, 2901, 2903, 2907, 2906, 2908, 2909, 2916, - 2917, 2924, 2919, 2925, 6547, 2928, 2930, 2923, 2921, 2931, - 2933, 2935, 2937, 2940, 2936, 2938, 2948, 2945, 2942, 2955, - - 2958, 2951, 2962, 2960, 2964, 2965, 2967, 2966, 2968, 2969, - 2976, 2973, 2975, 2986, 2977, 2984, 2995, 2981, 2991, 2992, - 2993, 2994, 2982, 2998, 3004, 2999, 2997, 3006, 3007, 3015, - 3018, 3021, 3020, 3009, 3023, 3027, 3028, 6547, 3031, 3033, - 3029, 3035, 3036, 3042, 3043, 3045, 3046, 3037, 3051, 3053, - 3054, 3059, 3060, 3062, 3063, 3070, 3066, 6547, 3067, 6547, - 3068, 3069, 3072, 3081, 3076, 6547, 3087, 6547, 3077, 3091, - 3082, 3084, 6547, 3092, 3088, 3093, 3103, 3094, 3097, 3101, - 3105, 3099, 3106, 3112, 3111, 3115, 3114, 3116, 3122, 3117, - 3119, 3127, 3125, 3134, 3124, 3126, 3141, 3135, 3138, 3143, - - 3144, 3145, 6547, 3152, 3148, 3153, 3154, 3155, 3156, 3158, - 3159, 3161, 3162, 3165, 3173, 3167, 3179, 3169, 3178, 3181, - 3193, 3177, 3194, 6547, 3190, 3192, 3195, 3196, 6547, 3198, - 3199, 3200, 3205, 3207, 3208, 3209, 3210, 3211, 3215, 3216, - 3217, 3229, 3225, 3222, 3231, 6547, 3230, 3236, 3218, 3242, - 3249, 3244, 3246, 3251, 3252, 3254, 3263, 3259, 3258, 3260, - 3261, 3262, 3265, 3272, 3273, 3269, 3276, 3275, 3279, 3286, - 3283, 3277, 3281, 3287, 3289, 3290, 3291, 3292, 3293, 3296, - 3297, 3294, 6547, 3302, 3308, 3306, 3315, 3311, 3312, 3316, - 3321, 3317, 6547, 3323, 3324, 3325, 3327, 3332, 3326, 3329, - - 3334, 3337, 3340, 3342, 3345, 3347, 3346, 6547, 3348, 6547, - 3350, 3351, 3361, 3365, 3366, 3353, 3367, 3373, 3369, 3374, - 3376, 3379, 3377, 3383, 3380, 3385, 3386, 3388, 3400, 3391, - 3387, 3392, 3401, 3402, 3406, 3409, 3410, 3411, 6547, 6547, - 3412, 3413, 3417, 3414, 3420, 3421, 3424, 3432, 3428, 3427, - 3434, 3435, 3448, 6547, 3436, 3443, 3438, 3446, 3462, 3449, - 3464, 3465, 3452, 3440, 3472, 3468, 6547, 3461, 3469, 3476, - 3471, 3477, 3479, 6547, 3482, 6547, 3475, 3478, 3485, 3487, - 3488, 3489, 3491, 3492, 3499, 3509, 3510, 3495, 3512, 3507, - 3500, 3513, 3515, 3516, 3523, 3519, 3521, 3522, 6547, 3525, - - 3526, 3530, 3528, 3531, 3538, 3535, 3539, 6547, 3542, 3545, - 3548, 3549, 3551, 3550, 3553, 3556, 3557, 3555, 3559, 6547, - 3558, 3561, 3572, 3573, 3565, 3574, 3576, 3579, 3587, 6547, - 3584, 3588, 3596, 3592, 3593, 3598, 3599, 3594, 3595, 3601, - 3603, 3604, 3606, 3607, 3608, 3610, 3613, 3615, 3612, 3622, - 3623, 3626, 3630, 3639, 3631, 6547, 3635, 3636, 3640, 3638, - 3642, 3643, 3645, 3648, 3650, 3651, 3661, 3662, 3653, 3664, - 3666, 3668, 3673, 3675, 6547, 3676, 3669, 3683, 3679, 3681, - 3689, 3680, 3686, 3693, 3682, 3690, 3694, 3695, 3698, 3707, - 3702, 3705, 3706, 3708, 3718, 3709, 6547, 3723, 3713, 3719, - - 3730, 3720, 3726, 3739, 3735, 3736, 3737, 3743, 3738, 3745, - 3740, 3747, 3748, 3751, 3752, 6547, 6547, 3754, 3755, 3757, - 6547, 3759, 3761, 3771, 3763, 3767, 3770, 3774, 3775, 3773, - 3776, 3778, 3779, 6547, 3786, 3789, 3787, 3790, 3798, 3794, - 6547, 3793, 3806, 3802, 3803, 3805, 3809, 3811, 3810, 3813, - 3815, 3817, 3818, 3826, 3827, 3824, 3823, 3828, 6547, 3825, - 3831, 3834, 3836, 3837, 3840, 6547, 3841, 3842, 3849, 3851, - 3852, 3859, 3862, 3854, 3864, 3847, 3867, 3869, 3871, 3872, - 3873, 3880, 3875, 3877, 3879, 3883, 3885, 6547, 3886, 3887, - 3891, 3897, 6547, 3900, 3907, 3908, 6547, 3910, 3894, 3909, - - 3905, 3918, 6547, 3913, 3915, 3916, 3921, 3929, 3922, 3930, - 3926, 3927, 6547, 3933, 3932, 3935, 6547, 3934, 3941, 3948, - 3950, 3936, 3958, 3953, 3938, 3954, 3955, 6547, 3957, 6547, - 3963, 3961, 3967, 6547, 3965, 3969, 3970, 3972, 3974, 3979, - 3980, 3986, 3988, 3976, 3982, 3990, 3978, 3994, 3995, 3999, - 3992, 4002, 4001, 4003, 6547, 4004, 4006, 4009, 4007, 4012, - 4014, 4020, 4015, 4021, 4022, 6547, 6547, 4029, 6547, 4030, - 4025, 4031, 6547, 4034, 4037, 4044, 4039, 4042, 4046, 4053, - 4050, 6547, 4055, 4059, 6547, 4040, 4061, 4068, 4057, 4065, - 4066, 4069, 4071, 4072, 4073, 4076, 4074, 4078, 4075, 4077, - - 4091, 6547, 4079, 4081, 4082, 4084, 4095, 4096, 4100, 4102, - 4098, 6547, 4106, 4112, 4105, 4115, 4117, 6547, 4119, 6547, - 4108, 4121, 4122, 4125, 4129, 6547, 4131, 4132, 4136, 4137, - 4138, 4139, 4140, 4142, 4144, 4149, 4156, 4152, 4151, 4153, - 4160, 4158, 6547, 4155, 4161, 4168, 4170, 4172, 4173, 4182, - 4178, 4177, 4180, 4181, 4185, 4188, 4190, 4194, 4192, 4199, - 4196, 6547, 4203, 4205, 4202, 4217, 4206, 4210, 4208, 6547, - 4209, 4222, 4224, 6547, 4213, 4225, 4228, 4231, 4232, 4233, - 4236, 4234, 4238, 6547, 4235, 4242, 4239, 4241, 4244, 4255, - 6547, 6547, 4256, 6547, 4257, 4243, 4258, 4260, 4240, 4261, - - 4268, 4271, 4277, 4269, 4279, 4281, 4272, 4274, 4290, 4293, - 4297, 4292, 4294, 4298, 6547, 6547, 4300, 4304, 4301, 4307, - 4308, 4303, 4311, 4320, 4312, 4321, 4324, 4326, 4333, 6547, - 4328, 4316, 4334, 4325, 6547, 4335, 4337, 4339, 4340, 4341, - 4343, 4347, 4344, 4348, 4349, 4351, 4352, 4354, 4365, 4357, - 4358, 4366, 4367, 4368, 4359, 4374, 4380, 6547, 4377, 4375, - 4381, 4382, 4384, 4387, 4388, 4389, 4390, 6547, 4395, 6547, - 4391, 4393, 4396, 4397, 4413, 4398, 4414, 4415, 4416, 4418, - 4419, 4422, 4423, 4427, 4424, 4429, 4432, 4434, 4436, 4438, - 4440, 6547, 4444, 4441, 4447, 4448, 4451, 4453, 4454, 4456, - - 4457, 4459, 4462, 4463, 4465, 4470, 4466, 4472, 4471, 4474, - 6547, 4478, 4487, 4476, 4489, 4479, 4484, 4491, 4498, 4501, - 4492, 4502, 4503, 6547, 4504, 4496, 4507, 6547, 4508, 4509, - 4510, 4512, 4521, 4518, 4522, 4523, 4524, 6547, 4530, 4513, - 4534, 4526, 4531, 4535, 4536, 4542, 4545, 4544, 4547, 6547, - 4557, 4548, 4556, 4558, 4552, 4555, 4559, 4564, 4566, 6547, - 4570, 4571, 4572, 4579, 4574, 4584, 4581, 4583, 4582, 4585, - 4590, 4591, 4594, 4596, 4597, 4599, 4608, 4610, 4611, 6547, - 4589, 6547, 4612, 4616, 4620, 4618, 4623, 4622, 6547, 4624, - 4625, 4630, 4631, 4626, 6547, 4633, 4632, 4634, 4638, 6547, - - 4636, 4647, 4637, 4643, 4654, 4658, 6547, 4661, 4662, 4651, - 4669, 4670, 4666, 4668, 4671, 4672, 4674, 4676, 4677, 4678, - 4687, 4680, 4683, 6547, 4689, 4692, 4698, 4699, 4682, 4700, - 4701, 4702, 4708, 4703, 6547, 4705, 4711, 4712, 4713, 4714, - 4715, 4717, 4725, 4720, 4723, 4724, 4728, 4729, 4730, 6547, - 4733, 4736, 4737, 4744, 4740, 4753, 6547, 4749, 6547, 4746, - 4756, 4759, 4739, 4763, 6547, 6547, 4750, 4767, 4766, 4769, - 4770, 6547, 6547, 4772, 6547, 4773, 6547, 4774, 4776, 6547, - 6547, 4775, 4777, 4781, 4782, 4784, 6547, 4790, 6547, 4799, - 4794, 4785, 4796, 4797, 6547, 4798, 4804, 4800, 4808, 4806, - - 6547, 4810, 4815, 4811, 4813, 6547, 4822, 4823, 4814, 4816, - 6547, 4824, 4831, 4827, 4835, 4836, 4837, 4838, 4841, 4843, - 4839, 4844, 4846, 4847, 4854, 4861, 4863, 4865, 4869, 4858, - 4856, 4871, 4872, 4877, 4875, 4879, 4880, 4881, 4883, 4884, - 4886, 4889, 4890, 4892, 4895, 4893, 4894, 4906, 4896, 4898, - 4908, 4910, 4899, 4909, 4913, 4912, 4917, 4915, 4920, 4923, - 4922, 4924, 6547, 4928, 4930, 4933, 4935, 4934, 4940, 4942, - 4944, 4950, 4953, 6547, 4957, 6547, 4959, 4951, 4955, 4961, - 4962, 6547, 4963, 4964, 4965, 4968, 4967, 4970, 4848, 4971, - 4974, 4975, 4972, 6547, 4979, 4981, 4984, 4985, 4997, 6547, - - 4989, 5000, 4986, 5001, 5002, 5003, 5005, 5007, 5008, 5010, - 5012, 5014, 5015, 5016, 5020, 5022, 5028, 5036, 5031, 5017, - 5033, 5037, 5038, 5039, 5040, 5041, 5042, 5048, 5053, 5057, - 6547, 5045, 6547, 5054, 5050, 5058, 5061, 5062, 5065, 5068, - 6547, 6547, 5066, 5071, 5073, 5075, 5076, 5078, 5080, 5082, - 5079, 6547, 5084, 5088, 5096, 5089, 6547, 5093, 5098, 5100, - 5104, 6547, 5101, 5105, 5106, 5112, 5107, 5116, 5117, 5119, - 5109, 5121, 5123, 5130, 6547, 6547, 6547, 6547, 5131, 5124, - 5135, 5127, 5136, 5138, 5139, 5142, 5137, 6547, 5145, 6547, - 6547, 5150, 5151, 5153, 5154, 5157, 5158, 5160, 5162, 6547, - - 5161, 5163, 5166, 5164, 5173, 5175, 5181, 5178, 5182, 5183, - 5184, 5192, 5188, 5189, 5191, 5194, 5196, 5198, 6547, 6547, - 5200, 5204, 5205, 5215, 5207, 5211, 5210, 5223, 5218, 5220, - 5219, 5221, 5226, 5227, 5235, 5237, 5233, 5230, 6547, 5232, - 5240, 5241, 6547, 5243, 6547, 5246, 5247, 5249, 5250, 5253, - 5256, 5257, 5259, 6547, 6547, 5254, 5266, 5264, 6547, 6547, - 5261, 5269, 5271, 5274, 5275, 5276, 5277, 5278, 5284, 5279, - 6547, 5281, 6547, 5285, 5287, 5300, 5288, 5303, 5307, 5308, - 5310, 5304, 5306, 6547, 5314, 5315, 6547, 5322, 5317, 5321, - 5318, 5319, 6547, 5326, 5324, 5330, 5336, 6547, 5338, 5339, - - 5340, 6547, 5347, 6547, 5331, 5344, 5341, 5356, 5348, 6547, - 5352, 5357, 6547, 5362, 5364, 5365, 5354, 6547, 5359, 6547, - 5366, 5370, 5373, 5376, 5378, 5380, 5371, 5381, 5382, 5389, - 5388, 5390, 6547, 6547, 135, 5398, 5385, 5391, 5395, 5400, - 5407, 5402, 5405, 5404, 6547, 6547, 5412, 6547, 5410, 5413, - 6547, 5414, 5419, 5420, 5423, 5424, 5425, 5426, 5428, 5431, - 5433, 5434, 5435, 5432, 5436, 5454, 5456, 5438, 5459, 5460, - 5462, 5464, 5466, 5452, 5469, 5470, 5471, 5472, 5473, 5475, - 5476, 5478, 5479, 6547, 5482, 5484, 5486, 5487, 6547, 5494, - 5488, 5501, 5491, 6547, 5503, 5504, 5506, 5507, 6547, 5508, - - 5510, 5514, 5511, 5512, 5517, 5519, 5530, 5522, 5523, 5521, - 6547, 6547, 6547, 5533, 5537, 6547, 5540, 5527, 5542, 5543, - 6547, 5545, 5546, 5547, 6547, 6547, 5548, 5549, 5550, 5557, - 6547, 5552, 6547, 5553, 6547, 5560, 5563, 5571, 5566, 6547, - 5576, 5578, 6547, 5584, 5586, 5588, 5580, 5577, 5590, 5591, - 6547, 5562, 5593, 5594, 5601, 5592, 5595, 5602, 5603, 5604, - 5611, 5606, 5613, 6547, 5614, 5615, 5616, 5624, 5617, 5554, - 5619, 6547, 5626, 6547, 5628, 6547, 5629, 5630, 5633, 5632, - 5635, 5638, 5639, 5640, 5648, 5644, 5650, 5652, 5655, 5656, - 6547, 6547, 5659, 5661, 6547, 5662, 6547, 5664, 6547, 5665, - - 5666, 5669, 5667, 6547, 5671, 5673, 5677, 5680, 5676, 5679, - 6547, 5687, 5689, 5690, 5692, 6547, 6547, 5684, 5700, 5696, - 6547, 5695, 5706, 5708, 5702, 5711, 5712, 5715, 5713, 5720, - 5697, 5719, 5718, 5726, 5729, 5727, 6547, 6547, 6547, 5734, - 5721, 5742, 5740, 5744, 5743, 5735, 6547, 5745, 5749, 5751, - 5752, 5760, 5755, 5758, 6547, 5762, 5759, 5761, 5763, 5765, - 5766, 5767, 5769, 6547, 5780, 5782, 5770, 5784, 5787, 5789, - 5791, 5794, 5795, 5796, 5803, 5799, 6547, 5801, 6547, 6547, - 5802, 6547, 5805, 5806, 5807, 5809, 6547, 5812, 5813, 5814, - 5816, 5815, 5817, 5819, 5824, 6547, 5831, 5820, 5832, 5836, - - 6547, 6547, 5838, 6547, 5843, 5844, 5834, 5852, 5845, 5847, - 5854, 5856, 6547, 5850, 5858, 5859, 5860, 5862, 6547, 5863, - 5865, 5866, 5867, 6547, 5873, 5869, 5875, 5874, 5876, 6547, - 5877, 5879, 5889, 5896, 6547, 5880, 5894, 5890, 6547, 6547, - 5905, 5907, 5898, 6547, 6547, 6547, 5909, 5910, 5911, 5913, - 6547, 5917, 5921, 5925, 5929, 5920, 6547, 5928, 5931, 5935, - 5914, 5936, 6547, 6547, 5937, 5938, 5939, 5942, 6547, 6547, - 5943, 5945, 5947, 5946, 5948, 6547, 5949, 5953, 5959, 5965, - 5970, 5956, 5961, 5972, 5979, 5980, 5975, 5976, 5977, 5982, - 5983, 5985, 5990, 5992, 5993, 5995, 5997, 6001, 6002, 6547, - - 6547, 6006, 6547, 6009, 6003, 6547, 6547, 6011, 6014, 6018, - 6020, 6022, 6024, 6026, 6028, 6015, 6547, 6029, 6031, 6033, - 6032, 6034, 6547, 6036, 6040, 6035, 6043, 6037, 6045, 6047, - 6052, 6547, 6547, 6048, 6057, 6053, 6058, 6063, 6547, 6061, - 6071, 6068, 6067, 6069, 6073, 6070, 6547, 6074, 6075, 6547, - 6547, 6083, 6077, 6547, 6547, 6076, 6547, 6547, 6547, 6547, - 6547, 6547, 6547, 6547, 6085, 6093, 6547, 6094, 6098, 6100, - 6104, 6547, 6078, 6105, 6106, 6089, 6108, 6547, 6095, 6112, - 6111, 5292, 6113, 6119, 6117, 6115, 6121, 6124, 6125, 6126, - 6127, 6131, 6132, 6133, 6142, 6145, 6129, 6146, 6547, 6547, - - 6547, 6138, 6135, 6157, 6153, 6159, 6160, 6164, 6166, 6148, - 6168, 6169, 6170, 6171, 6173, 6174, 6183, 6178, 6179, 6180, - 6182, 6184, 6187, 6547, 6194, 6190, 6195, 6197, 6547, 6200, - 6547, 6199, 6547, 6547, 6202, 6206, 6203, 6208, 6216, 6218, - 6209, 6213, 6219, 6220, 6222, 6547, 6229, 6547, 6547, 6224, - 6230, 6547, 6232, 6231, 6547, 6233, 6234, 6236, 6241, 6243, - 6240, 6237, 6244, 6248, 6547, 6547, 6251, 6252, 6257, 6261, - 6258, 6268, 6264, 6267, 6269, 6273, 6266, 6281, 6547, 6280, - 6277, 6284, 6547, 6286, 6287, 6288, 6289, 6291, 6298, 6293, - 6294, 6547, 6296, 6547, 6300, 6302, 6304, 6301, 6303, 6305, - - 6315, 6319, 6313, 6547, 6317, 6327, 6321, 6329, 6331, 6333, - 6334, 6323, 6336, 6339, 6345, 6349, 6346, 6350, 6337, 6354, - 6351, 6547, 6361, 6352, 6547, 6358, 6362, 6355, 6364, 6365, - 6547, 6369, 6372, 6373, 6375, 6378, 6379, 6547, 6381, 6385, - 6382, 6547, 6388, 6547, 6547, 6390, 6387, 6394, 6397, 6399, - 6547, 6547, 6547, 6427, 6434, 6441, 6448, 6455, 6462, 6469, - 88, 6476, 6483, 6490, 6497, 6504, 6511, 6518, 6525, 6532, - 6539 + 763, 766, 762, 774, 773, 765, 769, 794, 799, 782, + 787, 800, 801, 804, 802, 803, 806, 808, 809, 814, + 818, 819, 823, 807, 825, 827, 834, 829, 6793, 831, + 838, 846, 839, 847, 850, 848, 854, 856, 836, 866, + 864, 867, 876, 898, 849, 871, 868, 878, 881, 6793, + 884, 882, 922, 890, 891, 908, 910, 859, 909, 911, + 904, 912, 933, 906, 920, 915, 945, 942, 930, 943, + + 944, 946, 952, 954, 955, 953, 957, 958, 966, 861, + 961, 970, 981, 962, 964, 968, 971, 974, 986, 983, + 990, 991, 993, 995, 997, 996, 1001, 999, 1022, 1004, + 1002, 1000, 1016, 1017, 1024, 1023, 1025, 1028, 1030, 1029, + 1037, 1041, 1038, 1046, 1047, 1048, 1049, 1059, 1054, 1055, + 1056, 1060, 1062, 1063, 1066, 1068, 1069, 1071, 1073, 1074, + 1080, 1081, 1085, 1089, 1075, 1090, 1082, 6793, 1097, 6793, + 1092, 1095, 1099, 1100, 1101, 1102, 1105, 6793, 1107, 1110, + 1109, 1112, 1120, 1115, 1136, 1111, 1118, 1123, 1135, 1119, + 1137, 1145, 1140, 1141, 1148, 1143, 1146, 1147, 1149, 1150, + + 1153, 1156, 1159, 1161, 1155, 1162, 1178, 6793, 1163, 1167, + 1165, 1168, 1176, 1182, 1173, 1181, 1191, 1190, 1201, 1193, + 1199, 1213, 1202, 1203, 1211, 1210, 1215, 1220, 1216, 1222, + 1224, 1225, 1227, 1228, 1226, 1230, 1231, 1234, 1232, 1238, + 1240, 6793, 1247, 1244, 1250, 1255, 1257, 1258, 1259, 1260, + 1261, 1262, 1263, 1264, 1266, 517, 1271, 1282, 1289, 1272, + 1291, 1275, 1290, 1286, 1288, 1265, 1292, 1296, 1294, 1307, + 1298, 1309, 1314, 1322, 1318, 1320, 1327, 1329, 1304, 1324, + 1299, 1326, 1330, 1332, 1334, 1333, 1335, 1341, 1339, 1348, + 1344, 1346, 1345, 1347, 1351, 1353, 1355, 1356, 1357, 1359, + + 1366, 1361, 1373, 1369, 1371, 1372, 1368, 1387, 1376, 1379, + 1391, 1392, 1389, 1390, 6793, 1399, 1398, 1401, 1402, 1408, + 1409, 1410, 1400, 1411, 1414, 1417, 1418, 1419, 1425, 1422, + 1426, 1420, 1427, 1433, 1432, 1440, 1446, 1435, 1450, 1451, + 1453, 1437, 1449, 1456, 1457, 1465, 1462, 1466, 1468, 1464, + 1469, 1478, 1470, 1473, 1475, 1485, 1481, 1482, 1487, 1484, + 1496, 1498, 1490, 1507, 1499, 1509, 1516, 1502, 1488, 1517, + 1506, 1518, 1512, 1521, 1522, 1523, 1526, 1533, 1528, 1529, + 1534, 1535, 1536, 1537, 1531, 1544, 1547, 1545, 1548, 1551, + 1552, 1553, 1557, 1560, 1555, 1561, 1566, 1567, 1568, 1570, + + 1558, 1578, 1588, 1569, 1580, 1582, 1581, 1589, 1590, 1591, + 1596, 1597, 1598, 1600, 1601, 1608, 1611, 1602, 1605, 1614, + 1615, 1617, 1618, 1627, 1619, 1628, 1632, 1633, 1634, 1622, + 1635, 1638, 1640, 1641, 1645, 1646, 1648, 6793, 1652, 1660, + 1653, 1658, 1655, 1656, 1661, 1669, 1664, 1668, 1665, 1666, + 1670, 1692, 6793, 1674, 6793, 6793, 1676, 6793, 6793, 1677, + 1678, 6793, 1682, 1687, 1699, 1698, 1705, 1707, 1709, 1685, + 1710, 1680, 1719, 1725, 1716, 1717, 1718, 1723, 1730, 1721, + 1731, 1728, 1738, 1742, 1740, 1746, 1749, 1754, 1756, 1758, + 1750, 1761, 1767, 1764, 1770, 1772, 1775, 1760, 1776, 1778, + + 1779, 1780, 1782, 1781, 1784, 1787, 1790, 1791, 1793, 1786, + 1794, 1805, 1803, 1796, 1813, 6793, 1809, 1821, 1806, 1823, + 1819, 1826, 1827, 1822, 1810, 1832, 1834, 1829, 1835, 1836, + 1838, 1839, 1840, 1842, 1844, 1846, 1850, 1848, 1860, 1849, + 6793, 1862, 1863, 1851, 1859, 1865, 1866, 1873, 1867, 1852, + 1870, 1876, 1886, 1882, 1884, 1887, 1888, 1890, 1891, 1892, + 6793, 1894, 1901, 1898, 1902, 1904, 1893, 1908, 1905, 1910, + 1911, 1912, 1917, 1915, 1918, 1922, 1923, 1924, 1926, 1929, + 1934, 1931, 1938, 1941, 1948, 1942, 1944, 1949, 1950, 1951, + 1953, 1954, 1955, 1957, 1962, 1966, 1965, 1969, 1967, 1968, + + 1978, 1986, 1971, 1982, 1983, 1984, 1985, 1990, 1993, 1998, + 1994, 1996, 1999, 2008, 2000, 2005, 2007, 2010, 2013, 2023, + 2009, 2026, 2018, 2011, 2021, 2027, 2028, 6793, 2034, 2035, + 6793, 2037, 2036, 2038, 2060, 2039, 2042, 2051, 2044, 2045, + 2048, 2053, 2061, 2057, 2064, 2073, 2074, 2077, 2080, 2079, + 2082, 2086, 2085, 2088, 2089, 2092, 2095, 2093, 2100, 2107, + 2109, 2055, 2113, 2117, 2112, 2114, 2118, 2137, 2115, 2116, + 2125, 2119, 2122, 2124, 2120, 2126, 2130, 2135, 2140, 2132, + 2147, 2150, 2146, 2149, 2152, 2153, 2160, 2162, 2165, 2164, + 6793, 2172, 2170, 2174, 2175, 2176, 2183, 2181, 2179, 6793, + + 2182, 2185, 2187, 2196, 2188, 2192, 2195, 2199, 2201, 2202, + 2204, 2205, 2208, 2206, 2207, 2226, 6793, 2209, 6793, 2213, + 2210, 2218, 2221, 2228, 2229, 2231, 2232, 2233, 6793, 6793, + 2234, 2235, 2248, 2251, 2241, 2243, 2252, 6793, 2253, 2260, + 6793, 2262, 2261, 2256, 2255, 2257, 2267, 2268, 2271, 2278, + 2274, 2282, 2277, 2279, 2283, 6793, 2287, 2280, 2288, 2291, + 2289, 2295, 2298, 2302, 2299, 6793, 2300, 2308, 2309, 2316, + 2313, 2314, 2317, 2318, 2319, 2322, 2325, 2326, 2327, 2328, + 2337, 2338, 2329, 2342, 2339, 2343, 2351, 6793, 2349, 2350, + 2336, 2358, 2355, 2362, 2357, 2363, 2353, 2359, 2364, 2370, + + 2365, 2369, 2375, 2377, 2379, 2386, 2387, 2382, 2383, 2385, + 2390, 2391, 2392, 2394, 2399, 2396, 2401, 2400, 2402, 6793, + 2403, 2407, 2408, 2413, 2415, 2411, 171, 2421, 2417, 2424, + 2423, 2425, 2430, 2426, 2439, 2443, 2438, 2440, 2442, 2447, + 2441, 2448, 2451, 2449, 2450, 2453, 2457, 2458, 6793, 2466, + 2459, 2461, 2463, 2468, 2467, 2470, 6793, 2476, 2481, 2483, + 2491, 2485, 2493, 2494, 2495, 2498, 2496, 2499, 2500, 2501, + 2503, 2506, 2510, 2509, 6793, 2512, 2517, 2518, 2515, 2524, + 2526, 2525, 2527, 2531, 2532, 2533, 2537, 2536, 2538, 2539, + 2540, 2541, 2547, 2548, 2555, 2544, 2554, 2556, 2557, 2560, + + 2566, 2562, 2567, 2568, 2575, 2570, 6793, 2577, 2573, 2580, + 2576, 2582, 2585, 2586, 2587, 2604, 2589, 2593, 2596, 2605, + 2610, 2600, 2612, 2620, 2616, 2622, 2625, 2630, 2626, 2632, + 2635, 2628, 2638, 2640, 2641, 2642, 2650, 2646, 2647, 2648, + 2651, 2652, 2662, 2663, 2654, 2664, 2666, 2669, 2658, 2676, + 2681, 2683, 6793, 2685, 2673, 2687, 2690, 2697, 2692, 2671, + 2695, 2698, 2702, 2703, 2704, 2706, 2713, 2708, 2710, 2714, + 2716, 2715, 2717, 2724, 2719, 2725, 2727, 2734, 2730, 2736, + 2595, 6793, 2738, 2739, 2740, 2742, 2747, 2743, 2749, 2752, + 2755, 2754, 2756, 2758, 2761, 2762, 2764, 2765, 2772, 2768, + + 2769, 2774, 2770, 6793, 2780, 2771, 2782, 2784, 2789, 2791, + 2790, 2793, 2792, 2800, 2802, 2803, 2804, 2805, 2806, 6793, + 2814, 2815, 2811, 2813, 2823, 2820, 2822, 2824, 2826, 2827, + 6793, 2828, 2830, 2832, 2831, 2834, 2836, 2843, 2844, 2839, + 6793, 2855, 2850, 2840, 2851, 2853, 2852, 2856, 2857, 2861, + 2862, 2867, 2863, 2873, 2869, 2875, 6793, 2876, 2883, 2878, + 2879, 2886, 2884, 2889, 2890, 2901, 2891, 2897, 2893, 6793, + 2916, 2911, 2902, 2918, 2903, 2914, 2919, 2920, 2921, 2923, + 2924, 2927, 2928, 6793, 2929, 2931, 2933, 2934, 2938, 2936, + 2939, 2952, 2945, 2947, 2950, 2953, 2955, 2956, 2960, 2962, + + 2967, 2959, 2961, 2971, 2973, 2963, 2976, 2979, 2983, 2987, + 2992, 2988, 2989, 2994, 2991, 2995, 2996, 2998, 3006, 3007, + 3010, 3008, 3012, 6793, 3015, 3016, 3018, 3005, 3019, 3021, + 3022, 3025, 3028, 3024, 3026, 3033, 3036, 3030, 3046, 3048, + 3039, 3051, 3041, 3043, 3054, 3053, 3055, 3056, 3057, 3067, + 3064, 3065, 3066, 3077, 3068, 3072, 3079, 3070, 3080, 3081, + 3082, 3083, 3084, 3088, 3090, 3093, 3094, 3095, 3086, 3107, + 3109, 3110, 3112, 3104, 3102, 3118, 3119, 6793, 3122, 3123, + 3120, 3124, 3126, 3130, 3127, 3139, 3134, 3137, 3136, 3143, + 3148, 3145, 3146, 3151, 3153, 3161, 3157, 6793, 3154, 6793, + + 3158, 3162, 3168, 3176, 3163, 6793, 3175, 6793, 3177, 3182, + 3171, 3178, 6793, 3185, 3184, 3166, 3189, 3190, 3191, 3193, + 3195, 3196, 3197, 3199, 3200, 3203, 3204, 3206, 3207, 3209, + 3217, 3211, 3219, 3223, 3220, 3227, 3230, 3224, 3238, 3214, + 3231, 3240, 3241, 3233, 3242, 6793, 3249, 3243, 3253, 3254, + 3255, 3256, 3258, 3257, 3261, 3260, 3262, 3264, 3267, 3268, + 3279, 3273, 3265, 3280, 3281, 3284, 3292, 3290, 3297, 6793, + 3293, 3295, 3296, 3298, 6793, 3301, 3299, 3302, 3308, 3305, + 3311, 3312, 3313, 3317, 3314, 3321, 3320, 3325, 3330, 3334, + 3335, 6793, 3336, 3337, 3322, 3341, 3349, 3352, 3356, 3353, + + 3359, 3361, 3357, 3363, 3364, 3355, 3365, 3366, 3367, 3375, + 3378, 3371, 3380, 3379, 3382, 3389, 3385, 3381, 3383, 3391, + 3392, 3393, 3394, 3395, 3396, 3397, 3400, 3411, 3398, 3416, + 6793, 3406, 3415, 3419, 3426, 3401, 3424, 3405, 3428, 3429, + 6793, 3431, 3433, 3434, 3435, 3436, 3441, 3438, 3443, 3444, + 3445, 3446, 3448, 3451, 3449, 6793, 3457, 6793, 3458, 3466, + 3471, 3474, 3464, 3468, 3475, 3480, 3481, 3482, 3484, 3485, + 3487, 3490, 3491, 3493, 3495, 3496, 3497, 3504, 3500, 3503, + 3511, 3510, 3512, 3513, 3521, 3517, 3518, 6793, 6793, 3516, + 3519, 3531, 3527, 3525, 3533, 3535, 3539, 3540, 3542, 3544, + + 3546, 3553, 6793, 3549, 3554, 3555, 3556, 3568, 3557, 3559, + 3572, 3571, 3567, 3579, 3574, 6793, 3570, 3578, 3588, 3583, + 3584, 3591, 6793, 3586, 6793, 3589, 3595, 3597, 3598, 3600, + 3599, 3601, 3602, 3604, 3606, 3617, 3613, 3625, 3611, 3622, + 3623, 3626, 3627, 3629, 3632, 3636, 3631, 3633, 3634, 6793, + 3640, 3635, 3637, 3642, 3648, 3651, 3654, 3657, 3650, 6793, + 3658, 3661, 3660, 3662, 3664, 3672, 3665, 3675, 3667, 3677, + 3678, 3681, 3682, 3683, 6793, 3680, 3685, 3696, 3689, 3691, + 3697, 3707, 3708, 3713, 6793, 3693, 3710, 3720, 3716, 3717, + 3700, 3718, 3704, 3722, 3723, 3725, 3726, 3727, 3728, 3730, + + 3733, 3734, 3736, 3735, 3747, 3746, 3738, 3750, 3760, 3740, + 6793, 3756, 3757, 3762, 3763, 3764, 3765, 3767, 3770, 3772, + 3773, 3785, 3786, 3774, 3777, 3789, 3790, 3797, 3796, 6793, + 3806, 3792, 3807, 3803, 3780, 3809, 3814, 3782, 3811, 3818, + 3804, 3815, 3820, 3821, 3822, 3824, 3833, 3828, 3830, 3831, + 3832, 3843, 3834, 6793, 3845, 3846, 3838, 3855, 3848, 3851, + 3862, 3858, 3861, 3863, 3865, 3868, 3869, 3871, 3873, 3874, + 3877, 3872, 6793, 6793, 3879, 3880, 3887, 6793, 3888, 3882, + 3889, 3885, 3899, 3886, 3893, 3902, 3904, 3890, 3910, 3900, + 3906, 6793, 3912, 3920, 3915, 3918, 3927, 3928, 6793, 3919, + + 3929, 3932, 3934, 3924, 3936, 3940, 3937, 3941, 3942, 3943, + 3945, 3953, 3954, 3950, 3951, 3957, 6793, 3952, 3958, 3962, + 3964, 3955, 3968, 6793, 3965, 3971, 3978, 3976, 3981, 3986, + 3987, 3988, 3993, 3973, 3989, 3995, 3996, 3997, 3998, 4006, + 4002, 4007, 4005, 4008, 4012, 4015, 4009, 6793, 4019, 4023, + 4024, 4026, 6793, 4030, 4033, 4037, 6793, 4041, 4036, 4038, + 4040, 4048, 6793, 4045, 4046, 4047, 4053, 4049, 4061, 4051, + 4064, 4066, 4056, 4060, 4063, 4067, 6793, 4069, 4070, 4071, + 6793, 4082, 4077, 4084, 4087, 4072, 4094, 4090, 4093, 4091, + 4095, 6793, 4100, 6793, 4099, 4101, 4106, 6793, 4103, 4108, + + 4109, 4111, 4112, 4117, 4118, 4116, 4125, 4126, 4127, 4129, + 4130, 4128, 4133, 4137, 4134, 4135, 4139, 4140, 6793, 4141, + 4143, 4150, 4145, 4155, 4151, 4158, 4148, 4162, 4163, 6793, + 6793, 4172, 6793, 4174, 4164, 4166, 6793, 4168, 4173, 4181, + 4178, 4184, 4186, 4179, 4190, 4191, 6793, 4193, 4200, 6793, + 4194, 4196, 4204, 4205, 4203, 4206, 4207, 4208, 4211, 4212, + 4213, 4214, 4215, 4222, 4216, 4221, 4218, 6793, 4223, 4229, + 4232, 4239, 4231, 4235, 4245, 4241, 4240, 6793, 4251, 4257, + 4247, 4253, 4254, 6793, 4262, 6793, 4250, 4263, 4264, 4267, + 4266, 4279, 6793, 4275, 4270, 4281, 4274, 4278, 4286, 4282, + + 4289, 4290, 4291, 4298, 4296, 4293, 4295, 4303, 4304, 6793, + 4299, 4305, 4310, 4313, 4315, 4316, 4323, 4320, 4322, 4321, + 4326, 4328, 4329, 4331, 4337, 4335, 4340, 4333, 6793, 4343, + 4346, 4347, 4359, 4349, 4354, 4350, 6793, 4357, 4360, 4366, + 6793, 4364, 4356, 4370, 4373, 4367, 4374, 4375, 4378, 4380, + 4381, 4382, 6793, 4383, 4386, 4384, 4388, 4397, 4390, 6793, + 6793, 4400, 6793, 4401, 4389, 4405, 4408, 4409, 4413, 4411, + 4414, 4416, 4417, 4418, 4421, 4424, 4427, 6793, 4428, 4436, + 4431, 4439, 4448, 4449, 4441, 4446, 4432, 6793, 6793, 4451, + 4455, 4457, 4459, 4460, 4462, 4445, 4471, 4464, 4467, 4473, + + 4475, 4482, 6793, 4479, 4477, 4484, 4478, 6793, 4485, 4486, + 4489, 4487, 4490, 4493, 4492, 4494, 4496, 4499, 4504, 4505, + 4500, 4513, 4506, 4507, 4516, 4517, 4519, 4520, 4522, 4527, + 6793, 4523, 4529, 4530, 4534, 4535, 4537, 4539, 4538, 4541, + 4551, 6793, 4543, 6793, 4542, 4547, 4546, 4563, 4544, 4554, + 4566, 4567, 4568, 4569, 4572, 4573, 4576, 4577, 4587, 4578, + 4582, 4588, 4590, 4592, 4597, 4598, 6793, 4600, 4584, 4594, + 4601, 4607, 4609, 4610, 4612, 4615, 4617, 4619, 4618, 4621, + 4625, 4622, 4626, 4627, 4628, 4630, 6793, 4632, 4639, 4631, + 4641, 4643, 4645, 4652, 4646, 4654, 4648, 4656, 4657, 6793, + + 4658, 4660, 4664, 6793, 4665, 4666, 4668, 4670, 4676, 4669, + 4672, 4678, 4680, 6793, 4682, 4684, 4687, 4686, 4690, 4691, + 4692, 4696, 4698, 4699, 4702, 6793, 4712, 4703, 4711, 4714, + 4710, 4713, 4717, 4723, 4721, 6793, 4724, 4725, 4727, 4737, + 4739, 4732, 4734, 4746, 4736, 4743, 4744, 4745, 4751, 4750, + 4752, 4755, 4756, 4757, 4766, 4768, 4763, 6793, 4770, 6793, + 4772, 4773, 4774, 4783, 4778, 4776, 4780, 4784, 4786, 6793, + 4788, 4791, 4794, 4795, 4796, 6793, 4797, 4798, 4800, 4799, + 6793, 4813, 4812, 4801, 4818, 4803, 4819, 6793, 4823, 4824, + 4826, 4834, 4835, 4832, 4837, 4825, 4842, 4833, 4838, 4840, + + 4846, 4850, 4848, 4849, 6793, 4851, 4853, 4858, 4860, 4861, + 4863, 4864, 4867, 4869, 4866, 6793, 4873, 4874, 4875, 4876, + 4877, 4880, 4882, 4889, 4885, 4892, 4886, 4888, 4896, 4897, + 4898, 4906, 6793, 4899, 4901, 4903, 4916, 4912, 4921, 6793, + 4909, 6793, 4913, 4924, 4926, 4914, 4930, 6793, 6793, 4928, + 4939, 4922, 4936, 4937, 6793, 6793, 4942, 6793, 4938, 6793, + 4943, 4944, 6793, 6793, 4945, 4947, 4948, 4949, 4953, 4952, + 6793, 4962, 6793, 4965, 4963, 4955, 4966, 4967, 6793, 4968, + 4974, 4970, 4978, 4976, 6793, 4980, 4985, 4981, 4983, 6793, + 4992, 4993, 4984, 4986, 6793, 4994, 5001, 4997, 5005, 5006, + + 5007, 5008, 5011, 5013, 5009, 5014, 5016, 5017, 5024, 5031, + 5033, 5035, 5039, 5028, 5026, 5041, 5042, 5047, 5045, 5049, + 5050, 5051, 5052, 5054, 5056, 5053, 5059, 5061, 5063, 5064, + 5068, 5065, 5066, 5078, 5067, 5079, 5081, 5082, 5085, 5088, + 5089, 5090, 5092, 5093, 5095, 5018, 5094, 5096, 5101, 5098, + 5100, 6793, 5102, 5104, 5105, 5108, 5118, 5119, 5122, 5130, + 5134, 5135, 6793, 5137, 6793, 5139, 5123, 5131, 5125, 5143, + 6793, 5145, 5146, 5147, 5148, 5112, 5150, 5149, 5152, 5153, + 5155, 5156, 6793, 5160, 5161, 5154, 5174, 5163, 6793, 5177, + 5167, 5178, 5179, 5180, 5184, 5182, 5185, 5188, 5189, 5191, + + 5193, 5195, 5181, 5202, 5205, 6793, 5207, 5210, 5218, 5213, + 5214, 5215, 5216, 5217, 5219, 5221, 5223, 5224, 5233, 5225, + 5236, 6793, 5237, 6793, 5238, 5240, 5242, 5243, 5244, 5245, + 5246, 5248, 6793, 6793, 5251, 5252, 5258, 5253, 5260, 5262, + 5264, 5265, 5269, 6793, 5270, 5272, 5282, 5274, 6793, 5277, + 5279, 5283, 5289, 6793, 5284, 5286, 5290, 5298, 5291, 5301, + 5302, 5304, 5293, 5305, 5306, 5312, 6793, 6793, 6793, 6793, + 5314, 5308, 5319, 5316, 5320, 5322, 5323, 5325, 5328, 5321, + 5324, 6793, 5336, 6793, 6793, 5337, 5338, 5340, 5344, 5345, + 5346, 5347, 5350, 6793, 5348, 6793, 5352, 5355, 5351, 5362, + + 5368, 5359, 5369, 5371, 5372, 5373, 5374, 5375, 5382, 5380, + 5383, 5381, 5386, 5390, 5395, 6793, 6793, 5387, 5398, 5399, + 5407, 5403, 5404, 5405, 5416, 5411, 5412, 5413, 5414, 5418, + 5420, 5427, 5430, 5423, 5425, 6793, 5431, 5434, 5432, 6793, + 5433, 6793, 5442, 5443, 5436, 5440, 5446, 5449, 5450, 5452, + 5457, 6793, 6793, 5456, 5465, 5460, 6793, 6793, 5444, 5464, + 5467, 5469, 5470, 5471, 5472, 5473, 5476, 5478, 6793, 5479, + 6793, 5480, 5483, 5492, 5482, 5495, 5499, 5485, 5502, 5505, + 5498, 5508, 6793, 5501, 5509, 6793, 5517, 5512, 5514, 5516, + 5519, 6793, 5520, 5523, 5525, 5527, 6793, 5529, 5531, 5532, + + 6793, 5539, 6793, 5533, 5540, 5536, 5550, 5542, 6793, 5543, + 5546, 6793, 5552, 5556, 5557, 5558, 5559, 6793, 5562, 5564, + 6793, 5565, 5567, 5568, 5574, 5575, 5577, 5570, 5578, 5579, + 5586, 5588, 5591, 6793, 6793, 5598, 5584, 135, 5600, 5581, + 5597, 5601, 5602, 5609, 5605, 5606, 5612, 6793, 6793, 5613, + 6793, 5607, 5616, 6793, 5614, 5620, 5624, 5626, 5622, 5628, + 5629, 5631, 5633, 5634, 5647, 5637, 5635, 5652, 5642, 5662, + 5638, 5664, 5665, 5667, 5669, 5671, 5659, 5673, 5674, 5653, + 5676, 5677, 5680, 5681, 5683, 5684, 5685, 6793, 5688, 5696, + 5697, 5689, 6793, 5702, 5691, 5709, 5706, 6793, 5713, 5710, + + 5714, 5715, 5716, 6793, 5703, 5718, 5722, 5720, 5727, 5728, + 5640, 5736, 5731, 5732, 5733, 6793, 6793, 6793, 5738, 5748, + 6793, 5750, 5740, 5734, 5742, 6793, 5752, 5753, 5745, 6793, + 6793, 5755, 5756, 5758, 6793, 5763, 5770, 6793, 5765, 6793, + 5766, 6793, 5768, 5769, 5771, 5775, 6793, 5776, 5778, 5779, + 5785, 6793, 5795, 5797, 5799, 5792, 5782, 5788, 5800, 6793, + 5809, 5806, 5808, 5815, 5804, 5812, 5810, 5816, 5817, 5825, + 5818, 5827, 6793, 5828, 5829, 5833, 5836, 5820, 5830, 5840, + 6793, 5841, 6793, 5847, 6793, 5844, 5849, 5848, 5842, 5850, + 5853, 5856, 5854, 5858, 5867, 5860, 5863, 5865, 5871, 5873, + + 6793, 6793, 5875, 5877, 6793, 5879, 6793, 5883, 6793, 5880, + 5885, 5884, 5886, 5888, 6793, 5895, 5887, 5890, 5903, 5898, + 5904, 6793, 5905, 5908, 5909, 5911, 6793, 6793, 5912, 5919, + 5915, 6793, 5914, 5917, 5925, 5918, 5926, 5930, 5927, 5931, + 5934, 5941, 5937, 5939, 5942, 5944, 5945, 5947, 5952, 5957, + 6793, 6793, 6793, 5953, 5948, 5967, 5964, 5966, 5976, 5959, + 6793, 5973, 5972, 5974, 5975, 5986, 5981, 5983, 6793, 5984, + 5985, 5987, 5988, 5990, 5991, 5992, 5993, 6793, 6005, 6007, + 5995, 5997, 6009, 6016, 6018, 6020, 6022, 6013, 6023, 6030, + 6027, 6793, 6029, 6793, 6793, 6025, 6793, 6031, 6033, 6035, + + 6034, 6036, 6793, 6039, 6040, 6041, 6043, 6042, 6050, 6046, + 6048, 6793, 6058, 6051, 6061, 6063, 6793, 6793, 6064, 6070, + 6793, 6073, 6074, 6067, 6082, 6065, 6075, 6087, 6084, 6793, + 6088, 6090, 6078, 6091, 6094, 6093, 6096, 6793, 6100, 6097, + 6101, 6103, 6793, 6104, 6109, 6110, 6112, 6113, 6793, 6114, + 6106, 6130, 6115, 6793, 6117, 6129, 6131, 6793, 6793, 6135, + 6139, 6136, 6793, 6793, 6793, 6793, 6142, 6143, 6145, 6147, + 6793, 6150, 6154, 6158, 6160, 6165, 6153, 6793, 6161, 6167, + 6169, 6170, 6171, 6793, 6793, 6172, 6173, 6174, 6178, 6175, + 6793, 6793, 6180, 6182, 6183, 6181, 6184, 6793, 6186, 6191, + + 6198, 6194, 6200, 6207, 6209, 6202, 6210, 6211, 6219, 6222, + 6212, 6214, 6221, 6225, 6226, 6224, 6228, 6238, 6233, 6235, + 6241, 6236, 6244, 6793, 6793, 6246, 6793, 6248, 6250, 6793, + 6793, 6253, 6255, 6257, 6261, 6793, 6263, 6265, 6267, 6269, + 6258, 6793, 6270, 6272, 6273, 6274, 6275, 6793, 6277, 6278, + 6281, 6283, 6287, 6289, 6290, 6293, 6793, 6288, 6305, 6793, + 6793, 6294, 6296, 6285, 6306, 6302, 6793, 6310, 6314, 6309, + 6316, 6315, 6317, 6322, 6793, 6318, 6319, 6793, 6793, 6325, + 6326, 6793, 6793, 6327, 6793, 6793, 6793, 6793, 6793, 6793, + 6793, 6793, 6331, 6330, 6793, 6332, 6340, 6343, 6793, 6347, + + 6793, 6337, 6348, 6350, 6344, 6793, 6349, 6793, 6351, 6355, + 6356, 6365, 6358, 6368, 6359, 6352, 6362, 6370, 6375, 6376, + 6378, 6377, 6379, 6381, 6383, 6393, 6385, 6390, 6793, 6793, + 6793, 6382, 6394, 6398, 6399, 6404, 6406, 6410, 6412, 6401, + 6413, 6415, 6416, 6417, 6419, 6423, 6430, 6425, 6428, 6426, + 6435, 6427, 6437, 6793, 6442, 6443, 6429, 6446, 6793, 6449, + 6793, 6432, 6793, 6793, 6452, 6453, 6455, 6456, 6465, 6466, + 6457, 6461, 6462, 6467, 6469, 6793, 6477, 6793, 6793, 6470, + 6473, 6793, 6478, 6479, 6793, 6480, 6482, 6484, 6485, 6486, + 6488, 6489, 6490, 6497, 6793, 6793, 6501, 6502, 6504, 6506, + + 6508, 6515, 6510, 6512, 6514, 6522, 6516, 6524, 6793, 6526, + 6528, 6530, 6793, 6532, 6531, 6534, 6537, 6538, 6545, 6540, + 6542, 6793, 6543, 6793, 6547, 6549, 6548, 6551, 6552, 6554, + 6562, 6560, 6564, 6793, 6566, 6568, 6572, 6573, 6575, 6578, + 6579, 6580, 6582, 6584, 6585, 6594, 6588, 6590, 6596, 6598, + 6600, 6793, 6602, 6604, 6793, 6605, 6606, 6607, 6608, 6612, + 6793, 6617, 6609, 6614, 6620, 6625, 6622, 6793, 6631, 6635, + 6632, 6793, 6636, 6793, 6793, 6637, 6638, 6640, 6644, 6646, + 6793, 6793, 6793, 6673, 6680, 6687, 6694, 6701, 6708, 6715, + 88, 6722, 6729, 6736, 6743, 6750, 6757, 6764, 6771, 6778, + + 6785 } ; -static yyconst flex_int16_t yy_def[3372] = +static yyconst flex_int16_t yy_def[3502] = { 0, - 3353, 1, 3354, 3354, 3355, 3355, 3356, 3356, 3357, 3357, - 3358, 3358, 3359, 3359, 3360, 3360, 3353, 3361, 3353, 3353, - 3353, 3353, 3362, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3363, 3353, 3353, 3353, - 3363, 3364, 3353, 3353, 3353, 3364, 3365, 3353, 3353, 3353, - 3353, 3365, 3366, 3353, 3353, 3353, 3366, 3367, 3353, 3368, - 3353, 3367, 3367, 3369, 3353, 3353, 3353, 3353, 3369, 3370, - 3353, 3353, 3353, 3370, 3361, 3361, 3353, 3371, 3362, 3371, - 3362, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3363, - 3363, 3364, 3364, 3365, 3365, 3353, 3366, 3366, 3367, 3367, - 3368, 3368, 3367, 3369, 3369, 3353, 3370, 3370, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3367, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3367, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3367, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3367, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3353, 3353, 3361, 3353, 3353, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3367, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3367, 3367, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3367, 3361, 3361, - - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3361, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3353, 3361, 3367, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3367, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3367, 3361, 3353, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3353, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3353, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3367, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3353, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3353, 3361, 3361, 3361, 3361, 3367, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, - - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3361, - 3361, 3353, 3353, 3361, 3353, 3361, 3353, 3361, 3361, 3353, - 3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - - 3353, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3367, 3361, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3353, 3353, 3353, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - - 3361, 3361, 3361, 3361, 3361, 3361, 3367, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3353, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, 3361, - - 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, 3353, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3353, 3353, 3367, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3353, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, - - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3353, 3353, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3361, - 3353, 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3353, 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3353, 3361, 3361, 3353, 3361, 3353, 3361, 3353, 3361, - - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3353, 3353, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3353, - 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - - 3353, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353, - 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3353, 3353, - 3361, 3361, 3361, 3353, 3353, 3353, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3361, 3353, 3353, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, - - 3353, 3361, 3353, 3361, 3361, 3353, 3353, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3353, 3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3353, - 3353, 3361, 3361, 3353, 3353, 3361, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3361, 3361, 3353, 3361, 3361, 3361, - 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3353, - - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, - 3353, 3361, 3353, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3353, 3361, - 3361, 3353, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, - 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - - 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, - 3361, 3353, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, - 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, - 3361, 3353, 3361, 3353, 3353, 3361, 3361, 3361, 3361, 3361, - 3353, 3353, 0, 3353, 3353, 3353, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, - 3353 + 3483, 1, 3484, 3484, 3485, 3485, 3486, 3486, 3487, 3487, + 3488, 3488, 3489, 3489, 3490, 3490, 3483, 3491, 3483, 3483, + 3483, 3483, 3492, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3493, 3483, 3483, 3483, + 3493, 3494, 3483, 3483, 3483, 3494, 3495, 3483, 3483, 3483, + 3483, 3495, 3496, 3483, 3483, 3483, 3496, 3497, 3483, 3498, + 3483, 3497, 3497, 3499, 3483, 3483, 3483, 3483, 3499, 3500, + 3483, 3483, 3483, 3500, 3491, 3491, 3483, 3501, 3492, 3501, + 3492, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3493, + 3493, 3494, 3494, 3495, 3495, 3483, 3496, 3496, 3497, 3497, + 3498, 3498, 3497, 3499, 3499, 3483, 3500, 3500, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3497, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3497, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3497, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3497, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3483, 3483, 3491, 3483, 3483, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3497, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3497, 3497, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3497, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, + + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3497, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3497, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3483, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3497, 3491, 3483, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3483, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3483, 3491, 3483, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3497, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3497, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3491, + 3491, 3491, 3491, 3491, 3483, 3483, 3491, 3483, 3491, 3483, + 3491, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3497, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3483, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3497, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3483, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3483, 3491, 3491, 3491, 3483, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + + 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3483, 3491, 3491, 3497, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3491, + 3483, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3483, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3483, + 3483, 3491, 3491, 3491, 3483, 3491, 3491, 3483, 3491, 3483, + 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + + 3483, 3483, 3491, 3491, 3483, 3491, 3483, 3491, 3483, 3491, + 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3483, 3491, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3483, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3483, 3483, 3491, 3483, 3491, 3491, 3491, + + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3483, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3483, 3483, 3491, + 3491, 3491, 3483, 3483, 3483, 3483, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491, + 3483, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3483, 3491, 3483, 3491, 3491, 3483, + 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3483, + 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3483, 3483, 3491, + 3491, 3483, 3483, 3491, 3483, 3483, 3483, 3483, 3483, 3483, + 3483, 3483, 3491, 3491, 3483, 3491, 3491, 3491, 3483, 3491, + + 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3483, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491, + 3483, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, 3483, 3491, + 3491, 3483, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3483, 3483, 3491, 3491, 3491, 3491, + + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, + 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3483, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, + 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, + 3491, 3483, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491, + 3483, 3483, 0, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + + 3483 } ; -static yyconst flex_int16_t yy_nxt[6588] = +static yyconst flex_int16_t yy_nxt[6834] = { 0, 18, 19, 20, 21, 22, 23, 22, 18, 18, 18, 18, 18, 22, 24, 25, 26, 27, 28, 29, 30, @@ -1602,7 +1646,7 @@ static yyconst flex_int16_t yy_nxt[6588] = 311, 86, 86, 86, 86, 307, 86, 318, 86, 86, 86, 319, 86, 325, 312, 313, 315, 309, 314, 316, 86, 320, 86, 329, 321, 328, 322, 330, 327, 326, - 332, 86, 86, 86, 724, 334, 86, 338, 323, 331, + 332, 86, 86, 86, 736, 334, 86, 338, 323, 331, 324, 86, 335, 86, 86, 340, 86, 342, 86, 339, 341, 86, 333, 86, 86, 86, 344, 336, 86, 86, 86, 343, 86, 86, 346, 86, 348, 86, 345, 86, @@ -1627,648 +1671,676 @@ static yyconst flex_int16_t yy_nxt[6588] = 425, 86, 436, 86, 86, 434, 86, 438, 86, 441, 431, 437, 433, 86, 430, 86, 443, 446, 86, 86, 439, 447, 440, 86, 442, 86, 86, 445, 86, 86, - 457, 448, 86, 444, 86, 455, 86, 86, 86, 458, - 461, 459, 499, 449, 170, 462, 450, 456, 469, 86, - - 463, 451, 452, 453, 454, 466, 86, 460, 464, 465, - 467, 86, 86, 86, 86, 468, 86, 86, 86, 477, - 86, 86, 86, 479, 86, 475, 478, 476, 86, 472, - 470, 86, 480, 471, 473, 474, 86, 86, 86, 481, - 483, 482, 86, 487, 86, 168, 86, 86, 488, 86, - 489, 492, 86, 505, 493, 166, 484, 486, 485, 490, - 86, 86, 86, 86, 491, 86, 494, 495, 497, 86, - 498, 86, 500, 496, 86, 506, 507, 86, 86, 508, - 504, 86, 86, 86, 86, 501, 509, 86, 502, 546, - 503, 86, 510, 86, 520, 86, 511, 522, 519, 523, - - 86, 524, 86, 525, 512, 86, 513, 527, 514, 537, - 535, 536, 521, 170, 538, 86, 86, 86, 86, 526, - 86, 515, 539, 86, 516, 556, 517, 86, 518, 86, - 86, 528, 529, 542, 540, 86, 541, 165, 86, 543, - 545, 530, 544, 531, 532, 533, 86, 547, 534, 548, - 549, 86, 86, 86, 86, 558, 86, 551, 553, 86, - 550, 86, 86, 559, 86, 86, 86, 563, 555, 557, - 86, 554, 86, 86, 86, 552, 561, 566, 86, 560, - 562, 567, 568, 86, 86, 86, 565, 86, 86, 573, - 564, 86, 572, 86, 569, 574, 575, 86, 86, 570, - - 86, 571, 577, 86, 578, 86, 580, 581, 86, 584, - 594, 86, 582, 576, 86, 86, 86, 585, 603, 579, - 586, 86, 86, 595, 583, 86, 589, 596, 86, 597, - 599, 587, 86, 588, 590, 591, 86, 598, 592, 593, - 86, 86, 86, 86, 86, 602, 601, 604, 86, 606, - 608, 86, 86, 600, 86, 86, 611, 607, 612, 609, - 86, 86, 86, 605, 86, 610, 613, 86, 86, 86, - 618, 86, 616, 617, 86, 614, 86, 86, 619, 86, - 86, 86, 615, 620, 624, 86, 86, 627, 623, 625, - 86, 626, 86, 86, 621, 622, 86, 628, 86, 630, - - 86, 629, 86, 632, 634, 86, 86, 86, 86, 635, - 86, 637, 631, 86, 633, 86, 645, 647, 86, 86, - 639, 723, 86, 86, 86, 86, 636, 638, 640, 86, - 641, 642, 644, 646, 648, 643, 86, 86, 86, 649, - 652, 86, 655, 86, 650, 658, 86, 651, 86, 657, - 86, 86, 653, 86, 86, 86, 654, 86, 661, 664, - 86, 86, 86, 656, 660, 665, 667, 86, 86, 659, - 86, 86, 86, 86, 86, 86, 662, 666, 663, 681, - 86, 86, 86, 668, 670, 163, 684, 669, 86, 671, - 679, 682, 720, 698, 672, 680, 673, 683, 86, 86, - - 86, 86, 674, 86, 675, 685, 688, 676, 677, 686, - 692, 86, 691, 687, 678, 689, 86, 86, 690, 86, - 86, 693, 696, 86, 699, 86, 694, 86, 701, 86, - 86, 86, 86, 695, 86, 86, 86, 86, 86, 86, - 707, 86, 703, 697, 702, 708, 704, 711, 712, 170, - 700, 705, 710, 713, 714, 86, 706, 709, 86, 86, - 86, 86, 86, 86, 86, 727, 86, 715, 721, 726, - 86, 86, 86, 716, 725, 718, 722, 719, 717, 729, - 86, 86, 86, 86, 728, 86, 731, 86, 86, 86, - 735, 86, 730, 734, 740, 732, 86, 733, 736, 741, - - 86, 743, 86, 744, 86, 737, 745, 739, 738, 742, - 746, 86, 86, 747, 86, 748, 86, 749, 86, 86, - 86, 86, 750, 86, 86, 754, 86, 753, 86, 86, - 752, 757, 86, 86, 756, 86, 762, 751, 755, 86, - 758, 86, 86, 761, 86, 763, 86, 766, 86, 86, - 767, 760, 759, 765, 86, 86, 86, 86, 773, 86, - 770, 768, 764, 86, 86, 86, 86, 86, 774, 86, - 781, 86, 771, 775, 776, 769, 86, 772, 86, 777, - 86, 783, 778, 779, 780, 782, 86, 86, 788, 789, - 786, 784, 785, 787, 86, 86, 86, 86, 790, 86, - - 791, 86, 793, 86, 794, 86, 86, 86, 795, 86, - 86, 802, 86, 798, 800, 796, 86, 86, 86, 86, - 799, 86, 792, 797, 86, 803, 808, 810, 806, 86, - 801, 86, 86, 807, 805, 809, 804, 811, 812, 86, - 86, 86, 813, 86, 86, 86, 814, 819, 821, 815, - 817, 86, 86, 86, 86, 822, 820, 816, 86, 86, - 825, 86, 86, 818, 824, 826, 86, 86, 86, 86, - 832, 86, 829, 86, 827, 828, 86, 834, 835, 86, - 837, 86, 86, 823, 839, 86, 830, 831, 833, 838, - 841, 836, 86, 86, 86, 845, 86, 842, 843, 840, - - 846, 86, 86, 847, 86, 86, 849, 851, 844, 86, - 86, 86, 86, 850, 86, 857, 86, 848, 86, 86, - 858, 86, 86, 86, 86, 86, 86, 852, 853, 854, - 866, 855, 859, 860, 856, 86, 86, 861, 863, 86, - 865, 86, 862, 86, 86, 869, 86, 864, 871, 86, - 86, 86, 86, 867, 86, 868, 86, 880, 86, 878, - 870, 86, 86, 86, 872, 873, 881, 86, 874, 875, - 876, 877, 879, 86, 86, 882, 86, 86, 884, 886, - 86, 86, 883, 86, 86, 86, 86, 885, 890, 891, - 892, 893, 887, 889, 86, 86, 888, 86, 86, 894, - - 86, 86, 896, 895, 86, 170, 897, 902, 86, 899, - 901, 86, 898, 900, 86, 903, 86, 86, 86, 909, - 86, 86, 904, 905, 86, 910, 912, 86, 86, 86, - 914, 906, 907, 911, 913, 916, 86, 86, 908, 86, - 86, 86, 86, 918, 922, 86, 86, 915, 86, 919, - 86, 86, 86, 923, 86, 924, 917, 86, 86, 86, - 921, 86, 86, 942, 925, 920, 86, 937, 938, 935, - 940, 86, 927, 86, 936, 86, 926, 86, 161, 928, - 86, 939, 929, 86, 943, 965, 930, 941, 86, 931, - 86, 944, 86, 948, 949, 86, 932, 933, 946, 934, - - 86, 86, 947, 945, 86, 950, 951, 86, 952, 86, - 86, 953, 957, 959, 960, 86, 954, 86, 86, 962, - 86, 86, 955, 956, 86, 961, 964, 968, 969, 86, - 958, 86, 966, 970, 86, 963, 971, 86, 972, 86, - 86, 975, 86, 967, 974, 86, 973, 976, 977, 86, - 979, 86, 86, 86, 978, 980, 86, 86, 86, 86, - 86, 983, 86, 987, 981, 86, 86, 986, 86, 86, - 990, 86, 86, 996, 86, 982, 1007, 86, 984, 985, - 988, 994, 989, 992, 991, 86, 997, 86, 86, 1000, - 995, 998, 86, 999, 993, 86, 1001, 86, 86, 1003, - - 1004, 86, 86, 1002, 86, 86, 86, 1005, 1008, 86, - 86, 86, 1006, 86, 1009, 86, 1011, 86, 86, 86, - 1012, 1016, 86, 86, 1019, 86, 86, 1018, 1010, 1020, - 86, 86, 1017, 1013, 1014, 86, 1015, 86, 86, 1022, - 1023, 86, 86, 1025, 86, 1021, 86, 1027, 86, 86, - 1026, 1028, 86, 86, 1033, 86, 1029, 86, 1031, 1034, - 86, 1024, 86, 1035, 86, 1032, 1038, 86, 1036, 86, - 1044, 86, 1041, 1030, 1037, 86, 86, 1043, 86, 86, - 1042, 86, 86, 1046, 86, 1040, 86, 86, 1039, 86, - 86, 86, 86, 1057, 1054, 1052, 86, 1045, 86, 86, - - 1047, 1048, 1049, 86, 86, 1058, 1050, 1051, 86, 1055, - 1059, 1056, 1053, 86, 1062, 86, 1065, 86, 1061, 86, - 1064, 86, 1060, 86, 86, 86, 86, 1063, 86, 86, - 1067, 1074, 1069, 86, 1075, 1077, 86, 86, 86, 1066, - 86, 86, 86, 1068, 86, 1070, 1082, 1072, 1071, 1073, - 1076, 1080, 1078, 1079, 1081, 86, 86, 86, 86, 86, - 86, 1086, 1089, 1083, 86, 1088, 86, 1084, 86, 1090, - 86, 86, 1093, 1095, 86, 1085, 86, 1091, 86, 1087, - 86, 1098, 86, 1092, 86, 1097, 1099, 170, 1101, 86, - 1102, 1094, 86, 86, 1096, 86, 86, 1100, 86, 86, - - 1105, 86, 86, 86, 86, 1118, 86, 86, 86, 86, - 1119, 86, 1109, 1104, 1103, 1106, 1108, 1121, 86, 86, - 1278, 1110, 1107, 1120, 1111, 86, 1124, 86, 1112, 86, - 1113, 1123, 1122, 1125, 1114, 86, 1115, 86, 86, 1128, - 1126, 1116, 86, 1127, 1129, 86, 1117, 1130, 86, 86, - 86, 1131, 1132, 86, 86, 1135, 86, 1134, 1138, 86, - 86, 1137, 86, 86, 1133, 1136, 86, 1144, 1139, 1142, - 1145, 86, 1143, 1141, 1146, 86, 86, 1140, 1147, 86, - 86, 1148, 1149, 86, 86, 1150, 86, 86, 86, 86, - 1151, 86, 1161, 1152, 86, 1153, 1160, 1162, 86, 1164, - - 1154, 1163, 1155, 86, 86, 1167, 86, 86, 1156, 1165, - 1171, 1166, 86, 1157, 1158, 86, 86, 86, 86, 86, - 1159, 86, 1172, 1177, 86, 1168, 1169, 1173, 1170, 86, - 86, 1180, 86, 1178, 86, 1175, 1174, 86, 86, 1176, - 86, 1181, 1185, 86, 86, 1183, 86, 1184, 86, 1186, - 1179, 1182, 86, 86, 1191, 1188, 86, 86, 86, 86, - 86, 1189, 1187, 1194, 86, 1192, 86, 86, 86, 1190, - 178, 86, 86, 86, 86, 86, 1193, 1201, 1196, 1195, - 1198, 1199, 1200, 1203, 1202, 86, 1197, 86, 86, 86, - 1204, 86, 86, 86, 86, 1206, 86, 86, 1211, 1205, - - 86, 1212, 1208, 1214, 86, 1213, 1207, 1210, 1216, 1209, - 86, 1215, 1218, 1217, 86, 86, 86, 1221, 86, 86, - 86, 1223, 1222, 86, 1224, 86, 86, 86, 1219, 1225, - 86, 86, 1220, 1226, 1232, 86, 1234, 86, 1227, 86, - 86, 1228, 86, 1230, 1236, 1229, 1231, 86, 86, 86, - 86, 1238, 1235, 86, 86, 1233, 86, 86, 1240, 1241, - 86, 1237, 1244, 86, 86, 1243, 1242, 86, 1245, 86, - 1239, 1250, 1246, 1247, 86, 1249, 86, 86, 1251, 86, - 1248, 86, 86, 1252, 1254, 86, 1255, 86, 86, 86, - 86, 1261, 1259, 1262, 1253, 86, 86, 86, 86, 86, - - 1256, 1263, 86, 1260, 86, 1266, 1257, 1264, 1258, 1265, - 1269, 86, 86, 1267, 1271, 86, 86, 1270, 1268, 86, - 86, 86, 86, 86, 86, 86, 1276, 1277, 1272, 1273, - 1279, 86, 86, 86, 1283, 86, 1284, 86, 86, 1274, - 86, 1275, 86, 1286, 1281, 1287, 86, 86, 86, 1280, - 1285, 1291, 1282, 86, 86, 86, 1288, 86, 86, 86, - 1290, 1289, 170, 1293, 1297, 86, 86, 86, 86, 86, - 86, 1292, 86, 1302, 1304, 86, 1294, 86, 1296, 1301, - 1299, 1303, 1298, 1295, 1300, 1306, 1307, 86, 86, 86, - 1305, 86, 86, 1308, 1309, 86, 86, 1310, 86, 86, - - 86, 1311, 1312, 86, 1314, 86, 1316, 86, 1320, 86, - 1317, 86, 1313, 86, 86, 1315, 86, 86, 86, 86, - 1318, 86, 1324, 86, 1326, 1321, 1319, 1330, 1334, 1323, - 86, 1322, 1335, 1327, 86, 1328, 86, 1325, 1329, 86, - 1331, 1332, 1333, 86, 86, 86, 86, 1336, 86, 1337, - 86, 1340, 1338, 86, 1339, 86, 86, 86, 1343, 1347, - 86, 86, 1342, 86, 86, 86, 1348, 1341, 1345, 1344, - 1349, 86, 86, 86, 86, 1346, 1351, 1352, 86, 1354, - 86, 1353, 86, 1350, 86, 86, 86, 86, 86, 1355, - 86, 86, 1357, 1359, 1360, 86, 1364, 1356, 86, 1358, - - 86, 86, 86, 86, 1361, 86, 1363, 86, 1362, 1368, - 1365, 1366, 86, 86, 1376, 1371, 1369, 86, 1367, 86, - 86, 1370, 86, 86, 1372, 86, 86, 1374, 86, 86, - 1379, 1378, 1373, 1375, 1377, 86, 86, 86, 1383, 1384, - 1382, 1381, 1388, 1380, 1385, 86, 1398, 1386, 86, 1389, - 1387, 86, 1390, 86, 86, 1399, 1391, 86, 1400, 1392, - 1393, 86, 86, 1402, 1394, 1403, 1397, 1401, 86, 86, - 1395, 86, 86, 1404, 1396, 86, 1406, 1405, 86, 1408, - 86, 86, 86, 1409, 86, 1410, 86, 86, 86, 86, - 1407, 1418, 1415, 1413, 86, 176, 86, 86, 1419, 1420, - - 1412, 1411, 1416, 86, 86, 86, 1414, 1417, 86, 1421, - 1428, 86, 1422, 1427, 86, 1429, 86, 1423, 86, 1424, - 1433, 1425, 1432, 1426, 1430, 1431, 86, 86, 86, 1437, - 86, 86, 86, 1434, 1438, 86, 86, 1436, 86, 1439, - 86, 1441, 86, 86, 1435, 1447, 1442, 1443, 86, 1448, - 86, 86, 86, 1440, 86, 86, 86, 1446, 1449, 1444, - 1451, 1445, 86, 86, 86, 1453, 1450, 86, 1452, 1454, - 1458, 86, 1457, 86, 1460, 86, 86, 86, 1461, 86, - 1462, 1455, 86, 86, 1463, 1466, 86, 86, 1459, 1456, - 1468, 86, 1465, 86, 1469, 86, 86, 86, 1473, 86, - - 1470, 1464, 86, 86, 86, 86, 1475, 1467, 86, 175, - 1477, 86, 86, 86, 1479, 86, 1481, 1471, 1472, 86, - 1478, 86, 1474, 86, 1476, 86, 1480, 86, 1483, 1486, - 1482, 86, 1485, 1484, 86, 86, 1487, 1488, 86, 1490, - 1489, 86, 86, 1492, 86, 86, 1491, 1496, 1493, 1497, - 1499, 1494, 86, 86, 86, 86, 86, 1498, 1495, 86, - 86, 1503, 86, 1500, 86, 170, 86, 86, 1508, 1509, - 86, 1502, 86, 1511, 86, 86, 1510, 86, 1501, 86, - 1505, 86, 86, 86, 1504, 86, 1506, 86, 86, 1519, - 1507, 1512, 1514, 86, 1516, 86, 86, 1513, 86, 1517, - - 86, 1515, 86, 1520, 86, 1518, 86, 1523, 1524, 86, - 1528, 1526, 86, 1522, 1533, 1529, 86, 1527, 1521, 1525, - 86, 1531, 1530, 86, 86, 86, 86, 86, 1532, 1540, - 1537, 86, 86, 1538, 1542, 1539, 1543, 86, 1534, 1535, - 86, 1545, 1536, 86, 86, 1541, 1546, 86, 1544, 86, - 86, 86, 86, 86, 86, 1550, 1551, 86, 86, 1554, - 86, 86, 1547, 86, 1559, 86, 86, 1549, 86, 1560, - 1548, 1552, 1553, 86, 1556, 1563, 1557, 1555, 86, 1558, - 86, 86, 86, 86, 1561, 1564, 86, 1562, 86, 1571, - 86, 86, 86, 86, 1566, 1570, 1572, 1565, 1567, 86, - - 1575, 1568, 1574, 86, 86, 86, 1580, 1569, 86, 1579, - 1573, 1581, 86, 1577, 86, 1583, 86, 86, 1576, 86, - 86, 86, 86, 1588, 1589, 1578, 1584, 1587, 1582, 86, - 86, 1590, 86, 1591, 86, 1585, 86, 86, 86, 1592, - 1593, 86, 1586, 86, 86, 1595, 86, 1594, 86, 86, - 86, 86, 1596, 86, 1601, 86, 1597, 1600, 86, 1603, - 1598, 86, 1607, 1599, 86, 1609, 1604, 1608, 86, 1602, - 1610, 86, 1605, 86, 1606, 86, 1612, 86, 86, 86, - 86, 86, 86, 1620, 1611, 1616, 86, 1615, 86, 86, - 86, 1621, 1613, 1623, 86, 86, 1614, 86, 1617, 86, - - 1619, 1618, 1626, 1625, 86, 86, 86, 86, 86, 1624, - 86, 86, 86, 1627, 1622, 1635, 1632, 86, 1634, 86, - 86, 1631, 86, 1628, 1629, 1630, 1633, 1639, 86, 1636, - 1640, 86, 1638, 86, 86, 1643, 86, 1642, 1637, 1641, - 86, 86, 86, 1646, 86, 1644, 86, 1647, 86, 86, - 86, 1650, 1656, 1645, 1654, 86, 86, 1651, 86, 86, - 1648, 1655, 1649, 1658, 86, 1653, 86, 86, 1652, 1659, - 1660, 1661, 86, 86, 1657, 86, 86, 1666, 1667, 86, - 86, 86, 86, 86, 1664, 86, 1671, 1670, 1672, 86, - 86, 1663, 1662, 1675, 86, 86, 1665, 86, 1668, 1674, - - 86, 86, 1669, 1676, 86, 86, 86, 86, 1679, 1673, - 86, 1677, 86, 1678, 86, 1681, 86, 1682, 86, 86, - 1688, 1680, 1683, 1686, 86, 86, 1687, 86, 86, 86, - 86, 1684, 86, 1685, 1689, 86, 1694, 86, 86, 86, - 86, 1700, 1690, 1691, 1695, 1697, 1699, 86, 86, 1693, - 1696, 86, 1692, 1698, 86, 1702, 86, 86, 86, 1701, - 1705, 170, 1704, 1707, 1708, 86, 86, 86, 86, 86, - 1703, 86, 86, 1716, 86, 86, 1706, 1709, 86, 1717, - 86, 1711, 86, 1714, 1710, 1720, 86, 1712, 1713, 1721, - 86, 86, 86, 1724, 86, 1718, 1715, 1722, 1719, 1725, - - 1726, 1728, 1723, 86, 1730, 86, 86, 86, 86, 86, - 1727, 86, 86, 86, 1735, 1732, 1733, 1729, 86, 1736, - 86, 86, 86, 86, 86, 1741, 1740, 1731, 86, 86, - 86, 86, 1748, 170, 1737, 86, 1734, 1739, 86, 1738, - 1749, 1743, 86, 86, 86, 1745, 1742, 1750, 1746, 86, - 1744, 1757, 1752, 1758, 1753, 86, 1754, 86, 1755, 86, - 1747, 1756, 86, 1751, 86, 86, 1760, 86, 1761, 1759, - 1762, 86, 86, 86, 86, 86, 86, 1763, 86, 1769, - 1770, 1768, 86, 1772, 1764, 86, 86, 1771, 86, 86, - 86, 1765, 86, 1766, 86, 1767, 86, 1774, 1775, 86, - - 86, 1776, 86, 86, 86, 86, 86, 86, 1777, 86, - 86, 1773, 1786, 1785, 1778, 86, 1780, 1781, 1782, 86, - 1779, 86, 1791, 1783, 86, 86, 1787, 1788, 86, 86, - 86, 1784, 1790, 1789, 86, 1797, 86, 86, 86, 86, - 86, 1793, 86, 1799, 1792, 86, 1801, 86, 1795, 1794, - 86, 1796, 1800, 86, 1802, 86, 1803, 1798, 86, 86, - 86, 86, 1806, 86, 86, 1808, 86, 1815, 1805, 1809, - 1807, 1804, 1810, 1816, 86, 1811, 1812, 1817, 86, 86, - 86, 1813, 86, 1820, 1819, 1821, 86, 86, 1814, 86, - 86, 1818, 86, 86, 1824, 1822, 86, 1825, 86, 86, - - 86, 86, 1828, 1834, 86, 86, 1823, 1833, 1830, 1826, - 1832, 1831, 1827, 86, 86, 86, 1840, 1829, 1836, 86, - 1835, 1841, 86, 86, 86, 86, 86, 86, 1842, 1838, - 86, 1846, 1837, 86, 86, 1839, 1843, 86, 1850, 1849, - 86, 86, 1848, 1847, 1845, 86, 1854, 86, 86, 86, - 1844, 86, 1851, 86, 1852, 1858, 86, 1853, 1855, 86, - 1859, 86, 86, 1860, 1863, 86, 1857, 1869, 1856, 1864, - 1868, 1861, 1867, 1862, 86, 86, 1866, 86, 86, 1870, - 1865, 86, 86, 1874, 86, 86, 1878, 1871, 86, 86, - 86, 86, 86, 1876, 1872, 86, 1873, 1875, 86, 1877, - - 86, 86, 86, 1879, 86, 86, 1882, 1880, 86, 1883, - 1881, 1888, 86, 86, 1884, 1885, 1890, 1891, 1886, 1887, - 86, 1892, 86, 86, 1893, 86, 86, 1897, 86, 86, - 1899, 1895, 86, 1889, 86, 86, 86, 1903, 86, 86, - 1894, 86, 1898, 86, 86, 1896, 1906, 1905, 86, 1907, - 1901, 86, 86, 1902, 1900, 170, 1908, 1909, 86, 1904, - 1913, 86, 86, 86, 86, 1917, 86, 1911, 86, 86, - 86, 86, 86, 1912, 86, 1910, 1915, 1919, 86, 1924, - 1920, 1914, 1916, 1918, 1921, 86, 86, 86, 1928, 86, - 1922, 168, 86, 1927, 1923, 1929, 1926, 86, 1925, 1930, - - 86, 86, 1931, 1933, 1934, 86, 86, 86, 86, 86, - 1932, 86, 86, 1936, 86, 1937, 86, 86, 1935, 86, - 86, 86, 1942, 86, 1943, 86, 86, 1938, 86, 1944, - 1939, 1947, 1940, 1945, 1941, 86, 86, 1948, 1946, 86, - 1951, 1953, 1955, 86, 86, 1950, 1956, 1952, 86, 86, - 1949, 86, 86, 86, 1954, 86, 86, 1962, 86, 1965, - 1966, 86, 1967, 86, 86, 1957, 86, 1958, 1959, 1960, - 1963, 1961, 1964, 1969, 86, 86, 1970, 86, 1973, 86, - 1975, 86, 86, 1977, 1968, 1974, 86, 1971, 86, 86, - 1979, 1976, 86, 86, 86, 86, 86, 1981, 1972, 86, - - 1978, 1982, 86, 86, 1984, 1985, 86, 86, 86, 1989, - 1986, 86, 1988, 1983, 1991, 86, 1990, 1980, 86, 86, - 86, 86, 86, 166, 1987, 1999, 86, 1992, 1993, 1994, - 2001, 86, 86, 86, 1995, 2002, 86, 1997, 1996, 86, - 2003, 1998, 2000, 86, 2006, 2005, 2008, 2004, 86, 86, - 86, 86, 86, 86, 2007, 2012, 86, 2009, 86, 2014, - 86, 86, 2017, 2018, 86, 86, 2020, 86, 86, 2010, - 86, 2011, 86, 2015, 86, 2026, 86, 2013, 2025, 2022, - 86, 2023, 2016, 86, 86, 2019, 86, 86, 86, 86, - 2032, 86, 86, 2021, 2029, 2024, 2036, 2030, 2028, 86, - - 86, 2027, 86, 86, 2035, 2039, 86, 86, 2034, 2040, - 2038, 86, 2031, 2042, 2043, 86, 86, 2033, 86, 86, - 2037, 2044, 86, 86, 86, 2041, 86, 2045, 86, 2049, - 86, 86, 2052, 2053, 2054, 2048, 86, 86, 86, 86, - 86, 86, 2046, 2047, 86, 2057, 2050, 86, 2062, 86, - 86, 2056, 2061, 86, 86, 86, 2051, 2055, 2059, 2066, - 86, 2058, 86, 2067, 86, 86, 2060, 86, 2064, 2063, - 2068, 2070, 86, 2065, 2069, 86, 2074, 86, 2072, 2071, - 86, 2075, 86, 2073, 86, 86, 86, 2081, 86, 2078, - 86, 2084, 86, 86, 2076, 2083, 86, 2085, 86, 86, - - 86, 2077, 2086, 2082, 86, 2079, 2080, 86, 2087, 2091, - 86, 2088, 2092, 86, 2093, 2095, 2089, 2096, 86, 2094, - 86, 86, 86, 86, 2090, 2100, 86, 2098, 86, 86, - 2099, 86, 2102, 2097, 86, 86, 2105, 2107, 2101, 170, - 86, 2103, 86, 86, 2108, 86, 86, 86, 86, 86, - 2113, 86, 2109, 2112, 86, 2114, 2120, 2106, 2110, 2104, - 2115, 86, 2116, 86, 2111, 2118, 86, 86, 86, 2117, - 86, 86, 2119, 2121, 86, 2123, 86, 2122, 86, 2124, - 86, 2126, 86, 86, 2130, 86, 2125, 86, 2129, 86, - 2127, 86, 86, 86, 2128, 86, 2131, 2132, 2133, 86, - - 2135, 86, 2134, 86, 2137, 86, 2142, 86, 86, 2136, - 2139, 2140, 86, 2141, 86, 86, 86, 86, 2147, 86, - 86, 2138, 86, 2143, 2144, 86, 2152, 86, 86, 2148, - 2146, 2150, 2145, 86, 86, 86, 2153, 2149, 86, 2156, - 2151, 2158, 86, 86, 86, 2154, 2159, 86, 2157, 2155, - 86, 2164, 86, 86, 2160, 86, 2166, 86, 165, 86, - 2161, 2167, 2162, 86, 2163, 2168, 86, 2170, 86, 2165, - 86, 2169, 86, 2171, 86, 2174, 2172, 2175, 86, 86, - 2173, 86, 86, 2178, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 2179, 86, 86, 2192, 86, 2181, 2177, - - 2176, 2182, 2183, 2184, 86, 2186, 2180, 2191, 86, 86, - 2187, 86, 2189, 86, 2185, 86, 2195, 2190, 86, 86, - 2196, 86, 163, 2188, 2198, 86, 2193, 2199, 86, 2194, - 86, 2197, 86, 2201, 86, 86, 2200, 2202, 86, 2204, - 2207, 2203, 86, 2205, 86, 86, 2209, 2206, 2211, 86, - 86, 86, 86, 86, 2214, 86, 2213, 86, 2215, 2210, - 2216, 2208, 86, 2219, 86, 86, 86, 2223, 86, 86, - 2220, 86, 2224, 86, 86, 2217, 2212, 2221, 2222, 2225, - 2228, 86, 2218, 86, 2229, 86, 86, 2226, 2227, 2232, - 86, 86, 2234, 86, 86, 86, 2233, 2238, 86, 161, - - 2230, 86, 2236, 86, 2240, 86, 2231, 86, 2241, 86, - 2237, 2235, 86, 2239, 2242, 86, 86, 2243, 86, 86, - 2247, 86, 86, 86, 2249, 2245, 86, 2244, 2246, 2250, - 86, 2251, 2252, 2253, 2254, 86, 2248, 86, 86, 2257, - 2255, 86, 2256, 2260, 86, 86, 86, 86, 86, 86, - 2259, 86, 86, 86, 86, 86, 86, 86, 2258, 2269, - 2266, 2264, 2270, 2261, 2262, 2263, 2265, 2267, 86, 86, - 86, 86, 2268, 86, 86, 2272, 2274, 2271, 2278, 2275, - 2280, 86, 86, 2279, 86, 86, 2276, 170, 2273, 2282, - 86, 2277, 86, 2281, 86, 86, 2284, 2288, 2286, 2285, - - 2290, 2283, 2289, 86, 2291, 86, 86, 86, 2292, 2287, - 86, 86, 2295, 86, 86, 2293, 86, 86, 2296, 2300, - 86, 86, 2301, 2299, 86, 86, 3353, 2304, 2302, 86, - 2305, 2294, 2297, 86, 86, 2306, 2307, 86, 86, 86, - 2309, 86, 2303, 2298, 2308, 2310, 86, 86, 86, 2311, - 86, 2312, 86, 86, 86, 2315, 86, 86, 2313, 2318, - 86, 86, 86, 2324, 86, 86, 2322, 86, 2317, 2325, - 86, 86, 86, 2314, 2319, 2316, 2320, 2321, 86, 86, - 86, 86, 2326, 2327, 2323, 2333, 2332, 86, 86, 2329, - 86, 2330, 2335, 86, 86, 86, 2328, 86, 2336, 2331, - - 86, 86, 86, 86, 86, 2334, 86, 2337, 86, 86, - 86, 86, 2349, 2338, 2343, 2348, 2351, 2346, 2339, 2341, - 2347, 2340, 2342, 2345, 2344, 2350, 86, 86, 86, 86, - 2352, 86, 86, 2356, 2357, 86, 86, 86, 2358, 2359, - 86, 2353, 86, 2354, 2355, 86, 2362, 86, 2365, 86, - 2366, 86, 2360, 86, 86, 2361, 2363, 86, 2367, 2364, - 86, 86, 2368, 2372, 86, 2373, 86, 86, 2375, 86, - 86, 2377, 86, 2371, 2369, 86, 86, 2380, 86, 86, - 2370, 2379, 2381, 86, 86, 86, 2374, 86, 2376, 86, - 2378, 86, 86, 2382, 2383, 3353, 2386, 86, 2384, 2387, - - 86, 2389, 86, 2391, 86, 86, 2385, 2392, 2388, 86, - 2390, 86, 2393, 2395, 86, 86, 86, 86, 2398, 2401, - 86, 86, 86, 86, 2396, 86, 86, 2394, 2400, 2405, - 2397, 86, 2399, 2406, 86, 86, 86, 86, 2404, 86, - 2408, 2402, 2411, 86, 86, 2403, 2412, 86, 86, 86, - 2407, 2409, 2410, 2414, 2413, 86, 2418, 86, 86, 2420, - 86, 86, 2415, 2421, 2424, 86, 2416, 2419, 86, 86, - 86, 86, 86, 2425, 2426, 2417, 2427, 86, 2422, 86, - 2423, 2429, 2431, 86, 86, 86, 2436, 86, 2433, 2434, - 2428, 2438, 86, 2430, 86, 86, 86, 86, 86, 2439, - - 2435, 2440, 86, 86, 86, 2432, 2443, 86, 2437, 86, - 86, 2442, 86, 2444, 3353, 2449, 2445, 2450, 2446, 2447, - 2441, 86, 2452, 86, 86, 86, 2448, 2455, 2451, 86, - 2454, 86, 2456, 86, 2453, 86, 170, 86, 86, 86, - 2457, 2458, 2463, 86, 86, 86, 86, 86, 2465, 86, - 86, 86, 2470, 2461, 2462, 2459, 86, 2460, 2466, 2464, - 86, 2467, 2468, 2469, 86, 2471, 2474, 86, 2473, 2478, - 2472, 86, 2475, 2476, 86, 86, 2479, 2480, 2477, 86, - 2482, 86, 86, 86, 86, 86, 2484, 86, 2481, 86, - 86, 86, 2488, 86, 2489, 86, 86, 3353, 2483, 2485, - - 86, 2491, 86, 2486, 2496, 86, 2492, 2490, 2493, 2487, - 2494, 86, 86, 86, 86, 86, 86, 2495, 86, 2499, - 2500, 86, 2497, 2502, 86, 86, 86, 86, 86, 2501, - 86, 2506, 2509, 86, 2498, 2508, 86, 86, 86, 2510, - 2505, 86, 86, 86, 2503, 2504, 86, 2514, 2507, 86, - 86, 2519, 86, 86, 2511, 2518, 2512, 86, 2516, 86, - 2513, 2520, 86, 86, 2515, 2517, 86, 2528, 2521, 86, - 2524, 2522, 86, 2523, 2529, 2525, 86, 2527, 2526, 86, - 86, 2531, 86, 86, 2533, 86, 86, 86, 86, 86, - 86, 2530, 2532, 2537, 86, 86, 2541, 86, 86, 2539, - - 2540, 2535, 2542, 86, 2534, 2536, 2543, 86, 2544, 86, - 86, 86, 86, 86, 2545, 2547, 2538, 86, 2552, 86, - 2549, 86, 2554, 86, 86, 2550, 86, 86, 86, 86, - 2548, 2546, 2553, 2551, 2557, 86, 86, 86, 2561, 2558, - 86, 2556, 2555, 2562, 86, 2563, 2559, 2560, 86, 86, - 86, 86, 86, 2567, 86, 2566, 86, 86, 2565, 86, - 86, 86, 2571, 2634, 2570, 3353, 2564, 86, 2568, 86, - 2569, 86, 2574, 2575, 86, 2576, 86, 2577, 86, 2572, - 2573, 2578, 86, 2579, 86, 86, 2582, 2580, 86, 2581, - 86, 2583, 86, 86, 86, 2588, 86, 86, 2590, 86, - - 2584, 2591, 86, 86, 2585, 86, 86, 86, 86, 86, - 2587, 86, 86, 2586, 2592, 2594, 2589, 2593, 2595, 86, - 2600, 86, 86, 86, 2597, 86, 86, 2596, 170, 2598, - 86, 2599, 2601, 86, 2608, 86, 86, 86, 2602, 2604, - 2607, 86, 2603, 86, 2606, 2609, 86, 86, 86, 2605, - 2610, 2615, 2611, 86, 3353, 86, 2619, 86, 2617, 2612, - 2618, 2616, 2620, 86, 86, 2613, 86, 2621, 86, 2614, - 86, 2622, 86, 2623, 86, 86, 86, 86, 86, 2625, - 86, 86, 2624, 86, 86, 86, 2638, 86, 86, 2632, - 2627, 2639, 86, 2626, 86, 2629, 2628, 86, 86, 86, - - 2630, 2631, 86, 2633, 2635, 2636, 2637, 2642, 2640, 2643, - 86, 2644, 2645, 86, 86, 86, 86, 2646, 86, 2641, - 86, 86, 2648, 86, 2654, 86, 2655, 86, 86, 86, - 86, 2649, 2647, 86, 2659, 86, 2650, 2652, 2651, 2658, - 2660, 86, 2653, 2661, 86, 2663, 86, 2657, 2656, 86, - 86, 86, 86, 86, 86, 86, 2666, 2670, 86, 2669, - 2671, 86, 2662, 86, 2665, 2664, 86, 86, 2672, 2673, - 86, 86, 2667, 2668, 86, 86, 2675, 2674, 86, 86, - 2679, 86, 2676, 2677, 86, 2684, 86, 2683, 86, 86, - 2687, 86, 86, 86, 2678, 86, 2690, 86, 2680, 2682, - - 2681, 86, 86, 2685, 2688, 2692, 86, 2686, 2693, 86, - 2689, 86, 2691, 86, 86, 2694, 2698, 86, 86, 86, - 86, 2695, 86, 2701, 2702, 86, 2699, 2700, 2704, 86, - 86, 2696, 86, 2697, 86, 2705, 86, 86, 2707, 2703, - 86, 2706, 2710, 86, 86, 2711, 2708, 2713, 86, 86, - 86, 86, 86, 2714, 2718, 86, 2709, 2720, 86, 2712, - 2716, 2717, 2715, 86, 86, 2719, 86, 86, 2721, 2722, - 86, 86, 2724, 86, 86, 86, 86, 86, 2725, 86, - 2723, 2730, 2727, 2728, 2731, 2733, 86, 2734, 86, 2729, - 2726, 86, 2732, 2735, 170, 86, 86, 86, 2736, 2740, - - 2737, 86, 86, 2742, 86, 86, 2741, 86, 2745, 86, - 2746, 86, 2744, 86, 2738, 2739, 2748, 86, 86, 2743, - 86, 2749, 2750, 86, 86, 2752, 2747, 2751, 86, 2753, - 2755, 86, 86, 86, 86, 2756, 86, 2754, 2757, 86, - 86, 2758, 2762, 86, 2763, 86, 86, 2760, 86, 2759, - 86, 2764, 2766, 86, 86, 2765, 86, 2768, 2767, 86, - 86, 2761, 86, 86, 2770, 2771, 86, 86, 2769, 86, - 86, 2776, 86, 2779, 86, 2774, 2773, 86, 2775, 86, - 2772, 2777, 86, 2780, 86, 2778, 2784, 86, 86, 86, - 86, 86, 86, 2781, 86, 2785, 2789, 86, 86, 2787, - - 86, 86, 2782, 2783, 2793, 86, 2788, 3210, 2786, 2791, - 2796, 2790, 2794, 86, 2797, 2798, 86, 86, 2792, 86, - 86, 86, 2799, 86, 2801, 2800, 2795, 86, 86, 2804, - 86, 86, 86, 2805, 86, 86, 2802, 86, 2806, 86, - 2809, 2803, 2811, 86, 86, 2807, 3353, 2808, 2812, 86, - 2813, 86, 86, 86, 86, 2810, 2814, 86, 2815, 2816, - 86, 86, 2818, 2820, 2817, 86, 2819, 86, 2821, 86, - 86, 2824, 86, 2822, 2825, 86, 2826, 86, 86, 86, - 2828, 2827, 2831, 86, 86, 2823, 86, 2832, 2833, 86, - 2829, 86, 2835, 86, 86, 86, 2839, 2836, 86, 2830, - - 2840, 86, 86, 86, 86, 2842, 2834, 2841, 86, 2838, - 2843, 86, 2837, 86, 2848, 86, 2851, 86, 86, 2847, - 86, 2844, 2850, 86, 2845, 86, 86, 86, 2846, 2854, - 2852, 2853, 86, 86, 2857, 2856, 86, 86, 86, 86, - 2849, 86, 2860, 2864, 86, 86, 86, 86, 86, 86, - 2866, 86, 2855, 2858, 2859, 2863, 2861, 2870, 2867, 2862, - 2865, 2871, 2868, 2873, 2869, 86, 2872, 86, 2874, 86, - 2875, 2876, 86, 86, 2877, 86, 2878, 86, 2879, 86, - 2880, 2881, 86, 86, 86, 86, 86, 2882, 86, 86, - 2885, 86, 86, 2887, 2891, 86, 2892, 86, 2888, 86, - - 86, 86, 2893, 2883, 86, 2886, 2895, 86, 2896, 2898, - 2884, 2889, 2890, 2897, 86, 2899, 86, 86, 2894, 86, - 86, 86, 2904, 86, 86, 86, 2900, 86, 2901, 2902, - 86, 2905, 86, 2906, 86, 86, 86, 2910, 2914, 2903, - 86, 2908, 2911, 86, 2907, 2913, 86, 2909, 2912, 2916, - 86, 2915, 2917, 86, 2918, 86, 86, 2921, 86, 86, - 86, 86, 86, 86, 2927, 86, 86, 86, 2922, 2944, - 86, 2925, 2923, 86, 2920, 86, 86, 2928, 2930, 86, - 2919, 2931, 2961, 2926, 86, 2932, 2924, 2929, 2933, 86, - 86, 86, 2935, 86, 2934, 2936, 2937, 86, 2938, 86, - - 2939, 86, 2940, 86, 86, 86, 86, 86, 86, 2943, - 2941, 2945, 2946, 2947, 86, 86, 86, 86, 2953, 86, - 2949, 2951, 2942, 2948, 86, 2955, 86, 86, 86, 86, - 86, 2956, 86, 2957, 2958, 2952, 2950, 86, 2959, 86, - 2964, 86, 86, 86, 2954, 86, 86, 2962, 86, 2960, - 2967, 86, 86, 86, 2968, 2965, 2966, 86, 2972, 2963, - 2971, 86, 2973, 86, 2969, 86, 2974, 2977, 86, 86, - 2970, 2979, 86, 2980, 86, 86, 2982, 86, 86, 86, - 86, 2975, 86, 2987, 86, 2986, 86, 2990, 2978, 86, - 86, 2976, 86, 86, 2983, 2984, 2981, 86, 2985, 2989, - - 86, 2993, 86, 86, 2996, 86, 2988, 2998, 86, 86, - 86, 2992, 2991, 86, 2999, 86, 2994, 2997, 3001, 86, - 3002, 86, 2995, 3004, 86, 86, 86, 3009, 86, 3010, - 3000, 86, 86, 86, 86, 3003, 3006, 3007, 3013, 86, - 86, 3015, 86, 3005, 3011, 3014, 3008, 86, 86, 3018, - 3021, 3012, 3019, 86, 3017, 86, 86, 86, 86, 3016, - 3020, 3024, 86, 3023, 86, 86, 3022, 3027, 86, 3025, - 3030, 86, 86, 86, 86, 86, 86, 3035, 86, 86, - 86, 3353, 86, 86, 3026, 3028, 3029, 3031, 3041, 3034, - 3032, 3038, 3039, 86, 3040, 86, 3037, 86, 3036, 3033, - - 86, 3044, 86, 3045, 86, 3043, 3046, 86, 86, 86, - 3049, 3042, 86, 3051, 86, 86, 86, 3050, 86, 86, - 86, 3047, 86, 3056, 3057, 86, 86, 86, 86, 86, - 86, 3063, 86, 86, 3052, 3048, 3064, 86, 3065, 3062, - 3053, 3054, 3055, 3060, 86, 86, 3059, 86, 3061, 86, - 3069, 86, 3058, 3066, 3068, 3070, 86, 86, 86, 3073, - 86, 3072, 3071, 86, 3067, 86, 3076, 86, 3075, 86, - 3074, 86, 86, 86, 3077, 86, 86, 3080, 86, 86, - 86, 3082, 86, 3078, 3083, 3081, 86, 86, 86, 86, - 86, 3079, 86, 86, 3092, 3093, 3095, 3084, 3088, 3085, - - 3086, 3353, 86, 86, 3087, 3089, 3090, 86, 3091, 86, - 3098, 86, 3094, 3097, 3096, 3102, 3099, 3100, 86, 3101, - 86, 3103, 86, 86, 86, 3106, 86, 86, 3104, 3107, - 86, 3108, 3109, 86, 86, 3110, 3111, 3114, 86, 3112, - 3113, 86, 86, 3105, 86, 3118, 3115, 3117, 86, 86, - 86, 86, 86, 3116, 3123, 86, 86, 3122, 86, 86, - 86, 86, 86, 3119, 3126, 3125, 86, 3353, 3127, 86, - 3120, 3121, 86, 3131, 86, 3130, 3128, 3132, 86, 3135, - 3129, 3124, 3133, 86, 3134, 86, 3138, 3140, 86, 86, - 86, 3139, 86, 86, 3136, 86, 86, 3137, 86, 3148, - - 3144, 3145, 3147, 86, 3142, 86, 86, 3150, 86, 3151, - 86, 3143, 3149, 3141, 86, 86, 86, 3146, 3154, 86, - 3153, 3155, 86, 3157, 86, 3156, 3158, 86, 86, 3152, - 3159, 86, 3160, 86, 3161, 86, 3162, 86, 3163, 86, - 3164, 86, 86, 3167, 86, 86, 86, 86, 86, 86, - 86, 3166, 3172, 86, 3165, 3168, 86, 3169, 86, 3176, - 86, 86, 3175, 3173, 3178, 86, 86, 3170, 3171, 3174, - 86, 86, 3182, 3180, 86, 3177, 86, 3184, 3185, 3179, - 86, 86, 86, 86, 86, 3187, 86, 86, 86, 86, - 86, 86, 3181, 3191, 3183, 3186, 86, 3192, 86, 3190, - - 3193, 3188, 86, 3196, 3189, 3194, 86, 86, 86, 3197, - 3199, 86, 3200, 86, 3202, 3195, 3201, 86, 86, 86, - 3198, 86, 3205, 3204, 86, 86, 86, 3203, 86, 3209, - 86, 3207, 86, 3212, 86, 3206, 3208, 86, 86, 86, - 86, 3211, 86, 3213, 86, 86, 86, 3214, 86, 3219, - 3221, 86, 3215, 3216, 3218, 86, 3220, 3224, 86, 86, - 3223, 86, 3225, 3217, 3226, 3227, 86, 3222, 3228, 3229, - 86, 3231, 86, 86, 3232, 3230, 3233, 86, 3234, 86, - 3235, 86, 86, 86, 86, 3237, 86, 86, 3238, 3239, - 3242, 86, 86, 86, 3246, 86, 86, 86, 3245, 3248, - - 86, 3236, 3241, 86, 3244, 3243, 3249, 86, 86, 3252, - 86, 3240, 86, 86, 3255, 86, 86, 3247, 3250, 86, - 3256, 86, 86, 3259, 3257, 3260, 86, 3251, 3253, 86, - 3254, 86, 86, 86, 3265, 86, 3261, 86, 3264, 3262, - 3258, 3266, 86, 86, 86, 86, 86, 86, 3270, 86, - 86, 3263, 3272, 86, 86, 3277, 86, 86, 3267, 3269, - 3279, 86, 3278, 3268, 86, 86, 3271, 3274, 3273, 3275, - 86, 86, 3276, 3283, 86, 3285, 3284, 86, 3286, 86, - 86, 86, 86, 3281, 3280, 3287, 86, 3288, 3291, 3282, - 86, 3289, 3292, 86, 86, 3293, 3294, 86, 3290, 86, - - 86, 86, 86, 3295, 86, 3300, 86, 86, 3297, 86, - 3303, 86, 3304, 86, 86, 86, 86, 86, 86, 3296, - 3302, 3298, 3307, 3299, 3305, 3301, 86, 3306, 86, 3311, - 86, 3310, 86, 3308, 86, 3309, 86, 3312, 3353, 3313, - 86, 3315, 86, 3317, 86, 3318, 86, 86, 3322, 86, - 86, 3319, 86, 3316, 3320, 3321, 3314, 3323, 86, 86, - 3324, 3325, 86, 86, 86, 86, 3326, 86, 86, 3328, - 3327, 86, 3329, 3331, 86, 86, 3333, 86, 86, 3337, - 3334, 3338, 86, 3330, 3332, 86, 86, 3335, 86, 3341, - 3342, 86, 86, 3344, 86, 86, 3336, 3345, 86, 3343, - - 86, 86, 3346, 86, 3339, 3340, 3347, 86, 3348, 3351, - 86, 3352, 86, 3353, 3353, 3353, 3353, 3353, 3353, 3349, - 3353, 3353, 3353, 3353, 3353, 3353, 3350, 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, 3353, 89, - 89, 89, 89, 160, 160, 3353, 3353, 3353, 160, 160, - 162, 162, 3353, 3353, 162, 3353, 162, 164, 3353, 3353, - - 3353, 3353, 3353, 164, 167, 167, 3353, 3353, 3353, 167, - 167, 169, 3353, 3353, 3353, 3353, 3353, 169, 171, 171, - 3353, 171, 171, 171, 171, 174, 3353, 3353, 3353, 3353, - 3353, 174, 177, 177, 3353, 3353, 3353, 177, 177, 90, - 90, 3353, 90, 90, 90, 90, 17, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3353, 3353, 3353 + 457, 448, 86, 444, 86, 455, 86, 86, 170, 462, + 458, 463, 459, 449, 464, 86, 450, 456, 469, 470, + + 86, 451, 452, 453, 454, 460, 467, 86, 461, 465, + 466, 468, 86, 86, 86, 86, 86, 86, 478, 86, + 86, 86, 86, 480, 476, 477, 479, 86, 481, 473, + 471, 86, 86, 472, 474, 475, 86, 483, 86, 485, + 86, 488, 86, 489, 86, 490, 482, 86, 484, 86, + 506, 86, 86, 494, 491, 487, 493, 495, 486, 86, + 86, 86, 86, 86, 492, 496, 498, 86, 499, 86, + 501, 497, 170, 507, 86, 500, 508, 86, 505, 86, + 86, 86, 522, 502, 86, 509, 503, 523, 504, 86, + 510, 86, 511, 545, 86, 86, 525, 86, 512, 569, + + 528, 168, 513, 86, 86, 524, 526, 514, 527, 530, + 515, 86, 516, 540, 517, 541, 529, 86, 539, 86, + 542, 86, 86, 86, 86, 86, 548, 518, 86, 543, + 519, 166, 520, 86, 521, 86, 544, 531, 532, 547, + 550, 546, 553, 86, 549, 551, 86, 533, 534, 535, + 536, 537, 554, 552, 538, 86, 86, 86, 86, 86, + 556, 563, 555, 558, 561, 86, 86, 86, 86, 564, + 86, 86, 560, 568, 86, 86, 559, 86, 557, 86, + 562, 86, 566, 86, 86, 567, 565, 86, 571, 578, + 570, 572, 573, 575, 86, 574, 86, 576, 577, 86, + + 582, 579, 580, 86, 86, 585, 86, 583, 86, 86, + 86, 601, 86, 86, 86, 86, 165, 86, 603, 581, + 591, 592, 584, 587, 602, 586, 588, 589, 590, 86, + 86, 606, 593, 604, 594, 86, 86, 86, 86, 605, + 595, 86, 86, 86, 608, 609, 610, 611, 596, 597, + 86, 86, 598, 599, 86, 613, 600, 607, 615, 86, + 86, 86, 86, 618, 614, 616, 619, 86, 86, 86, + 612, 620, 86, 86, 617, 86, 86, 625, 623, 86, + 624, 86, 86, 621, 86, 626, 86, 86, 86, 631, + 622, 627, 632, 86, 86, 86, 630, 633, 86, 635, + + 629, 628, 86, 86, 638, 86, 634, 636, 86, 637, + 86, 640, 86, 86, 86, 86, 642, 639, 86, 645, + 86, 643, 86, 86, 86, 86, 641, 653, 86, 656, + 647, 86, 86, 86, 644, 646, 86, 654, 648, 652, + 649, 650, 651, 655, 658, 657, 661, 659, 86, 86, + 86, 660, 663, 86, 86, 666, 86, 665, 86, 86, + 86, 86, 86, 86, 669, 662, 86, 672, 86, 86, + 668, 673, 86, 664, 86, 86, 86, 675, 86, 667, + 86, 86, 670, 671, 674, 690, 86, 677, 678, 86, + 676, 86, 679, 689, 86, 86, 687, 680, 694, 681, + + 692, 688, 693, 86, 86, 682, 86, 683, 691, 695, + 684, 685, 86, 696, 86, 86, 86, 686, 697, 698, + 702, 701, 699, 86, 86, 700, 86, 706, 86, 86, + 704, 703, 705, 86, 709, 86, 711, 86, 86, 86, + 86, 86, 715, 86, 86, 86, 707, 86, 708, 718, + 713, 86, 712, 86, 710, 714, 719, 86, 716, 722, + 86, 724, 726, 170, 720, 717, 721, 725, 86, 723, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 733, 735, 727, 746, 86, 86, 728, 730, 86, 731, + 734, 729, 737, 732, 738, 86, 739, 740, 741, 86, + + 742, 86, 86, 86, 86, 86, 743, 86, 747, 86, + 163, 86, 86, 744, 752, 765, 745, 86, 748, 753, + 86, 755, 86, 751, 754, 749, 756, 86, 750, 757, + 758, 86, 759, 86, 760, 86, 761, 86, 763, 86, + 86, 762, 86, 86, 766, 86, 86, 86, 86, 764, + 769, 770, 86, 768, 86, 774, 773, 86, 86, 86, + 86, 86, 767, 776, 86, 778, 86, 780, 86, 86, + 86, 771, 86, 772, 86, 783, 777, 775, 779, 86, + 787, 86, 86, 781, 86, 86, 86, 788, 790, 86, + 782, 784, 86, 791, 786, 785, 792, 793, 789, 794, + + 86, 795, 86, 86, 86, 86, 802, 796, 797, 798, + 799, 86, 86, 86, 86, 86, 800, 804, 801, 805, + 803, 86, 86, 86, 86, 808, 807, 86, 809, 810, + 86, 86, 86, 86, 812, 86, 814, 816, 86, 86, + 86, 806, 811, 813, 817, 86, 86, 823, 86, 161, + 86, 825, 815, 86, 819, 821, 820, 822, 818, 86, + 826, 827, 86, 86, 86, 824, 86, 828, 830, 86, + 86, 829, 834, 836, 832, 86, 831, 86, 86, 86, + 835, 86, 86, 86, 837, 840, 86, 839, 86, 833, + 841, 86, 847, 844, 86, 86, 842, 86, 86, 843, + + 86, 86, 838, 86, 849, 850, 854, 845, 846, 86, + 852, 86, 86, 848, 856, 86, 862, 851, 853, 86, + 86, 855, 86, 860, 857, 86, 863, 858, 861, 86, + 86, 86, 864, 866, 86, 86, 86, 859, 865, 86, + 872, 86, 86, 867, 86, 873, 86, 86, 86, 86, + 86, 874, 868, 869, 881, 870, 879, 86, 86, 871, + 86, 86, 875, 876, 86, 86, 86, 877, 86, 878, + 86, 86, 880, 86, 86, 883, 884, 888, 882, 86, + 86, 86, 86, 86, 885, 896, 889, 886, 895, 887, + 890, 86, 897, 86, 86, 86, 899, 891, 892, 893, + + 894, 86, 86, 86, 86, 898, 901, 903, 902, 86, + 86, 86, 900, 86, 86, 86, 908, 907, 86, 904, + 909, 86, 906, 905, 86, 914, 911, 86, 86, 912, + 86, 86, 170, 913, 919, 86, 915, 920, 910, 917, + 86, 86, 916, 918, 921, 86, 86, 86, 86, 922, + 925, 86, 928, 86, 86, 929, 924, 931, 86, 86, + 923, 86, 926, 930, 932, 86, 86, 935, 86, 86, + 933, 86, 927, 86, 86, 937, 941, 86, 86, 86, + 938, 86, 86, 86, 934, 942, 936, 86, 943, 86, + 86, 86, 940, 86, 939, 86, 944, 957, 86, 956, + + 86, 958, 954, 946, 945, 86, 955, 947, 86, 959, + 948, 86, 86, 967, 949, 961, 965, 950, 86, 962, + 86, 963, 86, 86, 951, 952, 968, 953, 960, 86, + 86, 86, 86, 964, 86, 977, 86, 966, 86, 969, + 970, 86, 971, 86, 86, 972, 984, 980, 982, 976, + 973, 86, 978, 86, 979, 86, 974, 975, 981, 86, + 986, 990, 86, 86, 983, 989, 991, 86, 987, 86, + 985, 86, 993, 86, 86, 1001, 992, 86, 994, 995, + 86, 996, 997, 86, 988, 86, 998, 1000, 86, 86, + 999, 86, 86, 86, 86, 86, 1004, 86, 1008, 86, + + 86, 1002, 1007, 86, 86, 1011, 86, 86, 1017, 86, + 1003, 1013, 1015, 1005, 1006, 1009, 86, 1010, 86, 86, + 1018, 1016, 86, 86, 1012, 1019, 86, 1020, 1021, 1014, + 1023, 1028, 86, 1025, 86, 86, 86, 1024, 1022, 86, + 86, 1027, 86, 1026, 1029, 86, 1030, 86, 86, 86, + 1031, 86, 86, 86, 1033, 86, 1038, 86, 1034, 86, + 1041, 86, 86, 86, 86, 86, 1032, 1042, 1039, 1036, + 1035, 1040, 86, 86, 1037, 86, 86, 1047, 86, 86, + 86, 1043, 1049, 86, 1044, 1045, 86, 1048, 1046, 86, + 1052, 1050, 1053, 1055, 1051, 86, 1057, 86, 1056, 86, + + 86, 86, 1054, 86, 86, 86, 86, 86, 1063, 1065, + 1060, 86, 1058, 1066, 86, 86, 1064, 86, 86, 1059, + 1068, 86, 1062, 86, 86, 86, 1070, 1061, 86, 1079, + 86, 86, 1067, 1074, 1076, 86, 86, 86, 1069, 86, + 1072, 1071, 86, 1073, 86, 1080, 1077, 86, 1075, 1081, + 1078, 86, 1085, 1084, 86, 86, 1083, 86, 1082, 1087, + 1088, 86, 86, 86, 86, 1086, 86, 86, 86, 1098, + 86, 1091, 1093, 1099, 1089, 86, 1101, 1090, 86, 86, + 86, 86, 86, 1092, 86, 1104, 1094, 1096, 1106, 1095, + 1097, 86, 1100, 1105, 1102, 86, 86, 86, 86, 86, + + 1113, 1103, 1110, 86, 1112, 1114, 86, 86, 1108, 86, + 1115, 86, 86, 86, 1107, 1118, 1109, 1120, 86, 1111, + 86, 86, 86, 86, 86, 1117, 86, 1116, 1122, 1123, + 1126, 86, 1130, 1119, 86, 1127, 170, 1128, 1121, 86, + 86, 86, 1124, 1129, 1125, 1133, 1131, 86, 86, 86, + 86, 86, 86, 1146, 1132, 86, 1149, 86, 86, 1147, + 1134, 86, 1136, 1137, 86, 1151, 86, 1175, 86, 1138, + 86, 1135, 1139, 86, 86, 1154, 1140, 86, 1141, 1148, + 1156, 1152, 1142, 1150, 1143, 1157, 86, 86, 1153, 1144, + 86, 1155, 86, 86, 1145, 86, 1158, 1160, 86, 86, + + 1163, 86, 86, 1166, 1159, 86, 86, 1162, 86, 1161, + 1164, 1165, 1171, 86, 1173, 1167, 1174, 1170, 1172, 1169, + 86, 1176, 86, 1168, 1177, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 1189, 86, 1192, 86, 86, 86, + 1188, 1194, 1193, 86, 1191, 86, 1179, 1178, 86, 1180, + 86, 1181, 1190, 86, 1200, 1195, 1182, 1196, 1183, 86, + 86, 1199, 86, 86, 1184, 86, 86, 1197, 1201, 1185, + 1186, 1202, 1198, 86, 1207, 86, 1187, 86, 86, 1210, + 1203, 1204, 1208, 86, 1205, 86, 1211, 86, 86, 86, + 1215, 1206, 86, 1213, 86, 86, 86, 1209, 86, 1216, + + 86, 86, 1214, 1221, 1218, 86, 1212, 1219, 86, 86, + 1222, 1217, 86, 1224, 86, 86, 1220, 86, 86, 86, + 86, 86, 86, 86, 1223, 1231, 86, 1229, 1226, 1228, + 1230, 86, 1225, 1233, 86, 1227, 1237, 1232, 1234, 86, + 1235, 86, 86, 1236, 86, 86, 86, 86, 86, 178, + 1242, 1243, 1244, 1238, 86, 1239, 86, 1245, 1247, 1241, + 1240, 86, 1246, 1248, 86, 86, 86, 1252, 86, 86, + 86, 1249, 1253, 86, 86, 86, 1254, 1256, 1250, 1255, + 86, 86, 1251, 1257, 86, 1263, 1259, 86, 1258, 1265, + 86, 86, 86, 86, 1261, 86, 86, 1267, 1260, 1262, + + 86, 86, 86, 1269, 86, 1266, 1271, 1264, 86, 1272, + 1268, 86, 86, 86, 1270, 86, 1275, 1274, 1273, 1278, + 1276, 86, 86, 1281, 1277, 1282, 86, 86, 1280, 86, + 86, 86, 86, 1286, 1285, 86, 1283, 1279, 86, 86, + 86, 86, 86, 1290, 1292, 1293, 1296, 1294, 1284, 86, + 86, 86, 86, 1287, 1291, 86, 86, 1288, 1298, 1289, + 1295, 1297, 86, 86, 86, 1302, 86, 1299, 86, 1301, + 86, 86, 86, 1303, 1304, 86, 86, 86, 86, 1305, + 1309, 1300, 86, 86, 1307, 1306, 1310, 1312, 86, 1311, + 86, 1308, 86, 1316, 1317, 86, 86, 1320, 86, 86, + + 86, 1319, 1314, 86, 86, 86, 1313, 86, 1325, 86, + 1318, 1315, 86, 86, 86, 86, 86, 1323, 1322, 1331, + 86, 86, 1321, 1327, 170, 1324, 86, 1326, 86, 1332, + 86, 1333, 1328, 1334, 86, 1330, 86, 86, 86, 86, + 1329, 1339, 1341, 86, 1335, 1337, 1343, 1340, 1336, 1338, + 1344, 86, 86, 86, 86, 86, 86, 1347, 1346, 1342, + 86, 86, 86, 86, 86, 1348, 86, 1345, 1349, 1351, + 86, 86, 86, 1354, 86, 1350, 86, 1352, 1357, 86, + 86, 86, 1353, 86, 176, 1355, 1358, 1361, 1363, 86, + 1356, 1360, 1359, 1367, 86, 1368, 86, 1364, 86, 1365, + + 1362, 1369, 1366, 1370, 86, 1371, 86, 86, 86, 86, + 1373, 86, 86, 86, 86, 175, 86, 1377, 1376, 86, + 1372, 1380, 86, 86, 1384, 86, 1379, 1374, 86, 1375, + 86, 86, 1378, 1381, 1382, 1385, 1386, 86, 86, 86, + 86, 1383, 1388, 1389, 86, 86, 86, 1390, 1387, 86, + 86, 86, 86, 86, 86, 1391, 1396, 86, 1394, 1392, + 86, 86, 1403, 1397, 1393, 1395, 1401, 86, 86, 86, + 86, 1398, 1400, 86, 1399, 86, 1402, 1404, 1406, 86, + 86, 86, 1413, 86, 1415, 1407, 86, 1405, 86, 86, + 86, 1409, 1408, 86, 1410, 86, 1412, 1418, 86, 86, + + 86, 1416, 86, 1414, 1421, 1411, 86, 1417, 86, 86, + 1501, 1423, 1422, 86, 1420, 1419, 1424, 86, 86, 1428, + 1426, 1425, 1427, 86, 1429, 86, 1436, 1438, 1430, 86, + 1439, 1431, 1432, 86, 1437, 86, 1433, 1442, 86, 86, + 1440, 86, 1434, 86, 1443, 86, 1435, 1441, 86, 1445, + 1444, 86, 1447, 86, 86, 86, 1448, 1452, 1449, 86, + 86, 86, 1446, 86, 86, 86, 1455, 86, 1453, 1458, + 1459, 86, 1460, 1451, 1450, 86, 86, 86, 1456, 86, + 1454, 1461, 86, 1457, 86, 1468, 86, 1467, 1462, 86, + 1469, 1470, 1471, 1463, 86, 1464, 86, 1465, 86, 1466, + + 86, 1474, 1473, 86, 1477, 86, 1480, 1472, 86, 1478, + 86, 86, 1476, 1481, 1479, 86, 86, 86, 1475, 86, + 1487, 86, 1488, 86, 1483, 1482, 86, 86, 86, 86, + 86, 1489, 86, 1486, 1491, 1484, 1485, 86, 86, 1493, + 86, 1490, 1492, 86, 1494, 1497, 1498, 86, 1500, 86, + 1495, 86, 86, 86, 1502, 86, 86, 1503, 1499, 1506, + 86, 1508, 86, 1496, 1505, 86, 1509, 86, 86, 86, + 1513, 86, 1504, 1510, 86, 86, 1507, 86, 86, 1518, + 1516, 86, 86, 86, 86, 86, 1519, 86, 1511, 1521, + 1512, 1520, 1515, 86, 1514, 86, 1523, 86, 1517, 1524, + + 1525, 1522, 86, 86, 86, 86, 86, 1527, 1529, 1530, + 1531, 1526, 1528, 86, 1532, 86, 86, 86, 86, 86, + 1533, 1538, 1539, 1535, 86, 1536, 86, 86, 86, 1540, + 1542, 1541, 1537, 86, 1534, 86, 86, 86, 1546, 86, + 86, 86, 1543, 86, 170, 86, 1548, 86, 1545, 86, + 1554, 1555, 86, 86, 1544, 1550, 86, 86, 1556, 1551, + 1547, 1549, 1557, 86, 86, 86, 86, 1552, 86, 86, + 86, 1565, 1553, 1560, 86, 86, 86, 1558, 1562, 1563, + 86, 1569, 86, 1559, 1561, 1570, 86, 1564, 86, 86, + 1574, 86, 86, 1572, 1566, 1575, 86, 86, 1568, 86, + + 1567, 1577, 86, 86, 86, 1571, 86, 1578, 1573, 1576, + 86, 1579, 1586, 1585, 86, 86, 86, 1580, 1581, 1583, + 1587, 1582, 1584, 1588, 86, 1591, 1590, 86, 1589, 86, + 1592, 86, 86, 86, 86, 1593, 86, 86, 1596, 1597, + 86, 86, 86, 170, 86, 1600, 86, 86, 1605, 86, + 1595, 86, 86, 1594, 1598, 1606, 1602, 1599, 86, 1609, + 86, 1601, 1603, 86, 1604, 86, 86, 1607, 86, 86, + 1610, 1608, 86, 86, 86, 86, 86, 1612, 1616, 1611, + 86, 1613, 1617, 1614, 86, 1618, 86, 1622, 1615, 86, + 1619, 1623, 86, 1621, 1627, 1620, 86, 1626, 1624, 1628, + + 86, 86, 86, 1630, 86, 86, 1631, 86, 86, 86, + 1632, 86, 1625, 1636, 1637, 1629, 1635, 1638, 86, 86, + 86, 86, 1639, 86, 1633, 86, 1640, 1641, 86, 86, + 1634, 86, 86, 1642, 86, 86, 1644, 86, 86, 86, + 1643, 86, 1649, 86, 1645, 1648, 86, 1651, 1646, 86, + 1647, 1652, 86, 1655, 86, 1657, 86, 1650, 1656, 86, + 1658, 86, 1654, 1653, 86, 1660, 86, 86, 86, 86, + 86, 1664, 1659, 1661, 1668, 1662, 1663, 86, 86, 86, + 86, 86, 1669, 86, 1672, 86, 1675, 1665, 1667, 1666, + 86, 1674, 86, 86, 86, 86, 86, 86, 1670, 86, + + 1673, 86, 1676, 86, 1683, 1671, 86, 86, 86, 1684, + 1680, 1687, 1677, 1678, 1679, 86, 1682, 86, 1681, 1688, + 86, 1689, 86, 86, 1693, 86, 1685, 1686, 1690, 1691, + 1692, 86, 86, 86, 1695, 86, 86, 86, 1696, 86, + 86, 1699, 1703, 86, 1694, 1704, 1705, 86, 1700, 86, + 86, 1697, 86, 1698, 1708, 1702, 86, 1701, 86, 86, + 1709, 86, 1706, 1707, 86, 1710, 86, 86, 1715, 1716, + 86, 86, 168, 1713, 86, 86, 86, 1712, 1711, 86, + 1719, 86, 1720, 1721, 86, 1717, 1714, 1723, 86, 86, + 86, 86, 1718, 1724, 1725, 86, 1722, 86, 86, 1730, + + 1726, 1728, 86, 86, 86, 1733, 86, 1727, 86, 86, + 86, 1731, 86, 86, 1739, 1737, 86, 86, 1729, 86, + 86, 1734, 86, 1732, 86, 1740, 1738, 86, 1736, 1735, + 86, 1745, 86, 86, 1742, 1741, 86, 86, 1746, 1750, + 86, 1748, 1744, 86, 86, 1743, 86, 1751, 1749, 1754, + 1747, 86, 1753, 86, 86, 86, 86, 1752, 1757, 1761, + 1759, 1760, 86, 1755, 1756, 1758, 86, 86, 170, 86, + 86, 86, 1763, 86, 86, 86, 1771, 86, 86, 1762, + 86, 86, 1772, 1777, 1764, 1766, 86, 1765, 1769, 1767, + 1768, 1775, 86, 86, 86, 1776, 1779, 86, 1770, 1781, + + 1773, 1774, 1780, 86, 1783, 86, 86, 1785, 86, 86, + 86, 86, 86, 1778, 86, 86, 1790, 1787, 86, 1788, + 1784, 86, 1791, 1782, 86, 86, 86, 86, 1786, 1795, + 86, 1796, 1792, 86, 86, 86, 1789, 1803, 86, 166, + 1794, 1800, 1793, 86, 1801, 1797, 1798, 86, 86, 86, + 86, 1805, 1804, 1799, 86, 1808, 1802, 1810, 1807, 1812, + 1809, 1811, 86, 1813, 1817, 86, 86, 1806, 86, 86, + 86, 1814, 86, 1815, 86, 1816, 86, 86, 86, 86, + 86, 1818, 1824, 1823, 86, 1825, 1820, 1827, 86, 1826, + 1819, 86, 86, 86, 86, 86, 86, 1821, 86, 1822, + + 1829, 1830, 86, 1831, 86, 86, 86, 86, 86, 86, + 86, 86, 1832, 86, 86, 1828, 1833, 1841, 86, 86, + 1836, 1837, 1838, 1834, 86, 1835, 1842, 1839, 86, 86, + 1843, 1845, 86, 1848, 1849, 1840, 1844, 86, 1851, 86, + 1846, 86, 86, 1854, 86, 1847, 86, 86, 86, 86, + 1858, 86, 1856, 1850, 86, 1852, 86, 86, 86, 86, + 1857, 86, 86, 1853, 86, 1860, 1855, 1863, 1865, 1859, + 86, 86, 165, 1866, 1864, 1862, 1867, 86, 1868, 86, + 1861, 86, 1872, 1873, 86, 1869, 1874, 86, 86, 1875, + 1870, 1877, 1878, 86, 86, 86, 1871, 86, 86, 1876, + + 86, 1882, 1881, 86, 86, 1883, 86, 1879, 86, 86, + 86, 1891, 1892, 86, 1880, 1886, 86, 86, 1888, 1890, + 1885, 1889, 1884, 86, 86, 86, 86, 1887, 1898, 86, + 86, 86, 86, 1899, 86, 1900, 1893, 1894, 86, 1896, + 86, 1895, 1897, 1901, 86, 1904, 86, 1906, 86, 1908, + 1903, 1907, 86, 86, 1902, 86, 1905, 86, 1912, 86, + 1916, 1910, 86, 1909, 1911, 1917, 86, 86, 86, 86, + 86, 1924, 86, 1913, 1921, 1922, 1918, 1915, 1914, 1925, + 86, 86, 1919, 86, 86, 86, 1928, 86, 1923, 1926, + 1920, 86, 86, 1929, 1927, 1932, 86, 86, 1936, 86, + + 1934, 86, 86, 1930, 86, 1931, 1935, 1937, 86, 1933, + 86, 86, 86, 86, 86, 86, 1941, 86, 1940, 86, + 1950, 1938, 1942, 1944, 86, 1943, 86, 1939, 1945, 1948, + 86, 1946, 1951, 1947, 1953, 86, 86, 1952, 86, 86, + 86, 1957, 86, 1959, 86, 86, 86, 86, 86, 86, + 86, 1949, 1963, 86, 1965, 86, 1954, 1955, 1958, 1956, + 1966, 86, 1961, 86, 86, 1962, 1960, 86, 1964, 1968, + 86, 86, 1969, 86, 86, 170, 1974, 86, 86, 1970, + 86, 1967, 1972, 1973, 1977, 86, 1971, 1975, 86, 1981, + 86, 86, 1976, 86, 86, 86, 86, 1978, 86, 1980, + + 1979, 1983, 86, 1988, 86, 1982, 86, 1984, 1985, 86, + 86, 1995, 1986, 86, 1989, 2000, 1991, 86, 1987, 1992, + 86, 86, 1990, 86, 1993, 1994, 86, 1997, 1998, 86, + 86, 86, 1996, 86, 2001, 86, 86, 2002, 86, 86, + 86, 86, 1999, 86, 2006, 2007, 86, 86, 86, 86, + 2008, 86, 2011, 86, 2004, 2009, 2005, 2003, 2012, 86, + 86, 2010, 2019, 86, 2017, 2015, 2018, 2020, 2014, 86, + 86, 2013, 2016, 86, 2021, 86, 86, 86, 86, 2026, + 86, 2029, 2030, 86, 2031, 86, 86, 86, 2022, 2023, + 86, 2024, 2027, 86, 2028, 86, 2025, 2033, 86, 86, + + 2034, 2037, 86, 86, 2039, 86, 2032, 2038, 2035, 86, + 86, 2036, 2040, 2041, 2043, 2048, 86, 86, 2045, 86, + 86, 2044, 86, 2042, 86, 2046, 2047, 86, 86, 2049, + 2050, 86, 2051, 86, 86, 86, 2055, 86, 2053, 2054, + 2057, 86, 2056, 86, 86, 86, 86, 86, 163, 2052, + 2065, 86, 2067, 2058, 2059, 2060, 86, 2068, 86, 86, + 2061, 86, 2063, 2062, 86, 2064, 2070, 2066, 86, 2074, + 2071, 86, 2072, 2069, 86, 86, 86, 2078, 86, 2073, + 2075, 86, 86, 2080, 86, 86, 86, 86, 2083, 2084, + 86, 2086, 86, 86, 2076, 86, 2091, 2077, 86, 86, + + 86, 86, 86, 86, 2081, 2085, 86, 2079, 2082, 2088, + 2089, 2093, 86, 86, 2092, 86, 2090, 86, 2087, 86, + 2094, 2095, 2096, 86, 2099, 86, 2097, 2103, 86, 2098, + 2102, 86, 86, 86, 2106, 2101, 2109, 86, 2105, 2100, + 86, 86, 86, 2107, 2110, 86, 2112, 86, 2104, 86, + 86, 2108, 2111, 86, 86, 86, 86, 2116, 86, 2119, + 2120, 2121, 2115, 86, 86, 86, 86, 86, 86, 2113, + 86, 86, 2114, 2117, 2124, 86, 2129, 86, 86, 2123, + 2128, 86, 2118, 2122, 86, 2126, 86, 2130, 2133, 86, + 2125, 86, 2134, 2127, 86, 2135, 2131, 2132, 2137, 86, + + 86, 86, 86, 2136, 2138, 2141, 86, 2142, 86, 86, + 86, 86, 2139, 2148, 2145, 86, 2143, 2140, 86, 86, + 86, 86, 86, 2151, 2153, 86, 2155, 2144, 86, 2154, + 2146, 2147, 86, 2149, 2152, 2150, 86, 86, 2160, 86, + 2162, 2156, 2161, 86, 2164, 2163, 86, 2157, 2165, 86, + 86, 86, 2158, 86, 86, 2169, 2167, 2159, 86, 86, + 86, 86, 86, 2171, 86, 2168, 86, 2173, 2175, 86, + 2170, 2177, 2172, 86, 86, 2166, 170, 86, 2178, 86, + 86, 2181, 86, 86, 86, 86, 2176, 2174, 2179, 2185, + 86, 2187, 2182, 2180, 2183, 86, 2188, 86, 2186, 2189, + + 86, 2191, 2184, 86, 86, 2190, 86, 86, 86, 2192, + 2194, 2193, 86, 86, 86, 2197, 86, 2195, 2196, 86, + 2199, 86, 86, 2203, 86, 86, 2198, 2202, 2200, 86, + 86, 86, 2207, 2201, 2204, 2205, 2206, 2208, 86, 86, + 86, 86, 86, 86, 2215, 2213, 86, 86, 86, 2210, + 86, 2214, 86, 86, 86, 2220, 86, 2217, 86, 2209, + 2211, 86, 2212, 86, 86, 2216, 2221, 2219, 86, 2225, + 2218, 86, 2223, 2226, 2222, 86, 86, 86, 2224, 86, + 2229, 86, 2228, 2227, 2231, 86, 86, 86, 2237, 2230, + 2232, 86, 86, 2233, 86, 2234, 2235, 86, 2239, 86, + + 2236, 2240, 2242, 86, 86, 2244, 86, 86, 2238, 86, + 2241, 2248, 2243, 86, 2245, 2247, 86, 86, 86, 86, + 86, 86, 2253, 2250, 86, 86, 86, 86, 86, 86, + 2246, 86, 2249, 2254, 86, 86, 86, 2262, 2256, 2257, + 2252, 2251, 86, 2258, 86, 86, 2255, 2259, 86, 2261, + 2263, 2267, 86, 86, 86, 2260, 2264, 2266, 86, 2271, + 86, 2270, 2268, 86, 86, 2265, 86, 86, 2269, 2273, + 86, 2276, 2274, 2272, 2277, 86, 86, 86, 2275, 86, + 86, 2279, 2282, 86, 2278, 2280, 2284, 86, 86, 2281, + 2285, 86, 86, 2287, 86, 86, 2289, 2286, 2283, 86, + + 2291, 2290, 86, 86, 86, 2295, 86, 2292, 86, 86, + 2299, 86, 86, 2288, 2296, 2300, 86, 86, 86, 2297, + 2298, 2293, 2304, 86, 2294, 2301, 86, 2305, 86, 86, + 2308, 2302, 2303, 86, 86, 86, 86, 2310, 2309, 86, + 2314, 86, 86, 2306, 86, 2316, 86, 2312, 86, 2307, + 86, 2317, 2311, 86, 2315, 2313, 86, 2318, 2319, 86, + 86, 2323, 86, 86, 2320, 2321, 2325, 86, 2322, 86, + 86, 2326, 86, 86, 2327, 2329, 2328, 86, 2331, 86, + 86, 2324, 2330, 86, 2332, 2336, 86, 86, 86, 2334, + 2333, 86, 2335, 86, 86, 86, 86, 86, 2337, 86, + + 2343, 86, 86, 86, 2339, 2338, 2347, 2341, 2344, 2342, + 86, 2345, 2349, 86, 86, 2348, 2340, 2346, 86, 2350, + 2352, 86, 86, 2358, 86, 2353, 86, 86, 2360, 86, + 86, 86, 2351, 2354, 86, 2357, 2359, 86, 2363, 2355, + 86, 86, 2364, 2367, 170, 86, 2369, 2356, 2361, 86, + 2362, 2370, 86, 2365, 86, 2371, 2372, 2373, 86, 86, + 2366, 86, 86, 2376, 86, 2375, 2368, 2374, 86, 2377, + 86, 2381, 86, 86, 2382, 86, 2384, 86, 2385, 2380, + 86, 2387, 2386, 2378, 86, 2388, 86, 2383, 86, 2390, + 86, 86, 86, 2389, 2379, 86, 2391, 86, 86, 86, + + 86, 2393, 86, 86, 2396, 86, 86, 86, 2399, 86, + 2392, 2394, 86, 86, 2403, 2398, 2405, 86, 86, 86, + 86, 2401, 2406, 2395, 2400, 2397, 86, 2402, 2407, 86, + 86, 2408, 86, 86, 2404, 86, 86, 2413, 2410, 2416, + 86, 2411, 86, 86, 2417, 2409, 2414, 86, 86, 2412, + 86, 86, 86, 2415, 86, 86, 86, 86, 2426, 86, + 86, 2418, 2419, 2424, 86, 2430, 2433, 86, 2428, 2422, + 2420, 2427, 2421, 2423, 2429, 2425, 86, 2432, 2431, 86, + 86, 86, 86, 2435, 2434, 86, 86, 2439, 2440, 86, + 86, 86, 2441, 161, 2436, 86, 2437, 86, 2438, 2442, + + 86, 86, 2445, 86, 2448, 86, 2443, 86, 2444, 2449, + 86, 86, 2446, 86, 86, 2447, 2450, 2452, 2451, 2455, + 86, 2456, 86, 86, 2458, 86, 2454, 2453, 86, 2460, + 86, 86, 86, 2463, 86, 86, 2462, 2464, 86, 86, + 86, 86, 2457, 86, 86, 86, 2459, 2461, 2466, 2465, + 2470, 2471, 86, 2473, 86, 2468, 86, 2467, 86, 86, + 2477, 86, 2469, 2472, 2475, 86, 2479, 86, 2476, 86, + 86, 86, 2482, 86, 2474, 2478, 2485, 86, 86, 86, + 2480, 86, 86, 86, 2481, 86, 2483, 2489, 2490, 86, + 2492, 86, 2484, 86, 2495, 86, 2488, 86, 2486, 86, + + 86, 2491, 2487, 86, 86, 86, 2493, 2497, 2494, 86, + 2502, 86, 86, 2498, 2504, 86, 86, 2496, 2505, 2508, + 2503, 2499, 2500, 86, 86, 86, 86, 86, 2509, 2510, + 86, 2501, 2511, 2506, 86, 2507, 86, 86, 86, 2513, + 86, 2515, 2517, 2518, 2520, 86, 2521, 86, 2512, 86, + 86, 2514, 86, 2524, 2525, 2519, 86, 86, 86, 86, + 2516, 2526, 2523, 86, 86, 86, 2522, 2529, 86, 86, + 86, 2528, 2530, 2535, 2531, 2536, 86, 2532, 2533, 86, + 2537, 86, 2527, 86, 2534, 86, 86, 86, 2541, 86, + 2542, 86, 2543, 86, 2546, 2540, 86, 170, 2545, 86, + + 2544, 86, 2547, 2538, 86, 2539, 2552, 86, 86, 86, + 86, 86, 86, 86, 86, 2563, 86, 2550, 2554, 2548, + 2551, 2549, 2555, 2553, 2558, 86, 86, 2556, 2557, 2559, + 2560, 86, 86, 2564, 2561, 2565, 86, 86, 86, 86, + 2566, 2568, 2569, 2562, 2567, 86, 86, 86, 86, 2571, + 86, 86, 2572, 86, 2570, 86, 2573, 2578, 2574, 86, + 2577, 86, 86, 86, 86, 2575, 86, 2580, 2581, 2582, + 2583, 86, 2576, 86, 86, 2579, 86, 86, 2584, 86, + 86, 2589, 86, 2585, 2588, 2586, 86, 86, 86, 86, + 86, 2591, 2590, 86, 2595, 86, 2598, 2587, 86, 86, + + 2597, 86, 86, 2594, 2599, 86, 2600, 2592, 2593, 86, + 86, 86, 86, 2596, 86, 2604, 86, 2601, 2606, 86, + 2602, 2609, 86, 2610, 2607, 86, 86, 86, 2603, 86, + 2608, 2613, 2605, 2611, 86, 86, 2612, 86, 2615, 86, + 2614, 86, 2616, 86, 2618, 2619, 2620, 2621, 2622, 86, + 86, 86, 86, 2617, 2624, 86, 86, 86, 86, 2623, + 86, 86, 86, 2628, 2633, 86, 86, 2631, 86, 2625, + 2626, 2632, 2635, 2627, 2634, 86, 86, 2636, 86, 86, + 86, 86, 2630, 86, 2637, 2639, 2629, 86, 2644, 86, + 2641, 86, 2646, 86, 86, 2642, 86, 86, 86, 86, + + 2640, 2638, 2645, 2643, 2649, 86, 86, 86, 2653, 2650, + 86, 2648, 2647, 2654, 86, 2655, 2651, 2652, 86, 86, + 86, 86, 86, 2659, 86, 2658, 86, 86, 2657, 86, + 86, 86, 2663, 2703, 2662, 86, 2656, 86, 2660, 86, + 2661, 86, 2666, 2667, 86, 2668, 86, 2669, 86, 2664, + 2665, 2670, 86, 2671, 86, 86, 2674, 2672, 86, 2673, + 86, 2675, 86, 86, 86, 86, 86, 86, 2682, 86, + 2676, 2684, 86, 2685, 86, 2678, 86, 86, 86, 86, + 86, 86, 2677, 2681, 2679, 2683, 2680, 2686, 2688, 2687, + 2689, 86, 86, 2694, 86, 86, 2691, 2696, 86, 2690, + + 2692, 86, 86, 86, 2695, 86, 86, 170, 86, 86, + 2705, 86, 2693, 86, 86, 86, 2699, 86, 86, 2704, + 2701, 86, 2698, 2706, 2712, 86, 2707, 2697, 2708, 2700, + 2702, 86, 86, 2709, 2729, 86, 86, 2714, 86, 2710, + 2715, 2711, 2716, 86, 86, 2713, 2717, 86, 86, 2718, + 86, 2719, 86, 2720, 2721, 2722, 86, 2723, 86, 86, + 86, 86, 86, 86, 2731, 86, 86, 86, 86, 86, + 2735, 2724, 2736, 86, 86, 2740, 86, 2726, 2725, 2742, + 86, 2728, 2727, 2730, 2733, 2732, 2734, 86, 2737, 2738, + 86, 86, 86, 86, 86, 86, 2739, 86, 86, 2741, + + 2745, 86, 86, 3483, 86, 2752, 86, 2753, 86, 2743, + 2744, 2751, 2746, 2747, 2754, 86, 2748, 2749, 86, 2757, + 86, 2750, 2758, 86, 2756, 2759, 86, 86, 86, 86, + 86, 86, 86, 2755, 86, 2764, 86, 86, 86, 2768, + 2770, 2767, 2761, 2763, 2760, 2769, 86, 2762, 2771, 86, + 86, 86, 2765, 86, 2766, 86, 86, 86, 86, 86, + 2773, 86, 2777, 2778, 86, 86, 86, 2775, 2782, 2772, + 2783, 86, 2774, 86, 2786, 86, 2776, 86, 86, 2779, + 2780, 2784, 86, 86, 2781, 86, 2789, 86, 2787, 2791, + 86, 2785, 86, 2788, 2792, 86, 86, 86, 2790, 86, + + 2793, 2797, 86, 86, 86, 2794, 86, 2800, 2799, 2798, + 2801, 86, 2795, 2803, 86, 86, 2796, 86, 86, 86, + 2804, 86, 2806, 2802, 2809, 86, 2805, 86, 2810, 86, + 2807, 2812, 86, 86, 86, 86, 86, 86, 86, 2808, + 2818, 86, 2813, 2811, 2815, 2816, 2814, 2817, 2821, 86, + 86, 86, 2820, 86, 2819, 2822, 2823, 86, 86, 86, + 86, 86, 2825, 86, 86, 86, 2826, 2824, 86, 2828, + 2831, 2829, 86, 2832, 2834, 86, 2830, 2836, 2827, 2833, + 2835, 86, 86, 2838, 170, 86, 86, 86, 86, 2843, + 3483, 2840, 2839, 86, 86, 86, 86, 2845, 2844, 86, + + 86, 2837, 2848, 86, 2847, 2841, 2842, 2849, 86, 2846, + 2851, 86, 86, 2850, 2853, 2852, 86, 86, 86, 2854, + 86, 2855, 2856, 2858, 86, 86, 86, 86, 2859, 86, + 2860, 86, 2857, 86, 2865, 2861, 86, 2866, 86, 2863, + 86, 2867, 2862, 86, 86, 86, 86, 86, 2871, 86, + 2868, 2869, 2870, 86, 2864, 86, 86, 86, 2872, 86, + 2873, 2874, 86, 86, 2879, 86, 2876, 2875, 2877, 86, + 86, 2878, 2883, 86, 2880, 2881, 2885, 86, 86, 2884, + 86, 2888, 86, 86, 86, 86, 86, 2882, 2893, 86, + 2889, 86, 86, 86, 2891, 86, 86, 2886, 86, 2887, + + 2897, 2892, 2900, 2890, 2898, 86, 2901, 2895, 86, 2903, + 2894, 86, 86, 2896, 86, 86, 2902, 2904, 86, 2905, + 2899, 86, 86, 2907, 2909, 86, 2906, 86, 2910, 86, + 86, 2911, 86, 86, 2914, 2908, 86, 2916, 86, 2917, + 86, 2918, 86, 2912, 86, 86, 86, 2913, 2919, 86, + 2920, 2921, 86, 86, 2915, 86, 86, 2925, 2923, 86, + 2929, 2924, 2926, 86, 2930, 86, 2922, 2927, 2931, 86, + 86, 86, 86, 2932, 2935, 86, 2928, 86, 86, 2938, + 86, 86, 2939, 86, 2933, 2934, 2940, 86, 86, 2942, + 86, 86, 86, 2946, 86, 2936, 2943, 86, 2937, 86, + + 2947, 86, 2950, 2941, 86, 2949, 2945, 2951, 2948, 2944, + 86, 86, 2952, 86, 86, 86, 2957, 2953, 86, 86, + 86, 2956, 86, 2959, 2960, 86, 86, 86, 2962, 86, + 2954, 2961, 2963, 86, 2955, 86, 2965, 86, 2966, 86, + 2969, 86, 86, 2958, 86, 2973, 86, 86, 86, 2980, + 86, 86, 2964, 86, 2981, 86, 2967, 2968, 2972, 2970, + 86, 2974, 2971, 2975, 2977, 86, 86, 2978, 3020, 2982, + 2984, 2976, 86, 2979, 2983, 86, 2985, 86, 86, 2986, + 86, 2987, 86, 2988, 86, 2989, 86, 86, 2990, 86, + 86, 2991, 2993, 86, 86, 2995, 86, 86, 86, 2997, + + 3001, 86, 86, 2994, 86, 2998, 3483, 2992, 3002, 86, + 86, 3006, 2996, 3003, 3005, 86, 86, 2999, 3000, 86, + 3004, 3007, 86, 86, 3008, 3009, 86, 86, 86, 86, + 3015, 86, 3010, 86, 3014, 86, 3011, 3012, 3013, 3016, + 86, 86, 3017, 3021, 86, 86, 86, 86, 3022, 86, + 3025, 86, 3019, 86, 3024, 86, 3026, 3023, 86, 3018, + 3027, 86, 3028, 86, 3032, 86, 86, 3029, 86, 86, + 3034, 86, 3030, 3031, 3036, 3033, 86, 3039, 86, 86, + 3037, 86, 86, 86, 86, 3044, 3042, 3043, 86, 86, + 3040, 86, 86, 3035, 3046, 86, 3038, 3045, 86, 3049, + + 3041, 86, 3050, 3483, 3047, 86, 3048, 3051, 86, 3052, + 86, 3053, 86, 86, 3054, 3055, 3058, 86, 3057, 86, + 3056, 86, 86, 86, 3059, 86, 3060, 3061, 86, 86, + 86, 86, 3067, 86, 3065, 3062, 3483, 3063, 86, 3069, + 86, 86, 86, 86, 3064, 3070, 86, 3071, 3066, 86, + 3073, 3072, 3074, 86, 86, 86, 3068, 86, 3075, 3078, + 86, 86, 86, 86, 3082, 3081, 86, 86, 3076, 86, + 3079, 86, 3086, 86, 3077, 3080, 86, 3085, 86, 3083, + 86, 3088, 3089, 3092, 86, 3084, 86, 3094, 86, 3095, + 86, 3087, 86, 86, 3090, 3097, 86, 86, 86, 86, + + 86, 86, 3100, 86, 3091, 3093, 3102, 3103, 86, 3098, + 3106, 86, 3105, 3096, 3099, 3101, 86, 86, 86, 3109, + 3104, 86, 86, 3112, 86, 86, 3114, 86, 86, 3117, + 86, 86, 86, 3115, 3107, 3110, 3108, 3118, 86, 86, + 86, 3111, 3121, 86, 86, 3113, 3119, 86, 3126, 3116, + 86, 3123, 86, 3124, 86, 86, 3130, 86, 86, 3120, + 86, 86, 3122, 3132, 3128, 86, 86, 3125, 3133, 3127, + 86, 3134, 86, 3131, 3137, 3129, 3138, 86, 3135, 86, + 86, 3136, 3139, 3140, 3143, 86, 86, 86, 86, 86, + 3141, 3142, 3144, 3146, 86, 3149, 86, 86, 86, 86, + + 86, 86, 3154, 86, 86, 86, 86, 3145, 86, 3150, + 86, 3147, 3148, 3160, 3153, 3157, 3151, 3158, 86, 3159, + 86, 3156, 86, 3155, 3161, 3152, 86, 3162, 3163, 86, + 3164, 86, 3165, 86, 3166, 86, 86, 3169, 86, 3167, + 86, 3171, 86, 86, 86, 3170, 86, 86, 86, 86, + 3177, 3178, 86, 86, 86, 86, 86, 3172, 3184, 86, + 3185, 86, 3168, 86, 86, 3186, 3173, 3175, 3174, 3176, + 3181, 86, 3183, 3180, 86, 3182, 86, 86, 86, 3179, + 86, 3189, 3191, 86, 3187, 3192, 86, 86, 86, 3195, + 3196, 86, 3193, 3188, 3194, 86, 3197, 86, 3190, 3198, + + 86, 86, 3199, 86, 86, 3200, 86, 86, 3201, 86, + 86, 3202, 3204, 86, 86, 3206, 86, 86, 3205, 86, + 3483, 3207, 86, 86, 3203, 86, 86, 86, 86, 3208, + 86, 3216, 3217, 3220, 3209, 3211, 3210, 3219, 3212, 3218, + 3213, 3214, 86, 86, 86, 3222, 3215, 3224, 86, 86, + 3221, 3225, 86, 3226, 3227, 86, 86, 3223, 86, 3230, + 86, 3228, 3231, 86, 3232, 3233, 86, 86, 3234, 3235, + 3239, 86, 3236, 86, 86, 3237, 3238, 3229, 86, 3240, + 86, 3242, 86, 86, 86, 86, 86, 86, 86, 3241, + 3248, 86, 3247, 86, 86, 86, 86, 86, 3244, 86, + + 3252, 3243, 3251, 3253, 86, 3245, 3246, 86, 3249, 3256, + 3257, 86, 3254, 86, 3259, 86, 3258, 3255, 3250, 3260, + 86, 3261, 86, 86, 86, 86, 3266, 86, 3263, 3268, + 3262, 3267, 86, 3264, 86, 86, 3265, 86, 86, 86, + 3275, 86, 3270, 3272, 3273, 3276, 86, 3278, 86, 86, + 3269, 86, 3277, 3279, 86, 3271, 3274, 86, 3282, 86, + 3283, 86, 3281, 86, 3280, 3285, 86, 3286, 86, 3287, + 86, 86, 3284, 3288, 86, 3289, 86, 3290, 86, 3291, + 86, 3292, 86, 86, 3295, 86, 86, 86, 86, 3299, + 86, 86, 3294, 3301, 86, 3296, 86, 3293, 86, 3297, + + 86, 86, 86, 86, 3305, 3306, 86, 86, 3298, 86, + 3300, 3302, 3310, 3303, 3304, 86, 3307, 3308, 86, 86, + 3312, 3315, 86, 86, 3311, 3309, 3314, 86, 86, 86, + 86, 86, 86, 3313, 3317, 86, 3316, 3321, 86, 86, + 86, 3322, 3323, 86, 86, 86, 3327, 3318, 3319, 3326, + 86, 3320, 3329, 86, 3324, 3330, 86, 86, 3328, 3331, + 86, 86, 86, 86, 86, 86, 3325, 3334, 86, 86, + 3333, 86, 86, 3332, 3339, 86, 3336, 3335, 86, 3338, + 3340, 86, 3342, 86, 3344, 3343, 3341, 3337, 86, 86, + 86, 86, 86, 3345, 86, 86, 86, 3351, 86, 3346, + + 3349, 3353, 3350, 86, 3348, 3354, 86, 86, 3356, 3357, + 3359, 86, 86, 3347, 86, 3352, 3361, 86, 3355, 86, + 3362, 3360, 3363, 86, 3364, 86, 86, 3358, 86, 86, + 86, 3367, 86, 3365, 3368, 3369, 86, 3372, 86, 86, + 86, 86, 86, 86, 3375, 86, 3366, 3376, 86, 3378, + 86, 3371, 3373, 3374, 3379, 86, 86, 3370, 3382, 86, + 3377, 3381, 86, 3384, 3385, 86, 86, 3386, 86, 86, + 86, 3380, 3389, 3390, 86, 86, 3387, 3383, 86, 86, + 86, 3395, 86, 86, 3391, 3394, 86, 3392, 3388, 3396, + 86, 86, 86, 86, 3393, 86, 3400, 86, 86, 86, + + 3402, 86, 86, 86, 3397, 3399, 3398, 3407, 3408, 3409, + 86, 3404, 3405, 3401, 86, 86, 3403, 86, 3413, 86, + 3406, 86, 3415, 86, 3416, 86, 3414, 86, 86, 86, + 3417, 3421, 3418, 3411, 3410, 86, 3412, 86, 3422, 86, + 3419, 86, 3424, 86, 86, 86, 3423, 86, 3420, 3425, + 86, 86, 3430, 86, 3427, 86, 86, 3433, 86, 3434, + 86, 86, 86, 3426, 86, 86, 3437, 86, 3432, 3428, + 3429, 3435, 3431, 86, 3436, 86, 3441, 86, 3442, 86, + 3440, 86, 3445, 3438, 3439, 86, 86, 3447, 86, 3448, + 3443, 86, 86, 86, 3452, 86, 3449, 86, 86, 3450, + + 3454, 86, 3453, 86, 3446, 3444, 3455, 86, 3456, 86, + 3457, 86, 3451, 86, 3461, 86, 3459, 86, 86, 86, + 86, 86, 86, 3463, 3464, 86, 3467, 86, 3458, 3468, + 86, 3483, 3460, 86, 3471, 86, 3462, 3472, 86, 3465, + 3466, 3469, 3473, 3474, 86, 86, 3470, 3475, 86, 86, + 86, 86, 3476, 86, 3477, 3478, 3481, 86, 3482, 86, + 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + 3479, 3483, 3480, 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, 3483, 89, 89, 89, 89, 160, + 160, 3483, 3483, 3483, 160, 160, 162, 162, 3483, 3483, + 162, 3483, 162, 164, 3483, 3483, 3483, 3483, 3483, 164, + 167, 167, 3483, 3483, 3483, 167, 167, 169, 3483, 3483, + 3483, 3483, 3483, 169, 171, 171, 3483, 171, 171, 171, + 171, 174, 3483, 3483, 3483, 3483, 3483, 174, 177, 177, + 3483, 3483, 3483, 177, 177, 90, 90, 3483, 90, 90, + 90, 90, 17, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + + 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + 3483, 3483, 3483 } ; -static yyconst flex_int16_t yy_chk[6588] = +static yyconst flex_int16_t yy_chk[6834] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2278,18 +2350,18 @@ static yyconst flex_int16_t yy_chk[6588] = 5, 3, 6, 24, 4, 24, 24, 5, 24, 6, 7, 7, 7, 7, 24, 7, 8, 8, 8, 8, 33, 8, 7, 9, 9, 9, 26, 26, 8, 10, - 10, 10, 19, 29, 9, 33, 19, 29, 3361, 35, + 10, 10, 19, 29, 9, 33, 19, 29, 3491, 35, 10, 11, 11, 11, 11, 11, 11, 13, 13, 13, 13, 34, 13, 11, 35, 99, 34, 29, 38, 13, 51, 51, 11, 12, 12, 12, 12, 12, 12, 14, 14, 14, 14, 99, 14, 12, 15, 15, 15, 38, 23, 14, 23, 23, 12, 23, 46, 15, 16, 16, - 16, 23, 23, 25, 27, 27, 25, 25, 2735, 16, + 16, 23, 23, 25, 27, 27, 25, 25, 2838, 16, 25, 46, 27, 30, 30, 25, 27, 56, 40, 27, 56, 73, 31, 31, 25, 28, 67, 67, 30, 32, 28, 31, 40, 32, 28, 73, 32, 28, 92, 28, - 28, 92, 31, 32, 1099, 32, 36, 36, 37, 37, + 28, 92, 31, 32, 1127, 32, 36, 36, 37, 37, 28, 45, 45, 37, 97, 36, 45, 97, 41, 41, 45, 36, 87, 41, 93, 36, 87, 37, 93, 37, @@ -2328,9 +2400,9 @@ static yyconst flex_int16_t yy_chk[6588] = 200, 201, 202, 197, 203, 204, 201, 202, 205, 197, 197, 199, 196, 206, 205, 207, 203, 206, 208, 200, 207, 209, 213, 210, 211, 204, 214, 213, 216, 217, - 551, 214, 218, 216, 208, 209, 211, 205, 210, 211, + 556, 214, 218, 216, 208, 209, 211, 205, 210, 211, 215, 215, 220, 220, 215, 219, 215, 221, 218, 217, - 222, 219, 223, 221, 551, 224, 222, 227, 215, 221, + 222, 219, 223, 221, 556, 224, 222, 227, 215, 221, 215, 224, 225, 227, 228, 229, 230, 231, 225, 228, 230, 229, 223, 231, 232, 234, 233, 225, 235, 236, 237, 232, 233, 238, 235, 239, 237, 240, 234, 241, @@ -2354,646 +2426,674 @@ static yyconst flex_int16_t yy_chk[6588] = 313, 315, 316, 319, 311, 312, 317, 317, 314, 318, 308, 321, 318, 320, 322, 316, 324, 320, 323, 323, 313, 319, 315, 325, 312, 326, 325, 327, 328, 329, - 321, 328, 322, 327, 324, 333, 331, 326, 366, 332, - 333, 329, 336, 325, 330, 331, 334, 335, 337, 334, - 335, 334, 366, 330, 169, 336, 330, 332, 341, 341, - - 337, 330, 330, 330, 330, 339, 338, 334, 338, 338, - 339, 339, 340, 342, 343, 340, 345, 344, 346, 347, - 347, 348, 349, 349, 351, 345, 348, 346, 353, 343, - 342, 350, 350, 342, 344, 344, 352, 354, 355, 351, - 353, 352, 356, 357, 360, 167, 361, 358, 358, 357, - 358, 361, 369, 369, 362, 166, 354, 356, 355, 358, - 362, 363, 364, 394, 360, 365, 363, 364, 365, 367, - 365, 368, 367, 364, 372, 370, 371, 371, 375, 372, - 368, 370, 377, 373, 378, 367, 373, 379, 367, 394, - 367, 376, 373, 382, 376, 384, 373, 377, 375, 378, - - 381, 379, 385, 381, 373, 374, 374, 382, 374, 386, - 384, 385, 376, 388, 386, 386, 387, 389, 390, 381, - 402, 374, 387, 392, 374, 402, 374, 395, 374, 383, - 391, 383, 383, 390, 388, 396, 389, 164, 399, 391, - 393, 383, 392, 383, 383, 383, 393, 395, 383, 396, - 397, 400, 398, 401, 403, 404, 397, 398, 399, 406, - 397, 404, 405, 405, 407, 410, 408, 409, 401, 403, - 411, 400, 412, 409, 414, 398, 407, 412, 417, 406, - 408, 413, 413, 415, 413, 416, 411, 418, 423, 418, - 410, 426, 417, 419, 414, 419, 419, 424, 420, 415, - - 421, 416, 420, 427, 421, 422, 422, 423, 425, 426, - 430, 428, 424, 419, 431, 439, 430, 427, 439, 421, - 428, 429, 432, 431, 425, 433, 429, 432, 434, 433, - 435, 428, 436, 428, 429, 429, 435, 434, 429, 429, - 437, 438, 440, 441, 443, 438, 437, 440, 442, 442, - 444, 444, 446, 436, 445, 447, 447, 443, 448, 445, - 450, 451, 449, 441, 448, 446, 449, 452, 453, 454, - 454, 455, 452, 453, 456, 450, 458, 457, 454, 461, - 464, 459, 451, 455, 459, 460, 462, 462, 458, 460, - 466, 461, 463, 470, 456, 457, 471, 463, 465, 465, - - 472, 464, 468, 468, 471, 473, 474, 475, 476, 472, - 478, 474, 466, 479, 470, 480, 482, 484, 481, 550, - 476, 550, 482, 484, 483, 486, 473, 475, 478, 485, - 478, 479, 481, 483, 485, 480, 487, 488, 489, 486, - 488, 490, 491, 492, 487, 494, 493, 487, 491, 493, - 495, 494, 489, 496, 497, 499, 490, 498, 496, 499, - 500, 502, 501, 492, 495, 500, 502, 503, 504, 494, - 508, 505, 511, 524, 547, 510, 497, 501, 498, 510, - 509, 512, 513, 503, 505, 162, 513, 504, 506, 506, - 508, 511, 547, 524, 506, 509, 506, 512, 515, 517, - - 514, 516, 506, 518, 506, 514, 516, 506, 506, 514, - 519, 520, 518, 515, 506, 517, 519, 521, 517, 522, - 523, 519, 522, 525, 525, 526, 520, 527, 527, 528, - 529, 530, 531, 521, 532, 533, 534, 536, 535, 539, - 533, 537, 529, 523, 528, 534, 530, 537, 539, 540, - 526, 531, 536, 540, 541, 542, 532, 535, 543, 544, - 541, 545, 546, 549, 548, 554, 552, 542, 548, 553, - 553, 554, 555, 543, 552, 545, 549, 546, 544, 556, - 557, 559, 560, 558, 555, 556, 558, 562, 561, 563, - 562, 564, 557, 561, 565, 559, 566, 560, 563, 565, - - 565, 567, 567, 568, 568, 563, 569, 564, 563, 566, - 570, 570, 569, 571, 571, 572, 574, 573, 575, 578, - 577, 572, 573, 573, 576, 577, 579, 576, 580, 582, - 575, 580, 583, 589, 579, 581, 585, 574, 578, 584, - 581, 586, 585, 584, 587, 586, 591, 589, 588, 590, - 590, 583, 582, 588, 592, 593, 594, 595, 596, 598, - 593, 591, 587, 597, 596, 603, 600, 602, 597, 601, - 601, 599, 594, 598, 599, 592, 606, 595, 607, 599, - 610, 603, 599, 599, 600, 602, 604, 605, 609, 610, - 606, 604, 605, 607, 609, 611, 612, 613, 611, 616, - - 612, 614, 613, 615, 614, 617, 618, 619, 615, 620, - 621, 622, 622, 618, 620, 616, 623, 624, 625, 626, - 619, 627, 612, 617, 630, 623, 628, 630, 626, 629, - 621, 634, 628, 627, 625, 629, 624, 631, 631, 632, - 631, 633, 632, 635, 637, 636, 633, 638, 640, 634, - 636, 639, 641, 638, 640, 641, 639, 635, 642, 643, - 644, 645, 646, 637, 643, 644, 644, 647, 650, 649, - 648, 652, 647, 651, 645, 646, 648, 650, 651, 653, - 653, 655, 654, 642, 655, 657, 647, 647, 649, 654, - 656, 652, 661, 658, 663, 659, 656, 657, 658, 655, - - 659, 659, 660, 660, 662, 664, 662, 664, 658, 665, - 666, 667, 668, 663, 669, 670, 671, 661, 673, 676, - 671, 670, 674, 672, 675, 678, 682, 665, 666, 667, - 679, 668, 672, 673, 669, 677, 679, 674, 676, 680, - 678, 683, 675, 681, 684, 682, 685, 677, 684, 686, - 687, 688, 689, 680, 690, 681, 692, 692, 691, 690, - 683, 694, 693, 695, 685, 686, 693, 696, 687, 688, - 688, 689, 691, 697, 698, 694, 699, 700, 696, 698, - 701, 702, 695, 704, 703, 707, 705, 697, 702, 703, - 704, 705, 699, 701, 706, 708, 700, 709, 710, 706, - - 711, 712, 708, 707, 714, 713, 709, 714, 716, 711, - 713, 715, 710, 712, 717, 715, 718, 720, 719, 721, - 721, 725, 716, 717, 722, 722, 723, 723, 727, 724, - 725, 718, 719, 722, 724, 728, 729, 731, 720, 730, - 732, 728, 733, 730, 734, 735, 737, 727, 736, 731, - 734, 738, 739, 735, 742, 736, 729, 745, 748, 754, - 733, 752, 749, 754, 737, 732, 770, 748, 749, 742, - 752, 753, 739, 760, 745, 751, 738, 740, 160, 740, - 758, 751, 740, 755, 755, 770, 740, 753, 759, 740, - 756, 756, 757, 760, 761, 765, 740, 740, 758, 740, - - 761, 767, 759, 757, 762, 762, 762, 763, 762, 764, - 766, 762, 763, 765, 766, 768, 762, 771, 772, 768, - 85, 769, 762, 762, 773, 767, 769, 773, 774, 775, - 764, 777, 771, 774, 774, 768, 775, 776, 776, 778, - 779, 779, 780, 772, 778, 781, 777, 780, 781, 782, - 783, 783, 785, 784, 782, 784, 786, 787, 788, 790, - 789, 787, 791, 791, 785, 792, 795, 790, 793, 794, - 794, 796, 797, 800, 800, 786, 811, 811, 788, 789, - 792, 798, 793, 796, 795, 799, 801, 798, 803, 804, - 799, 801, 801, 803, 797, 804, 805, 808, 806, 807, - - 808, 809, 805, 806, 810, 807, 813, 809, 812, 812, - 814, 815, 810, 816, 813, 817, 815, 819, 818, 822, - 816, 820, 820, 821, 823, 823, 825, 822, 814, 824, - 827, 828, 821, 817, 818, 824, 819, 829, 830, 827, - 828, 831, 834, 830, 832, 825, 833, 832, 835, 836, - 831, 833, 837, 840, 838, 841, 834, 842, 836, 838, - 838, 829, 839, 839, 843, 837, 842, 844, 840, 845, - 848, 848, 845, 835, 841, 847, 849, 847, 850, 851, - 845, 852, 853, 850, 854, 844, 856, 855, 843, 857, - 858, 859, 860, 861, 858, 856, 862, 849, 863, 861, - - 851, 852, 853, 864, 865, 862, 854, 855, 866, 859, - 863, 860, 857, 867, 866, 868, 869, 869, 865, 870, - 868, 871, 864, 872, 873, 874, 875, 867, 876, 877, - 871, 878, 873, 883, 879, 881, 880, 878, 882, 870, - 879, 881, 886, 872, 887, 874, 886, 876, 875, 877, - 880, 884, 882, 883, 885, 888, 889, 884, 890, 894, - 885, 889, 892, 887, 891, 891, 893, 888, 892, 893, - 895, 897, 896, 898, 898, 888, 899, 894, 896, 890, - 900, 901, 902, 895, 903, 900, 901, 901, 903, 904, - 904, 897, 905, 906, 899, 907, 908, 902, 910, 913, - - 907, 914, 911, 915, 917, 917, 918, 921, 919, 1077, - 918, 923, 913, 906, 905, 908, 911, 920, 920, 924, - 1077, 914, 910, 919, 915, 916, 923, 922, 916, 926, - 916, 922, 921, 924, 916, 925, 916, 929, 928, 927, - 925, 916, 931, 926, 927, 927, 916, 928, 930, 933, - 932, 929, 930, 934, 935, 932, 936, 931, 934, 937, - 938, 933, 940, 946, 930, 932, 939, 940, 935, 938, - 941, 947, 939, 937, 942, 948, 941, 936, 943, 943, - 942, 944, 945, 952, 950, 946, 944, 951, 945, 953, - 947, 957, 951, 948, 949, 949, 950, 952, 954, 954, - - 949, 953, 949, 956, 955, 957, 958, 959, 949, 955, - 961, 956, 960, 949, 949, 963, 961, 962, 964, 965, - 949, 966, 962, 967, 967, 958, 959, 963, 960, 968, - 969, 971, 973, 968, 975, 965, 964, 971, 972, 966, - 974, 972, 976, 978, 977, 974, 980, 975, 976, 977, - 969, 973, 981, 982, 983, 980, 984, 985, 986, 987, - 983, 981, 978, 986, 988, 984, 989, 994, 990, 982, - 80, 993, 991, 992, 997, 1000, 985, 993, 988, 987, - 990, 991, 992, 995, 994, 999, 989, 1001, 1002, 995, - 997, 1003, 1004, 1005, 1010, 1000, 1006, 1014, 1005, 999, - - 1009, 1006, 1002, 1010, 1013, 1009, 1001, 1004, 1012, 1003, - 1011, 1011, 1014, 1013, 1012, 1015, 1017, 1018, 1023, 1022, - 1020, 1020, 1018, 1018, 1020, 1024, 1021, 1025, 1015, 1021, - 1026, 1027, 1017, 1022, 1028, 1029, 1030, 1031, 1023, 1032, - 1028, 1024, 1030, 1026, 1032, 1025, 1027, 1033, 1035, 1036, - 1039, 1035, 1031, 1037, 1038, 1029, 1040, 1041, 1037, 1038, - 1043, 1033, 1041, 1042, 1046, 1040, 1039, 1045, 1042, 1047, - 1036, 1048, 1043, 1045, 1050, 1047, 1051, 1048, 1049, 1049, - 1046, 1052, 1054, 1050, 1052, 1053, 1053, 1055, 1056, 1057, - 1058, 1059, 1057, 1060, 1051, 1066, 1061, 1059, 1067, 1060, - - 1054, 1061, 1062, 1058, 1063, 1064, 1055, 1062, 1056, 1063, - 1068, 1064, 1069, 1066, 1070, 1070, 1068, 1069, 1067, 1071, - 1072, 1073, 1074, 1075, 1076, 1078, 1075, 1076, 1071, 1072, - 1078, 1079, 1080, 1081, 1082, 1084, 1083, 1087, 1085, 1073, - 1082, 1074, 1083, 1085, 1080, 1086, 1086, 1088, 1089, 1079, - 1084, 1090, 1081, 1091, 1092, 1090, 1087, 1093, 1094, 1096, - 1089, 1088, 1098, 1092, 1097, 1097, 1100, 1102, 1103, 1101, - 1106, 1091, 1104, 1103, 1105, 1105, 1093, 1109, 1096, 1102, - 1100, 1104, 1098, 1094, 1101, 1107, 1108, 1117, 1113, 1110, - 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1111, 1114, 1115, - - 1116, 1112, 1113, 1118, 1115, 1119, 1117, 1120, 1122, 1122, - 1118, 1123, 1114, 1124, 1125, 1116, 1126, 1127, 1135, 1128, - 1119, 1134, 1126, 1130, 1128, 1123, 1120, 1130, 1134, 1125, - 1137, 1124, 1135, 1128, 1138, 1128, 1132, 1127, 1128, 1131, - 1131, 1132, 1133, 1133, 1136, 1139, 1140, 1136, 1141, 1137, - 1142, 1140, 1138, 1143, 1139, 1144, 1146, 1145, 1143, 1148, - 1148, 1149, 1142, 1151, 1155, 1150, 1149, 1141, 1145, 1144, - 1150, 1152, 1154, 1153, 1156, 1146, 1152, 1153, 1157, 1155, - 1158, 1154, 1161, 1151, 1159, 1162, 1160, 1163, 1164, 1156, - 1165, 1167, 1158, 1160, 1161, 1166, 1165, 1157, 1168, 1159, - - 1169, 1170, 1171, 1172, 1162, 1173, 1164, 1174, 1163, 1169, - 1166, 1167, 1175, 1176, 1178, 1172, 1170, 1180, 1168, 1179, - 1178, 1171, 1181, 1182, 1173, 1183, 1185, 1175, 1187, 1189, - 1181, 1180, 1174, 1176, 1179, 1184, 1188, 1193, 1185, 1186, - 1184, 1183, 1189, 1182, 1186, 1186, 1193, 1187, 1190, 1190, - 1188, 1191, 1191, 1192, 1197, 1194, 1191, 1195, 1195, 1191, - 1191, 1194, 1196, 1197, 1191, 1198, 1192, 1196, 1199, 1202, - 1191, 1198, 1200, 1199, 1191, 1201, 1201, 1200, 1203, 1203, - 1204, 1205, 1206, 1204, 1207, 1204, 1208, 1209, 1210, 1211, - 1202, 1212, 1209, 1207, 1214, 75, 1218, 1212, 1213, 1214, - - 1206, 1205, 1210, 1216, 1213, 1215, 1208, 1211, 1217, 1215, - 1218, 1221, 1216, 1217, 1219, 1219, 1223, 1216, 1224, 1216, - 1223, 1216, 1221, 1216, 1220, 1220, 1225, 1220, 1226, 1227, - 1228, 1229, 1231, 1224, 1227, 1227, 1230, 1226, 1232, 1228, - 1233, 1230, 1234, 1235, 1225, 1236, 1231, 1232, 1237, 1237, - 1238, 1236, 1239, 1229, 1241, 1240, 1242, 1235, 1238, 1233, - 1240, 1234, 1243, 1244, 1245, 1242, 1239, 1246, 1241, 1243, - 1247, 1247, 1246, 1248, 1249, 1249, 1250, 1252, 1250, 1253, - 1252, 1244, 1254, 1255, 1253, 1256, 1256, 1257, 1248, 1245, - 1258, 1258, 1255, 1259, 1259, 1260, 1261, 1262, 1263, 1263, - - 1260, 1254, 1264, 1265, 1266, 1267, 1265, 1257, 1270, 74, - 1267, 1268, 1269, 1272, 1269, 1273, 1272, 1261, 1262, 1275, - 1268, 1277, 1264, 1274, 1266, 1283, 1270, 1276, 1274, 1277, - 1273, 1278, 1276, 1275, 1279, 1280, 1278, 1279, 1281, 1281, - 1280, 1282, 1284, 1283, 1285, 1286, 1282, 1288, 1284, 1289, - 1291, 1285, 1290, 1288, 1292, 1289, 1291, 1290, 1286, 1293, - 1294, 1295, 1295, 1292, 1296, 1298, 1299, 1300, 1301, 1302, - 1303, 1294, 1307, 1305, 1301, 1302, 1303, 1306, 1293, 1305, - 1298, 1308, 1309, 1313, 1296, 1310, 1299, 1311, 1312, 1312, - 1300, 1306, 1307, 1314, 1309, 1315, 1318, 1306, 1321, 1310, - - 1326, 1308, 1316, 1313, 1323, 1311, 1319, 1316, 1317, 1317, - 1322, 1319, 1324, 1315, 1326, 1322, 1322, 1321, 1314, 1318, - 1325, 1324, 1323, 1327, 1328, 1329, 1330, 1331, 1325, 1331, - 1329, 1332, 1335, 1329, 1334, 1330, 1335, 1336, 1327, 1328, - 1334, 1337, 1328, 1338, 1339, 1332, 1337, 1337, 1336, 1340, - 1341, 1342, 1344, 1343, 1345, 1341, 1342, 1346, 1349, 1345, - 1348, 1350, 1338, 1351, 1351, 1352, 1353, 1340, 1354, 1352, - 1339, 1343, 1344, 1356, 1348, 1355, 1349, 1346, 1357, 1350, - 1358, 1355, 1363, 1359, 1353, 1356, 1360, 1354, 1361, 1363, - 1362, 1364, 1365, 1366, 1358, 1362, 1364, 1357, 1359, 1367, - - 1367, 1360, 1366, 1368, 1369, 1370, 1372, 1361, 1371, 1371, - 1365, 1373, 1372, 1369, 1374, 1375, 1375, 1373, 1368, 1377, - 1376, 1378, 1379, 1380, 1381, 1370, 1376, 1379, 1374, 1380, - 1381, 1382, 1383, 1383, 1389, 1377, 1388, 1382, 1384, 1384, - 1386, 1386, 1378, 1387, 1390, 1388, 1391, 1387, 1392, 1395, - 1393, 1396, 1389, 1394, 1394, 1399, 1390, 1393, 1398, 1396, - 1391, 1397, 1400, 1392, 1402, 1401, 1397, 1400, 1400, 1395, - 1401, 1401, 1398, 1404, 1399, 1403, 1403, 1405, 1406, 1408, - 1407, 1409, 1410, 1411, 1402, 1407, 1412, 1406, 1413, 1411, - 1415, 1412, 1404, 1414, 1418, 1423, 1405, 1416, 1408, 1414, - - 1410, 1409, 1417, 1416, 1419, 1420, 1421, 1422, 1417, 1415, - 1427, 1424, 1426, 1418, 1413, 1426, 1423, 1425, 1425, 1428, - 1429, 1422, 1434, 1419, 1420, 1421, 1424, 1430, 1430, 1427, - 1431, 1431, 1429, 1433, 1432, 1434, 1435, 1433, 1428, 1432, - 1436, 1437, 1441, 1437, 1439, 1435, 1440, 1437, 1442, 1443, - 1448, 1440, 1446, 1436, 1444, 1444, 1445, 1441, 1446, 1447, - 1437, 1445, 1439, 1448, 1449, 1443, 1450, 1451, 1442, 1449, - 1450, 1451, 1452, 1453, 1447, 1454, 1455, 1456, 1457, 1457, - 1459, 1461, 1462, 1456, 1454, 1463, 1463, 1462, 1464, 1465, - 1469, 1453, 1452, 1469, 1464, 1471, 1455, 1472, 1459, 1467, - - 1467, 1475, 1461, 1470, 1470, 1474, 1476, 1478, 1474, 1465, - 1479, 1471, 1482, 1472, 1480, 1476, 1477, 1477, 1481, 1483, - 1483, 1475, 1478, 1481, 1485, 1484, 1482, 1487, 1486, 1488, - 1490, 1479, 1491, 1480, 1484, 1489, 1489, 1495, 1493, 1496, - 1492, 1495, 1485, 1486, 1490, 1492, 1494, 1494, 1498, 1488, - 1491, 1499, 1487, 1493, 1497, 1497, 1500, 1501, 1502, 1496, - 1500, 1505, 1499, 1502, 1504, 1504, 1506, 1507, 1508, 1509, - 1498, 1510, 1511, 1511, 1512, 1513, 1501, 1505, 1514, 1512, - 1516, 1507, 1518, 1509, 1506, 1515, 1515, 1508, 1508, 1516, - 1522, 1519, 1517, 1519, 1520, 1513, 1510, 1517, 1514, 1520, - - 1521, 1523, 1518, 1525, 1526, 1526, 1521, 1523, 1527, 1528, - 1522, 1530, 1531, 1532, 1532, 1528, 1530, 1525, 1533, 1533, - 1534, 1535, 1536, 1537, 1538, 1538, 1537, 1527, 1539, 1540, - 1541, 1549, 1543, 68, 1534, 1544, 1531, 1536, 1543, 1535, - 1544, 1540, 1542, 1547, 1545, 1542, 1539, 1545, 1542, 1548, - 1541, 1552, 1547, 1553, 1548, 1550, 1549, 1552, 1550, 1553, - 1542, 1551, 1551, 1545, 1554, 1555, 1555, 1556, 1556, 1554, - 1557, 1559, 1558, 1560, 1561, 1562, 1557, 1558, 1563, 1564, - 1565, 1563, 1566, 1567, 1559, 1564, 1565, 1566, 1568, 1567, - 1572, 1560, 1569, 1561, 1573, 1562, 1571, 1569, 1570, 1570, - - 1574, 1571, 1575, 1576, 1577, 1578, 1579, 1582, 1572, 1580, - 1581, 1568, 1581, 1580, 1573, 1584, 1575, 1576, 1577, 1586, - 1574, 1585, 1587, 1578, 1588, 1589, 1582, 1584, 1587, 1590, - 1592, 1579, 1586, 1585, 1591, 1594, 1594, 1595, 1596, 1599, - 1597, 1589, 1600, 1596, 1588, 1598, 1598, 1601, 1591, 1590, - 1602, 1592, 1597, 1603, 1599, 1604, 1600, 1595, 1605, 1607, - 1606, 1609, 1603, 1611, 1612, 1605, 1616, 1612, 1602, 1606, - 1604, 1601, 1606, 1613, 1613, 1607, 1609, 1614, 1614, 1615, - 1617, 1609, 1619, 1617, 1616, 1618, 1618, 1620, 1611, 1621, - 1623, 1615, 1622, 1625, 1621, 1619, 1624, 1622, 1626, 1627, - - 1631, 1628, 1625, 1630, 1630, 1632, 1620, 1629, 1627, 1623, - 1628, 1627, 1624, 1629, 1633, 1634, 1636, 1626, 1632, 1635, - 1631, 1636, 1636, 1637, 1638, 1641, 1642, 1644, 1637, 1634, - 1643, 1643, 1633, 1645, 1646, 1635, 1638, 1647, 1647, 1646, - 1650, 1649, 1645, 1644, 1642, 1648, 1649, 1651, 1652, 1655, - 1641, 1657, 1647, 1664, 1648, 1653, 1656, 1648, 1650, 1658, - 1653, 1653, 1660, 1655, 1658, 1663, 1652, 1664, 1651, 1659, - 1663, 1656, 1662, 1657, 1668, 1659, 1661, 1661, 1662, 1665, - 1660, 1666, 1669, 1670, 1671, 1665, 1673, 1666, 1677, 1670, - 1672, 1678, 1673, 1672, 1668, 1675, 1669, 1671, 1679, 1672, - - 1680, 1681, 1682, 1675, 1683, 1684, 1679, 1677, 1688, 1680, - 1678, 1685, 1685, 1691, 1681, 1682, 1686, 1687, 1683, 1684, - 1690, 1688, 1686, 1687, 1689, 1689, 1692, 1693, 1693, 1694, - 1695, 1691, 1696, 1685, 1697, 1698, 1695, 1700, 1700, 1701, - 1690, 1703, 1694, 1702, 1704, 1692, 1703, 1702, 1706, 1704, - 1697, 1705, 1707, 1698, 1696, 1709, 1705, 1706, 1710, 1701, - 1711, 1711, 1712, 1714, 1713, 1715, 1715, 1709, 1718, 1716, - 1717, 1721, 1719, 1710, 1722, 1707, 1713, 1717, 1725, 1723, - 1718, 1712, 1714, 1716, 1719, 1723, 1724, 1726, 1727, 1727, - 1721, 63, 1728, 1726, 1722, 1728, 1725, 1731, 1724, 1729, - - 1729, 1732, 1731, 1733, 1734, 1734, 1735, 1738, 1739, 1733, - 1732, 1736, 1737, 1736, 1740, 1737, 1741, 1742, 1735, 1743, - 1744, 1745, 1742, 1746, 1743, 1749, 1747, 1738, 1748, 1744, - 1739, 1747, 1740, 1745, 1741, 1750, 1751, 1748, 1746, 1752, - 1750, 1751, 1753, 1753, 1755, 1749, 1754, 1750, 1757, 1758, - 1748, 1760, 1754, 1759, 1752, 1761, 1762, 1761, 1763, 1763, - 1764, 1764, 1765, 1765, 1766, 1755, 1769, 1757, 1758, 1759, - 1762, 1760, 1762, 1767, 1767, 1768, 1768, 1770, 1771, 1771, - 1773, 1772, 1777, 1776, 1766, 1772, 1773, 1769, 1774, 1776, - 1778, 1774, 1779, 1782, 1780, 1785, 1778, 1780, 1770, 1783, - - 1777, 1781, 1781, 1786, 1783, 1784, 1784, 1787, 1788, 1788, - 1785, 1789, 1787, 1782, 1790, 1791, 1789, 1779, 1792, 1793, - 1790, 1794, 1796, 58, 1786, 1795, 1799, 1791, 1791, 1791, - 1798, 1795, 1800, 1802, 1791, 1798, 1798, 1793, 1792, 1803, - 1799, 1794, 1796, 1801, 1802, 1801, 1804, 1800, 1805, 1806, - 1807, 1809, 1804, 1811, 1803, 1808, 1808, 1805, 1810, 1810, - 1812, 1813, 1813, 1814, 1814, 1815, 1818, 1818, 1819, 1806, - 1820, 1807, 1822, 1811, 1823, 1825, 1825, 1809, 1824, 1820, - 1826, 1822, 1812, 1827, 1824, 1815, 1830, 1828, 1829, 1831, - 1831, 1832, 1833, 1819, 1828, 1823, 1836, 1829, 1827, 1835, - - 1837, 1826, 1836, 1838, 1835, 1839, 1842, 1840, 1833, 1840, - 1838, 1839, 1830, 1843, 1844, 1844, 1845, 1832, 1846, 1843, - 1837, 1845, 1847, 1849, 1848, 1842, 1850, 1846, 1851, 1850, - 1852, 1853, 1853, 1854, 1855, 1849, 1857, 1856, 1860, 1854, - 1855, 1858, 1847, 1848, 1861, 1858, 1851, 1862, 1863, 1863, - 1864, 1857, 1862, 1865, 1867, 1868, 1852, 1856, 1860, 1868, - 1876, 1858, 1869, 1869, 1870, 1871, 1861, 1874, 1865, 1864, - 1870, 1872, 1872, 1867, 1871, 1873, 1875, 1875, 1874, 1873, - 1877, 1876, 1878, 1874, 1879, 1880, 1881, 1882, 1883, 1879, - 1884, 1885, 1885, 1882, 1877, 1884, 1886, 1886, 1887, 1889, - - 1890, 1878, 1887, 1883, 1891, 1880, 1881, 1899, 1889, 1892, - 1892, 1890, 1894, 1894, 1895, 1896, 1890, 1898, 1901, 1895, - 1895, 1896, 1900, 1898, 1891, 1902, 1904, 1900, 1905, 1906, - 1901, 1902, 1905, 1899, 1907, 1909, 1908, 1910, 1904, 1911, - 1912, 1906, 1908, 1910, 1911, 1915, 1914, 1918, 1916, 1922, - 1918, 1925, 1912, 1916, 1919, 1919, 1925, 1909, 1914, 1907, - 1920, 1920, 1921, 1921, 1915, 1923, 1924, 1926, 1927, 1922, - 1929, 1923, 1924, 1926, 1932, 1929, 1931, 1927, 1935, 1931, - 1933, 1933, 1936, 1937, 1938, 1938, 1932, 1939, 1937, 1944, - 1935, 1947, 1940, 1941, 1936, 1945, 1939, 1940, 1941, 1942, - - 1943, 1943, 1942, 1946, 1945, 1951, 1950, 1948, 1949, 1944, - 1947, 1948, 1950, 1949, 1953, 1952, 1954, 1956, 1956, 1957, - 1959, 1946, 1958, 1951, 1952, 1960, 1960, 1961, 1963, 1956, - 1954, 1958, 1953, 1962, 1964, 1965, 1961, 1957, 1971, 1964, - 1959, 1968, 1968, 1970, 1972, 1962, 1970, 1974, 1965, 1963, - 1975, 1976, 1977, 1986, 1971, 1978, 1978, 1976, 57, 1979, - 1972, 1979, 1974, 1981, 1975, 1980, 1980, 1983, 1983, 1977, - 1989, 1981, 1984, 1984, 1987, 1988, 1986, 1989, 1990, 1991, - 1987, 1988, 1992, 1992, 1993, 1994, 1995, 1997, 1999, 1996, - 2000, 1998, 2003, 1993, 2004, 2005, 2006, 2006, 1995, 1991, - - 1990, 1996, 1997, 1998, 2001, 2000, 1994, 2005, 2007, 2008, - 2001, 2011, 2003, 2009, 1999, 2010, 2009, 2004, 2015, 2013, - 2010, 2021, 52, 2001, 2013, 2014, 2007, 2014, 2016, 2008, - 2017, 2011, 2019, 2016, 2022, 2023, 2015, 2017, 2024, 2021, - 2024, 2019, 2025, 2022, 2027, 2028, 2027, 2023, 2029, 2029, - 2030, 2031, 2032, 2033, 2032, 2034, 2031, 2035, 2033, 2028, - 2034, 2025, 2036, 2037, 2039, 2038, 2040, 2041, 2044, 2037, - 2038, 2042, 2041, 2041, 2045, 2035, 2030, 2039, 2040, 2042, - 2046, 2046, 2036, 2047, 2047, 2048, 2049, 2044, 2045, 2050, - 2052, 2051, 2052, 2053, 2054, 2050, 2051, 2055, 2055, 47, - - 2048, 2056, 2054, 2057, 2057, 2059, 2049, 2058, 2058, 2061, - 2054, 2053, 2060, 2056, 2059, 2065, 2063, 2060, 2064, 2067, - 2064, 2069, 2071, 2068, 2066, 2063, 2075, 2061, 2063, 2066, - 2066, 2067, 2068, 2069, 2071, 2072, 2065, 2073, 2076, 2075, - 2072, 2077, 2073, 2078, 2078, 2079, 2080, 2082, 2085, 2081, - 2077, 2083, 2087, 2099, 2088, 2086, 2096, 2089, 2076, 2088, - 2085, 2082, 2089, 2079, 2080, 2081, 2083, 2086, 2090, 2093, - 2095, 2097, 2087, 2098, 2100, 2093, 2095, 2090, 2099, 2096, - 2101, 2101, 2104, 2100, 2102, 2107, 2097, 2108, 2093, 2103, - 2103, 2098, 2105, 2102, 2106, 18, 2105, 2109, 2107, 2106, - - 2110, 2104, 2109, 2109, 2111, 2112, 2110, 2113, 2112, 2108, - 2111, 2114, 2117, 2117, 2119, 2113, 2122, 2118, 2118, 2120, - 2120, 2121, 2121, 2119, 2123, 2125, 17, 2124, 2122, 2132, - 2125, 2114, 2118, 2124, 2126, 2126, 2127, 2127, 2134, 2128, - 2129, 2131, 2123, 2118, 2128, 2131, 2129, 2133, 2136, 2132, - 2137, 2133, 2138, 2139, 2140, 2137, 2141, 2143, 2134, 2140, - 2142, 2144, 2145, 2146, 2146, 2147, 2144, 2148, 2139, 2147, - 2150, 2151, 2155, 2136, 2141, 2138, 2142, 2143, 2149, 2152, - 2153, 2154, 2148, 2149, 2145, 2155, 2154, 2156, 2160, 2151, - 2159, 2152, 2157, 2157, 2161, 2162, 2150, 2163, 2159, 2153, - - 2164, 2165, 2166, 2167, 2171, 2156, 2172, 2160, 2169, 2173, - 2174, 2176, 2174, 2161, 2166, 2173, 2176, 2171, 2162, 2164, - 2172, 2163, 2165, 2169, 2167, 2175, 2175, 2177, 2178, 2179, - 2177, 2180, 2181, 2181, 2182, 2182, 2183, 2185, 2183, 2184, - 2184, 2178, 2186, 2179, 2180, 2187, 2187, 2188, 2189, 2189, - 2190, 2190, 2185, 2191, 2194, 2186, 2188, 2193, 2191, 2188, - 2195, 2196, 2193, 2197, 2197, 2198, 2198, 2199, 2200, 2200, - 2201, 2202, 2202, 2196, 2194, 2203, 2204, 2205, 2205, 2207, - 2195, 2204, 2206, 2206, 2209, 2208, 2199, 2210, 2201, 2214, - 2203, 2212, 2216, 2207, 2208, 0, 2212, 2217, 2209, 2213, - - 2213, 2215, 2215, 2217, 2218, 2221, 2210, 2218, 2214, 2226, - 2216, 2219, 2219, 2220, 2220, 2222, 2223, 2225, 2223, 2227, - 2227, 2229, 2230, 2231, 2221, 2232, 2240, 2219, 2226, 2232, - 2222, 2234, 2225, 2233, 2233, 2235, 2236, 2237, 2231, 2242, - 2235, 2229, 2239, 2239, 2243, 2230, 2240, 2241, 2244, 2245, - 2234, 2236, 2237, 2242, 2241, 2246, 2246, 2248, 2247, 2248, - 2249, 2252, 2243, 2249, 2251, 2255, 2244, 2247, 2256, 2253, - 2251, 2254, 2257, 2252, 2253, 2245, 2254, 2258, 2249, 2259, - 2249, 2256, 2258, 2261, 2262, 2263, 2264, 2265, 2261, 2262, - 2255, 2266, 2264, 2257, 2267, 2269, 2268, 2266, 2270, 2267, - - 2263, 2268, 2281, 2271, 2272, 2259, 2271, 2273, 2265, 2274, - 2275, 2270, 2276, 2272, 0, 2277, 2273, 2278, 2274, 2275, - 2269, 2277, 2281, 2278, 2279, 2283, 2276, 2285, 2279, 2284, - 2284, 2286, 2286, 2285, 2283, 2288, 2287, 2290, 2291, 2294, - 2286, 2287, 2292, 2292, 2293, 2297, 2296, 2298, 2294, 2301, - 2303, 2299, 2301, 2290, 2291, 2288, 2304, 2288, 2296, 2293, - 2302, 2297, 2298, 2299, 2310, 2302, 2305, 2305, 2304, 2310, - 2303, 2306, 2306, 2308, 2308, 2309, 2311, 2312, 2309, 2313, - 2314, 2314, 2311, 2312, 2315, 2316, 2316, 2317, 2313, 2318, - 2319, 2320, 2320, 2322, 2321, 2329, 2323, 0, 2315, 2317, - - 2321, 2323, 2325, 2318, 2329, 2326, 2325, 2322, 2326, 2319, - 2327, 2327, 2328, 2330, 2331, 2332, 2334, 2328, 2336, 2332, - 2333, 2333, 2330, 2336, 2337, 2338, 2339, 2340, 2341, 2334, - 2342, 2340, 2343, 2344, 2331, 2342, 2345, 2346, 2343, 2344, - 2339, 2347, 2348, 2349, 2337, 2338, 2351, 2348, 2341, 2352, - 2353, 2354, 2363, 2355, 2345, 2353, 2346, 2354, 2351, 2360, - 2347, 2355, 2358, 2367, 2349, 2352, 2356, 2367, 2356, 2361, - 2361, 2358, 2362, 2360, 2368, 2362, 2364, 2364, 2363, 2369, - 2368, 2370, 2370, 2371, 2374, 2374, 2376, 2378, 2382, 2379, - 2383, 2369, 2371, 2382, 2384, 2385, 2386, 2386, 2392, 2384, - - 2385, 2378, 2388, 2388, 2376, 2379, 2390, 2391, 2391, 2393, - 2394, 2396, 2390, 2398, 2392, 2394, 2383, 2397, 2400, 2400, - 2397, 2399, 2403, 2402, 2404, 2398, 2405, 2409, 2403, 2410, - 2396, 2393, 2402, 2399, 2407, 2407, 2408, 2412, 2412, 2408, - 2414, 2405, 2404, 2413, 2413, 2414, 2409, 2410, 2415, 2416, - 2417, 2418, 2421, 2418, 2419, 2417, 2420, 2422, 2416, 2423, - 2424, 2489, 2422, 2489, 2421, 0, 2415, 2425, 2419, 2431, - 2420, 2430, 2425, 2426, 2426, 2427, 2427, 2428, 2428, 2423, - 2424, 2429, 2429, 2430, 2432, 2433, 2433, 2431, 2435, 2432, - 2434, 2434, 2436, 2437, 2438, 2439, 2439, 2440, 2441, 2441, - - 2435, 2442, 2442, 2443, 2436, 2444, 2446, 2447, 2445, 2449, - 2438, 2450, 2453, 2437, 2443, 2445, 2440, 2444, 2446, 2448, - 2451, 2451, 2454, 2452, 2448, 2456, 2455, 2447, 2458, 2449, - 2457, 2450, 2452, 2459, 2459, 2461, 2460, 2462, 2453, 2455, - 2458, 2464, 2454, 2465, 2457, 2460, 2466, 2468, 2467, 2456, - 2461, 2467, 2462, 2469, 0, 2470, 2471, 2471, 2469, 2464, - 2470, 2468, 2472, 2472, 2478, 2465, 2473, 2473, 2479, 2466, - 2475, 2475, 2477, 2477, 2480, 2481, 2483, 2484, 2485, 2479, - 2487, 2486, 2478, 2488, 2490, 2493, 2493, 2491, 2492, 2487, - 2481, 2495, 2495, 2480, 2496, 2484, 2483, 2497, 2498, 2503, - - 2485, 2486, 2501, 2488, 2490, 2491, 2492, 2498, 2496, 2499, - 2499, 2501, 2502, 2502, 2504, 2505, 2506, 2503, 2507, 2497, - 2508, 2509, 2505, 2510, 2511, 2511, 2512, 2512, 2513, 2514, - 2520, 2506, 2504, 2515, 2516, 2516, 2507, 2509, 2508, 2515, - 2517, 2517, 2510, 2518, 2519, 2520, 2521, 2514, 2513, 2518, - 2522, 2523, 2524, 2525, 2526, 2527, 2523, 2527, 2532, 2526, - 2528, 2528, 2519, 2535, 2522, 2521, 2529, 2534, 2529, 2530, - 2530, 2536, 2524, 2525, 2537, 2538, 2534, 2532, 2539, 2543, - 2538, 2540, 2535, 2536, 2544, 2545, 2545, 2544, 2546, 2547, - 2548, 2548, 2551, 2549, 2537, 2550, 2551, 2553, 2539, 2543, - - 2540, 2554, 2556, 2546, 2549, 2554, 2558, 2547, 2555, 2555, - 2550, 2559, 2553, 2560, 2563, 2556, 2561, 2561, 2564, 2565, - 2567, 2558, 2571, 2565, 2566, 2566, 2563, 2564, 2568, 2568, - 2569, 2559, 2570, 2560, 2572, 2569, 2573, 2580, 2571, 2567, - 2582, 2570, 2574, 2574, 2579, 2579, 2572, 2581, 2581, 2583, - 2587, 2584, 2585, 2582, 2586, 2586, 2573, 2589, 2589, 2580, - 2584, 2585, 2583, 2592, 2593, 2587, 2594, 2595, 2592, 2593, - 2596, 2597, 2595, 2598, 2601, 2599, 2602, 2604, 2596, 2603, - 2594, 2602, 2598, 2599, 2603, 2605, 2605, 2606, 2606, 2601, - 2597, 2608, 2604, 2607, 2607, 2609, 2610, 2611, 2608, 2612, - - 2609, 2613, 2614, 2614, 2615, 2612, 2613, 2616, 2617, 2617, - 2618, 2618, 2616, 2621, 2610, 2611, 2622, 2622, 2623, 2615, - 2625, 2623, 2624, 2627, 2626, 2625, 2621, 2624, 2624, 2626, - 2628, 2629, 2631, 2630, 2632, 2629, 2628, 2627, 2630, 2633, - 2634, 2631, 2635, 2638, 2636, 2640, 2637, 2633, 2635, 2632, - 2636, 2637, 2640, 2641, 2642, 2638, 2644, 2642, 2641, 2646, - 2647, 2634, 2648, 2649, 2646, 2647, 2650, 2656, 2644, 2651, - 2652, 2652, 2653, 2657, 2661, 2650, 2649, 2658, 2651, 2657, - 2648, 2653, 2662, 2658, 2663, 2656, 2664, 2664, 2665, 2666, - 2667, 2668, 2670, 2661, 2672, 2665, 2669, 2669, 2674, 2667, - - 2675, 2677, 2662, 2663, 2675, 3182, 2668, 3182, 2666, 2672, - 2678, 2670, 2676, 2676, 2679, 2680, 2678, 2682, 2674, 2683, - 2679, 2680, 2681, 2681, 2683, 2682, 2677, 2685, 2686, 2688, - 2689, 2691, 2692, 2689, 2690, 2688, 2685, 2695, 2690, 2694, - 2694, 2686, 2696, 2696, 2705, 2691, 0, 2692, 2697, 2697, - 2699, 2699, 2700, 2701, 2707, 2695, 2700, 2706, 2701, 2703, - 2703, 2709, 2706, 2708, 2705, 2711, 2707, 2717, 2708, 2708, - 2712, 2712, 2719, 2709, 2714, 2714, 2715, 2715, 2716, 2721, - 2717, 2716, 2722, 2722, 2727, 2711, 2723, 2723, 2724, 2724, - 2719, 2725, 2726, 2726, 2728, 2729, 2730, 2727, 2737, 2721, - - 2731, 2731, 2730, 2732, 2738, 2736, 2725, 2732, 2739, 2729, - 2736, 2736, 2728, 2740, 2741, 2742, 2744, 2744, 2743, 2740, - 2741, 2737, 2743, 2749, 2738, 2747, 2750, 2752, 2739, 2750, - 2747, 2749, 2753, 2754, 2754, 2753, 2755, 2756, 2757, 2758, - 2742, 2759, 2756, 2760, 2760, 2764, 2761, 2762, 2763, 2765, - 2762, 2768, 2752, 2755, 2755, 2759, 2757, 2765, 2762, 2758, - 2761, 2766, 2763, 2767, 2764, 2774, 2766, 2766, 2767, 2767, - 2768, 2769, 2769, 2770, 2770, 2771, 2771, 2772, 2772, 2773, - 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2775, 2780, 2781, - 2778, 2782, 2783, 2780, 2785, 2785, 2786, 2786, 2781, 2787, - - 2788, 2791, 2787, 2776, 2793, 2779, 2790, 2790, 2791, 2793, - 2777, 2782, 2783, 2792, 2792, 2795, 2795, 2796, 2788, 2797, - 2798, 2800, 2801, 2801, 2803, 2804, 2796, 2802, 2797, 2798, - 2805, 2802, 2806, 2803, 2810, 2808, 2809, 2807, 2810, 2800, - 2818, 2805, 2807, 2807, 2804, 2809, 2814, 2806, 2808, 2815, - 2815, 2814, 2817, 2817, 2818, 2819, 2820, 2822, 2822, 2823, - 2824, 2827, 2828, 2829, 2830, 2832, 2834, 2870, 2823, 2852, - 2830, 2828, 2824, 2836, 2820, 2852, 2837, 2832, 2836, 2839, - 2819, 2837, 2870, 2829, 2838, 2838, 2827, 2834, 2839, 2841, - 2848, 2842, 2842, 2847, 2841, 2842, 2844, 2844, 2845, 2845, - - 2846, 2846, 2847, 2849, 2850, 2856, 2853, 2854, 2857, 2850, - 2848, 2853, 2854, 2855, 2855, 2858, 2859, 2860, 2861, 2862, - 2857, 2859, 2849, 2856, 2861, 2863, 2863, 2865, 2866, 2867, - 2869, 2865, 2871, 2866, 2867, 2860, 2858, 2868, 2868, 2873, - 2875, 2875, 2877, 2878, 2862, 2880, 2879, 2871, 2881, 2869, - 2879, 2882, 2883, 2884, 2880, 2877, 2878, 2886, 2884, 2873, - 2883, 2885, 2885, 2887, 2881, 2888, 2886, 2889, 2889, 2890, - 2882, 2893, 2893, 2894, 2894, 2896, 2898, 2898, 2900, 2901, - 2903, 2887, 2902, 2905, 2905, 2903, 2906, 2908, 2890, 2909, - 2907, 2888, 2910, 2908, 2900, 2901, 2896, 2918, 2902, 2907, - - 2912, 2912, 2913, 2914, 2915, 2915, 2906, 2919, 2922, 2920, - 2931, 2910, 2909, 2919, 2920, 2925, 2913, 2918, 2923, 2923, - 2924, 2924, 2914, 2926, 2926, 2927, 2929, 2930, 2928, 2931, - 2922, 2933, 2932, 2930, 2941, 2925, 2927, 2928, 2934, 2934, - 2936, 2936, 2935, 2926, 2932, 2935, 2929, 2940, 2946, 2942, - 2945, 2933, 2943, 2943, 2941, 2942, 2945, 2944, 2948, 2940, - 2944, 2949, 2949, 2948, 2950, 2951, 2946, 2952, 2953, 2950, - 2954, 2954, 2957, 2952, 2958, 2956, 2959, 2960, 2960, 2961, - 2962, 0, 2963, 2967, 2951, 2953, 2953, 2956, 2967, 2959, - 2957, 2963, 2965, 2965, 2966, 2966, 2962, 2968, 2961, 2958, - - 2969, 2970, 2970, 2971, 2971, 2969, 2972, 2972, 2973, 2974, - 2975, 2968, 2976, 2978, 2978, 2981, 2975, 2976, 2983, 2984, - 2985, 2973, 2986, 2986, 2988, 2988, 2989, 2990, 2992, 2991, - 2993, 2994, 2994, 2998, 2981, 2974, 2995, 2995, 2997, 2993, - 2983, 2984, 2985, 2991, 2997, 2999, 2990, 3007, 2992, 3000, - 3003, 3003, 2989, 2998, 3000, 3005, 3005, 3006, 3009, 3008, - 3010, 3007, 3006, 3014, 2999, 3008, 3011, 3011, 3010, 3012, - 3009, 3015, 3016, 3017, 3012, 3018, 3020, 3016, 3021, 3022, - 3023, 3018, 3026, 3014, 3020, 3017, 3025, 3028, 3027, 3029, - 3031, 3015, 3032, 3036, 3029, 3031, 3033, 3021, 3026, 3022, - - 3023, 0, 3033, 3038, 3025, 3027, 3027, 3037, 3028, 3034, - 3037, 3043, 3032, 3036, 3034, 3043, 3038, 3041, 3041, 3042, - 3042, 3047, 3047, 3048, 3049, 3050, 3050, 3061, 3048, 3052, - 3052, 3053, 3053, 3056, 3053, 3054, 3054, 3056, 3054, 3055, - 3055, 3058, 3055, 3049, 3059, 3061, 3058, 3060, 3060, 3062, - 3065, 3066, 3067, 3059, 3068, 3068, 3071, 3067, 3072, 3074, - 3073, 3075, 3077, 3062, 3073, 3072, 3078, 0, 3074, 3082, - 3065, 3066, 3079, 3079, 3083, 3078, 3075, 3080, 3080, 3083, - 3077, 3071, 3081, 3081, 3082, 3084, 3085, 3086, 3087, 3088, - 3089, 3085, 3085, 3086, 3084, 3090, 3091, 3084, 3092, 3094, - - 3090, 3091, 3093, 3093, 3088, 3094, 3095, 3096, 3096, 3097, - 3097, 3089, 3095, 3087, 3098, 3099, 3105, 3092, 3102, 3102, - 3099, 3104, 3104, 3108, 3108, 3105, 3109, 3109, 3116, 3098, - 3110, 3110, 3111, 3111, 3112, 3112, 3113, 3113, 3114, 3114, - 3115, 3115, 3118, 3119, 3119, 3121, 3120, 3122, 3126, 3124, - 3128, 3118, 3125, 3125, 3116, 3120, 3127, 3121, 3129, 3129, - 3130, 3134, 3128, 3126, 3131, 3131, 3136, 3122, 3124, 3127, - 3135, 3137, 3137, 3135, 3140, 3130, 3138, 3140, 3141, 3134, - 3143, 3142, 3144, 3146, 3141, 3143, 3145, 3148, 3149, 3156, - 3153, 3173, 3136, 3148, 3138, 3142, 3152, 3149, 3165, 3146, - - 3152, 3144, 3176, 3165, 3145, 3153, 3166, 3168, 3179, 3166, - 3169, 3169, 3170, 3170, 3173, 3156, 3171, 3171, 3174, 3175, - 3168, 3177, 3176, 3175, 3181, 3180, 3183, 3174, 3186, 3181, - 3185, 3179, 3184, 3184, 3187, 3177, 3180, 3188, 3189, 3190, - 3191, 3183, 3197, 3185, 3192, 3193, 3194, 3186, 3203, 3191, - 3193, 3202, 3187, 3188, 3190, 3195, 3192, 3196, 3196, 3198, - 3195, 3210, 3197, 3189, 3198, 3202, 3205, 3194, 3203, 3204, - 3204, 3206, 3206, 3207, 3207, 3205, 3208, 3208, 3209, 3209, - 3210, 3211, 3212, 3213, 3214, 3212, 3215, 3216, 3213, 3214, - 3217, 3218, 3219, 3220, 3221, 3221, 3217, 3222, 3220, 3223, - - 3223, 3211, 3216, 3226, 3219, 3218, 3225, 3225, 3227, 3228, - 3228, 3215, 3232, 3230, 3235, 3235, 3237, 3222, 3226, 3236, - 3236, 3238, 3241, 3239, 3237, 3240, 3242, 3227, 3230, 3239, - 3232, 3240, 3243, 3244, 3245, 3245, 3241, 3250, 3244, 3242, - 3238, 3247, 3247, 3251, 3254, 3253, 3256, 3257, 3254, 3258, - 3262, 3243, 3257, 3261, 3259, 3262, 3260, 3263, 3250, 3253, - 3264, 3264, 3263, 3251, 3267, 3268, 3256, 3259, 3258, 3260, - 3269, 3271, 3261, 3270, 3270, 3272, 3271, 3273, 3273, 3277, - 3274, 3272, 3275, 3268, 3267, 3274, 3276, 3275, 3278, 3269, - 3281, 3276, 3280, 3280, 3278, 3281, 3282, 3282, 3277, 3284, - - 3285, 3286, 3287, 3284, 3288, 3289, 3290, 3291, 3286, 3293, - 3293, 3289, 3295, 3295, 3298, 3296, 3299, 3297, 3300, 3285, - 3291, 3287, 3297, 3288, 3296, 3290, 3303, 3296, 3301, 3301, - 3305, 3300, 3302, 3298, 3307, 3299, 3312, 3302, 0, 3303, - 3306, 3306, 3308, 3308, 3309, 3309, 3310, 3311, 3313, 3313, - 3319, 3310, 3314, 3307, 3311, 3312, 3305, 3314, 3315, 3317, - 3315, 3316, 3316, 3318, 3321, 3324, 3317, 3320, 3328, 3319, - 3318, 3326, 3320, 3323, 3323, 3327, 3326, 3329, 3330, 3330, - 3327, 3332, 3332, 3321, 3324, 3333, 3334, 3328, 3335, 3335, - 3336, 3336, 3337, 3339, 3339, 3341, 3329, 3340, 3340, 3337, - - 3347, 3343, 3341, 3346, 3333, 3334, 3343, 3348, 3346, 3349, - 3349, 3350, 3350, 0, 0, 0, 0, 0, 0, 3347, - 0, 0, 0, 0, 0, 0, 3348, 3354, 3354, 3354, - 3354, 3354, 3354, 3354, 3355, 3355, 3355, 3355, 3355, 3355, - 3355, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3357, 3357, - 3357, 3357, 3357, 3357, 3357, 3358, 3358, 3358, 3358, 3358, - 3358, 3358, 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3360, - 3360, 3360, 3360, 3360, 3360, 3360, 3362, 3362, 0, 3362, - 3362, 3362, 3362, 3363, 3363, 0, 0, 0, 3363, 3363, - 3364, 3364, 0, 0, 3364, 0, 3364, 3365, 0, 0, - - 0, 0, 0, 3365, 3366, 3366, 0, 0, 0, 3366, - 3366, 3367, 0, 0, 0, 0, 0, 3367, 3368, 3368, - 0, 3368, 3368, 3368, 3368, 3369, 0, 0, 0, 0, - 0, 3369, 3370, 3370, 0, 0, 0, 3370, 3370, 3371, - 3371, 0, 3371, 3371, 3371, 3371, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3353, 3353, 3353, 3353 + 321, 328, 322, 327, 324, 333, 331, 326, 336, 332, + 333, 329, 337, 325, 330, 331, 335, 334, 169, 335, + 334, 336, 334, 330, 337, 340, 330, 332, 340, 341, + + 341, 330, 330, 330, 330, 334, 339, 338, 334, 338, + 338, 339, 339, 342, 343, 345, 346, 344, 347, 347, + 354, 348, 349, 349, 345, 346, 348, 350, 350, 343, + 342, 351, 352, 342, 344, 344, 353, 352, 355, 354, + 356, 357, 358, 358, 360, 358, 351, 357, 353, 369, + 369, 361, 363, 362, 358, 356, 361, 363, 355, 362, + 364, 366, 375, 365, 360, 364, 365, 367, 365, 368, + 367, 364, 388, 370, 410, 366, 371, 371, 368, 370, + 372, 377, 375, 367, 376, 372, 367, 376, 367, 373, + 373, 378, 373, 388, 379, 382, 377, 381, 373, 410, + + 381, 167, 373, 384, 385, 376, 378, 373, 379, 382, + 373, 374, 374, 385, 374, 386, 381, 391, 384, 394, + 386, 386, 389, 387, 390, 392, 391, 374, 396, 387, + 374, 166, 374, 395, 374, 383, 387, 383, 383, 390, + 393, 389, 396, 399, 392, 394, 393, 383, 383, 383, + 383, 383, 397, 395, 383, 398, 400, 401, 397, 402, + 398, 404, 397, 399, 402, 403, 406, 404, 405, 405, + 407, 408, 401, 409, 411, 414, 400, 415, 398, 409, + 403, 416, 407, 412, 417, 408, 406, 418, 412, 418, + 411, 413, 413, 415, 413, 414, 420, 416, 417, 419, + + 420, 419, 419, 421, 422, 422, 423, 421, 424, 426, + 425, 430, 428, 432, 427, 431, 164, 430, 432, 419, + 428, 428, 421, 424, 431, 423, 425, 426, 427, 433, + 434, 435, 428, 433, 428, 429, 436, 435, 437, 434, + 429, 438, 440, 439, 437, 438, 439, 440, 429, 429, + 441, 443, 429, 429, 442, 442, 429, 436, 444, 444, + 445, 446, 447, 447, 443, 445, 448, 449, 450, 451, + 441, 449, 448, 452, 446, 453, 454, 454, 452, 455, + 453, 456, 457, 450, 458, 454, 459, 460, 465, 459, + 451, 455, 460, 461, 462, 467, 458, 461, 463, 463, + + 457, 456, 464, 466, 466, 471, 462, 464, 472, 465, + 469, 469, 473, 474, 475, 476, 472, 467, 477, 475, + 479, 473, 481, 480, 486, 482, 471, 483, 484, 486, + 477, 487, 490, 483, 474, 476, 488, 484, 479, 482, + 479, 480, 481, 485, 488, 487, 490, 488, 489, 485, + 491, 489, 492, 493, 494, 495, 496, 494, 492, 497, + 498, 495, 499, 500, 497, 491, 501, 500, 505, 502, + 496, 501, 503, 493, 504, 506, 509, 503, 511, 495, + 510, 512, 498, 499, 502, 512, 515, 505, 506, 513, + 504, 507, 507, 511, 516, 514, 509, 507, 516, 507, + + 514, 510, 515, 518, 517, 507, 520, 507, 513, 517, + 507, 507, 521, 517, 519, 523, 524, 507, 518, 519, + 522, 521, 520, 526, 525, 520, 522, 525, 527, 529, + 523, 522, 524, 528, 528, 530, 530, 531, 532, 535, + 533, 534, 534, 536, 537, 539, 526, 538, 527, 537, + 532, 540, 531, 541, 529, 533, 538, 544, 535, 541, + 543, 544, 546, 545, 539, 536, 540, 545, 546, 543, + 547, 548, 549, 550, 551, 552, 553, 554, 566, 555, + 553, 555, 547, 566, 557, 560, 548, 550, 562, 551, + 554, 549, 557, 552, 558, 558, 559, 560, 561, 564, + + 562, 565, 559, 563, 561, 567, 563, 569, 567, 568, + 162, 571, 581, 564, 570, 581, 565, 579, 568, 570, + 570, 572, 572, 569, 571, 568, 573, 573, 568, 574, + 575, 575, 576, 576, 577, 574, 578, 580, 579, 582, + 577, 578, 578, 583, 582, 584, 586, 585, 587, 580, + 585, 586, 589, 584, 588, 590, 589, 591, 593, 592, + 594, 590, 583, 592, 595, 594, 596, 596, 597, 598, + 599, 587, 600, 588, 602, 599, 593, 591, 595, 601, + 603, 607, 604, 597, 605, 606, 603, 604, 606, 609, + 598, 600, 610, 606, 602, 601, 606, 606, 605, 607, + + 608, 608, 613, 614, 611, 612, 616, 609, 610, 611, + 612, 617, 616, 623, 618, 619, 613, 618, 614, 619, + 617, 620, 621, 622, 624, 621, 620, 625, 622, 623, + 626, 627, 628, 632, 625, 630, 627, 629, 629, 631, + 633, 619, 624, 626, 630, 635, 634, 636, 638, 160, + 642, 638, 628, 636, 632, 634, 633, 635, 631, 637, + 639, 639, 643, 639, 640, 637, 641, 640, 642, 644, + 645, 641, 646, 648, 644, 647, 643, 650, 646, 648, + 647, 649, 651, 653, 649, 652, 654, 651, 655, 645, + 652, 652, 656, 655, 657, 658, 653, 660, 656, 654, + + 659, 669, 650, 663, 658, 659, 663, 655, 655, 661, + 661, 662, 665, 657, 664, 668, 668, 660, 662, 671, + 664, 663, 666, 667, 665, 673, 669, 666, 667, 667, + 670, 672, 670, 672, 674, 675, 676, 666, 671, 677, + 678, 679, 680, 673, 685, 679, 678, 681, 682, 683, + 684, 680, 674, 675, 687, 676, 685, 686, 688, 677, + 687, 689, 681, 682, 690, 691, 692, 683, 695, 684, + 693, 701, 686, 694, 696, 689, 690, 694, 688, 697, + 698, 699, 704, 700, 691, 701, 695, 692, 700, 693, + 696, 702, 702, 705, 707, 706, 704, 697, 698, 698, + + 699, 703, 708, 709, 710, 703, 706, 708, 707, 711, + 712, 713, 705, 714, 715, 718, 713, 712, 719, 709, + 714, 716, 711, 710, 717, 719, 716, 720, 721, 717, + 722, 723, 725, 718, 724, 730, 720, 725, 715, 722, + 724, 726, 721, 723, 726, 727, 728, 729, 731, 727, + 730, 732, 733, 733, 734, 734, 729, 735, 735, 736, + 728, 737, 731, 734, 736, 739, 741, 740, 743, 744, + 737, 742, 732, 740, 745, 742, 746, 747, 749, 750, + 743, 748, 746, 751, 739, 747, 741, 754, 748, 757, + 760, 761, 745, 772, 744, 763, 749, 761, 770, 760, + + 764, 763, 754, 751, 750, 752, 757, 752, 85, 764, + 752, 766, 765, 772, 752, 766, 770, 752, 767, 767, + 768, 768, 769, 771, 752, 752, 773, 752, 765, 775, + 776, 777, 773, 769, 780, 776, 778, 771, 774, 774, + 774, 782, 774, 779, 781, 774, 782, 779, 781, 775, + 774, 783, 777, 785, 778, 784, 774, 774, 780, 786, + 784, 788, 787, 791, 781, 787, 788, 788, 785, 789, + 783, 790, 790, 798, 792, 798, 789, 794, 791, 792, + 793, 793, 794, 795, 786, 796, 795, 797, 797, 799, + 796, 800, 801, 802, 804, 803, 801, 805, 805, 810, + + 806, 799, 804, 807, 808, 808, 809, 811, 814, 814, + 800, 810, 812, 802, 803, 806, 813, 807, 812, 819, + 815, 813, 817, 825, 809, 815, 815, 817, 818, 811, + 820, 825, 821, 822, 818, 824, 820, 821, 819, 822, + 823, 824, 828, 823, 826, 826, 827, 827, 829, 830, + 828, 831, 832, 833, 830, 834, 835, 835, 831, 836, + 838, 838, 840, 837, 844, 850, 829, 839, 836, 833, + 832, 837, 845, 839, 834, 842, 843, 845, 846, 847, + 849, 840, 847, 851, 842, 843, 848, 846, 844, 852, + 850, 848, 851, 853, 849, 854, 854, 855, 853, 853, + + 856, 857, 852, 858, 859, 860, 867, 862, 860, 862, + 857, 864, 855, 863, 863, 865, 860, 866, 869, 856, + 865, 868, 859, 870, 871, 872, 867, 858, 874, 876, + 873, 875, 864, 871, 873, 876, 877, 878, 866, 879, + 869, 868, 880, 870, 882, 877, 874, 881, 872, 878, + 875, 883, 882, 881, 884, 886, 880, 887, 879, 884, + 885, 885, 888, 889, 890, 883, 891, 892, 893, 895, + 894, 888, 890, 896, 886, 895, 898, 887, 897, 896, + 899, 900, 898, 889, 903, 901, 891, 893, 903, 892, + 894, 901, 897, 902, 899, 904, 905, 906, 907, 902, + + 909, 900, 906, 908, 908, 910, 909, 911, 905, 912, + 911, 910, 913, 915, 904, 914, 905, 916, 916, 907, + 917, 914, 921, 918, 924, 913, 919, 912, 918, 919, + 920, 923, 923, 915, 925, 920, 920, 921, 917, 922, + 926, 927, 919, 922, 919, 926, 924, 929, 930, 933, + 932, 934, 936, 936, 925, 937, 939, 939, 940, 937, + 927, 941, 930, 932, 938, 941, 942, 962, 962, 933, + 944, 929, 934, 935, 943, 944, 935, 945, 935, 938, + 946, 942, 935, 940, 935, 946, 946, 947, 943, 935, + 948, 945, 950, 949, 935, 951, 947, 949, 953, 952, + + 951, 954, 955, 953, 948, 956, 958, 950, 957, 949, + 951, 952, 958, 959, 960, 954, 961, 957, 959, 956, + 960, 963, 961, 955, 964, 965, 963, 966, 969, 970, + 964, 967, 972, 975, 970, 973, 973, 974, 971, 976, + 969, 975, 974, 977, 972, 980, 966, 965, 978, 967, + 968, 968, 971, 979, 981, 976, 968, 977, 968, 983, + 981, 980, 984, 982, 968, 985, 986, 978, 982, 968, + 968, 983, 979, 987, 988, 988, 968, 990, 989, 992, + 984, 985, 989, 993, 986, 992, 993, 994, 995, 996, + 997, 987, 999, 995, 998, 1001, 997, 990, 1002, 998, + + 1003, 1005, 996, 1004, 1001, 1006, 994, 1002, 1007, 1004, + 1005, 999, 1008, 1007, 1009, 1010, 1003, 1011, 1012, 1014, + 1015, 1013, 1018, 1021, 1006, 1014, 1020, 1012, 1009, 1011, + 1013, 1022, 1008, 1016, 1023, 1010, 1022, 1015, 1018, 1016, + 1020, 1024, 1025, 1021, 1026, 1027, 1028, 1031, 1032, 80, + 1027, 1028, 1031, 1023, 1035, 1024, 1036, 1032, 1034, 1026, + 1025, 1033, 1033, 1035, 1034, 1037, 1039, 1040, 1045, 1044, + 1046, 1036, 1040, 1040, 1043, 1042, 1042, 1043, 1037, 1042, + 1047, 1048, 1039, 1044, 1049, 1050, 1046, 1051, 1045, 1052, + 1053, 1050, 1054, 1058, 1048, 1052, 1055, 1054, 1047, 1049, + + 1057, 1059, 1061, 1057, 1060, 1053, 1059, 1051, 1062, 1060, + 1055, 1063, 1065, 1067, 1058, 1064, 1063, 1062, 1061, 1067, + 1064, 1068, 1069, 1070, 1065, 1071, 1071, 1072, 1069, 1070, + 1073, 1074, 1075, 1075, 1074, 1076, 1072, 1068, 1077, 1078, + 1079, 1080, 1083, 1079, 1081, 1082, 1085, 1083, 1073, 1091, + 1081, 1082, 1085, 1076, 1080, 1084, 1086, 1077, 1087, 1078, + 1084, 1086, 1089, 1090, 1087, 1092, 1097, 1089, 1093, 1091, + 1095, 1092, 1098, 1093, 1094, 1094, 1096, 1099, 1101, 1095, + 1099, 1090, 1102, 1100, 1097, 1096, 1100, 1102, 1103, 1101, + 1104, 1098, 1105, 1106, 1107, 1108, 1109, 1110, 1110, 1106, + + 1107, 1109, 1104, 1111, 1112, 1113, 1103, 1114, 1115, 1116, + 1108, 1105, 1115, 1118, 1117, 1119, 1121, 1113, 1112, 1122, + 1122, 1123, 1111, 1117, 1126, 1114, 1124, 1116, 1125, 1123, + 1129, 1124, 1118, 1125, 1128, 1121, 1131, 1130, 1132, 1134, + 1119, 1131, 1133, 1133, 1126, 1129, 1135, 1132, 1128, 1130, + 1136, 1137, 1135, 1138, 1141, 1139, 1136, 1139, 1138, 1134, + 1140, 1142, 1144, 1145, 1143, 1140, 1146, 1137, 1141, 1143, + 1147, 1148, 1151, 1146, 1152, 1142, 1153, 1144, 1150, 1150, + 1155, 1154, 1145, 1156, 75, 1147, 1151, 1154, 1156, 1158, + 1148, 1153, 1152, 1158, 1159, 1159, 1160, 1156, 1162, 1156, + + 1155, 1160, 1156, 1161, 1161, 1162, 1163, 1164, 1165, 1167, + 1164, 1166, 1168, 1169, 1170, 74, 1171, 1168, 1167, 1172, + 1163, 1171, 1174, 1173, 1176, 1176, 1170, 1165, 1179, 1166, + 1177, 1178, 1169, 1172, 1173, 1177, 1178, 1180, 1182, 1181, + 1183, 1174, 1180, 1181, 1184, 1185, 1186, 1182, 1179, 1188, + 1187, 1189, 1190, 1191, 1192, 1183, 1188, 1196, 1186, 1184, + 1193, 1194, 1195, 1189, 1185, 1187, 1193, 1197, 1195, 1198, + 1199, 1190, 1192, 1200, 1191, 1202, 1194, 1196, 1198, 1201, + 1203, 1204, 1205, 1206, 1208, 1199, 1209, 1197, 1205, 1211, + 1208, 1201, 1200, 1210, 1202, 1212, 1204, 1211, 1213, 1214, + + 1215, 1209, 1217, 1206, 1214, 1203, 1218, 1210, 1281, 1219, + 1281, 1216, 1215, 1222, 1213, 1212, 1216, 1216, 1220, 1220, + 1218, 1217, 1219, 1221, 1221, 1223, 1222, 1224, 1221, 1225, + 1225, 1221, 1221, 1224, 1223, 1226, 1221, 1228, 1227, 1229, + 1226, 1232, 1221, 1228, 1229, 1230, 1221, 1227, 1231, 1231, + 1230, 1233, 1233, 1234, 1235, 1236, 1234, 1237, 1234, 1238, + 1239, 1240, 1232, 1237, 1241, 1242, 1240, 1245, 1238, 1243, + 1244, 1249, 1245, 1236, 1235, 1243, 1244, 1246, 1241, 1247, + 1239, 1246, 1248, 1242, 1260, 1249, 1255, 1248, 1247, 1250, + 1250, 1251, 1251, 1247, 1251, 1247, 1252, 1247, 1254, 1247, + + 1256, 1255, 1254, 1257, 1258, 1259, 1260, 1252, 1261, 1258, + 1258, 1262, 1257, 1261, 1259, 1263, 1264, 1265, 1256, 1266, + 1267, 1268, 1268, 1269, 1263, 1262, 1267, 1270, 1272, 1271, + 1273, 1269, 1275, 1266, 1271, 1264, 1265, 1274, 1276, 1273, + 1277, 1270, 1272, 1279, 1274, 1277, 1278, 1278, 1280, 1280, + 1275, 1283, 1284, 1285, 1283, 1286, 1288, 1284, 1279, 1287, + 1287, 1289, 1289, 1276, 1286, 1290, 1290, 1292, 1291, 1293, + 1294, 1294, 1285, 1291, 1295, 1296, 1288, 1297, 1298, 1299, + 1297, 1300, 1301, 1303, 1306, 1299, 1300, 1302, 1292, 1302, + 1293, 1301, 1296, 1305, 1295, 1307, 1305, 1308, 1298, 1306, + + 1307, 1303, 1309, 1311, 1310, 1313, 1312, 1309, 1311, 1312, + 1313, 1308, 1310, 1314, 1314, 1315, 1316, 1317, 1318, 1319, + 1315, 1321, 1322, 1317, 1323, 1318, 1324, 1321, 1322, 1323, + 1325, 1324, 1319, 1326, 1316, 1327, 1325, 1328, 1329, 1329, + 1330, 1332, 1326, 1333, 1335, 1334, 1332, 1336, 1328, 1337, + 1338, 1339, 1340, 1344, 1327, 1334, 1338, 1339, 1340, 1335, + 1330, 1333, 1342, 1343, 1345, 1347, 1346, 1336, 1342, 1348, + 1349, 1349, 1337, 1344, 1350, 1351, 1353, 1343, 1346, 1347, + 1352, 1353, 1355, 1343, 1345, 1354, 1354, 1348, 1356, 1358, + 1359, 1360, 1361, 1356, 1350, 1359, 1359, 1363, 1352, 1362, + + 1351, 1361, 1364, 1365, 1367, 1355, 1369, 1362, 1358, 1360, + 1368, 1363, 1368, 1367, 1366, 1373, 1375, 1364, 1365, 1366, + 1369, 1365, 1366, 1371, 1372, 1374, 1373, 1376, 1372, 1371, + 1374, 1374, 1377, 1378, 1379, 1375, 1380, 1381, 1378, 1379, + 1382, 1383, 1385, 68, 1386, 1382, 1387, 1388, 1388, 1390, + 1377, 1389, 1391, 1376, 1380, 1389, 1385, 1381, 1393, 1392, + 1394, 1383, 1386, 1395, 1387, 1392, 1396, 1390, 1397, 1398, + 1393, 1391, 1402, 1399, 1403, 1400, 1406, 1395, 1399, 1394, + 1401, 1396, 1400, 1397, 1404, 1401, 1405, 1405, 1398, 1407, + 1402, 1406, 1408, 1404, 1410, 1403, 1409, 1409, 1407, 1411, + + 1410, 1412, 1413, 1413, 1415, 1411, 1414, 1414, 1416, 1417, + 1415, 1418, 1408, 1419, 1420, 1412, 1418, 1421, 1428, 1419, + 1420, 1422, 1422, 1421, 1416, 1423, 1423, 1425, 1425, 1426, + 1417, 1427, 1429, 1426, 1430, 1431, 1428, 1434, 1432, 1435, + 1427, 1433, 1433, 1438, 1429, 1432, 1436, 1435, 1430, 1437, + 1431, 1436, 1441, 1439, 1443, 1440, 1444, 1434, 1439, 1439, + 1440, 1440, 1438, 1437, 1442, 1442, 1446, 1445, 1447, 1448, + 1449, 1446, 1441, 1443, 1450, 1444, 1445, 1451, 1452, 1453, + 1450, 1455, 1451, 1458, 1454, 1456, 1457, 1447, 1449, 1448, + 1454, 1456, 1457, 1459, 1460, 1461, 1462, 1463, 1452, 1469, + + 1455, 1464, 1458, 1465, 1465, 1453, 1466, 1467, 1468, 1466, + 1462, 1469, 1459, 1460, 1461, 1475, 1464, 1474, 1463, 1470, + 1470, 1471, 1471, 1472, 1475, 1473, 1467, 1468, 1472, 1473, + 1474, 1476, 1477, 1481, 1477, 1479, 1480, 1482, 1477, 1483, + 1485, 1480, 1484, 1484, 1476, 1485, 1486, 1487, 1481, 1489, + 1488, 1477, 1486, 1479, 1489, 1483, 1490, 1482, 1492, 1493, + 1490, 1491, 1487, 1488, 1494, 1491, 1495, 1499, 1496, 1497, + 1497, 1501, 63, 1494, 1496, 1502, 1505, 1493, 1492, 1516, + 1502, 1503, 1503, 1504, 1511, 1499, 1495, 1507, 1507, 1504, + 1509, 1512, 1501, 1509, 1510, 1510, 1505, 1515, 1514, 1516, + + 1511, 1514, 1517, 1518, 1519, 1519, 1520, 1512, 1521, 1522, + 1523, 1517, 1524, 1525, 1525, 1523, 1526, 1527, 1515, 1528, + 1529, 1520, 1530, 1518, 1532, 1526, 1524, 1540, 1522, 1521, + 1531, 1531, 1533, 1535, 1528, 1527, 1534, 1538, 1532, 1536, + 1536, 1534, 1530, 1537, 1541, 1529, 1544, 1537, 1535, 1540, + 1533, 1539, 1539, 1542, 1543, 1545, 1548, 1538, 1543, 1548, + 1545, 1547, 1547, 1541, 1542, 1544, 1549, 1550, 1551, 1552, + 1554, 1553, 1550, 1556, 1555, 1557, 1557, 1558, 1563, 1549, + 1559, 1560, 1558, 1563, 1551, 1553, 1562, 1552, 1555, 1554, + 1554, 1561, 1561, 1564, 1565, 1562, 1565, 1566, 1556, 1567, + + 1559, 1560, 1566, 1568, 1569, 1567, 1571, 1572, 1572, 1573, + 1569, 1574, 1577, 1564, 1576, 1578, 1578, 1574, 1580, 1576, + 1571, 1579, 1579, 1568, 1581, 1582, 1583, 1585, 1573, 1583, + 1584, 1584, 1580, 1587, 1586, 1595, 1577, 1589, 1588, 58, + 1582, 1588, 1581, 1589, 1588, 1585, 1586, 1590, 1591, 1593, + 1594, 1591, 1590, 1587, 1596, 1594, 1588, 1596, 1593, 1598, + 1595, 1597, 1597, 1599, 1603, 1598, 1600, 1591, 1606, 1599, + 1603, 1600, 1601, 1601, 1602, 1602, 1604, 1605, 1607, 1608, + 1609, 1604, 1610, 1609, 1612, 1611, 1606, 1613, 1610, 1612, + 1605, 1611, 1614, 1613, 1618, 1615, 1619, 1607, 1617, 1608, + + 1615, 1616, 1616, 1617, 1620, 1621, 1622, 1623, 1624, 1625, + 1626, 1629, 1618, 1627, 1636, 1614, 1619, 1627, 1638, 1632, + 1622, 1623, 1624, 1620, 1628, 1621, 1628, 1625, 1633, 1630, + 1629, 1632, 1634, 1635, 1636, 1626, 1630, 1637, 1638, 1635, + 1633, 1639, 1640, 1642, 1642, 1634, 1643, 1644, 1645, 1646, + 1646, 1648, 1644, 1637, 1647, 1639, 1649, 1650, 1651, 1652, + 1645, 1653, 1655, 1640, 1654, 1648, 1643, 1651, 1653, 1647, + 1657, 1659, 57, 1654, 1652, 1650, 1654, 1663, 1655, 1660, + 1649, 1664, 1660, 1661, 1661, 1657, 1662, 1662, 1665, 1663, + 1657, 1665, 1666, 1666, 1667, 1668, 1659, 1669, 1670, 1664, + + 1671, 1670, 1669, 1672, 1673, 1671, 1674, 1667, 1675, 1676, + 1677, 1678, 1679, 1679, 1668, 1674, 1680, 1678, 1676, 1677, + 1673, 1676, 1672, 1682, 1681, 1683, 1684, 1675, 1685, 1690, + 1686, 1687, 1691, 1685, 1685, 1686, 1680, 1681, 1694, 1683, + 1693, 1682, 1684, 1687, 1692, 1692, 1695, 1694, 1696, 1696, + 1691, 1695, 1697, 1698, 1690, 1699, 1693, 1700, 1698, 1701, + 1702, 1697, 1704, 1696, 1697, 1702, 1702, 1705, 1706, 1707, + 1709, 1710, 1710, 1699, 1707, 1708, 1704, 1701, 1700, 1711, + 1713, 1708, 1705, 1717, 1712, 1711, 1714, 1715, 1709, 1712, + 1706, 1718, 1714, 1715, 1713, 1719, 1720, 1721, 1722, 1724, + + 1721, 1719, 1726, 1717, 1722, 1718, 1721, 1724, 1727, 1720, + 1728, 1729, 1731, 1730, 1732, 1733, 1729, 1734, 1728, 1735, + 1737, 1726, 1730, 1732, 1739, 1731, 1737, 1727, 1733, 1736, + 1736, 1734, 1738, 1735, 1740, 1740, 1741, 1739, 1738, 1742, + 1743, 1744, 1744, 1746, 1747, 1745, 1748, 1749, 1752, 1746, + 1753, 1736, 1751, 1751, 1753, 1754, 1741, 1742, 1745, 1743, + 1754, 1755, 1748, 1759, 1756, 1749, 1747, 1757, 1752, 1756, + 1758, 1761, 1757, 1763, 1762, 1764, 1763, 1765, 1767, 1758, + 1769, 1755, 1761, 1762, 1766, 1766, 1759, 1764, 1768, 1770, + 1770, 1771, 1765, 1776, 1772, 1773, 1774, 1767, 1777, 1769, + + 1768, 1772, 1779, 1778, 1780, 1771, 1786, 1773, 1774, 1778, + 1781, 1786, 1776, 1791, 1779, 1791, 1781, 1793, 1777, 1782, + 1782, 1783, 1780, 1787, 1783, 1784, 1784, 1788, 1789, 1789, + 1790, 1792, 1787, 1788, 1792, 1794, 1795, 1793, 1796, 1797, + 1798, 1799, 1790, 1800, 1797, 1798, 1801, 1802, 1804, 1803, + 1799, 1807, 1802, 1810, 1795, 1800, 1796, 1794, 1803, 1806, + 1805, 1801, 1808, 1808, 1806, 1805, 1807, 1809, 1804, 1812, + 1813, 1803, 1805, 1809, 1810, 1814, 1815, 1816, 1817, 1816, + 1818, 1818, 1819, 1819, 1820, 1820, 1821, 1824, 1812, 1813, + 1825, 1814, 1817, 1835, 1817, 1838, 1815, 1822, 1822, 1823, + + 1823, 1826, 1826, 1827, 1828, 1832, 1821, 1827, 1824, 1829, + 1828, 1825, 1829, 1831, 1833, 1838, 1834, 1841, 1835, 1831, + 1833, 1834, 1836, 1832, 1839, 1836, 1837, 1837, 1842, 1839, + 1840, 1840, 1841, 1843, 1844, 1845, 1845, 1846, 1843, 1844, + 1847, 1848, 1846, 1849, 1850, 1851, 1847, 1853, 52, 1842, + 1852, 1857, 1855, 1848, 1848, 1848, 1852, 1855, 1855, 1856, + 1848, 1859, 1850, 1849, 1860, 1851, 1857, 1853, 1858, 1861, + 1858, 1862, 1859, 1856, 1863, 1861, 1864, 1865, 1865, 1860, + 1862, 1866, 1867, 1867, 1868, 1872, 1869, 1870, 1870, 1871, + 1871, 1875, 1875, 1876, 1863, 1880, 1881, 1864, 1882, 1884, + + 1877, 1879, 1881, 1888, 1868, 1872, 1885, 1866, 1869, 1877, + 1879, 1883, 1883, 1890, 1882, 1886, 1880, 1887, 1876, 1891, + 1884, 1885, 1886, 1889, 1889, 1893, 1887, 1894, 1895, 1888, + 1893, 1896, 1900, 1894, 1897, 1891, 1901, 1904, 1896, 1890, + 1897, 1898, 1901, 1898, 1902, 1902, 1904, 1903, 1895, 1905, + 1907, 1900, 1903, 1906, 1908, 1909, 1910, 1908, 1911, 1911, + 1912, 1913, 1907, 1914, 1915, 1918, 1912, 1913, 1922, 1905, + 1916, 1919, 1906, 1909, 1916, 1920, 1921, 1921, 1925, 1915, + 1920, 1923, 1910, 1914, 1926, 1918, 1934, 1922, 1926, 1928, + 1916, 1927, 1927, 1919, 1929, 1928, 1923, 1925, 1930, 1930, + + 1931, 1932, 1935, 1929, 1931, 1933, 1933, 1934, 1936, 1937, + 1938, 1939, 1932, 1940, 1937, 1941, 1935, 1932, 1943, 1940, + 1942, 1944, 1947, 1943, 1945, 1945, 1947, 1936, 1946, 1946, + 1938, 1939, 1949, 1941, 1944, 1942, 1950, 1951, 1952, 1952, + 1955, 1949, 1954, 1954, 1956, 1955, 1955, 1950, 1958, 1959, + 1956, 1960, 1950, 1961, 1958, 1962, 1960, 1951, 1964, 1965, + 1966, 1962, 1968, 1965, 1970, 1961, 1967, 1967, 1969, 1973, + 1964, 1971, 1966, 1974, 1969, 1959, 1975, 1971, 1972, 1972, + 1976, 1975, 1978, 1979, 1980, 1986, 1970, 1968, 1973, 1980, + 1983, 1983, 1976, 1974, 1978, 1982, 1984, 1984, 1982, 1985, + + 1985, 1987, 1979, 1988, 1990, 1986, 1989, 1987, 1991, 1988, + 1990, 1989, 1995, 1993, 1996, 1995, 1999, 1991, 1993, 1997, + 1997, 2000, 2001, 2002, 2002, 2003, 1996, 2001, 1999, 2006, + 2004, 2005, 2006, 2000, 2003, 2004, 2005, 2007, 2007, 2008, + 2009, 2012, 2010, 2011, 2014, 2012, 2013, 2015, 2016, 2009, + 2014, 2013, 2017, 2018, 2020, 2020, 2021, 2016, 2023, 2008, + 2010, 2027, 2011, 2022, 2025, 2015, 2020, 2018, 2024, 2024, + 2017, 2026, 2022, 2025, 2021, 2028, 2029, 2035, 2023, 2036, + 2028, 2038, 2027, 2026, 2032, 2032, 2039, 2034, 2040, 2029, + 2034, 2041, 2044, 2035, 2040, 2036, 2038, 2042, 2042, 2043, + + 2039, 2043, 2045, 2045, 2046, 2048, 2048, 2051, 2041, 2052, + 2044, 2053, 2046, 2049, 2049, 2052, 2055, 2053, 2054, 2056, + 2057, 2058, 2058, 2055, 2059, 2060, 2061, 2062, 2063, 2065, + 2051, 2067, 2054, 2059, 2066, 2064, 2069, 2067, 2061, 2062, + 2057, 2056, 2070, 2063, 2073, 2071, 2060, 2064, 2074, 2066, + 2067, 2072, 2072, 2077, 2076, 2065, 2069, 2071, 2075, 2076, + 2081, 2075, 2073, 2087, 2079, 2070, 2082, 2083, 2074, 2079, + 2080, 2082, 2080, 2077, 2083, 2085, 2088, 2089, 2081, 2091, + 2090, 2087, 2090, 2095, 2085, 2088, 2092, 2097, 2094, 2089, + 2094, 2098, 2092, 2096, 2096, 2100, 2098, 2095, 2091, 2099, + + 2100, 2099, 2101, 2102, 2103, 2104, 2106, 2101, 2107, 2105, + 2108, 2104, 2111, 2097, 2105, 2108, 2108, 2109, 2112, 2106, + 2107, 2102, 2113, 2113, 2103, 2109, 2114, 2114, 2115, 2116, + 2117, 2111, 2112, 2118, 2120, 2119, 2117, 2119, 2118, 2121, + 2122, 2122, 2123, 2115, 2124, 2124, 2128, 2121, 2126, 2116, + 2125, 2125, 2120, 2127, 2123, 2121, 2130, 2126, 2127, 2131, + 2132, 2131, 2134, 2136, 2128, 2130, 2133, 2135, 2130, 2143, + 2138, 2133, 2133, 2139, 2134, 2136, 2135, 2142, 2139, 2140, + 2146, 2132, 2138, 2144, 2140, 2145, 2145, 2147, 2148, 2143, + 2142, 2149, 2144, 2150, 2151, 2152, 2154, 2156, 2146, 2155, + + 2152, 2157, 2165, 2159, 2148, 2147, 2157, 2150, 2154, 2151, + 2158, 2155, 2159, 2162, 2164, 2158, 2149, 2156, 2166, 2162, + 2164, 2167, 2168, 2170, 2170, 2165, 2169, 2171, 2172, 2172, + 2173, 2174, 2162, 2166, 2175, 2169, 2171, 2176, 2175, 2167, + 2177, 2179, 2176, 2180, 2181, 2187, 2182, 2168, 2173, 2180, + 2174, 2182, 2182, 2177, 2185, 2183, 2184, 2185, 2196, 2186, + 2179, 2183, 2184, 2190, 2190, 2187, 2181, 2186, 2191, 2191, + 2192, 2193, 2193, 2194, 2194, 2195, 2196, 2198, 2197, 2192, + 2199, 2199, 2198, 2191, 2197, 2200, 2200, 2195, 2201, 2202, + 2205, 2207, 2204, 2201, 2191, 2202, 2204, 2206, 2209, 2210, + + 2212, 2206, 2211, 2213, 2210, 2215, 2214, 2216, 2213, 2217, + 2205, 2207, 2218, 2221, 2217, 2212, 2219, 2219, 2220, 2223, + 2224, 2215, 2220, 2209, 2214, 2211, 2222, 2216, 2221, 2225, + 2226, 2222, 2227, 2228, 2218, 2229, 2232, 2227, 2224, 2230, + 2230, 2225, 2233, 2234, 2232, 2223, 2228, 2235, 2236, 2226, + 2237, 2239, 2238, 2229, 2240, 2245, 2243, 2249, 2241, 2247, + 2246, 2233, 2234, 2239, 2241, 2247, 2250, 2250, 2245, 2237, + 2235, 2243, 2236, 2238, 2246, 2240, 2248, 2249, 2248, 2251, + 2252, 2253, 2254, 2252, 2251, 2255, 2256, 2256, 2257, 2257, + 2258, 2260, 2258, 47, 2253, 2261, 2254, 2269, 2255, 2259, + + 2259, 2262, 2262, 2263, 2264, 2264, 2260, 2270, 2261, 2265, + 2265, 2266, 2263, 2268, 2271, 2263, 2266, 2269, 2268, 2272, + 2272, 2273, 2273, 2274, 2275, 2275, 2271, 2270, 2276, 2277, + 2277, 2279, 2278, 2280, 2280, 2282, 2279, 2281, 2281, 2283, + 2284, 2285, 2274, 2286, 2290, 2288, 2276, 2278, 2283, 2282, + 2288, 2289, 2289, 2291, 2291, 2285, 2292, 2284, 2293, 2295, + 2295, 2297, 2286, 2290, 2293, 2294, 2296, 2296, 2294, 2298, + 2299, 2301, 2299, 2302, 2292, 2295, 2303, 2303, 2305, 2306, + 2297, 2307, 2310, 2308, 2298, 2311, 2301, 2308, 2309, 2309, + 2311, 2312, 2302, 2313, 2315, 2315, 2307, 2316, 2305, 2318, + + 2317, 2310, 2306, 2319, 2320, 2321, 2312, 2317, 2313, 2322, + 2322, 2323, 2324, 2318, 2324, 2325, 2328, 2316, 2325, 2327, + 2323, 2319, 2320, 2331, 2329, 2327, 2332, 2330, 2328, 2329, + 2333, 2321, 2330, 2325, 2335, 2325, 2334, 2337, 2338, 2332, + 2339, 2334, 2337, 2338, 2340, 2342, 2341, 2343, 2331, 2345, + 2340, 2333, 2341, 2344, 2345, 2339, 2346, 2347, 2348, 2344, + 2335, 2346, 2343, 2350, 2349, 2351, 2342, 2349, 2352, 2353, + 2354, 2348, 2350, 2355, 2351, 2356, 2357, 2352, 2353, 2355, + 2357, 2356, 2347, 2359, 2354, 2361, 2362, 2363, 2363, 2366, + 2364, 2365, 2365, 2367, 2367, 2362, 2364, 2368, 2366, 2369, + + 2365, 2371, 2368, 2359, 2372, 2361, 2373, 2373, 2374, 2375, + 2377, 2378, 2380, 2379, 2384, 2386, 2386, 2371, 2375, 2369, + 2372, 2369, 2377, 2374, 2380, 2383, 2382, 2378, 2379, 2382, + 2383, 2385, 2387, 2387, 2384, 2389, 2389, 2390, 2396, 2391, + 2390, 2392, 2393, 2385, 2391, 2394, 2398, 2392, 2393, 2395, + 2395, 2399, 2396, 2400, 2394, 2397, 2397, 2402, 2398, 2401, + 2401, 2403, 2404, 2402, 2406, 2399, 2407, 2404, 2406, 2407, + 2408, 2408, 2400, 2409, 2410, 2403, 2411, 2412, 2409, 2415, + 2413, 2414, 2414, 2410, 2413, 2411, 2417, 2418, 2419, 2420, + 2421, 2417, 2415, 2422, 2421, 2423, 2424, 2412, 2425, 2427, + + 2423, 2428, 2424, 2420, 2425, 2426, 2426, 2418, 2419, 2429, + 2430, 2431, 2434, 2422, 2435, 2430, 2436, 2427, 2432, 2432, + 2428, 2436, 2441, 2437, 2434, 2438, 2443, 2446, 2429, 2437, + 2435, 2441, 2431, 2438, 2439, 2452, 2439, 2444, 2444, 2445, + 2443, 2450, 2445, 2447, 2447, 2450, 2451, 2452, 2453, 2453, + 2454, 2459, 2451, 2446, 2457, 2457, 2461, 2462, 2465, 2454, + 2466, 2467, 2468, 2465, 2470, 2470, 2469, 2468, 2476, 2459, + 2461, 2469, 2474, 2462, 2472, 2472, 2475, 2475, 2474, 2477, + 2478, 2480, 2467, 2482, 2476, 2478, 2466, 2481, 2484, 2484, + 2481, 2483, 2487, 2486, 2488, 2482, 2489, 2493, 2487, 2494, + + 2480, 2477, 2486, 2483, 2491, 2491, 2492, 2496, 2496, 2492, + 2498, 2489, 2488, 2497, 2497, 2498, 2493, 2494, 2499, 2500, + 2501, 2502, 2505, 2502, 2503, 2501, 2504, 2506, 2500, 2507, + 2508, 2546, 2506, 2546, 2505, 18, 2499, 2509, 2503, 2515, + 2504, 2514, 2509, 2510, 2510, 2511, 2511, 2512, 2512, 2507, + 2508, 2513, 2513, 2514, 2516, 2517, 2517, 2515, 2519, 2516, + 2518, 2518, 2520, 2521, 2522, 2523, 2526, 2524, 2525, 2525, + 2519, 2527, 2527, 2528, 2528, 2521, 2529, 2530, 2532, 2533, + 2535, 2531, 2520, 2524, 2522, 2526, 2523, 2529, 2531, 2530, + 2532, 2534, 2536, 2537, 2537, 2538, 2534, 2539, 2539, 2533, + + 2535, 2540, 2541, 2542, 2538, 2543, 2544, 2547, 2545, 2548, + 2548, 2550, 2536, 2551, 2549, 2553, 2542, 2554, 2555, 2547, + 2544, 2556, 2541, 2549, 2556, 2576, 2550, 2540, 2551, 2543, + 2545, 2557, 2558, 2553, 2576, 2559, 2567, 2558, 2569, 2554, + 2559, 2555, 2560, 2560, 2568, 2557, 2561, 2561, 2562, 2562, + 2564, 2564, 2566, 2566, 2567, 2568, 2570, 2569, 2572, 2573, + 2574, 2575, 2578, 2577, 2578, 2579, 2580, 2586, 2581, 2582, + 2582, 2570, 2584, 2584, 2585, 2588, 2588, 2573, 2572, 2591, + 2591, 2575, 2574, 2577, 2580, 2579, 2581, 2587, 2585, 2586, + 2590, 2592, 2593, 2594, 2603, 2596, 2587, 2595, 2597, 2590, + + 2594, 2598, 2599, 17, 2600, 2601, 2601, 2602, 2602, 2592, + 2593, 2600, 2595, 2596, 2603, 2604, 2597, 2598, 2605, 2607, + 2607, 2599, 2608, 2608, 2605, 2609, 2610, 2611, 2612, 2613, + 2614, 2609, 2615, 2604, 2616, 2614, 2617, 2618, 2620, 2618, + 2620, 2617, 2611, 2613, 2610, 2619, 2619, 2612, 2621, 2621, + 2623, 2625, 2615, 2626, 2616, 2627, 2628, 2629, 2630, 2631, + 2625, 2632, 2629, 2630, 2635, 2636, 2638, 2627, 2636, 2623, + 2637, 2637, 2626, 2639, 2640, 2640, 2628, 2641, 2642, 2631, + 2632, 2638, 2643, 2645, 2635, 2646, 2643, 2648, 2641, 2646, + 2650, 2639, 2651, 2642, 2647, 2647, 2652, 2655, 2645, 2656, + + 2648, 2653, 2653, 2657, 2659, 2650, 2663, 2657, 2656, 2655, + 2658, 2658, 2651, 2660, 2660, 2661, 2652, 2662, 2664, 2665, + 2661, 2672, 2663, 2659, 2666, 2666, 2662, 2671, 2671, 2674, + 2664, 2673, 2673, 2675, 2680, 2676, 2677, 2681, 2678, 2665, + 2679, 2679, 2674, 2672, 2676, 2677, 2675, 2678, 2683, 2683, + 2686, 2687, 2681, 2688, 2680, 2686, 2687, 2689, 2690, 2691, + 2692, 2695, 2689, 2693, 2699, 2697, 2690, 2688, 2698, 2692, + 2697, 2693, 2702, 2698, 2700, 2700, 2695, 2702, 2691, 2699, + 2701, 2701, 2703, 2704, 2704, 2705, 2706, 2707, 2708, 2709, + 0, 2706, 2705, 2710, 2712, 2709, 2711, 2711, 2710, 2713, + + 2718, 2703, 2714, 2714, 2713, 2707, 2708, 2715, 2715, 2712, + 2719, 2719, 2720, 2718, 2721, 2720, 2722, 2723, 2724, 2721, + 2721, 2722, 2723, 2725, 2726, 2727, 2728, 2729, 2726, 2725, + 2727, 2730, 2724, 2731, 2732, 2728, 2734, 2733, 2735, 2730, + 2732, 2734, 2729, 2733, 2737, 2739, 2741, 2738, 2739, 2745, + 2735, 2737, 2738, 2746, 2731, 2743, 2744, 2759, 2741, 2747, + 2743, 2744, 2748, 2749, 2749, 2750, 2746, 2745, 2747, 2754, + 2751, 2748, 2755, 2756, 2750, 2751, 2759, 2760, 2755, 2756, + 2761, 2762, 2762, 2763, 2764, 2765, 2766, 2754, 2767, 2767, + 2763, 2768, 2770, 2772, 2765, 2775, 2773, 2760, 2778, 2761, + + 2773, 2766, 2776, 2764, 2774, 2774, 2777, 2770, 2776, 2779, + 2768, 2781, 2777, 2772, 2784, 2779, 2778, 2780, 2780, 2781, + 2775, 2782, 2785, 2784, 2787, 2788, 2782, 2789, 2788, 2790, + 2787, 2789, 2791, 2793, 2793, 2785, 2794, 2795, 2795, 2796, + 2796, 2798, 2798, 2790, 2799, 2800, 2804, 2791, 2799, 2806, + 2800, 2802, 2802, 2805, 2794, 2808, 2810, 2807, 2805, 2811, + 2811, 2806, 2807, 2807, 2813, 2813, 2804, 2808, 2814, 2814, + 2815, 2816, 2817, 2815, 2819, 2819, 2810, 2820, 2822, 2823, + 2823, 2824, 2824, 2828, 2816, 2817, 2825, 2825, 2826, 2827, + 2827, 2829, 2830, 2831, 2840, 2820, 2828, 2837, 2822, 2831, + + 2832, 2832, 2837, 2826, 2833, 2836, 2830, 2839, 2833, 2829, + 2841, 2836, 2839, 2839, 2842, 2843, 2844, 2840, 2845, 2846, + 2852, 2843, 2844, 2846, 2847, 2847, 2850, 2855, 2852, 2853, + 2841, 2850, 2853, 2856, 2842, 2859, 2856, 2857, 2857, 2858, + 2859, 2860, 2861, 2845, 2862, 2863, 2863, 2864, 2867, 2869, + 2866, 2871, 2855, 2911, 2869, 2869, 2858, 2858, 2862, 2860, + 2865, 2864, 2861, 2865, 2866, 2868, 2880, 2867, 2911, 2870, + 2871, 2865, 2877, 2868, 2870, 2870, 2872, 2872, 2873, 2873, + 2874, 2874, 2875, 2875, 2876, 2876, 2878, 2879, 2877, 2881, + 2882, 2878, 2880, 2883, 2884, 2882, 2885, 2886, 2887, 2884, + + 2889, 2889, 2892, 2881, 2895, 2885, 0, 2879, 2890, 2890, + 2891, 2895, 2883, 2891, 2894, 2894, 2905, 2886, 2887, 2897, + 2892, 2896, 2896, 2900, 2897, 2899, 2899, 2901, 2902, 2903, + 2906, 2906, 2900, 2908, 2905, 2907, 2901, 2902, 2903, 2907, + 2909, 2910, 2908, 2912, 2913, 2914, 2915, 2924, 2912, 2912, + 2915, 2919, 2910, 2923, 2914, 2925, 2919, 2913, 2929, 2909, + 2920, 2920, 2922, 2922, 2927, 2927, 2928, 2923, 2932, 2933, + 2929, 2934, 2924, 2925, 2933, 2928, 2936, 2937, 2939, 2941, + 2934, 2943, 2944, 2937, 2945, 2945, 2943, 2944, 2946, 2948, + 2939, 2949, 2950, 2932, 2948, 2957, 2936, 2946, 2951, 2951, + + 2941, 2958, 2951, 0, 2949, 2956, 2950, 2953, 2953, 2954, + 2954, 2955, 2955, 2959, 2956, 2957, 2961, 2965, 2959, 2962, + 2958, 2963, 2961, 2967, 2962, 2966, 2963, 2964, 2964, 2968, + 2969, 2971, 2970, 2978, 2968, 2965, 0, 2966, 2970, 2972, + 2972, 2974, 2975, 2979, 2967, 2974, 2976, 2975, 2969, 2977, + 2977, 2976, 2978, 2980, 2982, 2989, 2971, 2986, 2979, 2984, + 2984, 2988, 2987, 2990, 2989, 2988, 2991, 2993, 2980, 2992, + 2986, 2994, 2993, 2996, 2982, 2987, 2997, 2992, 2998, 2990, + 2995, 2995, 2996, 2999, 2999, 2991, 3000, 3003, 3003, 3004, + 3004, 2994, 3006, 3010, 2997, 3008, 3008, 3012, 3011, 3013, + + 3017, 3014, 3012, 3018, 2998, 3000, 3014, 3016, 3016, 3010, + 3019, 3020, 3018, 3006, 3011, 3013, 3019, 3021, 3023, 3023, + 3017, 3024, 3025, 3026, 3026, 3029, 3030, 3033, 3031, 3034, + 3034, 3036, 3030, 3031, 3020, 3024, 3021, 3035, 3035, 3037, + 3039, 3025, 3038, 3038, 3040, 3029, 3036, 3041, 3042, 3033, + 3043, 3039, 3044, 3040, 3042, 3045, 3046, 3046, 3047, 3037, + 3048, 3055, 3038, 3048, 3044, 3049, 3054, 3041, 3049, 3043, + 3050, 3050, 3060, 3047, 3056, 3045, 3057, 3057, 3054, 3058, + 3056, 3055, 3058, 3059, 3063, 3063, 3062, 3064, 3065, 3059, + 3060, 3062, 3064, 3066, 3067, 3068, 3068, 3070, 3071, 3066, + + 3072, 3073, 3074, 3074, 3075, 3076, 3077, 3065, 3081, 3070, + 3082, 3067, 3067, 3081, 3073, 3077, 3071, 3079, 3079, 3080, + 3080, 3076, 3083, 3075, 3082, 3072, 3088, 3083, 3084, 3084, + 3085, 3085, 3086, 3086, 3087, 3087, 3089, 3090, 3096, 3088, + 3091, 3093, 3093, 3090, 3098, 3091, 3099, 3101, 3100, 3102, + 3102, 3104, 3104, 3105, 3106, 3108, 3107, 3096, 3110, 3110, + 3111, 3111, 3089, 3109, 3114, 3113, 3098, 3100, 3099, 3101, + 3107, 3113, 3109, 3106, 3115, 3108, 3116, 3119, 3126, 3105, + 3124, 3116, 3120, 3120, 3114, 3122, 3122, 3123, 3127, 3125, + 3126, 3133, 3123, 3115, 3124, 3125, 3127, 3129, 3119, 3128, + + 3128, 3131, 3129, 3132, 3134, 3131, 3136, 3135, 3132, 3137, + 3140, 3133, 3135, 3139, 3141, 3137, 3142, 3144, 3136, 3151, + 0, 3139, 3145, 3146, 3134, 3147, 3148, 3150, 3153, 3140, + 3155, 3148, 3150, 3153, 3141, 3144, 3142, 3152, 3145, 3151, + 3146, 3146, 3156, 3152, 3157, 3156, 3147, 3160, 3160, 3162, + 3155, 3161, 3161, 3162, 3167, 3167, 3168, 3157, 3169, 3170, + 3170, 3168, 3172, 3172, 3173, 3173, 3177, 3173, 3174, 3174, + 3177, 3174, 3175, 3175, 3179, 3176, 3176, 3169, 3176, 3179, + 3180, 3181, 3181, 3182, 3183, 3186, 3187, 3188, 3190, 3180, + 3189, 3189, 3188, 3193, 3196, 3194, 3195, 3197, 3183, 3199, + + 3195, 3182, 3194, 3196, 3200, 3186, 3187, 3202, 3190, 3200, + 3201, 3201, 3197, 3203, 3203, 3206, 3202, 3199, 3193, 3204, + 3204, 3205, 3205, 3207, 3208, 3211, 3209, 3212, 3207, 3210, + 3206, 3209, 3209, 3208, 3213, 3210, 3208, 3216, 3214, 3215, + 3217, 3217, 3212, 3214, 3215, 3218, 3219, 3220, 3220, 3222, + 3211, 3218, 3219, 3221, 3221, 3213, 3216, 3223, 3226, 3226, + 3228, 3228, 3223, 3229, 3222, 3232, 3232, 3233, 3233, 3234, + 3234, 3241, 3229, 3235, 3235, 3237, 3237, 3238, 3238, 3239, + 3239, 3240, 3240, 3243, 3244, 3244, 3245, 3246, 3247, 3249, + 3249, 3250, 3243, 3251, 3251, 3245, 3252, 3241, 3264, 3246, + + 3253, 3258, 3254, 3255, 3255, 3256, 3256, 3262, 3247, 3263, + 3250, 3252, 3263, 3253, 3254, 3266, 3258, 3259, 3259, 3265, + 3265, 3269, 3270, 3268, 3264, 3262, 3268, 3269, 3272, 3271, + 3273, 3276, 3277, 3266, 3271, 3274, 3270, 3276, 3280, 3281, + 3284, 3277, 3280, 3294, 3293, 3296, 3294, 3272, 3273, 3293, + 3302, 3274, 3297, 3297, 3281, 3298, 3298, 3305, 3296, 3300, + 3300, 3303, 3307, 3304, 3309, 3316, 3284, 3304, 3310, 3311, + 3303, 3313, 3315, 3302, 3311, 3317, 3307, 3305, 3312, 3310, + 3312, 3314, 3314, 3318, 3316, 3315, 3313, 3309, 3319, 3320, + 3322, 3321, 3323, 3317, 3324, 3332, 3325, 3323, 3327, 3318, + + 3321, 3325, 3322, 3328, 3320, 3326, 3326, 3333, 3328, 3332, + 3334, 3334, 3335, 3319, 3340, 3324, 3336, 3336, 3327, 3337, + 3337, 3335, 3338, 3338, 3339, 3339, 3341, 3333, 3342, 3343, + 3344, 3342, 3345, 3340, 3343, 3344, 3346, 3347, 3348, 3350, + 3352, 3349, 3357, 3347, 3350, 3362, 3341, 3351, 3351, 3353, + 3353, 3346, 3348, 3349, 3355, 3355, 3356, 3345, 3358, 3358, + 3352, 3357, 3360, 3362, 3365, 3365, 3366, 3366, 3367, 3368, + 3371, 3356, 3369, 3370, 3372, 3373, 3367, 3360, 3369, 3370, + 3374, 3375, 3375, 3380, 3371, 3374, 3381, 3372, 3368, 3377, + 3377, 3383, 3384, 3386, 3373, 3387, 3384, 3388, 3389, 3390, + + 3387, 3391, 3392, 3393, 3380, 3383, 3381, 3392, 3393, 3394, + 3394, 3389, 3390, 3386, 3397, 3398, 3388, 3399, 3400, 3400, + 3391, 3401, 3402, 3403, 3403, 3404, 3401, 3405, 3402, 3407, + 3404, 3408, 3405, 3398, 3397, 3406, 3399, 3408, 3410, 3410, + 3406, 3411, 3412, 3412, 3415, 3414, 3411, 3416, 3407, 3414, + 3417, 3418, 3419, 3420, 3416, 3421, 3423, 3423, 3419, 3425, + 3425, 3427, 3426, 3415, 3428, 3429, 3427, 3430, 3421, 3417, + 3418, 3426, 3420, 3432, 3426, 3431, 3431, 3433, 3432, 3435, + 3430, 3436, 3436, 3428, 3429, 3437, 3438, 3438, 3439, 3439, + 3433, 3440, 3441, 3442, 3443, 3443, 3440, 3444, 3445, 3441, + + 3445, 3447, 3444, 3448, 3437, 3435, 3446, 3446, 3447, 3449, + 3448, 3450, 3442, 3451, 3453, 3453, 3450, 3454, 3456, 3457, + 3458, 3459, 3463, 3456, 3457, 3460, 3460, 3464, 3449, 3462, + 3462, 0, 3451, 3465, 3465, 3467, 3454, 3466, 3466, 3458, + 3459, 3463, 3467, 3469, 3469, 3471, 3464, 3470, 3470, 3473, + 3476, 3477, 3471, 3478, 3473, 3476, 3479, 3479, 3480, 3480, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3477, 0, 3478, 3484, 3484, 3484, 3484, 3484, 3484, 3484, + 3485, 3485, 3485, 3485, 3485, 3485, 3485, 3486, 3486, 3486, + 3486, 3486, 3486, 3486, 3487, 3487, 3487, 3487, 3487, 3487, + + 3487, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3489, 3489, + 3489, 3489, 3489, 3489, 3489, 3490, 3490, 3490, 3490, 3490, + 3490, 3490, 3492, 3492, 0, 3492, 3492, 3492, 3492, 3493, + 3493, 0, 0, 0, 3493, 3493, 3494, 3494, 0, 0, + 3494, 0, 3494, 3495, 0, 0, 0, 0, 0, 3495, + 3496, 3496, 0, 0, 0, 3496, 3496, 3497, 0, 0, + 0, 0, 0, 3497, 3498, 3498, 0, 3498, 3498, 3498, + 3498, 3499, 0, 0, 0, 0, 0, 3499, 3500, 3500, + 0, 0, 0, 3500, 3500, 3501, 3501, 0, 3501, 3501, + 3501, 3501, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + + 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, + 3483, 3483, 3483 } ; static yy_state_type yy_last_accepting_state; @@ -3208,7 +3308,7 @@ static void config_end_include(void) #define YY_NO_INPUT 1 #endif -#line 3210 "<stdout>" +#line 3310 "<stdout>" #define INITIAL 0 #define quotedstring 1 @@ -3426,7 +3526,7 @@ YY_DECL { #line 211 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -#line 3428 "<stdout>" +#line 3528 "<stdout>" while ( 1 ) /* loops until end-of-file is reached */ { @@ -3459,13 +3559,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 >= 3354 ) + if ( yy_current_state >= 3484 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 6547 ); + while ( yy_base[yy_current_state] != 6793 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -3610,82 +3710,82 @@ YY_RULE_SETUP case 24: YY_RULE_SETUP #line 238 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE) } +{ YDVAR(1, VAR_MAX_REUSE_TCP_QUERIES) } YY_BREAK case 25: YY_RULE_SETUP #line 239 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE_TIMEOUT) } +{ YDVAR(1, VAR_TCP_REUSE_TIMEOUT) } YY_BREAK case 26: YY_RULE_SETUP #line 240 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SSL_UPSTREAM) } +{ YDVAR(1, VAR_TCP_AUTH_QUERY_TIMEOUT) } YY_BREAK case 27: YY_RULE_SETUP #line 241 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SSL_UPSTREAM) } +{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE) } YY_BREAK case 28: YY_RULE_SETUP #line 242 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SSL_SERVICE_KEY) } +{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE_TIMEOUT) } YY_BREAK case 29: YY_RULE_SETUP #line 243 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SSL_SERVICE_KEY) } +{ YDVAR(1, VAR_SSL_UPSTREAM) } YY_BREAK case 30: YY_RULE_SETUP #line 244 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SSL_SERVICE_PEM) } +{ YDVAR(1, VAR_SSL_UPSTREAM) } YY_BREAK case 31: YY_RULE_SETUP #line 245 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SSL_SERVICE_PEM) } +{ YDVAR(1, VAR_SSL_SERVICE_KEY) } YY_BREAK case 32: YY_RULE_SETUP #line 246 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SSL_PORT) } +{ YDVAR(1, VAR_SSL_SERVICE_KEY) } YY_BREAK case 33: YY_RULE_SETUP #line 247 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SSL_PORT) } +{ YDVAR(1, VAR_SSL_SERVICE_PEM) } YY_BREAK case 34: YY_RULE_SETUP #line 248 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TLS_CERT_BUNDLE) } +{ YDVAR(1, VAR_SSL_SERVICE_PEM) } YY_BREAK case 35: YY_RULE_SETUP #line 249 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TLS_CERT_BUNDLE) } +{ YDVAR(1, VAR_SSL_PORT) } YY_BREAK case 36: YY_RULE_SETUP #line 250 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TLS_WIN_CERT) } +{ YDVAR(1, VAR_SSL_PORT) } YY_BREAK case 37: YY_RULE_SETUP #line 251 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) } +{ YDVAR(1, VAR_TLS_CERT_BUNDLE) } YY_BREAK case 38: YY_RULE_SETUP #line 252 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) } +{ YDVAR(1, VAR_TLS_CERT_BUNDLE) } YY_BREAK case 39: YY_RULE_SETUP #line 253 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) } +{ YDVAR(1, VAR_TLS_WIN_CERT) } YY_BREAK case 40: YY_RULE_SETUP @@ -3695,1419 +3795,1464 @@ YY_RULE_SETUP case 41: YY_RULE_SETUP #line 255 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TLS_SESSION_TICKET_KEYS) } +{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) } YY_BREAK case 42: YY_RULE_SETUP #line 256 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TLS_CIPHERS) } +{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) } YY_BREAK case 43: YY_RULE_SETUP #line 257 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TLS_CIPHERSUITES) } +{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) } YY_BREAK case 44: YY_RULE_SETUP #line 258 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TLS_USE_SNI) } +{ YDVAR(1, VAR_TLS_SESSION_TICKET_KEYS) } YY_BREAK case 45: YY_RULE_SETUP #line 259 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HTTPS_PORT) } +{ YDVAR(1, VAR_TLS_CIPHERS) } YY_BREAK case 46: YY_RULE_SETUP #line 260 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HTTP_ENDPOINT) } +{ YDVAR(1, VAR_TLS_CIPHERSUITES) } YY_BREAK case 47: YY_RULE_SETUP #line 261 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HTTP_MAX_STREAMS) } +{ YDVAR(1, VAR_TLS_USE_SNI) } YY_BREAK case 48: YY_RULE_SETUP #line 262 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HTTP_QUERY_BUFFER_SIZE) } +{ YDVAR(1, VAR_HTTPS_PORT) } YY_BREAK case 49: YY_RULE_SETUP #line 263 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HTTP_RESPONSE_BUFFER_SIZE) } +{ YDVAR(1, VAR_HTTP_ENDPOINT) } YY_BREAK case 50: YY_RULE_SETUP #line 264 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HTTP_NODELAY) } +{ YDVAR(1, VAR_HTTP_MAX_STREAMS) } YY_BREAK case 51: YY_RULE_SETUP #line 265 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HTTP_NOTLS_DOWNSTREAM) } +{ YDVAR(1, VAR_HTTP_QUERY_BUFFER_SIZE) } YY_BREAK case 52: YY_RULE_SETUP #line 266 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_USE_SYSTEMD) } +{ YDVAR(1, VAR_HTTP_RESPONSE_BUFFER_SIZE) } YY_BREAK case 53: YY_RULE_SETUP #line 267 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DO_DAEMONIZE) } +{ YDVAR(1, VAR_HTTP_NODELAY) } YY_BREAK case 54: YY_RULE_SETUP #line 268 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INTERFACE) } +{ YDVAR(1, VAR_HTTP_NOTLS_DOWNSTREAM) } YY_BREAK case 55: YY_RULE_SETUP #line 269 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INTERFACE) } +{ YDVAR(1, VAR_USE_SYSTEMD) } YY_BREAK case 56: YY_RULE_SETUP #line 270 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_OUTGOING_INTERFACE) } +{ YDVAR(1, VAR_DO_DAEMONIZE) } YY_BREAK case 57: YY_RULE_SETUP #line 271 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) } +{ YDVAR(1, VAR_INTERFACE) } YY_BREAK case 58: YY_RULE_SETUP #line 272 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SO_RCVBUF) } +{ YDVAR(1, VAR_INTERFACE) } YY_BREAK case 59: YY_RULE_SETUP #line 273 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SO_SNDBUF) } +{ YDVAR(1, VAR_OUTGOING_INTERFACE) } YY_BREAK case 60: YY_RULE_SETUP #line 274 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SO_REUSEPORT) } +{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) } YY_BREAK case 61: YY_RULE_SETUP #line 275 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IP_TRANSPARENT) } +{ YDVAR(1, VAR_SO_RCVBUF) } YY_BREAK case 62: YY_RULE_SETUP #line 276 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IP_FREEBIND) } +{ YDVAR(1, VAR_SO_SNDBUF) } YY_BREAK case 63: YY_RULE_SETUP #line 277 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IP_DSCP) } +{ YDVAR(1, VAR_SO_REUSEPORT) } YY_BREAK case 64: YY_RULE_SETUP #line 278 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CHROOT) } +{ YDVAR(1, VAR_IP_TRANSPARENT) } YY_BREAK case 65: YY_RULE_SETUP #line 279 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_USERNAME) } +{ YDVAR(1, VAR_IP_FREEBIND) } YY_BREAK case 66: YY_RULE_SETUP #line 280 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DIRECTORY) } +{ YDVAR(1, VAR_IP_DSCP) } YY_BREAK case 67: YY_RULE_SETUP #line 281 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOGFILE) } +{ YDVAR(1, VAR_CHROOT) } YY_BREAK case 68: YY_RULE_SETUP #line 282 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PIDFILE) } +{ YDVAR(1, VAR_USERNAME) } YY_BREAK case 69: YY_RULE_SETUP #line 283 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_ROOT_HINTS) } +{ YDVAR(1, VAR_DIRECTORY) } YY_BREAK case 70: YY_RULE_SETUP #line 284 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_STREAM_WAIT_SIZE) } +{ YDVAR(1, VAR_LOGFILE) } YY_BREAK case 71: YY_RULE_SETUP #line 285 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) } +{ YDVAR(1, VAR_PIDFILE) } YY_BREAK case 72: YY_RULE_SETUP #line 286 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MSG_BUFFER_SIZE) } +{ YDVAR(1, VAR_ROOT_HINTS) } YY_BREAK case 73: YY_RULE_SETUP #line 287 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MSG_CACHE_SIZE) } +{ YDVAR(1, VAR_STREAM_WAIT_SIZE) } YY_BREAK case 74: YY_RULE_SETUP #line 288 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MSG_CACHE_SLABS) } +{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) } YY_BREAK case 75: YY_RULE_SETUP #line 289 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RRSET_CACHE_SIZE) } +{ YDVAR(1, VAR_MSG_BUFFER_SIZE) } YY_BREAK case 76: YY_RULE_SETUP #line 290 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RRSET_CACHE_SLABS) } +{ YDVAR(1, VAR_MSG_CACHE_SIZE) } YY_BREAK case 77: YY_RULE_SETUP #line 291 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CACHE_MAX_TTL) } +{ YDVAR(1, VAR_MSG_CACHE_SLABS) } YY_BREAK case 78: YY_RULE_SETUP #line 292 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) } +{ YDVAR(1, VAR_RRSET_CACHE_SIZE) } YY_BREAK case 79: YY_RULE_SETUP #line 293 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CACHE_MIN_TTL) } +{ YDVAR(1, VAR_RRSET_CACHE_SLABS) } YY_BREAK case 80: YY_RULE_SETUP #line 294 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INFRA_HOST_TTL) } +{ YDVAR(1, VAR_CACHE_MAX_TTL) } YY_BREAK case 81: YY_RULE_SETUP #line 295 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INFRA_LAME_TTL) } +{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) } YY_BREAK case 82: YY_RULE_SETUP #line 296 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INFRA_CACHE_SLABS) } +{ YDVAR(1, VAR_CACHE_MIN_TTL) } YY_BREAK case 83: YY_RULE_SETUP #line 297 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) } +{ YDVAR(1, VAR_INFRA_HOST_TTL) } YY_BREAK case 84: YY_RULE_SETUP #line 298 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) } +{ YDVAR(1, VAR_INFRA_LAME_TTL) } YY_BREAK case 85: YY_RULE_SETUP #line 299 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) } +{ YDVAR(1, VAR_INFRA_CACHE_SLABS) } YY_BREAK case 86: YY_RULE_SETUP #line 300 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INFRA_KEEP_PROBING) } +{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) } YY_BREAK case 87: YY_RULE_SETUP #line 301 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) } +{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) } YY_BREAK case 88: YY_RULE_SETUP #line 302 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_JOSTLE_TIMEOUT) } +{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) } YY_BREAK case 89: YY_RULE_SETUP #line 303 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DELAY_CLOSE) } +{ YDVAR(1, VAR_INFRA_KEEP_PROBING) } YY_BREAK case 90: YY_RULE_SETUP #line 304 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_UDP_CONNECT) } +{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) } YY_BREAK case 91: YY_RULE_SETUP #line 305 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TARGET_FETCH_POLICY) } +{ YDVAR(1, VAR_JOSTLE_TIMEOUT) } YY_BREAK case 92: YY_RULE_SETUP #line 306 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) } +{ YDVAR(1, VAR_DELAY_CLOSE) } YY_BREAK case 93: YY_RULE_SETUP #line 307 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) } +{ YDVAR(1, VAR_UDP_CONNECT) } YY_BREAK case 94: YY_RULE_SETUP #line 308 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HARDEN_GLUE) } +{ YDVAR(1, VAR_TARGET_FETCH_POLICY) } YY_BREAK case 95: YY_RULE_SETUP #line 309 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) } +{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) } YY_BREAK case 96: YY_RULE_SETUP #line 310 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) } +{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) } YY_BREAK case 97: YY_RULE_SETUP #line 311 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) } +{ YDVAR(1, VAR_HARDEN_GLUE) } YY_BREAK case 98: YY_RULE_SETUP #line 312 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) } +{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) } YY_BREAK case 99: YY_RULE_SETUP #line 313 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_USE_CAPS_FOR_ID) } +{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) } YY_BREAK case 100: YY_RULE_SETUP #line 314 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CAPS_WHITELIST) } +{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) } YY_BREAK case 101: YY_RULE_SETUP #line 315 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CAPS_WHITELIST) } +{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) } YY_BREAK case 102: YY_RULE_SETUP #line 316 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) } +{ YDVAR(1, VAR_USE_CAPS_FOR_ID) } YY_BREAK case 103: YY_RULE_SETUP #line 317 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PRIVATE_ADDRESS) } +{ YDVAR(1, VAR_CAPS_WHITELIST) } YY_BREAK case 104: YY_RULE_SETUP #line 318 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PRIVATE_DOMAIN) } +{ YDVAR(1, VAR_CAPS_WHITELIST) } YY_BREAK case 105: YY_RULE_SETUP #line 319 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PREFETCH_KEY) } +{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) } YY_BREAK case 106: YY_RULE_SETUP #line 320 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PREFETCH) } +{ YDVAR(1, VAR_PRIVATE_ADDRESS) } YY_BREAK case 107: YY_RULE_SETUP #line 321 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DENY_ANY) } +{ YDVAR(1, VAR_PRIVATE_DOMAIN) } YY_BREAK case 108: YY_RULE_SETUP #line 322 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_STUB_ZONE) } +{ YDVAR(1, VAR_PREFETCH_KEY) } YY_BREAK case 109: YY_RULE_SETUP #line 323 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_NAME) } +{ YDVAR(1, VAR_PREFETCH) } YY_BREAK case 110: YY_RULE_SETUP #line 324 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_STUB_ADDR) } +{ YDVAR(1, VAR_DENY_ANY) } YY_BREAK case 111: YY_RULE_SETUP #line 325 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_STUB_HOST) } +{ YDVAR(0, VAR_STUB_ZONE) } YY_BREAK case 112: YY_RULE_SETUP #line 326 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_STUB_PRIME) } +{ YDVAR(1, VAR_NAME) } YY_BREAK case 113: YY_RULE_SETUP #line 327 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_STUB_FIRST) } +{ YDVAR(1, VAR_STUB_ADDR) } YY_BREAK case 114: YY_RULE_SETUP #line 328 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_STUB_NO_CACHE) } +{ YDVAR(1, VAR_STUB_HOST) } YY_BREAK case 115: YY_RULE_SETUP #line 329 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) } +{ YDVAR(1, VAR_STUB_PRIME) } YY_BREAK case 116: YY_RULE_SETUP #line 330 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) } +{ YDVAR(1, VAR_STUB_FIRST) } YY_BREAK case 117: YY_RULE_SETUP #line 331 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_FORWARD_ZONE) } +{ YDVAR(1, VAR_STUB_NO_CACHE) } YY_BREAK case 118: YY_RULE_SETUP #line 332 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FORWARD_ADDR) } +{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) } YY_BREAK case 119: YY_RULE_SETUP #line 333 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FORWARD_HOST) } +{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) } YY_BREAK case 120: YY_RULE_SETUP #line 334 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FORWARD_FIRST) } +{ YDVAR(0, VAR_FORWARD_ZONE) } YY_BREAK case 121: YY_RULE_SETUP #line 335 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FORWARD_NO_CACHE) } +{ YDVAR(1, VAR_FORWARD_ADDR) } YY_BREAK case 122: YY_RULE_SETUP #line 336 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) } +{ YDVAR(1, VAR_FORWARD_HOST) } YY_BREAK case 123: YY_RULE_SETUP #line 337 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) } +{ YDVAR(1, VAR_FORWARD_FIRST) } YY_BREAK case 124: YY_RULE_SETUP #line 338 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_AUTH_ZONE) } +{ YDVAR(1, VAR_FORWARD_NO_CACHE) } YY_BREAK case 125: YY_RULE_SETUP #line 339 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_RPZ) } +{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) } YY_BREAK case 126: YY_RULE_SETUP #line 340 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TAGS) } +{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) } YY_BREAK case 127: YY_RULE_SETUP #line 341 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RPZ_ACTION_OVERRIDE) } +{ YDVAR(0, VAR_AUTH_ZONE) } YY_BREAK case 128: YY_RULE_SETUP #line 342 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RPZ_CNAME_OVERRIDE) } +{ YDVAR(0, VAR_RPZ) } YY_BREAK case 129: YY_RULE_SETUP #line 343 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RPZ_LOG) } +{ YDVAR(1, VAR_TAGS) } YY_BREAK case 130: YY_RULE_SETUP #line 344 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RPZ_LOG_NAME) } +{ YDVAR(1, VAR_RPZ_ACTION_OVERRIDE) } YY_BREAK case 131: YY_RULE_SETUP #line 345 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_ZONEFILE) } +{ YDVAR(1, VAR_RPZ_CNAME_OVERRIDE) } YY_BREAK case 132: YY_RULE_SETUP #line 346 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MASTER) } +{ YDVAR(1, VAR_RPZ_LOG) } YY_BREAK case 133: YY_RULE_SETUP #line 347 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MASTER) } +{ YDVAR(1, VAR_RPZ_LOG_NAME) } YY_BREAK case 134: YY_RULE_SETUP #line 348 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_URL) } +{ YDVAR(1, VAR_ZONEFILE) } YY_BREAK case 135: YY_RULE_SETUP #line 349 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_ALLOW_NOTIFY) } +{ YDVAR(1, VAR_MASTER) } YY_BREAK case 136: YY_RULE_SETUP #line 350 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FOR_DOWNSTREAM) } +{ YDVAR(1, VAR_MASTER) } YY_BREAK case 137: YY_RULE_SETUP #line 351 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FOR_UPSTREAM) } +{ YDVAR(1, VAR_URL) } YY_BREAK case 138: YY_RULE_SETUP #line 352 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FALLBACK_ENABLED) } +{ YDVAR(1, VAR_ALLOW_NOTIFY) } YY_BREAK case 139: YY_RULE_SETUP #line 353 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_VIEW) } +{ YDVAR(1, VAR_FOR_DOWNSTREAM) } YY_BREAK case 140: YY_RULE_SETUP #line 354 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_VIEW_FIRST) } +{ YDVAR(1, VAR_FOR_UPSTREAM) } YY_BREAK case 141: YY_RULE_SETUP #line 355 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) } +{ YDVAR(1, VAR_FALLBACK_ENABLED) } YY_BREAK case 142: YY_RULE_SETUP #line 356 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) } +{ YDVAR(0, VAR_VIEW) } YY_BREAK case 143: YY_RULE_SETUP #line 357 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_ACCESS_CONTROL) } +{ YDVAR(1, VAR_VIEW_FIRST) } YY_BREAK case 144: YY_RULE_SETUP #line 358 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) } +{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) } YY_BREAK case 145: YY_RULE_SETUP #line 359 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) } +{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) } YY_BREAK case 146: YY_RULE_SETUP #line 360 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) } +{ YDVAR(2, VAR_ACCESS_CONTROL) } YY_BREAK case 147: YY_RULE_SETUP #line 361 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) } +{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) } YY_BREAK case 148: YY_RULE_SETUP #line 362 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) } +{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) } YY_BREAK case 149: YY_RULE_SETUP #line 363 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) } +{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) } YY_BREAK case 150: YY_RULE_SETUP #line 364 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) } +{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) } YY_BREAK case 151: YY_RULE_SETUP #line 365 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) } +{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) } YY_BREAK case 152: YY_RULE_SETUP #line 366 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) } +{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) } YY_BREAK case 153: YY_RULE_SETUP #line 367 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) } +{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) } YY_BREAK case 154: YY_RULE_SETUP #line 368 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HIDE_IDENTITY) } +{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) } YY_BREAK case 155: YY_RULE_SETUP #line 369 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HIDE_VERSION) } +{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) } YY_BREAK case 156: YY_RULE_SETUP #line 370 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) } +{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) } YY_BREAK case 157: YY_RULE_SETUP #line 371 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IDENTITY) } +{ YDVAR(1, VAR_HIDE_IDENTITY) } YY_BREAK case 158: YY_RULE_SETUP #line 372 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_VERSION) } +{ YDVAR(1, VAR_HIDE_VERSION) } YY_BREAK case 159: YY_RULE_SETUP #line 373 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MODULE_CONF) } +{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) } YY_BREAK case 160: YY_RULE_SETUP #line 374 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DLV_ANCHOR) } +{ YDVAR(1, VAR_HIDE_HTTP_USER_AGENT) } YY_BREAK case 161: YY_RULE_SETUP #line 375 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DLV_ANCHOR_FILE) } +{ YDVAR(1, VAR_IDENTITY) } YY_BREAK case 162: YY_RULE_SETUP #line 376 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) } +{ YDVAR(1, VAR_VERSION) } YY_BREAK case 163: YY_RULE_SETUP #line 377 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) } +{ YDVAR(1, VAR_HTTP_USER_AGENT) } YY_BREAK case 164: YY_RULE_SETUP #line 378 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) } +{ YDVAR(1, VAR_MODULE_CONF) } YY_BREAK case 165: YY_RULE_SETUP #line 379 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TRUST_ANCHOR) } +{ YDVAR(1, VAR_DLV_ANCHOR) } YY_BREAK case 166: YY_RULE_SETUP #line 380 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) } +{ YDVAR(1, VAR_DLV_ANCHOR_FILE) } YY_BREAK case 167: YY_RULE_SETUP #line 381 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) } +{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) } YY_BREAK case 168: YY_RULE_SETUP #line 382 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) } +{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) } YY_BREAK case 169: YY_RULE_SETUP #line 383 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) } +{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) } YY_BREAK case 170: YY_RULE_SETUP #line 384 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) } +{ YDVAR(1, VAR_TRUST_ANCHOR) } YY_BREAK case 171: YY_RULE_SETUP #line 385 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_BOGUS_TTL) } +{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) } YY_BREAK case 172: YY_RULE_SETUP #line 386 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) } +{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) } YY_BREAK case 173: YY_RULE_SETUP #line 387 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) } +{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) } YY_BREAK case 174: YY_RULE_SETUP #line 388 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_AGGRESSIVE_NSEC) } +{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) } YY_BREAK case 175: YY_RULE_SETUP #line 389 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IGNORE_CD_FLAG) } +{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) } YY_BREAK case 176: YY_RULE_SETUP #line 390 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_EXPIRED) } +{ YDVAR(1, VAR_VAL_MAX_RESTART) } YY_BREAK case 177: YY_RULE_SETUP #line 391 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) } +{ YDVAR(1, VAR_BOGUS_TTL) } YY_BREAK case 178: YY_RULE_SETUP #line 392 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) } +{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) } YY_BREAK case 179: YY_RULE_SETUP #line 393 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) } +{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) } YY_BREAK case 180: YY_RULE_SETUP #line 394 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) } +{ YDVAR(1, VAR_AGGRESSIVE_NSEC) } YY_BREAK case 181: YY_RULE_SETUP #line 395 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) } +{ YDVAR(1, VAR_IGNORE_CD_FLAG) } YY_BREAK case 182: YY_RULE_SETUP #line 396 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FAKE_DSA) } +{ YDVAR(1, VAR_SERVE_EXPIRED) } YY_BREAK case 183: YY_RULE_SETUP #line 397 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FAKE_SHA1) } +{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) } YY_BREAK case 184: YY_RULE_SETUP #line 398 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_VAL_LOG_LEVEL) } +{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) } YY_BREAK case 185: YY_RULE_SETUP #line 399 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_KEY_CACHE_SIZE) } +{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) } YY_BREAK case 186: YY_RULE_SETUP #line 400 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_KEY_CACHE_SLABS) } +{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) } YY_BREAK case 187: YY_RULE_SETUP #line 401 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_NEG_CACHE_SIZE) } +{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) } YY_BREAK case 188: YY_RULE_SETUP #line 402 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ - YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) } +{ YDVAR(1, VAR_FAKE_DSA) } YY_BREAK case 189: YY_RULE_SETUP -#line 404 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_ADD_HOLDDOWN) } +#line 403 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_FAKE_SHA1) } YY_BREAK case 190: YY_RULE_SETUP -#line 405 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DEL_HOLDDOWN) } +#line 404 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_VAL_LOG_LEVEL) } YY_BREAK case 191: YY_RULE_SETUP -#line 406 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_KEEP_MISSING) } +#line 405 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_KEY_CACHE_SIZE) } YY_BREAK case 192: YY_RULE_SETUP -#line 407 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) } +#line 406 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_KEY_CACHE_SLABS) } YY_BREAK case 193: YY_RULE_SETUP -#line 408 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_USE_SYSLOG) } +#line 407 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_NEG_CACHE_SIZE) } YY_BREAK case 194: YY_RULE_SETUP -#line 409 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOG_IDENTITY) } +#line 408 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ + YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) } YY_BREAK case 195: YY_RULE_SETUP #line 410 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOG_TIME_ASCII) } +{ YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) } YY_BREAK case 196: YY_RULE_SETUP #line 411 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOG_QUERIES) } +{ YDVAR(1, VAR_ZONEMD_CHECK) } YY_BREAK case 197: YY_RULE_SETUP #line 412 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOG_REPLIES) } +{ YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) } YY_BREAK case 198: YY_RULE_SETUP #line 413 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) } +{ YDVAR(1, VAR_ADD_HOLDDOWN) } YY_BREAK case 199: YY_RULE_SETUP #line 414 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) } +{ YDVAR(1, VAR_DEL_HOLDDOWN) } YY_BREAK case 200: YY_RULE_SETUP #line 415 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOG_SERVFAIL) } +{ YDVAR(1, VAR_KEEP_MISSING) } YY_BREAK case 201: YY_RULE_SETUP #line 416 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_LOCAL_ZONE) } +{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) } YY_BREAK case 202: YY_RULE_SETUP #line 417 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOCAL_DATA) } +{ YDVAR(1, VAR_USE_SYSLOG) } YY_BREAK case 203: YY_RULE_SETUP #line 418 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOCAL_DATA_PTR) } +{ YDVAR(1, VAR_LOG_IDENTITY) } YY_BREAK case 204: YY_RULE_SETUP #line 419 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) } +{ YDVAR(1, VAR_LOG_TIME_ASCII) } YY_BREAK case 205: YY_RULE_SETUP #line 420 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_INSECURE_LAN_ZONES) } +{ YDVAR(1, VAR_LOG_QUERIES) } YY_BREAK case 206: YY_RULE_SETUP #line 421 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_STATISTICS_INTERVAL) } +{ YDVAR(1, VAR_LOG_REPLIES) } YY_BREAK case 207: YY_RULE_SETUP #line 422 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) } +{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) } YY_BREAK case 208: YY_RULE_SETUP #line 423 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_EXTENDED_STATISTICS) } +{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) } YY_BREAK case 209: YY_RULE_SETUP #line 424 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SHM_ENABLE) } +{ YDVAR(1, VAR_LOG_SERVFAIL) } YY_BREAK case 210: YY_RULE_SETUP #line 425 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SHM_KEY) } +{ YDVAR(2, VAR_LOCAL_ZONE) } YY_BREAK case 211: YY_RULE_SETUP #line 426 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_REMOTE_CONTROL) } +{ YDVAR(1, VAR_LOCAL_DATA) } YY_BREAK case 212: YY_RULE_SETUP #line 427 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_ENABLE) } +{ YDVAR(1, VAR_LOCAL_DATA_PTR) } YY_BREAK case 213: YY_RULE_SETUP #line 428 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_INTERFACE) } +{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) } YY_BREAK case 214: YY_RULE_SETUP #line 429 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_PORT) } +{ YDVAR(1, VAR_INSECURE_LAN_ZONES) } YY_BREAK case 215: YY_RULE_SETUP #line 430 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_USE_CERT) } +{ YDVAR(1, VAR_STATISTICS_INTERVAL) } YY_BREAK case 216: YY_RULE_SETUP #line 431 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SERVER_KEY_FILE) } +{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) } YY_BREAK case 217: YY_RULE_SETUP #line 432 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_SERVER_CERT_FILE) } +{ YDVAR(1, VAR_EXTENDED_STATISTICS) } YY_BREAK case 218: YY_RULE_SETUP #line 433 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_KEY_FILE) } +{ YDVAR(1, VAR_SHM_ENABLE) } YY_BREAK case 219: YY_RULE_SETUP #line 434 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_CERT_FILE) } +{ YDVAR(1, VAR_SHM_KEY) } YY_BREAK case 220: YY_RULE_SETUP #line 435 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PYTHON_SCRIPT) } +{ YDVAR(0, VAR_REMOTE_CONTROL) } YY_BREAK case 221: YY_RULE_SETUP #line 436 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_PYTHON) } +{ YDVAR(1, VAR_CONTROL_ENABLE) } YY_BREAK case 222: YY_RULE_SETUP #line 437 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DYNLIB_FILE) } +{ YDVAR(1, VAR_CONTROL_INTERFACE) } YY_BREAK case 223: YY_RULE_SETUP #line 438 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_DYNLIB) } +{ YDVAR(1, VAR_CONTROL_PORT) } YY_BREAK case 224: YY_RULE_SETUP #line 439 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DOMAIN_INSECURE) } +{ YDVAR(1, VAR_CONTROL_USE_CERT) } YY_BREAK case 225: YY_RULE_SETUP #line 440 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MINIMAL_RESPONSES) } +{ YDVAR(1, VAR_SERVER_KEY_FILE) } YY_BREAK case 226: YY_RULE_SETUP #line 441 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RRSET_ROUNDROBIN) } +{ YDVAR(1, VAR_SERVER_CERT_FILE) } YY_BREAK case 227: YY_RULE_SETUP #line 442 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) } +{ YDVAR(1, VAR_CONTROL_KEY_FILE) } YY_BREAK case 228: YY_RULE_SETUP #line 443 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_MAX_UDP_SIZE) } +{ YDVAR(1, VAR_CONTROL_CERT_FILE) } YY_BREAK case 229: YY_RULE_SETUP #line 444 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_PREFIX) } +{ YDVAR(1, VAR_PYTHON_SCRIPT) } YY_BREAK case 230: YY_RULE_SETUP #line 445 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_SYNTHALL) } +{ YDVAR(0, VAR_PYTHON) } YY_BREAK case 231: YY_RULE_SETUP #line 446 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) } +{ YDVAR(1, VAR_DYNLIB_FILE) } YY_BREAK case 232: YY_RULE_SETUP #line 447 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DEFINE_TAG) } +{ YDVAR(0, VAR_DYNLIB) } YY_BREAK case 233: YY_RULE_SETUP #line 448 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_LOCAL_ZONE_TAG) } +{ YDVAR(1, VAR_DOMAIN_INSECURE) } YY_BREAK case 234: YY_RULE_SETUP #line 449 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) } +{ YDVAR(1, VAR_MINIMAL_RESPONSES) } YY_BREAK case 235: YY_RULE_SETUP #line 450 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) } +{ YDVAR(1, VAR_RRSET_ROUNDROBIN) } YY_BREAK case 236: YY_RULE_SETUP #line 451 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) } +{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) } YY_BREAK case 237: YY_RULE_SETUP #line 452 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) } +{ YDVAR(1, VAR_MAX_UDP_SIZE) } YY_BREAK case 238: YY_RULE_SETUP #line 453 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) } +{ YDVAR(1, VAR_DNS64_PREFIX) } YY_BREAK case 239: YY_RULE_SETUP #line 454 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_DNSTAP) } +{ YDVAR(1, VAR_DNS64_SYNTHALL) } YY_BREAK case 240: YY_RULE_SETUP #line 455 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_ENABLE) } +{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) } YY_BREAK case 241: YY_RULE_SETUP #line 456 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) } +{ YDVAR(1, VAR_DEFINE_TAG) } YY_BREAK case 242: YY_RULE_SETUP #line 457 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) } +{ YDVAR(2, VAR_LOCAL_ZONE_TAG) } YY_BREAK case 243: YY_RULE_SETUP #line 458 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_IP) } +{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) } YY_BREAK case 244: YY_RULE_SETUP #line 459 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS) } +{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) } YY_BREAK case 245: YY_RULE_SETUP #line 460 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) } +{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) } YY_BREAK case 246: YY_RULE_SETUP #line 461 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) } +{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) } YY_BREAK case 247: YY_RULE_SETUP #line 462 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) } +{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) } YY_BREAK case 248: YY_RULE_SETUP -#line 464 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) } +#line 463 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(0, VAR_DNSTAP) } YY_BREAK case 249: YY_RULE_SETUP -#line 466 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) } +#line 464 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_ENABLE) } YY_BREAK case 250: YY_RULE_SETUP -#line 467 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) } +#line 465 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) } YY_BREAK case 251: YY_RULE_SETUP -#line 468 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_IDENTITY) } +#line 466 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) } YY_BREAK case 252: YY_RULE_SETUP -#line 469 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_VERSION) } +#line 467 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_IP) } YY_BREAK case 253: YY_RULE_SETUP -#line 470 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) } +#line 468 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_TLS) } YY_BREAK case 254: YY_RULE_SETUP -#line 472 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) } +#line 469 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) } YY_BREAK case 255: YY_RULE_SETUP -#line 474 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) } +#line 470 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) } YY_BREAK case 256: YY_RULE_SETUP -#line 476 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 471 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) } + YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) } YY_BREAK case 257: YY_RULE_SETUP -#line 478 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 473 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) } + YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) } YY_BREAK case 258: YY_RULE_SETUP -#line 480 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) } +#line 475 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) } YY_BREAK case 259: YY_RULE_SETUP -#line 482 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) } +#line 476 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) } YY_BREAK case 260: YY_RULE_SETUP -#line 483 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT) } +#line 477 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_IDENTITY) } YY_BREAK case 261: YY_RULE_SETUP -#line 484 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT) } +#line 478 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_VERSION) } YY_BREAK case 262: YY_RULE_SETUP -#line 485 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) } +#line 479 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) } YY_BREAK case 263: YY_RULE_SETUP -#line 486 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_SLABS) } +#line 481 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) } YY_BREAK case 264: YY_RULE_SETUP -#line 487 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) } +#line 483 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) } YY_BREAK case 265: YY_RULE_SETUP -#line 488 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_SIZE) } +#line 485 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) } YY_BREAK case 266: YY_RULE_SETUP -#line 489 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) } +#line 487 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) } YY_BREAK case 267: YY_RULE_SETUP -#line 490 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) } +#line 489 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) } YY_BREAK case 268: YY_RULE_SETUP #line 491 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) } +{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) } YY_BREAK case 269: YY_RULE_SETUP #line 492 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_FACTOR) } +{ YDVAR(1, VAR_IP_RATELIMIT) } YY_BREAK case 270: YY_RULE_SETUP #line 493 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_LOW_RTT) } +{ YDVAR(1, VAR_RATELIMIT) } YY_BREAK case 271: YY_RULE_SETUP #line 494 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_NUM) } +{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) } YY_BREAK case 272: YY_RULE_SETUP #line 495 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } +{ YDVAR(1, VAR_RATELIMIT_SLABS) } YY_BREAK case 273: YY_RULE_SETUP #line 496 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } +{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) } YY_BREAK case 274: YY_RULE_SETUP #line 497 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } +{ YDVAR(1, VAR_RATELIMIT_SIZE) } YY_BREAK case 275: YY_RULE_SETUP #line 498 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP_TAG) } +{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) } YY_BREAK case 276: YY_RULE_SETUP #line 499 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP) } +{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) } YY_BREAK case 277: YY_RULE_SETUP #line 500 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP_DATA) } +{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) } YY_BREAK case 278: YY_RULE_SETUP #line 501 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_DNSCRYPT) } +{ YDVAR(1, VAR_RATELIMIT_FACTOR) } YY_BREAK case 279: YY_RULE_SETUP #line 502 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_ENABLE) } +{ YDVAR(1, VAR_LOW_RTT) } YY_BREAK case 280: YY_RULE_SETUP #line 503 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PORT) } +{ YDVAR(1, VAR_FAST_SERVER_NUM) } YY_BREAK case 281: YY_RULE_SETUP #line 504 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) } +{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } YY_BREAK case 282: YY_RULE_SETUP #line 505 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) } +{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } YY_BREAK case 283: YY_RULE_SETUP #line 506 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) } +{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } YY_BREAK case 284: YY_RULE_SETUP #line 507 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) } +{ YDVAR(2, VAR_RESPONSE_IP_TAG) } YY_BREAK case 285: YY_RULE_SETUP #line 508 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ - YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) } +{ YDVAR(2, VAR_RESPONSE_IP) } YY_BREAK case 286: YY_RULE_SETUP -#line 510 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ - YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) } +#line 509 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(2, VAR_RESPONSE_IP_DATA) } YY_BREAK case 287: YY_RULE_SETUP -#line 512 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) } +#line 510 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(0, VAR_DNSCRYPT) } YY_BREAK case 288: YY_RULE_SETUP -#line 513 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) } +#line 511 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSCRYPT_ENABLE) } YY_BREAK case 289: YY_RULE_SETUP -#line 514 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PAD_RESPONSES) } +#line 512 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSCRYPT_PORT) } YY_BREAK case 290: YY_RULE_SETUP -#line 515 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) } +#line 513 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) } YY_BREAK case 291: YY_RULE_SETUP -#line 516 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PAD_QUERIES) } +#line 514 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) } YY_BREAK case 292: YY_RULE_SETUP -#line 517 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) } +#line 515 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) } YY_BREAK case 293: YY_RULE_SETUP -#line 518 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_ENABLED) } +#line 516 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) } YY_BREAK case 294: YY_RULE_SETUP -#line 519 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) } +#line 517 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ + YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) } YY_BREAK case 295: YY_RULE_SETUP -#line 520 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_HOOK) } +#line 519 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ + YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) } YY_BREAK case 296: YY_RULE_SETUP #line 521 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) } +{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) } YY_BREAK case 297: YY_RULE_SETUP #line 522 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } +{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) } YY_BREAK case 298: YY_RULE_SETUP #line 523 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } +{ YDVAR(1, VAR_PAD_RESPONSES) } YY_BREAK case 299: YY_RULE_SETUP #line 524 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_STRICT) } +{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) } YY_BREAK case 300: YY_RULE_SETUP #line 525 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_CACHEDB) } +{ YDVAR(1, VAR_PAD_QUERIES) } YY_BREAK case 301: YY_RULE_SETUP #line 526 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_BACKEND) } +{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) } YY_BREAK case 302: YY_RULE_SETUP #line 527 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_SECRETSEED) } +{ YDVAR(1, VAR_IPSECMOD_ENABLED) } YY_BREAK case 303: YY_RULE_SETUP #line 528 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISHOST) } +{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) } YY_BREAK case 304: YY_RULE_SETUP #line 529 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISPORT) } +{ YDVAR(1, VAR_IPSECMOD_HOOK) } YY_BREAK case 305: YY_RULE_SETUP #line 530 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) } +{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) } YY_BREAK case 306: YY_RULE_SETUP #line 531 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) } +{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } YY_BREAK case 307: YY_RULE_SETUP #line 532 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(0, VAR_IPSET) } +{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } YY_BREAK case 308: YY_RULE_SETUP #line 533 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IPSET_NAME_V4) } +{ YDVAR(1, VAR_IPSECMOD_STRICT) } YY_BREAK case 309: YY_RULE_SETUP #line 534 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_IPSET_NAME_V6) } +{ YDVAR(0, VAR_CACHEDB) } YY_BREAK case 310: YY_RULE_SETUP #line 535 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) } +{ YDVAR(1, VAR_CACHEDB_BACKEND) } YY_BREAK case 311: YY_RULE_SETUP #line 536 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) } +{ YDVAR(1, VAR_CACHEDB_SECRETSEED) } YY_BREAK case 312: YY_RULE_SETUP #line 537 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(2, VAR_EDNS_CLIENT_STRING) } +{ YDVAR(1, VAR_CACHEDB_REDISHOST) } YY_BREAK case 313: YY_RULE_SETUP #line 538 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) } +{ YDVAR(1, VAR_CACHEDB_REDISPORT) } YY_BREAK case 314: YY_RULE_SETUP #line 539 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ YDVAR(1, VAR_NSID ) } +{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) } YY_BREAK case 315: -/* rule 315 can match eol */ YY_RULE_SETUP #line 540 "/usr/src/usr.sbin/unbound/util/configlexer.lex" -{ LEXOUT(("NL\n")); cfg_parser->line++; } +{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) } YY_BREAK -/* Quoted strings. Strip leading and ending quotes */ case 316: YY_RULE_SETUP +#line 541 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(0, VAR_IPSET) } + YY_BREAK +case 317: +YY_RULE_SETUP +#line 542 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_IPSET_NAME_V4) } + YY_BREAK +case 318: +YY_RULE_SETUP #line 543 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_IPSET_NAME_V6) } + YY_BREAK +case 319: +YY_RULE_SETUP +#line 544 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) } + YY_BREAK +case 320: +YY_RULE_SETUP +#line 545 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) } + YY_BREAK +case 321: +YY_RULE_SETUP +#line 546 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(2, VAR_EDNS_CLIENT_STRING) } + YY_BREAK +case 322: +YY_RULE_SETUP +#line 547 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) } + YY_BREAK +case 323: +YY_RULE_SETUP +#line 548 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ YDVAR(1, VAR_NSID ) } + YY_BREAK +case 324: +/* rule 324 can match eol */ +YY_RULE_SETUP +#line 549 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +{ LEXOUT(("NL\n")); cfg_parser->line++; } + YY_BREAK +/* Quoted strings. Strip leading and ending quotes */ +case 325: +YY_RULE_SETUP +#line 552 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { BEGIN(quotedstring); LEXOUT(("QS ")); } YY_BREAK case YY_STATE_EOF(quotedstring): -#line 544 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 553 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { yyerror("EOF inside quoted string"); if(--num_args == 0) { BEGIN(INITIAL); } else { BEGIN(val); } } YY_BREAK -case 317: +case 326: YY_RULE_SETUP -#line 549 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 558 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("STR(%s) ", yytext)); yymore(); } YY_BREAK -case 318: -/* rule 318 can match eol */ +case 327: +/* rule 327 can match eol */ YY_RULE_SETUP -#line 550 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 559 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { yyerror("newline inside quoted string, no end \""); cfg_parser->line++; BEGIN(INITIAL); } YY_BREAK -case 319: +case 328: YY_RULE_SETUP -#line 552 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 561 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("QE ")); if(--num_args == 0) { BEGIN(INITIAL); } @@ -5120,34 +5265,34 @@ YY_RULE_SETUP } YY_BREAK /* Single Quoted strings. Strip leading and ending quotes */ -case 320: +case 329: YY_RULE_SETUP -#line 564 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 573 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { BEGIN(singlequotedstr); LEXOUT(("SQS ")); } YY_BREAK case YY_STATE_EOF(singlequotedstr): -#line 565 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 574 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { yyerror("EOF inside quoted string"); if(--num_args == 0) { BEGIN(INITIAL); } else { BEGIN(val); } } YY_BREAK -case 321: +case 330: YY_RULE_SETUP -#line 570 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 579 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("STR(%s) ", yytext)); yymore(); } YY_BREAK -case 322: -/* rule 322 can match eol */ +case 331: +/* rule 331 can match eol */ YY_RULE_SETUP -#line 571 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 580 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { yyerror("newline inside quoted string, no end '"); cfg_parser->line++; BEGIN(INITIAL); } YY_BREAK -case 323: +case 332: YY_RULE_SETUP -#line 573 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 582 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("SQE ")); if(--num_args == 0) { BEGIN(INITIAL); } @@ -5160,38 +5305,38 @@ YY_RULE_SETUP } YY_BREAK /* include: directive */ -case 324: +case 333: YY_RULE_SETUP -#line 585 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 594 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); } YY_BREAK case YY_STATE_EOF(include): -#line 587 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 596 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { yyerror("EOF inside include directive"); BEGIN(inc_prev); } YY_BREAK -case 325: +case 334: YY_RULE_SETUP -#line 591 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 600 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("ISP ")); /* ignore */ } YY_BREAK -case 326: -/* rule 326 can match eol */ +case 335: +/* rule 335 can match eol */ YY_RULE_SETUP -#line 592 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 601 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++;} YY_BREAK -case 327: +case 336: YY_RULE_SETUP -#line 593 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 602 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("IQS ")); BEGIN(include_quoted); } YY_BREAK -case 328: +case 337: YY_RULE_SETUP -#line 594 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 603 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("Iunquotedstr(%s) ", yytext)); config_start_include_glob(yytext, 0); @@ -5199,27 +5344,27 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_quoted): -#line 599 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 608 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(inc_prev); } YY_BREAK -case 329: +case 338: YY_RULE_SETUP -#line 603 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 612 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("ISTR(%s) ", yytext)); yymore(); } YY_BREAK -case 330: -/* rule 330 can match eol */ +case 339: +/* rule 339 can match eol */ YY_RULE_SETUP -#line 604 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 613 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { yyerror("newline before \" in include name"); cfg_parser->line++; BEGIN(inc_prev); } YY_BREAK -case 331: +case 340: YY_RULE_SETUP -#line 606 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 615 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("IQE ")); yytext[yyleng - 1] = '\0'; @@ -5229,7 +5374,7 @@ YY_RULE_SETUP YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(val): -#line 612 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 621 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("LEXEOF ")); yy_set_bol(1); /* Set beginning of line, so "^" rules match. */ @@ -5244,39 +5389,39 @@ case YY_STATE_EOF(val): } YY_BREAK /* include-toplevel: directive */ -case 332: +case 341: YY_RULE_SETUP -#line 626 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 635 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include_toplevel); } YY_BREAK case YY_STATE_EOF(include_toplevel): -#line 629 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 638 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { yyerror("EOF inside include_toplevel directive"); BEGIN(inc_prev); } YY_BREAK -case 333: +case 342: YY_RULE_SETUP -#line 633 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 642 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("ITSP ")); /* ignore */ } YY_BREAK -case 334: -/* rule 334 can match eol */ +case 343: +/* rule 343 can match eol */ YY_RULE_SETUP -#line 634 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 643 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++; } YY_BREAK -case 335: +case 344: YY_RULE_SETUP -#line 635 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 644 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); } YY_BREAK -case 336: +case 345: YY_RULE_SETUP -#line 636 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 645 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("ITunquotedstr(%s) ", yytext)); config_start_include_glob(yytext, 1); @@ -5285,29 +5430,29 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_toplevel_quoted): -#line 642 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 651 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(inc_prev); } YY_BREAK -case 337: +case 346: YY_RULE_SETUP -#line 646 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 655 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("ITSTR(%s) ", yytext)); yymore(); } YY_BREAK -case 338: -/* rule 338 can match eol */ +case 347: +/* rule 347 can match eol */ YY_RULE_SETUP -#line 647 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 656 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { yyerror("newline before \" in include name"); cfg_parser->line++; BEGIN(inc_prev); } YY_BREAK -case 339: +case 348: YY_RULE_SETUP -#line 651 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 660 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("ITQE ")); yytext[yyleng - 1] = '\0'; @@ -5316,33 +5461,33 @@ YY_RULE_SETUP return (VAR_FORCE_TOPLEVEL); } YY_BREAK -case 340: +case 349: YY_RULE_SETUP -#line 659 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 668 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { LEXOUT(("unquotedstr(%s) ", yytext)); if(--num_args == 0) { BEGIN(INITIAL); } yylval.str = strdup(yytext); return STRING_ARG; } YY_BREAK -case 341: +case 350: YY_RULE_SETUP -#line 663 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 672 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { ub_c_error_msg("unknown keyword '%s'", yytext); } YY_BREAK -case 342: +case 351: YY_RULE_SETUP -#line 667 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 676 "/usr/src/usr.sbin/unbound/util/configlexer.lex" { ub_c_error_msg("stray '%s'", yytext); } YY_BREAK -case 343: +case 352: YY_RULE_SETUP -#line 671 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 680 "/usr/src/usr.sbin/unbound/util/configlexer.lex" ECHO; YY_BREAK -#line 5344 "<stdout>" +#line 5489 "<stdout>" case YY_END_OF_BUFFER: { @@ -5635,7 +5780,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 >= 3354 ) + if ( yy_current_state >= 3484 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -5663,11 +5808,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 >= 3354 ) + if ( yy_current_state >= 3484 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 3353); + yy_is_jam = (yy_current_state == 3483); return yy_is_jam ? 0 : yy_current_state; } @@ -6300,7 +6445,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 671 "/usr/src/usr.sbin/unbound/util/configlexer.lex" +#line 680 "/usr/src/usr.sbin/unbound/util/configlexer.lex" diff --git a/sbin/unwind/libunbound/util/configlexer.lex b/sbin/unwind/libunbound/util/configlexer.lex index bc4e92c7f11..dbfc17d499f 100644 --- a/sbin/unwind/libunbound/util/configlexer.lex +++ b/sbin/unwind/libunbound/util/configlexer.lex @@ -235,6 +235,9 @@ tcp-upstream{COLON} { YDVAR(1, VAR_TCP_UPSTREAM) } tcp-mss{COLON} { YDVAR(1, VAR_TCP_MSS) } outgoing-tcp-mss{COLON} { YDVAR(1, VAR_OUTGOING_TCP_MSS) } tcp-idle-timeout{COLON} { YDVAR(1, VAR_TCP_IDLE_TIMEOUT) } +max-reuse-tcp-queries{COLON} { YDVAR(1, VAR_MAX_REUSE_TCP_QUERIES) } +tcp-reuse-timeout{COLON} { YDVAR(1, VAR_TCP_REUSE_TIMEOUT) } +tcp-auth-query-timeout{COLON} { YDVAR(1, VAR_TCP_AUTH_QUERY_TIMEOUT) } edns-tcp-keepalive{COLON} { YDVAR(1, VAR_EDNS_TCP_KEEPALIVE) } edns-tcp-keepalive-timeout{COLON} { YDVAR(1, VAR_EDNS_TCP_KEEPALIVE_TIMEOUT) } ssl-upstream{COLON} { YDVAR(1, VAR_SSL_UPSTREAM) } @@ -368,8 +371,10 @@ max-ecs-tree-size-ipv6{COLON} { YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) } hide-identity{COLON} { YDVAR(1, VAR_HIDE_IDENTITY) } hide-version{COLON} { YDVAR(1, VAR_HIDE_VERSION) } hide-trustanchor{COLON} { YDVAR(1, VAR_HIDE_TRUSTANCHOR) } +hide-http-user-agent{COLON} { YDVAR(1, VAR_HIDE_HTTP_USER_AGENT) } identity{COLON} { YDVAR(1, VAR_IDENTITY) } version{COLON} { YDVAR(1, VAR_VERSION) } +http-user-agent{COLON} { YDVAR(1, VAR_HTTP_USER_AGENT) } module-config{COLON} { YDVAR(1, VAR_MODULE_CONF) } dlv-anchor{COLON} { YDVAR(1, VAR_DLV_ANCHOR) } dlv-anchor-file{COLON} { YDVAR(1, VAR_DLV_ANCHOR_FILE) } @@ -382,6 +387,7 @@ root-key-sentinel{COLON} { YDVAR(1, VAR_ROOT_KEY_SENTINEL) } val-override-date{COLON} { YDVAR(1, VAR_VAL_OVERRIDE_DATE) } val-sig-skew-min{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MIN) } val-sig-skew-max{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MAX) } +val-max-restart{COLON} { YDVAR(1, VAR_VAL_MAX_RESTART) } val-bogus-ttl{COLON} { YDVAR(1, VAR_BOGUS_TTL) } val-clean-additional{COLON} { YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) } val-permissive-mode{COLON} { YDVAR(1, VAR_VAL_PERMISSIVE_MODE) } @@ -401,6 +407,9 @@ key-cache-slabs{COLON} { YDVAR(1, VAR_KEY_CACHE_SLABS) } neg-cache-size{COLON} { YDVAR(1, VAR_NEG_CACHE_SIZE) } val-nsec3-keysize-iterations{COLON} { YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) } +zonemd-permissive-mode{COLON} { YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) } +zonemd-check{COLON} { YDVAR(1, VAR_ZONEMD_CHECK) } +zonemd-reject-absence{COLON} { YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) } add-holddown{COLON} { YDVAR(1, VAR_ADD_HOLDDOWN) } del-holddown{COLON} { YDVAR(1, VAR_DEL_HOLDDOWN) } keep-missing{COLON} { YDVAR(1, VAR_KEEP_MISSING) } diff --git a/sbin/unwind/libunbound/util/configparser.h b/sbin/unwind/libunbound/util/configparser.h index d9c4cbc6b1d..57603343d51 100644 --- a/sbin/unwind/libunbound/util/configparser.h +++ b/sbin/unwind/libunbound/util/configparser.h @@ -100,210 +100,219 @@ #define VAR_CONTROL_KEY_FILE 356 #define VAR_CONTROL_CERT_FILE 357 #define VAR_CONTROL_USE_CERT 358 -#define VAR_EXTENDED_STATISTICS 359 -#define VAR_LOCAL_DATA_PTR 360 -#define VAR_JOSTLE_TIMEOUT 361 -#define VAR_STUB_PRIME 362 -#define VAR_UNWANTED_REPLY_THRESHOLD 363 -#define VAR_LOG_TIME_ASCII 364 -#define VAR_DOMAIN_INSECURE 365 -#define VAR_PYTHON 366 -#define VAR_PYTHON_SCRIPT 367 -#define VAR_VAL_SIG_SKEW_MIN 368 -#define VAR_VAL_SIG_SKEW_MAX 369 -#define VAR_CACHE_MIN_TTL 370 -#define VAR_VAL_LOG_LEVEL 371 -#define VAR_AUTO_TRUST_ANCHOR_FILE 372 -#define VAR_KEEP_MISSING 373 -#define VAR_ADD_HOLDDOWN 374 -#define VAR_DEL_HOLDDOWN 375 -#define VAR_SO_RCVBUF 376 -#define VAR_EDNS_BUFFER_SIZE 377 -#define VAR_PREFETCH 378 -#define VAR_PREFETCH_KEY 379 -#define VAR_SO_SNDBUF 380 -#define VAR_SO_REUSEPORT 381 -#define VAR_HARDEN_BELOW_NXDOMAIN 382 -#define VAR_IGNORE_CD_FLAG 383 -#define VAR_LOG_QUERIES 384 -#define VAR_LOG_REPLIES 385 -#define VAR_LOG_LOCAL_ACTIONS 386 -#define VAR_TCP_UPSTREAM 387 -#define VAR_SSL_UPSTREAM 388 -#define VAR_SSL_SERVICE_KEY 389 -#define VAR_SSL_SERVICE_PEM 390 -#define VAR_SSL_PORT 391 -#define VAR_FORWARD_FIRST 392 -#define VAR_STUB_SSL_UPSTREAM 393 -#define VAR_FORWARD_SSL_UPSTREAM 394 -#define VAR_TLS_CERT_BUNDLE 395 -#define VAR_HTTPS_PORT 396 -#define VAR_HTTP_ENDPOINT 397 -#define VAR_HTTP_MAX_STREAMS 398 -#define VAR_HTTP_QUERY_BUFFER_SIZE 399 -#define VAR_HTTP_RESPONSE_BUFFER_SIZE 400 -#define VAR_HTTP_NODELAY 401 -#define VAR_HTTP_NOTLS_DOWNSTREAM 402 -#define VAR_STUB_FIRST 403 -#define VAR_MINIMAL_RESPONSES 404 -#define VAR_RRSET_ROUNDROBIN 405 -#define VAR_MAX_UDP_SIZE 406 -#define VAR_DELAY_CLOSE 407 -#define VAR_UDP_CONNECT 408 -#define VAR_UNBLOCK_LAN_ZONES 409 -#define VAR_INSECURE_LAN_ZONES 410 -#define VAR_INFRA_CACHE_MIN_RTT 411 -#define VAR_INFRA_KEEP_PROBING 412 -#define VAR_DNS64_PREFIX 413 -#define VAR_DNS64_SYNTHALL 414 -#define VAR_DNS64_IGNORE_AAAA 415 -#define VAR_DNSTAP 416 -#define VAR_DNSTAP_ENABLE 417 -#define VAR_DNSTAP_SOCKET_PATH 418 -#define VAR_DNSTAP_IP 419 -#define VAR_DNSTAP_TLS 420 -#define VAR_DNSTAP_TLS_SERVER_NAME 421 -#define VAR_DNSTAP_TLS_CERT_BUNDLE 422 -#define VAR_DNSTAP_TLS_CLIENT_KEY_FILE 423 -#define VAR_DNSTAP_TLS_CLIENT_CERT_FILE 424 -#define VAR_DNSTAP_SEND_IDENTITY 425 -#define VAR_DNSTAP_SEND_VERSION 426 -#define VAR_DNSTAP_BIDIRECTIONAL 427 -#define VAR_DNSTAP_IDENTITY 428 -#define VAR_DNSTAP_VERSION 429 -#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 430 -#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 431 -#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 432 -#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 433 -#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 434 -#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 435 -#define VAR_RESPONSE_IP_TAG 436 -#define VAR_RESPONSE_IP 437 -#define VAR_RESPONSE_IP_DATA 438 -#define VAR_HARDEN_ALGO_DOWNGRADE 439 -#define VAR_IP_TRANSPARENT 440 -#define VAR_IP_DSCP 441 -#define VAR_DISABLE_DNSSEC_LAME_CHECK 442 -#define VAR_IP_RATELIMIT 443 -#define VAR_IP_RATELIMIT_SLABS 444 -#define VAR_IP_RATELIMIT_SIZE 445 -#define VAR_RATELIMIT 446 -#define VAR_RATELIMIT_SLABS 447 -#define VAR_RATELIMIT_SIZE 448 -#define VAR_RATELIMIT_FOR_DOMAIN 449 -#define VAR_RATELIMIT_BELOW_DOMAIN 450 -#define VAR_IP_RATELIMIT_FACTOR 451 -#define VAR_RATELIMIT_FACTOR 452 -#define VAR_SEND_CLIENT_SUBNET 453 -#define VAR_CLIENT_SUBNET_ZONE 454 -#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 455 -#define VAR_CLIENT_SUBNET_OPCODE 456 -#define VAR_MAX_CLIENT_SUBNET_IPV4 457 -#define VAR_MAX_CLIENT_SUBNET_IPV6 458 -#define VAR_MIN_CLIENT_SUBNET_IPV4 459 -#define VAR_MIN_CLIENT_SUBNET_IPV6 460 -#define VAR_MAX_ECS_TREE_SIZE_IPV4 461 -#define VAR_MAX_ECS_TREE_SIZE_IPV6 462 -#define VAR_CAPS_WHITELIST 463 -#define VAR_CACHE_MAX_NEGATIVE_TTL 464 -#define VAR_PERMIT_SMALL_HOLDDOWN 465 -#define VAR_QNAME_MINIMISATION 466 -#define VAR_QNAME_MINIMISATION_STRICT 467 -#define VAR_IP_FREEBIND 468 -#define VAR_DEFINE_TAG 469 -#define VAR_LOCAL_ZONE_TAG 470 -#define VAR_ACCESS_CONTROL_TAG 471 -#define VAR_LOCAL_ZONE_OVERRIDE 472 -#define VAR_ACCESS_CONTROL_TAG_ACTION 473 -#define VAR_ACCESS_CONTROL_TAG_DATA 474 -#define VAR_VIEW 475 -#define VAR_ACCESS_CONTROL_VIEW 476 -#define VAR_VIEW_FIRST 477 -#define VAR_SERVE_EXPIRED 478 -#define VAR_SERVE_EXPIRED_TTL 479 -#define VAR_SERVE_EXPIRED_TTL_RESET 480 -#define VAR_SERVE_EXPIRED_REPLY_TTL 481 -#define VAR_SERVE_EXPIRED_CLIENT_TIMEOUT 482 -#define VAR_SERVE_ORIGINAL_TTL 483 -#define VAR_FAKE_DSA 484 -#define VAR_FAKE_SHA1 485 -#define VAR_LOG_IDENTITY 486 -#define VAR_HIDE_TRUSTANCHOR 487 -#define VAR_TRUST_ANCHOR_SIGNALING 488 -#define VAR_AGGRESSIVE_NSEC 489 -#define VAR_USE_SYSTEMD 490 -#define VAR_SHM_ENABLE 491 -#define VAR_SHM_KEY 492 -#define VAR_ROOT_KEY_SENTINEL 493 -#define VAR_DNSCRYPT 494 -#define VAR_DNSCRYPT_ENABLE 495 -#define VAR_DNSCRYPT_PORT 496 -#define VAR_DNSCRYPT_PROVIDER 497 -#define VAR_DNSCRYPT_SECRET_KEY 498 -#define VAR_DNSCRYPT_PROVIDER_CERT 499 -#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 500 -#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 501 -#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 502 -#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 503 -#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 504 -#define VAR_PAD_RESPONSES 505 -#define VAR_PAD_RESPONSES_BLOCK_SIZE 506 -#define VAR_PAD_QUERIES 507 -#define VAR_PAD_QUERIES_BLOCK_SIZE 508 -#define VAR_IPSECMOD_ENABLED 509 -#define VAR_IPSECMOD_HOOK 510 -#define VAR_IPSECMOD_IGNORE_BOGUS 511 -#define VAR_IPSECMOD_MAX_TTL 512 -#define VAR_IPSECMOD_WHITELIST 513 -#define VAR_IPSECMOD_STRICT 514 -#define VAR_CACHEDB 515 -#define VAR_CACHEDB_BACKEND 516 -#define VAR_CACHEDB_SECRETSEED 517 -#define VAR_CACHEDB_REDISHOST 518 -#define VAR_CACHEDB_REDISPORT 519 -#define VAR_CACHEDB_REDISTIMEOUT 520 -#define VAR_CACHEDB_REDISEXPIRERECORDS 521 -#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 522 -#define VAR_FOR_UPSTREAM 523 -#define VAR_AUTH_ZONE 524 -#define VAR_ZONEFILE 525 -#define VAR_MASTER 526 -#define VAR_URL 527 -#define VAR_FOR_DOWNSTREAM 528 -#define VAR_FALLBACK_ENABLED 529 -#define VAR_TLS_ADDITIONAL_PORT 530 -#define VAR_LOW_RTT 531 -#define VAR_LOW_RTT_PERMIL 532 -#define VAR_FAST_SERVER_PERMIL 533 -#define VAR_FAST_SERVER_NUM 534 -#define VAR_ALLOW_NOTIFY 535 -#define VAR_TLS_WIN_CERT 536 -#define VAR_TCP_CONNECTION_LIMIT 537 -#define VAR_FORWARD_NO_CACHE 538 -#define VAR_STUB_NO_CACHE 539 -#define VAR_LOG_SERVFAIL 540 -#define VAR_DENY_ANY 541 -#define VAR_UNKNOWN_SERVER_TIME_LIMIT 542 -#define VAR_LOG_TAG_QUERYREPLY 543 -#define VAR_STREAM_WAIT_SIZE 544 -#define VAR_TLS_CIPHERS 545 -#define VAR_TLS_CIPHERSUITES 546 -#define VAR_TLS_USE_SNI 547 -#define VAR_IPSET 548 -#define VAR_IPSET_NAME_V4 549 -#define VAR_IPSET_NAME_V6 550 -#define VAR_TLS_SESSION_TICKET_KEYS 551 -#define VAR_RPZ 552 -#define VAR_TAGS 553 -#define VAR_RPZ_ACTION_OVERRIDE 554 -#define VAR_RPZ_CNAME_OVERRIDE 555 -#define VAR_RPZ_LOG 556 -#define VAR_RPZ_LOG_NAME 557 -#define VAR_DYNLIB 558 -#define VAR_DYNLIB_FILE 559 -#define VAR_EDNS_CLIENT_STRING 560 -#define VAR_EDNS_CLIENT_STRING_OPCODE 561 -#define VAR_NSID 562 +#define VAR_TCP_REUSE_TIMEOUT 359 +#define VAR_MAX_REUSE_TCP_QUERIES 360 +#define VAR_EXTENDED_STATISTICS 361 +#define VAR_LOCAL_DATA_PTR 362 +#define VAR_JOSTLE_TIMEOUT 363 +#define VAR_STUB_PRIME 364 +#define VAR_UNWANTED_REPLY_THRESHOLD 365 +#define VAR_LOG_TIME_ASCII 366 +#define VAR_DOMAIN_INSECURE 367 +#define VAR_PYTHON 368 +#define VAR_PYTHON_SCRIPT 369 +#define VAR_VAL_SIG_SKEW_MIN 370 +#define VAR_VAL_SIG_SKEW_MAX 371 +#define VAR_VAL_MAX_RESTART 372 +#define VAR_CACHE_MIN_TTL 373 +#define VAR_VAL_LOG_LEVEL 374 +#define VAR_AUTO_TRUST_ANCHOR_FILE 375 +#define VAR_KEEP_MISSING 376 +#define VAR_ADD_HOLDDOWN 377 +#define VAR_DEL_HOLDDOWN 378 +#define VAR_SO_RCVBUF 379 +#define VAR_EDNS_BUFFER_SIZE 380 +#define VAR_PREFETCH 381 +#define VAR_PREFETCH_KEY 382 +#define VAR_SO_SNDBUF 383 +#define VAR_SO_REUSEPORT 384 +#define VAR_HARDEN_BELOW_NXDOMAIN 385 +#define VAR_IGNORE_CD_FLAG 386 +#define VAR_LOG_QUERIES 387 +#define VAR_LOG_REPLIES 388 +#define VAR_LOG_LOCAL_ACTIONS 389 +#define VAR_TCP_UPSTREAM 390 +#define VAR_SSL_UPSTREAM 391 +#define VAR_TCP_AUTH_QUERY_TIMEOUT 392 +#define VAR_SSL_SERVICE_KEY 393 +#define VAR_SSL_SERVICE_PEM 394 +#define VAR_SSL_PORT 395 +#define VAR_FORWARD_FIRST 396 +#define VAR_STUB_SSL_UPSTREAM 397 +#define VAR_FORWARD_SSL_UPSTREAM 398 +#define VAR_TLS_CERT_BUNDLE 399 +#define VAR_HTTPS_PORT 400 +#define VAR_HTTP_ENDPOINT 401 +#define VAR_HTTP_MAX_STREAMS 402 +#define VAR_HTTP_QUERY_BUFFER_SIZE 403 +#define VAR_HTTP_RESPONSE_BUFFER_SIZE 404 +#define VAR_HTTP_NODELAY 405 +#define VAR_HTTP_NOTLS_DOWNSTREAM 406 +#define VAR_STUB_FIRST 407 +#define VAR_MINIMAL_RESPONSES 408 +#define VAR_RRSET_ROUNDROBIN 409 +#define VAR_MAX_UDP_SIZE 410 +#define VAR_DELAY_CLOSE 411 +#define VAR_UDP_CONNECT 412 +#define VAR_UNBLOCK_LAN_ZONES 413 +#define VAR_INSECURE_LAN_ZONES 414 +#define VAR_INFRA_CACHE_MIN_RTT 415 +#define VAR_INFRA_KEEP_PROBING 416 +#define VAR_DNS64_PREFIX 417 +#define VAR_DNS64_SYNTHALL 418 +#define VAR_DNS64_IGNORE_AAAA 419 +#define VAR_DNSTAP 420 +#define VAR_DNSTAP_ENABLE 421 +#define VAR_DNSTAP_SOCKET_PATH 422 +#define VAR_DNSTAP_IP 423 +#define VAR_DNSTAP_TLS 424 +#define VAR_DNSTAP_TLS_SERVER_NAME 425 +#define VAR_DNSTAP_TLS_CERT_BUNDLE 426 +#define VAR_DNSTAP_TLS_CLIENT_KEY_FILE 427 +#define VAR_DNSTAP_TLS_CLIENT_CERT_FILE 428 +#define VAR_DNSTAP_SEND_IDENTITY 429 +#define VAR_DNSTAP_SEND_VERSION 430 +#define VAR_DNSTAP_BIDIRECTIONAL 431 +#define VAR_DNSTAP_IDENTITY 432 +#define VAR_DNSTAP_VERSION 433 +#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 434 +#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 435 +#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 436 +#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 437 +#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 438 +#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 439 +#define VAR_RESPONSE_IP_TAG 440 +#define VAR_RESPONSE_IP 441 +#define VAR_RESPONSE_IP_DATA 442 +#define VAR_HARDEN_ALGO_DOWNGRADE 443 +#define VAR_IP_TRANSPARENT 444 +#define VAR_IP_DSCP 445 +#define VAR_DISABLE_DNSSEC_LAME_CHECK 446 +#define VAR_IP_RATELIMIT 447 +#define VAR_IP_RATELIMIT_SLABS 448 +#define VAR_IP_RATELIMIT_SIZE 449 +#define VAR_RATELIMIT 450 +#define VAR_RATELIMIT_SLABS 451 +#define VAR_RATELIMIT_SIZE 452 +#define VAR_RATELIMIT_FOR_DOMAIN 453 +#define VAR_RATELIMIT_BELOW_DOMAIN 454 +#define VAR_IP_RATELIMIT_FACTOR 455 +#define VAR_RATELIMIT_FACTOR 456 +#define VAR_SEND_CLIENT_SUBNET 457 +#define VAR_CLIENT_SUBNET_ZONE 458 +#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 459 +#define VAR_CLIENT_SUBNET_OPCODE 460 +#define VAR_MAX_CLIENT_SUBNET_IPV4 461 +#define VAR_MAX_CLIENT_SUBNET_IPV6 462 +#define VAR_MIN_CLIENT_SUBNET_IPV4 463 +#define VAR_MIN_CLIENT_SUBNET_IPV6 464 +#define VAR_MAX_ECS_TREE_SIZE_IPV4 465 +#define VAR_MAX_ECS_TREE_SIZE_IPV6 466 +#define VAR_CAPS_WHITELIST 467 +#define VAR_CACHE_MAX_NEGATIVE_TTL 468 +#define VAR_PERMIT_SMALL_HOLDDOWN 469 +#define VAR_QNAME_MINIMISATION 470 +#define VAR_QNAME_MINIMISATION_STRICT 471 +#define VAR_IP_FREEBIND 472 +#define VAR_DEFINE_TAG 473 +#define VAR_LOCAL_ZONE_TAG 474 +#define VAR_ACCESS_CONTROL_TAG 475 +#define VAR_LOCAL_ZONE_OVERRIDE 476 +#define VAR_ACCESS_CONTROL_TAG_ACTION 477 +#define VAR_ACCESS_CONTROL_TAG_DATA 478 +#define VAR_VIEW 479 +#define VAR_ACCESS_CONTROL_VIEW 480 +#define VAR_VIEW_FIRST 481 +#define VAR_SERVE_EXPIRED 482 +#define VAR_SERVE_EXPIRED_TTL 483 +#define VAR_SERVE_EXPIRED_TTL_RESET 484 +#define VAR_SERVE_EXPIRED_REPLY_TTL 485 +#define VAR_SERVE_EXPIRED_CLIENT_TIMEOUT 486 +#define VAR_SERVE_ORIGINAL_TTL 487 +#define VAR_FAKE_DSA 488 +#define VAR_FAKE_SHA1 489 +#define VAR_LOG_IDENTITY 490 +#define VAR_HIDE_TRUSTANCHOR 491 +#define VAR_HIDE_HTTP_USER_AGENT 492 +#define VAR_HTTP_USER_AGENT 493 +#define VAR_TRUST_ANCHOR_SIGNALING 494 +#define VAR_AGGRESSIVE_NSEC 495 +#define VAR_USE_SYSTEMD 496 +#define VAR_SHM_ENABLE 497 +#define VAR_SHM_KEY 498 +#define VAR_ROOT_KEY_SENTINEL 499 +#define VAR_DNSCRYPT 500 +#define VAR_DNSCRYPT_ENABLE 501 +#define VAR_DNSCRYPT_PORT 502 +#define VAR_DNSCRYPT_PROVIDER 503 +#define VAR_DNSCRYPT_SECRET_KEY 504 +#define VAR_DNSCRYPT_PROVIDER_CERT 505 +#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 506 +#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 507 +#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 508 +#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 509 +#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 510 +#define VAR_PAD_RESPONSES 511 +#define VAR_PAD_RESPONSES_BLOCK_SIZE 512 +#define VAR_PAD_QUERIES 513 +#define VAR_PAD_QUERIES_BLOCK_SIZE 514 +#define VAR_IPSECMOD_ENABLED 515 +#define VAR_IPSECMOD_HOOK 516 +#define VAR_IPSECMOD_IGNORE_BOGUS 517 +#define VAR_IPSECMOD_MAX_TTL 518 +#define VAR_IPSECMOD_WHITELIST 519 +#define VAR_IPSECMOD_STRICT 520 +#define VAR_CACHEDB 521 +#define VAR_CACHEDB_BACKEND 522 +#define VAR_CACHEDB_SECRETSEED 523 +#define VAR_CACHEDB_REDISHOST 524 +#define VAR_CACHEDB_REDISPORT 525 +#define VAR_CACHEDB_REDISTIMEOUT 526 +#define VAR_CACHEDB_REDISEXPIRERECORDS 527 +#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 528 +#define VAR_FOR_UPSTREAM 529 +#define VAR_AUTH_ZONE 530 +#define VAR_ZONEFILE 531 +#define VAR_MASTER 532 +#define VAR_URL 533 +#define VAR_FOR_DOWNSTREAM 534 +#define VAR_FALLBACK_ENABLED 535 +#define VAR_TLS_ADDITIONAL_PORT 536 +#define VAR_LOW_RTT 537 +#define VAR_LOW_RTT_PERMIL 538 +#define VAR_FAST_SERVER_PERMIL 539 +#define VAR_FAST_SERVER_NUM 540 +#define VAR_ALLOW_NOTIFY 541 +#define VAR_TLS_WIN_CERT 542 +#define VAR_TCP_CONNECTION_LIMIT 543 +#define VAR_FORWARD_NO_CACHE 544 +#define VAR_STUB_NO_CACHE 545 +#define VAR_LOG_SERVFAIL 546 +#define VAR_DENY_ANY 547 +#define VAR_UNKNOWN_SERVER_TIME_LIMIT 548 +#define VAR_LOG_TAG_QUERYREPLY 549 +#define VAR_STREAM_WAIT_SIZE 550 +#define VAR_TLS_CIPHERS 551 +#define VAR_TLS_CIPHERSUITES 552 +#define VAR_TLS_USE_SNI 553 +#define VAR_IPSET 554 +#define VAR_IPSET_NAME_V4 555 +#define VAR_IPSET_NAME_V6 556 +#define VAR_TLS_SESSION_TICKET_KEYS 557 +#define VAR_RPZ 558 +#define VAR_TAGS 559 +#define VAR_RPZ_ACTION_OVERRIDE 560 +#define VAR_RPZ_CNAME_OVERRIDE 561 +#define VAR_RPZ_LOG 562 +#define VAR_RPZ_LOG_NAME 563 +#define VAR_DYNLIB 564 +#define VAR_DYNLIB_FILE 565 +#define VAR_EDNS_CLIENT_STRING 566 +#define VAR_EDNS_CLIENT_STRING_OPCODE 567 +#define VAR_NSID 568 +#define VAR_ZONEMD_PERMISSIVE_MODE 569 +#define VAR_ZONEMD_CHECK 570 +#define VAR_ZONEMD_REJECT_ABSENCE 571 #ifndef YYSTYPE_DEFINED #define YYSTYPE_DEFINED typedef union { diff --git a/sbin/unwind/libunbound/util/configparser.y b/sbin/unwind/libunbound/util/configparser.y index 272a9796939..e22d48d4105 100644 --- a/sbin/unwind/libunbound/util/configparser.y +++ b/sbin/unwind/libunbound/util/configparser.y @@ -100,17 +100,18 @@ extern struct config_parser_state* cfg_parser; %token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE %token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE %token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE -%token VAR_CONTROL_USE_CERT +%token VAR_CONTROL_USE_CERT VAR_TCP_REUSE_TIMEOUT VAR_MAX_REUSE_TCP_QUERIES %token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT %token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII %token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN -%token VAR_VAL_SIG_SKEW_MAX VAR_CACHE_MIN_TTL VAR_VAL_LOG_LEVEL -%token VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING VAR_ADD_HOLDDOWN -%token VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE VAR_PREFETCH -%token VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT VAR_HARDEN_BELOW_NXDOMAIN -%token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_LOG_REPLIES VAR_LOG_LOCAL_ACTIONS -%token VAR_TCP_UPSTREAM VAR_SSL_UPSTREAM -%token VAR_SSL_SERVICE_KEY VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST +%token VAR_VAL_SIG_SKEW_MAX VAR_VAL_MAX_RESTART VAR_CACHE_MIN_TTL +%token VAR_VAL_LOG_LEVEL VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING +%token VAR_ADD_HOLDDOWN VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE +%token VAR_PREFETCH VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT +%token VAR_HARDEN_BELOW_NXDOMAIN VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES +%token VAR_LOG_REPLIES VAR_LOG_LOCAL_ACTIONS VAR_TCP_UPSTREAM +%token VAR_SSL_UPSTREAM VAR_TCP_AUTH_QUERY_TIMEOUT VAR_SSL_SERVICE_KEY +%token VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST %token VAR_STUB_SSL_UPSTREAM VAR_FORWARD_SSL_UPSTREAM VAR_TLS_CERT_BUNDLE %token VAR_HTTPS_PORT VAR_HTTP_ENDPOINT VAR_HTTP_MAX_STREAMS %token VAR_HTTP_QUERY_BUFFER_SIZE VAR_HTTP_RESPONSE_BUFFER_SIZE @@ -153,6 +154,7 @@ extern struct config_parser_state* cfg_parser; %token VAR_SERVE_EXPIRED_TTL_RESET VAR_SERVE_EXPIRED_REPLY_TTL %token VAR_SERVE_EXPIRED_CLIENT_TIMEOUT VAR_SERVE_ORIGINAL_TTL VAR_FAKE_DSA %token VAR_FAKE_SHA1 VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR +%token VAR_HIDE_HTTP_USER_AGENT VAR_HTTP_USER_AGENT %token VAR_TRUST_ANCHOR_SIGNALING VAR_AGGRESSIVE_NSEC VAR_USE_SYSTEMD %token VAR_SHM_ENABLE VAR_SHM_KEY VAR_ROOT_KEY_SENTINEL %token VAR_DNSCRYPT VAR_DNSCRYPT_ENABLE VAR_DNSCRYPT_PORT VAR_DNSCRYPT_PROVIDER @@ -182,6 +184,7 @@ extern struct config_parser_state* cfg_parser; %token VAR_RPZ_CNAME_OVERRIDE VAR_RPZ_LOG VAR_RPZ_LOG_NAME %token VAR_DYNLIB VAR_DYNLIB_FILE VAR_EDNS_CLIENT_STRING %token VAR_EDNS_CLIENT_STRING_OPCODE VAR_NSID +%token VAR_ZONEMD_PERMISSIVE_MODE VAR_ZONEMD_CHECK VAR_ZONEMD_REJECT_ABSENCE %% toplevelvars: /* empty */ | toplevelvars toplevelvar ; @@ -223,6 +226,7 @@ content_server: server_num_threads | server_verbosity | server_port | server_harden_short_bufsize | server_harden_large_queries | server_do_not_query_address | server_hide_identity | server_hide_version | server_identity | server_version | + server_hide_http_user_agent | server_http_user_agent | server_harden_glue | server_module_conf | server_trust_anchor_file | server_trust_anchor | server_val_override_date | server_bogus_ttl | server_val_clean_additional | server_val_permissive_mode | @@ -242,8 +246,9 @@ content_server: server_num_threads | server_verbosity | server_port | server_local_data_ptr | server_jostle_timeout | server_unwanted_reply_threshold | server_log_time_ascii | server_domain_insecure | server_val_sig_skew_min | - server_val_sig_skew_max | server_cache_min_ttl | server_val_log_level | - server_auto_trust_anchor_file | server_add_holddown | + server_val_sig_skew_max | server_val_max_restart | + server_cache_min_ttl | server_val_log_level | + server_auto_trust_anchor_file | server_add_holddown | server_del_holddown | server_keep_missing | server_so_rcvbuf | server_edns_buffer_size | server_prefetch | server_prefetch_key | server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag | @@ -299,7 +304,10 @@ content_server: server_num_threads | server_verbosity | server_port | server_stream_wait_size | server_tls_ciphers | server_tls_ciphersuites | server_tls_session_ticket_keys | server_tls_use_sni | server_edns_client_string | - server_edns_client_string_opcode | server_nsid + 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 + ; stubstart: VAR_STUB_ZONE { @@ -366,6 +374,8 @@ authstart: VAR_AUTH_ZONE s->for_downstream = 1; s->for_upstream = 1; s->fallback_enabled = 0; + s->zonemd_check = 0; + s->zonemd_reject_absence = 0; s->isrpz = 0; } else yyerror("out of memory"); @@ -375,7 +385,7 @@ contents_auth: contents_auth content_auth | ; content_auth: auth_name | auth_zonefile | auth_master | auth_url | auth_for_downstream | auth_for_upstream | auth_fallback_enabled | - auth_allow_notify + auth_allow_notify | auth_zonemd_check | auth_zonemd_reject_absence ; rpz_tag: VAR_TAGS STRING_ARG @@ -856,6 +866,39 @@ server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG free($2); } ; +server_max_reuse_tcp_queries: VAR_MAX_REUSE_TCP_QUERIES STRING_ARG + { + OUTYY(("P(server_max_reuse_tcp_queries:%s)\n", $2)); + if(atoi($2) == 0 && strcmp($2, "0") != 0) + yyerror("number expected"); + else if (atoi($2) < 1) + cfg_parser->cfg->max_reuse_tcp_queries = 0; + else cfg_parser->cfg->max_reuse_tcp_queries = atoi($2); + free($2); + } + ; +server_tcp_reuse_timeout: VAR_TCP_REUSE_TIMEOUT STRING_ARG + { + OUTYY(("P(server_tcp_reuse_timeout:%s)\n", $2)); + if(atoi($2) == 0 && strcmp($2, "0") != 0) + yyerror("number expected"); + else if (atoi($2) < 1) + cfg_parser->cfg->tcp_reuse_timeout = 0; + else cfg_parser->cfg->tcp_reuse_timeout = atoi($2); + free($2); + } + ; +server_tcp_auth_query_timeout: VAR_TCP_AUTH_QUERY_TIMEOUT STRING_ARG + { + OUTYY(("P(server_tcp_auth_query_timeout:%s)\n", $2)); + if(atoi($2) == 0 && strcmp($2, "0") != 0) + yyerror("number expected"); + else if (atoi($2) < 1) + cfg_parser->cfg->tcp_auth_query_timeout = 0; + else cfg_parser->cfg->tcp_auth_query_timeout = atoi($2); + free($2); + } + ; server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG { OUTYY(("P(server_tcp_keepalive:%s)\n", $2)); @@ -1296,6 +1339,15 @@ server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG free($2); } ; +server_hide_http_user_agent: VAR_HIDE_HTTP_USER_AGENT STRING_ARG + { + OUTYY(("P(server_hide_user_agent:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->hide_http_user_agent = (strcmp($2, "yes")==0); + free($2); + } + ; server_identity: VAR_IDENTITY STRING_ARG { OUTYY(("P(server_identity:%s)\n", $2)); @@ -1310,6 +1362,13 @@ server_version: VAR_VERSION STRING_ARG cfg_parser->cfg->version = $2; } ; +server_http_user_agent: VAR_HTTP_USER_AGENT STRING_ARG + { + OUTYY(("P(server_http_user_agent:%s)\n", $2)); + free(cfg_parser->cfg->http_user_agent); + cfg_parser->cfg->http_user_agent = $2; + } + ; server_nsid: VAR_NSID STRING_ARG { OUTYY(("P(server_nsid:%s)\n", $2)); @@ -1814,6 +1873,19 @@ server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG free($2); } ; +server_val_max_restart: VAR_VAL_MAX_RESTART STRING_ARG + { + OUTYY(("P(server_val_max_restart:%s)\n", $2)); + if(*$2 == '\0' || strcmp($2, "0") == 0) { + cfg_parser->cfg->val_max_restart = 0; + } else { + cfg_parser->cfg->val_max_restart = atoi($2); + if(!cfg_parser->cfg->val_max_restart) + yyerror("number expected"); + } + free($2); + } + ; server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG { OUTYY(("P(server_cache_max_ttl:%s)\n", $2)); @@ -1986,6 +2058,15 @@ server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG cfg_parser->cfg->val_nsec3_key_iterations = $2; } ; +server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG + { + OUTYY(("P(server_zonemd_permissive_mode:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->zonemd_permissive_mode = (strcmp($2, "yes")==0); + free($2); + } + ; server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG { OUTYY(("P(server_add_holddown:%s)\n", $2)); @@ -2741,6 +2822,26 @@ auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG yyerror("out of memory"); } ; +auth_zonemd_check: VAR_ZONEMD_CHECK STRING_ARG + { + OUTYY(("P(zonemd-check:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->auths->zonemd_check = + (strcmp($2, "yes")==0); + free($2); + } + ; +auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG + { + OUTYY(("P(zonemd-reject-absence:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->auths->zonemd_reject_absence = + (strcmp($2, "yes")==0); + free($2); + } + ; auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG { OUTYY(("P(for-downstream:%s)\n", $2)); @@ -2791,13 +2892,20 @@ view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG && strcmp($3, "always_transparent")!=0 && strcmp($3, "always_refuse")!=0 && strcmp($3, "always_nxdomain")!=0 + && strcmp($3, "always_nodata")!=0 + && strcmp($3, "always_deny")!=0 + && strcmp($3, "always_null")!=0 && strcmp($3, "noview")!=0 - && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0) { + && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0 + && strcmp($3, "inform_redirect") != 0 + && strcmp($3, "ipset") != 0) { yyerror("local-zone type: expected static, deny, " "refuse, redirect, transparent, " "typetransparent, inform, inform_deny, " - "always_transparent, always_refuse, " - "always_nxdomain, noview or nodefault"); + "inform_redirect, always_transparent, " + "always_refuse, always_nxdomain, " + "always_nodata, always_deny, always_null, " + "noview, nodefault or ipset"); free($2); free($3); } else if(strcmp($3, "nodefault")==0) { diff --git a/sbin/unwind/libunbound/util/data/dname.h b/sbin/unwind/libunbound/util/data/dname.h index e37c11822b3..cb0f6735d92 100644 --- a/sbin/unwind/libunbound/util/data/dname.h +++ b/sbin/unwind/libunbound/util/data/dname.h @@ -261,7 +261,7 @@ int dname_is_root(uint8_t* dname); * Snip off first label from a dname, returning the parent zone. * @param dname: from what to strip off. uncompressed wireformat. * @param len: length, adjusted to become less. - * @return stripped off, or "." if input was ".". + * return stripped off, or "." if input was ".". */ void dname_remove_label(uint8_t** dname, size_t* len); @@ -271,7 +271,7 @@ void dname_remove_label(uint8_t** dname, size_t* len); * @param len: length, adjusted to become less. * @param n: number of labels to strip off (from the left). * if 0, nothing happens. - * @return stripped off, or "." if input was ".". + * return stripped off, or "." if input was ".". */ void dname_remove_labels(uint8_t** dname, size_t* len, int n); diff --git a/sbin/unwind/libunbound/util/data/msgreply.c b/sbin/unwind/libunbound/util/data/msgreply.c index 4830b343f0f..00272fd1c64 100644 --- a/sbin/unwind/libunbound/util/data/msgreply.c +++ b/sbin/unwind/libunbound/util/data/msgreply.c @@ -329,7 +329,10 @@ parse_create_rrset(sldns_buffer* pkt, struct rrset_parse* pset, return 0; /* copy & decompress */ if(!parse_rr_copy(pkt, pset, *data)) { - if(!region) free(*data); + if(!region) { + free(*data); + *data = NULL; + } return 0; } return 1; @@ -394,8 +397,13 @@ parse_copy_decompress_rrset(sldns_buffer* pkt, struct msg_parse* msg, pk->rk.type = htons(pset->type); pk->rk.rrset_class = pset->rrset_class; /** read data part. */ - if(!parse_create_rrset(pkt, pset, &data, region)) + if(!parse_create_rrset(pkt, pset, &data, region)) { + if(!region) { + free(pk->rk.dname); + pk->rk.dname = NULL; + } return 0; + } pk->entry.data = (void*)data; pk->entry.key = (void*)pk; pk->entry.hash = pset->hash; @@ -825,9 +833,15 @@ log_dns_msg(const char* str, struct query_info* qinfo, struct reply_info* rep) /* not particularly fast but flexible, make wireformat and print */ sldns_buffer* buf = sldns_buffer_new(65535); struct regional* region = regional_create(); - if(!reply_info_encode(qinfo, rep, 0, rep->flags, buf, 0, + if(!(buf && region)) { + log_err("%s: log_dns_msg: out of memory", str); + sldns_buffer_free(buf); + regional_destroy(region); + return; + } + if(!reply_info_encode(qinfo, rep, 0, rep->flags, buf, 0, region, 65535, 1, 0)) { - log_info("%s: log_dns_msg: out of memory", str); + log_err("%s: log_dns_msg: out of memory", str); } else { char* s = sldns_wire2str_pkt(sldns_buffer_begin(buf), sldns_buffer_limit(buf)); diff --git a/sbin/unwind/libunbound/util/fptr_wlist.c b/sbin/unwind/libunbound/util/fptr_wlist.c index a9e9d3a0323..de6dbd02a37 100644 --- a/sbin/unwind/libunbound/util/fptr_wlist.c +++ b/sbin/unwind/libunbound/util/fptr_wlist.c @@ -196,8 +196,6 @@ int fptr_whitelist_pending_udp(comm_point_callback_type *fptr) { if(fptr == &serviced_udp_callback) return 1; - else if(fptr == &worker_handle_reply) return 1; - else if(fptr == &libworker_handle_reply) return 1; return 0; } @@ -205,8 +203,6 @@ int fptr_whitelist_pending_tcp(comm_point_callback_type *fptr) { if(fptr == &serviced_tcp_callback) return 1; - else if(fptr == &worker_handle_reply) return 1; - else if(fptr == &libworker_handle_reply) return 1; return 0; } @@ -583,6 +579,7 @@ int fptr_whitelist_mesh_cb(mesh_cb_func_type fptr) else if(fptr == &probe_answer_cb) return 1; else if(fptr == &auth_xfer_probe_lookup_callback) return 1; else if(fptr == &auth_xfer_transfer_lookup_callback) return 1; + else if(fptr == &auth_zonemd_dnskey_lookup_callback) return 1; return 0; } diff --git a/sbin/unwind/libunbound/util/iana_ports.inc b/sbin/unwind/libunbound/util/iana_ports.inc index 875851e6ac6..b93af015da6 100644 --- a/sbin/unwind/libunbound/util/iana_ports.inc +++ b/sbin/unwind/libunbound/util/iana_ports.inc @@ -118,7 +118,6 @@ 140, 141, 142, -143, 144, 145, 146, @@ -679,7 +678,6 @@ 990, 991, 992, -993, 995, 996, 997, @@ -4246,6 +4244,7 @@ 5504, 5505, 5506, +5540, 5553, 5554, 5555, @@ -4738,6 +4737,7 @@ 8006, 8007, 8008, +8017, 8019, 8020, 8021, @@ -5378,6 +5378,7 @@ 30999, 31016, 31029, +31337, 31416, 31457, 31620, diff --git a/sbin/unwind/libunbound/util/net_help.c b/sbin/unwind/libunbound/util/net_help.c index 3b5527adf43..06bc1f5dd7e 100644 --- a/sbin/unwind/libunbound/util/net_help.c +++ b/sbin/unwind/libunbound/util/net_help.c @@ -887,7 +887,7 @@ log_cert(unsigned level, const char* str, void* cert) } #endif /* HAVE_SSL */ -#if defined(HAVE_SSL) && defined(HAVE_NGHTTP2) +#if defined(HAVE_SSL) && defined(HAVE_NGHTTP2) && defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB) static int alpn_select_cb(SSL* ATTR_UNUSED(ssl), const unsigned char** out, unsigned char* outlen, const unsigned char* in, unsigned int inlen, void* ATTR_UNUSED(arg)) @@ -1609,5 +1609,4 @@ sock_close(int socket) { closesocket(socket); } - # endif /* USE_WINSOCK */ diff --git a/sbin/unwind/libunbound/util/net_help.h b/sbin/unwind/libunbound/util/net_help.h index 45b607a430d..79835270c47 100644 --- a/sbin/unwind/libunbound/util/net_help.h +++ b/sbin/unwind/libunbound/util/net_help.h @@ -42,6 +42,7 @@ #ifndef NET_HELP_H #define NET_HELP_H #include "util/log.h" +#include "util/random.h" struct sock_list; struct regional; struct config_strlist; @@ -76,8 +77,6 @@ struct config_strlist; /** timeout in milliseconds for UDP queries to auth servers. */ #define UDP_AUTH_QUERY_TIMEOUT 3000 -/** timeout in milliseconds for TCP queries to auth servers. */ -#define TCP_AUTH_QUERY_TIMEOUT 3000 /** Advertised version of EDNS capabilities */ #define EDNS_ADVERTISED_VERSION 0 /** Advertised size of EDNS capabilities */ @@ -94,6 +93,9 @@ extern uint16_t EDNS_ADVERTISED_SIZE; /** DNSKEY secure entry point, KSK flag */ #define DNSKEY_BIT_SEP 0x0001 +/** return a random 16-bit number given a random source */ +#define GET_RANDOM_ID(rnd) (((unsigned)ub_random(rnd)>>8) & 0xffff) + /** minimal responses when positive answer */ extern int MINIMAL_RESPONSES; diff --git a/sbin/unwind/libunbound/util/netevent.c b/sbin/unwind/libunbound/util/netevent.c index a2c0e6073e3..11c642a2bc3 100644 --- a/sbin/unwind/libunbound/util/netevent.c +++ b/sbin/unwind/libunbound/util/netevent.c @@ -51,6 +51,16 @@ #include "dnstap/dnstap.h" #include "dnscrypt/dnscrypt.h" #include "services/listen_dnsport.h" +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETDB_H +#include <netdb.h> +#endif + #ifdef HAVE_OPENSSL_SSL_H #include <openssl/ssl.h> #endif @@ -152,7 +162,7 @@ struct internal_signal { static struct comm_point* comm_point_create_tcp_handler( struct comm_base *base, struct comm_point* parent, size_t bufsize, struct sldns_buffer* spoolbuf, comm_point_callback_type* callback, - void* callback_arg); + void* callback_arg, struct unbound_socket* socket); /* -------- End of local definitions -------- */ @@ -289,6 +299,7 @@ udp_send_errno_needs_log(struct sockaddr* addr, socklen_t addrlen) # ifdef ENETDOWN case ENETDOWN: # endif + case EPERM: if(verbosity < VERB_ALGO) return 0; default: @@ -302,7 +313,7 @@ udp_send_errno_needs_log(struct sockaddr* addr, socklen_t addrlen) /* 'Cannot assign requested address' also when disconnected */ || (errno == EADDRNOTAVAIL) # endif - ) && verbosity < VERB_DETAIL) + ) && verbosity < VERB_ALGO) return 0; # ifdef EADDRINUSE /* If SO_REUSEADDR is set, we could try to connect to the same server @@ -408,7 +419,9 @@ static void p_ancil(const char* str, struct comm_reply* r) log_info("%s: unknown srctype %d", str, r->srctype); return; } + if(r->srctype == 6) { +#ifdef IPV6_PKTINFO char buf[1024]; if(inet_ntop(AF_INET6, &r->pktinfo.v6info.ipi6_addr, buf, (socklen_t)sizeof(buf)) == 0) { @@ -416,6 +429,7 @@ static void p_ancil(const char* str, struct comm_reply* r) } buf[sizeof(buf)-1]=0; log_info("%s: %s %d", str, buf, r->pktinfo.v6info.ipi6_ifindex); +#endif } else if(r->srctype == 4) { #ifdef IP_PKTINFO char buf1[1024], buf2[1024]; @@ -1200,7 +1214,7 @@ ssl_handshake(struct comm_point* c) int r; if(c->ssl_shake_state == comm_ssl_shake_hs_read) { /* read condition satisfied back to writing */ - comm_point_listen_for_rw(c, 1, 1); + comm_point_listen_for_rw(c, 0, 1); c->ssl_shake_state = comm_ssl_shake_none; return 1; } @@ -1257,7 +1271,11 @@ ssl_handshake(struct comm_point* c) if((SSL_get_verify_mode(c->ssl)&SSL_VERIFY_PEER)) { /* verification */ if(SSL_get_verify_result(c->ssl) == X509_V_OK) { +#ifdef HAVE_SSL_GET1_PEER_CERTIFICATE + X509* x = SSL_get1_peer_certificate(c->ssl); +#else X509* x = SSL_get_peer_certificate(c->ssl); +#endif if(!x) { log_addr(VERB_ALGO, "SSL connection failed: " "no certificate", @@ -1283,7 +1301,11 @@ ssl_handshake(struct comm_point* c) #endif X509_free(x); } else { +#ifdef HAVE_SSL_GET1_PEER_CERTIFICATE + X509* x = SSL_get1_peer_certificate(c->ssl); +#else X509* x = SSL_get_peer_certificate(c->ssl); +#endif if(x) { log_cert(VERB_ALGO, "peer certificate", x); X509_free(x); @@ -1300,6 +1322,7 @@ ssl_handshake(struct comm_point* c) c->repinfo.addrlen); } +#ifdef HAVE_SSL_GET0_ALPN_SELECTED /* check if http2 use is negotiated */ if(c->type == comm_http && c->h2_session) { const unsigned char *alpn; @@ -1311,13 +1334,14 @@ ssl_handshake(struct comm_point* c) c->use_h2 = 1; } } +#endif /* setup listen rw correctly */ if(c->tcp_is_reading) { if(c->ssl_shake_state != comm_ssl_shake_read) comm_point_listen_for_rw(c, 1, 0); } else { - comm_point_listen_for_rw(c, 1, 1); + comm_point_listen_for_rw(c, 0, 1); } c->ssl_shake_state = comm_ssl_shake_none; return 1; @@ -1348,7 +1372,9 @@ ssl_handle_read(struct comm_point* c) 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; @@ -1396,7 +1422,9 @@ ssl_handle_read(struct comm_point* c) 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; @@ -1489,7 +1517,9 @@ ssl_handle_write(struct comm_point* c) comm_point_listen_for_rw(c, 1, 0); return 1; /* wait for read condition */ } else if(want == SSL_ERROR_WANT_WRITE) { +#ifdef USE_WINSOCK ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE); +#endif return 1; /* write more later */ } else if(want == SSL_ERROR_SYSCALL) { #ifdef EPIPE @@ -1539,7 +1569,9 @@ ssl_handle_write(struct comm_point* c) comm_point_listen_for_rw(c, 1, 0); return 1; /* wait for read condition */ } else if(want == SSL_ERROR_WANT_WRITE) { +#ifdef USE_WINSOCK ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE); +#endif return 1; /* write more later */ } else if(want == SSL_ERROR_SYSCALL) { #ifdef EPIPE @@ -1620,6 +1652,10 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) 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 */ @@ -1648,6 +1684,16 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) } #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) @@ -1681,7 +1727,8 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) (int)sldns_buffer_limit(c->buffer)); } - log_assert(sldns_buffer_remaining(c->buffer) > 0); + 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"); r = recv(fd, (void*)sldns_buffer_current(c->buffer), sldns_buffer_remaining(c->buffer), 0); if(r == 0) { @@ -2197,6 +2244,8 @@ ssl_http_read_more(struct comm_point* c) log_crypto_err("could not SSL_read"); return 0; } + verbose(VERB_ALGO, "ssl http read more skip to %d + %d", + (int)sldns_buffer_position(c->buffer), (int)r); sldns_buffer_skip(c->buffer, (ssize_t)r); return 1; #else @@ -2233,6 +2282,8 @@ http_read_more(int fd, struct comm_point* c) &c->repinfo.addr, c->repinfo.addrlen); return 0; } + verbose(VERB_ALGO, "http read more skip to %d + %d", + (int)sldns_buffer_position(c->buffer), (int)r); sldns_buffer_skip(c->buffer, r); return 1; } @@ -2370,7 +2421,7 @@ http_process_chunk_header(struct comm_point* c) return 1; } -/** handle nonchunked data segment */ +/** handle nonchunked data segment, 0=fail, 1=wait */ static int http_nonchunk_segment(struct comm_point* c) { @@ -2379,7 +2430,7 @@ http_nonchunk_segment(struct comm_point* c) * we are looking to read tcp_byte_count more data * and then the transfer is done. */ size_t remainbufferlen; - size_t got_now = sldns_buffer_limit(c->buffer) - c->http_stored; + size_t got_now = sldns_buffer_limit(c->buffer); if(c->tcp_byte_count <= got_now) { /* done, this is the last data fragment */ c->http_stored = 0; @@ -2388,13 +2439,12 @@ http_nonchunk_segment(struct comm_point* c) (void)(*c->callback)(c, c->cb_arg, NETEVENT_DONE, NULL); return 1; } - c->tcp_byte_count -= got_now; /* if we have the buffer space, * read more data collected into the buffer */ remainbufferlen = sldns_buffer_capacity(c->buffer) - sldns_buffer_limit(c->buffer); - if(remainbufferlen >= c->tcp_byte_count || - remainbufferlen >= 2048) { + if(remainbufferlen+got_now >= c->tcp_byte_count || + remainbufferlen >= (c->ssl?16384:2048)) { size_t total = sldns_buffer_limit(c->buffer); sldns_buffer_clear(c->buffer); sldns_buffer_set_position(c->buffer, total); @@ -2404,6 +2454,7 @@ http_nonchunk_segment(struct comm_point* c) } /* call callback with this data amount, then * wait for more */ + c->tcp_byte_count -= got_now; c->http_stored = 0; sldns_buffer_set_position(c->buffer, 0); fptr_ok(fptr_whitelist_comm_point(c->callback)); @@ -2762,6 +2813,11 @@ comm_point_http_handle_read(int fd, struct comm_point* c) return 0; } + if(c->http_stored >= sldns_buffer_position(c->buffer)) { + /* read did not work but we wanted more data, there is + * no bytes to process now. */ + return 1; + } sldns_buffer_flip(c->buffer); /* if we are partway in a segment of data, position us at the point * where we left off previously */ @@ -3184,7 +3240,7 @@ 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) + 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)); @@ -3223,6 +3279,7 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer, c->inuse = 0; c->callback = callback; c->cb_arg = callback_arg; + c->socket = socket; evbits = UB_EV_READ | UB_EV_PERSIST; /* ub_event stuff */ c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, @@ -3244,7 +3301,7 @@ 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_callback_type* callback, void* callback_arg) + 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)); @@ -3283,6 +3340,7 @@ comm_point_create_udp_ancil(struct comm_base *base, int fd, #endif c->callback = callback; c->cb_arg = callback_arg; + c->socket = socket; evbits = UB_EV_READ | UB_EV_PERSIST; /* ub_event stuff */ c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, @@ -3305,7 +3363,7 @@ static struct comm_point* comm_point_create_tcp_handler(struct comm_base *base, struct comm_point* parent, size_t bufsize, struct sldns_buffer* spoolbuf, comm_point_callback_type* callback, - void* callback_arg) + void* callback_arg, struct unbound_socket* socket) { struct comm_point* c = (struct comm_point*)calloc(1, sizeof(struct comm_point)); @@ -3361,6 +3419,7 @@ comm_point_create_tcp_handler(struct comm_base *base, c->repinfo.c = c; c->callback = callback; c->cb_arg = callback_arg; + c->socket = socket; if(spoolbuf) { c->tcp_req_info = tcp_req_info_create(spoolbuf); if(!c->tcp_req_info) { @@ -3400,7 +3459,8 @@ static struct comm_point* comm_point_create_http_handler(struct comm_base *base, struct comm_point* parent, size_t bufsize, int harden_large_queries, uint32_t http_max_streams, char* http_endpoint, - comm_point_callback_type* callback, void* callback_arg) + 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)); @@ -3454,6 +3514,7 @@ comm_point_create_http_handler(struct comm_base *base, c->repinfo.c = c; c->callback = callback; c->cb_arg = callback_arg; + c->socket = socket; c->http_min_version = http_version_2; c->http2_stream_max_qbuffer_size = bufsize; @@ -3518,7 +3579,7 @@ 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) + 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)); @@ -3568,6 +3629,7 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num, #endif c->callback = NULL; c->cb_arg = NULL; + c->socket = socket; evbits = UB_EV_READ | UB_EV_PERSIST; /* ub_event stuff */ c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, @@ -3589,12 +3651,12 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num, port_type == listen_type_ssl || port_type == listen_type_tcp_dnscrypt) { c->tcp_handlers[i] = comm_point_create_tcp_handler(base, - c, bufsize, spoolbuf, callback, callback_arg); + c, bufsize, spoolbuf, callback, callback_arg, socket); } else if(port_type == listen_type_http) { c->tcp_handlers[i] = comm_point_create_http_handler( base, c, bufsize, harden_large_queries, http_max_streams, http_endpoint, - callback, callback_arg); + callback, callback_arg, socket); } else { log_err("could not create tcp handler, unknown listen " @@ -3895,11 +3957,13 @@ comm_point_close(struct comm_point* c) /* close fd after removing from event lists, or epoll.. is messed up */ if(c->fd != -1 && !c->do_not_close) { +#ifdef USE_WINSOCK if(c->type == comm_tcp || c->type == comm_http) { /* delete sticky events for the fd, it gets closed */ ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ); ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE); } +#endif verbose(VERB_ALGO, "close fd %d", c->fd); sock_close(c->fd); } @@ -3970,20 +4034,26 @@ comm_point_send_reply(struct comm_reply *repinfo) comm_point_send_udp_msg(repinfo->c, buffer, (struct sockaddr*)&repinfo->addr, repinfo->addrlen, 0); #ifdef USE_DNSTAP - if(repinfo->c->dtenv != NULL && - repinfo->c->dtenv->log_client_response_messages) - dt_msg_send_client_response(repinfo->c->dtenv, - &repinfo->addr, repinfo->c->type, repinfo->c->buffer); + /* + * 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); + } #endif } else { #ifdef USE_DNSTAP - if(repinfo->c->tcp_parent->dtenv != NULL && - repinfo->c->tcp_parent->dtenv->log_client_response_messages) - dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv, - &repinfo->addr, repinfo->c->type, - ( repinfo->c->tcp_req_info - ? repinfo->c->tcp_req_info->spool_buffer - : repinfo->c->buffer )); + /* + * sending src (client)/dst (local service) addresses over DNSTAP from TCP callback + */ + 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, + ( repinfo->c->tcp_req_info? repinfo->c->tcp_req_info->spool_buffer: repinfo->c->buffer )); + } #endif if(repinfo->c->tcp_req_info) { tcp_req_info_send_reply(repinfo->c->tcp_req_info); diff --git a/sbin/unwind/libunbound/util/netevent.h b/sbin/unwind/libunbound/util/netevent.h index 4a2aa1677c0..c79f99b3eb6 100644 --- a/sbin/unwind/libunbound/util/netevent.h +++ b/sbin/unwind/libunbound/util/netevent.h @@ -70,6 +70,7 @@ struct comm_point; struct comm_reply; struct tcl_list; struct ub_event_base; +struct unbound_socket; struct mesh_state; struct mesh_area; @@ -169,6 +170,8 @@ struct comm_point { /** if the event is added or not */ int event_added; + struct unbound_socket* socket; + /** file descriptor for communication point */ int fd; @@ -495,12 +498,13 @@ struct ub_event_base* comm_base_internal(struct comm_base* b); * @param buffer: shared buffer by UDP sockets from this thread. * @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. * @return: returns the allocated communication point. NULL on error. * 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, - comm_point_callback_type* callback, void* callback_arg); + comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket); /** * Create an UDP with ancillary data comm point. Calls malloc. @@ -511,12 +515,13 @@ struct comm_point* comm_point_create_udp(struct comm_base* base, * @param buffer: shared buffer by UDP sockets from this thread. * @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. * @return: returns the allocated communication point. NULL on error. * 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, - comm_point_callback_type* callback, void* callback_arg); + comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket); /** * Create a TCP listener comm point. Calls malloc. @@ -539,6 +544,7 @@ struct comm_point* comm_point_create_udp_ancil(struct comm_base* base, * to select handler type to use. * @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. * @return: returns the TCP listener commpoint. You can find the * TCP handlers in the array inside the listener commpoint. * returns NULL on error. @@ -550,7 +556,7 @@ struct comm_point* comm_point_create_tcp(struct comm_base* base, 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); + comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket); /** * Create an outgoing TCP commpoint. No file descriptor is opened, left at -1. diff --git a/sbin/unwind/libunbound/util/shm_side/shm_main.c b/sbin/unwind/libunbound/util/shm_side/shm_main.c index af8c5bcf370..51039abf3ed 100644 --- a/sbin/unwind/libunbound/util/shm_side/shm_main.c +++ b/sbin/unwind/libunbound/util/shm_side/shm_main.c @@ -130,6 +130,7 @@ int shm_main_init(struct daemon* daemon) /* Just release memory unused */ free(daemon->shm_info); + daemon->shm_info = NULL; return 0; } @@ -143,6 +144,7 @@ int shm_main_init(struct daemon* daemon) /* Just release memory unused */ free(daemon->shm_info); + daemon->shm_info = NULL; return 0; } @@ -156,6 +158,7 @@ int shm_main_init(struct daemon* daemon) /* Just release memory unused */ free(daemon->shm_info); + daemon->shm_info = NULL; return 0; } @@ -170,6 +173,7 @@ int shm_main_init(struct daemon* daemon) /* Just release memory unused */ free(daemon->shm_info); + daemon->shm_info = NULL; return 0; } @@ -210,6 +214,8 @@ void shm_main_shutdown(struct daemon* daemon) if (daemon->shm_info->ptr_arr) shmdt(daemon->shm_info->ptr_arr); + free(daemon->shm_info); + daemon->shm_info = NULL; #else (void)daemon; #endif /* HAVE_SHMGET */ diff --git a/sbin/unwind/libunbound/util/storage/lookup3.c b/sbin/unwind/libunbound/util/storage/lookup3.c index bb25eb433c9..c4026626c6d 100644 --- a/sbin/unwind/libunbound/util/storage/lookup3.c +++ b/sbin/unwind/libunbound/util/storage/lookup3.c @@ -53,21 +53,69 @@ on 1 byte), but shoehorning those bytes into integers efficiently is messy. #include "util/storage/lookup3.h" #include <stdio.h> /* defines printf for tests */ #include <time.h> /* defines time_t for timings in the test */ -/*#include <stdint.h> defines uint32_t etc (from config.h) */ -#include <sys/param.h> /* attempt to define endianness */ -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> /* attempt to define endianness (solaris) */ -#endif -#if defined(linux) || defined(__OpenBSD__) + +/* + * If our build system provides endianness info, signalled by + * HAVE_TARGET_ENDIANNESS and the presence or absence of TARGET_IS_BIG_ENDIAN, + * use that. Otherwise try to work out the endianness. + */ +#if defined(HAVE_TARGET_ENDIANNESS) +# if defined(TARGET_IS_BIG_ENDIAN) +# define HASH_LITTLE_ENDIAN 0 +# define HASH_BIG_ENDIAN 1 +# else +# define HASH_LITTLE_ENDIAN 1 +# define HASH_BIG_ENDIAN 0 +# endif +#else +# include <sys/param.h> /* attempt to define endianness */ +# ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> /* attempt to define endianness (solaris) */ +# endif +# if defined(linux) || defined(__OpenBSD__) # ifdef HAVE_ENDIAN_H # include <endian.h> /* attempt to define endianness */ # else # include <machine/endian.h> /* on older OpenBSD */ # endif -#endif -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) -#include <sys/endian.h> /* attempt to define endianness */ -#endif +# endif +# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) +# include <sys/endian.h> /* attempt to define endianness */ +# endif + /* + * My best guess at if you are big-endian or little-endian. This may + * need adjustment. + */ +# if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ + __BYTE_ORDER == __LITTLE_ENDIAN) || \ + (defined(i386) || defined(__i386__) || defined(__i486__) || \ + defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL) || defined(__x86)) +# define HASH_LITTLE_ENDIAN 1 +# define HASH_BIG_ENDIAN 0 +# elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \ + __BYTE_ORDER == __BIG_ENDIAN) || \ + (defined(sparc) || defined(__sparc) || defined(__sparc__) || defined(POWERPC) || defined(mc68000) || defined(sel)) +# define HASH_LITTLE_ENDIAN 0 +# define HASH_BIG_ENDIAN 1 +# elif defined(_MACHINE_ENDIAN_H_) + /* test for machine_endian_h protects failure if some are empty strings */ +# if defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && _BYTE_ORDER == _BIG_ENDIAN +# define HASH_LITTLE_ENDIAN 0 +# define HASH_BIG_ENDIAN 1 +# endif +# if defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && _BYTE_ORDER == _LITTLE_ENDIAN +# define HASH_LITTLE_ENDIAN 1 +# define HASH_BIG_ENDIAN 0 +# endif /* _MACHINE_ENDIAN_H_ */ +# else +# define HASH_LITTLE_ENDIAN 0 +# define HASH_BIG_ENDIAN 0 +# endif +#endif /* defined(HAVE_TARGET_ENDIANNESS) */ + +#define hashsize(n) ((uint32_t)1<<(n)) +#define hashmask(n) (hashsize(n)-1) +#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) /* random initial value */ static uint32_t raninit = (uint32_t)0xdeadbeef; @@ -79,40 +127,6 @@ hash_set_raninit(uint32_t v) } /* - * My best guess at if you are big-endian or little-endian. This may - * need adjustment. - */ -#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ - __BYTE_ORDER == __LITTLE_ENDIAN) || \ - (defined(i386) || defined(__i386__) || defined(__i486__) || \ - defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL) || defined(__x86)) -# define HASH_LITTLE_ENDIAN 1 -# define HASH_BIG_ENDIAN 0 -#elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \ - __BYTE_ORDER == __BIG_ENDIAN) || \ - (defined(sparc) || defined(__sparc) || defined(__sparc__) || defined(POWERPC) || defined(mc68000) || defined(sel)) -# define HASH_LITTLE_ENDIAN 0 -# define HASH_BIG_ENDIAN 1 -#elif defined(_MACHINE_ENDIAN_H_) -/* test for machine_endian_h protects failure if some are empty strings */ -# if defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && _BYTE_ORDER == _BIG_ENDIAN -# define HASH_LITTLE_ENDIAN 0 -# define HASH_BIG_ENDIAN 1 -# endif -# if defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && _BYTE_ORDER == _LITTLE_ENDIAN -# define HASH_LITTLE_ENDIAN 1 -# define HASH_BIG_ENDIAN 0 -# endif /* _MACHINE_ENDIAN_H_ */ -#else -# define HASH_LITTLE_ENDIAN 0 -# define HASH_BIG_ENDIAN 0 -#endif - -#define hashsize(n) ((uint32_t)1<<(n)) -#define hashmask(n) (hashsize(n)-1) -#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) - -/* ------------------------------------------------------------------------------- mix -- mix 3 32-bit values reversibly. diff --git a/sbin/unwind/libunbound/util/ub_event_pluggable.c b/sbin/unwind/libunbound/util/ub_event_pluggable.c index 235bba6ba79..4280d4db1a3 100644 --- a/sbin/unwind/libunbound/util/ub_event_pluggable.c +++ b/sbin/unwind/libunbound/util/ub_event_pluggable.c @@ -666,7 +666,8 @@ ub_winsock_tcp_wouldblock(struct ub_event* ev, int eventbits) fptr_ok(ev->vmt != &default_event_vmt || ev->vmt->winsock_tcp_wouldblock == my_winsock_tcp_wouldblock); - (*ev->vmt->winsock_tcp_wouldblock)(ev, eventbits); + if (ev->vmt->winsock_tcp_wouldblock) + (*ev->vmt->winsock_tcp_wouldblock)(ev, eventbits); } } diff --git a/sbin/unwind/libunbound/validator/autotrust.c b/sbin/unwind/libunbound/validator/autotrust.c index 7ce07e0d82d..9643a3ddb38 100644 --- a/sbin/unwind/libunbound/validator/autotrust.c +++ b/sbin/unwind/libunbound/validator/autotrust.c @@ -1077,6 +1077,17 @@ trustanchor_state2str(autr_state_type s) return " UNKNOWN "; } +/** ctime r for autotrust */ +static char* autr_ctime_r(time_t* t, char* s) +{ + ctime_r(t, s); +#ifdef USE_WINSOCK + if(strlen(s) > 10 && s[7]==' ' && s[8]=='0') + s[8]=' '; /* fix error in windows ctime */ +#endif + return s; +} + /** print ID to file */ static int print_id(FILE* out, char* fname, uint8_t* nm, size_t nmlen, uint16_t dclass) @@ -1123,13 +1134,13 @@ autr_write_contents(FILE* out, char* fn, struct trust_anchor* tp) } if(fprintf(out, ";;last_queried: %u ;;%s", (unsigned int)tp->autr->last_queried, - ctime_r(&(tp->autr->last_queried), tmi)) < 0 || + autr_ctime_r(&(tp->autr->last_queried), tmi)) < 0 || fprintf(out, ";;last_success: %u ;;%s", (unsigned int)tp->autr->last_success, - ctime_r(&(tp->autr->last_success), tmi)) < 0 || + autr_ctime_r(&(tp->autr->last_success), tmi)) < 0 || fprintf(out, ";;next_probe_time: %u ;;%s", (unsigned int)tp->autr->next_probe_time, - ctime_r(&(tp->autr->next_probe_time), tmi)) < 0 || + autr_ctime_r(&(tp->autr->next_probe_time), tmi)) < 0 || fprintf(out, ";;query_failed: %d\n", (int)tp->autr->query_failed)<0 || fprintf(out, ";;query_interval: %d\n", (int)tp->autr->query_interval) < 0 || @@ -1160,7 +1171,7 @@ autr_write_contents(FILE* out, char* fn, struct trust_anchor* tp) ";;lastchange=%u ;;%s", str, (int)ta->s, trustanchor_state2str(ta->s), (int)ta->pending_count, (unsigned int)ta->last_change, - ctime_r(&(ta->last_change), tmi)) < 0) { + autr_ctime_r(&(ta->last_change), tmi)) < 0) { log_err("could not write to %s: %s", fn, strerror(errno)); free(str); return 0; @@ -1579,6 +1590,7 @@ key_matches_a_ds(struct module_env* env, struct val_env* ve, for(ds_idx=0; ds_idx<num; ds_idx++) { if(!ds_digest_algo_is_supported(ds_rrset, ds_idx) || !ds_key_algo_is_supported(ds_rrset, ds_idx) || + !dnskey_size_is_supported(dnskey_rrset, key_idx) || ds_get_digest_algo(ds_rrset, ds_idx) != d) continue; if(ds_get_key_algo(ds_rrset, ds_idx) @@ -1633,7 +1645,8 @@ update_events(struct module_env* env, struct val_env* ve, } /* is a key of this type supported?. Note rr_list and * packed_rrset are in the same order. */ - if(!dnskey_algo_is_supported(dnskey_rrset, i)) { + if(!dnskey_algo_is_supported(dnskey_rrset, i) || + !dnskey_size_is_supported(dnskey_rrset, i)) { /* skip unknown algorithm key, it is useless to us */ log_nametypeclass(VERB_DETAIL, "trust point has " "unsupported algorithm at", @@ -2262,7 +2275,7 @@ autr_debug_print_ta(struct autr_ta* ta) return; } if(str[0]) str[strlen(str)-1]=0; /* remove newline */ - ctime_r(&ta->last_change, buf); + (void)autr_ctime_r(&ta->last_change, buf); if(buf[0]) buf[strlen(buf)-1]=0; /* remove newline */ log_info("[%s] %s ;;state:%d ;;pending_count:%d%s%s last:%s", trustanchor_state2str(ta->s), str, ta->s, ta->pending_count, @@ -2289,13 +2302,13 @@ autr_debug_print_tp(struct trust_anchor* tp) log_packed_rrset(NO_VERBOSE, "DNSKEY:", tp->dnskey_rrset); } log_info("file %s", tp->autr->file); - ctime_r(&tp->autr->last_queried, buf); + (void)autr_ctime_r(&tp->autr->last_queried, buf); if(buf[0]) buf[strlen(buf)-1]=0; /* remove newline */ log_info("last_queried: %u %s", (unsigned)tp->autr->last_queried, buf); - ctime_r(&tp->autr->last_success, buf); + (void)autr_ctime_r(&tp->autr->last_success, buf); if(buf[0]) buf[strlen(buf)-1]=0; /* remove newline */ log_info("last_success: %u %s", (unsigned)tp->autr->last_success, buf); - ctime_r(&tp->autr->next_probe_time, buf); + (void)autr_ctime_r(&tp->autr->next_probe_time, buf); if(buf[0]) buf[strlen(buf)-1]=0; /* remove newline */ log_info("next_probe_time: %u %s", (unsigned)tp->autr->next_probe_time, buf); diff --git a/sbin/unwind/libunbound/validator/val_anchor.c b/sbin/unwind/libunbound/validator/val_anchor.c index 9b6574c5d24..b1a54e1f019 100644 --- a/sbin/unwind/libunbound/validator/val_anchor.c +++ b/sbin/unwind/libunbound/validator/val_anchor.c @@ -971,7 +971,8 @@ anchors_dnskey_unsupported(struct trust_anchor* ta) { size_t i, num = 0; for(i=0; i<ta->numDNSKEY; i++) { - if(!dnskey_algo_is_supported(ta->dnskey_rrset, i)) + if(!dnskey_algo_is_supported(ta->dnskey_rrset, i) || + !dnskey_size_is_supported(ta->dnskey_rrset, i)) num++; } return num; @@ -1048,6 +1049,10 @@ anchors_apply_cfg(struct val_anchors* anchors, struct config_file* cfg) const char** zstr; char* nm; sldns_buffer* parsebuf = sldns_buffer_new(65535); + if(!parsebuf) { + log_err("malloc error in anchors_apply_cfg."); + return 0; + } if(cfg->insecure_lan_zones) { for(zstr = as112_zones; *zstr; zstr++) { if(!anchor_insert_insecure(anchors, *zstr)) { diff --git a/sbin/unwind/libunbound/validator/val_nsec.c b/sbin/unwind/libunbound/validator/val_nsec.c index 032d2ae03a4..a4e5b3137db 100644 --- a/sbin/unwind/libunbound/validator/val_nsec.c +++ b/sbin/unwind/libunbound/validator/val_nsec.c @@ -180,6 +180,7 @@ nsec_verify_rrset(struct module_env* env, struct val_env* ve, { struct packed_rrset_data* d = (struct packed_rrset_data*) nsec->entry.data; + if(!d) return 0; if(d->security == sec_status_secure) return 1; rrset_check_sec_status(env->rrset_cache, nsec, *env->now); diff --git a/sbin/unwind/libunbound/validator/val_secalgo.c b/sbin/unwind/libunbound/validator/val_secalgo.c index 15cccf017b4..7abf66f01d2 100644 --- a/sbin/unwind/libunbound/validator/val_secalgo.c +++ b/sbin/unwind/libunbound/validator/val_secalgo.c @@ -141,6 +141,69 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res) #endif } +/** hash structure for keeping track of running hashes */ +struct secalgo_hash { + /** the openssl message digest context */ + EVP_MD_CTX* ctx; +}; + +/** create secalgo hash with hash type */ +static struct secalgo_hash* secalgo_hash_create_md(const EVP_MD* md) +{ + struct secalgo_hash* h; + if(!md) + return NULL; + h = calloc(1, sizeof(*h)); + if(!h) + return NULL; + h->ctx = EVP_MD_CTX_create(); + if(!h->ctx) { + free(h); + return NULL; + } + if(!EVP_DigestInit_ex(h->ctx, md, NULL)) { + EVP_MD_CTX_destroy(h->ctx); + free(h); + return NULL; + } + return h; +} + +struct secalgo_hash* secalgo_hash_create_sha384(void) +{ + return secalgo_hash_create_md(EVP_sha384()); +} + +struct secalgo_hash* secalgo_hash_create_sha512(void) +{ + return secalgo_hash_create_md(EVP_sha512()); +} + +int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len) +{ + return EVP_DigestUpdate(hash->ctx, (unsigned char*)data, + (unsigned int)len); +} + +int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result, + size_t maxlen, size_t* resultlen) +{ + if(EVP_MD_CTX_size(hash->ctx) > (int)maxlen) { + *resultlen = 0; + log_err("secalgo_hash_final: hash buffer too small"); + return 0; + } + *resultlen = EVP_MD_CTX_size(hash->ctx); + return EVP_DigestFinal_ex(hash->ctx, result, NULL); +} + +void secalgo_hash_delete(struct secalgo_hash* hash) +{ + if(!hash) return; + EVP_MD_CTX_destroy(hash->ctx); + free(hash); +} + /** * Return size of DS digest according to its hash algorithm. * @param algo: DS digest algo. @@ -450,29 +513,13 @@ static int setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type, unsigned char* key, size_t keylen) { -#if defined(USE_DSA) && defined(USE_SHA1) - DSA* dsa; -#endif - RSA* rsa; - switch(algo) { #if defined(USE_DSA) && defined(USE_SHA1) case LDNS_DSA: case LDNS_DSA_NSEC3: - *evp_key = EVP_PKEY_new(); + *evp_key = sldns_key_dsa2pkey_raw(key, keylen); if(!*evp_key) { - log_err("verify: malloc failure in crypto"); - return 0; - } - dsa = sldns_key_buf2dsa_raw(key, keylen); - if(!dsa) { - verbose(VERB_QUERY, "verify: " - "sldns_key_buf2dsa_raw failed"); - return 0; - } - if(EVP_PKEY_assign_DSA(*evp_key, dsa) == 0) { - verbose(VERB_QUERY, "verify: " - "EVP_PKEY_assign_DSA failed"); + verbose(VERB_QUERY, "verify: sldns_key_dsa2pkey failed"); return 0; } #ifdef HAVE_EVP_DSS1 @@ -495,20 +542,9 @@ setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type, #if defined(HAVE_EVP_SHA512) && defined(USE_SHA2) case LDNS_RSASHA512: #endif - *evp_key = EVP_PKEY_new(); + *evp_key = sldns_key_rsa2pkey_raw(key, keylen); if(!*evp_key) { - log_err("verify: malloc failure in crypto"); - return 0; - } - rsa = sldns_key_buf2rsa_raw(key, keylen); - if(!rsa) { - verbose(VERB_QUERY, "verify: " - "sldns_key_buf2rsa_raw SHA failed"); - return 0; - } - if(EVP_PKEY_assign_RSA(*evp_key, rsa) == 0) { - verbose(VERB_QUERY, "verify: " - "EVP_PKEY_assign_RSA SHA failed"); + verbose(VERB_QUERY, "verify: sldns_key_rsa2pkey SHA failed"); return 0; } @@ -532,20 +568,9 @@ setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type, #endif /* defined(USE_SHA1) || (defined(HAVE_EVP_SHA256) && defined(USE_SHA2)) || (defined(HAVE_EVP_SHA512) && defined(USE_SHA2)) */ case LDNS_RSAMD5: - *evp_key = EVP_PKEY_new(); + *evp_key = sldns_key_rsa2pkey_raw(key, keylen); if(!*evp_key) { - log_err("verify: malloc failure in crypto"); - return 0; - } - rsa = sldns_key_buf2rsa_raw(key, keylen); - if(!rsa) { - verbose(VERB_QUERY, "verify: " - "sldns_key_buf2rsa_raw MD5 failed"); - return 0; - } - if(EVP_PKEY_assign_RSA(*evp_key, rsa) == 0) { - verbose(VERB_QUERY, "verify: " - "EVP_PKEY_assign_RSA MD5 failed"); + verbose(VERB_QUERY, "verify: sldns_key_rsa2pkey MD5 failed"); return 0; } *digest_type = EVP_md5(); @@ -823,6 +848,64 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res) (void)HASH_HashBuf(HASH_AlgSHA256, res, buf, (unsigned long)len); } +/** the secalgo hash structure */ +struct secalgo_hash { + /** hash context */ + HASHContext* ctx; +}; + +/** create hash struct of type */ +static struct secalgo_hash* secalgo_hash_create_type(HASH_HashType tp) +{ + struct secalgo_hash* h = calloc(1, sizeof(*h)); + if(!h) + return NULL; + h->ctx = HASH_Create(tp); + if(!h->ctx) { + free(h); + return NULL; + } + return h; +} + +struct secalgo_hash* secalgo_hash_create_sha384(void) +{ + return secalgo_hash_create_type(HASH_AlgSHA384); +} + +struct secalgo_hash* secalgo_hash_create_sha512(void) +{ + return secalgo_hash_create_type(HASH_AlgSHA512); +} + +int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len) +{ + HASH_Update(hash->ctx, (unsigned char*)data, (unsigned int)len); + return 1; +} + +int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result, + size_t maxlen, size_t* resultlen) +{ + unsigned int reslen = 0; + if(HASH_ResultLenContext(hash->ctx) > (unsigned int)maxlen) { + *resultlen = 0; + log_err("secalgo_hash_final: hash buffer too small"); + return 0; + } + HASH_End(hash->ctx, (unsigned char*)result, &reslen, + (unsigned int)maxlen); + *resultlen = (size_t)reslen; + return 1; +} + +void secalgo_hash_delete(struct secalgo_hash* hash) +{ + if(!hash) return; + HASH_Destroy(hash->ctx); + free(hash); +} + size_t ds_digest_size_supported(int algo) { @@ -1451,6 +1534,82 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res) _digest_nettle(SHA256_DIGEST_SIZE, (uint8_t*)buf, len, res); } +/** secalgo hash structure */ +struct secalgo_hash { + /** if it is 384 or 512 */ + int active; + /** context for sha384 */ + struct sha384_ctx ctx384; + /** context for sha512 */ + struct sha512_ctx ctx512; +}; + +struct secalgo_hash* secalgo_hash_create_sha384(void) +{ + struct secalgo_hash* h = calloc(1, sizeof(*h)); + if(!h) + return NULL; + h->active = 384; + sha384_init(&h->ctx384); + return h; +} + +struct secalgo_hash* secalgo_hash_create_sha512(void) +{ + struct secalgo_hash* h = calloc(1, sizeof(*h)); + if(!h) + return NULL; + h->active = 512; + sha512_init(&h->ctx512); + return h; +} + +int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len) +{ + if(hash->active == 384) { + sha384_update(&hash->ctx384, len, data); + } else if(hash->active == 512) { + sha512_update(&hash->ctx512, len, data); + } else { + return 0; + } + return 1; +} + +int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result, + size_t maxlen, size_t* resultlen) +{ + if(hash->active == 384) { + if(SHA384_DIGEST_SIZE > maxlen) { + *resultlen = 0; + log_err("secalgo_hash_final: hash buffer too small"); + return 0; + } + *resultlen = SHA384_DIGEST_SIZE; + sha384_digest(&hash->ctx384, SHA384_DIGEST_SIZE, + (unsigned char*)result); + } else if(hash->active == 512) { + if(SHA512_DIGEST_SIZE > maxlen) { + *resultlen = 0; + log_err("secalgo_hash_final: hash buffer too small"); + return 0; + } + *resultlen = SHA512_DIGEST_SIZE; + sha512_digest(&hash->ctx512, SHA512_DIGEST_SIZE, + (unsigned char*)result); + } else { + *resultlen = 0; + return 0; + } + return 1; +} + +void secalgo_hash_delete(struct secalgo_hash* hash) +{ + if(!hash) return; + free(hash); +} + /** * Return size of DS digest according to its hash algorithm. * @param algo: DS digest algo. diff --git a/sbin/unwind/libunbound/validator/val_secalgo.h b/sbin/unwind/libunbound/validator/val_secalgo.h index 52aaeb9f6d3..8b6080dc24a 100644 --- a/sbin/unwind/libunbound/validator/val_secalgo.h +++ b/sbin/unwind/libunbound/validator/val_secalgo.h @@ -43,6 +43,7 @@ #ifndef VALIDATOR_VAL_SECALGO_H #define VALIDATOR_VAL_SECALGO_H struct sldns_buffer; +struct secalgo_hash; /** Return size of nsec3 hash algorithm, 0 if not supported */ size_t nsec3_hash_algo_size_supported(int id); @@ -68,6 +69,48 @@ int secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len, void secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res); /** + * Start a hash of type sha384. Allocates structure, then inits it, + * so that a series of updates can be performed, before the final result. + * @return hash structure. NULL on malloc failure or no support. + */ +struct secalgo_hash* secalgo_hash_create_sha384(void); + +/** + * Start a hash of type sha512. Allocates structure, then inits it, + * so that a series of updates can be performed, before the final result. + * @return hash structure. NULL on malloc failure or no support. + */ +struct secalgo_hash* secalgo_hash_create_sha512(void); + +/** + * Update a hash with more information to add to it. + * @param hash: the hash that is updated. + * @param data: data to add. + * @param len: length of data. + * @return false on failure. + */ +int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len); + +/** + * Get the final result of the hash. + * @param hash: the hash that has had updates to it. + * @param result: where to store the result. + * @param maxlen: length of the result buffer, eg. size of the allocation. + * If not large enough the routine fails. + * @param resultlen: the length of the result, returned to the caller. + * How much of maxlen is used. + * @return false on failure. + */ +int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result, + size_t maxlen, size_t* resultlen); + +/** + * Delete the hash structure. + * @param hash: the hash to delete. + */ +void secalgo_hash_delete(struct secalgo_hash* hash); + +/** * Return size of DS digest according to its hash algorithm. * @param algo: DS digest algo. * @return size in bytes of digest, or 0 if not supported. diff --git a/sbin/unwind/libunbound/validator/val_sigcrypt.c b/sbin/unwind/libunbound/validator/val_sigcrypt.c index de730f68189..b15fba3f499 100644 --- a/sbin/unwind/libunbound/validator/val_sigcrypt.c +++ b/sbin/unwind/libunbound/validator/val_sigcrypt.c @@ -386,6 +386,49 @@ int dnskey_algo_is_supported(struct ub_packed_rrset_key* dnskey_rrset, dnskey_idx)); } +int dnskey_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset, + size_t dnskey_idx) +{ +#ifdef DEPRECATE_RSA_1024 + uint8_t* rdata; + size_t len; + int alg = dnskey_get_algo(dnskey_rrset, dnskey_idx); + size_t keysize; + + rrset_get_rdata(dnskey_rrset, dnskey_idx, &rdata, &len); + if(len < 2+4) + return 0; + keysize = sldns_rr_dnskey_key_size_raw(rdata+2+4, len-2-4, alg); + + switch((sldns_algorithm)alg) { + case LDNS_RSAMD5: + case LDNS_RSASHA1: + case LDNS_RSASHA1_NSEC3: + case LDNS_RSASHA256: + case LDNS_RSASHA512: + /* reject RSA keys of 1024 bits and shorter */ + if(keysize <= 1024) + return 0; + break; + default: + break; + } +#else + (void)dnskey_rrset; (void)dnskey_idx; +#endif /* DEPRECATE_RSA_1024 */ + return 1; +} + +int dnskeyset_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset) +{ + size_t i, num = rrset_get_count(dnskey_rrset); + for(i=0; i<num; i++) { + if(!dnskey_size_is_supported(dnskey_rrset, i)) + return 0; + } + return 1; +} + void algo_needs_init_dnskey_add(struct algo_needs* n, struct ub_packed_rrset_key* dnskey, uint8_t* sigalg) { @@ -1187,7 +1230,7 @@ rrset_canonical(struct regional* region, sldns_buffer* buf, * section, to prevent that a wildcard synthesized NSEC can be used in * the non-existence proves. */ if(ntohs(k->rk.type) == LDNS_RR_TYPE_NSEC && - section == LDNS_SECTION_AUTHORITY) { + section == LDNS_SECTION_AUTHORITY && qstate) { k->rk.dname = regional_alloc_init(qstate->region, can_owner, can_owner_len); if(!k->rk.dname) @@ -1199,6 +1242,59 @@ rrset_canonical(struct regional* region, sldns_buffer* buf, return 1; } +int +rrset_canonicalize_to_buffer(struct regional* region, sldns_buffer* buf, + struct ub_packed_rrset_key* k) +{ + struct rbtree_type* sortree = NULL; + struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data; + uint8_t* can_owner = NULL; + size_t can_owner_len = 0; + struct canon_rr* walk; + struct canon_rr* rrs; + + sortree = (struct rbtree_type*)regional_alloc(region, + sizeof(rbtree_type)); + if(!sortree) + return 0; + if(d->count > RR_COUNT_MAX) + return 0; /* integer overflow protection */ + rrs = regional_alloc(region, sizeof(struct canon_rr)*d->count); + if(!rrs) { + return 0; + } + rbtree_init(sortree, &canonical_tree_compare); + canonical_sort(k, d, sortree, rrs); + + sldns_buffer_clear(buf); + RBTREE_FOR(walk, struct canon_rr*, sortree) { + /* see if there is enough space left in the buffer */ + if(sldns_buffer_remaining(buf) < can_owner_len + 2 + 2 + 4 + + d->rr_len[walk->rr_idx]) { + log_err("verify: failed to canonicalize, " + "rrset too big"); + return 0; + } + /* determine canonical owner name */ + if(can_owner) + sldns_buffer_write(buf, can_owner, can_owner_len); + else { + can_owner = sldns_buffer_current(buf); + sldns_buffer_write(buf, k->rk.dname, k->rk.dname_len); + query_dname_tolower(can_owner); + can_owner_len = k->rk.dname_len; + } + sldns_buffer_write(buf, &k->rk.type, 2); + sldns_buffer_write(buf, &k->rk.rrset_class, 2); + sldns_buffer_write_u32(buf, d->rr_ttl[walk->rr_idx]); + sldns_buffer_write(buf, d->rr_data[walk->rr_idx], + d->rr_len[walk->rr_idx]); + canonicalize_rdata(buf, k, d->rr_len[walk->rr_idx]); + } + sldns_buffer_flip(buf); + return 1; +} + /** pretty print rrsig error with dates */ static void sigdate_error(const char* str, int32_t expi, int32_t incep, int32_t now) diff --git a/sbin/unwind/libunbound/validator/val_sigcrypt.h b/sbin/unwind/libunbound/validator/val_sigcrypt.h index 755a1d6e126..bbb95780d7f 100644 --- a/sbin/unwind/libunbound/validator/val_sigcrypt.h +++ b/sbin/unwind/libunbound/validator/val_sigcrypt.h @@ -180,6 +180,23 @@ uint16_t ds_get_keytag(struct ub_packed_rrset_key* ds_rrset, size_t ds_idx); int dnskey_algo_is_supported(struct ub_packed_rrset_key* dnskey_rrset, size_t dnskey_idx); +/** + * See if the DNSKEY size at that algorithm is supported. + * @param dnskey_rrset: DNSKEY rrset. + * @param dnskey_idx: index of RR in rrset. + * @return true if supported. + */ +int dnskey_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset, + size_t dnskey_idx); + +/** + * See if the DNSKEY size at that algorithm is supported for all the + * RRs in the DNSKEY RRset. + * @param dnskey_rrset: DNSKEY rrset. + * @return true if supported. + */ +int dnskeyset_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset); + /** * See if DS digest algorithm is supported * @param ds_rrset: DS rrset @@ -334,4 +351,16 @@ int canonical_tree_compare(const void* k1, const void* k2); int rrset_canonical_equal(struct regional* region, struct ub_packed_rrset_key* k1, struct ub_packed_rrset_key* k2); +/** + * Canonicalize an rrset into the buffer. For an auth zone record, so + * this does not use a signature, or the RRSIG TTL or the wildcard label + * count from the RRSIG. + * @param region: temporary region. + * @param buf: the buffer to use. + * @param k: the rrset to insert. + * @return false on alloc error. + */ +int rrset_canonicalize_to_buffer(struct regional* region, + struct sldns_buffer* buf, struct ub_packed_rrset_key* k); + #endif /* VALIDATOR_VAL_SIGCRYPT_H */ diff --git a/sbin/unwind/libunbound/validator/val_utils.c b/sbin/unwind/libunbound/validator/val_utils.c index 2f36fccfd4f..dd8d320e515 100644 --- a/sbin/unwind/libunbound/validator/val_utils.c +++ b/sbin/unwind/libunbound/validator/val_utils.c @@ -418,7 +418,7 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve, struct module_qstate* qstate) { enum sec_status sec = sec_status_bogus; - size_t i, num, numchecked = 0, numhashok = 0; + size_t i, num, numchecked = 0, numhashok = 0, numsizesupp = 0; num = rrset_get_count(dnskey_rrset); for(i=0; i<num; i++) { /* Skip DNSKEYs that don't match the basic criteria. */ @@ -441,6 +441,11 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve, continue; } numhashok++; + if(!dnskey_size_is_supported(dnskey_rrset, i)) { + verbose(VERB_ALGO, "DS okay but that DNSKEY size is not supported"); + numsizesupp++; + continue; + } verbose(VERB_ALGO, "DS match digest ok, trying signature"); /* Otherwise, we have a match! Make sure that the DNSKEY @@ -452,6 +457,10 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve, } /* If it didn't validate with the DNSKEY, try the next one! */ } + if(numsizesupp != 0) { + /* there is a working DS, but that DNSKEY is not supported */ + return sec_status_insecure; + } if(numchecked == 0) algo_needs_reason(env, ds_get_key_algo(ds_rrset, ds_idx), reason, "no keys have a DS"); @@ -519,17 +528,24 @@ val_verify_DNSKEY_with_DS(struct module_env* env, struct val_env* ve, continue; } + sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset, + ds_rrset, i, reason, qstate); + if(sec == sec_status_insecure) + continue; + /* Once we see a single DS with a known digestID and * algorithm, we cannot return INSECURE (with a * "null" KeyEntry). */ has_useful_ds = 1; - sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset, - ds_rrset, i, reason, qstate); if(sec == sec_status_secure) { if(!sigalg || algo_needs_set_secure(&needs, (uint8_t)ds_get_key_algo(ds_rrset, i))) { verbose(VERB_ALGO, "DS matched DNSKEY."); + if(!dnskeyset_size_is_supported(dnskey_rrset)) { + verbose(VERB_ALGO, "DS works, but dnskeyset contain keys that are unsupported, treat as insecure"); + return sec_status_insecure; + } return sec_status_secure; } } else if(sigalg && sec == sec_status_bogus) { @@ -631,17 +647,24 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve, ds_get_digest_algo(ta_ds, i) != digest_algo) continue; + sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset, + ta_ds, i, reason, qstate); + if(sec == sec_status_insecure) + continue; + /* Once we see a single DS with a known digestID and * algorithm, we cannot return INSECURE (with a * "null" KeyEntry). */ has_useful_ta = 1; - sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset, - ta_ds, i, reason, qstate); if(sec == sec_status_secure) { if(!sigalg || algo_needs_set_secure(&needs, (uint8_t)ds_get_key_algo(ta_ds, i))) { verbose(VERB_ALGO, "DS matched DNSKEY."); + if(!dnskeyset_size_is_supported(dnskey_rrset)) { + verbose(VERB_ALGO, "trustanchor works, but dnskeyset contain keys that are unsupported, treat as insecure"); + return sec_status_insecure; + } return sec_status_secure; } } else if(sigalg && sec == sec_status_bogus) { @@ -658,6 +681,8 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve, /* Check to see if we can understand this DNSKEY */ if(!dnskey_algo_is_supported(ta_dnskey, i)) continue; + if(!dnskey_size_is_supported(ta_dnskey, i)) + continue; /* we saw a useful TA */ has_useful_ta = 1; @@ -668,6 +693,10 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve, if(!sigalg || algo_needs_set_secure(&needs, (uint8_t)dnskey_get_algo(ta_dnskey, i))) { verbose(VERB_ALGO, "anchor matched DNSKEY."); + if(!dnskeyset_size_is_supported(dnskey_rrset)) { + verbose(VERB_ALGO, "trustanchor works, but dnskeyset contain keys that are unsupported, treat as insecure"); + return sec_status_insecure; + } return sec_status_secure; } } else if(sigalg && sec == sec_status_bogus) { diff --git a/sbin/unwind/libunbound/validator/validator.c b/sbin/unwind/libunbound/validator/validator.c index e12180b4bbd..d4d48d95689 100644 --- a/sbin/unwind/libunbound/validator/validator.c +++ b/sbin/unwind/libunbound/validator/validator.c @@ -137,6 +137,7 @@ val_apply_cfg(struct module_env* env, struct val_env* val_env, val_env->date_override = cfg->val_date_override; val_env->skew_min = cfg->val_sig_skew_min; val_env->skew_max = cfg->val_sig_skew_max; + val_env->max_restart = cfg->val_max_restart; c = cfg_count_numbers(cfg->val_nsec3_key_iterations); if(c < 1 || (c&1)) { log_err("validator: unparseable or odd nsec3 key " @@ -1487,7 +1488,7 @@ processInit(struct module_qstate* qstate, struct val_qstate* vq, enum val_classification subtype = val_classify_response( qstate->query_flags, &qstate->qinfo, &vq->qchase, vq->orig_msg->rep, vq->rrset_skip); - if(vq->restart_count > VAL_MAX_RESTART_COUNT) { + if(vq->restart_count > ve->max_restart) { verbose(VERB_ALGO, "restart count exceeded"); return val_error(qstate, id); } @@ -1640,7 +1641,7 @@ processInit(struct module_qstate* qstate, struct val_qstate* vq, errinf(qstate, key_entry_get_reason(vq->key_entry)); } /* no retries, stop bothering the authority until timeout */ - vq->restart_count = VAL_MAX_RESTART_COUNT; + vq->restart_count = ve->max_restart; vq->chase_reply->security = sec_status_bogus; vq->state = VAL_FINISHED_STATE; return 1; @@ -1848,7 +1849,7 @@ processValidate(struct module_qstate* qstate, struct val_qstate* vq, LDNS_RR_TYPE_DNSKEY, vq->key_entry->key_class); vq->chase_reply->security = sec_status_bogus; errinf(qstate, "while building chain of trust"); - if(vq->restart_count >= VAL_MAX_RESTART_COUNT) + if(vq->restart_count >= ve->max_restart) key_cache_insert(ve->kcache, vq->key_entry, qstate); return 1; } @@ -2064,7 +2065,7 @@ processFinished(struct module_qstate* qstate, struct val_qstate* vq, * endless bogus revalidation */ if(vq->orig_msg->rep->security == sec_status_bogus) { /* see if we can try again to fetch data */ - if(vq->restart_count < VAL_MAX_RESTART_COUNT) { + if(vq->restart_count < ve->max_restart) { int restart_count = vq->restart_count+1; verbose(VERB_ALGO, "validation failed, " "blacklist and retry to fetch data"); @@ -2605,6 +2606,7 @@ process_ds_response(struct module_qstate* qstate, struct val_qstate* vq, int id, int rcode, struct dns_msg* msg, struct query_info* qinfo, struct sock_list* origin) { + struct val_env* ve = (struct val_env*)qstate->env->modinfo[id]; struct key_entry_key* dske = NULL; uint8_t* olds = vq->empty_DS_name; vq->empty_DS_name = NULL; @@ -2638,7 +2640,7 @@ process_ds_response(struct module_qstate* qstate, struct val_qstate* vq, vq->chain_blacklist = NULL; /* fresh blacklist for next part*/ /* Keep the forState.state on FINDKEY. */ } else if(key_entry_isbad(dske) - && vq->restart_count < VAL_MAX_RESTART_COUNT) { + && vq->restart_count < ve->max_restart) { vq->empty_DS_name = olds; val_blacklist(&vq->chain_blacklist, qstate->region, origin, 1); qstate->errinf = NULL; @@ -2691,7 +2693,7 @@ process_dnskey_response(struct module_qstate* qstate, struct val_qstate* vq, /* bad response */ verbose(VERB_DETAIL, "Missing DNSKEY RRset in response to " "DNSKEY query."); - if(vq->restart_count < VAL_MAX_RESTART_COUNT) { + if(vq->restart_count < ve->max_restart) { val_blacklist(&vq->chain_blacklist, qstate->region, origin, 1); qstate->errinf = NULL; @@ -2730,7 +2732,7 @@ process_dnskey_response(struct module_qstate* qstate, struct val_qstate* vq, * state. */ if(!key_entry_isgood(vq->key_entry)) { if(key_entry_isbad(vq->key_entry)) { - if(vq->restart_count < VAL_MAX_RESTART_COUNT) { + if(vq->restart_count < ve->max_restart) { val_blacklist(&vq->chain_blacklist, qstate->region, origin, 1); qstate->errinf = NULL; @@ -2807,7 +2809,7 @@ process_prime_response(struct module_qstate* qstate, struct val_qstate* vq, lock_basic_unlock(&ta->lock); if(vq->key_entry) { if(key_entry_isbad(vq->key_entry) - && vq->restart_count < VAL_MAX_RESTART_COUNT) { + && vq->restart_count < ve->max_restart) { val_blacklist(&vq->chain_blacklist, qstate->region, origin, 1); qstate->errinf = NULL; diff --git a/sbin/unwind/libunbound/validator/validator.h b/sbin/unwind/libunbound/validator/validator.h index 35da1920aa3..a928e10a65d 100644 --- a/sbin/unwind/libunbound/validator/validator.h +++ b/sbin/unwind/libunbound/validator/validator.h @@ -64,9 +64,6 @@ struct config_strlist; */ #define BOGUS_KEY_TTL 60 /* seconds */ -/** max number of query restarts, number of IPs to probe */ -#define VAL_MAX_RESTART_COUNT 5 - /** Root key sentinel is ta preamble */ #define SENTINEL_IS "root-key-sentinel-is-ta-" /** Root key sentinel is not ta preamble */ @@ -95,6 +92,9 @@ struct val_env { /** clock skew max for signatures */ int32_t skew_max; + /** max number of query restarts, number of IPs to probe */ + int32_t max_restart; + /** TTL for bogus data; used instead of untrusted TTL from data. * Bogus data will not be verified more often than this interval. * seconds. */ |