]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
private address and private domain config option read and store.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 3 Sep 2008 14:40:09 +0000 (14:40 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 3 Sep 2008 14:40:09 +0000 (14:40 +0000)
git-svn-id: file:///svn/unbound/trunk@1223 be551aaa-1e26-0410-a405-d3ace91eadb9

18 files changed:
doc/Changelog
doc/example.conf.in
doc/plan
iterator/iter_donotq.c
iterator/iter_priv.c [new file with mode: 0644]
iterator/iter_priv.h [new file with mode: 0644]
iterator/iter_utils.c
iterator/iterator.h
util/config_file.c
util/config_file.h
util/configlexer.c
util/configlexer.lex
util/configparser.c
util/configparser.h
util/configparser.y
util/fptr_wlist.c
util/storage/dnstree.c [new file with mode: 0644]
util/storage/dnstree.h [new file with mode: 0644]

index 3b6690ef75e612a1a6a3bdc63b51fb41d8783c85..44375a106487b5efa1eb1e031d9527a327a9899d 100644 (file)
@@ -1,3 +1,9 @@
+3 September 2008: Wouter
+       - options for 'DNS Rebinding' protection: private-address and
+         private-domain.
+       - dnstree for reuse of routines that help with domain, addr lookups.
+       - private-address and private-domain config option read, stored.
+
 2 September 2008: Wouter
        - DoS protection features. Queries are jostled out to make room.
        - testbound can pass time, increasing the internal timer.
index 17b01e778be786cdd372f6d5c6d1de61f2c50ff2..2c4a72854992e424cc5214105517b2c15e63d4a2 100644 (file)
@@ -141,7 +141,7 @@ server:
        # access-control: ::0/0 refuse
        # access-control: ::1 allow
        # access-control: ::ffff:127.0.0.1 allow
-       
+
        # if given, a chroot(2) is done to the given directory.
        # i.e. you can chroot to the working directory, for example,
        # for extra security, but make sure all files are in that directory.
@@ -243,6 +243,22 @@ server:
        # resolution will fail for them. A solution is on the TODO list.
        # use-caps-for-id: no
        
+       # Enforce privacy of these addresses. Strips them away from answers. 
+       # It may cause DNSSEC validation to additionally mark it as bogus. 
+       # Protects against 'DNS Rebinding' (uses browser as network proxy). 
+       # Only 'private-domain' and 'local-data' names are allowed to have 
+       # these private addresses. No default.
+       # private-address: 10.0.0.0/8
+       # private-address: 172.16.0.0/12
+       # private-address: 192.168.0.0/16
+       # private-address: 192.254.0.0/16
+       # private-address: fd00::/8
+       # private-address: fe80::/10
+
+       # Allow the domain (and its subdomains) to contain private addresses.
+       # local-data statements are allowed to contain private addresses too.
+       # private-domain: "example.com"
+
        # Do not query the following addresses. No DNS queries are sent there.
        # List one address per entry. List classless netblocks with /size,
        # do-not-query-address: 127.0.0.1/8
index ef105118fca5359525d903d571de1dca143b1346..c4e07ea9d78611a638f5fc5841cd8b1946d30918 100644 (file)
--- a/doc/plan
+++ b/doc/plan
@@ -70,6 +70,7 @@ like dnswall does.  Allow certain subdomains to do it, config options.
 * IPv6 reverse, IP4 reverse local-data shorthand for PTR records (?).
   cumbersome to reverse notate by hand for the operator. For local-data.
   local-reverse-data: "1.2.3.4 mypc.example.com"
+* dns-0x20 fallback TODO item. Consider.
 
 *** from draft resolver-mitigation
 * Should be an option?   (Not right now)
index 553c5f44b97041dbd1c464747199a8dc9f4ccd88..a6b7d069577951971a1abbaee81e37eaf001b9c1 100644 (file)
@@ -172,6 +172,7 @@ int
 donotq_apply_cfg(struct iter_donotq* dq, struct config_file* cfg)
 {
        free(dq->tree);
+       regional_free_all(dq->region);
        dq->tree = rbtree_create(donotq_cmp);
        if(!dq->tree)
                return 0;
diff --git a/iterator/iter_priv.c b/iterator/iter_priv.c
new file mode 100644 (file)
index 0000000..cb7cc18
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * iterator/iter_priv.c - iterative resolver private address and domain store
+ *
+ * Copyright (c) 2008, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains functions to assist the iterator module.
+ * Keep track of the private addresses and lookup fast.
+ */
+
+#include "config.h"
+#include "iterator/iter_priv.h"
+#include "util/regional.h"
+#include "util/log.h"
+#include "util/config_file.h"
+#include "util/data/dname.h"
+#include "util/net_help.h"
+#include "util/storage/dnstree.h"
+
+struct iter_priv* priv_create()
+{
+       struct iter_priv* priv = (struct iter_priv*)calloc(1, sizeof(*priv));
+       if(!priv)
+               return NULL;
+       priv->region = regional_create();
+       if(!priv->region) {
+               priv_delete(priv);
+               return NULL;
+       }
+       addr_tree_init(&priv->a);
+       name_tree_init(&priv->n);
+       return priv;
+}
+
+void priv_delete(struct iter_priv* priv)
+{
+       if(!priv) return;
+       regional_destroy(priv->region);
+       free(priv);
+}
+
+/** Read private-addr declarations from config */
+static int read_addrs(struct iter_priv* priv, struct config_file* cfg)
+{
+       /* parse addresses, report errors, insert into tree */
+       struct config_strlist* p;
+       struct addr_tree_node* n;
+       struct sockaddr_storage addr;
+       int net;
+       socklen_t addrlen;
+
+       for(p = cfg->private_address; p; p = p->next) {
+               log_assert(p->str);
+               if(!netblockstrtoaddr(p->str, UNBOUND_DNS_PORT, &addr, 
+                       &addrlen, &net)) {
+                       log_err("cannot parse private-address: %s", p->str);
+                       return 0;
+               }
+               n = (struct addr_tree_node*)regional_alloc(priv->region,
+                       sizeof(*n));
+               if(!n) {
+                       log_err("out of memory");
+                       return 0;
+               }
+               if(!addr_tree_insert(&priv->a, n, &addr, addrlen, net)) {
+                       verbose(VERB_QUERY, "ignoring duplicate "
+                               "private-address: %s", p->str);
+               }
+       }
+       return 1;
+}
+
+/** Read private-domain declarations from config */
+static int read_names(struct iter_priv* priv, struct config_file* cfg)
+{
+       /* parse names, report errors, insert into tree */
+       struct config_strlist* p;
+       struct name_tree_node* n;
+       uint8_t* nm;
+       size_t nm_len;
+       int nm_labs;
+       ldns_rdf* rdf;
+
+       for(p = cfg->private_address; p; p = p->next) {
+               log_assert(p->str);
+               rdf = ldns_dname_new_frm_str(p->str);
+               if(!rdf) {
+                       log_err("cannot parse private-domain: %s", p->str);
+                       return 0;
+               }
+               nm = ldns_rdf_data(rdf);
+               nm_labs = dname_count_size_labels(nm, &nm_len);
+               nm = (uint8_t*)regional_alloc_init(priv->region, nm, nm_len);
+               ldns_rdf_deep_free(rdf);
+               if(!nm) {
+                       log_err("out of memory");
+                       return 0;
+               }
+               n = (struct name_tree_node*)regional_alloc(priv->region,
+                       sizeof(*n));
+               if(!n) {
+                       log_err("out of memory");
+                       return 0;
+               }
+               if(!name_tree_insert(&priv->n, n, nm, nm_len, nm_labs,
+                       LDNS_RR_CLASS_IN)) {
+                       verbose(VERB_QUERY, "ignoring duplicate "
+                               "private-domain: %s", p->str);
+               }
+       }
+       return 1;
+}
+
+int priv_apply_cfg(struct iter_priv* priv, struct config_file* cfg)
+{
+       /* empty the current contents */
+       regional_free_all(priv->region);
+       addr_tree_init(&priv->a);
+       name_tree_init(&priv->n);
+
+       /* read new contents */
+       if(!read_addrs(priv, cfg))
+               return 0;
+       if(!read_names(priv, cfg))
+               return 0;
+
+       /* prepare for lookups */
+       addr_tree_init_parents(&priv->a);
+       name_tree_init_parents(&priv->n);
+       return 1;
+}
+
+int priv_lookup_addr(struct iter_priv* priv, struct sockaddr_storage* addr,
+       socklen_t addrlen)
+{
+       return addr_tree_lookup(&priv->a, addr, addrlen) != NULL;
+}
+
+int priv_lookup_name(struct iter_priv* priv, uint8_t* name, uint16_t dclass)
+{
+       size_t len;
+       int labs = dname_count_size_labels(name, &len);
+       return name_tree_lookup(&priv->n, name, len, labs, dclass) != NULL;
+}
+
+size_t priv_get_mem(struct iter_priv* priv)
+{
+       if(!priv) return 0;
+       return sizeof(*priv) + regional_get_mem(priv->region);
+}
diff --git a/iterator/iter_priv.h b/iterator/iter_priv.h
new file mode 100644 (file)
index 0000000..9f2689e
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * iterator/iter_priv.h - iterative resolver private address and domain store
+ *
+ * Copyright (c) 2008, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains functions to assist the iterator module.
+ * Keep track of the private addresses and lookup fast.
+ */
+
+#ifndef ITERATOR_ITER_PRIV_H
+#define ITERATOR_ITER_PRIV_H
+#include "util/rbtree.h"
+struct iter_env;
+struct config_file;
+struct regional;
+
+/**
+ * Iterator priv structure
+ */
+struct iter_priv {
+       /** regional for allocation */
+       struct regional* region;
+       /** 
+        * Tree of the address spans that are blocked.
+        * contents of type addr_tree_node.
+        * No further data need, only presence or absence.
+        */
+       rbtree_t a;
+       /** 
+        * Tree of the domains spans that are allowed to contain
+        * the blocked address spans.
+        * contents of type name_tree_node.
+        * No further data need, only presence or absence.
+        */
+       rbtree_t n;
+};
+
+/**
+ * Create priv structure 
+ * @return new structure or NULL on error.
+ */
+struct iter_priv* priv_create();
+
+/**
+ * Delete priv structure.
+ * @param priv: to delete.
+ */
+void priv_delete(struct iter_priv* priv);
+
+/**
+ * Process priv config.
+ * @param priv: where to store.
+ * @param cfg: config options.
+ * @return 0 on error.
+ */
+int priv_apply_cfg(struct iter_priv* priv, struct config_file* cfg);
+
+/**
+ * See if an address is blocked.
+ * @param priv: structure for address storage.
+ * @param addr: address to check
+ * @param addrlen: length of addr.
+ * @return: true if the address must not be queried. false if unlisted.
+ */
+int priv_lookup_addr(struct iter_priv* priv, struct sockaddr_storage* addr,
+       socklen_t addrlen);
+
+/**
+ * See if a name is whitelisted.
+ * @param priv: structure for address storage.
+ * @param name: name to check.
+ * @param dclass: class to check.
+ * @return: true if the name is OK. false if unlisted.
+ */
+int priv_lookup_name(struct iter_priv* priv, uint8_t* name, uint16_t dclass);
+
+/**
+ * Get memory used by priv structure.
+ * @param priv: structure for address storage.
+ * @return bytes in use.
+ */
+size_t priv_get_mem(struct iter_priv* priv);
+
+#endif /* ITERATOR_ITER_PRIV_H */
index a0601656460c3a80fa40d0055489744e836f9e72..bbdc8135b3498433aa9b4587cd485afbb774643b 100644 (file)
@@ -46,6 +46,7 @@
 #include "iterator/iter_fwd.h"
 #include "iterator/iter_donotq.h"
 #include "iterator/iter_delegpt.h"
+#include "iterator/iter_priv.h"
 #include "services/cache/infra.h"
 #include "services/cache/dns.h"
 #include "services/cache/rrset.h"
@@ -123,6 +124,12 @@ iter_apply_cfg(struct iter_env* iter_env, struct config_file* cfg)
                log_err("Could not set donotqueryaddresses");
                return 0;
        }
+       if(!iter_env->priv)
+               iter_env->priv = priv_create();
+       if(!iter_env->priv || !priv_apply_cfg(iter_env->priv, cfg)) {
+               log_err("Could not set private addresses");
+               return 0;
+       }
        iter_env->supports_ipv6 = cfg->do_ip6;
        return 1;
 }
index 45b51b6029a7cf059c8cbd09d1d336ff5de0aa2d..775e50d3c0d0b6ebc8731e8e226a0b4f75f2b696 100644 (file)
@@ -50,6 +50,7 @@ struct iter_hints;
 struct iter_forwards;
 struct iter_donotq;
 struct iter_prep_list;
+struct iter_priv;
 
 /** max number of query restarts. Determines max number of CNAME chain. */
 #define MAX_RESTART_COUNT       8
@@ -92,6 +93,9 @@ struct iter_env {
        /** A set of inetaddrs that should never be queried. */
        struct iter_donotq* donotq;
 
+       /** private address space and private domains */
+       struct iter_priv* priv;
+
        /** The maximum dependency depth that this resolver will pursue. */
        int max_dependency_depth;
 
index 5f0c42c4ff565ba6f598a577277ea8630a4b1e5e..3d8d5e97777c7179f88085e7151f712721e74919 100644 (file)
@@ -131,6 +131,8 @@ config_create()
        cfg->harden_dnssec_stripped = 1;
        cfg->harden_referral_path = 0;
        cfg->use_caps_bits_for_id = 0;
+       cfg->private_address = NULL;
+       cfg->private_domain = NULL;
        cfg->hide_identity = 0;
        cfg->hide_version = 0;
        cfg->identity = NULL;
@@ -295,6 +297,13 @@ int config_set_option(struct config_file* cfg, const char* opt,
        } else if(strcmp(opt, "harden-dnssec-stripped:") == 0) {
                IS_YES_OR_NO;
                cfg->harden_dnssec_stripped = (strcmp(val, "yes") == 0);
+       } else if(strcmp(opt, "harden-referral-path:") == 0) {
+               IS_YES_OR_NO;
+               cfg->harden_referral_path = (strcmp(val, "yes") == 0);
+       } else if(strcmp(opt, "private-address:") == 0) {
+               return cfg_strlist_insert(&cfg->private_address, strdup(val));
+       } else if(strcmp(opt, "private-domain:") == 0) {
+               return cfg_strlist_insert(&cfg->private_domain, strdup(val));
        } else if(strcmp(opt, "do-not-query-localhost:") == 0) {
                IS_YES_OR_NO;
                cfg->donotquery_localhost = (strcmp(val, "yes") == 0);
@@ -462,6 +471,8 @@ config_delete(struct config_file* cfg)
        free(cfg->version);
        free(cfg->module_conf);
        free(cfg->outgoing_avail_ports);
+       config_delstrlist(cfg->private_address);
+       config_delstrlist(cfg->private_domain);
        config_delstrlist(cfg->trust_anchor_file_list);
        config_delstrlist(cfg->trusted_keys_file_list);
        config_delstrlist(cfg->trust_anchor_list);
index d5cdc9b79abcef7ffb9a49174956b08ca8ff02af..4b08419458e0c0caa302e8bf42bc08c12c64881e 100644 (file)
@@ -147,6 +147,10 @@ struct config_file {
        int harden_referral_path;
        /** use 0x20 bits in query as random ID bits */
        int use_caps_bits_for_id;
+       /** strip away these private addrs from answers, no DNS Rebinding */
+       struct config_strlist* private_address;
+       /** allow domain (and subdomains) to use private address space */
+       struct config_strlist* private_domain;
 
        /** chrootdir, if not "" or chroot will be done */
        char* chrootdir;
index fa53792ea9377cb660133b71d560eef49a9506fb..4495f8230c4d24d9d5d861aba820ecef4acc702a 100644 (file)
@@ -361,8 +361,8 @@ static void yy_fatal_error (yyconst char msg[]  );
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 96
-#define YY_END_OF_BUFFER 97
+#define YY_NUM_RULES 98
+#define YY_END_OF_BUFFER 99
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -370,101 +370,104 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[851] =
+static yyconst flex_int16_t yy_accept[873] =
     {   0,
-        1,    1,   80,   80,   84,   84,   88,   88,   92,   92,
-       97,   95,    1,   78,   79,    2,   83,   96,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   80,   81,   96,   82,   96,
-       84,   85,   86,   96,   91,   88,   89,   90,   96,   92,
-       93,   94,   96,   95,    0,    1,    2,    2,    2,    2,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       80,    0,   84,    0,   91,    0,   88,   92,    0,   95,
-
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   46,   95,
-
-       95,   95,   95,   95,    6,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   20,   95,   95,   95,   12,
-       13,   95,   15,   14,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-
-       95,   95,   95,   95,   95,   95,   95,   95,   95,    3,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   87,   95,   95,   95,   95,   95,   95,   95,
-       95,   23,   95,   95,   95,   95,   95,   95,   95,   24,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   58,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   57,   95,   95,   95,   95,
-
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   21,   95,   95,   95,   95,   95,   95,   95,
-       95,   22,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       17,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   47,   48,   45,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-        5,   95,   95,   95,   60,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-
-       95,   95,   95,   75,   74,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   25,   95,   95,   95,   95,
-       95,   95,   73,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   41,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,    4,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   16,   95,   50,   51,
-       49,   95,   95,   95,   95,   95,   56,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   64,   95,   95,   95,   95,   95,   95,   95,   95,
-       31,   95,   95,   95,   95,   95,   95,   95,   55,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   59,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   66,   95,   95,   95,
-       95,   54,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   32,   33,   95,   69,   95,   95,   27,
-       95,   71,   95,   95,   95,   95,   95,    7,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-
-       61,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   70,   26,   28,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   44,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   11,   95,
-       95,   95,   95,   95,   95,   10,   95,   95,   29,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   34,   95,   95,
-       95,   95,   95,   30,   95,   95,   95,   62,   63,   95,
-       95,   65,   95,   95,   95,   95,   95,   95,   95,   95,
-       95,   95,   95,   18,   95,   95,   95,   95,   95,   95,
-
-       95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-       19,   95,    9,   95,   95,   76,   38,   95,   95,   68,
-       52,   95,   95,   40,   43,   39,   95,   35,   95,    8,
-       95,   67,   95,   95,   95,   36,   95,   77,   95,   53,
-       42,   37,   95,   95,   95,   95,   95,   95,   72,    0
+        1,    1,   82,   82,   86,   86,   90,   90,   94,   94,
+       99,   97,    1,   80,   81,    2,   85,   98,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   82,   83,   98,   84,   98,
+       86,   87,   88,   98,   93,   90,   91,   92,   98,   94,
+       95,   96,   98,   97,    0,    1,    2,    2,    2,    2,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   82,    0,   86,    0,   93,    0,   90,   94,    0,
+
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+
+       97,   48,   97,   97,   97,   97,   97,    6,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       20,   97,   97,   97,   12,   13,   97,   15,   14,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,    3,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   89,   97,
+       97,   97,   97,   97,   97,   97,   97,   23,   97,   97,
+       97,   97,   97,   97,   97,   24,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   60,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+
+       97,   97,   59,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   21,   97,   97,   97,   97,   97,   97,   97,   97,
+       22,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   17,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   49,   50,
+       47,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,    5,   97,   97,   97,   62,   97,   97,   97,   97,
+
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   77,   76,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   25,   97,
+       97,   97,   97,   97,   97,   75,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       41,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,    4,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   16,   97,   52,   53,   51,   97,   97,   97,   97,
+
+       97,   58,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   66,   97,
+       97,   97,   97,   97,   97,   97,   97,   31,   97,   97,
+       97,   97,   97,   97,   97,   57,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   61,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   68,   97,   97,   97,   97,
+       56,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   32,   33,   97,   71,   97,   97,   27,   97,
+
+       73,   97,   97,   97,   97,   97,    7,   97,   46,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   63,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   72,   26,   28,   97,   97,   97,   97,
+       97,   45,   97,   97,   97,   97,   97,   97,   97,   44,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       11,   97,   97,   97,   97,   97,   97,   10,   97,   97,
+       29,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   34,
+       97,   97,   97,   97,   97,   30,   97,   97,   97,   64,
+
+       65,   97,   97,   67,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   18,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   19,   97,    9,   97,   97,   78,   38,   97,
+       97,   70,   54,   97,   97,   40,   43,   39,   97,   35,
+       97,    8,   97,   69,   97,   97,   97,   36,   97,   79,
+       97,   55,   42,   37,   97,   97,   97,   97,   97,   97,
+       74,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -507,205 +510,209 @@ static yyconst flex_int32_t yy_meta[39] =
         1,    1,    1,    1,    1,    1,    1,    1
     } ;
 
-static yyconst flex_int16_t yy_base[862] =
+static yyconst flex_int16_t yy_base[884] =
     {   0,
         0,    0,   36,   39,   43,   50,   62,   74,   55,   67,
-     1751, 1737,   49, 1752, 1752,   81, 1752,   88,   32,   83,
+     1795, 1781,   49, 1796, 1796,   81, 1796,   88,   32,   83,
        76,   78,   60,   89,   94,   86,   95,   96,   88,   98,
-      103,  105,  114,  104,  118, 1736, 1752, 1752, 1752,   57,
-     1735, 1752, 1752,  134, 1734, 1744, 1752, 1752,  138, 1732,
-     1752, 1752,  142, 1731,  146,  150,    0,  153,    0,    0,
-      146,  148,  141,  150,  136,  111,  152,  154,  155,  121,
-      160,  156,  161,  170,  165,  173,  175,  176,  162,  183,
-      177,  178,  184,  186,  189,  191,  193,  195,  196,  197,
-     1730,  207, 1729,  210, 1728,  226, 1738, 1726,  214,  211,
-
-      219,  210,  221,  228,  229,  212,  231,  225,  232,  236,
-      222,  241,  256,  243,  252,  237,  259,  255,  266,  267,
-      263,  265,  253,  264,  268,  269,  274,  275,  278,  276,
-      284,  286,  280,  287,  291,  288,  289,  299,  303,  295,
-      297,  306,  308,  313,  315,  321,  307,  317,  318,  322,
-      319,  324,  328,  325,  329,  341,  332,  335,  333,  342,
-      345,  347,  353,  350,  355,  357,  363,  359,  351,  362,
-      361,  381,  368,  367,  371,  377,  373,  378,  375,  385,
-      401,  386,  387,  391,  393,  400,  403,  407,  404,  409,
-      419,  411,  420,  427,  415,  423,  425,  429, 1725,  431,
-
-      433,  434,  435,  436, 1724,  438,  448,  437,  439,  450,
-      440,  460,  461,  449,  463,  452,  456,  468,  469,  471,
-      470,  477,  479,  472,  481,  478,  482,  483,  494,  497,
-      503,  500,  502,  504,  510,  507,  509,  487,  512,  513,
-      516,  520,  515,  525,  523,  535,  531,  533,  538,  534,
-      532,  540,  542,  543,  545,  555,  544,  556,  551,  557,
-      564,  561,  566,  558,  567,  568,  569,  572,  574,  578,
-      575,  581,  582,  584,  588, 1723,  586,  591,  593, 1722,
-     1721,  594, 1720, 1719,  601,  611,  597,  600,  522,  605,
-      606,  608,  598,  619,  621,  623,  625,  616,  633,  634,
-
-      635,  636,  638,  639,  640,  642,  648,  614,  650, 1718,
-      643,  653,  654,  655,  658,  660,  666,  659,  663,  662,
-      665,  669,  675,  671,  679,  676,  681,  682,  683,  684,
-      686,  689,  687,  693,  690,  698,  704,  692,  711,  699,
-      710,  714, 1717,  720,  721,  716,  717,  722,  725,  723,
-      726, 1716,  731,  732,  733,  735,  741,  743,  751, 1715,
-      736,  749,  753,  747,  748,  754,  757,  758,  760,  768,
-      765,  772,  766,  769,  777,  774,  776,  775, 1714,  780,
-      783,  787,  781,  788,  789,  792,  790,  795,  800,  801,
-      802,  805,  803,  806,  807, 1713,  810,  812,  808,  824,
-
-      831,  833,  813,  832,  822,  834,  841,  843,  839,  842,
-      840,  845,  848,  847,  859,  861,  867,  850,  854,  868,
-      864,  871, 1712,  877,  879,  880,  876,  881,  883,  884,
-      886, 1711,  892,  888,  889,  890,  893,  895,  896,  897,
-      900,  904,  898,  901,  912,  916,  917,  923,  924,  920,
-     1710,  925,  928,  930,  931,  938,  932,  934,  935,  939,
-      941,  940,  942,  944,  947,  958,  964, 1709, 1708, 1707,
-      948,  955,  949,  961,  966,  962,  967,  970,  972,  971,
-     1706,  974,  977,  978, 1705,  982,  979,  983,  985,  988,
-      990,  998,  994,  992,  986, 1001, 1002, 1006, 1012, 1008,
-
-     1010, 1011, 1013, 1704, 1703, 1014, 1016, 1017, 1021, 1037,
-     1036, 1019, 1033, 1025, 1039, 1702, 1046, 1040, 1047, 1044,
-     1048, 1050, 1701, 1051, 1053, 1054, 1058, 1056, 1060, 1062,
-     1068, 1072, 1069, 1076, 1079, 1081, 1082, 1700, 1088, 1084,
-     1091, 1087, 1090, 1097, 1094, 1095, 1096, 1098, 1093, 1099,
-     1102, 1104, 1103, 1119, 1106, 1108, 1699, 1116, 1127, 1110,
-     1125, 1124, 1126, 1130, 1138, 1140, 1141, 1149, 1134, 1147,
-     1137, 1153, 1150, 1152, 1155, 1156, 1698, 1157, 1697, 1696,
-     1695, 1164, 1160, 1165, 1170, 1174, 1694, 1162, 1177, 1169,
-     1175, 1179, 1180, 1182, 1183, 1185, 1193, 1184, 1194, 1195,
-
-     1198, 1200, 1201, 1202, 1211, 1207, 1204, 1208, 1210, 1216,
-     1217, 1693, 1219, 1224, 1227, 1228, 1214, 1230, 1235, 1239,
-     1692, 1236, 1242, 1243, 1244, 1245, 1247, 1248, 1691, 1249,
-     1251, 1254, 1255, 1260, 1270, 1261, 1272, 1264, 1690, 1274,
-     1276, 1267, 1278, 1280, 1281, 1250, 1283, 1289, 1286, 1290,
-     1292, 1294, 1293, 1295, 1296, 1302, 1689, 1300, 1301, 1308,
-     1318, 1688, 1315, 1316, 1321, 1303, 1323, 1330, 1326, 1327,
-     1329, 1331, 1333, 1687, 1686, 1336, 1685, 1341, 1344, 1684,
-     1346, 1683, 1352, 1348, 1338, 1350, 1351, 1682, 1354, 1355,
-     1358, 1360, 1361, 1362, 1363, 1365, 1366, 1367, 1368, 1370,
-
-     1678, 1376, 1378, 1380, 1381, 1384, 1383, 1386, 1394, 1388,
-     1390, 1391, 1674, 1673, 1672, 1395, 1400, 1405, 1406, 1396,
-     1412, 1407, 1415, 1409, 1417, 1418, 1419, 1668, 1421, 1422,
-     1428, 1429, 1431, 1434, 1432, 1437, 1438, 1440, 1667, 1442,
-     1444, 1448, 1450, 1453, 1451, 1663, 1454, 1452, 1662, 1458,
-     1455, 1465, 1467, 1469, 1472, 1473, 1480, 1477, 1478, 1479,
-     1481, 1483, 1485, 1484, 1487, 1491, 1488, 1661, 1492, 1493,
-     1502, 1504, 1496, 1655, 1506, 1509, 1494, 1627, 1626, 1513,
-     1516, 1625, 1517, 1511, 1519, 1521, 1523, 1524, 1526, 1527,
-     1528, 1535, 1537, 1624, 1539, 1530, 1540, 1544, 1548, 1545,
-
-     1550, 1554, 1558, 1555, 1559, 1563, 1566, 1568, 1570, 1572,
-     1623, 1576, 1621, 1579, 1580, 1620, 1619, 1582, 1583, 1618,
-     1617, 1574, 1586, 1616, 1615, 1614, 1592, 1587, 1594, 1499,
-     1596, 1317, 1584, 1600, 1603, 1222, 1605,  852, 1606,  815,
-      489,  441, 1589, 1551, 1597, 1609, 1610, 1613,  379, 1752,
-     1641, 1647, 1653, 1659,  252, 1665, 1671, 1677,   83, 1682,
-     1688
+      103,  105,  118,  104,  125, 1780, 1796, 1796, 1796,   57,
+     1779, 1796, 1796,  120, 1778, 1788, 1796, 1796,  140, 1776,
+     1796, 1796,  136, 1775,  147,  144,    0,  151,    0,    0,
+      144,  146,  106,  148,  150,  157,  153,  155,  154,  156,
+      160,  159,  173,  164,  162,  174,  175,  177,  178,  181,
+      167,  187,  188,  190,  192,  193,  195,  191,  198,  199,
+      200, 1774,  213, 1773,  224, 1772,  230, 1782, 1770,  215,
+
+      220,  223,  214,  227,  234,  235,  216,  226,  236,  233,
+      242,  240,  245,  252,  258,  237,  249,  265,  261,  267,
+      268,  264,  270,  272,  273,  274,  275,  277,  278,  279,
+      282,  283,  290,  292,  284,  288,  295,  296,  305,  303,
+      311,  299,  309,  313,  315,  317,  320,  326,  322,  324,
+      327,  328,  330,  331,  332,  333,  335,  348,  337,  349,
+      338,  345,  353,  356,  360,  363,  364,  365,  366,  372,
+      368,  369,  371,  377,  391,  378,  376,  379,  386,  380,
+      382,  387,  398,  410,  395,  396,  402,  409,  412,  413,
+      415,  416,  418,  428,  429,  430,  437,  433,  436,  419,
+
+      442, 1769,  445,  438,  440,  447,  449, 1768,  450,  451,
+      457,  453,  454,  463,  455,  473,  461,  465,  466,  476,
+      475,  477,  479,  480,  481,  482,  492,  491,  484,  493,
+      494,  498,  502,  505,  511,  509,  513,  514,  520,  517,
+      519,  516,  522,  523,  526,  530,  525,  538,  539,  545,
+      541,  543,  548,  549,  533,  552,  553,  555,  557,  556,
+      562,  564,  567,  568,  570,  574,  572,  575,  576,  577,
+      578,  580,  581,  588,  589,  585,  592,  596,  597,  598,
+     1767,  603,  604,  605, 1766, 1765,  606, 1764, 1763,  613,
+      623,  610,  607,  611,  617,  614,  625,  618,  628,  633,
+
+      631,  637,  642,  644,  645,  646,  647,  649,  650,  653,
+      654,  660,  668,  651,  665, 1762,  662,  669,  670,  672,
+      674,  676,  682,  675,  679,  678,  681,  686,  691,  692,
+      684,  695,  698,  699,  700,  702,  703,  705,  704,  707,
+      706,  710,  711,  720,  722,  716,  727,  734, 1761,  736,
+      735,  728,  737,  739,  742,  740,  741, 1760,  743,  748,
+      750,  751,  752,  762,  765, 1759,  766,  758,  768,  769,
+      764,  773,  774,  775,  782,  776,  783,  784,  788,  789,
+      790,  795,  793,  796,  794, 1758,  799,  802,  801,  804,
+      806,  808,  816,  809,  811,  814,  817,  819,  822,  824,
+
+      826,  830, 1757,  827,  833,  829,  842,  851,  849,  834,
+      852,  843,  853,  859,  860,  858,  861,  862,  864,  866,
+      867,  873,  869,  883,  889,  891,  874,  876,  892,  872,
+      894, 1756,  900,  903,  904,  896,  902,  907,  908,  909,
+     1755,  915,  886,  912,  913,  916,  918,  919,  921,  923,
+      933,  922,  932,  935,  924,  940,  947,  948,  950, 1754,
+      936,  953,  956,  957,  964,  958,  960,  961,  962,  968,
+      946,  969,  970,  973,  972,  975,  982,  990, 1753, 1752,
+     1751,  986,  988,  967,  992,  994,  995,  996,  998,  999,
+     1000, 1750, 1004, 1001, 1005, 1749, 1007, 1009, 1010, 1013,
+
+     1017, 1019, 1016, 1023, 1025, 1026, 1029, 1030, 1034, 1036,
+     1035, 1037, 1038, 1040, 1748, 1747, 1041, 1039, 1044, 1052,
+     1064, 1063, 1047, 1060, 1065, 1067, 1068, 1069, 1746, 1076,
+     1074, 1073, 1075, 1078, 1084, 1745, 1079, 1086, 1088, 1089,
+     1091, 1095, 1097, 1102, 1104, 1110, 1107, 1113, 1115, 1116,
+     1744, 1122, 1118, 1125, 1099, 1127, 1129, 1121, 1128, 1130,
+     1131, 1133, 1136, 1138, 1142, 1140, 1143, 1141, 1146, 1743,
+     1148, 1157, 1154, 1155, 1159, 1160, 1156, 1163, 1167, 1175,
+     1177, 1184, 1186, 1171, 1185, 1168, 1193, 1178, 1187, 1191,
+     1194, 1742, 1195, 1741, 1740, 1739, 1202, 1200, 1203, 1207,
+
+     1211, 1738, 1201, 1212, 1208, 1214, 1215, 1218, 1217, 1219,
+     1221, 1233, 1222, 1230, 1234, 1237, 1238, 1227, 1239, 1245,
+     1241, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1737, 1264,
+     1256, 1273, 1267, 1257, 1274, 1277, 1280, 1736, 1281, 1283,
+     1255, 1284, 1285, 1288, 1289, 1735, 1290, 1291, 1292, 1294,
+     1297, 1301, 1298, 1307, 1308, 1734, 1311, 1313, 1314, 1318,
+     1319, 1315, 1320, 1324, 1328, 1322, 1330, 1331, 1333, 1335,
+     1337, 1338, 1341, 1344, 1343, 1733, 1345, 1348, 1358, 1351,
+     1732, 1361, 1362, 1365, 1354, 1367, 1374, 1370, 1363, 1375,
+     1371, 1381, 1731, 1730, 1384, 1729, 1387, 1389, 1728, 1391,
+
+     1727, 1382, 1392, 1394, 1395, 1396, 1723, 1398, 1719, 1399,
+     1400, 1403, 1405, 1406, 1407, 1408, 1411, 1412, 1413, 1415,
+     1420, 1718, 1423, 1424, 1426, 1427, 1430, 1428, 1436, 1442,
+     1433, 1431, 1429, 1717, 1713, 1712, 1439, 1450, 1452, 1441,
+     1454, 1708, 1457, 1459, 1460, 1462, 1463, 1464, 1465, 1707,
+     1466, 1468, 1474, 1467, 1482, 1475, 1476, 1484, 1488, 1490,
+     1706, 1478, 1491, 1495, 1492, 1497, 1498, 1700, 1502, 1500,
+     1672, 1507, 1504, 1513, 1515, 1517, 1520, 1508, 1527, 1525,
+     1526, 1510, 1529, 1531, 1533, 1532, 1534, 1535, 1536, 1671,
+     1539, 1540, 1548, 1541, 1543, 1670, 1549, 1550, 1553, 1669,
+
+     1668, 1562, 1556, 1667, 1564, 1554, 1560, 1566, 1567, 1568,
+     1570, 1571, 1573, 1579, 1582, 1666, 1584, 1580, 1586, 1589,
+     1593, 1590, 1594, 1598, 1603, 1600, 1604, 1606, 1611, 1615,
+     1612, 1620, 1665, 1621, 1664, 1624, 1625, 1662, 1661, 1627,
+     1628, 1660, 1659, 1616, 1632, 1631, 1349, 1087, 1638,  965,
+     1639,  925, 1641,  831, 1629, 1645, 1648,  532, 1650,  421,
+     1651,  384,  340,  251, 1634, 1654, 1642, 1595, 1655, 1658,
+      201, 1796, 1686, 1692, 1698, 1704,  133, 1710, 1716, 1722,
+       83, 1727, 1733
     } ;
 
-static yyconst flex_int16_t yy_def[862] =
+static yyconst flex_int16_t yy_def[884] =
     {   0,
-      850,    1,  851,  851,  852,  852,  853,  853,  854,  854,
-      850,  855,  850,  850,  850,  856,  850,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  857,  850,  850,  850,  857,
-      858,  850,  850,  858,  859,  850,  850,  850,  859,  860,
-      850,  850,  860,  855,  855,  850,  861,  856,  861,  856,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      857,  857,  858,  858,  859,  859,  850,  860,  860,  855,
-
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,    0,
-      850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
-      850
+      872,    1,  873,  873,  874,  874,  875,  875,  876,  876,
+      872,  877,  872,  872,  872,  878,  872,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  879,  872,  872,  872,  879,
+      880,  872,  872,  880,  881,  872,  872,  872,  881,  882,
+      872,  872,  882,  877,  877,  872,  883,  878,  883,  878,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  879,  879,  880,  880,  881,  881,  872,  882,  882,
+
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,    0,  872,  872,  872,  872,  872,  872,  872,  872,
+      872,  872,  872
     } ;
 
-static yyconst flex_int16_t yy_nxt[1791] =
+static yyconst flex_int16_t yy_nxt[1835] =
     {   0,
        12,   13,   14,   14,   15,   16,   17,   12,   12,   12,
        12,   12,   18,   19,   12,   20,   21,   12,   22,   12,
@@ -713,199 +720,205 @@ static yyconst flex_int16_t yy_nxt[1791] =
        32,   33,   34,   35,   12,   12,   12,   12,   37,   38,
        39,   37,   38,   39,   55,   42,   38,   61,   40,   43,
        56,   40,   42,   38,   57,   44,   43,   51,   51,   52,
-       91,   91,   44,   46,   47,   47,   48,   53,   38,   51,
+       92,   92,   44,   46,   47,   47,   48,   53,   38,   51,
        51,   52,   55,   68,   49,   46,   47,   47,   48,   53,
-       38,   69,   59,   95,   59,   59,   49,   59,   55,   54,
+       38,   69,   59,   96,   59,   59,   49,   59,   55,   54,
        55,   54,   54,   60,   54,   55,   62,   64,   55,   65,
 
        55,   55,   66,   63,   67,   70,   55,   55,   55,   76,
-       55,   72,   73,   77,   71,   55,   55,   55,  105,   80,
-       79,   74,   84,   55,   81,   75,   55,   86,   78,   82,
-       55,   89,   83,   55,   88,   90,   85,   93,  109,   95,
-       93,   95,   95,   87,   95,   98,   98,   54,   55,   54,
-       54,   56,   54,   55,   59,   57,   59,   59,   55,   59,
-       55,  100,   55,  101,   55,   60,   55,   55,   55,  104,
-      102,  108,   55,   55,   55,  110,  114,   55,  111,  103,
-      115,  106,   55,  107,  117,   55,  116,   55,   55,   55,
-       55,  112,  113,  121,  119,   55,   55,  118,   55,  122,
-
-      120,   55,  127,   55,  124,   55,  123,   55,   55,   55,
-       91,   91,  131,   93,  125,  126,   93,   98,   98,  132,
-      129,  128,   55,   55,   55,  130,  133,   95,  134,   95,
-       95,   55,   95,   55,   55,  138,  136,   55,  137,  135,
-       55,   55,  146,   55,   55,  139,  144,  145,   55,   55,
-      140,  150,   54,   55,  141,   55,  153,  147,  151,  148,
-      142,  143,  149,  152,   55,   55,  156,   55,   55,  155,
-      154,   55,  157,  158,  159,   55,   55,   55,   55,   55,
-       55,   55,  160,  161,  162,  164,   55,   55,   55,  167,
-       55,  170,   55,  172,  173,  163,   55,  168,   55,   55,
-
-       55,   55,  165,   55,  178,  166,  169,   55,  176,   55,
-      174,   55,  179,  171,  177,   55,  180,  175,   55,   55,
-       55,  183,  181,  182,  184,   55,  185,   55,  187,   55,
-       55,   55,  186,   55,   55,  191,   55,   55,  188,  193,
-       55,   55,  190,  199,   55,   55,  195,   55,  192,  189,
-      200,  194,  196,   55,   55,  197,  198,   55,  205,   55,
-      206,  201,   55,   55,  202,   55,  204,   55,  203,   55,
-      210,   55,  208,   55,   55,   55,  211,  213,  209,   55,
-       55,  207,  212,   55,  224,   55,  215,   55,  222,   55,
-       55,   55,  214,   55,  221,  216,  217,   55,   55,   55,
-
-      227,  223,  228,   55,  225,   55,  218,  219,  220,  226,
-      229,  230,   55,   55,  232,   55,   55,  231,  233,   55,
-      239,   55,  234,   55,  236,  235,  241,   55,  238,  242,
-      240,   55,   55,  243,  244,   55,  237,   55,  245,   55,
-      246,   55,  248,   55,  249,   55,   55,   55,   55,   55,
-       55,   55,   55,   55,  251,  255,  252,  247,  254,  253,
-       55,   55,   55,  258,   55,  250,  256,  262,   55,  257,
-      259,  261,   55,   55,  264,   55,  266,  263,  267,  268,
-       55,   55,   55,   55,   55,  265,  274,  260,  271,   55,
-       55,   55,  276,   55,   55,   55,  275,  278,  269,   55,
-
-      272,   55,  270,  273,  277,  280,   55,  279,  281,   55,
-      282,  283,   55,  284,   55,   55,   55,  286,  289,   55,
-      285,   55,   55,  287,   55,   55,  288,   55,   55,  290,
-      296,  292,   55,  295,   55,   55,  293,   55,  291,  294,
-      299,  297,  300,   55,   55,   55,   55,   55,  302,  301,
-       55,  304,   55,  303,   55,   55,   55,   55,  342,  307,
-      309,  305,  298,   55,  308,  306,  310,   55,   55,   55,
-       55,  315,  312,   55,  316,  311,   55,  313,   55,   55,
-       55,   55,  317,  314,   55,  318,   55,   55,  321,  322,
-       55,  323,  320,   55,   55,  324,   55,  319,   55,  328,
-
-       55,  329,  326,   55,  325,   55,   55,  327,  334,   55,
-       55,  331,   55,   55,  340,  330,  343,   55,   55,  332,
-       55,  345,  333,   55,  346,  344,   55,  335,   55,  341,
-      336,   55,  347,   55,  337,   55,  348,   55,  350,  361,
-      338,  339,  351,  349,  352,   55,   55,   55,   55,  353,
-       55,   55,   55,  354,   55,   55,  355,  358,  356,  360,
-       55,  359,   55,  362,  363,   55,   55,   55,  357,  364,
-       55,   55,   55,  369,   55,   55,  367,   55,   55,  372,
-      366,   55,  374,   55,  365,  368,  371,   55,   55,  370,
-      375,   55,  379,   55,   55,   55,   55,  373,   55,   55,
-
-      376,   55,   55,  377,   55,   55,  386,  378,  380,  392,
-       55,   55,  383,  387,  384,  389,   55,  391,  381,  385,
-      382,  390,   55,   55,  394,  396,   55,  397,   55,   55,
-      388,  393,   55,   55,   55,   55,  398,   55,   55,  401,
-      395,  400,  402,   55,   55,   55,  399,   55,   55,  406,
-      407,  404,  408,   55,  403,   55,  410,  405,  411,   55,
-       55,   55,  409,   55,  413,   55,   55,  412,  414,   55,
-       55,  417,   55,  419,  418,  421,  415,   55,   55,  416,
-       55,   55,  420,  423,   55,  426,   55,   55,   55,   55,
-      431,  422,   55,   55,  425,   55,  424,  428,  432,   55,
-
-       55,   55,   55,  427,   55,  430,  435,   55,  436,  434,
-      433,  429,   55,   55,   55,   55,  437,   55,   55,   55,
-       55,  438,   55,  442,   55,   55,  453,   55,  445,  443,
-      439,  441,  447,  440,   55,  446,   55,  444,  450,  448,
-      452,  449,  451,   55,   55,   55,   55,  455,  457,  454,
-      458,   55,   55,   55,   55,   55,  459,   55,  460,   55,
-       55,  461,   55,  456,   55,  462,   55,  463,  466,  464,
-      468,   55,  469,   55,  472,  465,   55,  467,  470,   55,
-       55,  471,  474,   55,  476,  473,  477,  478,   55,   55,
-      475,   55,   55,   55,  481,   55,   55,  479,   55,  484,
-
-       55,   55,   55,  485,   55,   55,  488,   55,   55,   55,
-       55,  480,   55,   55,  492,  482,   55,  483,  487,  493,
-      490,  494,  496,  489,   55,  486,  491,  495,   55,   55,
-      500,  501,   55,  502,  499,   55,   55,   55,  497,  504,
-       55,  505,   55,   55,   55,  507,   55,   55,  498,  506,
-       55,   55,   55,   55,   55,  503,   55,  515,  516,   55,
-       55,   55,  508,  519,  509,  510,  512,   55,  514,  511,
-       55,  518,  513,   55,   55,  517,   55,  523,   55,   55,
-      525,  520,   55,   55,   55,  521,   55,  522,  527,   55,
-       55,   55,  526,  524,   55,   55,  531,   55,   55,  532,
-
-       55,  528,   55,  529,   55,  536,   55,  537,  530,  538,
-       55,  539,  534,   55,   55,  533,  535,  541,   55,  545,
-       55,  540,   55,   55,   55,   55,   55,  543,   55,   55,
-      544,   55,  542,   55,  549,  551,  550,   55,  553,  546,
-      554,  547,  555,  548,  556,   55,  552,  557,   55,   55,
-      558,   55,   55,  562,  560,  563,   55,  559,   55,   55,
-       55,  564,   55,   55,  561,   55,   55,  565,   55,  570,
-       55,  571,   55,  566,   55,  572,  578,  573,  567,  568,
-       55,   55,  569,  577,   55,  575,  574,  579,   55,  576,
-      580,   55,  581,   55,   55,  583,   55,  582,  585,   55,
-
-       55,  587,   55,   55,  588,   55,   55,   55,   55,   55,
-       55,   55,  596,  584,   55,   55,   55,  589,   55,  590,
-       55,  597,   55,  586,  591,  598,  592,  593,   55,  594,
-      595,   55,  600,  603,  604,  602,   55,   55,   55,   55,
-      599,  605,   55,  601,  606,  610,   55,  611,  613,   55,
-       55,  612,   55,   55,  607,  609,  614,  615,  608,   55,
-      618,   55,   55,  616,   55,   55,  621,   55,   55,   55,
-      623,  625,   55,  617,   55,  620,   55,   55,  627,  622,
-      624,   55,   55,  619,  628,  629,   55,   55,  626,   55,
-      631,   55,   55,  630,   55,   55,   55,   55,  633,  638,
-
-      637,  632,  634,  635,  639,   55,   55,   55,  636,  642,
-       55,  641,   55,   55,   55,  643,   55,  644,  647,   55,
-       55,  640,   55,   55,  648,  649,   55,  650,   55,   55,
-      645,   55,  651,  646,   55,  654,   55,  655,  657,   55,
-       55,  652,   55,  653,  659,  656,  660,   55,   55,  658,
-      662,   55,  661,  663,   55,   55,   55,   55,  664,   55,
-       55,   55,   55,   55,  670,  685,   55,   55,  673,  665,
-      668,  674,   55,   55,  666,  671,   55,  667,  672,   55,
-      669,  675,   55,  677,   55,  676,   55,  680,   55,  682,
-       55,  679,   55,   55,  678,   55,  686,  681,   55,  684,
-
-      688,   55,   55,  690,   55,   55,   55,   55,   55,  683,
-      687,  692,   55,   55,   55,   55,  694,  695,  696,  693,
-       55,  699,  698,  689,  691,  700,  701,   55,   55,   55,
-       55,  697,  702,   55,  704,   55,  703,  706,   55,   55,
-      705,   55,   55,   55,  707,   55,  709,  711,   55,  712,
-       55,  710,  713,   55,  708,  714,   55,  715,   55,  716,
-       55,  717,   55,   55,   55,  718,   55,   55,  720,  722,
-       55,  721,   55,   55,   55,   55,  728,   55,   55,   55,
-       55,  723,   55,  719,  725,  726,  727,  729,   55,  724,
-       55,  734,   55,   55,  732,   55,   55,  739,   55,  731,
-
-       55,  740,   55,   55,  730,  733,   55,   55,   55,  735,
-      736,  737,   55,  738,  741,  745,  746,   55,   55,   55,
-      742,   55,  743,  749,   55,  748,  744,   55,  751,   55,
-       55,   55,  747,   55,   55,  754,  755,  750,  753,  757,
-       55,   55,  752,   55,   55,  758,   55,  756,  760,   55,
-       55,  764,   55,  762,   55,  759,   55,  761,  763,  768,
-       55,  765,   55,   55,   55,   55,   55,   55,  771,  774,
-       55,  769,  766,  770,  767,  772,  773,   55,  776,   55,
-      778,   55,  777,  779,   55,   55,  775,  781,  782,   55,
-       55,   55,   55,   55,  783,   55,   55,   55,  780,   55,
-
-       55,  785,  787,   55,   55,   55,   55,  792,   55,  784,
-      786,   55,  790,  794,   55,  788,   55,  796,   55,  791,
-      795,   55,  793,   55,  789,   55,  800,  797,   55,   55,
-      799,   55,  798,   55,  802,   55,   55,  801,   55,   55,
-       55,  803,   55,  808,  807,  804,  811,   55,  805,   55,
-      813,   55,   55,  806,  812,  816,   55,   55,  810,  817,
-       55,  814,   55,   55,  809,  820,   55,   55,  818,  821,
-       55,   55,  845,  815,  824,   55,  823,  825,   55,  826,
-       55,  819,   55,  828,   55,  822,   55,  827,   55,  829,
-      830,   55,   55,  832,   55,   55,   55,  831,   55,   55,
-
-      833,   55,  835,  836,   55,  834,   55,  838,   55,   55,
-      837,  840,   55,  839,  841,   55,  842,   55,   55,  843,
-      844,   55,   55,  846,  849,   55,   55,   55,   55,   55,
-       55,   55,   55,   55,  847,   55,   55,   55,   55,   55,
-      848,   36,   36,   36,   36,   36,   36,   41,   41,   41,
-       41,   41,   41,   45,   45,   45,   45,   45,   45,   50,
-       50,   50,   50,   50,   50,   58,   58,   55,   58,   58,
-       58,   91,   91,   55,   55,   55,   91,   93,   93,   55,
-       55,   93,   98,   98,   55,   55,   55,   98,   59,   59,
-       55,   59,   59,   59,   55,   55,   55,   55,   55,   55,
-
+       55,   72,   73,   77,   71,   55,   55,   55,   55,   80,
+       79,   74,   85,   94,   81,   75,   94,   82,   78,   83,
+       55,   87,   84,   54,   89,  103,   86,   55,   90,   99,
+       99,   96,   91,   96,   96,   56,   96,   88,   54,   57,
+       54,   54,   59,   54,   59,   59,   55,   59,   55,  101,
+       55,  102,   55,   60,  106,   55,   55,   55,   55,   55,
+      109,   55,   55,  110,   55,  111,   55,  104,  112,   55,
+      117,  118,  107,  105,  108,   55,   55,   55,  115,   55,
+       55,  113,  116,   55,  120,  114,  124,  123,  119,   55,
+
+       55,  121,   55,   55,   55,   55,  129,   55,  125,  122,
+       55,   55,   55,   55,  126,  133,   92,   92,   99,   99,
+      127,  128,  134,  132,  131,  130,   55,   94,   55,  135,
+       94,   96,   55,   96,   96,   55,   96,  136,   55,   55,
+      138,  140,  147,  137,  139,   55,   55,   55,   55,   55,
+      146,  141,   55,  148,   55,  156,  142,   55,  149,  154,
+      143,   55,  153,   55,   55,  150,  144,  145,  151,  152,
+       55,  155,  158,   55,  160,  161,   55,   55,  159,   55,
+       55,  157,   55,  162,   55,   55,   55,   55,  163,   55,
+       55,   55,  167,  170,   55,   55,   55,  173,  176,  175,
+
+       55,  171,   55,  164,   55,  166,  165,   55,   55,  169,
+      168,   55,  179,  172,  177,   55,  182,   55,  178,  174,
+      181,   55,  180,   55,  183,   55,  184,   55,  186,   55,
+      188,  187,   55,  190,   55,  185,   55,  189,   55,   55,
+       55,  194,   55,   55,   55,   55,  196,   55,  202,   55,
+       55,  193,   55,  191,  198,  197,  192,   55,  199,  195,
+       55,   55,  200,  201,  203,   55,  204,  208,   55,  205,
+      210,  206,   55,  209,  207,   55,   55,   55,   55,  214,
+       55,   55,  212,   55,   55,  215,  217,  213,   55,   55,
+       55,   55,   55,  228,   55,  211,   55,  226,   55,   55,
+
+      216,  218,  219,   55,  225,  220,  221,   55,   55,  227,
+       55,  229,  231,  230,   55,  232,  222,  223,  224,  233,
+      234,   55,   55,  236,   55,   55,  235,   55,   55,  237,
+       55,   55,  243,   55,  240,  245,  242,  239,  238,  244,
+       55,   55,   55,  247,  248,   55,  241,  246,   55,   55,
+       55,  251,   55,  250,   55,  252,  249,   55,  253,   55,
+      255,   55,   55,   55,  260,   55,   55,   55,  256,   55,
+      254,  259,  257,   55,  269,   55,  263,   55,   55,  271,
+      267,  258,  261,  264,  262,   55,  266,   55,   55,   55,
+      268,   55,   55,   55,   55,  281,   55,  276,  273,  279,
+
+      265,  270,  272,   55,   55,   55,   55,  274,  278,  283,
+       55,  277,  275,  285,   55,  280,  286,   55,  287,  282,
+      288,   55,  284,   55,  289,   55,   55,  291,   55,   55,
+      290,   55,   55,  292,   55,   55,  293,   55,   55,  295,
+      301,  297,   55,  300,   55,   55,  298,  294,  296,  299,
+       55,   55,  305,   55,  302,   55,  304,   55,  307,  306,
+       55,   55,  310,  308,   55,   55,  309,   55,   55,   55,
+      312,  315,  313,  316,   55,  303,   55,  311,  314,   55,
+       55,  321,   55,  318,   55,  322,   55,   55,   55,   55,
+       55,  323,   55,   55,  319,  317,  320,   55,  328,  327,
+
+       55,   55,  326,  324,   55,  329,  330,  325,   55,   55,
+       55,  335,  334,  332,  331,   55,   55,   55,   55,   55,
+      340,  333,   55,   55,  337,   55,   55,  346,  349,   55,
+       55,  338,  336,  350,  339,   55,  347,   55,  351,  341,
+       55,  353,  342,   55,  352,   55,  343,  348,  354,   55,
+      356,  355,  344,  345,   55,  358,   55,   55,   55,   55,
+      359,   55,   55,   55,  360,   55,   55,  361,  357,  362,
+      364,  366,   55,  365,   55,  367,  368,   55,  369,  363,
+       55,   55,   55,  370,   55,  371,   55,   55,   55,  376,
+       55,   55,  374,   55,   55,  379,   55,  373,   55,  381,
+
+      372,  375,  378,   55,   55,  377,  382,   55,  384,  386,
+       55,   55,   55,  380,   55,   55,   55,   55,   55,   55,
+      393,  383,   55,   55,  398,  387,  385,  394,   55,  390,
+      391,  396,   55,  397,   55,  388,  392,  399,  389,   55,
+       55,  401,  400,  404,  395,  403,   55,   55,   55,   55,
+      405,   55,   55,   55,   55,   55,  408,  402,  406,  409,
+       55,  407,   55,   55,   55,  413,  411,  414,  415,  412,
+       55,  410,  418,  416,   55,  417,   55,   55,   55,  419,
+       55,   55,  420,  422,  423,   55,   55,   55,   55,  421,
+      430,  426,  427,  424,   55,   55,   55,  428,  429,  432,
+
+       55,   55,   55,  435,  425,   55,   55,   55,   55,  440,
+      431,   55,  441,   55,   55,  434,   55,  437,   55,  433,
+       55,   55,  436,   55,  439,  444,   55,  443,   55,   55,
+      438,   55,  445,  442,   55,  446,   55,  447,   55,   55,
+      451,   55,   55,   55,  448,   55,   55,  462,  450,  449,
+      452,  454,  455,  456,   55,   55,  461,  453,  459,  458,
+      457,   55,  460,   55,   55,   55,  466,  467,  464,  463,
+       55,   55,   55,   55,   55,  468,   55,  469,   55,   55,
+      474,   55,  465,  470,   55,   55,   55,  471,   55,  472,
+      485,  473,  475,  477,  479,   55,  483,  476,   55,  478,
+
+      480,   55,  481,   55,   55,  482,   55,  487,   55,  484,
+      488,  489,   55,  486,   55,   55,   55,  490,  492,   55,
+       55,   55,  495,  497,   55,   55,  496,   55,   55,  499,
+       55,   55,  491,   55,   55,   55,   55,   55,  503,  493,
+      494,  498,  504,  501,   55,   55,  500,   55,   55,  502,
+      505,  506,   55,  507,  511,  512,  509,  510,   55,   55,
+       55,  508,   55,  513,  515,   55,  514,  516,   55,   55,
+       55,  518,   55,   55,   55,  517,   55,   55,  524,   55,
+       55,   55,   55,  526,   55,   55,  529,   55,  519,  527,
+      520,  521,  522,  523,   55,  525,  528,  531,   55,  530,
+
+       55,  532,   55,  534,   55,  536,   55,   55,   55,  538,
+       55,   55,   55,   55,  533,  540,   55,   55,  535,   55,
+      539,   55,   55,  544,  545,   55,  537,  551,   55,   55,
+      541,   55,  543,  542,  549,   55,  550,   55,   55,  547,
+      552,   55,   55,  558,  548,  546,   55,   55,   55,   55,
+       55,   55,   55,   55,  553,  556,   55,  554,  557,   55,
+      555,  562,  564,  563,   55,  566,  559,  567,  560,  565,
+      561,  569,   55,  568,  570,   55,   55,   55,  571,   55,
+       55,   55,  576,  577,  572,   55,   55,   55,   55,  578,
+       55,   55,  574,  580,  573,  579,   55,  575,   55,   55,
+
+       55,   55,  585,   55,  581,  586,  587,   55,  582,   55,
+      584,   55,  588,  583,   55,  592,   55,  593,  594,   55,
+      590,  589,   55,  591,  595,   55,  596,   55,   55,  598,
+       55,  597,  600,   55,   55,  601,  603,   55,  602,   55,
+       55,   55,   55,   55,  604,   55,  605,  599,   55,  611,
+       55,  606,   55,   55,   55,   55,  615,  612,   55,  607,
+       55,  608,  609,  613,  619,  618,   55,   55,   55,   55,
+      610,   55,   55,  617,  621,   55,  622,  614,  616,   55,
+       55,  623,  627,   55,  628,  620,  624,   55,  629,   55,
+       55,  630,  626,  631,  632,  625,   55,   55,   55,   55,
+
+      635,  633,  638,   55,  634,   55,   55,   55,  640,  642,
+      637,  636,   55,   55,   55,   55,  644,  639,  641,   55,
+       55,  645,  646,   55,   55,  648,   55,   55,  643,   55,
+       55,   55,  647,   55,   55,  655,  654,  650,  651,   55,
+      649,  652,   55,  653,  656,   55,   55,  658,  659,   55,
+       55,   55,  664,   55,  660,  661,  662,   55,  665,  657,
+       55,   55,   55,   55,   55,   55,   55,   55,   55,   55,
+      663,  668,  673,  669,  667,  670,   55,  675,  666,   55,
+      672,  684,  674,  671,  676,   55,   55,  678,  677,   55,
+      679,  681,   55,   55,  680,   55,   55,   55,  682,  683,
+
+       55,   55,   55,   55,   55,  689,   55,  692,  693,   55,
+       55,  687,  694,   55,  685,  690,  691,  686,  696,   55,
+       55,  688,  695,   55,  699,   55,   55,   55,  698,  701,
+       55,   55,   55,  703,   55,  704,   55,  705,  697,  707,
+       55,  709,   55,   55,  700,   55,  711,   55,  702,   55,
+       55,  706,  708,   55,  713,   55,   55,   55,  721,  717,
+       55,   55,  715,   55,  714,  716,   55,  712,  710,  719,
+       55,  720,  722,   55,   55,   55,  718,   55,  723,   55,
+      724,  727,   55,   55,  726,  725,   55,   55,  728,  737,
+      729,  731,  730,   55,   55,  732,   55,  733,  734,   55,
+
+      735,   55,  736,   55,   55,  738,   55,   55,   55,  742,
+       55,   55,   55,  741,  744,   55,  743,   55,   55,   55,
+       55,  739,  750,   55,   55,   55,  745,   55,  740,  747,
+      748,  749,   55,  751,  746,   55,   55,  756,   55,   55,
+       55,   55,   55,   55,  754,   55,  753,  761,   55,  762,
+      752,   55,  755,   55,   55,  757,  758,  759,  760,  763,
+      765,  764,   55,  768,   55,  767,   55,  769,  771,   55,
+      766,   55,   55,  773,   55,   55,   55,   55,   55,   55,
+       55,  776,  777,  770,  775,  779,   55,   55,   55,  772,
+       55,  780,  778,  781,   55,  774,   55,  784,  783,  782,
+
+       55,  786,   55,   55,   55,  785,  790,   55,  788,   55,
+       55,  787,   55,  791,   55,  793,   55,  792,  796,   55,
+       55,  789,   55,  794,  795,   55,  798,   55,  800,   55,
+      799,  801,   55,  802,  803,  797,  804,   55,   55,   55,
+      806,   55,  805,   55,   55,   55,   55,   55,   55,  807,
+      809,   55,   55,   55,  814,   55,  812,  817,  808,  816,
+       55,   55,   55,  810,  818,   55,   55,  813,   55,  815,
+      819,  811,   55,  820,   55,  822,   55,  823,   55,   55,
+       55,  824,   55,   55,  825,   55,  826,  830,  829,  821,
+      833,   55,   55,  827,   55,  835,   55,  828,   55,  834,
+
+      838,   55,   55,  832,  839,   55,   55,   55,  831,  842,
+       55,  836,   55,  840,  843,   55,   55,  846,   55,  837,
+      869,  845,  847,   55,   55,  841,  848,   55,   55,  849,
+      844,  850,   55,   55,  851,  852,   55,   55,  854,   55,
+       55,   55,  853,   55,   55,  855,   55,  856,  857,  858,
+       55,   55,  860,   55,   55,  859,  862,   55,  861,  863,
+       55,  864,   55,   55,  865,  866,   55,   55,  868,  871,
+       55,   55,   55,   55,   55,  867,   55,   55,   55,   55,
+       55,   55,   55,   55,   55,  870,   36,   36,   36,   36,
+       36,   36,   41,   41,   41,   41,   41,   41,   45,   45,
+
+       45,   45,   45,   45,   50,   50,   50,   50,   50,   50,
+       58,   58,   55,   58,   58,   58,   92,   92,   55,   55,
+       55,   92,   94,   94,   55,   55,   94,   99,   99,   55,
+       55,   55,   99,   59,   59,   55,   59,   59,   59,   55,
        55,   55,   55,   55,   55,   55,   55,   55,   55,   55,
        55,   55,   55,   55,   55,   55,   55,   55,   55,   55,
        55,   55,   55,   55,   55,   55,   55,   55,   55,   55,
-       55,   55,   55,   55,   55,   55,   55,   55,   99,   97,
-       96,   94,   92,   55,   99,   97,   96,   94,   92,   55,
-      850,   11,  850,  850,  850,  850,  850,  850,  850,  850,
-      850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
-      850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
-      850,  850,  850,  850,  850,  850,  850,  850,  850,  850
+       55,   55,   55,   55,   55,   55,   55,   55,   55,   55,
+       55,   55,  100,   98,   97,   95,   93,   55,  100,   98,
+       97,   95,   93,   55,  872,   11,  872,  872,  872,  872,
+
+      872,  872,  872,  872,  872,  872,  872,  872,  872,  872,
+      872,  872,  872,  872,  872,  872,  872,  872,  872,  872,
+      872,  872,  872,  872,  872,  872,  872,  872,  872,  872,
+      872,  872,  872,  872
     } ;
 
-static yyconst flex_int16_t yy_chk[1791] =
+static yyconst flex_int16_t yy_chk[1835] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -915,194 +928,200 @@ static yyconst flex_int16_t yy_chk[1791] =
        13,    4,    6,    6,   13,    5,    6,    9,    9,    9,
        40,   40,    6,    7,    7,    7,    7,    9,    7,   10,
        10,   10,   23,   23,    7,    8,    8,    8,    8,   10,
-        8,   23,   16,  859,   16,   16,    8,   16,   21,   18,
+        8,   23,   16,  881,   16,   16,    8,   16,   21,   18,
        22,   18,   18,   16,   18,   20,   20,   21,   26,   21,
 
        29,   24,   21,   20,   22,   24,   25,   27,   28,   28,
-       30,   25,   26,   28,   24,   31,   34,   32,   66,   30,
-       29,   27,   32,   66,   30,   27,   33,   33,   28,   31,
-       35,   35,   31,   70,   34,   35,   32,   44,   70,   49,
-       44,   49,   49,   33,   49,   53,   53,   55,   65,   55,
-       55,   56,   55,   63,   58,   56,   58,   58,   61,   58,
-       62,   61,   64,   62,   67,   58,   68,   69,   72,   65,
-       63,   69,   71,   73,   79,   71,   73,   75,   71,   64,
-       73,   67,   74,   68,   75,   76,   74,   77,   78,   81,
-       82,   71,   72,   79,   77,   80,   83,   76,   84,   80,
-
-       78,   85,   85,   86,   82,   87,   81,   88,   89,   90,
-       92,   92,   88,   94,   83,   84,   94,   99,   99,   89,
-       86,   85,  102,  100,  106,   87,   90,   96,  100,   96,
-       96,  101,   96,  103,  111,  104,  102,  108,  103,  101,
-      104,  105,  108,  107,  109,  105,  106,  107,  110,  116,
-      105,  111,  855,  112,  105,  114,  114,  109,  112,  110,
-      105,  105,  110,  113,  115,  123,  117,  118,  113,  116,
-      115,  117,  118,  119,  120,  121,  124,  122,  119,  120,
-      125,  126,  121,  122,  123,  125,  127,  128,  130,  128,
-      129,  131,  133,  132,  133,  124,  131,  129,  132,  134,
-
-      136,  137,  126,  135,  137,  127,  130,  140,  135,  141,
-      133,  138,  138,  131,  136,  139,  139,  134,  142,  147,
-      143,  142,  140,  141,  143,  144,  144,  145,  146,  148,
-      149,  151,  145,  146,  150,  150,  152,  154,  147,  152,
-      153,  155,  149,  157,  157,  159,  154,  158,  151,  148,
-      158,  153,  155,  156,  160,  156,  156,  161,  162,  162,
-      163,  159,  164,  169,  159,  163,  161,  165,  160,  166,
-      167,  168,  165,  171,  170,  167,  168,  170,  166,  174,
-      173,  164,  169,  175,  176,  177,  171,  179,  174,  176,
-      178,  849,  170,  172,  173,  172,  172,  180,  182,  183,
-
-      179,  175,  180,  184,  177,  185,  172,  172,  172,  178,
-      181,  181,  186,  181,  183,  187,  189,  182,  184,  188,
-      189,  190,  185,  192,  187,  186,  191,  195,  188,  192,
-      190,  191,  193,  193,  194,  196,  187,  197,  195,  194,
-      196,  198,  198,  200,  200,  201,  202,  203,  204,  208,
-      206,  209,  211,  842,  202,  207,  203,  197,  206,  204,
-      207,  214,  210,  210,  216,  201,  208,  212,  217,  209,
-      210,  211,  212,  213,  213,  215,  215,  212,  216,  217,
-      218,  219,  221,  220,  224,  214,  223,  210,  220,  222,
-      226,  223,  225,  225,  227,  228,  224,  227,  218,  238,
-
-      221,  841,  219,  222,  226,  229,  229,  228,  230,  230,
-      231,  232,  232,  233,  233,  231,  234,  235,  238,  236,
-      234,  237,  235,  236,  239,  240,  237,  243,  241,  239,
-      243,  241,  242,  242,  289,  245,  241,  244,  240,  241,
-      245,  244,  246,  247,  251,  248,  250,  246,  248,  247,
-      249,  250,  252,  249,  253,  254,  257,  255,  289,  253,
-      255,  251,  244,  259,  254,  252,  256,  256,  258,  260,
-      264,  261,  258,  262,  262,  257,  261,  259,  263,  265,
-      266,  267,  263,  260,  268,  264,  269,  271,  267,  268,
-      270,  269,  266,  272,  273,  270,  274,  265,  277,  274,
-
-      275,  275,  272,  278,  271,  279,  282,  273,  285,  287,
-      293,  278,  288,  285,  287,  277,  290,  290,  291,  279,
-      292,  292,  282,  286,  293,  291,  308,  286,  298,  288,
-      286,  294,  294,  295,  286,  296,  295,  297,  297,  308,
-      286,  286,  298,  296,  299,  299,  300,  301,  302,  300,
-      303,  304,  305,  301,  306,  311,  302,  305,  303,  307,
-      307,  306,  309,  309,  311,  312,  313,  314,  304,  312,
-      315,  318,  316,  317,  320,  319,  315,  321,  317,  320,
-      314,  322,  322,  324,  313,  316,  319,  323,  326,  318,
-      323,  325,  327,  327,  328,  329,  330,  321,  331,  333,
-
-      324,  332,  335,  325,  338,  334,  334,  326,  328,  338,
-      336,  340,  331,  334,  332,  335,  337,  337,  329,  333,
-      330,  336,  341,  339,  340,  342,  342,  344,  346,  347,
-      334,  339,  344,  345,  348,  350,  345,  349,  351,  348,
-      341,  347,  349,  353,  354,  355,  346,  356,  361,  354,
-      355,  351,  356,  357,  350,  358,  358,  353,  359,  364,
-      365,  362,  357,  359,  362,  363,  366,  361,  363,  367,
-      368,  366,  369,  368,  367,  370,  364,  371,  373,  365,
-      370,  374,  369,  372,  372,  375,  376,  378,  377,  375,
-      381,  371,  380,  383,  374,  381,  373,  377,  382,  382,
-
-      384,  385,  387,  376,  386,  380,  385,  388,  386,  384,
-      383,  378,  389,  390,  391,  393,  387,  392,  394,  395,
-      399,  388,  397,  392,  398,  403,  403,  840,  395,  393,
-      389,  391,  398,  390,  405,  397,  400,  394,  401,  399,
-      402,  400,  401,  401,  404,  402,  406,  405,  407,  404,
-      408,  409,  411,  407,  410,  408,  409,  412,  410,  414,
-      413,  411,  418,  406,  838,  411,  419,  411,  413,  411,
-      415,  415,  416,  416,  419,  412,  421,  414,  417,  417,
-      420,  418,  421,  422,  424,  420,  425,  426,  427,  424,
-      422,  425,  426,  428,  429,  429,  430,  427,  431,  433,
-
-      434,  435,  436,  433,  433,  437,  436,  438,  439,  440,
-      443,  428,  441,  444,  440,  430,  442,  431,  435,  441,
-      438,  442,  444,  437,  445,  434,  439,  443,  446,  447,
-      448,  449,  450,  450,  447,  448,  449,  452,  445,  453,
-      453,  454,  454,  455,  457,  456,  458,  459,  446,  455,
-      456,  460,  462,  461,  463,  452,  464,  464,  465,  465,
-      471,  473,  457,  471,  458,  459,  461,  472,  463,  460,
-      466,  467,  462,  474,  476,  466,  467,  475,  475,  477,
-      477,  472,  478,  480,  479,  473,  482,  474,  479,  483,
-      484,  487,  478,  476,  486,  488,  484,  489,  495,  486,
-
-      490,  480,  491,  482,  494,  490,  493,  491,  483,  492,
-      492,  493,  488,  496,  497,  487,  489,  495,  498,  499,
-      500,  494,  501,  502,  499,  503,  506,  497,  507,  508,
-      498,  512,  496,  509,  503,  506,  503,  514,  508,  500,
-      508,  501,  509,  502,  510,  513,  507,  511,  511,  510,
-      512,  515,  518,  517,  514,  518,  520,  513,  517,  519,
-      521,  518,  522,  524,  515,  525,  526,  519,  528,  525,
-      527,  526,  529,  520,  530,  527,  533,  528,  521,  522,
-      531,  533,  524,  532,  532,  530,  529,  534,  534,  531,
-      535,  535,  536,  536,  537,  539,  540,  537,  541,  542,
-
-      539,  543,  543,  541,  544,  549,  545,  546,  547,  544,
-      548,  550,  550,  540,  551,  553,  552,  545,  555,  545,
-      556,  551,  560,  542,  545,  552,  546,  547,  558,  548,
-      549,  554,  554,  558,  559,  556,  562,  561,  563,  559,
-      553,  560,  564,  555,  561,  565,  569,  566,  567,  571,
-      565,  566,  566,  567,  562,  564,  568,  569,  563,  570,
-      572,  568,  573,  570,  574,  572,  575,  575,  576,  578,
-      578,  582,  583,  571,  588,  574,  582,  584,  584,  576,
-      578,  590,  585,  573,  585,  586,  586,  591,  583,  589,
-      589,  592,  593,  588,  594,  595,  598,  596,  591,  596,
-
-      595,  590,  592,  593,  597,  597,  599,  600,  594,  600,
-      601,  599,  602,  603,  604,  601,  607,  602,  605,  606,
-      608,  598,  609,  605,  606,  607,  617,  607,  610,  611,
-      603,  613,  608,  604,  836,  611,  614,  613,  615,  615,
-      616,  609,  618,  610,  617,  614,  618,  619,  622,  616,
-      620,  620,  619,  622,  623,  624,  625,  626,  623,  627,
-      628,  630,  646,  631,  630,  646,  632,  633,  633,  624,
-      627,  634,  634,  636,  625,  631,  638,  626,  632,  642,
-      628,  635,  635,  637,  637,  636,  640,  641,  641,  643,
-      643,  640,  644,  645,  638,  647,  647,  642,  649,  645,
-
-      648,  648,  650,  650,  651,  653,  652,  654,  655,  644,
-      647,  652,  658,  659,  656,  666,  654,  655,  656,  653,
-      660,  660,  659,  649,  651,  661,  663,  663,  664,  832,
-      661,  658,  664,  665,  666,  667,  665,  668,  669,  670,
-      667,  671,  668,  672,  669,  673,  671,  673,  676,  676,
-      685,  672,  678,  678,  670,  679,  679,  681,  681,  683,
-      684,  684,  686,  687,  683,  685,  689,  690,  687,  690,
-      691,  689,  692,  693,  694,  695,  696,  696,  697,  698,
-      699,  691,  700,  686,  693,  694,  695,  697,  702,  692,
-      703,  703,  704,  705,  700,  707,  706,  708,  708,  699,
-
-      710,  709,  711,  712,  698,  702,  709,  716,  720,  704,
-      705,  706,  717,  707,  710,  717,  718,  718,  719,  722,
-      711,  724,  712,  721,  721,  720,  716,  723,  723,  725,
-      726,  727,  719,  729,  730,  726,  727,  722,  725,  730,
-      731,  732,  724,  733,  735,  731,  734,  729,  733,  736,
-      737,  737,  738,  735,  740,  732,  741,  734,  736,  742,
-      742,  738,  743,  745,  748,  744,  747,  751,  745,  750,
-      750,  743,  740,  744,  741,  747,  748,  752,  752,  753,
-      754,  754,  753,  755,  755,  756,  751,  757,  758,  758,
-      759,  760,  757,  761,  759,  762,  764,  763,  756,  765,
-
-      767,  761,  763,  766,  769,  770,  777,  769,  773,  760,
-      762,  830,  766,  771,  771,  764,  772,  773,  775,  767,
-      772,  776,  770,  784,  765,  780,  780,  775,  781,  783,
-      777,  785,  776,  786,  783,  787,  788,  781,  789,  790,
-      791,  784,  796,  789,  788,  785,  792,  792,  786,  793,
-      795,  795,  797,  787,  793,  798,  798,  800,  791,  799,
-      799,  796,  801,  844,  790,  802,  802,  804,  800,  803,
-      803,  805,  844,  797,  806,  806,  805,  807,  807,  808,
-      808,  801,  809,  810,  810,  804,  822,  809,  812,  812,
-      814,  814,  815,  818,  818,  819,  833,  815,  823,  828,
-
-      819,  843,  823,  827,  827,  822,  829,  831,  831,  845,
-      829,  834,  834,  833,  835,  835,  837,  837,  839,  839,
-      843,  846,  847,  845,  848,  848,  826,  825,  824,  821,
-      820,  817,  816,  813,  846,  811,  794,  782,  779,  778,
-      847,  851,  851,  851,  851,  851,  851,  852,  852,  852,
-      852,  852,  852,  853,  853,  853,  853,  853,  853,  854,
-      854,  854,  854,  854,  854,  856,  856,  774,  856,  856,
-      856,  857,  857,  768,  749,  746,  857,  858,  858,  739,
-      728,  858,  860,  860,  715,  714,  713,  860,  861,  861,
-      701,  861,  861,  861,  688,  682,  680,  677,  675,  674,
-
-      662,  657,  639,  629,  621,  612,  587,  581,  580,  579,
-      577,  557,  538,  523,  516,  505,  504,  485,  481,  470,
-      469,  468,  451,  432,  423,  396,  379,  360,  352,  343,
-      310,  284,  283,  281,  280,  276,  205,  199,   98,   97,
-       95,   93,   91,   54,   50,   46,   45,   41,   36,   12,
-       11,  850,  850,  850,  850,  850,  850,  850,  850,  850,
-      850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
-      850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
-      850,  850,  850,  850,  850,  850,  850,  850,  850,  850
+       30,   25,   26,   28,   24,   31,   34,   32,   63,   30,
+       29,   27,   32,   44,   30,   27,   44,   30,   28,   31,
+       33,   33,   31,  877,   34,   63,   32,   35,   35,   53,
+       53,   49,   35,   49,   49,   56,   49,   33,   55,   56,
+       55,   55,   58,   55,   58,   58,   61,   58,   62,   61,
+       64,   62,   65,   58,   66,   67,   69,   68,   70,   66,
+       69,   72,   71,   70,   75,   71,   74,   64,   71,   81,
+       74,   75,   67,   65,   68,   73,   76,   77,   73,   78,
+       79,   71,   73,   80,   77,   72,   81,   80,   76,   82,
+
+       83,   78,   84,   88,   85,   86,   86,   87,   82,   79,
+       89,   90,   91,  871,   83,   89,   93,   93,  100,  100,
+       84,   85,   90,   88,   87,   86,  103,   95,  107,   91,
+       95,   97,  101,   97,   97,  102,   97,  101,  108,  104,
+      103,  105,  108,  102,  104,  110,  105,  106,  109,  116,
+      107,  106,  112,  109,  111,  116,  106,  113,  110,  114,
+      106,  117,  113,  864,  114,  111,  106,  106,  111,  112,
+      115,  115,  118,  119,  120,  121,  122,  118,  119,  120,
+      121,  117,  123,  122,  124,  125,  126,  127,  123,  128,
+      129,  130,  127,  130,  131,  132,  135,  133,  135,  134,
+
+      136,  131,  133,  124,  134,  126,  125,  137,  138,  129,
+      128,  142,  137,  132,  135,  140,  140,  139,  136,  133,
+      139,  143,  138,  141,  141,  144,  142,  145,  144,  146,
+      146,  145,  147,  148,  149,  143,  150,  147,  148,  151,
+      152,  152,  153,  154,  155,  156,  154,  157,  159,  159,
+      161,  151,  863,  149,  156,  155,  150,  162,  157,  153,
+      158,  160,  158,  158,  160,  163,  161,  164,  164,  161,
+      166,  162,  165,  165,  163,  166,  167,  168,  169,  170,
+      171,  172,  168,  173,  170,  171,  173,  169,  177,  174,
+      176,  178,  180,  179,  181,  167,  862,  177,  179,  182,
+
+      172,  173,  174,  175,  176,  175,  175,  185,  186,  178,
+      183,  180,  182,  181,  187,  183,  175,  175,  175,  184,
+      184,  188,  184,  186,  189,  190,  185,  191,  192,  187,
+      193,  200,  192,  860,  190,  194,  191,  189,  188,  193,
+      194,  195,  196,  196,  197,  198,  190,  195,  199,  197,
+      204,  200,  205,  199,  201,  201,  198,  203,  203,  206,
+      205,  207,  209,  210,  211,  212,  213,  215,  206,  211,
+      204,  210,  207,  217,  217,  214,  214,  218,  219,  219,
+      216,  209,  212,  214,  213,  216,  215,  221,  220,  222,
+      216,  223,  224,  225,  226,  229,  229,  224,  221,  227,
+
+      214,  218,  220,  228,  227,  230,  231,  222,  226,  231,
+      232,  225,  223,  233,  233,  228,  234,  234,  235,  230,
+      236,  236,  232,  235,  237,  237,  238,  239,  242,  240,
+      238,  241,  239,  240,  243,  244,  241,  247,  245,  243,
+      247,  245,  246,  246,  858,  255,  245,  242,  244,  245,
+      248,  249,  250,  251,  248,  252,  249,  250,  252,  251,
+      253,  254,  255,  253,  256,  257,  254,  258,  260,  259,
+      257,  260,  258,  261,  261,  248,  262,  256,  259,  263,
+      264,  266,  265,  263,  267,  267,  266,  268,  269,  270,
+      271,  268,  272,  273,  264,  262,  265,  276,  273,  272,
+
+      274,  275,  271,  269,  277,  274,  275,  270,  278,  279,
+      280,  280,  279,  277,  276,  282,  283,  284,  287,  293,
+      290,  278,  292,  294,  283,  290,  296,  292,  295,  295,
+      298,  284,  282,  296,  287,  291,  293,  297,  297,  291,
+      299,  299,  291,  301,  298,  300,  291,  294,  300,  302,
+      302,  301,  291,  291,  303,  304,  304,  305,  306,  307,
+      305,  308,  309,  314,  306,  310,  311,  307,  303,  308,
+      310,  312,  312,  311,  317,  313,  314,  315,  315,  309,
+      313,  318,  319,  317,  320,  318,  321,  324,  322,  323,
+      326,  325,  321,  327,  323,  326,  331,  320,  328,  328,
+
+      319,  322,  325,  329,  330,  324,  329,  332,  331,  333,
+      333,  334,  335,  327,  336,  337,  339,  338,  341,  340,
+      340,  330,  342,  343,  343,  334,  332,  340,  346,  337,
+      338,  341,  344,  342,  345,  335,  339,  344,  336,  347,
+      352,  346,  345,  350,  340,  348,  348,  351,  350,  353,
+      351,  354,  356,  357,  355,  359,  354,  347,  352,  355,
+      360,  353,  361,  362,  363,  360,  357,  361,  362,  359,
+      368,  356,  365,  363,  364,  364,  371,  365,  367,  367,
+      369,  370,  367,  369,  370,  372,  373,  374,  376,  368,
+      377,  373,  374,  371,  375,  377,  378,  375,  376,  379,
+
+      379,  380,  381,  382,  372,  383,  385,  382,  384,  388,
+      378,  387,  389,  389,  388,  381,  390,  384,  391,  380,
+      392,  394,  383,  395,  387,  392,  396,  391,  393,  397,
+      385,  398,  393,  390,  399,  394,  400,  395,  401,  404,
+      399,  406,  402,  854,  396,  405,  410,  410,  398,  397,
+      400,  402,  404,  405,  407,  412,  409,  401,  408,  407,
+      406,  409,  408,  408,  411,  413,  414,  415,  412,  411,
+      416,  414,  415,  417,  418,  416,  419,  417,  420,  421,
+      419,  423,  413,  418,  430,  422,  427,  418,  428,  418,
+      430,  418,  420,  422,  424,  424,  428,  421,  443,  423,
+
+      425,  425,  426,  426,  429,  427,  431,  433,  436,  429,
+      434,  435,  433,  431,  437,  434,  435,  436,  438,  438,
+      439,  440,  442,  443,  444,  445,  442,  442,  446,  445,
+      447,  448,  437,  449,  452,  450,  455,  852,  449,  439,
+      440,  444,  450,  447,  453,  451,  446,  454,  461,  448,
+      451,  452,  456,  453,  457,  458,  455,  456,  471,  457,
+      458,  454,  459,  459,  462,  462,  461,  463,  463,  464,
+      466,  465,  467,  468,  469,  464,  465,  850,  471,  484,
+      470,  472,  473,  473,  475,  474,  476,  476,  466,  474,
+      467,  468,  469,  470,  477,  472,  475,  478,  482,  477,
+
+      483,  482,  478,  484,  485,  486,  486,  487,  488,  488,
+      489,  490,  491,  494,  483,  490,  493,  495,  485,  497,
+      489,  498,  499,  495,  497,  500,  487,  503,  503,  501,
+      491,  502,  494,  493,  501,  504,  502,  505,  506,  499,
+      504,  507,  508,  510,  500,  498,  509,  511,  510,  512,
+      513,  518,  514,  517,  505,  508,  519,  506,  509,  523,
+      507,  514,  517,  514,  520,  519,  511,  519,  512,  518,
+      513,  521,  524,  520,  522,  522,  521,  525,  523,  526,
+      527,  528,  528,  530,  524,  532,  531,  533,  530,  531,
+      534,  537,  526,  532,  525,  531,  535,  527,  538,  848,
+
+      539,  540,  538,  541,  533,  539,  540,  542,  534,  543,
+      537,  555,  541,  535,  544,  545,  545,  546,  547,  547,
+      543,  542,  546,  544,  548,  548,  549,  549,  550,  552,
+      553,  550,  554,  558,  552,  555,  557,  554,  556,  556,
+      559,  557,  560,  561,  558,  562,  558,  553,  563,  563,
+      564,  558,  566,  568,  565,  567,  567,  564,  569,  559,
+      571,  560,  561,  565,  572,  571,  573,  574,  577,  572,
+      562,  575,  576,  569,  574,  578,  575,  566,  568,  579,
+      586,  576,  580,  584,  581,  573,  577,  580,  581,  581,
+      588,  582,  579,  583,  584,  578,  582,  585,  583,  589,
+
+      587,  585,  590,  590,  586,  587,  591,  593,  593,  597,
+      589,  588,  598,  603,  597,  599,  599,  591,  593,  600,
+      605,  600,  601,  601,  604,  604,  606,  607,  598,  609,
+      608,  610,  603,  611,  613,  611,  610,  606,  607,  618,
+      605,  608,  614,  609,  612,  612,  615,  614,  615,  616,
+      617,  619,  620,  621,  616,  617,  618,  620,  621,  613,
+      622,  623,  624,  625,  626,  627,  628,  641,  631,  634,
+      619,  624,  628,  624,  623,  625,  630,  631,  622,  633,
+      627,  641,  630,  626,  632,  632,  635,  634,  633,  636,
+      635,  637,  637,  639,  636,  640,  642,  643,  639,  640,
+
+      644,  645,  647,  648,  649,  647,  650,  650,  651,  651,
+      653,  644,  652,  652,  642,  648,  649,  643,  654,  654,
+      655,  645,  653,  657,  658,  658,  659,  662,  657,  660,
+      660,  661,  663,  662,  666,  663,  664,  664,  655,  665,
+      665,  667,  667,  668,  659,  669,  669,  670,  661,  671,
+      672,  664,  666,  673,  671,  675,  674,  677,  680,  675,
+      678,  847,  673,  680,  672,  674,  685,  670,  668,  678,
+      679,  679,  682,  682,  683,  689,  677,  684,  683,  686,
+      684,  687,  688,  691,  686,  685,  687,  690,  688,  702,
+      689,  691,  690,  692,  702,  692,  695,  695,  697,  697,
+
+      698,  698,  700,  700,  703,  703,  704,  705,  706,  708,
+      708,  710,  711,  706,  711,  712,  710,  713,  714,  715,
+      716,  704,  717,  717,  718,  719,  712,  720,  705,  714,
+      715,  716,  721,  718,  713,  723,  724,  724,  725,  726,
+      728,  733,  727,  732,  721,  731,  720,  729,  729,  730,
+      719,  737,  723,  740,  730,  725,  726,  727,  728,  731,
+      733,  732,  738,  739,  739,  738,  741,  740,  743,  743,
+      737,  744,  745,  745,  746,  747,  748,  749,  751,  754,
+      752,  748,  749,  741,  747,  752,  753,  756,  757,  744,
+      762,  753,  751,  754,  755,  746,  758,  757,  756,  755,
+
+      759,  759,  760,  763,  765,  758,  764,  764,  762,  766,
+      767,  760,  770,  765,  769,  767,  773,  766,  772,  772,
+      778,  763,  782,  769,  770,  774,  774,  775,  776,  776,
+      775,  777,  777,  778,  779,  773,  780,  780,  781,  779,
+      782,  783,  781,  784,  786,  785,  787,  788,  789,  783,
+      785,  791,  792,  794,  791,  795,  788,  794,  784,  793,
+      793,  797,  798,  786,  795,  799,  806,  789,  803,  792,
+      797,  787,  807,  798,  802,  802,  805,  803,  808,  809,
+      810,  805,  811,  812,  806,  813,  807,  811,  810,  799,
+      814,  814,  818,  808,  815,  817,  817,  809,  819,  815,
+
+      820,  820,  822,  813,  821,  821,  823,  868,  812,  824,
+      824,  818,  826,  822,  825,  825,  827,  828,  828,  819,
+      868,  827,  829,  829,  831,  823,  830,  830,  844,  831,
+      826,  832,  832,  834,  834,  836,  836,  837,  840,  840,
+      841,  855,  837,  846,  845,  841,  865,  844,  845,  849,
+      849,  851,  853,  853,  867,  851,  856,  856,  855,  857,
+      857,  859,  859,  861,  861,  865,  866,  869,  867,  870,
+      870,  843,  842,  839,  838,  866,  835,  833,  816,  804,
+      801,  800,  796,  790,  771,  869,  873,  873,  873,  873,
+      873,  873,  874,  874,  874,  874,  874,  874,  875,  875,
+
+      875,  875,  875,  875,  876,  876,  876,  876,  876,  876,
+      878,  878,  768,  878,  878,  878,  879,  879,  761,  750,
+      742,  879,  880,  880,  736,  735,  880,  882,  882,  734,
+      722,  709,  882,  883,  883,  707,  883,  883,  883,  701,
+      699,  696,  694,  693,  681,  676,  656,  646,  638,  629,
+      602,  596,  595,  594,  592,  570,  551,  536,  529,  516,
+      515,  496,  492,  481,  480,  479,  460,  441,  432,  403,
+      386,  366,  358,  349,  316,  289,  288,  286,  285,  281,
+      208,  202,   99,   98,   96,   94,   92,   54,   50,   46,
+       45,   41,   36,   12,   11,  872,  872,  872,  872,  872,
+
+      872,  872,  872,  872,  872,  872,  872,  872,  872,  872,
+      872,  872,  872,  872,  872,  872,  872,  872,  872,  872,
+      872,  872,  872,  872,  872,  872,  872,  872,  872,  872,
+      872,  872,  872,  872
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1214,7 +1233,7 @@ static void config_end_include(void)
 #define YY_NO_INPUT 1
 #endif
 
-#line 1217 "<stdout>"
+#line 1236 "<stdout>"
 
 #define INITIAL 0
 #define quotedstring 1
@@ -1400,7 +1419,7 @@ YY_DECL
     
 #line 107 "util/configlexer.lex"
 
-#line 1403 "<stdout>"
+#line 1422 "<stdout>"
 
        if ( !(yy_init) )
                {
@@ -1459,13 +1478,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 >= 851 )
+                               if ( yy_current_state >= 873 )
                                        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] != 1752 );
+               while ( yy_base[yy_current_state] != 1796 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -1712,201 +1731,211 @@ YY_RULE_SETUP
 case 45:
 YY_RULE_SETUP
 #line 152 "util/configlexer.lex"
-{ YDOUT; return VAR_STUB_ZONE;}
+{ YDOUT; return VAR_PRIVATE_ADDRESS;}
        YY_BREAK
 case 46:
 YY_RULE_SETUP
 #line 153 "util/configlexer.lex"
-{ YDOUT; return VAR_NAME;}
+{ YDOUT; return VAR_PRIVATE_DOMAIN;}
        YY_BREAK
 case 47:
 YY_RULE_SETUP
 #line 154 "util/configlexer.lex"
-{ YDOUT; return VAR_STUB_ADDR;}
+{ YDOUT; return VAR_STUB_ZONE;}
        YY_BREAK
 case 48:
 YY_RULE_SETUP
 #line 155 "util/configlexer.lex"
-{ YDOUT; return VAR_STUB_HOST;}
+{ YDOUT; return VAR_NAME;}
        YY_BREAK
 case 49:
 YY_RULE_SETUP
 #line 156 "util/configlexer.lex"
-{ YDOUT; return VAR_FORWARD_ZONE;}
+{ YDOUT; return VAR_STUB_ADDR;}
        YY_BREAK
 case 50:
 YY_RULE_SETUP
 #line 157 "util/configlexer.lex"
-{ YDOUT; return VAR_FORWARD_ADDR;}
+{ YDOUT; return VAR_STUB_HOST;}
        YY_BREAK
 case 51:
 YY_RULE_SETUP
 #line 158 "util/configlexer.lex"
-{ YDOUT; return VAR_FORWARD_HOST;}
+{ YDOUT; return VAR_FORWARD_ZONE;}
        YY_BREAK
 case 52:
 YY_RULE_SETUP
 #line 159 "util/configlexer.lex"
-{ YDOUT; return VAR_DO_NOT_QUERY_ADDRESS;}
+{ YDOUT; return VAR_FORWARD_ADDR;}
        YY_BREAK
 case 53:
 YY_RULE_SETUP
 #line 160 "util/configlexer.lex"
-{ YDOUT; return VAR_DO_NOT_QUERY_LOCALHOST;}
+{ YDOUT; return VAR_FORWARD_HOST;}
        YY_BREAK
 case 54:
 YY_RULE_SETUP
 #line 161 "util/configlexer.lex"
-{ YDOUT; return VAR_ACCESS_CONTROL;}
+{ YDOUT; return VAR_DO_NOT_QUERY_ADDRESS;}
        YY_BREAK
 case 55:
 YY_RULE_SETUP
 #line 162 "util/configlexer.lex"
-{ YDOUT; return VAR_HIDE_IDENTITY;}
+{ YDOUT; return VAR_DO_NOT_QUERY_LOCALHOST;}
        YY_BREAK
 case 56:
 YY_RULE_SETUP
 #line 163 "util/configlexer.lex"
-{ YDOUT; return VAR_HIDE_VERSION;}
+{ YDOUT; return VAR_ACCESS_CONTROL;}
        YY_BREAK
 case 57:
 YY_RULE_SETUP
 #line 164 "util/configlexer.lex"
-{ YDOUT; return VAR_IDENTITY;}
+{ YDOUT; return VAR_HIDE_IDENTITY;}
        YY_BREAK
 case 58:
 YY_RULE_SETUP
 #line 165 "util/configlexer.lex"
-{ YDOUT; return VAR_VERSION;}
+{ YDOUT; return VAR_HIDE_VERSION;}
        YY_BREAK
 case 59:
 YY_RULE_SETUP
 #line 166 "util/configlexer.lex"
-{ YDOUT; return VAR_MODULE_CONF;}
+{ YDOUT; return VAR_IDENTITY;}
        YY_BREAK
 case 60:
 YY_RULE_SETUP
 #line 167 "util/configlexer.lex"
-{ YDOUT; return VAR_DLV_ANCHOR;}
+{ YDOUT; return VAR_VERSION;}
        YY_BREAK
 case 61:
 YY_RULE_SETUP
 #line 168 "util/configlexer.lex"
-{ YDOUT; return VAR_DLV_ANCHOR_FILE;}
+{ YDOUT; return VAR_MODULE_CONF;}
        YY_BREAK
 case 62:
 YY_RULE_SETUP
 #line 169 "util/configlexer.lex"
-{ YDOUT; return VAR_TRUST_ANCHOR_FILE;}
+{ YDOUT; return VAR_DLV_ANCHOR;}
        YY_BREAK
 case 63:
 YY_RULE_SETUP
 #line 170 "util/configlexer.lex"
-{ YDOUT; return VAR_TRUSTED_KEYS_FILE;}
+{ YDOUT; return VAR_DLV_ANCHOR_FILE;}
        YY_BREAK
 case 64:
 YY_RULE_SETUP
 #line 171 "util/configlexer.lex"
-{ YDOUT; return VAR_TRUST_ANCHOR;}
+{ YDOUT; return VAR_TRUST_ANCHOR_FILE;}
        YY_BREAK
 case 65:
 YY_RULE_SETUP
 #line 172 "util/configlexer.lex"
-{ YDOUT; return VAR_VAL_OVERRIDE_DATE;}
+{ YDOUT; return VAR_TRUSTED_KEYS_FILE;}
        YY_BREAK
 case 66:
 YY_RULE_SETUP
 #line 173 "util/configlexer.lex"
-{ YDOUT; return VAR_BOGUS_TTL;}
+{ YDOUT; return VAR_TRUST_ANCHOR;}
        YY_BREAK
 case 67:
 YY_RULE_SETUP
 #line 174 "util/configlexer.lex"
-{ YDOUT; return VAR_VAL_CLEAN_ADDITIONAL;}
+{ YDOUT; return VAR_VAL_OVERRIDE_DATE;}
        YY_BREAK
 case 68:
 YY_RULE_SETUP
 #line 175 "util/configlexer.lex"
-{ YDOUT; return VAR_VAL_PERMISSIVE_MODE;}
+{ YDOUT; return VAR_BOGUS_TTL;}
        YY_BREAK
 case 69:
 YY_RULE_SETUP
 #line 176 "util/configlexer.lex"
-{ YDOUT; return VAR_KEY_CACHE_SIZE;}
+{ YDOUT; return VAR_VAL_CLEAN_ADDITIONAL;}
        YY_BREAK
 case 70:
 YY_RULE_SETUP
 #line 177 "util/configlexer.lex"
-{ YDOUT; return VAR_KEY_CACHE_SLABS;}
+{ YDOUT; return VAR_VAL_PERMISSIVE_MODE;}
        YY_BREAK
 case 71:
 YY_RULE_SETUP
 #line 178 "util/configlexer.lex"
-{ YDOUT; return VAR_NEG_CACHE_SIZE;}
+{ YDOUT; return VAR_KEY_CACHE_SIZE;}
        YY_BREAK
 case 72:
 YY_RULE_SETUP
 #line 179 "util/configlexer.lex"
-{ YDOUT; return VAR_VAL_NSEC3_KEYSIZE_ITERATIONS;}
+{ YDOUT; return VAR_KEY_CACHE_SLABS;}
        YY_BREAK
 case 73:
 YY_RULE_SETUP
 #line 180 "util/configlexer.lex"
-{ YDOUT; return VAR_USE_SYSLOG;}
+{ YDOUT; return VAR_NEG_CACHE_SIZE;}
        YY_BREAK
 case 74:
 YY_RULE_SETUP
 #line 181 "util/configlexer.lex"
-{ YDOUT; return VAR_LOCAL_ZONE;}
+{ YDOUT; return VAR_VAL_NSEC3_KEYSIZE_ITERATIONS;}
        YY_BREAK
 case 75:
 YY_RULE_SETUP
 #line 182 "util/configlexer.lex"
-{ YDOUT; return VAR_LOCAL_DATA;}
+{ YDOUT; return VAR_USE_SYSLOG;}
        YY_BREAK
 case 76:
 YY_RULE_SETUP
 #line 183 "util/configlexer.lex"
-{ YDOUT; return VAR_STATISTICS_INTERVAL;}
+{ YDOUT; return VAR_LOCAL_ZONE;}
        YY_BREAK
 case 77:
 YY_RULE_SETUP
 #line 184 "util/configlexer.lex"
-{ YDOUT; return VAR_STATISTICS_CUMULATIVE;}
+{ YDOUT; return VAR_LOCAL_DATA;}
        YY_BREAK
 case 78:
-/* rule 78 can match eol */
 YY_RULE_SETUP
 #line 185 "util/configlexer.lex"
+{ YDOUT; return VAR_STATISTICS_INTERVAL;}
+       YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 186 "util/configlexer.lex"
+{ YDOUT; return VAR_STATISTICS_CUMULATIVE;}
+       YY_BREAK
+case 80:
+/* rule 80 can match eol */
+YY_RULE_SETUP
+#line 187 "util/configlexer.lex"
 { LEXOUT(("NL\n")); cfg_parser->line++;}
        YY_BREAK
 /* Quoted strings. Strip leading and ending quotes */
-case 79:
+case 81:
 YY_RULE_SETUP
-#line 188 "util/configlexer.lex"
+#line 190 "util/configlexer.lex"
 { BEGIN(quotedstring); LEXOUT(("QS ")); }
        YY_BREAK
 case YY_STATE_EOF(quotedstring):
-#line 189 "util/configlexer.lex"
+#line 191 "util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
         BEGIN(INITIAL);
 }
        YY_BREAK
-case 80:
+case 82:
 YY_RULE_SETUP
-#line 193 "util/configlexer.lex"
+#line 195 "util/configlexer.lex"
 { LEXOUT(("STR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 81:
-/* rule 81 can match eol */
+case 83:
+/* rule 83 can match eol */
 YY_RULE_SETUP
-#line 194 "util/configlexer.lex"
+#line 196 "util/configlexer.lex"
 { cfg_parser->line++; yymore(); }
        YY_BREAK
-case 82:
+case 84:
 YY_RULE_SETUP
-#line 195 "util/configlexer.lex"
+#line 197 "util/configlexer.lex"
 {
         LEXOUT(("QE "));
         BEGIN(INITIAL);
@@ -1918,32 +1947,32 @@ YY_RULE_SETUP
 }
        YY_BREAK
 /* Single Quoted strings. Strip leading and ending quotes */
-case 83:
+case 85:
 YY_RULE_SETUP
-#line 206 "util/configlexer.lex"
+#line 208 "util/configlexer.lex"
 { BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
        YY_BREAK
 case YY_STATE_EOF(singlequotedstr):
-#line 207 "util/configlexer.lex"
+#line 209 "util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
         BEGIN(INITIAL);
 }
        YY_BREAK
-case 84:
+case 86:
 YY_RULE_SETUP
-#line 211 "util/configlexer.lex"
+#line 213 "util/configlexer.lex"
 { LEXOUT(("STR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 85:
-/* rule 85 can match eol */
+case 87:
+/* rule 87 can match eol */
 YY_RULE_SETUP
-#line 212 "util/configlexer.lex"
+#line 214 "util/configlexer.lex"
 { cfg_parser->line++; yymore(); }
        YY_BREAK
-case 86:
+case 88:
 YY_RULE_SETUP
-#line 213 "util/configlexer.lex"
+#line 215 "util/configlexer.lex"
 {
         LEXOUT(("SQE "));
         BEGIN(INITIAL);
@@ -1955,37 +1984,37 @@ YY_RULE_SETUP
 }
        YY_BREAK
 /* include: directive */
-case 87:
+case 89:
 YY_RULE_SETUP
-#line 224 "util/configlexer.lex"
+#line 226 "util/configlexer.lex"
 { LEXOUT(("v(%s) ", yytext)); BEGIN(include); }
        YY_BREAK
 case YY_STATE_EOF(include):
-#line 225 "util/configlexer.lex"
+#line 227 "util/configlexer.lex"
 {
         yyerror("EOF inside include directive");
         BEGIN(INITIAL);
 }
        YY_BREAK
-case 88:
+case 90:
 YY_RULE_SETUP
-#line 229 "util/configlexer.lex"
+#line 231 "util/configlexer.lex"
 { LEXOUT(("ISP ")); /* ignore */ }
        YY_BREAK
-case 89:
-/* rule 89 can match eol */
+case 91:
+/* rule 91 can match eol */
 YY_RULE_SETUP
-#line 230 "util/configlexer.lex"
+#line 232 "util/configlexer.lex"
 { LEXOUT(("NL\n")); cfg_parser->line++;}
        YY_BREAK
-case 90:
+case 92:
 YY_RULE_SETUP
-#line 231 "util/configlexer.lex"
+#line 233 "util/configlexer.lex"
 { LEXOUT(("IQS ")); BEGIN(include_quoted); }
        YY_BREAK
-case 91:
+case 93:
 YY_RULE_SETUP
-#line 232 "util/configlexer.lex"
+#line 234 "util/configlexer.lex"
 {
        LEXOUT(("Iunquotedstr(%s) ", yytext));
        config_start_include(yytext);
@@ -1993,26 +2022,26 @@ YY_RULE_SETUP
 }
        YY_BREAK
 case YY_STATE_EOF(include_quoted):
-#line 237 "util/configlexer.lex"
+#line 239 "util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
         BEGIN(INITIAL);
 }
        YY_BREAK
-case 92:
+case 94:
 YY_RULE_SETUP
-#line 241 "util/configlexer.lex"
+#line 243 "util/configlexer.lex"
 { LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 93:
-/* rule 93 can match eol */
+case 95:
+/* rule 95 can match eol */
 YY_RULE_SETUP
-#line 242 "util/configlexer.lex"
+#line 244 "util/configlexer.lex"
 { cfg_parser->line++; yymore(); }
        YY_BREAK
-case 94:
+case 96:
 YY_RULE_SETUP
-#line 243 "util/configlexer.lex"
+#line 245 "util/configlexer.lex"
 {
        LEXOUT(("IQE "));
        yytext[yyleng - 1] = '\0';
@@ -2021,7 +2050,7 @@ YY_RULE_SETUP
 }
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 249 "util/configlexer.lex"
+#line 251 "util/configlexer.lex"
 {
        yy_set_bol(1); /* Set beginning of line, so "^" rules match.  */
        if (config_include_stack_ptr == 0) {
@@ -2032,18 +2061,18 @@ case YY_STATE_EOF(INITIAL):
        }
 }
        YY_BREAK
-case 95:
+case 97:
 YY_RULE_SETUP
-#line 259 "util/configlexer.lex"
+#line 261 "util/configlexer.lex"
 { LEXOUT(("unquotedstr(%s) ", yytext)); 
                        yylval.str = strdup(yytext); return STRING; }
        YY_BREAK
-case 96:
+case 98:
 YY_RULE_SETUP
-#line 262 "util/configlexer.lex"
+#line 264 "util/configlexer.lex"
 ECHO;
        YY_BREAK
-#line 2046 "<stdout>"
+#line 2075 "<stdout>"
 
        case YY_END_OF_BUFFER:
                {
@@ -2333,7 +2362,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 >= 851 )
+                       if ( yy_current_state >= 873 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2361,11 +2390,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 >= 851 )
+               if ( yy_current_state >= 873 )
                        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 == 850);
+       yy_is_jam = (yy_current_state == 872);
 
        return yy_is_jam ? 0 : yy_current_state;
 }
@@ -3002,7 +3031,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 262 "util/configlexer.lex"
+#line 264 "util/configlexer.lex"
 
 
 
index a29a6e67b8368315aea2a47a5a1e589a54b6a484..cdbb08b64bf62d4f7b53d8937e2f22dc5ab2a5bc 100644 (file)
@@ -149,6 +149,8 @@ harden-glue{COLON}  { YDOUT; return VAR_HARDEN_GLUE;}
 harden-dnssec-stripped{COLON}  { YDOUT; return VAR_HARDEN_DNNSEC_STRIPPED;}
 harden-referral-path{COLON}    { YDOUT; return VAR_HARDEN_REFERRAL_PATH;}
 use-caps-for-id{COLON} { YDOUT; return VAR_USE_CAPS_FOR_ID;}
+private-address{COLON} { YDOUT; return VAR_PRIVATE_ADDRESS;}
+private-domain{COLON}  { YDOUT; return VAR_PRIVATE_DOMAIN;}
 stub-zone{COLON}       { YDOUT; return VAR_STUB_ZONE;}
 name{COLON}            { YDOUT; return VAR_NAME;}
 stub-addr{COLON}       { YDOUT; return VAR_STUB_ADDR;}
index 1acb876ea29c5b0aca9e6ae88b3543bfb18e4e95..e5b61a77e824651386bc975046963a53422ab4c2 100644 (file)
      VAR_DLV_ANCHOR_FILE = 337,
      VAR_DLV_ANCHOR = 338,
      VAR_NEG_CACHE_SIZE = 339,
-     VAR_HARDEN_REFERRAL_PATH = 340
+     VAR_HARDEN_REFERRAL_PATH = 340,
+     VAR_PRIVATE_ADDRESS = 341,
+     VAR_PRIVATE_DOMAIN = 342
    };
 #endif
 /* Tokens.  */
 #define VAR_DLV_ANCHOR 338
 #define VAR_NEG_CACHE_SIZE 339
 #define VAR_HARDEN_REFERRAL_PATH 340
+#define VAR_PRIVATE_ADDRESS 341
+#define VAR_PRIVATE_DOMAIN 342
 
 
 
@@ -293,7 +297,7 @@ typedef union YYSTYPE
        char*   str;
 }
 /* Line 187 of yacc.c.  */
-#line 297 "util/configparser.c"
+#line 301 "util/configparser.c"
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -306,7 +310,7 @@ typedef union YYSTYPE
 
 
 /* Line 216 of yacc.c.  */
-#line 310 "util/configparser.c"
+#line 314 "util/configparser.c"
 
 #ifdef short
 # undef short
@@ -521,20 +525,20 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   151
+#define YYLAST   155
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  86
+#define YYNTOKENS  88
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  85
+#define YYNNTS  87
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  161
+#define YYNRULES  165
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  237
+#define YYNSTATES  243
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   340
+#define YYMAXUTOK   342
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -576,7 +580,7 @@ static const yytype_uint8 yytranslate[] =
       55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
       65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
       75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85
+      85,    86,    87
 };
 
 #if YYDEBUG
@@ -591,55 +595,56 @@ static const yytype_uint16 yyprhs[] =
       82,    84,    86,    88,    90,    92,    94,    96,    98,   100,
      102,   104,   106,   108,   110,   112,   114,   116,   118,   120,
      122,   124,   126,   128,   130,   132,   134,   136,   138,   140,
-     142,   144,   146,   148,   150,   152,   154,   156,   158,   161,
-     162,   164,   166,   168,   170,   173,   174,   176,   178,   180,
-     183,   186,   189,   192,   195,   198,   201,   204,   207,   210,
-     213,   216,   219,   222,   225,   228,   231,   234,   237,   240,
-     243,   246,   249,   252,   255,   258,   261,   264,   267,   270,
-     273,   276,   279,   282,   285,   288,   291,   294,   297,   300,
-     303,   306,   309,   312,   315,   318,   321,   324,   327,   330,
-     333,   336,   339,   342,   346,   349,   352,   355,   358,   361,
-     364,   367,   370,   373,   376,   380,   383,   386,   389,   392,
-     395,   398
+     142,   144,   146,   148,   150,   152,   154,   156,   158,   160,
+     162,   165,   166,   168,   170,   172,   174,   177,   178,   180,
+     182,   184,   187,   190,   193,   196,   199,   202,   205,   208,
+     211,   214,   217,   220,   223,   226,   229,   232,   235,   238,
+     241,   244,   247,   250,   253,   256,   259,   262,   265,   268,
+     271,   274,   277,   280,   283,   286,   289,   292,   295,   298,
+     301,   304,   307,   310,   313,   316,   319,   322,   325,   328,
+     331,   334,   337,   340,   343,   346,   349,   352,   356,   359,
+     362,   365,   368,   371,   374,   377,   380,   383,   386,   390,
+     393,   396,   399,   402,   405,   408
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int16 yyrhs[] =
 {
-      87,     0,    -1,    -1,    87,    88,    -1,    89,    90,    -1,
-      92,    93,    -1,    95,    96,    -1,    11,    -1,    90,    91,
-      -1,    -1,    98,    -1,    99,    -1,   102,    -1,   105,    -1,
-     111,    -1,   112,    -1,   113,    -1,   114,    -1,   103,    -1,
-     117,    -1,   118,    -1,   119,    -1,   120,    -1,   121,    -1,
-     133,    -1,   134,    -1,   135,    -1,   136,    -1,   137,    -1,
-     108,    -1,   138,    -1,   139,    -1,   142,    -1,   140,    -1,
-     141,    -1,   143,    -1,   144,    -1,   145,    -1,   150,    -1,
-     128,    -1,   129,    -1,   130,    -1,   131,    -1,   146,    -1,
-     153,    -1,   125,    -1,   127,    -1,   154,    -1,   156,    -1,
-     157,    -1,   158,    -1,   109,    -1,   132,    -1,   160,    -1,
-     161,    -1,   126,    -1,   159,    -1,   116,    -1,   104,    -1,
-     122,    -1,   151,    -1,   155,    -1,   147,    -1,   152,    -1,
-     163,    -1,   164,    -1,   110,    -1,   100,    -1,   115,    -1,
-     149,    -1,   101,    -1,   106,    -1,   107,    -1,   123,    -1,
-     124,    -1,   162,    -1,   148,    -1,    38,    -1,    93,    94,
-      -1,    -1,   165,    -1,   166,    -1,   167,    -1,    44,    -1,
-      96,    97,    -1,    -1,   168,    -1,   169,    -1,   170,    -1,
-      13,    10,    -1,    12,    10,    -1,    76,    10,    -1,    79,
-      10,    -1,    14,    10,    -1,    16,    10,    -1,    67,    10,
-      -1,    15,    10,    -1,    80,    10,    -1,    81,    10,    -1,
-      31,    10,    -1,    60,    10,    -1,    75,    10,    -1,    17,
-      10,    -1,    18,    10,    -1,    19,    10,    -1,    20,    10,
-      -1,    77,    10,    -1,    66,    10,    -1,    21,    10,    -1,
-      22,    10,    -1,    23,    10,    -1,    24,    10,    -1,    25,
-      10,    -1,    68,    10,    -1,    82,    10,    -1,    83,    10,
-      -1,    54,    10,    -1,    64,    10,    -1,    55,    10,    -1,
-      48,    10,    -1,    49,    10,    -1,    50,    10,    -1,    51,
-      10,    -1,    61,    10,    -1,    26,    10,    -1,    27,    10,
-      -1,    28,    10,    -1,    29,    10,    -1,    30,    10,    -1,
-      32,    10,    -1,    33,    10,    -1,    35,    10,    -1,    36,
-      10,    -1,    34,    10,    -1,    41,    10,    -1,    42,    10,
-      -1,    43,    10,    -1,    52,    10,    -1,    71,    10,    -1,
-      85,    10,    -1,    78,    10,    -1,    47,    10,    -1,    69,
+      89,     0,    -1,    -1,    89,    90,    -1,    91,    92,    -1,
+      94,    95,    -1,    97,    98,    -1,    11,    -1,    92,    93,
+      -1,    -1,   100,    -1,   101,    -1,   104,    -1,   107,    -1,
+     113,    -1,   114,    -1,   115,    -1,   116,    -1,   105,    -1,
+     119,    -1,   120,    -1,   121,    -1,   122,    -1,   123,    -1,
+     135,    -1,   136,    -1,   137,    -1,   138,    -1,   139,    -1,
+     110,    -1,   140,    -1,   141,    -1,   144,    -1,   142,    -1,
+     143,    -1,   145,    -1,   146,    -1,   147,    -1,   154,    -1,
+     130,    -1,   131,    -1,   132,    -1,   133,    -1,   148,    -1,
+     157,    -1,   127,    -1,   129,    -1,   158,    -1,   160,    -1,
+     161,    -1,   162,    -1,   111,    -1,   134,    -1,   164,    -1,
+     165,    -1,   128,    -1,   163,    -1,   118,    -1,   106,    -1,
+     124,    -1,   155,    -1,   159,    -1,   149,    -1,   156,    -1,
+     167,    -1,   168,    -1,   112,    -1,   102,    -1,   117,    -1,
+     151,    -1,   103,    -1,   108,    -1,   109,    -1,   125,    -1,
+     126,    -1,   166,    -1,   150,    -1,   152,    -1,   153,    -1,
+      38,    -1,    95,    96,    -1,    -1,   169,    -1,   170,    -1,
+     171,    -1,    44,    -1,    98,    99,    -1,    -1,   172,    -1,
+     173,    -1,   174,    -1,    13,    10,    -1,    12,    10,    -1,
+      76,    10,    -1,    79,    10,    -1,    14,    10,    -1,    16,
+      10,    -1,    67,    10,    -1,    15,    10,    -1,    80,    10,
+      -1,    81,    10,    -1,    31,    10,    -1,    60,    10,    -1,
+      75,    10,    -1,    17,    10,    -1,    18,    10,    -1,    19,
+      10,    -1,    20,    10,    -1,    77,    10,    -1,    66,    10,
+      -1,    21,    10,    -1,    22,    10,    -1,    23,    10,    -1,
+      24,    10,    -1,    25,    10,    -1,    68,    10,    -1,    82,
+      10,    -1,    83,    10,    -1,    54,    10,    -1,    64,    10,
+      -1,    55,    10,    -1,    48,    10,    -1,    49,    10,    -1,
+      50,    10,    -1,    51,    10,    -1,    61,    10,    -1,    26,
+      10,    -1,    27,    10,    -1,    28,    10,    -1,    29,    10,
+      -1,    30,    10,    -1,    32,    10,    -1,    33,    10,    -1,
+      35,    10,    -1,    36,    10,    -1,    34,    10,    -1,    41,
+      10,    -1,    42,    10,    -1,    43,    10,    -1,    52,    10,
+      -1,    71,    10,    -1,    85,    10,    -1,    78,    10,    -1,
+      86,    10,    -1,    87,    10,    -1,    47,    10,    -1,    69,
       10,    -1,    72,    10,    10,    -1,    53,    10,    -1,    56,
       10,    -1,    70,    10,    -1,    57,    10,    -1,    58,    10,
       -1,    59,    10,    -1,    65,    10,    -1,    62,    10,    -1,
@@ -652,23 +657,23 @@ static const yytype_int16 yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,    97,    97,    97,    98,    98,    99,   103,   108,   109,
-     110,   110,   110,   111,   111,   112,   112,   112,   113,   113,
-     113,   114,   114,   114,   115,   115,   116,   116,   117,   117,
-     118,   118,   119,   119,   120,   120,   121,   121,   122,   122,
-     123,   123,   123,   124,   124,   124,   125,   125,   125,   126,
-     126,   127,   127,   128,   128,   129,   129,   130,   130,   130,
-     131,   131,   132,   132,   133,   133,   133,   134,   134,   135,
-     135,   136,   136,   137,   137,   137,   138,   140,   152,   153,
-     154,   154,   154,   156,   168,   169,   170,   170,   170,   172,
-     181,   190,   201,   210,   219,   232,   247,   256,   265,   274,
-     283,   292,   301,   310,   319,   328,   337,   346,   360,   367,
-     374,   381,   389,   396,   403,   410,   417,   425,   433,   440,
-     449,   458,   465,   472,   483,   491,   504,   513,   521,   534,
-     543,   552,   561,   570,   583,   590,   600,   610,   620,   630,
-     640,   650,   657,   667,   681,   688,   706,   715,   724,   734,
-     744,   751,   759,   772,   780,   799,   806,   813,   820,   827,
-     834,   841
+       0,    98,    98,    98,    99,    99,   100,   104,   109,   110,
+     111,   111,   111,   112,   112,   113,   113,   113,   114,   114,
+     114,   115,   115,   115,   116,   116,   117,   117,   118,   118,
+     119,   119,   120,   120,   121,   121,   122,   122,   123,   123,
+     124,   124,   124,   125,   125,   125,   126,   126,   126,   127,
+     127,   128,   128,   129,   129,   130,   130,   131,   131,   131,
+     132,   132,   133,   133,   134,   134,   134,   135,   135,   136,
+     136,   137,   137,   138,   138,   138,   139,   139,   140,   142,
+     154,   155,   156,   156,   156,   158,   170,   171,   172,   172,
+     172,   174,   183,   192,   203,   212,   221,   234,   249,   258,
+     267,   276,   285,   294,   303,   312,   321,   330,   339,   348,
+     362,   369,   376,   383,   391,   398,   405,   412,   419,   427,
+     435,   442,   451,   460,   467,   474,   485,   493,   506,   515,
+     523,   536,   545,   554,   563,   572,   585,   592,   602,   612,
+     622,   632,   642,   652,   659,   666,   673,   683,   697,   704,
+     722,   731,   740,   750,   760,   767,   775,   788,   796,   815,
+     822,   829,   836,   843,   850,   857
 };
 #endif
 
@@ -703,17 +708,17 @@ static const char *const yytname[] =
   "VAR_STATISTICS_INTERVAL", "VAR_DO_DAEMONIZE", "VAR_USE_CAPS_FOR_ID",
   "VAR_STATISTICS_CUMULATIVE", "VAR_OUTGOING_PORT_PERMIT",
   "VAR_OUTGOING_PORT_AVOID", "VAR_DLV_ANCHOR_FILE", "VAR_DLV_ANCHOR",
-  "VAR_NEG_CACHE_SIZE", "VAR_HARDEN_REFERRAL_PATH", "$accept",
-  "toplevelvars", "toplevelvar", "serverstart", "contents_server",
-  "content_server", "stubstart", "contents_stub", "content_stub",
-  "forwardstart", "contents_forward", "content_forward",
-  "server_num_threads", "server_verbosity", "server_statistics_interval",
-  "server_statistics_cumulative", "server_port", "server_interface",
-  "server_outgoing_interface", "server_outgoing_range",
-  "server_outgoing_port_permit", "server_outgoing_port_avoid",
-  "server_outgoing_num_tcp", "server_incoming_num_tcp",
-  "server_interface_automatic", "server_do_ip4", "server_do_ip6",
-  "server_do_udp", "server_do_tcp", "server_do_daemonize",
+  "VAR_NEG_CACHE_SIZE", "VAR_HARDEN_REFERRAL_PATH", "VAR_PRIVATE_ADDRESS",
+  "VAR_PRIVATE_DOMAIN", "$accept", "toplevelvars", "toplevelvar",
+  "serverstart", "contents_server", "content_server", "stubstart",
+  "contents_stub", "content_stub", "forwardstart", "contents_forward",
+  "content_forward", "server_num_threads", "server_verbosity",
+  "server_statistics_interval", "server_statistics_cumulative",
+  "server_port", "server_interface", "server_outgoing_interface",
+  "server_outgoing_range", "server_outgoing_port_permit",
+  "server_outgoing_port_avoid", "server_outgoing_num_tcp",
+  "server_incoming_num_tcp", "server_interface_automatic", "server_do_ip4",
+  "server_do_ip6", "server_do_udp", "server_do_tcp", "server_do_daemonize",
   "server_use_syslog", "server_chroot", "server_username",
   "server_directory", "server_logfile", "server_pidfile",
   "server_root_hints", "server_dlv_anchor_file", "server_dlv_anchor",
@@ -728,7 +733,8 @@ static const char *const yytname[] =
   "server_target_fetch_policy", "server_harden_short_bufsize",
   "server_harden_large_queries", "server_harden_glue",
   "server_harden_dnssec_stripped", "server_harden_referral_path",
-  "server_use_caps_for_id", "server_do_not_query_address",
+  "server_use_caps_for_id", "server_private_address",
+  "server_private_domain", "server_do_not_query_address",
   "server_do_not_query_localhost", "server_access_control",
   "server_module_conf", "server_val_override_date", "server_cache_max_ttl",
   "server_bogus_ttl", "server_val_clean_additional",
@@ -753,22 +759,22 @@ static const yytype_uint16 yytoknum[] =
      305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
      315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
      325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
-     335,   336,   337,   338,   339,   340
+     335,   336,   337,   338,   339,   340,   341,   342
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    86,    87,    87,    88,    88,    88,    89,    90,    90,
-      91,    91,    91,    91,    91,    91,    91,    91,    91,    91,
-      91,    91,    91,    91,    91,    91,    91,    91,    91,    91,
-      91,    91,    91,    91,    91,    91,    91,    91,    91,    91,
-      91,    91,    91,    91,    91,    91,    91,    91,    91,    91,
-      91,    91,    91,    91,    91,    91,    91,    91,    91,    91,
-      91,    91,    91,    91,    91,    91,    91,    91,    91,    91,
-      91,    91,    91,    91,    91,    91,    91,    92,    93,    93,
-      94,    94,    94,    95,    96,    96,    97,    97,    97,    98,
+       0,    88,    89,    89,    90,    90,    90,    91,    92,    92,
+      93,    93,    93,    93,    93,    93,    93,    93,    93,    93,
+      93,    93,    93,    93,    93,    93,    93,    93,    93,    93,
+      93,    93,    93,    93,    93,    93,    93,    93,    93,    93,
+      93,    93,    93,    93,    93,    93,    93,    93,    93,    93,
+      93,    93,    93,    93,    93,    93,    93,    93,    93,    93,
+      93,    93,    93,    93,    93,    93,    93,    93,    93,    93,
+      93,    93,    93,    93,    93,    93,    93,    93,    93,    94,
+      95,    95,    96,    96,    96,    97,    98,    98,    99,    99,
       99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
      109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
      119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
@@ -776,7 +782,7 @@ static const yytype_uint8 yyr1[] =
      139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
      149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
      159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170
+     169,   170,   171,   172,   173,   174
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -789,16 +795,16 @@ static const yytype_uint8 yyr2[] =
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     2,     0,
-       1,     1,     1,     1,     2,     0,     1,     1,     1,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       2,     0,     1,     1,     1,     1,     2,     0,     1,     1,
+       1,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     3,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     3,     2,     2,     2,     2,     2,
-       2,     2
+       2,     2,     2,     2,     2,     2,     2,     3,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     3,     2,
+       2,     2,     2,     2,     2,     2
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -806,7 +812,7 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       2,     0,     1,     7,    77,    83,     3,     9,    79,    85,
+       2,     0,     1,     7,    79,    85,     3,     9,    81,    87,
        4,     5,     6,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
@@ -814,36 +820,37 @@ static const yytype_uint8 yydefact[] =
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       8,    10,    11,    67,    70,    12,    18,    58,    13,    71,
-      72,    29,    51,    66,    14,    15,    16,    17,    68,    57,
-      19,    20,    21,    22,    23,    59,    73,    74,    45,    55,
-      46,    39,    40,    41,    42,    52,    24,    25,    26,    27,
-      28,    30,    31,    33,    34,    32,    35,    36,    37,    43,
-      62,    76,    69,    38,    60,    63,    44,    47,    61,    48,
-      49,    50,    56,    53,    54,    75,    64,    65,     0,     0,
-       0,    78,    80,    81,    82,     0,     0,     0,    84,    86,
-      87,    88,    90,    89,    93,    96,    94,   102,   103,   104,
-     105,   108,   109,   110,   111,   112,   124,   125,   126,   127,
-     128,    99,   129,   130,   133,   131,   132,   134,   135,   136,
-     141,   119,   120,   121,   122,   137,   144,   116,   118,   145,
-     147,   148,   149,   100,   123,   151,   152,   117,   150,   107,
-      95,   113,   142,   146,   138,     0,     0,   155,   101,    91,
-     106,   140,    92,    97,    98,   114,   115,   153,   139,   156,
-     157,   158,   159,   160,   161,   143,   154
+       0,     0,     8,    10,    11,    67,    70,    12,    18,    58,
+      13,    71,    72,    29,    51,    66,    14,    15,    16,    17,
+      68,    57,    19,    20,    21,    22,    23,    59,    73,    74,
+      45,    55,    46,    39,    40,    41,    42,    52,    24,    25,
+      26,    27,    28,    30,    31,    33,    34,    32,    35,    36,
+      37,    43,    62,    76,    69,    77,    78,    38,    60,    63,
+      44,    47,    61,    48,    49,    50,    56,    53,    54,    75,
+      64,    65,     0,     0,     0,    80,    82,    83,    84,     0,
+       0,     0,    86,    88,    89,    90,    92,    91,    95,    98,
+      96,   104,   105,   106,   107,   110,   111,   112,   113,   114,
+     126,   127,   128,   129,   130,   101,   131,   132,   135,   133,
+     134,   136,   137,   138,   145,   121,   122,   123,   124,   139,
+     148,   118,   120,   149,   151,   152,   153,   102,   125,   155,
+     156,   119,   154,   109,    97,   115,   146,   150,   140,     0,
+       0,   159,   103,    93,   108,   142,    94,    99,   100,   116,
+     117,   157,   141,   143,   144,   160,   161,   162,   163,   164,
+     165,   147,   158
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,     6,     7,    10,    80,     8,    11,   151,     9,
-      12,   158,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   152,
-     153,   154,   159,   160,   161
+      -1,     1,     6,     7,    10,    82,     8,    11,   155,     9,
+      12,   162,    83,    84,    85,    86,    87,    88,    89,    90,
+      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
+     151,   156,   157,   158,   163,   164,   165
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
@@ -851,30 +858,31 @@ static const yytype_int16 yydefgoto[] =
 #define YYPACT_NINF -13
 static const yytype_int16 yypact[] =
 {
-     -13,    74,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
-     -12,    39,    38,    15,    16,    17,    18,    22,    23,    24,
-      67,    70,    71,    72,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     103,   104,   105,   106,   107,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
+     -13,    76,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
+     -12,    41,    40,    15,    16,    17,    18,    22,    23,    24,
+      69,    72,    73,    74,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     105,   106,   107,   108,   109,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
-     -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   134,   135,
-     136,   -13,   -13,   -13,   -13,   137,   138,   139,   -13,   -13,
+     -13,   -13,   138,   139,   140,   -13,   -13,   -13,   -13,   141,
+     142,   143,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
+     -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   144,
+     145,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
-     -13,   -13,   -13,   -13,   -13,   140,   141,   -13,   -13,   -13,
-     -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
-     -13,   -13,   -13,   -13,   -13,   -13,   -13
+     -13,   -13,   -13
 };
 
 /* YYPGOTO[NTERM-NUM].  */
@@ -888,7 +896,7 @@ static const yytype_int8 yypgoto[] =
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
-     -13,   -13,   -13,   -13,   -13
+     -13,   -13,   -13,   -13,   -13,   -13,   -13
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -900,20 +908,20 @@ static const yytype_uint8 yytable[] =
 {
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
       23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,   162,   163,   164,   165,    38,
-      39,    40,   166,   167,   168,    41,    42,    43,    44,    45,
+      33,    34,    35,    36,    37,   166,   167,   168,   169,    38,
+      39,    40,   170,   171,   172,    41,    42,    43,    44,    45,
       46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
       56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
       66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,     2,   155,   148,   169,   149,   150,
-     170,   171,   172,   156,   157,     3,   173,   174,   175,   176,
-     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
-     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,   198,     4,   199,   200,   201,   202,   203,     5,   204,
-     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
-     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
-     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
-     235,   236
+      76,    77,    78,    79,    80,    81,     2,   159,   152,   173,
+     153,   154,   174,   175,   176,   160,   161,     3,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,     4,   203,   204,   205,   206,   207,
+       5,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242
 };
 
 static const yytype_uint8 yycheck[] =
@@ -925,45 +933,46 @@ static const yytype_uint8 yycheck[] =
       52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
       62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
       72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,     0,    37,    37,    10,    39,    40,
-      10,    10,    10,    45,    46,    11,    10,    10,    10,    10,
+      82,    83,    84,    85,    86,    87,     0,    37,    37,    10,
+      39,    40,    10,    10,    10,    45,    46,    11,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    38,    10,    10,    10,    10,    10,    44,    10,
+      10,    10,    10,    10,    38,    10,    10,    10,    10,    10,
+      44,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10
+      10,    10,    10,    10,    10,    10
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,    87,     0,    11,    38,    44,    88,    89,    92,    95,
-      90,    93,    96,    12,    13,    14,    15,    16,    17,    18,
+       0,    89,     0,    11,    38,    44,    90,    91,    94,    97,
+      92,    95,    98,    12,    13,    14,    15,    16,    17,    18,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    41,    42,
       43,    47,    48,    49,    50,    51,    52,    53,    54,    55,
       56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
       66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
       76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      91,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+      86,    87,    93,   100,   101,   102,   103,   104,   105,   106,
      107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
      117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
      127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
      137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
      147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   162,   163,   164,    37,    39,
-      40,    94,   165,   166,   167,    37,    45,    46,    97,   168,
-     169,   170,    10,    10,    10,    10,    10,    10,    10,    10,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,    37,    39,    40,    96,   169,   170,   171,    37,
+      45,    46,    99,   172,   173,   174,    10,    10,    10,    10,
+      10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    10,    10,    10
+      10,    10,    10
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -1778,14 +1787,14 @@ yyreduce:
   switch (yyn)
     {
         case 7:
-#line 104 "util/configparser.y"
+#line 105 "util/configparser.y"
     { 
                OUTYY(("\nP(server:)\n")); 
        }
     break;
 
-  case 77:
-#line 141 "util/configparser.y"
+  case 79:
+#line 143 "util/configparser.y"
     {
                struct config_stub* s;
                OUTYY(("\nP(stub_zone:)\n")); 
@@ -1798,8 +1807,8 @@ yyreduce:
        }
     break;
 
-  case 83:
-#line 157 "util/configparser.y"
+  case 85:
+#line 159 "util/configparser.y"
     {
                struct config_stub* s;
                OUTYY(("\nP(forward_zone:)\n")); 
@@ -1812,8 +1821,8 @@ yyreduce:
        }
     break;
 
-  case 89:
-#line 173 "util/configparser.y"
+  case 91:
+#line 175 "util/configparser.y"
     { 
                OUTYY(("P(server_num_threads:%s)\n", (yyvsp[(2) - (2)].str))); 
                if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -1823,8 +1832,8 @@ yyreduce:
        }
     break;
 
-  case 90:
-#line 182 "util/configparser.y"
+  case 92:
+#line 184 "util/configparser.y"
     { 
                OUTYY(("P(server_verbosity:%s)\n", (yyvsp[(2) - (2)].str))); 
                if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -1834,8 +1843,8 @@ yyreduce:
        }
     break;
 
-  case 91:
-#line 191 "util/configparser.y"
+  case 93:
+#line 193 "util/configparser.y"
     { 
                OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[(2) - (2)].str))); 
                if(strcmp((yyvsp[(2) - (2)].str), "") == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0)
@@ -1847,8 +1856,8 @@ yyreduce:
        }
     break;
 
-  case 92:
-#line 202 "util/configparser.y"
+  case 94:
+#line 204 "util/configparser.y"
     {
                OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -1858,8 +1867,8 @@ yyreduce:
        }
     break;
 
-  case 93:
-#line 211 "util/configparser.y"
+  case 95:
+#line 213 "util/configparser.y"
     {
                OUTYY(("P(server_port:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -1869,8 +1878,8 @@ yyreduce:
        }
     break;
 
-  case 94:
-#line 220 "util/configparser.y"
+  case 96:
+#line 222 "util/configparser.y"
     {
                OUTYY(("P(server_interface:%s)\n", (yyvsp[(2) - (2)].str)));
                if(cfg_parser->cfg->num_ifs == 0)
@@ -1884,8 +1893,8 @@ yyreduce:
        }
     break;
 
-  case 95:
-#line 233 "util/configparser.y"
+  case 97:
+#line 235 "util/configparser.y"
     {
                OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[(2) - (2)].str)));
                if(cfg_parser->cfg->num_out_ifs == 0)
@@ -1901,8 +1910,8 @@ yyreduce:
        }
     break;
 
-  case 96:
-#line 248 "util/configparser.y"
+  case 98:
+#line 250 "util/configparser.y"
     {
                OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -1912,8 +1921,8 @@ yyreduce:
        }
     break;
 
-  case 97:
-#line 257 "util/configparser.y"
+  case 99:
+#line 259 "util/configparser.y"
     {
                OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_mark_ports((yyvsp[(2) - (2)].str), 1, 
@@ -1923,8 +1932,8 @@ yyreduce:
        }
     break;
 
-  case 98:
-#line 266 "util/configparser.y"
+  case 100:
+#line 268 "util/configparser.y"
     {
                OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_mark_ports((yyvsp[(2) - (2)].str), 0, 
@@ -1934,8 +1943,8 @@ yyreduce:
        }
     break;
 
-  case 99:
-#line 275 "util/configparser.y"
+  case 101:
+#line 277 "util/configparser.y"
     {
                OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -1945,8 +1954,8 @@ yyreduce:
        }
     break;
 
-  case 100:
-#line 284 "util/configparser.y"
+  case 102:
+#line 286 "util/configparser.y"
     {
                OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -1956,8 +1965,8 @@ yyreduce:
        }
     break;
 
-  case 101:
-#line 293 "util/configparser.y"
+  case 103:
+#line 295 "util/configparser.y"
     {
                OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -1967,8 +1976,8 @@ yyreduce:
        }
     break;
 
-  case 102:
-#line 302 "util/configparser.y"
+  case 104:
+#line 304 "util/configparser.y"
     {
                OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -1978,8 +1987,8 @@ yyreduce:
        }
     break;
 
-  case 103:
-#line 311 "util/configparser.y"
+  case 105:
+#line 313 "util/configparser.y"
     {
                OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -1989,8 +1998,8 @@ yyreduce:
        }
     break;
 
-  case 104:
-#line 320 "util/configparser.y"
+  case 106:
+#line 322 "util/configparser.y"
     {
                OUTYY(("P(server_do_udp:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2000,8 +2009,8 @@ yyreduce:
        }
     break;
 
-  case 105:
-#line 329 "util/configparser.y"
+  case 107:
+#line 331 "util/configparser.y"
     {
                OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2011,8 +2020,8 @@ yyreduce:
        }
     break;
 
-  case 106:
-#line 338 "util/configparser.y"
+  case 108:
+#line 340 "util/configparser.y"
     {
                OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2022,8 +2031,8 @@ yyreduce:
        }
     break;
 
-  case 107:
-#line 347 "util/configparser.y"
+  case 109:
+#line 349 "util/configparser.y"
     {
                OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2038,8 +2047,8 @@ yyreduce:
        }
     break;
 
-  case 108:
-#line 361 "util/configparser.y"
+  case 110:
+#line 363 "util/configparser.y"
     {
                OUTYY(("P(server_chroot:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->chrootdir);
@@ -2047,8 +2056,8 @@ yyreduce:
        }
     break;
 
-  case 109:
-#line 368 "util/configparser.y"
+  case 111:
+#line 370 "util/configparser.y"
     {
                OUTYY(("P(server_username:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->username);
@@ -2056,8 +2065,8 @@ yyreduce:
        }
     break;
 
-  case 110:
-#line 375 "util/configparser.y"
+  case 112:
+#line 377 "util/configparser.y"
     {
                OUTYY(("P(server_directory:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->directory);
@@ -2065,8 +2074,8 @@ yyreduce:
        }
     break;
 
-  case 111:
-#line 382 "util/configparser.y"
+  case 113:
+#line 384 "util/configparser.y"
     {
                OUTYY(("P(server_logfile:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->logfile);
@@ -2075,8 +2084,8 @@ yyreduce:
        }
     break;
 
-  case 112:
-#line 390 "util/configparser.y"
+  case 114:
+#line 392 "util/configparser.y"
     {
                OUTYY(("P(server_pidfile:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->pidfile);
@@ -2084,8 +2093,8 @@ yyreduce:
        }
     break;
 
-  case 113:
-#line 397 "util/configparser.y"
+  case 115:
+#line 399 "util/configparser.y"
     {
                OUTYY(("P(server_root_hints:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[(2) - (2)].str)))
@@ -2093,8 +2102,8 @@ yyreduce:
        }
     break;
 
-  case 114:
-#line 404 "util/configparser.y"
+  case 116:
+#line 406 "util/configparser.y"
     {
                OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->dlv_anchor_file);
@@ -2102,8 +2111,8 @@ yyreduce:
        }
     break;
 
-  case 115:
-#line 411 "util/configparser.y"
+  case 117:
+#line 413 "util/configparser.y"
     {
                OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, (yyvsp[(2) - (2)].str)))
@@ -2111,8 +2120,8 @@ yyreduce:
        }
     break;
 
-  case 116:
-#line 418 "util/configparser.y"
+  case 118:
+#line 420 "util/configparser.y"
     {
                OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->
@@ -2121,8 +2130,8 @@ yyreduce:
        }
     break;
 
-  case 117:
-#line 426 "util/configparser.y"
+  case 119:
+#line 428 "util/configparser.y"
     {
                OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->
@@ -2131,8 +2140,8 @@ yyreduce:
        }
     break;
 
-  case 118:
-#line 434 "util/configparser.y"
+  case 120:
+#line 436 "util/configparser.y"
     {
                OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[(2) - (2)].str)))
@@ -2140,8 +2149,8 @@ yyreduce:
        }
     break;
 
-  case 119:
-#line 441 "util/configparser.y"
+  case 121:
+#line 443 "util/configparser.y"
     {
                OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2151,8 +2160,8 @@ yyreduce:
        }
     break;
 
-  case 120:
-#line 450 "util/configparser.y"
+  case 122:
+#line 452 "util/configparser.y"
     {
                OUTYY(("P(server_hide_version:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2162,8 +2171,8 @@ yyreduce:
        }
     break;
 
-  case 121:
-#line 459 "util/configparser.y"
+  case 123:
+#line 461 "util/configparser.y"
     {
                OUTYY(("P(server_identity:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->identity);
@@ -2171,8 +2180,8 @@ yyreduce:
        }
     break;
 
-  case 122:
-#line 466 "util/configparser.y"
+  case 124:
+#line 468 "util/configparser.y"
     {
                OUTYY(("P(server_version:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->version);
@@ -2180,8 +2189,8 @@ yyreduce:
        }
     break;
 
-  case 123:
-#line 473 "util/configparser.y"
+  case 125:
+#line 475 "util/configparser.y"
     {
                OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2193,8 +2202,8 @@ yyreduce:
        }
     break;
 
-  case 124:
-#line 484 "util/configparser.y"
+  case 126:
+#line 486 "util/configparser.y"
     {
                OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->msg_cache_size))
@@ -2203,8 +2212,8 @@ yyreduce:
        }
     break;
 
-  case 125:
-#line 492 "util/configparser.y"
+  case 127:
+#line 494 "util/configparser.y"
     {
                OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2218,8 +2227,8 @@ yyreduce:
        }
     break;
 
-  case 126:
-#line 505 "util/configparser.y"
+  case 128:
+#line 507 "util/configparser.y"
     {
                OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2229,8 +2238,8 @@ yyreduce:
        }
     break;
 
-  case 127:
-#line 514 "util/configparser.y"
+  case 129:
+#line 516 "util/configparser.y"
     {
                OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->rrset_cache_size))
@@ -2239,8 +2248,8 @@ yyreduce:
        }
     break;
 
-  case 128:
-#line 522 "util/configparser.y"
+  case 130:
+#line 524 "util/configparser.y"
     {
                OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2254,8 +2263,8 @@ yyreduce:
        }
     break;
 
-  case 129:
-#line 535 "util/configparser.y"
+  case 131:
+#line 537 "util/configparser.y"
     {
                OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2265,8 +2274,8 @@ yyreduce:
        }
     break;
 
-  case 130:
-#line 544 "util/configparser.y"
+  case 132:
+#line 546 "util/configparser.y"
     {
                OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2276,8 +2285,8 @@ yyreduce:
        }
     break;
 
-  case 131:
-#line 553 "util/configparser.y"
+  case 133:
+#line 555 "util/configparser.y"
     {
                OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2287,8 +2296,8 @@ yyreduce:
        }
     break;
 
-  case 132:
-#line 562 "util/configparser.y"
+  case 134:
+#line 564 "util/configparser.y"
     {
                OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->
@@ -2298,8 +2307,8 @@ yyreduce:
        }
     break;
 
-  case 133:
-#line 571 "util/configparser.y"
+  case 135:
+#line 573 "util/configparser.y"
     {
                OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2313,8 +2322,8 @@ yyreduce:
        }
     break;
 
-  case 134:
-#line 584 "util/configparser.y"
+  case 136:
+#line 586 "util/configparser.y"
     {
                OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->target_fetch_policy);
@@ -2322,8 +2331,8 @@ yyreduce:
        }
     break;
 
-  case 135:
-#line 591 "util/configparser.y"
+  case 137:
+#line 593 "util/configparser.y"
     {
                OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2334,8 +2343,8 @@ yyreduce:
        }
     break;
 
-  case 136:
-#line 601 "util/configparser.y"
+  case 138:
+#line 603 "util/configparser.y"
     {
                OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2346,8 +2355,8 @@ yyreduce:
        }
     break;
 
-  case 137:
-#line 611 "util/configparser.y"
+  case 139:
+#line 613 "util/configparser.y"
     {
                OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2358,8 +2367,8 @@ yyreduce:
        }
     break;
 
-  case 138:
-#line 621 "util/configparser.y"
+  case 140:
+#line 623 "util/configparser.y"
     {
                OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2370,8 +2379,8 @@ yyreduce:
        }
     break;
 
-  case 139:
-#line 631 "util/configparser.y"
+  case 141:
+#line 633 "util/configparser.y"
     {
                OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2382,8 +2391,8 @@ yyreduce:
        }
     break;
 
-  case 140:
-#line 641 "util/configparser.y"
+  case 142:
+#line 643 "util/configparser.y"
     {
                OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2394,8 +2403,26 @@ yyreduce:
        }
     break;
 
-  case 141:
-#line 651 "util/configparser.y"
+  case 143:
+#line 653 "util/configparser.y"
+    {
+               OUTYY(("P(server_private_address:%s)\n", (yyvsp[(2) - (2)].str)));
+               if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[(2) - (2)].str)))
+                       yyerror("out of memory");
+       }
+    break;
+
+  case 144:
+#line 660 "util/configparser.y"
+    {
+               OUTYY(("P(server_private_domain:%s)\n", (yyvsp[(2) - (2)].str)));
+               if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[(2) - (2)].str)))
+                       yyerror("out of memory");
+       }
+    break;
+
+  case 145:
+#line 667 "util/configparser.y"
     {
                OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[(2) - (2)].str)))
@@ -2403,8 +2430,8 @@ yyreduce:
        }
     break;
 
-  case 142:
-#line 658 "util/configparser.y"
+  case 146:
+#line 674 "util/configparser.y"
     {
                OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2415,8 +2442,8 @@ yyreduce:
        }
     break;
 
-  case 143:
-#line 668 "util/configparser.y"
+  case 147:
+#line 684 "util/configparser.y"
     {
                OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str)));
                if(strcmp((yyvsp[(3) - (3)].str), "deny")!=0 && strcmp((yyvsp[(3) - (3)].str), "refuse")!=0 &&
@@ -2431,8 +2458,8 @@ yyreduce:
        }
     break;
 
-  case 144:
-#line 682 "util/configparser.y"
+  case 148:
+#line 698 "util/configparser.y"
     {
                OUTYY(("P(server_module_conf:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->module_conf);
@@ -2440,8 +2467,8 @@ yyreduce:
        }
     break;
 
-  case 145:
-#line 689 "util/configparser.y"
+  case 149:
+#line 705 "util/configparser.y"
     {
                OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strlen((yyvsp[(2) - (2)].str)) == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0) {
@@ -2460,8 +2487,8 @@ yyreduce:
        }
     break;
 
-  case 146:
-#line 707 "util/configparser.y"
+  case 150:
+#line 723 "util/configparser.y"
     {
                OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2471,8 +2498,8 @@ yyreduce:
        }
     break;
 
-  case 147:
-#line 716 "util/configparser.y"
+  case 151:
+#line 732 "util/configparser.y"
     {
                OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2482,8 +2509,8 @@ yyreduce:
        }
     break;
 
-  case 148:
-#line 725 "util/configparser.y"
+  case 152:
+#line 741 "util/configparser.y"
     {
                OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2494,8 +2521,8 @@ yyreduce:
        }
     break;
 
-  case 149:
-#line 735 "util/configparser.y"
+  case 153:
+#line 751 "util/configparser.y"
     {
                OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[(2) - (2)].str)));
                if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2506,8 +2533,8 @@ yyreduce:
        }
     break;
 
-  case 150:
-#line 745 "util/configparser.y"
+  case 154:
+#line 761 "util/configparser.y"
     {
                OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->val_nsec3_key_iterations);
@@ -2515,8 +2542,8 @@ yyreduce:
        }
     break;
 
-  case 151:
-#line 752 "util/configparser.y"
+  case 155:
+#line 768 "util/configparser.y"
     {
                OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->key_cache_size))
@@ -2525,8 +2552,8 @@ yyreduce:
        }
     break;
 
-  case 152:
-#line 760 "util/configparser.y"
+  case 156:
+#line 776 "util/configparser.y"
     {
                OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2540,8 +2567,8 @@ yyreduce:
        }
     break;
 
-  case 153:
-#line 773 "util/configparser.y"
+  case 157:
+#line 789 "util/configparser.y"
     {
                OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->neg_cache_size))
@@ -2550,8 +2577,8 @@ yyreduce:
        }
     break;
 
-  case 154:
-#line 781 "util/configparser.y"
+  case 158:
+#line 797 "util/configparser.y"
     {
                OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str)));
                if(strcmp((yyvsp[(3) - (3)].str), "static")!=0 && strcmp((yyvsp[(3) - (3)].str), "deny")!=0 &&
@@ -2571,8 +2598,8 @@ yyreduce:
        }
     break;
 
-  case 155:
-#line 800 "util/configparser.y"
+  case 159:
+#line 816 "util/configparser.y"
     {
                OUTYY(("P(server_local_data:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[(2) - (2)].str)))
@@ -2580,8 +2607,8 @@ yyreduce:
        }
     break;
 
-  case 156:
-#line 807 "util/configparser.y"
+  case 160:
+#line 823 "util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->stubs->name);
@@ -2589,8 +2616,8 @@ yyreduce:
        }
     break;
 
-  case 157:
-#line 814 "util/configparser.y"
+  case 161:
+#line 830 "util/configparser.y"
     {
                OUTYY(("P(stub-host:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[(2) - (2)].str)))
@@ -2598,8 +2625,8 @@ yyreduce:
        }
     break;
 
-  case 158:
-#line 821 "util/configparser.y"
+  case 162:
+#line 837 "util/configparser.y"
     {
                OUTYY(("P(stub-addr:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[(2) - (2)].str)))
@@ -2607,8 +2634,8 @@ yyreduce:
        }
     break;
 
-  case 159:
-#line 828 "util/configparser.y"
+  case 163:
+#line 844 "util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->forwards->name);
@@ -2616,8 +2643,8 @@ yyreduce:
        }
     break;
 
-  case 160:
-#line 835 "util/configparser.y"
+  case 164:
+#line 851 "util/configparser.y"
     {
                OUTYY(("P(forward-host:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[(2) - (2)].str)))
@@ -2625,8 +2652,8 @@ yyreduce:
        }
     break;
 
-  case 161:
-#line 842 "util/configparser.y"
+  case 165:
+#line 858 "util/configparser.y"
     {
                OUTYY(("P(forward-addr:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[(2) - (2)].str)))
@@ -2636,7 +2663,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 2640 "util/configparser.c"
+#line 2667 "util/configparser.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2850,7 +2877,7 @@ yyreturn:
 }
 
 
-#line 848 "util/configparser.y"
+#line 864 "util/configparser.y"
 
 
 /* parse helper routines could be here */
index 45ecd8f35f03fd26ecb6cd40581b814af107e801..e0082daec4047c17367d183c295b8173c6dfb1c1 100644 (file)
      VAR_DLV_ANCHOR_FILE = 337,
      VAR_DLV_ANCHOR = 338,
      VAR_NEG_CACHE_SIZE = 339,
-     VAR_HARDEN_REFERRAL_PATH = 340
+     VAR_HARDEN_REFERRAL_PATH = 340,
+     VAR_PRIVATE_ADDRESS = 341,
+     VAR_PRIVATE_DOMAIN = 342
    };
 #endif
 /* Tokens.  */
 #define VAR_DLV_ANCHOR 338
 #define VAR_NEG_CACHE_SIZE 339
 #define VAR_HARDEN_REFERRAL_PATH 340
+#define VAR_PRIVATE_ADDRESS 341
+#define VAR_PRIVATE_DOMAIN 342
 
 
 
@@ -219,7 +223,7 @@ typedef union YYSTYPE
        char*   str;
 }
 /* Line 1489 of yacc.c.  */
-#line 223 "util/configparser.h"
+#line 227 "util/configparser.h"
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
index 2d597fbeca6d2531dd9bf396a82a512f351f0df2..fb920ee28f02c85f90617c5ae61ad0c4f125da40 100644 (file)
@@ -91,7 +91,8 @@ extern struct config_parser_state* cfg_parser;
 %token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID
 %token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT 
 %token VAR_OUTGOING_PORT_AVOID VAR_DLV_ANCHOR_FILE VAR_DLV_ANCHOR
-%token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH
+%token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH VAR_PRIVATE_ADDRESS
+%token VAR_PRIVATE_DOMAIN
 
 %%
 toplevelvars: /* empty */ | toplevelvars toplevelvar ;
@@ -135,7 +136,8 @@ content_server: server_num_threads | server_verbosity | server_port |
        server_use_caps_for_id | server_statistics_cumulative |
        server_outgoing_port_permit | server_outgoing_port_avoid |
        server_dlv_anchor_file | server_dlv_anchor | server_neg_cache_size |
-       server_harden_referral_path
+       server_harden_referral_path | server_private_address |
+       server_private_domain
        ;
 stubstart: VAR_STUB_ZONE
        {
@@ -647,6 +649,20 @@ server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING
                free($2);
        }
        ;
+server_private_address: VAR_PRIVATE_ADDRESS STRING
+       {
+               OUTYY(("P(server_private_address:%s)\n", $2));
+               if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, $2))
+                       yyerror("out of memory");
+       }
+       ;
+server_private_domain: VAR_PRIVATE_DOMAIN STRING
+       {
+               OUTYY(("P(server_private_domain:%s)\n", $2));
+               if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, $2))
+                       yyerror("out of memory");
+       }
+       ;
 server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING
        {
                OUTYY(("P(server_do_not_query_address:%s)\n", $2));
index 412236a6e4159baeae030f52726b8081cf5dc324..5f257d7d8025a91dd46f7f98a6dcdae4bf92f504 100644 (file)
@@ -65,6 +65,7 @@
 #include "util/data/msgreply.h"
 #include "util/data/packed_rrset.h"
 #include "util/storage/slabhash.h"
+#include "util/storage/dnstree.h"
 #include "util/locks.h"
 #include "daemon/acl_list.h"
 #include "libunbound/libworker.h"
@@ -159,6 +160,8 @@ fptr_whitelist_rbtree_cmp(int (*fptr) (const void *, const void *))
        else if(fptr == &stub_cmp) return 1;
        else if(fptr == &pending_cmp) return 1;
        else if(fptr == &serviced_cmp) return 1;
+       else if(fptr == &name_tree_compare) return 1;
+       else if(fptr == &addr_tree_compare) return 1;
        else if(fptr == &order_lock_cmp) return 1;
        else if(fptr == &codeline_cmp) return 1;
        else if(fptr == &nsec3_hash_cmp) return 1;
diff --git a/util/storage/dnstree.c b/util/storage/dnstree.c
new file mode 100644 (file)
index 0000000..2677be9
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * util/storage/dnstree.c - support for rbtree types suitable for DNS code.
+ *
+ * Copyright (c) 2008, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains structures combining types and functions to
+ * manipulate those structures that help building DNS lookup trees.
+ */
+#include "config.h"
+#include "util/storage/dnstree.h"
+#include "util/data/dname.h"
+#include "util/net_help.h"
+
+int name_tree_compare(const void* k1, const void* k2)
+{
+        struct name_tree_node* x = (struct name_tree_node*)k1;
+        struct name_tree_node* y = (struct name_tree_node*)k2;
+        int m;
+        if(x->dclass != y->dclass) {
+                if(x->dclass < y->dclass)
+                        return -1;
+                return 1;
+        }
+        return dname_canon_lab_cmp(x->name, x->labs, y->name, y->labs, &m);
+}
+
+int addr_tree_compare(const void* k1, const void* k2)
+{
+        struct addr_tree_node* n1 = (struct addr_tree_node*)k1;
+        struct addr_tree_node* n2 = (struct addr_tree_node*)k2;
+        int r = sockaddr_cmp_addr(&n1->addr, n1->addrlen, &n2->addr,
+                n2->addrlen);
+        if(r != 0) return r;
+        if(n1->net < n2->net)
+                return -1;
+        if(n1->net > n2->net)
+                return 1;
+        return 0;
+}
+
+void name_tree_init(rbtree_t* tree)
+{
+       rbtree_init(tree, &name_tree_compare);
+}
+
+void addr_tree_init(rbtree_t* tree)
+{
+       rbtree_init(tree, &addr_tree_compare);
+}
+
+int name_tree_insert(rbtree_t* tree, struct name_tree_node* node, 
+        uint8_t* name, size_t len, int labs, uint16_t dclass)
+{
+       node->node.key = node;
+       node->name = name;
+       node->len = len;
+       node->labs = labs;
+       node->dclass = dclass;
+       return rbtree_insert(tree, &node->node) != NULL;
+}
+
+int addr_tree_insert(rbtree_t* tree, struct addr_tree_node* node,
+        struct sockaddr_storage* addr, socklen_t addrlen, int net)
+{
+       node->node.key = node;
+       memcpy(&node->addr, addr, addrlen);
+       node->addrlen = addrlen;
+       node->net = net;
+       return rbtree_insert(tree, &node->node) != NULL;
+}
+
+void addr_tree_init_parents(rbtree_t* tree)
+{
+        struct addr_tree_node* node, *prev = NULL, *p;
+        int m;
+        RBTREE_FOR(node, struct addr_tree_node*, tree) {
+                node->parent = NULL;
+                if(!prev || prev->addrlen != node->addrlen) {
+                        prev = node;
+                        continue;
+                }
+                m = addr_in_common(&prev->addr, prev->net, &node->addr,
+                        node->net, node->addrlen);
+                /* sort order like: ::/0, 1::/2, 1::/4, ... 2::/2 */
+                /* find the previous, or parent-parent-parent */
+                for(p = prev; p; p = p->parent)
+                        if(p->net <= m) {
+                                /* ==: since prev matched m, this is closest*/
+                                /* <: prev matches more, but is not a parent,
+                                * this one is a (grand)parent */
+                                node->parent = p;
+                                break;
+                        }
+                prev = node;
+        }
+}
+
+void name_tree_init_parents(rbtree_t* tree)
+{
+        struct name_tree_node* node, *prev = NULL, *p;
+        int m;
+        RBTREE_FOR(node, struct name_tree_node*, tree) {
+                node->parent = NULL;
+                if(!prev || prev->dclass != node->dclass) {
+                        prev = node;
+                        continue;
+                }
+                (void)dname_lab_cmp(prev->name, prev->labs, node->name,
+                        node->labs, &m); /* we know prev is smaller */
+               /* sort order like: . com. bla.com. zwb.com. net. */
+                /* find the previous, or parent-parent-parent */
+                for(p = prev; p; p = p->parent)
+                        if(p->labs <= m) {
+                                /* ==: since prev matched m, this is closest*/
+                                /* <: prev matches more, but is not a parent,
+                                * this one is a (grand)parent */
+                                node->parent = p;
+                                break;
+                        }
+                prev = node;
+        }
+}
+
+struct name_tree_node* name_tree_find(rbtree_t* tree, uint8_t* name, 
+        size_t len, int labs, uint16_t dclass)
+{
+       struct name_tree_node key;
+       key.node.key = &key;
+       key.name = name;
+       key.len = len;
+       key.labs = labs;
+       key.dclass = dclass;
+       return (struct name_tree_node*)rbtree_search(tree, &key);
+}
+
+struct name_tree_node* name_tree_lookup(rbtree_t* tree, uint8_t* name,
+        size_t len, int labs, uint16_t dclass)
+{
+        rbnode_t* res = NULL;
+        struct name_tree_node *result;
+        struct name_tree_node key;
+        key.node.key = &key;
+        key.name = name;
+        key.len = len;
+        key.labs = labs;
+        key.dclass = dclass;
+        if(rbtree_find_less_equal(tree, &key, &res)) {
+                /* exact */
+                result = (struct name_tree_node*)res;
+        } else {
+                /* smaller element (or no element) */
+                int m;
+                result = (struct name_tree_node*)res;
+                if(!result || result->dclass != dclass)
+                        return NULL;
+                /* count number of labels matched */
+                (void)dname_lab_cmp(result->name, result->labs, key.name,
+                        key.labs, &m);
+                while(result) { /* go up until qname is subdomain of stub */
+                        if(result->labs <= m)
+                                break;
+                        result = result->parent;
+                }
+        }
+       return result;
+}
+
+struct addr_tree_node* addr_tree_lookup(rbtree_t* tree, 
+        struct sockaddr_storage* addr, socklen_t addrlen)
+{
+        rbnode_t* res = NULL;
+        struct addr_tree_node* result;
+        struct addr_tree_node key;
+        key.node.key = &key;
+        memcpy(&key.addr, addr, addrlen);
+        key.addrlen = addrlen;
+        key.net = (addr_is_ip6(addr, addrlen)?128:32);
+        if(rbtree_find_less_equal(tree, &key, &res)) {
+                /* exact */
+                return (struct addr_tree_node*)res;
+        } else {
+                /* smaller element (or no element) */
+                int m;
+                result = (struct addr_tree_node*)res;
+                if(!result || result->addrlen != addrlen)
+                        return 0;
+                /* count number of bits matched */
+                m = addr_in_common(&result->addr, result->net, addr,
+                        key.net, addrlen);
+                while(result) { /* go up until addr is inside netblock */
+                        if(result->net <= m)
+                                break;
+                        result = result->parent;
+                }
+        }
+        return result;
+}
diff --git a/util/storage/dnstree.h b/util/storage/dnstree.h
new file mode 100644 (file)
index 0000000..8255cf6
--- /dev/null
@@ -0,0 +1,184 @@
+/*
+ * util/storage/dnstree.h - support for rbtree types suitable for DNS code.
+ *
+ * Copyright (c) 2008, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains structures combining types and functions to
+ * manipulate those structures that help building DNS lookup trees.
+ */
+
+#ifndef UTIL_STORAGE_DNSTREE_H
+#define UTIL_STORAGE_DNSTREE_H
+#include "util/rbtree.h"
+
+/**
+ * Tree of domain names.  Sorted first by class then by name.
+ * This is not sorted canonically, but fast.
+ * This can be looked up to obtain a closest encloser parent name.
+ *
+ * The tree itself is a rbtree_t.
+ * This is the element node put as first entry in the client structure.
+ */
+struct name_tree_node {
+       /** rbtree node, key is this struct : dclass and name */
+       rbnode_t node;
+       /** parent in tree */
+       struct name_tree_node* parent;
+       /** name in uncompressed wireformat */
+       uint8_t* name;
+       /** length of name */
+       size_t len;
+       /** labels in name */
+       int labs;
+       /** the class of the name (host order) */
+       uint16_t dclass;
+};
+
+/**
+ * Tree of IP addresses.  Sorted first by protocol, then by bits.
+ * This can be looked up to obtain the enclosing subnet.
+ *
+ * The tree itself is a rbtree_t.
+ * This is the element node put as first entry in the client structure.
+ */
+struct addr_tree_node {
+       /** rbtree node, key is this struct : proto and subnet */
+       rbnode_t node;
+       /** parent in tree */
+       struct addr_tree_node* parent;
+       /** address */
+       struct sockaddr_storage addr;
+       /** length of addr */
+       socklen_t addrlen;
+       /** netblock size */
+       int net;
+};
+
+/**
+ * Init a name tree to be empty
+ * @param tree: to init.
+ */
+void name_tree_init(rbtree_t* tree);
+
+/**
+ * insert element into name tree.
+ * @param tree: name tree
+ * @param node: node element (at start of a structure that caller
+ *     has allocated).
+ * @param name: name to insert (wireformat)
+ *     this node has been allocated by the caller and it itself inserted.
+ * @param len: length of name
+ * @param labs: labels in name
+ * @param dclass: class of name
+ * @return false on error (duplicate element).
+ */
+int name_tree_insert(rbtree_t* tree, struct name_tree_node* node, 
+       uint8_t* name, size_t len, int labs, uint16_t dclass);
+
+/**
+ * Initialize parent pointers in name tree.
+ * Should be performed after insertions are done, before lookups
+ * @param tree: name tree
+ */
+void name_tree_init_parents(rbtree_t* tree);
+
+/**
+ * Lookup exact match in name tree
+ * @param tree: name tree
+ * @param name: wireformat name
+ * @param len: length of name
+ * @param labs: labels in name
+ * @param dclass: class of name
+ * @return node or NULL if not found.
+ */
+struct name_tree_node* name_tree_find(rbtree_t* tree, uint8_t* name, 
+       size_t len, int labs, uint16_t dclass);
+
+/**
+ * Lookup closest encloser in name tree.
+ * @param tree: name tree
+ * @param name: wireformat name
+ * @param len: length of name
+ * @param labs: labels in name
+ * @param dclass: class of name
+ * @return closest enclosing node (could be equal) or NULL if not found.
+ */
+struct name_tree_node* name_tree_lookup(rbtree_t* tree, uint8_t* name, 
+       size_t len, int labs, uint16_t dclass);
+
+/**
+ * Init addr tree to be empty.
+ * @param tree: to init.
+ */
+void addr_tree_init(rbtree_t* tree);
+
+/**
+ * insert element into addr tree.
+ * @param tree: addr tree
+ * @param node: node element (at start of a structure that caller
+ *     has allocated).
+ * @param addr: to insert (copied).
+ * @param addrlen: length of addr
+ * @param net: size of subnet. 
+ * @return false on error (duplicate element).
+ */
+int addr_tree_insert(rbtree_t* tree, struct addr_tree_node* node, 
+       struct sockaddr_storage* addr, socklen_t addrlen, int net);
+
+/**
+ * Initialize parent pointers in addr tree.
+ * Should be performed after insertions are done, before lookups
+ * @param tree: addr tree
+ */
+void addr_tree_init_parents(rbtree_t* tree);
+
+/**
+ * Lookup closest encloser in addr tree.
+ * @param tree: addr tree
+ * @param addr: to lookup.
+ * @param addrlen: length of addr
+ * @return closest enclosing node (could be equal) or NULL if not found.
+ */
+struct addr_tree_node* addr_tree_lookup(rbtree_t* tree, 
+       struct sockaddr_storage* addr, socklen_t addrlen);
+
+/** compare name tree nodes */
+int name_tree_compare(const void* k1, const void* k2);
+
+/** compare addr tree nodes */
+int addr_tree_compare(const void* k1, const void* k2);
+
+#endif /* UTIL_STORAGE_DNSTREE_H */