]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
config available ports, iana assigned ports list.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 9 Apr 2008 15:07:37 +0000 (15:07 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 9 Apr 2008 15:07:37 +0000 (15:07 +0000)
git-svn-id: file:///svn/unbound/trunk@1025 be551aaa-1e26-0410-a405-d3ace91eadb9

12 files changed:
daemon/unbound.c
doc/Changelog
doc/example.conf
doc/unbound.conf.5
util/config_file.c
util/config_file.h
util/configlexer.c
util/configlexer.lex
util/configparser.c
util/configparser.h
util/configparser.y
util/iana_ports.inc [new file with mode: 0644]

index 285b5d75a3ee5e7ef40809bea860e141dbef727a..17b837c96612291e83e5aee1e3b8faed6590a880 100644 (file)
@@ -108,6 +108,9 @@ checkrlimits(struct config_file* cfg)
        size_t total = numthread * perthread + misc;
        size_t avail;
        struct rlimit rlim;
+
+       verbose(VERB_ALGO, "%d ports available in config",
+               cfg_scan_ports(cfg->outgoing_avail_ports, 65536));
        if(getrlimit(RLIMIT_NOFILE, &rlim) < 0) {
                log_warn("getrlimit: %s", strerror(errno));
                return;
index a626bf2225a55d5af9f15b748cb08fddf79dc7dd..83b1d0d5b928b1194f65496484201883c8ebc3f2 100644 (file)
@@ -4,6 +4,9 @@
          libev-3.2 is a little faster than libevent-1.4.3-stable (about 5%).
        - unused commpoints not listed in epoll list.
        - statistics-cumulative option so that the values are not reset.
+       - config creates array of available ports, 61841 available,
+         it excludes <1024 and iana assigned numbers.
+         config statements to modify the available port numbers.
 
 8 April 2008: Wouter
        - unbound tries to set the ulimit fds when started as server.
index 1edf1f873744d04868ab5fa6c38c75ab018af88e..75ee878e43255360ded16302567ce4e8f05dd42e 100644 (file)
@@ -58,6 +58,14 @@ server:
        # spoof attacks, as it gets harder to guess which port is used. 
        # But also takes more system resources (for open sockets).
        # outgoing-range: 256
+       
+       # permit unbound to use this port number or port range for
+       # making outgoing queries, using an outgoing interface.
+       # outgoing-port-permit: 32768
+
+       # deny unbound the use this of port number or port range for
+       # making outgoing queries, using an outgoing interface.
+       # outgoing-port-avoid: "3200-3208"
 
        # number of outgoing simultaneous tcp buffers to hold per thread.
        # outgoing-num-tcp: 10
index 2c525215cc2afb40360b7f486a2f884f993ae76f..8cd7594e8e78987053cefb95a5ff3ae822f1a402 100644 (file)
@@ -132,6 +132,19 @@ query interface. Must be at least 1. Default is 256.
 Larger numbers give more protection against spoofing attempts, but need
 extra resources from the operating system.
 .TP
+.B outgoing\-port\-permit: \fI<port number or range>
+Permit unbound to open this port or range of ports for use to send queries.
+Make sure these ports are not needed by other daemons. By default only
+ports above 1024 that have not been assigned by IANA are used.
+Give a port number or a range of the form "low-high", without spaces.
+.TP
+.B outgoing\-port\-avoid: \fI<port number or range>
+Do not permit unbound to open this port or range of ports for use to send 
+queries. Use this to make sure unbound does not grab a port that another
+daemon needs. The port is avoided on all outgoing interfaces, both IP4 and IP6.
+By default only ports above 1024 that have not been assigned by IANA are used.
+Give a port number or a range of the form "low-high", without spaces.
+.TP
 .B outgoing\-num\-tcp: \fI<number>
 Number of outgoing TCP buffers to allocate per thread. Default is 10. If set
 to 0, or if do_tcp is "no", no TCP queries to authoritative servers are done.
index 41a28cedf450ab4eadeae6462a2fd326c431edfa..dcf38542499eaf7ed4cfa35ef92eb735e161c366 100644 (file)
@@ -61,6 +61,9 @@ int ub_c_wrap(void);
 /** print error with file and line number */
 void ub_c_error(const char *message);
 
+/** init ports possible for use */
+static void init_outgoing_availports(int* array, int num);
+
 struct config_file* 
 config_create()
 {
@@ -96,6 +99,9 @@ config_create()
        cfg->infra_cache_slabs = 4;
        cfg->infra_cache_numhosts = 10000;
        cfg->infra_cache_lame_size = 10240; /* easily 40 or more entries */
+       if(!(cfg->outgoing_avail_ports = (int*)calloc(65536, sizeof(int))))
+               goto error_exit;
+       init_outgoing_availports(cfg->outgoing_avail_ports, 65536);
        if(!(cfg->username = strdup("unbound"))) goto error_exit;
        if(!(cfg->chrootdir = strdup(CHROOT_DIR))) goto error_exit;
        if(!(cfg->directory = strdup(RUN_DIR))) goto error_exit;
@@ -434,6 +440,7 @@ config_delete(struct config_file* cfg)
        free(cfg->identity);
        free(cfg->version);
        free(cfg->module_conf);
+       free(cfg->outgoing_avail_ports);
        config_delstrlist(cfg->trust_anchor_file_list);
        config_delstrlist(cfg->trusted_keys_file_list);
        config_delstrlist(cfg->trust_anchor_list);
@@ -445,6 +452,80 @@ config_delete(struct config_file* cfg)
        free(cfg);
 }
 
+static void 
+init_outgoing_availports(int* a, int num)
+{
+       /* generated with
+          grep "/udp" /etc/services | awk '{print $2;}' | sed -e 's?/udp??' | sort -n | grep -v 0 | sed -e 's/^\(.*\)$/\1,/' > util/iana_ports.inc
+        */
+       const int iana_assigned[] = {
+#include "util/iana_ports.inc"
+               0 }; /* trailing 0 to put behind trailing comma */
+
+       int i;
+       /* do not use <1024, that could be trouble with the system, privs */
+       for(i=1024; i<num; i++) {
+               a[i] = i;
+       }
+       /* pick out all the IANA assigned ports */
+       for(i=0; iana_assigned[i]; i++) {
+               if(iana_assigned[i] < num)
+                       a[iana_assigned[i]] = 0;
+       }
+}
+
+int 
+cfg_mark_ports(const char* str, int allow, int* avail, int num)
+{
+       char* mid = strchr(str, '-');
+       if(!mid) {
+               int port = atoi(str);
+               if(port == 0 && strcmp(str, "0") != 0) {
+                       log_err("cannot parse port number '%s'", str);
+                       return 0;
+               }
+               if(port < num)
+                       avail[port] = (allow?port:0);
+       } else {
+               int i, low, high = atoi(mid+1);
+               char buf[16];
+               if(high == 0 && strcmp(mid+1, "0") != 0) {
+                       log_err("cannot parse port number '%s'", mid+1);
+                       return 0;
+               }
+               if( (int)(mid-str)+1 >= (int)sizeof(buf) ) {
+                       log_err("cannot parse port number '%s'", str);
+                       return 0;
+               }
+               if(mid > str)
+                       memcpy(buf, str, (size_t)(mid-str));
+               buf[mid-str] = 0;
+               low = atoi(buf);
+               if(low == 0 && strcmp(buf, "0") != 0) {
+                       log_err("cannot parse port number '%s'", buf);
+                       return 0;
+               }
+               for(i=low; i<=high; i++) {
+                       if(i < num)
+                               avail[i] = (allow?i:0);
+               }
+               return 1;
+       }
+       return 1;
+}
+
+int 
+cfg_scan_ports(int* avail, int num)
+{
+       int i;
+       int count = 0;
+       for(i=0; i<num; i++) {
+               if(avail[i])
+                       count++;
+       }
+       return count;
+}
+
 /** print error with file and line number */
 void ub_c_error_va_list(const char *fmt, va_list args)
 {
index 0f849ed0d91834f0e2aa63812748cbbda9e279d2..29e6408d07c95be309c7d7d387489f494ad1b025 100644 (file)
@@ -80,6 +80,8 @@ struct config_file {
        size_t outgoing_num_tcp;
        /** number of incoming tcp buffers per (per thread) */
        size_t incoming_num_tcp;
+       /** allowed udp port numbers, array with 0 if not allowed */
+       int* outgoing_avail_ports;
 
        /** number of bytes buffer size for DNS messages */
        size_t msg_buffer_size;
@@ -353,6 +355,25 @@ int cfg_count_numbers(const char* str);
  */
 int cfg_parse_memsize(const char* str, size_t* res);
 
+/**
+ * Mark "number" or "low-high" as available or not in ports array.
+ * @param str: string in input
+ * @param allow: give true if this range is permitted.
+ * @param avail: the array from cfg.
+ * @param num: size of the array (65536).
+ * @return: true if parsed correctly, or 0 on a parse error (and an error 
+ * is logged).
+ */
+int cfg_mark_ports(const char* str, int allow, int* avail, int num);
+
+/**
+ * Scan ports available
+ * @param avail: the array from cfg.
+ * @param num: size of the array (65536).
+ * @return the number of ports available for use.
+ */
+int cfg_scan_ports(int* avail, int num);
+
 /**
  * Used during options parsing
  */
index 33c3b90a9949c8ed1e85ea2c66dc228ad310b352..72dde41efbf5c1763f49614c486e7219e285c1cd 100644 (file)
@@ -365,8 +365,8 @@ static void yy_fatal_error (yyconst char msg[]  );
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 91
-#define YY_END_OF_BUFFER 92
+#define YY_NUM_RULES 93
+#define YY_END_OF_BUFFER 94
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -374,96 +374,97 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[794] =
+static yyconst flex_int16_t yy_accept[808] =
     {   0,
-        1,    1,   75,   75,   79,   79,   83,   83,   87,   87,
-       92,   90,    1,   73,   74,    2,   78,   91,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   75,   76,   91,   77,   91,
-       79,   80,   81,   91,   86,   83,   84,   85,   91,   87,
-       88,   89,   91,   90,    0,    1,    2,    2,    2,    2,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   75,    0,
-       79,    0,   86,    0,   83,   87,    0,   90,   90,   90,
-
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   44,   90,   90,   90,   90,    6,   90,   90,   90,
-
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   19,   90,   90,   11,   12,
-       90,   14,   13,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,    3,   90,   90,
-
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   82,   90,
-       90,   90,   90,   90,   90,   90,   90,   22,   90,   90,
-       90,   90,   90,   90,   23,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   56,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   55,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-
-       90,   90,   90,   90,   20,   90,   90,   90,   90,   90,
-       90,   90,   90,   21,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       16,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   45,   46,   43,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,    5,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   70,
-       69,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       24,   90,   90,   90,   90,   90,   90,   68,   90,   90,
-
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   40,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,    4,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   15,   90,   48,
-       49,   47,   90,   90,   90,   90,   54,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       60,   90,   90,   90,   90,   90,   90,   90,   90,   30,
-       90,   90,   90,   90,   90,   53,   90,   90,   90,   90,
-
-       90,   90,   90,   90,   90,   57,   90,   90,   90,   90,
-       90,   90,    7,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   62,   90,   90,   90,   90,   52,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   31,   32,   90,
-       65,   90,   90,   26,   90,   90,   90,   90,    8,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   66,   25,   27,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   42,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   10,   90,   90,   90,   90,   90,
-
-       90,    9,   28,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       33,   90,   90,   90,   29,   90,   90,   90,   58,   59,
-       90,   90,   61,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   17,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   18,   90,   90,
-       71,   37,   90,   90,   64,   50,   90,   90,   39,   38,
-       90,   34,   90,   90,   63,   90,   90,   90,   35,   90,
-       72,   90,   51,   41,   36,   90,   90,   90,   90,   90,
-       90,   67,    0
-
+        1,    1,   77,   77,   81,   81,   85,   85,   89,   89,
+       94,   92,    1,   75,   76,    2,   80,   93,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   77,   78,   93,   79,   93,
+       81,   82,   83,   93,   88,   85,   86,   87,   93,   89,
+       90,   91,   93,   92,    0,    1,    2,    2,    2,    2,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   77,    0,
+       81,    0,   88,    0,   85,   89,    0,   92,   92,   92,
+
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   46,   92,   92,   92,   92,    6,   92,   92,   92,
+
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   21,   92,   92,   13,   14,
+       92,   16,   15,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,    3,   92,   92,
+
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   84,   92,
+       92,   92,   92,   92,   92,   92,   92,   24,   92,   92,
+       92,   92,   92,   92,   25,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   58,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   57,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+
+       92,   92,   92,   92,   22,   92,   92,   92,   92,   92,
+       92,   92,   92,   23,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       18,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   47,   48,   45,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,    5,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   72,
+       71,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       26,   92,   92,   92,   92,   92,   92,   70,   92,   92,
+
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   42,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,    4,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   17,   92,   50,
+       51,   49,   92,   92,   92,   92,   56,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       62,   92,   92,   92,   92,   92,   92,   92,   92,   32,
+       92,   92,   92,   92,   92,   55,   92,   92,   92,   92,
+
+       92,   92,   92,   92,   92,   59,   92,   92,   92,   92,
+       92,   92,   92,    7,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   64,   92,   92,   92,   92,   54,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   33,   34,
+       92,   67,   92,   92,   28,   92,   92,   92,   92,   92,
+       92,    8,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   68,   27,   29,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   44,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   12,
+
+       92,   92,   92,   92,   92,   92,   11,   92,   92,   30,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   35,   92,   92,
+       92,   92,   92,   31,   92,   92,   92,   60,   61,   92,
+       92,   63,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   19,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   20,   92,
+       10,   92,   92,   73,   39,   92,   92,   66,   52,   92,
+       92,   41,   40,   92,   36,   92,    9,   92,   65,   92,
+       92,   92,   37,   92,   74,   92,   53,   43,   38,   92,
+
+       92,   92,   92,   92,   92,   69,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -506,18 +507,18 @@ static yyconst flex_int32_t yy_meta[39] =
         1,    1,    1,    1,    1,    1,    1,    1
     } ;
 
-static yyconst flex_int16_t yy_base[805] =
+static yyconst flex_int16_t yy_base[819] =
     {   0,
         0,    0,   36,   39,   43,   50,   62,   74,   55,   67,
-     1637, 1623,   49, 1638, 1638,   81, 1638,   88,   32,   83,
+     1665, 1651,   49, 1666, 1666,   81, 1666,   88,   32,   83,
        76,   78,   60,   89,   94,   86,   87,   95,   88,   97,
-      103,  104,  112,   98,  121, 1622, 1638, 1638, 1638,   57,
-     1621, 1638, 1638,  116, 1620, 1630, 1638, 1638,  136, 1618,
-     1638, 1638,  127, 1617,  142,  146,    0,  149,    0,    0,
+      103,  104,  112,   98,  121, 1650, 1666, 1666, 1666,   57,
+     1649, 1666, 1666,  116, 1648, 1658, 1666, 1666,  136, 1646,
+     1666, 1666,  127, 1645,  142,  146,    0,  149,    0,    0,
       142,  144,  137,  146,  153,  150,  151,  152,  155,  158,
       157,  159,  165,  171,  170,  172,  173,  175,  174,  176,
-      114,  180,  185,  183,  187,  188,  195,  194, 1616,  207,
-     1615,  210, 1614,  221, 1624, 1612,  211,  209,  208,  217,
+      114,  180,  185,  183,  187,  188,  195,  194, 1644,  207,
+     1643,  210, 1642,  221, 1652, 1640,  211,  209,  208,  217,
 
       218,  232,  220,  221,  219,  222,  226,  227,  228,  234,
       238,  243,  230,  253,  254,  260,  189,  256,  246,  247,
@@ -528,7 +529,7 @@ static yyconst flex_int16_t yy_base[805] =
       348,  346,  344,  350,  352,  369,  356,  355,  357,  359,
       360,  361,  362,  376,  366,  377,  378,  381,  386,  387,
       388,  390,  391,  406,  389,  402,  409,  405,  407,  410,
-      413, 1611,  411,  415,  417,  418, 1610,  419,  425,  421,
+      413, 1639,  411,  415,  417,  418, 1638,  419,  425,  421,
 
       422,  433,  424,  437,  435,  428,  444,  439,  446,  447,
       448,  449,  450,  456,  460,  451,  462,  459,  464,  467,
@@ -536,163 +537,165 @@ static yyconst flex_int16_t yy_base[805] =
       484,  493,  498,  500,  502,  505,  512,  508,  513,  515,
       509,  511,  517,  519,  518,  530,  523,  531,  525,  532,
       538,  536,  540,  534,  541,  543,  545,  548,  551,  557,
-      547,  554,  558,  565,  560, 1609,  550,  566, 1608, 1607,
-      569, 1606, 1605,  575,  572,  573,  574,  577,  582,  586,
+      547,  554,  558,  565,  560, 1637,  550,  566, 1636, 1635,
+      569, 1634, 1633,  575,  572,  573,  574,  577,  582,  586,
       587,  584,  594,  589,  596,  599,  597,  603,  605,  606,
-      607,  609,  613,  610,  620,  614,  621, 1604,  616,  624,
+      607,  609,  613,  610,  620,  614,  621, 1632,  616,  624,
 
       623,  629,  630,  631,  637,  633,  634,  635,  638,  646,
       649,  639,  643,  648,  654,  650,  657,  659,  660,  661,
-      662,  665,  666,  668,  671,  672,  674,  676, 1603,  689,
-      688,  682,  686,  690,  694,  693,  696, 1602,  697,  701,
-      702,  704,  714,  708, 1601,  705,  716,  717,  710,  718,
+      662,  665,  666,  668,  671,  672,  674,  676, 1631,  689,
+      688,  682,  686,  690,  694,  693,  696, 1630,  697,  701,
+      702,  704,  714,  708, 1629,  705,  716,  717,  710,  718,
       721,  723,  722,  729,  735,  731,  733,  734,  736,  742,
-      740,  741,  743, 1600,  746,  753,  755,  747,  758,  760,
-      751,  761,  744,  766,  768,  769,  770,  771, 1599,  774,
+      740,  741,  743, 1628,  746,  753,  755,  747,  758,  760,
+      751,  761,  744,  766,  768,  769,  770,  771, 1627,  774,
       773,  772,  777,  793,  784,  794,  796,  790,  797,  804,
       800,  798,  806,  807,  808,  809,  811,  813,  818,  820,
 
-      822,  824,  826,  828, 1598,  836,  838,  842,  834,  840,
-      845,  841,  846, 1597,  847,  849,  848,  850,  851,  853,
+      822,  824,  826,  828, 1626,  836,  838,  842,  834,  840,
+      845,  841,  846, 1625,  847,  849,  848,  850,  851,  853,
       854,  855,  856,  861,  863,  867,  869,  880,  881,  878,
-     1596,  882,  884,  886,  888,  895,  889,  891,  892,  893,
-      896,  897,  898,  902,  903,  917, 1595, 1594, 1593,  915,
-      905,  904,  913,  921,  914,  922,  924,  925,  926, 1592,
+     1624,  882,  884,  886,  888,  895,  889,  891,  892,  893,
+      896,  897,  898,  902,  903,  917, 1623, 1622, 1621,  915,
+      905,  904,  913,  921,  914,  922,  924,  925,  926, 1620,
       930,  931,  932,  935,  936,  938,  940,  941,  943,  949,
-      939,  948,  951,  956,  960,  952,  961,  962,  963, 1591,
-     1590,  966,  965,  970,  978,  977,  969,  984,  985,  986,
-     1589,  992,  991,  989,  990,  993,  995, 1588,  998, 1001,
+      939,  948,  951,  956,  960,  952,  961,  962,  963, 1619,
+     1618,  966,  965,  970,  978,  977,  969,  984,  985,  986,
+     1617,  992,  991,  989,  990,  993,  995, 1616,  998, 1001,
 
      1003, 1004, 1006, 1010, 1014, 1019, 1021, 1023, 1027, 1029,
-     1030, 1587, 1036, 1037, 1020, 1035, 1043, 1039, 1040, 1041,
-     1042, 1045, 1046, 1048, 1049, 1051, 1053, 1056, 1586, 1062,
+     1030, 1615, 1036, 1037, 1020, 1035, 1043, 1039, 1040, 1041,
+     1042, 1045, 1046, 1048, 1049, 1051, 1053, 1056, 1614, 1062,
      1068, 1064, 1065, 1066, 1069, 1073, 1079, 1082, 1080, 1090,
-     1087, 1088, 1078, 1096, 1093, 1094, 1100, 1585, 1106, 1584,
-     1583, 1582, 1108, 1095,  776, 1110, 1581, 1097, 1112, 1101,
+     1087, 1088, 1078, 1096, 1093, 1094, 1100, 1613, 1106, 1612,
+     1611, 1610, 1108, 1095,  776, 1110, 1609, 1097, 1112, 1101,
      1104, 1118, 1119, 1120, 1122, 1123, 1132, 1124, 1128, 1135,
-     1136, 1126, 1138, 1140, 1142, 1144, 1146, 1145, 1148, 1150,
-     1580, 1154, 1152, 1166, 1159, 1151, 1167, 1170, 1173, 1579,
-     1174, 1162, 1177, 1179, 1180, 1578, 1181, 1182, 1185, 1186,
-
-     1189, 1191, 1192, 1202, 1193, 1577, 1198, 1206, 1196, 1207,
-     1209, 1210, 1576, 1217, 1183, 1218, 1212, 1220, 1221, 1222,
-     1227, 1226, 1575, 1223, 1228, 1233, 1243, 1574, 1240, 1245,
-     1239, 1241, 1247, 1249, 1250, 1251, 1252, 1573, 1572, 1256,
-     1571, 1261, 1263, 1570, 1266, 1272, 1268, 1270, 1569, 1271,
-     1273, 1277, 1274, 1278, 1279, 1281, 1283, 1284, 1280, 1287,
-     1286, 1294, 1295, 1297, 1299, 1300, 1302, 1308, 1307, 1304,
-     1309, 1565, 1561, 1560, 1310, 1312, 1320, 1324, 1313, 1325,
-     1317, 1327, 1330, 1332, 1559, 1333, 1334, 1340, 1341, 1343,
-     1342, 1349, 1350, 1351, 1555, 1344, 1346, 1357, 1352, 1363,
-
-     1365, 1554, 1550, 1367, 1354, 1368, 1372, 1377, 1379, 1374,
-     1385, 1382, 1384, 1383, 1386, 1389, 1390, 1391, 1393, 1392,
-     1549, 1396, 1397, 1406, 1548, 1398, 1408, 1400, 1542, 1514,
-     1409, 1403, 1513, 1413, 1415, 1417, 1420, 1421, 1422, 1423,
-     1425, 1429, 1432, 1512, 1426, 1441, 1445, 1438, 1434, 1451,
-     1455, 1442, 1452, 1459, 1462, 1463, 1465, 1509, 1466, 1469,
-     1508, 1507, 1471, 1472, 1506, 1505, 1456, 1476, 1502, 1501,
-     1479, 1446, 1481, 1483, 1436, 1473, 1487, 1489, 1430, 1492,
-     1229, 1493, 1013,  857,  491, 1484, 1495, 1496, 1498, 1497,
-     1500,  276, 1638, 1528, 1534, 1540, 1546,  136, 1552, 1558,
-
-     1564,   83, 1569, 1575
+     1136, 1126, 1138, 1145, 1142, 1139, 1146, 1151, 1152, 1153,
+     1608, 1154, 1155, 1162, 1156, 1163, 1168, 1166, 1174, 1607,
+     1175, 1169, 1176, 1177, 1178, 1606, 1182, 1180, 1184, 1186,
+
+     1189, 1191, 1193, 1200, 1195, 1605, 1201, 1203, 1204, 1207,
+     1208, 1209, 1210, 1604, 1216, 1217, 1218, 1220, 1221, 1223,
+     1227, 1229, 1228, 1603, 1230, 1234, 1244, 1246, 1602, 1231,
+     1247, 1233, 1248, 1251, 1239, 1255, 1256, 1259, 1601, 1600,
+     1262, 1599, 1266, 1268, 1598, 1270, 1276, 1272, 1274, 1258,
+     1275, 1597, 1277, 1281, 1284, 1285, 1286, 1287, 1288, 1291,
+     1292, 1278, 1293, 1294, 1296, 1304, 1300, 1307, 1308, 1310,
+     1316, 1314, 1315, 1318, 1593, 1589, 1588, 1319, 1320, 1322,
+     1325, 1327, 1330, 1331, 1334, 1332, 1336, 1341, 1342, 1587,
+     1340, 1343, 1350, 1351, 1352, 1356, 1359, 1360, 1361, 1583,
+
+     1358, 1362, 1364, 1366, 1371, 1372, 1582, 1373, 1374, 1578,
+     1384, 1378, 1387, 1389, 1391, 1394, 1385, 1400, 1402, 1399,
+     1396, 1404, 1405, 1406, 1407, 1408, 1409, 1577, 1410, 1416,
+     1419, 1421, 1415, 1576, 1422, 1423, 1426, 1570, 1542, 1429,
+     1427, 1541, 1435, 1437, 1438, 1439, 1441, 1442, 1443, 1444,
+     1446, 1448, 1540, 1457, 1451, 1458, 1461, 1464, 1465, 1466,
+     1472, 1474, 1449, 1475, 1478, 1482, 1483, 1487, 1539, 1489,
+     1538, 1492, 1493, 1537, 1535, 1495, 1496, 1534, 1533, 1484,
+     1500, 1532, 1530, 1506, 1529, 1507, 1528, 1509, 1499, 1497,
+     1513, 1516, 1469, 1518, 1381, 1519, 1013,  857,  491, 1502,
+
+     1522, 1510, 1523, 1525, 1527,  276, 1666, 1556, 1562, 1568,
+     1574,  136, 1580, 1586, 1592,   83, 1597, 1603
     } ;
 
-static yyconst flex_int16_t yy_def[805] =
+static yyconst flex_int16_t yy_def[819] =
     {   0,
-      793,    1,  794,  794,  795,  795,  796,  796,  797,  797,
-      793,  798,  793,  793,  793,  799,  793,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  800,  793,  793,  793,  800,
-      801,  793,  793,  801,  802,  793,  793,  793,  802,  803,
-      793,  793,  803,  798,  798,  793,  804,  799,  804,  799,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  800,  800,
-      801,  801,  802,  802,  793,  803,  803,  798,  798,  798,
-
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  798,  798,  798,  798,  798,
-      798,  798,    0,  793,  793,  793,  793,  793,  793,  793,
-
-      793,  793,  793,  793
+      807,    1,  808,  808,  809,  809,  810,  810,  811,  811,
+      807,  812,  807,  807,  807,  813,  807,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  814,  807,  807,  807,  814,
+      815,  807,  807,  815,  816,  807,  807,  807,  816,  817,
+      807,  807,  817,  812,  812,  807,  818,  813,  818,  813,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  814,  814,
+      815,  815,  816,  816,  807,  817,  817,  812,  812,  812,
+
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  812,  812,  812,
+
+      812,  812,  812,  812,  812,  812,    0,  807,  807,  807,
+      807,  807,  807,  807,  807,  807,  807,  807
     } ;
 
-static yyconst flex_int16_t yy_nxt[1677] =
+static yyconst flex_int16_t yy_nxt[1705] =
     {   0,
        12,   13,   14,   14,   15,   16,   17,   12,   12,   12,
        12,   12,   18,   19,   12,   20,   21,   12,   22,   12,
@@ -820,67 +823,71 @@ static yyconst flex_int16_t yy_nxt[1677] =
        55,  596,   55,  594,   55,  598,  588,  600,  597,  592,
        55,   55,   55,  599,   55,   55,   55,  605,   55,  604,
        55,  601,  602,  606,   55,  608,  603,   55,   55,  609,
-       55,  613,   55,  610,   55,  611,   55,   55,   55,  614,
-       55,  607,   55,   55,   55,  615,   55,  616,  620,  612,
-      617,   55,  621,  622,   55,  619,  618,  623,   55,   55,
-      624,  625,   55,  626,  628,   55,   55,  627,  630,   55,
-      629,   55,   55,   55,   55,   55,  634,   55,   55,  637,
-
-      638,   55,  639,   55,   55,   55,  635,  631,   55,  636,
-       55,  632,  633,  641,   55,  643,  640,  644,   55,   55,
-      650,   55,   55,  642,   55,  648,  645,  647,  649,   55,
-       55,  651,   55,   55,   55,   55,  646,  653,   55,   55,
-       55,   55,  657,  655,  652,   55,  660,  654,  656,  659,
-      661,   55,   55,   55,  658,   55,  662,   55,  665,   55,
-      663,   55,   55,   55,   55,  666,  670,  668,   55,  671,
-      664,  669,  672,   55,  673,   55,  667,  674,   55,  675,
-       55,  676,   55,   55,   55,   55,   55,  679,  678,   55,
-       55,   55,   55,   55,  685,   55,   55,  677,   55,   55,
-
-      680,  682,  683,  681,  684,  686,   55,   55,  691,   55,
-      689,   55,   55,  695,   55,  696,   55,  687,  688,   55,
-       55,   55,   55,  690,   55,   55,  692,  701,  693,   55,
-      694,  702,   55,  697,  698,  703,   55,   55,  705,   55,
-      699,  700,   55,  704,   55,   55,   55,  708,  707,  709,
-      706,  711,   55,   55,   55,   55,   55,  712,   55,  710,
-      714,   55,   55,   55,   55,  715,   55,  713,  721,   55,
-      716,  717,  718,  722,  719,   55,  720,   55,  725,   55,
-       55,  727,  724,  723,   55,  726,   55,  728,  729,   55,
-      730,   55,  732,  733,   55,   55,   55,   55,   55,  731,
-
-      734,   55,   55,   55,   55,   55,  736,  738,   55,   55,
-       55,  742,   55,  735,  740,   55,  737,  744,   55,  745,
-       55,   55,  748,  741,  749,   55,  743,   55,  739,   55,
-      750,  746,   55,   55,   55,   55,  747,   55,   55,  755,
-      758,   55,   55,  752,   55,  751,   55,  753,   55,  759,
-       55,  754,  761,   55,   55,  757,  762,   55,   55,  760,
-      756,  763,  765,   55,   55,  764,  766,   55,   55,  768,
-      769,   55,  767,  770,   55,   55,  772,   55,   55,  773,
-      771,   55,  775,   55,   55,   55,  774,  777,   55,  776,
-      779,   55,  778,   55,  781,   55,   55,  780,  783,   55,
-
-      784,   55,  782,  785,   55,   55,  786,   55,   55,   55,
-       55,  792,   55,   55,   55,  787,  788,   55,   55,   55,
-       55,   55,  789,  790,   55,   55,   55,  791,   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,   89,   89,
-       55,   55,   55,   89,   91,   91,   55,   55,   91,   96,
-       96,   55,   55,   55,   96,   59,   59,   55,   59,   59,
-       59,   55,   55,   55,   55,   55,   55,   55,   55,   55,
+       55,   55,  613,  610,   55,  611,  614,   55,   55,  615,
+      616,  607,  617,   55,   55,   55,   55,   55,   55,  612,
+      618,  621,  622,  624,   55,   55,  623,  625,   55,  620,
+       55,   55,  619,  628,  627,  629,   55,   55,   55,   55,
+       55,  630,   55,  626,   55,  631,   55,  635,   55,  638,
+
+      639,   55,  640,   55,  636,   55,  632,   55,  637,  633,
+      634,  642,   55,   55,  645,   55,   55,  641,  644,   55,
+       55,   55,   55,  650,  649,  643,  648,  652,   55,   55,
+       55,  654,   55,   55,  646,   55,  647,  651,  656,   55,
+       55,   55,   55,   55,  660,   55,   55,  665,  658,  657,
+      659,   55,  655,  664,  653,  662,   55,  663,   55,   55,
+       55,  661,  666,   55,  667,  668,  670,   55,   55,  669,
+       55,   55,  671,  673,   55,  674,  672,  675,   55,  676,
+       55,  677,   55,  678,   55,  679,   55,   55,   55,   55,
+       55,  681,  682,   55,  683,  684,   55,   55,   55,   55,
+
+       55,  680,  690,   55,   55,   55,   55,  685,   55,  687,
+      688,  689,   55,  691,  686,  692,   55,  696,  694,   55,
+       55,  700,   55,  701,  693,  695,   55,   55,   55,  697,
+       55,   55,   55,  707,   55,  706,  698,   55,  699,   55,
+      702,  710,   55,   55,   55,  703,   55,  712,   55,  704,
+      705,  708,   55,   55,   55,   55,  709,  714,  715,  716,
+      718,  711,   55,   55,   55,  713,  717,  719,   55,  721,
+       55,   55,   55,   55,   55,  728,   55,  720,   55,  722,
+      723,  724,  725,   55,   55,   55,   55,  729,  726,  731,
+       55,  730,  727,   55,  732,  734,   55,   55,  733,   55,
+
+      736,   55,  738,   55,  737,  739,   55,  741,   55,  735,
+      740,   55,   55,  742,   55,  743,   55,   55,   55,   55,
+       55,   55,   55,  747,  745,  751,  744,   55,   55,  749,
+      753,   55,  746,   55,   55,   55,  755,  754,   55,   55,
+      750,   55,  759,  756,  748,  752,  757,   55,  760,   55,
+       55,   55,  761,   55,   55,   55,   55,  769,   55,  766,
+       55,   55,  758,   55,  763,  770,  764,  762,  771,   55,
+       55,  765,  774,   55,  768,  775,   55,   55,   55,  780,
+      767,   55,  772,  778,   55,  779,   55,   55,  776,  782,
+       55,  773,  781,  783,   55,   55,   55,  777,  785,   55,
+
+      784,   55,  786,  787,   55,   55,  789,   55,   55,   55,
+      788,   55,   55,  790,   55,  791,  792,  793,   55,   55,
+      795,   55,   55,  794,  797,   55,  796,  798,   55,  799,
+       55,   55,  800,  801,   55,   55,  803,   55,  806,   55,
+       55,   55,   55,  802,   55,   55,   55,   55,  804,   55,
+       55,   55,   55,   55,   55,  805,   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,   89,   89,   55,   55,
+       55,   89,   91,   91,   55,   55,   91,   96,   96,   55,
+
+       55,   55,   96,   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,   55,   55,
-       55,   55,   55,   55,   97,   95,   94,   92,   90,   55,
-       97,   95,   94,   92,   90,   55,  793,   11,  793,  793,
-      793,  793,  793,  793,  793,  793,  793,  793,  793,  793,
-      793,  793,  793,  793,  793,  793,  793,  793,  793,  793,
-      793,  793,  793,  793,  793,  793,  793,  793,  793,  793,
-      793,  793,  793,  793,  793,  793
+       55,   55,   97,   95,   94,   92,   90,   55,   97,   95,
+       94,   92,   90,   55,  807,   11,  807,  807,  807,  807,
+      807,  807,  807,  807,  807,  807,  807,  807,  807,  807,
+      807,  807,  807,  807,  807,  807,  807,  807,  807,  807,
+      807,  807,  807,  807,  807,  807,  807,  807,  807,  807,
+
+      807,  807,  807,  807
     } ;
 
-static yyconst flex_int16_t yy_chk[1677] =
+static yyconst flex_int16_t yy_chk[1705] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -890,13 +897,13 @@ static yyconst flex_int16_t yy_chk[1677] =
        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,  802,   16,   16,    8,   16,   21,   18,
+        8,   23,   16,  816,   16,   16,    8,   16,   21,   18,
        22,   18,   18,   16,   18,   20,   20,   21,   26,   27,
 
        29,   24,   21,   20,   22,   24,   25,   28,   28,   30,
        34,   25,   26,   27,   24,   31,   32,   27,   30,   44,
        29,   32,   44,   30,   33,   33,   81,   28,   34,   31,
-       53,   53,   31,   35,   35,   32,  798,   49,   35,   49,
+       53,   53,   31,   35,   35,   32,  812,   49,   35,   49,
        49,   33,   49,   55,   81,   55,   55,   56,   55,   63,
        58,   56,   58,   58,   61,   58,   62,   61,   64,   62,
        65,   58,   66,   67,   68,   65,   63,   69,   68,   71,
@@ -912,7 +919,7 @@ static yyconst flex_int16_t yy_chk[1677] =
       111,  111,  107,  102,  103,  112,  108,  102,  119,  120,
       114,  112,  113,  102,  102,  114,  115,  116,  118,  122,
       121,  115,  116,  123,  118,  121,  125,  119,  120,  124,
-      126,  124,  127,  125,  128,  130,  132,  127,  792,  128,
+      126,  124,  127,  125,  128,  130,  132,  127,  806,  128,
       122,  129,  123,  129,  131,  134,  134,  135,  126,  131,
 
       132,  136,  133,  130,  127,  133,  140,  137,  142,  129,
@@ -937,7 +944,7 @@ static yyconst flex_int16_t yy_chk[1677] =
       213,  211,  214,  221,  221,  218,  222,  229,  219,  223,
       223,  222,  224,  224,  225,  226,  231,  227,  225,  228,
 
-      226,  227,  230,  785,  228,  232,  229,  230,  232,  231,
+      226,  227,  230,  799,  228,  232,  229,  230,  232,  231,
       233,  233,  234,  232,  235,  234,  232,  236,  235,  237,
       238,  241,  236,  242,  237,  239,  238,  240,  239,  243,
       245,  244,  240,  245,  243,  247,  242,  249,  241,  235,
@@ -976,7 +983,7 @@ static yyconst flex_int16_t yy_chk[1677] =
       399,  393,  400,  393,  401,  393,  402,  394,  403,  396,
       404,  402,  401,  406,  403,  407,  409,  404,  406,  408,
       407,  400,  410,  412,  408,  409,  411,  411,  413,  415,
-      417,  416,  418,  419,  417,  420,  421,  422,  423,  784,
+      417,  416,  418,  419,  417,  420,  421,  422,  423,  798,
       410,  421,  412,  424,  422,  425,  419,  413,  416,  426,
       418,  427,  424,  420,  415,  423,  427,  428,  429,  425,
       430,  430,  428,  429,  432,  433,  433,  434,  434,  426,
@@ -994,7 +1001,7 @@ static yyconst flex_int16_t yy_chk[1677] =
 
       487,  494,  495,  493,  492,  496,  493,  497,  488,  494,
       499,  490,  493,  500,  489,  501,  502,  500,  503,  495,
-      501,  502,  504,  496,  497,  783,  505,  503,  507,  499,
+      501,  502,  504,  496,  497,  797,  505,  503,  507,  499,
       506,  506,  515,  507,  508,  508,  504,  505,  509,  509,
       510,  510,  511,  513,  514,  511,  516,  516,  513,  514,
       517,  518,  519,  520,  521,  517,  515,  522,  523,  523,
@@ -1008,64 +1015,68 @@ static yyconst flex_int16_t yy_chk[1677] =
       553,  556,  556,  554,  559,  559,  545,  561,  558,  549,
       562,  563,  564,  560,  565,  566,  568,  566,  572,  565,
       569,  562,  563,  567,  567,  569,  564,  570,  571,  570,
-      573,  574,  574,  571,  575,  572,  576,  578,  577,  575,
-      579,  568,  580,  586,  583,  576,  582,  576,  580,  573,
-      577,  585,  582,  583,  592,  579,  578,  584,  584,  587,
-      585,  586,  588,  587,  589,  589,  591,  588,  592,  593,
-      591,  594,  595,  597,  598,  615,  597,  599,  600,  600,
-
-      601,  601,  602,  602,  603,  605,  598,  593,  609,  599,
-      607,  594,  595,  604,  604,  607,  603,  608,  608,  610,
-      615,  611,  612,  605,  617,  612,  609,  611,  614,  614,
-      616,  616,  618,  619,  620,  624,  610,  618,  622,  621,
-      625,  781,  622,  620,  617,  626,  626,  619,  621,  625,
-      627,  631,  629,  632,  624,  627,  629,  630,  632,  633,
-      630,  634,  635,  636,  637,  633,  637,  635,  640,  640,
-      631,  636,  642,  642,  643,  643,  634,  645,  645,  646,
-      647,  647,  648,  650,  646,  651,  653,  651,  650,  652,
-      654,  655,  659,  656,  657,  657,  658,  648,  661,  660,
-
-      652,  654,  655,  653,  656,  658,  662,  663,  663,  664,
-      661,  665,  666,  667,  667,  668,  670,  659,  660,  669,
-      668,  671,  675,  662,  676,  679,  664,  676,  665,  681,
-      666,  677,  677,  669,  670,  678,  678,  680,  680,  682,
-      671,  675,  683,  679,  684,  686,  687,  683,  682,  684,
-      681,  687,  688,  689,  691,  690,  696,  688,  697,  686,
-      690,  692,  693,  694,  699,  691,  705,  689,  698,  698,
-      692,  693,  694,  699,  696,  700,  697,  701,  704,  704,
-      706,  706,  701,  700,  707,  705,  710,  707,  708,  708,
-      709,  709,  711,  712,  712,  714,  713,  711,  715,  710,
-
-      713,  716,  717,  718,  720,  719,  715,  717,  722,  723,
-      726,  722,  728,  714,  719,  732,  716,  724,  724,  726,
-      727,  731,  731,  720,  732,  734,  723,  735,  718,  736,
-      734,  727,  737,  738,  739,  740,  728,  741,  745,  739,
-      742,  742,  779,  736,  743,  735,  749,  737,  775,  743,
-      748,  738,  746,  746,  752,  741,  747,  747,  772,  745,
-      740,  748,  750,  750,  753,  749,  751,  751,  767,  753,
-      754,  754,  752,  755,  755,  756,  757,  757,  759,  759,
-      756,  760,  763,  763,  764,  776,  760,  767,  768,  764,
-      771,  771,  768,  773,  774,  774,  786,  773,  777,  777,
-
-      778,  778,  776,  780,  780,  782,  782,  787,  788,  790,
-      789,  791,  791,  770,  769,  786,  787,  766,  765,  762,
-      761,  758,  788,  789,  744,  733,  730,  790,  794,  794,
-      794,  794,  794,  794,  795,  795,  795,  795,  795,  795,
-      796,  796,  796,  796,  796,  796,  797,  797,  797,  797,
-      797,  797,  799,  799,  729,  799,  799,  799,  800,  800,
-      725,  721,  703,  800,  801,  801,  702,  695,  801,  803,
-      803,  685,  674,  673,  803,  804,  804,  672,  804,  804,
-      804,  649,  644,  641,  639,  638,  628,  623,  613,  606,
-      596,  590,  581,  557,  552,  551,  550,  548,  529,  512,
-
-      498,  491,  481,  480,  460,  449,  448,  447,  431,  414,
-      405,  379,  364,  345,  338,  329,  298,  273,  272,  270,
-      269,  266,  197,  192,   96,   95,   93,   91,   89,   54,
-       50,   46,   45,   41,   36,   12,   11,  793,  793,  793,
-      793,  793,  793,  793,  793,  793,  793,  793,  793,  793,
-      793,  793,  793,  793,  793,  793,  793,  793,  793,  793,
-      793,  793,  793,  793,  793,  793,  793,  793,  793,  793,
-      793,  793,  793,  793,  793,  793
+      573,  576,  574,  571,  575,  572,  574,  574,  577,  575,
+      576,  568,  576,  578,  579,  580,  582,  583,  585,  573,
+      577,  580,  582,  584,  584,  586,  583,  585,  588,  579,
+      587,  592,  578,  588,  587,  589,  589,  591,  593,  594,
+      595,  591,  598,  586,  597,  592,  599,  597,  600,  600,
+
+      601,  601,  602,  602,  598,  603,  593,  605,  599,  594,
+      595,  604,  604,  607,  608,  608,  609,  603,  607,  610,
+      611,  612,  613,  613,  612,  605,  611,  615,  615,  616,
+      617,  617,  618,  619,  609,  620,  610,  613,  619,  621,
+      623,  622,  625,  630,  623,  632,  626,  630,  621,  620,
+      622,  635,  618,  628,  616,  626,  627,  627,  628,  631,
+      633,  625,  631,  634,  632,  633,  635,  636,  637,  634,
+      650,  638,  636,  638,  641,  641,  637,  643,  643,  644,
+      644,  646,  646,  647,  648,  648,  649,  651,  647,  653,
+      662,  650,  651,  654,  653,  654,  655,  656,  657,  658,
+
+      659,  649,  660,  660,  661,  663,  664,  655,  665,  657,
+      658,  659,  667,  661,  656,  662,  666,  666,  664,  668,
+      669,  670,  670,  671,  663,  665,  672,  673,  671,  667,
+      674,  678,  679,  680,  680,  679,  668,  681,  669,  682,
+      672,  683,  683,  684,  686,  673,  685,  685,  687,  674,
+      678,  681,  691,  688,  689,  692,  682,  687,  688,  689,
+      692,  684,  693,  694,  695,  686,  691,  693,  696,  695,
+      701,  697,  698,  699,  702,  703,  703,  694,  704,  696,
+      697,  698,  699,  705,  706,  708,  709,  704,  701,  706,
+      712,  705,  702,  795,  708,  711,  711,  717,  709,  713,
+
+      713,  714,  715,  715,  714,  716,  716,  718,  721,  712,
+      717,  720,  718,  719,  719,  720,  722,  723,  724,  725,
+      726,  727,  729,  724,  722,  729,  721,  733,  730,  726,
+      731,  731,  723,  732,  735,  736,  733,  732,  737,  741,
+      727,  740,  740,  735,  725,  730,  736,  743,  741,  744,
+      745,  746,  743,  747,  748,  749,  750,  751,  751,  748,
+      752,  763,  737,  755,  745,  752,  746,  744,  754,  754,
+      756,  747,  757,  757,  750,  758,  758,  759,  760,  763,
+      749,  793,  755,  761,  761,  762,  762,  764,  759,  765,
+      765,  756,  764,  766,  766,  767,  780,  760,  768,  768,
+
+      767,  770,  770,  772,  772,  773,  776,  776,  777,  790,
+      773,  789,  781,  777,  800,  780,  781,  784,  784,  786,
+      788,  788,  802,  786,  791,  791,  790,  792,  792,  794,
+      794,  796,  796,  800,  801,  803,  802,  804,  805,  805,
+      787,  785,  783,  801,  782,  779,  778,  775,  803,  774,
+      771,  769,  753,  742,  739,  804,  808,  808,  808,  808,
+      808,  808,  809,  809,  809,  809,  809,  809,  810,  810,
+      810,  810,  810,  810,  811,  811,  811,  811,  811,  811,
+      813,  813,  738,  813,  813,  813,  814,  814,  734,  728,
+      710,  814,  815,  815,  707,  700,  815,  817,  817,  690,
+
+      677,  676,  817,  818,  818,  675,  818,  818,  818,  652,
+      645,  642,  640,  639,  629,  624,  614,  606,  596,  590,
+      581,  557,  552,  551,  550,  548,  529,  512,  498,  491,
+      481,  480,  460,  449,  448,  447,  431,  414,  405,  379,
+      364,  345,  338,  329,  298,  273,  272,  270,  269,  266,
+      197,  192,   96,   95,   93,   91,   89,   54,   50,   46,
+       45,   41,   36,   12,   11,  807,  807,  807,  807,  807,
+      807,  807,  807,  807,  807,  807,  807,  807,  807,  807,
+      807,  807,  807,  807,  807,  807,  807,  807,  807,  807,
+      807,  807,  807,  807,  807,  807,  807,  807,  807,  807,
+
+      807,  807,  807,  807
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1171,7 +1182,7 @@ static void config_end_include(void)
 #endif
 
 
-#line 1174 "<stdout>"
+#line 1185 "<stdout>"
 
 #define INITIAL 0
 #define quotedstring 1
@@ -1328,7 +1339,7 @@ YY_DECL
     
 #line 99 "util/configlexer.lex"
 
-#line 1331 "<stdout>"
+#line 1342 "<stdout>"
 
        if ( !(yy_init) )
                {
@@ -1387,13 +1398,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 >= 794 )
+                               if ( yy_current_state >= 808 )
                                        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] != 1638 );
+               while ( yy_base[yy_current_state] != 1666 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -1460,356 +1471,366 @@ YY_RULE_SETUP
 case 9:
 YY_RULE_SETUP
 #line 108 "util/configlexer.lex"
-{ YDOUT; return VAR_OUTGOING_NUM_TCP;}
+{ YDOUT; return VAR_OUTGOING_PORT_PERMIT;}
        YY_BREAK
 case 10:
 YY_RULE_SETUP
 #line 109 "util/configlexer.lex"
-{ YDOUT; return VAR_INCOMING_NUM_TCP;}
+{ YDOUT; return VAR_OUTGOING_PORT_AVOID;}
        YY_BREAK
 case 11:
 YY_RULE_SETUP
 #line 110 "util/configlexer.lex"
-{ YDOUT; return VAR_DO_IP4;}
+{ YDOUT; return VAR_OUTGOING_NUM_TCP;}
        YY_BREAK
 case 12:
 YY_RULE_SETUP
 #line 111 "util/configlexer.lex"
-{ YDOUT; return VAR_DO_IP6;}
+{ YDOUT; return VAR_INCOMING_NUM_TCP;}
        YY_BREAK
 case 13:
 YY_RULE_SETUP
 #line 112 "util/configlexer.lex"
-{ YDOUT; return VAR_DO_UDP;}
+{ YDOUT; return VAR_DO_IP4;}
        YY_BREAK
 case 14:
 YY_RULE_SETUP
 #line 113 "util/configlexer.lex"
-{ YDOUT; return VAR_DO_TCP;}
+{ YDOUT; return VAR_DO_IP6;}
        YY_BREAK
 case 15:
 YY_RULE_SETUP
 #line 114 "util/configlexer.lex"
-{ YDOUT; return VAR_DO_DAEMONIZE;}
+{ YDOUT; return VAR_DO_UDP;}
        YY_BREAK
 case 16:
 YY_RULE_SETUP
 #line 115 "util/configlexer.lex"
-{ YDOUT; return VAR_INTERFACE;}
+{ YDOUT; return VAR_DO_TCP;}
        YY_BREAK
 case 17:
 YY_RULE_SETUP
 #line 116 "util/configlexer.lex"
-{ YDOUT; return VAR_OUTGOING_INTERFACE;}
+{ YDOUT; return VAR_DO_DAEMONIZE;}
        YY_BREAK
 case 18:
 YY_RULE_SETUP
 #line 117 "util/configlexer.lex"
-{ YDOUT; return VAR_INTERFACE_AUTOMATIC;}
+{ YDOUT; return VAR_INTERFACE;}
        YY_BREAK
 case 19:
 YY_RULE_SETUP
 #line 118 "util/configlexer.lex"
-{ YDOUT; return VAR_CHROOT;}
+{ YDOUT; return VAR_OUTGOING_INTERFACE;}
        YY_BREAK
 case 20:
 YY_RULE_SETUP
 #line 119 "util/configlexer.lex"
-{ YDOUT; return VAR_USERNAME;}
+{ YDOUT; return VAR_INTERFACE_AUTOMATIC;}
        YY_BREAK
 case 21:
 YY_RULE_SETUP
 #line 120 "util/configlexer.lex"
-{ YDOUT; return VAR_DIRECTORY;}
+{ YDOUT; return VAR_CHROOT;}
        YY_BREAK
 case 22:
 YY_RULE_SETUP
 #line 121 "util/configlexer.lex"
-{ YDOUT; return VAR_LOGFILE;}
+{ YDOUT; return VAR_USERNAME;}
        YY_BREAK
 case 23:
 YY_RULE_SETUP
 #line 122 "util/configlexer.lex"
-{ YDOUT; return VAR_PIDFILE;}
+{ YDOUT; return VAR_DIRECTORY;}
        YY_BREAK
 case 24:
 YY_RULE_SETUP
 #line 123 "util/configlexer.lex"
-{ YDOUT; return VAR_ROOT_HINTS;}
+{ YDOUT; return VAR_LOGFILE;}
        YY_BREAK
 case 25:
 YY_RULE_SETUP
 #line 124 "util/configlexer.lex"
-{ YDOUT; return VAR_MSG_BUFFER_SIZE;}
+{ YDOUT; return VAR_PIDFILE;}
        YY_BREAK
 case 26:
 YY_RULE_SETUP
 #line 125 "util/configlexer.lex"
-{ YDOUT; return VAR_MSG_CACHE_SIZE;}
+{ YDOUT; return VAR_ROOT_HINTS;}
        YY_BREAK
 case 27:
 YY_RULE_SETUP
 #line 126 "util/configlexer.lex"
-{ YDOUT; return VAR_MSG_CACHE_SLABS;}
+{ YDOUT; return VAR_MSG_BUFFER_SIZE;}
        YY_BREAK
 case 28:
 YY_RULE_SETUP
 #line 127 "util/configlexer.lex"
-{ YDOUT; return VAR_RRSET_CACHE_SIZE;}
+{ YDOUT; return VAR_MSG_CACHE_SIZE;}
        YY_BREAK
 case 29:
 YY_RULE_SETUP
 #line 128 "util/configlexer.lex"
-{ YDOUT; return VAR_RRSET_CACHE_SLABS;}
+{ YDOUT; return VAR_MSG_CACHE_SLABS;}
        YY_BREAK
 case 30:
 YY_RULE_SETUP
 #line 129 "util/configlexer.lex"
-{ YDOUT; return VAR_CACHE_MAX_TTL;}
+{ YDOUT; return VAR_RRSET_CACHE_SIZE;}
        YY_BREAK
 case 31:
 YY_RULE_SETUP
 #line 130 "util/configlexer.lex"
-{ YDOUT; return VAR_INFRA_HOST_TTL;}
+{ YDOUT; return VAR_RRSET_CACHE_SLABS;}
        YY_BREAK
 case 32:
 YY_RULE_SETUP
 #line 131 "util/configlexer.lex"
-{ YDOUT; return VAR_INFRA_LAME_TTL;}
+{ YDOUT; return VAR_CACHE_MAX_TTL;}
        YY_BREAK
 case 33:
 YY_RULE_SETUP
 #line 132 "util/configlexer.lex"
-{ YDOUT; return VAR_INFRA_CACHE_SLABS;}
+{ YDOUT; return VAR_INFRA_HOST_TTL;}
        YY_BREAK
 case 34:
 YY_RULE_SETUP
 #line 133 "util/configlexer.lex"
-{ YDOUT; return VAR_INFRA_CACHE_NUMHOSTS;}
+{ YDOUT; return VAR_INFRA_LAME_TTL;}
        YY_BREAK
 case 35:
 YY_RULE_SETUP
 #line 134 "util/configlexer.lex"
-{ YDOUT; return VAR_INFRA_CACHE_LAME_SIZE;}
+{ YDOUT; return VAR_INFRA_CACHE_SLABS;}
        YY_BREAK
 case 36:
 YY_RULE_SETUP
 #line 135 "util/configlexer.lex"
-{ YDOUT; return VAR_NUM_QUERIES_PER_THREAD;}
+{ YDOUT; return VAR_INFRA_CACHE_NUMHOSTS;}
        YY_BREAK
 case 37:
 YY_RULE_SETUP
 #line 136 "util/configlexer.lex"
-{ YDOUT; return VAR_TARGET_FETCH_POLICY;}
+{ YDOUT; return VAR_INFRA_CACHE_LAME_SIZE;}
        YY_BREAK
 case 38:
 YY_RULE_SETUP
 #line 137 "util/configlexer.lex"
-{ YDOUT; return VAR_HARDEN_SHORT_BUFSIZE;}
+{ YDOUT; return VAR_NUM_QUERIES_PER_THREAD;}
        YY_BREAK
 case 39:
 YY_RULE_SETUP
 #line 138 "util/configlexer.lex"
-{ YDOUT; return VAR_HARDEN_LARGE_QUERIES;}
+{ YDOUT; return VAR_TARGET_FETCH_POLICY;}
        YY_BREAK
 case 40:
 YY_RULE_SETUP
 #line 139 "util/configlexer.lex"
-{ YDOUT; return VAR_HARDEN_GLUE;}
+{ YDOUT; return VAR_HARDEN_SHORT_BUFSIZE;}
        YY_BREAK
 case 41:
 YY_RULE_SETUP
 #line 140 "util/configlexer.lex"
-{ YDOUT; return VAR_HARDEN_DNNSEC_STRIPPED;}
+{ YDOUT; return VAR_HARDEN_LARGE_QUERIES;}
        YY_BREAK
 case 42:
 YY_RULE_SETUP
 #line 141 "util/configlexer.lex"
-{ YDOUT; return VAR_USE_CAPS_FOR_ID;}
+{ YDOUT; return VAR_HARDEN_GLUE;}
        YY_BREAK
 case 43:
 YY_RULE_SETUP
 #line 142 "util/configlexer.lex"
-{ YDOUT; return VAR_STUB_ZONE;}
+{ YDOUT; return VAR_HARDEN_DNNSEC_STRIPPED;}
        YY_BREAK
 case 44:
 YY_RULE_SETUP
 #line 143 "util/configlexer.lex"
-{ YDOUT; return VAR_NAME;}
+{ YDOUT; return VAR_USE_CAPS_FOR_ID;}
        YY_BREAK
 case 45:
 YY_RULE_SETUP
 #line 144 "util/configlexer.lex"
-{ YDOUT; return VAR_STUB_ADDR;}
+{ YDOUT; return VAR_STUB_ZONE;}
        YY_BREAK
 case 46:
 YY_RULE_SETUP
 #line 145 "util/configlexer.lex"
-{ YDOUT; return VAR_STUB_HOST;}
+{ YDOUT; return VAR_NAME;}
        YY_BREAK
 case 47:
 YY_RULE_SETUP
 #line 146 "util/configlexer.lex"
-{ YDOUT; return VAR_FORWARD_ZONE;}
+{ YDOUT; return VAR_STUB_ADDR;}
        YY_BREAK
 case 48:
 YY_RULE_SETUP
 #line 147 "util/configlexer.lex"
-{ YDOUT; return VAR_FORWARD_ADDR;}
+{ YDOUT; return VAR_STUB_HOST;}
        YY_BREAK
 case 49:
 YY_RULE_SETUP
 #line 148 "util/configlexer.lex"
-{ YDOUT; return VAR_FORWARD_HOST;}
+{ YDOUT; return VAR_FORWARD_ZONE;}
        YY_BREAK
 case 50:
 YY_RULE_SETUP
 #line 149 "util/configlexer.lex"
-{ YDOUT; return VAR_DO_NOT_QUERY_ADDRESS;}
+{ YDOUT; return VAR_FORWARD_ADDR;}
        YY_BREAK
 case 51:
 YY_RULE_SETUP
 #line 150 "util/configlexer.lex"
-{ YDOUT; return VAR_DO_NOT_QUERY_LOCALHOST;}
+{ YDOUT; return VAR_FORWARD_HOST;}
        YY_BREAK
 case 52:
 YY_RULE_SETUP
 #line 151 "util/configlexer.lex"
-{ YDOUT; return VAR_ACCESS_CONTROL;}
+{ YDOUT; return VAR_DO_NOT_QUERY_ADDRESS;}
        YY_BREAK
 case 53:
 YY_RULE_SETUP
 #line 152 "util/configlexer.lex"
-{ YDOUT; return VAR_HIDE_IDENTITY;}
+{ YDOUT; return VAR_DO_NOT_QUERY_LOCALHOST;}
        YY_BREAK
 case 54:
 YY_RULE_SETUP
 #line 153 "util/configlexer.lex"
-{ YDOUT; return VAR_HIDE_VERSION;}
+{ YDOUT; return VAR_ACCESS_CONTROL;}
        YY_BREAK
 case 55:
 YY_RULE_SETUP
 #line 154 "util/configlexer.lex"
-{ YDOUT; return VAR_IDENTITY;}
+{ YDOUT; return VAR_HIDE_IDENTITY;}
        YY_BREAK
 case 56:
 YY_RULE_SETUP
 #line 155 "util/configlexer.lex"
-{ YDOUT; return VAR_VERSION;}
+{ YDOUT; return VAR_HIDE_VERSION;}
        YY_BREAK
 case 57:
 YY_RULE_SETUP
 #line 156 "util/configlexer.lex"
-{ YDOUT; return VAR_MODULE_CONF;}
+{ YDOUT; return VAR_IDENTITY;}
        YY_BREAK
 case 58:
 YY_RULE_SETUP
 #line 157 "util/configlexer.lex"
-{ YDOUT; return VAR_TRUST_ANCHOR_FILE;}
+{ YDOUT; return VAR_VERSION;}
        YY_BREAK
 case 59:
 YY_RULE_SETUP
 #line 158 "util/configlexer.lex"
-{ YDOUT; return VAR_TRUSTED_KEYS_FILE;}
+{ YDOUT; return VAR_MODULE_CONF;}
        YY_BREAK
 case 60:
 YY_RULE_SETUP
 #line 159 "util/configlexer.lex"
-{ YDOUT; return VAR_TRUST_ANCHOR;}
+{ YDOUT; return VAR_TRUST_ANCHOR_FILE;}
        YY_BREAK
 case 61:
 YY_RULE_SETUP
 #line 160 "util/configlexer.lex"
-{ YDOUT; return VAR_VAL_OVERRIDE_DATE;}
+{ YDOUT; return VAR_TRUSTED_KEYS_FILE;}
        YY_BREAK
 case 62:
 YY_RULE_SETUP
 #line 161 "util/configlexer.lex"
-{ YDOUT; return VAR_BOGUS_TTL;}
+{ YDOUT; return VAR_TRUST_ANCHOR;}
        YY_BREAK
 case 63:
 YY_RULE_SETUP
 #line 162 "util/configlexer.lex"
-{ YDOUT; return VAR_VAL_CLEAN_ADDITIONAL;}
+{ YDOUT; return VAR_VAL_OVERRIDE_DATE;}
        YY_BREAK
 case 64:
 YY_RULE_SETUP
 #line 163 "util/configlexer.lex"
-{ YDOUT; return VAR_VAL_PERMISSIVE_MODE;}
+{ YDOUT; return VAR_BOGUS_TTL;}
        YY_BREAK
 case 65:
 YY_RULE_SETUP
 #line 164 "util/configlexer.lex"
-{ YDOUT; return VAR_KEY_CACHE_SIZE;}
+{ YDOUT; return VAR_VAL_CLEAN_ADDITIONAL;}
        YY_BREAK
 case 66:
 YY_RULE_SETUP
 #line 165 "util/configlexer.lex"
-{ YDOUT; return VAR_KEY_CACHE_SLABS;}
+{ YDOUT; return VAR_VAL_PERMISSIVE_MODE;}
        YY_BREAK
 case 67:
 YY_RULE_SETUP
 #line 166 "util/configlexer.lex"
-{ YDOUT; return VAR_VAL_NSEC3_KEYSIZE_ITERATIONS;}
+{ YDOUT; return VAR_KEY_CACHE_SIZE;}
        YY_BREAK
 case 68:
 YY_RULE_SETUP
 #line 167 "util/configlexer.lex"
-{ YDOUT; return VAR_USE_SYSLOG;}
+{ YDOUT; return VAR_KEY_CACHE_SLABS;}
        YY_BREAK
 case 69:
 YY_RULE_SETUP
 #line 168 "util/configlexer.lex"
-{ YDOUT; return VAR_LOCAL_ZONE;}
+{ YDOUT; return VAR_VAL_NSEC3_KEYSIZE_ITERATIONS;}
        YY_BREAK
 case 70:
 YY_RULE_SETUP
 #line 169 "util/configlexer.lex"
-{ YDOUT; return VAR_LOCAL_DATA;}
+{ YDOUT; return VAR_USE_SYSLOG;}
        YY_BREAK
 case 71:
 YY_RULE_SETUP
 #line 170 "util/configlexer.lex"
-{ YDOUT; return VAR_STATISTICS_INTERVAL;}
+{ YDOUT; return VAR_LOCAL_ZONE;}
        YY_BREAK
 case 72:
 YY_RULE_SETUP
 #line 171 "util/configlexer.lex"
-{ YDOUT; return VAR_STATISTICS_CUMULATIVE;}
+{ YDOUT; return VAR_LOCAL_DATA;}
        YY_BREAK
 case 73:
-/* rule 73 can match eol */
 YY_RULE_SETUP
 #line 172 "util/configlexer.lex"
+{ YDOUT; return VAR_STATISTICS_INTERVAL;}
+       YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 173 "util/configlexer.lex"
+{ YDOUT; return VAR_STATISTICS_CUMULATIVE;}
+       YY_BREAK
+case 75:
+/* rule 75 can match eol */
+YY_RULE_SETUP
+#line 174 "util/configlexer.lex"
 { LEXOUT(("NL\n")); cfg_parser->line++;}
        YY_BREAK
 /* Quoted strings. Strip leading and ending quotes */
-case 74:
+case 76:
 YY_RULE_SETUP
-#line 175 "util/configlexer.lex"
+#line 177 "util/configlexer.lex"
 { BEGIN(quotedstring); LEXOUT(("QS ")); }
        YY_BREAK
 case YY_STATE_EOF(quotedstring):
-#line 176 "util/configlexer.lex"
+#line 178 "util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
         BEGIN(INITIAL);
 }
        YY_BREAK
-case 75:
+case 77:
 YY_RULE_SETUP
-#line 180 "util/configlexer.lex"
+#line 182 "util/configlexer.lex"
 { LEXOUT(("STR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 76:
-/* rule 76 can match eol */
+case 78:
+/* rule 78 can match eol */
 YY_RULE_SETUP
-#line 181 "util/configlexer.lex"
+#line 183 "util/configlexer.lex"
 { cfg_parser->line++; yymore(); }
        YY_BREAK
-case 77:
+case 79:
 YY_RULE_SETUP
-#line 182 "util/configlexer.lex"
+#line 184 "util/configlexer.lex"
 {
         LEXOUT(("QE "));
         BEGIN(INITIAL);
@@ -1821,32 +1842,32 @@ YY_RULE_SETUP
 }
        YY_BREAK
 /* Single Quoted strings. Strip leading and ending quotes */
-case 78:
+case 80:
 YY_RULE_SETUP
-#line 193 "util/configlexer.lex"
+#line 195 "util/configlexer.lex"
 { BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
        YY_BREAK
 case YY_STATE_EOF(singlequotedstr):
-#line 194 "util/configlexer.lex"
+#line 196 "util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
         BEGIN(INITIAL);
 }
        YY_BREAK
-case 79:
+case 81:
 YY_RULE_SETUP
-#line 198 "util/configlexer.lex"
+#line 200 "util/configlexer.lex"
 { LEXOUT(("STR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 80:
-/* rule 80 can match eol */
+case 82:
+/* rule 82 can match eol */
 YY_RULE_SETUP
-#line 199 "util/configlexer.lex"
+#line 201 "util/configlexer.lex"
 { cfg_parser->line++; yymore(); }
        YY_BREAK
-case 81:
+case 83:
 YY_RULE_SETUP
-#line 200 "util/configlexer.lex"
+#line 202 "util/configlexer.lex"
 {
         LEXOUT(("SQE "));
         BEGIN(INITIAL);
@@ -1858,37 +1879,37 @@ YY_RULE_SETUP
 }
        YY_BREAK
 /* include: directive */
-case 82:
+case 84:
 YY_RULE_SETUP
-#line 211 "util/configlexer.lex"
+#line 213 "util/configlexer.lex"
 { LEXOUT(("v(%s) ", yytext)); BEGIN(include); }
        YY_BREAK
 case YY_STATE_EOF(include):
-#line 212 "util/configlexer.lex"
+#line 214 "util/configlexer.lex"
 {
         yyerror("EOF inside include directive");
         BEGIN(INITIAL);
 }
        YY_BREAK
-case 83:
+case 85:
 YY_RULE_SETUP
-#line 216 "util/configlexer.lex"
+#line 218 "util/configlexer.lex"
 { LEXOUT(("ISP ")); /* ignore */ }
        YY_BREAK
-case 84:
-/* rule 84 can match eol */
+case 86:
+/* rule 86 can match eol */
 YY_RULE_SETUP
-#line 217 "util/configlexer.lex"
+#line 219 "util/configlexer.lex"
 { LEXOUT(("NL\n")); cfg_parser->line++;}
        YY_BREAK
-case 85:
+case 87:
 YY_RULE_SETUP
-#line 218 "util/configlexer.lex"
+#line 220 "util/configlexer.lex"
 { LEXOUT(("IQS ")); BEGIN(include_quoted); }
        YY_BREAK
-case 86:
+case 88:
 YY_RULE_SETUP
-#line 219 "util/configlexer.lex"
+#line 221 "util/configlexer.lex"
 {
        LEXOUT(("Iunquotedstr(%s) ", yytext));
        config_start_include(yytext);
@@ -1896,26 +1917,26 @@ YY_RULE_SETUP
 }
        YY_BREAK
 case YY_STATE_EOF(include_quoted):
-#line 224 "util/configlexer.lex"
+#line 226 "util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
         BEGIN(INITIAL);
 }
        YY_BREAK
-case 87:
+case 89:
 YY_RULE_SETUP
-#line 228 "util/configlexer.lex"
+#line 230 "util/configlexer.lex"
 { LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 88:
-/* rule 88 can match eol */
+case 90:
+/* rule 90 can match eol */
 YY_RULE_SETUP
-#line 229 "util/configlexer.lex"
+#line 231 "util/configlexer.lex"
 { cfg_parser->line++; yymore(); }
        YY_BREAK
-case 89:
+case 91:
 YY_RULE_SETUP
-#line 230 "util/configlexer.lex"
+#line 232 "util/configlexer.lex"
 {
        LEXOUT(("IQE "));
        yytext[yyleng - 1] = '\0';
@@ -1924,7 +1945,7 @@ YY_RULE_SETUP
 }
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 236 "util/configlexer.lex"
+#line 238 "util/configlexer.lex"
 {
        yy_set_bol(1); /* Set beginning of line, so "^" rules match.  */
        if (config_include_stack_ptr == 0) {
@@ -1935,18 +1956,18 @@ case YY_STATE_EOF(INITIAL):
        }
 }
        YY_BREAK
-case 90:
+case 92:
 YY_RULE_SETUP
-#line 246 "util/configlexer.lex"
+#line 248 "util/configlexer.lex"
 { LEXOUT(("unquotedstr(%s) ", yytext)); 
                        yylval.str = strdup(yytext); return STRING; }
        YY_BREAK
-case 91:
+case 93:
 YY_RULE_SETUP
-#line 249 "util/configlexer.lex"
+#line 251 "util/configlexer.lex"
 ECHO;
        YY_BREAK
-#line 1949 "<stdout>"
+#line 1970 "<stdout>"
 
        case YY_END_OF_BUFFER:
                {
@@ -2228,7 +2249,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 >= 794 )
+                       if ( yy_current_state >= 808 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2256,11 +2277,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 >= 794 )
+               if ( yy_current_state >= 808 )
                        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 == 793);
+       yy_is_jam = (yy_current_state == 807);
 
        return yy_is_jam ? 0 : yy_current_state;
 }
@@ -2893,7 +2914,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 249 "util/configlexer.lex"
+#line 251 "util/configlexer.lex"
 
 
 
index 988e3ed231c2789ef6d45b56a4b805aa483fd2b8..b4d55d95574b876639b0fb65f8391068a4ee05a2 100644 (file)
@@ -105,6 +105,8 @@ verbosity{COLON}    { YDOUT; return VAR_VERBOSITY;}
 port{COLON}            { YDOUT; return VAR_PORT;}
 outgoing-port{COLON}   { YDOUT; return VAR_OUTGOING_PORT;}
 outgoing-range{COLON}  { YDOUT; return VAR_OUTGOING_RANGE;}
+outgoing-port-permit{COLON}    { YDOUT; return VAR_OUTGOING_PORT_PERMIT;}
+outgoing-port-avoid{COLON}     { YDOUT; return VAR_OUTGOING_PORT_AVOID;}
 outgoing-num-tcp{COLON}        { YDOUT; return VAR_OUTGOING_NUM_TCP;}
 incoming-num-tcp{COLON}        { YDOUT; return VAR_INCOMING_NUM_TCP;}
 do-ip4{COLON}          { YDOUT; return VAR_DO_IP4;}
index 4116b1a021615dfd35baf8e7cabdaacbf9cf44e9..f2681c7f306e433b0787eb8829623391a23365c9 100644 (file)
      VAR_STATISTICS_INTERVAL = 332,
      VAR_DO_DAEMONIZE = 333,
      VAR_USE_CAPS_FOR_ID = 334,
-     VAR_STATISTICS_CUMULATIVE = 335
+     VAR_STATISTICS_CUMULATIVE = 335,
+     VAR_OUTGOING_PORT_PERMIT = 336,
+     VAR_OUTGOING_PORT_AVOID = 337
    };
 #endif
 /* Tokens.  */
 #define VAR_DO_DAEMONIZE 333
 #define VAR_USE_CAPS_FOR_ID 334
 #define VAR_STATISTICS_CUMULATIVE 335
+#define VAR_OUTGOING_PORT_PERMIT 336
+#define VAR_OUTGOING_PORT_AVOID 337
 
 
 
@@ -283,7 +287,7 @@ typedef union YYSTYPE
        char*   str;
 }
 /* Line 187 of yacc.c.  */
-#line 287 "util/configparser.c"
+#line 291 "util/configparser.c"
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -296,7 +300,7 @@ typedef union YYSTYPE
 
 
 /* Line 216 of yacc.c.  */
-#line 300 "util/configparser.c"
+#line 304 "util/configparser.c"
 
 #ifdef short
 # undef short
@@ -511,20 +515,20 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   141
+#define YYLAST   145
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  81
+#define YYNTOKENS  83
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  80
+#define YYNNTS  82
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  151
+#define YYNRULES  155
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  222
+#define YYNSTATES  228
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   335
+#define YYMAXUTOK   337
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -565,7 +569,7 @@ static const yytype_uint8 yytranslate[] =
       45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
       55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
       65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80
+      75,    76,    77,    78,    79,    80,    81,    82
 };
 
 #if YYDEBUG
@@ -580,40 +584,41 @@ 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,   151,   152,   154,   156,   158,   160,
-     163,   164,   166,   168,   170,   173,   176,   179,   182,   185,
-     188,   191,   194,   197,   200,   203,   206,   209,   212,   215,
-     218,   221,   224,   227,   230,   233,   236,   239,   242,   245,
-     248,   251,   254,   257,   260,   263,   266,   269,   272,   275,
-     278,   281,   284,   287,   290,   293,   296,   299,   302,   305,
-     308,   311,   314,   317,   320,   324,   327,   330,   333,   336,
-     339,   342,   345,   348,   351,   355,   358,   361,   364,   367,
-     370,   373
+     142,   144,   146,   148,   150,   152,   155,   156,   158,   160,
+     162,   164,   167,   168,   170,   172,   174,   177,   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,   334,
+     337,   340,   343,   346,   349,   352,   355,   358,   361,   365,
+     368,   371,   374,   377,   380,   383
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int16 yyrhs[] =
 {
-      82,     0,    -1,    -1,    82,    83,    -1,    84,    85,    -1,
-      87,    88,    -1,    90,    91,    -1,    11,    -1,    85,    86,
-      -1,    -1,    93,    -1,    94,    -1,    97,    -1,   100,    -1,
-     101,    -1,   105,    -1,   106,    -1,   107,    -1,   108,    -1,
-      98,    -1,   111,    -1,   112,    -1,   113,    -1,   114,    -1,
-     115,    -1,   125,    -1,   126,    -1,   127,    -1,   128,    -1,
-     129,    -1,   102,    -1,   130,    -1,   131,    -1,   134,    -1,
-     132,    -1,   133,    -1,   135,    -1,   136,    -1,   137,    -1,
-     141,    -1,   120,    -1,   121,    -1,   122,    -1,   123,    -1,
-     138,    -1,   144,    -1,   117,    -1,   119,    -1,   145,    -1,
-     147,    -1,   148,    -1,   149,    -1,   103,    -1,   124,    -1,
-     151,    -1,   152,    -1,   118,    -1,   150,    -1,   110,    -1,
-      99,    -1,   116,    -1,   142,    -1,   146,    -1,   139,    -1,
-     143,    -1,   153,    -1,   154,    -1,   104,    -1,    95,    -1,
-     109,    -1,   140,    -1,    96,    -1,    39,    -1,    88,    89,
-      -1,    -1,   155,    -1,   156,    -1,   157,    -1,    45,    -1,
-      91,    92,    -1,    -1,   158,    -1,   159,    -1,   160,    -1,
-      13,    10,    -1,    12,    10,    -1,    77,    10,    -1,    80,
-      10,    -1,    14,    10,    -1,    17,    10,    -1,    68,    10,
-      -1,    15,    10,    -1,    16,    10,    -1,    32,    10,    -1,
+      84,     0,    -1,    -1,    84,    85,    -1,    86,    87,    -1,
+      89,    90,    -1,    92,    93,    -1,    11,    -1,    87,    88,
+      -1,    -1,    95,    -1,    96,    -1,    99,    -1,   102,    -1,
+     103,    -1,   109,    -1,   110,    -1,   111,    -1,   112,    -1,
+     100,    -1,   115,    -1,   116,    -1,   117,    -1,   118,    -1,
+     119,    -1,   129,    -1,   130,    -1,   131,    -1,   132,    -1,
+     133,    -1,   106,    -1,   134,    -1,   135,    -1,   138,    -1,
+     136,    -1,   137,    -1,   139,    -1,   140,    -1,   141,    -1,
+     145,    -1,   124,    -1,   125,    -1,   126,    -1,   127,    -1,
+     142,    -1,   148,    -1,   121,    -1,   123,    -1,   149,    -1,
+     151,    -1,   152,    -1,   153,    -1,   107,    -1,   128,    -1,
+     155,    -1,   156,    -1,   122,    -1,   154,    -1,   114,    -1,
+     101,    -1,   120,    -1,   146,    -1,   150,    -1,   143,    -1,
+     147,    -1,   157,    -1,   158,    -1,   108,    -1,    97,    -1,
+     113,    -1,   144,    -1,    98,    -1,   104,    -1,   105,    -1,
+      39,    -1,    90,    91,    -1,    -1,   159,    -1,   160,    -1,
+     161,    -1,    45,    -1,    93,    94,    -1,    -1,   162,    -1,
+     163,    -1,   164,    -1,    13,    10,    -1,    12,    10,    -1,
+      77,    10,    -1,    80,    10,    -1,    14,    10,    -1,    17,
+      10,    -1,    68,    10,    -1,    15,    10,    -1,    16,    10,
+      -1,    81,    10,    -1,    82,    10,    -1,    32,    10,    -1,
       61,    10,    -1,    76,    10,    -1,    18,    10,    -1,    19,
       10,    -1,    20,    10,    -1,    21,    10,    -1,    78,    10,
       -1,    67,    10,    -1,    22,    10,    -1,    23,    10,    -1,
@@ -637,22 +642,22 @@ static const yytype_int16 yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,    95,    95,    95,    96,    96,    97,   101,   106,   107,
-     108,   108,   108,   109,   109,   109,   110,   110,   110,   111,
-     111,   111,   112,   112,   112,   113,   113,   114,   114,   115,
-     115,   116,   116,   117,   117,   118,   118,   119,   119,   120,
-     120,   121,   121,   121,   122,   122,   122,   123,   123,   123,
-     124,   124,   125,   125,   126,   126,   127,   127,   128,   128,
-     128,   129,   129,   130,   130,   131,   131,   131,   132,   132,
-     133,   133,   135,   147,   148,   149,   149,   149,   151,   163,
-     164,   165,   165,   165,   167,   176,   185,   196,   205,   214,
-     227,   242,   251,   260,   269,   278,   287,   296,   305,   314,
-     323,   332,   346,   353,   360,   367,   375,   382,   389,   397,
-     405,   412,   421,   430,   437,   444,   455,   463,   476,   485,
-     493,   506,   515,   524,   533,   542,   555,   562,   572,   582,
-     592,   602,   612,   619,   629,   642,   649,   667,   676,   685,
-     695,   705,   712,   720,   733,   752,   759,   766,   773,   780,
-     787,   794
+       0,    96,    96,    96,    97,    97,    98,   102,   107,   108,
+     109,   109,   109,   110,   110,   110,   111,   111,   111,   112,
+     112,   112,   113,   113,   113,   114,   114,   115,   115,   116,
+     116,   117,   117,   118,   118,   119,   119,   120,   120,   121,
+     121,   122,   122,   122,   123,   123,   123,   124,   124,   124,
+     125,   125,   126,   126,   127,   127,   128,   128,   129,   129,
+     129,   130,   130,   131,   131,   132,   132,   132,   133,   133,
+     134,   134,   135,   135,   137,   149,   150,   151,   151,   151,
+     153,   165,   166,   167,   167,   167,   169,   178,   187,   198,
+     207,   216,   229,   244,   253,   262,   271,   280,   289,   298,
+     307,   316,   325,   334,   343,   352,   366,   373,   380,   387,
+     395,   402,   409,   417,   425,   432,   441,   450,   457,   464,
+     475,   483,   496,   505,   513,   526,   535,   544,   553,   562,
+     575,   582,   592,   602,   612,   622,   632,   639,   649,   662,
+     669,   687,   696,   705,   715,   725,   732,   740,   753,   772,
+     779,   786,   793,   800,   807,   814
 };
 #endif
 
@@ -685,13 +690,15 @@ static const char *const yytname[] =
   "VAR_CACHE_MAX_TTL", "VAR_HARDEN_DNNSEC_STRIPPED", "VAR_ACCESS_CONTROL",
   "VAR_LOCAL_ZONE", "VAR_LOCAL_DATA", "VAR_INTERFACE_AUTOMATIC",
   "VAR_STATISTICS_INTERVAL", "VAR_DO_DAEMONIZE", "VAR_USE_CAPS_FOR_ID",
-  "VAR_STATISTICS_CUMULATIVE", "$accept", "toplevelvars", "toplevelvar",
+  "VAR_STATISTICS_CUMULATIVE", "VAR_OUTGOING_PORT_PERMIT",
+  "VAR_OUTGOING_PORT_AVOID", "$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_port", "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",
@@ -732,29 +739,29 @@ 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
+     335,   336,   337
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    81,    82,    82,    83,    83,    83,    84,    85,    85,
-      86,    86,    86,    86,    86,    86,    86,    86,    86,    86,
-      86,    86,    86,    86,    86,    86,    86,    86,    86,    86,
-      86,    86,    86,    86,    86,    86,    86,    86,    86,    86,
-      86,    86,    86,    86,    86,    86,    86,    86,    86,    86,
-      86,    86,    86,    86,    86,    86,    86,    86,    86,    86,
-      86,    86,    86,    86,    86,    86,    86,    86,    86,    86,
-      86,    86,    87,    88,    88,    89,    89,    89,    90,    91,
-      91,    92,    92,    92,    93,    94,    95,    96,    97,    98,
+       0,    83,    84,    84,    85,    85,    85,    86,    87,    87,
+      88,    88,    88,    88,    88,    88,    88,    88,    88,    88,
+      88,    88,    88,    88,    88,    88,    88,    88,    88,    88,
+      88,    88,    88,    88,    88,    88,    88,    88,    88,    88,
+      88,    88,    88,    88,    88,    88,    88,    88,    88,    88,
+      88,    88,    88,    88,    88,    88,    88,    88,    88,    88,
+      88,    88,    88,    88,    88,    88,    88,    88,    88,    88,
+      88,    88,    88,    88,    89,    90,    90,    91,    91,    91,
+      92,    93,    93,    94,    94,    94,    95,    96,    97,    98,
       99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
      109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
      119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
      129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
      139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
      149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160
+     159,   160,   161,   162,   163,   164
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -767,15 +774,15 @@ 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,     2,     0,     1,     1,     1,     1,     2,
-       0,     1,     1,     1,     2,     2,     2,     2,     2,     2,
+       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,     3,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     3,     2,     2,     2,     2,     2,
-       2,     2
+       2,     2,     2,     2,     2,     2,     2,     2,     3,     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
@@ -783,42 +790,43 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       2,     0,     1,     7,    72,    78,     3,     9,    74,    80,
+       2,     0,     1,     7,    74,    80,     3,     9,    76,    82,
        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,
        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,
-       0,     0,     0,     0,     0,     8,    10,    11,    68,    71,
-      12,    19,    59,    13,    14,    30,    52,    67,    15,    16,
-      17,    18,    69,    58,    20,    21,    22,    23,    24,    60,
-      46,    56,    47,    40,    41,    42,    43,    53,    25,    26,
-      27,    28,    29,    31,    32,    34,    35,    33,    36,    37,
-      38,    44,    63,    70,    39,    61,    64,    45,    48,    62,
-      49,    50,    51,    57,    54,    55,    65,    66,     0,     0,
-       0,    73,    75,    76,    77,     0,     0,     0,    79,    81,
-      82,    83,    85,    84,    88,    91,    92,    89,    96,    97,
-      98,    99,   102,   103,   104,   105,   106,   116,   117,   118,
-     119,   120,    93,   121,   122,   125,   123,   124,   126,   127,
-     128,   132,   111,   112,   113,   114,   129,   135,   108,   110,
-     136,   138,   139,   140,    94,   115,   142,   143,   109,   141,
-     101,    90,   107,   133,   137,   130,     0,     0,   145,    95,
-      86,   100,   131,    87,   146,   147,   148,   149,   150,   151,
-     134,   144
+       0,     0,     0,     0,     0,     0,     0,     8,    10,    11,
+      68,    71,    12,    19,    59,    13,    14,    72,    73,    30,
+      52,    67,    15,    16,    17,    18,    69,    58,    20,    21,
+      22,    23,    24,    60,    46,    56,    47,    40,    41,    42,
+      43,    53,    25,    26,    27,    28,    29,    31,    32,    34,
+      35,    33,    36,    37,    38,    44,    63,    70,    39,    61,
+      64,    45,    48,    62,    49,    50,    51,    57,    54,    55,
+      65,    66,     0,     0,     0,    75,    77,    78,    79,     0,
+       0,     0,    81,    83,    84,    85,    87,    86,    90,    93,
+      94,    91,   100,   101,   102,   103,   106,   107,   108,   109,
+     110,   120,   121,   122,   123,   124,    97,   125,   126,   129,
+     127,   128,   130,   131,   132,   136,   115,   116,   117,   118,
+     133,   139,   112,   114,   140,   142,   143,   144,    98,   119,
+     146,   147,   113,   145,   105,    92,   111,   137,   141,   134,
+       0,     0,   149,    99,    88,   104,   135,    89,    95,    96,
+     150,   151,   152,   153,   154,   155,   138,   148
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,     6,     7,    10,    75,     8,    11,   141,     9,
-      12,   148,    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,   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,   142,   143,   144,   149,   150,   151
+      -1,     1,     6,     7,    10,    77,     8,    11,   145,     9,
+      12,   152,    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,   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,   146,   147,   148,   153,
+     154,   155
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
@@ -826,29 +834,29 @@ static const yytype_int16 yydefgoto[] =
 #define YYPACT_NINF -13
 static const yytype_int16 yypact[] =
 {
-     -13,    69,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
-     -12,    33,    32,    16,    17,    18,    19,    23,    24,    25,
-      62,    65,    66,    67,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    99,   100,   101,   102,   103,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   -13,   -13,   -13,   -13,   -13,
+     -13,    71,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
+     -12,    35,    34,    16,    17,    18,    19,    23,    24,    25,
+      64,    67,    68,    69,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   101,   102,   103,   104,   105,   107,   108,   109,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   -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,   124,   125,
-     126,   -13,   -13,   -13,   -13,   127,   128,   129,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
+     -13,   -13,   128,   129,   130,   -13,   -13,   -13,   -13,   131,
+     132,   133,   -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,   130,   131,   -13,   -13,
      -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
-     -13,   -13
+     134,   135,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
+     -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13
 };
 
 /* YYPGOTO[NTERM-NUM].  */
@@ -861,7 +869,8 @@ 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,   -13,   -13,   -13,   -13,   -13,   -13,   -13,   -13,
+     -13,   -13
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -873,19 +882,19 @@ 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,    38,   152,   153,   154,   155,
-      39,    40,    41,   156,   157,   158,    42,    43,    44,    45,
+      33,    34,    35,    36,    37,    38,   156,   157,   158,   159,
+      39,    40,    41,   160,   161,   162,    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,     2,
-     145,   138,   159,   139,   140,   160,   161,   162,   146,   147,
-       3,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,     4,   190,
-     191,   192,   193,   194,     5,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,     2,   149,   142,   163,   143,   144,   164,   165,   166,
+     150,   151,     3,   167,   168,   169,   170,   171,   172,   173,
+     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
+       4,   194,   195,   196,   197,   198,     5,   199,   200,   201,
+     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
+     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
+     222,   223,   224,   225,   226,   227
 };
 
 static const yytype_uint8 yycheck[] =
@@ -896,44 +905,44 @@ static const yytype_uint8 yycheck[] =
       42,    43,    44,    10,    10,    10,    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,     0,
-      38,    38,    10,    40,    41,    10,    10,    10,    46,    47,
-      11,    10,    10,    10,    10,    10,    10,    10,    10,    10,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,     0,    38,    38,    10,    40,    41,    10,    10,    10,
+      46,    47,    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,    10,    10,    10,
-      10,    10,    10,    10,    10,    10,    10,    10,    39,    10,
-      10,    10,    10,    10,    45,    10,    10,    10,    10,    10,
+      39,    10,    10,    10,    10,    10,    45,    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,    82,     0,    11,    39,    45,    83,    84,    87,    90,
-      85,    88,    91,    12,    13,    14,    15,    16,    17,    18,
+       0,    84,     0,    11,    39,    45,    85,    86,    89,    92,
+      87,    90,    93,    12,    13,    14,    15,    16,    17,    18,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    42,
       43,    44,    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,    86,    93,    94,    95,    96,
+      76,    77,    78,    79,    80,    81,    82,    88,    95,    96,
       97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
      107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
      117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
      127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
      137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,   150,   151,   152,   153,   154,    38,    40,
-      41,    89,   155,   156,   157,    38,    46,    47,    92,   158,
-     159,   160,    10,    10,    10,    10,    10,    10,    10,    10,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,    38,    40,    41,    91,   159,   160,   161,    38,
+      46,    47,    94,   162,   163,   164,    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)
@@ -1748,14 +1757,14 @@ yyreduce:
   switch (yyn)
     {
         case 7:
-#line 102 "util/configparser.y"
+#line 103 "util/configparser.y"
     { 
                OUTYY(("\nP(server:)\n")); 
        }
     break;
 
-  case 72:
-#line 136 "util/configparser.y"
+  case 74:
+#line 138 "util/configparser.y"
     {
                struct config_stub* s;
                OUTYY(("\nP(stub_zone:)\n")); 
@@ -1768,8 +1777,8 @@ yyreduce:
        }
     break;
 
-  case 78:
-#line 152 "util/configparser.y"
+  case 80:
+#line 154 "util/configparser.y"
     {
                struct config_stub* s;
                OUTYY(("\nP(forward_zone:)\n")); 
@@ -1782,8 +1791,8 @@ yyreduce:
        }
     break;
 
-  case 84:
-#line 168 "util/configparser.y"
+  case 86:
+#line 170 "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)
@@ -1793,8 +1802,8 @@ yyreduce:
        }
     break;
 
-  case 85:
-#line 177 "util/configparser.y"
+  case 87:
+#line 179 "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)
@@ -1804,8 +1813,8 @@ yyreduce:
        }
     break;
 
-  case 86:
-#line 186 "util/configparser.y"
+  case 88:
+#line 188 "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)
@@ -1817,8 +1826,8 @@ yyreduce:
        }
     break;
 
-  case 87:
-#line 197 "util/configparser.y"
+  case 89:
+#line 199 "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)
@@ -1828,8 +1837,8 @@ yyreduce:
        }
     break;
 
-  case 88:
-#line 206 "util/configparser.y"
+  case 90:
+#line 208 "util/configparser.y"
     {
                OUTYY(("P(server_port:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -1839,8 +1848,8 @@ yyreduce:
        }
     break;
 
-  case 89:
-#line 215 "util/configparser.y"
+  case 91:
+#line 217 "util/configparser.y"
     {
                OUTYY(("P(server_interface:%s)\n", (yyvsp[(2) - (2)].str)));
                if(cfg_parser->cfg->num_ifs == 0)
@@ -1854,8 +1863,8 @@ yyreduce:
        }
     break;
 
-  case 90:
-#line 228 "util/configparser.y"
+  case 92:
+#line 230 "util/configparser.y"
     {
                OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[(2) - (2)].str)));
                if(cfg_parser->cfg->num_out_ifs == 0)
@@ -1871,8 +1880,8 @@ yyreduce:
        }
     break;
 
-  case 91:
-#line 243 "util/configparser.y"
+  case 93:
+#line 245 "util/configparser.y"
     {
                OUTYY(("P(server_outgoing_port:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -1882,8 +1891,8 @@ yyreduce:
        }
     break;
 
-  case 92:
-#line 252 "util/configparser.y"
+  case 94:
+#line 254 "util/configparser.y"
     {
                OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -1893,8 +1902,30 @@ yyreduce:
        }
     break;
 
-  case 93:
-#line 261 "util/configparser.y"
+  case 95:
+#line 263 "util/configparser.y"
+    {
+               OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[(2) - (2)].str)));
+               if(!cfg_mark_ports((yyvsp[(2) - (2)].str), 1, 
+                       cfg_parser->cfg->outgoing_avail_ports, 65536))
+                       yyerror("port number or range (\"low-high\") expected");
+               free((yyvsp[(2) - (2)].str));
+       }
+    break;
+
+  case 96:
+#line 272 "util/configparser.y"
+    {
+               OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[(2) - (2)].str)));
+               if(!cfg_mark_ports((yyvsp[(2) - (2)].str), 0, 
+                       cfg_parser->cfg->outgoing_avail_ports, 65536))
+                       yyerror("port number or range (\"low-high\") expected");
+               free((yyvsp[(2) - (2)].str));
+       }
+    break;
+
+  case 97:
+#line 281 "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)
@@ -1904,8 +1935,8 @@ yyreduce:
        }
     break;
 
-  case 94:
-#line 270 "util/configparser.y"
+  case 98:
+#line 290 "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)
@@ -1915,8 +1946,8 @@ yyreduce:
        }
     break;
 
-  case 95:
-#line 279 "util/configparser.y"
+  case 99:
+#line 299 "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)
@@ -1926,8 +1957,8 @@ yyreduce:
        }
     break;
 
-  case 96:
-#line 288 "util/configparser.y"
+  case 100:
+#line 308 "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)
@@ -1937,8 +1968,8 @@ yyreduce:
        }
     break;
 
-  case 97:
-#line 297 "util/configparser.y"
+  case 101:
+#line 317 "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)
@@ -1948,8 +1979,8 @@ yyreduce:
        }
     break;
 
-  case 98:
-#line 306 "util/configparser.y"
+  case 102:
+#line 326 "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)
@@ -1959,8 +1990,8 @@ yyreduce:
        }
     break;
 
-  case 99:
-#line 315 "util/configparser.y"
+  case 103:
+#line 335 "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)
@@ -1970,8 +2001,8 @@ yyreduce:
        }
     break;
 
-  case 100:
-#line 324 "util/configparser.y"
+  case 104:
+#line 344 "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)
@@ -1981,8 +2012,8 @@ yyreduce:
        }
     break;
 
-  case 101:
-#line 333 "util/configparser.y"
+  case 105:
+#line 353 "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)
@@ -1997,8 +2028,8 @@ yyreduce:
        }
     break;
 
-  case 102:
-#line 347 "util/configparser.y"
+  case 106:
+#line 367 "util/configparser.y"
     {
                OUTYY(("P(server_chroot:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->chrootdir);
@@ -2006,8 +2037,8 @@ yyreduce:
        }
     break;
 
-  case 103:
-#line 354 "util/configparser.y"
+  case 107:
+#line 374 "util/configparser.y"
     {
                OUTYY(("P(server_username:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->username);
@@ -2015,8 +2046,8 @@ yyreduce:
        }
     break;
 
-  case 104:
-#line 361 "util/configparser.y"
+  case 108:
+#line 381 "util/configparser.y"
     {
                OUTYY(("P(server_directory:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->directory);
@@ -2024,8 +2055,8 @@ yyreduce:
        }
     break;
 
-  case 105:
-#line 368 "util/configparser.y"
+  case 109:
+#line 388 "util/configparser.y"
     {
                OUTYY(("P(server_logfile:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->logfile);
@@ -2034,8 +2065,8 @@ yyreduce:
        }
     break;
 
-  case 106:
-#line 376 "util/configparser.y"
+  case 110:
+#line 396 "util/configparser.y"
     {
                OUTYY(("P(server_pidfile:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->pidfile);
@@ -2043,8 +2074,8 @@ yyreduce:
        }
     break;
 
-  case 107:
-#line 383 "util/configparser.y"
+  case 111:
+#line 403 "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)))
@@ -2052,8 +2083,8 @@ yyreduce:
        }
     break;
 
-  case 108:
-#line 390 "util/configparser.y"
+  case 112:
+#line 410 "util/configparser.y"
     {
                OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->
@@ -2062,8 +2093,8 @@ yyreduce:
        }
     break;
 
-  case 109:
-#line 398 "util/configparser.y"
+  case 113:
+#line 418 "util/configparser.y"
     {
                OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[(2) - (2)].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->
@@ -2072,8 +2103,8 @@ yyreduce:
        }
     break;
 
-  case 110:
-#line 406 "util/configparser.y"
+  case 114:
+#line 426 "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)))
@@ -2081,8 +2112,8 @@ yyreduce:
        }
     break;
 
-  case 111:
-#line 413 "util/configparser.y"
+  case 115:
+#line 433 "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)
@@ -2092,8 +2123,8 @@ yyreduce:
        }
     break;
 
-  case 112:
-#line 422 "util/configparser.y"
+  case 116:
+#line 442 "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)
@@ -2103,8 +2134,8 @@ yyreduce:
        }
     break;
 
-  case 113:
-#line 431 "util/configparser.y"
+  case 117:
+#line 451 "util/configparser.y"
     {
                OUTYY(("P(server_identity:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->identity);
@@ -2112,8 +2143,8 @@ yyreduce:
        }
     break;
 
-  case 114:
-#line 438 "util/configparser.y"
+  case 118:
+#line 458 "util/configparser.y"
     {
                OUTYY(("P(server_version:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->version);
@@ -2121,8 +2152,8 @@ yyreduce:
        }
     break;
 
-  case 115:
-#line 445 "util/configparser.y"
+  case 119:
+#line 465 "util/configparser.y"
     {
                OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2134,8 +2165,8 @@ yyreduce:
        }
     break;
 
-  case 116:
-#line 456 "util/configparser.y"
+  case 120:
+#line 476 "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))
@@ -2144,8 +2175,8 @@ yyreduce:
        }
     break;
 
-  case 117:
-#line 464 "util/configparser.y"
+  case 121:
+#line 484 "util/configparser.y"
     {
                OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2159,8 +2190,8 @@ yyreduce:
        }
     break;
 
-  case 118:
-#line 477 "util/configparser.y"
+  case 122:
+#line 497 "util/configparser.y"
     {
                OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2170,8 +2201,8 @@ yyreduce:
        }
     break;
 
-  case 119:
-#line 486 "util/configparser.y"
+  case 123:
+#line 506 "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))
@@ -2180,8 +2211,8 @@ yyreduce:
        }
     break;
 
-  case 120:
-#line 494 "util/configparser.y"
+  case 124:
+#line 514 "util/configparser.y"
     {
                OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2195,8 +2226,8 @@ yyreduce:
        }
     break;
 
-  case 121:
-#line 507 "util/configparser.y"
+  case 125:
+#line 527 "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)
@@ -2206,8 +2237,8 @@ yyreduce:
        }
     break;
 
-  case 122:
-#line 516 "util/configparser.y"
+  case 126:
+#line 536 "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)
@@ -2217,8 +2248,8 @@ yyreduce:
        }
     break;
 
-  case 123:
-#line 525 "util/configparser.y"
+  case 127:
+#line 545 "util/configparser.y"
     {
                OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2228,8 +2259,8 @@ yyreduce:
        }
     break;
 
-  case 124:
-#line 534 "util/configparser.y"
+  case 128:
+#line 554 "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->
@@ -2239,8 +2270,8 @@ yyreduce:
        }
     break;
 
-  case 125:
-#line 543 "util/configparser.y"
+  case 129:
+#line 563 "util/configparser.y"
     {
                OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2254,8 +2285,8 @@ yyreduce:
        }
     break;
 
-  case 126:
-#line 556 "util/configparser.y"
+  case 130:
+#line 576 "util/configparser.y"
     {
                OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->target_fetch_policy);
@@ -2263,8 +2294,8 @@ yyreduce:
        }
     break;
 
-  case 127:
-#line 563 "util/configparser.y"
+  case 131:
+#line 583 "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)
@@ -2275,8 +2306,8 @@ yyreduce:
        }
     break;
 
-  case 128:
-#line 573 "util/configparser.y"
+  case 132:
+#line 593 "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)
@@ -2287,8 +2318,8 @@ yyreduce:
        }
     break;
 
-  case 129:
-#line 583 "util/configparser.y"
+  case 133:
+#line 603 "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)
@@ -2299,8 +2330,8 @@ yyreduce:
        }
     break;
 
-  case 130:
-#line 593 "util/configparser.y"
+  case 134:
+#line 613 "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)
@@ -2311,8 +2342,8 @@ yyreduce:
        }
     break;
 
-  case 131:
-#line 603 "util/configparser.y"
+  case 135:
+#line 623 "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)
@@ -2323,8 +2354,8 @@ yyreduce:
        }
     break;
 
-  case 132:
-#line 613 "util/configparser.y"
+  case 136:
+#line 633 "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)))
@@ -2332,8 +2363,8 @@ yyreduce:
        }
     break;
 
-  case 133:
-#line 620 "util/configparser.y"
+  case 137:
+#line 640 "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)
@@ -2344,8 +2375,8 @@ yyreduce:
        }
     break;
 
-  case 134:
-#line 630 "util/configparser.y"
+  case 138:
+#line 650 "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 &&
@@ -2359,8 +2390,8 @@ yyreduce:
        }
     break;
 
-  case 135:
-#line 643 "util/configparser.y"
+  case 139:
+#line 663 "util/configparser.y"
     {
                OUTYY(("P(server_module_conf:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->module_conf);
@@ -2368,8 +2399,8 @@ yyreduce:
        }
     break;
 
-  case 136:
-#line 650 "util/configparser.y"
+  case 140:
+#line 670 "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) {
@@ -2388,8 +2419,8 @@ yyreduce:
        }
     break;
 
-  case 137:
-#line 668 "util/configparser.y"
+  case 141:
+#line 688 "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)
@@ -2399,8 +2430,8 @@ yyreduce:
        }
     break;
 
-  case 138:
-#line 677 "util/configparser.y"
+  case 142:
+#line 697 "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)
@@ -2410,8 +2441,8 @@ yyreduce:
        }
     break;
 
-  case 139:
-#line 686 "util/configparser.y"
+  case 143:
+#line 706 "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)
@@ -2422,8 +2453,8 @@ yyreduce:
        }
     break;
 
-  case 140:
-#line 696 "util/configparser.y"
+  case 144:
+#line 716 "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)
@@ -2434,8 +2465,8 @@ yyreduce:
        }
     break;
 
-  case 141:
-#line 706 "util/configparser.y"
+  case 145:
+#line 726 "util/configparser.y"
     {
                OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->val_nsec3_key_iterations);
@@ -2443,8 +2474,8 @@ yyreduce:
        }
     break;
 
-  case 142:
-#line 713 "util/configparser.y"
+  case 146:
+#line 733 "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))
@@ -2453,8 +2484,8 @@ yyreduce:
        }
     break;
 
-  case 143:
-#line 721 "util/configparser.y"
+  case 147:
+#line 741 "util/configparser.y"
     {
                OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
                if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2468,8 +2499,8 @@ yyreduce:
        }
     break;
 
-  case 144:
-#line 734 "util/configparser.y"
+  case 148:
+#line 754 "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 &&
@@ -2489,8 +2520,8 @@ yyreduce:
        }
     break;
 
-  case 145:
-#line 753 "util/configparser.y"
+  case 149:
+#line 773 "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)))
@@ -2498,8 +2529,8 @@ yyreduce:
        }
     break;
 
-  case 146:
-#line 760 "util/configparser.y"
+  case 150:
+#line 780 "util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->stubs->name);
@@ -2507,8 +2538,8 @@ yyreduce:
        }
     break;
 
-  case 147:
-#line 767 "util/configparser.y"
+  case 151:
+#line 787 "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)))
@@ -2516,8 +2547,8 @@ yyreduce:
        }
     break;
 
-  case 148:
-#line 774 "util/configparser.y"
+  case 152:
+#line 794 "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)))
@@ -2525,8 +2556,8 @@ yyreduce:
        }
     break;
 
-  case 149:
-#line 781 "util/configparser.y"
+  case 153:
+#line 801 "util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str)));
                free(cfg_parser->cfg->forwards->name);
@@ -2534,8 +2565,8 @@ yyreduce:
        }
     break;
 
-  case 150:
-#line 788 "util/configparser.y"
+  case 154:
+#line 808 "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)))
@@ -2543,8 +2574,8 @@ yyreduce:
        }
     break;
 
-  case 151:
-#line 795 "util/configparser.y"
+  case 155:
+#line 815 "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)))
@@ -2554,7 +2585,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 2558 "util/configparser.c"
+#line 2589 "util/configparser.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2768,7 +2799,7 @@ yyreturn:
 }
 
 
-#line 801 "util/configparser.y"
+#line 821 "util/configparser.y"
 
 
 /* parse helper routines could be here */
index cf11842a60a50f7ad4c05cdc3dcc65bdb83b0ee7..9ddff4f6a78eed2e3b3e7f3b31d9820386fa1962 100644 (file)
      VAR_STATISTICS_INTERVAL = 332,
      VAR_DO_DAEMONIZE = 333,
      VAR_USE_CAPS_FOR_ID = 334,
-     VAR_STATISTICS_CUMULATIVE = 335
+     VAR_STATISTICS_CUMULATIVE = 335,
+     VAR_OUTGOING_PORT_PERMIT = 336,
+     VAR_OUTGOING_PORT_AVOID = 337
    };
 #endif
 /* Tokens.  */
 #define VAR_DO_DAEMONIZE 333
 #define VAR_USE_CAPS_FOR_ID 334
 #define VAR_STATISTICS_CUMULATIVE 335
+#define VAR_OUTGOING_PORT_PERMIT 336
+#define VAR_OUTGOING_PORT_AVOID 337
 
 
 
@@ -209,7 +213,7 @@ typedef union YYSTYPE
        char*   str;
 }
 /* Line 1489 of yacc.c.  */
-#line 213 "util/configparser.h"
+#line 217 "util/configparser.h"
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
index 4d4eabe3370fd16091c983029f1e4a24803d86c3..a6b2d8ddbb8997270856ba719e4f83c5a0999d88 100644 (file)
@@ -89,7 +89,8 @@ extern struct config_parser_state* cfg_parser;
 %token VAR_CACHE_MAX_TTL VAR_HARDEN_DNNSEC_STRIPPED VAR_ACCESS_CONTROL
 %token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC
 %token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID
-%token VAR_STATISTICS_CUMULATIVE
+%token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT 
+%token VAR_OUTGOING_PORT_AVOID
 
 %%
 toplevelvars: /* empty */ | toplevelvars toplevelvar ;
@@ -130,7 +131,8 @@ content_server: server_num_threads | server_verbosity | server_port |
        server_harden_dnssec_stripped | server_access_control |
        server_local_zone | server_local_data | server_interface_automatic |
        server_statistics_interval | server_do_daemonize | 
-       server_use_caps_for_id | server_statistics_cumulative
+       server_use_caps_for_id | server_statistics_cumulative |
+       server_outgoing_port_permit | server_outgoing_port_avoid
        ;
 stubstart: VAR_STUB_ZONE
        {
@@ -257,6 +259,24 @@ server_outgoing_range: VAR_OUTGOING_RANGE STRING
                free($2);
        }
        ;
+server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING
+       {
+               OUTYY(("P(server_outgoing_port_permit:%s)\n", $2));
+               if(!cfg_mark_ports($2, 1, 
+                       cfg_parser->cfg->outgoing_avail_ports, 65536))
+                       yyerror("port number or range (\"low-high\") expected");
+               free($2);
+       }
+       ;
+server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING
+       {
+               OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2));
+               if(!cfg_mark_ports($2, 0, 
+                       cfg_parser->cfg->outgoing_avail_ports, 65536))
+                       yyerror("port number or range (\"low-high\") expected");
+               free($2);
+       }
+       ;
 server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING
        {
                OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2));
diff --git a/util/iana_ports.inc b/util/iana_ports.inc
new file mode 100644 (file)
index 0000000..c322d11
--- /dev/null
@@ -0,0 +1,3209 @@
+1,
+3,
+5,
+7,
+9,
+11,
+13,
+17,
+18,
+19,
+21,
+22,
+23,
+24,
+25,
+27,
+29,
+31,
+33,
+37,
+38,
+39,
+41,
+42,
+43,
+44,
+45,
+46,
+47,
+48,
+49,
+51,
+52,
+53,
+54,
+55,
+56,
+58,
+61,
+62,
+63,
+64,
+65,
+66,
+67,
+68,
+69,
+71,
+72,
+73,
+74,
+76,
+78,
+79,
+81,
+82,
+83,
+84,
+86,
+88,
+89,
+91,
+92,
+93,
+94,
+95,
+96,
+97,
+99,
+111,
+112,
+113,
+115,
+116,
+117,
+118,
+119,
+121,
+122,
+123,
+124,
+125,
+126,
+127,
+128,
+129,
+131,
+132,
+133,
+134,
+135,
+136,
+137,
+138,
+139,
+141,
+142,
+143,
+144,
+145,
+146,
+147,
+148,
+149,
+151,
+152,
+153,
+154,
+155,
+156,
+157,
+158,
+159,
+161,
+162,
+163,
+164,
+165,
+166,
+167,
+168,
+169,
+171,
+172,
+173,
+174,
+175,
+176,
+177,
+178,
+179,
+181,
+182,
+183,
+184,
+185,
+186,
+187,
+188,
+189,
+191,
+192,
+193,
+194,
+195,
+196,
+197,
+198,
+199,
+211,
+212,
+213,
+214,
+215,
+216,
+217,
+218,
+219,
+221,
+222,
+223,
+224,
+242,
+243,
+244,
+245,
+246,
+247,
+248,
+257,
+258,
+259,
+261,
+262,
+263,
+264,
+265,
+266,
+267,
+268,
+281,
+282,
+283,
+284,
+286,
+287,
+311,
+312,
+313,
+314,
+315,
+316,
+317,
+318,
+319,
+321,
+322,
+333,
+344,
+345,
+346,
+347,
+348,
+349,
+351,
+351,
+352,
+352,
+353,
+354,
+355,
+356,
+357,
+358,
+359,
+361,
+362,
+363,
+364,
+365,
+366,
+367,
+368,
+369,
+371,
+372,
+373,
+374,
+375,
+376,
+377,
+378,
+379,
+381,
+382,
+383,
+384,
+385,
+386,
+387,
+388,
+389,
+391,
+392,
+393,
+394,
+395,
+396,
+397,
+398,
+399,
+411,
+412,
+413,
+414,
+415,
+416,
+417,
+418,
+419,
+421,
+422,
+423,
+424,
+425,
+426,
+427,
+428,
+429,
+431,
+432,
+433,
+434,
+435,
+436,
+437,
+438,
+439,
+441,
+442,
+443,
+444,
+445,
+446,
+447,
+448,
+449,
+451,
+452,
+453,
+454,
+455,
+456,
+457,
+458,
+459,
+461,
+462,
+463,
+464,
+466,
+467,
+468,
+469,
+471,
+472,
+473,
+474,
+475,
+476,
+477,
+478,
+479,
+481,
+482,
+483,
+484,
+485,
+486,
+487,
+488,
+489,
+491,
+492,
+493,
+494,
+495,
+496,
+497,
+498,
+499,
+511,
+512,
+513,
+514,
+515,
+516,
+517,
+518,
+519,
+521,
+522,
+523,
+524,
+525,
+527,
+528,
+529,
+533,
+534,
+535,
+536,
+537,
+538,
+539,
+541,
+542,
+545,
+546,
+547,
+548,
+549,
+551,
+552,
+553,
+554,
+555,
+557,
+558,
+559,
+561,
+562,
+563,
+564,
+565,
+566,
+567,
+568,
+569,
+571,
+572,
+573,
+574,
+575,
+576,
+577,
+578,
+579,
+581,
+582,
+583,
+584,
+585,
+586,
+587,
+588,
+589,
+592,
+593,
+594,
+595,
+596,
+597,
+598,
+599,
+611,
+612,
+613,
+614,
+615,
+617,
+618,
+619,
+621,
+622,
+623,
+624,
+625,
+626,
+627,
+628,
+629,
+631,
+632,
+633,
+634,
+635,
+636,
+637,
+638,
+639,
+641,
+642,
+643,
+644,
+645,
+646,
+647,
+648,
+649,
+651,
+652,
+653,
+654,
+655,
+656,
+657,
+658,
+661,
+662,
+663,
+664,
+665,
+666,
+666,
+667,
+668,
+669,
+671,
+672,
+673,
+674,
+675,
+676,
+677,
+678,
+679,
+681,
+682,
+683,
+684,
+685,
+686,
+687,
+688,
+689,
+691,
+692,
+693,
+694,
+695,
+696,
+697,
+698,
+699,
+711,
+712,
+729,
+731,
+741,
+742,
+744,
+747,
+748,
+751,
+752,
+753,
+758,
+759,
+761,
+762,
+763,
+764,
+765,
+767,
+769,
+771,
+772,
+773,
+774,
+775,
+776,
+777,
+828,
+829,
+847,
+848,
+873,
+886,
+887,
+888,
+911,
+912,
+913,
+953,
+989,
+991,
+992,
+993,
+994,
+995,
+996,
+997,
+998,
+999,
+999,
+1111,
+1112,
+1113,
+1114,
+1115,
+1116,
+1117,
+1118,
+1119,
+1121,
+1122,
+1123,
+1124,
+1125,
+1126,
+1141,
+1142,
+1144,
+1145,
+1146,
+1147,
+1148,
+1149,
+1151,
+1152,
+1153,
+1154,
+1155,
+1156,
+1157,
+1158,
+1159,
+1161,
+1162,
+1163,
+1164,
+1165,
+1166,
+1168,
+1169,
+1171,
+1172,
+1173,
+1174,
+1175,
+1176,
+1177,
+1179,
+1181,
+1182,
+1183,
+1184,
+1185,
+1186,
+1187,
+1188,
+1189,
+1191,
+1192,
+1193,
+1194,
+1195,
+1196,
+1197,
+1198,
+1199,
+1211,
+1212,
+1213,
+1214,
+1215,
+1216,
+1217,
+1218,
+1219,
+1221,
+1222,
+1223,
+1224,
+1225,
+1226,
+1227,
+1228,
+1229,
+1231,
+1233,
+1234,
+1235,
+1236,
+1237,
+1238,
+1239,
+1241,
+1242,
+1243,
+1244,
+1245,
+1246,
+1247,
+1248,
+1249,
+1251,
+1252,
+1253,
+1254,
+1255,
+1256,
+1257,
+1258,
+1259,
+1261,
+1262,
+1263,
+1264,
+1265,
+1266,
+1267,
+1268,
+1269,
+1271,
+1272,
+1273,
+1274,
+1275,
+1276,
+1277,
+1278,
+1279,
+1281,
+1282,
+1283,
+1284,
+1285,
+1286,
+1287,
+1288,
+1289,
+1291,
+1292,
+1293,
+1294,
+1295,
+1296,
+1297,
+1298,
+1299,
+1311,
+1312,
+1314,
+1315,
+1316,
+1317,
+1318,
+1319,
+1322,
+1323,
+1324,
+1325,
+1326,
+1327,
+1328,
+1329,
+1331,
+1332,
+1333,
+1334,
+1335,
+1336,
+1337,
+1338,
+1339,
+1341,
+1342,
+1343,
+1344,
+1345,
+1346,
+1347,
+1348,
+1349,
+1351,
+1352,
+1353,
+1354,
+1355,
+1356,
+1357,
+1358,
+1359,
+1361,
+1362,
+1363,
+1364,
+1365,
+1366,
+1367,
+1368,
+1369,
+1371,
+1372,
+1373,
+1374,
+1375,
+1376,
+1377,
+1378,
+1379,
+1381,
+1382,
+1383,
+1384,
+1385,
+1386,
+1387,
+1388,
+1389,
+1391,
+1392,
+1393,
+1394,
+1395,
+1396,
+1397,
+1398,
+1399,
+1411,
+1412,
+1413,
+1414,
+1415,
+1416,
+1417,
+1418,
+1419,
+1421,
+1422,
+1423,
+1424,
+1425,
+1426,
+1427,
+1428,
+1429,
+1431,
+1432,
+1433,
+1434,
+1435,
+1436,
+1437,
+1438,
+1439,
+1441,
+1442,
+1443,
+1444,
+1445,
+1446,
+1447,
+1448,
+1449,
+1451,
+1452,
+1453,
+1454,
+1455,
+1456,
+1457,
+1458,
+1459,
+1461,
+1462,
+1463,
+1464,
+1465,
+1466,
+1467,
+1468,
+1469,
+1473,
+1474,
+1475,
+1476,
+1477,
+1478,
+1479,
+1481,
+1482,
+1483,
+1484,
+1485,
+1486,
+1487,
+1488,
+1489,
+1491,
+1492,
+1493,
+1494,
+1495,
+1496,
+1497,
+1498,
+1499,
+1511,
+1512,
+1513,
+1514,
+1515,
+1516,
+1517,
+1518,
+1519,
+1521,
+1522,
+1523,
+1524,
+1525,
+1526,
+1527,
+1528,
+1531,
+1532,
+1533,
+1534,
+1535,
+1536,
+1537,
+1538,
+1539,
+1541,
+1542,
+1543,
+1544,
+1545,
+1546,
+1547,
+1548,
+1549,
+1551,
+1552,
+1553,
+1554,
+1555,
+1556,
+1557,
+1558,
+1559,
+1561,
+1562,
+1563,
+1564,
+1565,
+1566,
+1567,
+1568,
+1569,
+1571,
+1572,
+1573,
+1574,
+1575,
+1576,
+1577,
+1578,
+1579,
+1581,
+1582,
+1583,
+1584,
+1585,
+1586,
+1587,
+1588,
+1589,
+1591,
+1592,
+1593,
+1594,
+1595,
+1596,
+1597,
+1598,
+1599,
+1611,
+1612,
+1613,
+1614,
+1615,
+1616,
+1617,
+1618,
+1619,
+1621,
+1622,
+1623,
+1624,
+1625,
+1626,
+1627,
+1628,
+1629,
+1631,
+1632,
+1633,
+1634,
+1635,
+1636,
+1637,
+1638,
+1639,
+1641,
+1642,
+1643,
+1645,
+1646,
+1647,
+1648,
+1649,
+1651,
+1652,
+1653,
+1654,
+1655,
+1656,
+1657,
+1658,
+1659,
+1661,
+1662,
+1663,
+1664,
+1665,
+1666,
+1667,
+1668,
+1669,
+1671,
+1672,
+1673,
+1674,
+1675,
+1676,
+1677,
+1678,
+1679,
+1681,
+1682,
+1683,
+1684,
+1685,
+1686,
+1687,
+1688,
+1689,
+1691,
+1692,
+1693,
+1694,
+1695,
+1696,
+1697,
+1698,
+1699,
+1711,
+1712,
+1713,
+1714,
+1715,
+1716,
+1717,
+1718,
+1719,
+1721,
+1722,
+1723,
+1724,
+1725,
+1726,
+1727,
+1728,
+1729,
+1731,
+1732,
+1733,
+1734,
+1735,
+1736,
+1737,
+1738,
+1739,
+1741,
+1742,
+1743,
+1744,
+1745,
+1746,
+1747,
+1748,
+1749,
+1751,
+1752,
+1754,
+1755,
+1756,
+1757,
+1758,
+1759,
+1761,
+1762,
+1763,
+1764,
+1765,
+1766,
+1767,
+1768,
+1769,
+1771,
+1772,
+1773,
+1774,
+1776,
+1777,
+1778,
+1779,
+1781,
+1782,
+1784,
+1785,
+1786,
+1787,
+1788,
+1789,
+1791,
+1792,
+1793,
+1794,
+1795,
+1796,
+1798,
+1799,
+1811,
+1812,
+1813,
+1814,
+1815,
+1816,
+1817,
+1818,
+1819,
+1821,
+1822,
+1823,
+1824,
+1825,
+1826,
+1827,
+1828,
+1829,
+1831,
+1832,
+1833,
+1834,
+1835,
+1836,
+1837,
+1838,
+1839,
+1841,
+1842,
+1843,
+1844,
+1845,
+1846,
+1847,
+1848,
+1849,
+1851,
+1852,
+1853,
+1854,
+1855,
+1856,
+1857,
+1858,
+1859,
+1861,
+1862,
+1863,
+1864,
+1865,
+1866,
+1867,
+1868,
+1869,
+1871,
+1872,
+1873,
+1874,
+1875,
+1876,
+1877,
+1878,
+1879,
+1881,
+1882,
+1883,
+1884,
+1885,
+1886,
+1887,
+1888,
+1889,
+1891,
+1892,
+1893,
+1894,
+1896,
+1897,
+1898,
+1899,
+1911,
+1912,
+1913,
+1914,
+1915,
+1916,
+1917,
+1918,
+1919,
+1921,
+1922,
+1923,
+1924,
+1925,
+1926,
+1927,
+1928,
+1929,
+1931,
+1932,
+1933,
+1934,
+1935,
+1936,
+1937,
+1938,
+1939,
+1941,
+1942,
+1943,
+1944,
+1945,
+1946,
+1947,
+1948,
+1949,
+1951,
+1952,
+1953,
+1954,
+1955,
+1956,
+1957,
+1958,
+1959,
+1961,
+1962,
+1963,
+1964,
+1965,
+1966,
+1967,
+1968,
+1969,
+1971,
+1972,
+1973,
+1974,
+1975,
+1976,
+1977,
+1978,
+1979,
+1981,
+1982,
+1983,
+1984,
+1985,
+1986,
+1987,
+1988,
+1989,
+1989,
+1991,
+1992,
+1992,
+1993,
+1994,
+1995,
+1996,
+1997,
+1998,
+1999,
+2111,
+2112,
+2113,
+2114,
+2115,
+2116,
+2117,
+2118,
+2119,
+2121,
+2122,
+2123,
+2124,
+2125,
+2126,
+2127,
+2128,
+2129,
+2131,
+2132,
+2133,
+2134,
+2135,
+2136,
+2137,
+2138,
+2139,
+2141,
+2142,
+2143,
+2144,
+2145,
+2146,
+2147,
+2148,
+2149,
+2151,
+2152,
+2159,
+2161,
+2162,
+2163,
+2164,
+2165,
+2166,
+2167,
+2168,
+2169,
+2171,
+2172,
+2173,
+2174,
+2175,
+2176,
+2177,
+2178,
+2181,
+2182,
+2183,
+2184,
+2185,
+2191,
+2192,
+2197,
+2198,
+2199,
+2213,
+2214,
+2215,
+2219,
+2221,
+2222,
+2223,
+2228,
+2232,
+2233,
+2234,
+2235,
+2236,
+2237,
+2238,
+2239,
+2241,
+2242,
+2243,
+2244,
+2245,
+2246,
+2248,
+2249,
+2251,
+2252,
+2253,
+2254,
+2255,
+2256,
+2261,
+2262,
+2266,
+2267,
+2268,
+2269,
+2271,
+2272,
+2273,
+2274,
+2275,
+2276,
+2277,
+2279,
+2281,
+2282,
+2283,
+2284,
+2285,
+2286,
+2287,
+2288,
+2289,
+2294,
+2295,
+2296,
+2297,
+2298,
+2299,
+2311,
+2313,
+2314,
+2315,
+2316,
+2317,
+2318,
+2319,
+2321,
+2322,
+2323,
+2324,
+2325,
+2326,
+2327,
+2328,
+2331,
+2332,
+2333,
+2334,
+2335,
+2336,
+2337,
+2338,
+2339,
+2341,
+2342,
+2343,
+2344,
+2345,
+2346,
+2347,
+2348,
+2349,
+2351,
+2352,
+2353,
+2354,
+2355,
+2356,
+2357,
+2358,
+2359,
+2361,
+2362,
+2363,
+2364,
+2365,
+2366,
+2367,
+2368,
+2369,
+2371,
+2381,
+2382,
+2383,
+2384,
+2385,
+2386,
+2387,
+2388,
+2389,
+2391,
+2392,
+2393,
+2394,
+2395,
+2396,
+2397,
+2398,
+2399,
+2411,
+2412,
+2413,
+2414,
+2415,
+2416,
+2417,
+2418,
+2419,
+2421,
+2422,
+2423,
+2424,
+2425,
+2427,
+2428,
+2429,
+2431,
+2432,
+2433,
+2434,
+2435,
+2436,
+2437,
+2439,
+2441,
+2442,
+2443,
+2444,
+2445,
+2446,
+2447,
+2448,
+2449,
+2451,
+2452,
+2453,
+2454,
+2455,
+2456,
+2457,
+2458,
+2459,
+2461,
+2462,
+2463,
+2464,
+2465,
+2466,
+2467,
+2468,
+2469,
+2471,
+2472,
+2473,
+2474,
+2475,
+2476,
+2477,
+2478,
+2479,
+2481,
+2482,
+2483,
+2484,
+2485,
+2486,
+2487,
+2488,
+2489,
+2491,
+2492,
+2493,
+2494,
+2495,
+2496,
+2497,
+2498,
+2511,
+2512,
+2513,
+2514,
+2515,
+2516,
+2517,
+2518,
+2519,
+2521,
+2522,
+2523,
+2524,
+2525,
+2526,
+2527,
+2528,
+2529,
+2531,
+2532,
+2533,
+2534,
+2535,
+2536,
+2537,
+2538,
+2539,
+2541,
+2542,
+2543,
+2544,
+2545,
+2546,
+2547,
+2548,
+2549,
+2551,
+2552,
+2553,
+2554,
+2555,
+2556,
+2557,
+2558,
+2559,
+2561,
+2562,
+2563,
+2565,
+2566,
+2567,
+2568,
+2569,
+2571,
+2572,
+2573,
+2574,
+2575,
+2576,
+2577,
+2578,
+2579,
+2581,
+2582,
+2583,
+2584,
+2585,
+2586,
+2587,
+2588,
+2589,
+2591,
+2592,
+2593,
+2594,
+2595,
+2596,
+2597,
+2598,
+2599,
+2611,
+2612,
+2613,
+2614,
+2615,
+2616,
+2617,
+2618,
+2619,
+2621,
+2622,
+2623,
+2624,
+2625,
+2626,
+2627,
+2628,
+2629,
+2631,
+2632,
+2633,
+2634,
+2635,
+2636,
+2637,
+2638,
+2639,
+2641,
+2642,
+2643,
+2644,
+2645,
+2646,
+2647,
+2648,
+2649,
+2651,
+2652,
+2653,
+2654,
+2655,
+2656,
+2657,
+2658,
+2659,
+2661,
+2662,
+2663,
+2664,
+2665,
+2666,
+2667,
+2668,
+2669,
+2671,
+2672,
+2673,
+2674,
+2675,
+2676,
+2677,
+2678,
+2679,
+2681,
+2683,
+2684,
+2685,
+2686,
+2687,
+2688,
+2689,
+2691,
+2692,
+2694,
+2695,
+2696,
+2697,
+2698,
+2699,
+2711,
+2712,
+2713,
+2714,
+2715,
+2716,
+2717,
+2718,
+2719,
+2721,
+2722,
+2723,
+2724,
+2725,
+2726,
+2727,
+2728,
+2729,
+2731,
+2732,
+2733,
+2734,
+2735,
+2736,
+2737,
+2738,
+2739,
+2741,
+2742,
+2743,
+2744,
+2745,
+2746,
+2747,
+2748,
+2749,
+2751,
+2752,
+2753,
+2754,
+2755,
+2756,
+2757,
+2758,
+2759,
+2761,
+2762,
+2763,
+2764,
+2765,
+2766,
+2767,
+2768,
+2769,
+2771,
+2772,
+2773,
+2774,
+2775,
+2776,
+2777,
+2778,
+2779,
+2781,
+2782,
+2783,
+2784,
+2785,
+2786,
+2787,
+2788,
+2789,
+2791,
+2792,
+2793,
+2794,
+2795,
+2796,
+2797,
+2798,
+2799,
+2811,
+2812,
+2813,
+2814,
+2815,
+2816,
+2817,
+2818,
+2819,
+2821,
+2822,
+2823,
+2824,
+2826,
+2827,
+2828,
+2829,
+2831,
+2832,
+2833,
+2834,
+2835,
+2836,
+2837,
+2838,
+2841,
+2842,
+2843,
+2844,
+2845,
+2846,
+2847,
+2848,
+2851,
+2852,
+2853,
+2854,
+2856,
+2857,
+2858,
+2859,
+2861,
+2862,
+2863,
+2864,
+2865,
+2866,
+2867,
+2868,
+2869,
+2871,
+2872,
+2874,
+2875,
+2876,
+2877,
+2878,
+2879,
+2881,
+2882,
+2883,
+2884,
+2885,
+2886,
+2887,
+2888,
+2889,
+2891,
+2892,
+2893,
+2894,
+2895,
+2896,
+2897,
+2898,
+2899,
+2911,
+2912,
+2913,
+2914,
+2915,
+2916,
+2917,
+2918,
+2919,
+2921,
+2922,
+2923,
+2924,
+2926,
+2927,
+2928,
+2929,
+2931,
+2932,
+2933,
+2934,
+2935,
+2936,
+2937,
+2938,
+2939,
+2941,
+2942,
+2943,
+2944,
+2945,
+2946,
+2947,
+2948,
+2949,
+2951,
+2952,
+2953,
+2954,
+2955,
+2956,
+2957,
+2958,
+2959,
+2961,
+2962,
+2963,
+2964,
+2965,
+2966,
+2967,
+2968,
+2969,
+2971,
+2972,
+2973,
+2974,
+2975,
+2976,
+2977,
+2978,
+2979,
+2981,
+2982,
+2983,
+2984,
+2985,
+2986,
+2987,
+2988,
+2989,
+2991,
+2992,
+2993,
+2994,
+2995,
+2996,
+2997,
+2998,
+2999,
+3111,
+3112,
+3113,
+3114,
+3115,
+3116,
+3117,
+3118,
+3119,
+3122,
+3123,
+3124,
+3125,
+3126,
+3127,
+3129,
+3131,
+3132,
+3133,
+3134,
+3135,
+3136,
+3137,
+3138,
+3139,
+3141,
+3142,
+3143,
+3144,
+3145,
+3146,
+3147,
+3148,
+3149,
+3151,
+3152,
+3153,
+3154,
+3155,
+3156,
+3157,
+3158,
+3159,
+3161,
+3162,
+3163,
+3164,
+3165,
+3166,
+3167,
+3168,
+3169,
+3171,
+3172,
+3173,
+3174,
+3175,
+3176,
+3177,
+3178,
+3179,
+3181,
+3182,
+3183,
+3184,
+3185,
+3186,
+3187,
+3188,
+3189,
+3191,
+3192,
+3193,
+3194,
+3195,
+3196,
+3197,
+3198,
+3199,
+3211,
+3212,
+3213,
+3214,
+3215,
+3216,
+3217,
+3218,
+3219,
+3221,
+3222,
+3223,
+3224,
+3225,
+3226,
+3227,
+3228,
+3229,
+3231,
+3232,
+3233,
+3234,
+3235,
+3236,
+3237,
+3238,
+3239,
+3241,
+3242,
+3243,
+3244,
+3245,
+3246,
+3247,
+3248,
+3249,
+3251,
+3252,
+3253,
+3254,
+3255,
+3256,
+3257,
+3258,
+3259,
+3261,
+3262,
+3263,
+3264,
+3265,
+3266,
+3267,
+3268,
+3269,
+3271,
+3272,
+3273,
+3274,
+3275,
+3276,
+3277,
+3278,
+3279,
+3281,
+3282,
+3283,
+3284,
+3285,
+3286,
+3287,
+3288,
+3289,
+3291,
+3292,
+3293,
+3294,
+3295,
+3296,
+3297,
+3298,
+3299,
+3311,
+3312,
+3313,
+3314,
+3315,
+3316,
+3317,
+3318,
+3319,
+3321,
+3326,
+3327,
+3328,
+3329,
+3331,
+3332,
+3333,
+3334,
+3335,
+3336,
+3337,
+3338,
+3339,
+3341,
+3342,
+3343,
+3344,
+3345,
+3346,
+3347,
+3348,
+3349,
+3351,
+3352,
+3353,
+3354,
+3355,
+3356,
+3357,
+3358,
+3359,
+3361,
+3362,
+3363,
+3372,
+3373,
+3374,
+3375,
+3376,
+3377,
+3378,
+3379,
+3381,
+3382,
+3383,
+3384,
+3385,
+3386,
+3387,
+3388,
+3389,
+3391,
+3392,
+3393,
+3394,
+3395,
+3396,
+3397,
+3398,
+3399,
+3411,
+3412,
+3413,
+3414,
+3415,
+3416,
+3417,
+3418,
+3419,
+3421,
+3422,
+3423,
+3424,
+3425,
+3426,
+3427,
+3428,
+3429,
+3431,
+3432,
+3433,
+3434,
+3435,
+3436,
+3437,
+3438,
+3439,
+3441,
+3442,
+3443,
+3444,
+3445,
+3446,
+3447,
+3448,
+3449,
+3451,
+3452,
+3453,
+3455,
+3456,
+3457,
+3458,
+3459,
+3461,
+3462,
+3463,
+3464,
+3465,
+3466,
+3467,
+3468,
+3469,
+3471,
+3472,
+3473,
+3474,
+3475,
+3476,
+3477,
+3478,
+3479,
+3481,
+3482,
+3483,
+3484,
+3485,
+3486,
+3487,
+3488,
+3489,
+3491,
+3492,
+3493,
+3494,
+3495,
+3496,
+3497,
+3498,
+3499,
+3511,
+3512,
+3513,
+3514,
+3515,
+3516,
+3517,
+3518,
+3519,
+3521,
+3522,
+3523,
+3524,
+3525,
+3526,
+3527,
+3528,
+3529,
+3531,
+3532,
+3533,
+3534,
+3535,
+3536,
+3537,
+3538,
+3539,
+3541,
+3542,
+3543,
+3544,
+3545,
+3547,
+3548,
+3549,
+3551,
+3552,
+3553,
+3554,
+3555,
+3556,
+3557,
+3558,
+3559,
+3561,
+3562,
+3563,
+3564,
+3566,
+3567,
+3568,
+3569,
+3571,
+3572,
+3573,
+3574,
+3575,
+3576,
+3577,
+3578,
+3579,
+3581,
+3582,
+3583,
+3584,
+3585,
+3586,
+3587,
+3588,
+3589,
+3591,
+3592,
+3593,
+3594,
+3595,
+3596,
+3597,
+3598,
+3599,
+3611,
+3612,
+3613,
+3614,
+3615,
+3616,
+3617,
+3618,
+3619,
+3621,
+3622,
+3623,
+3624,
+3625,
+3626,
+3627,
+3628,
+3629,
+3631,
+3633,
+3634,
+3635,
+3636,
+3637,
+3638,
+3639,
+3641,
+3642,
+3643,
+3644,
+3645,
+3646,
+3647,
+3648,
+3649,
+3651,
+3652,
+3653,
+3654,
+3655,
+3656,
+3657,
+3658,
+3659,
+3661,
+3662,
+3663,
+3664,
+3665,
+3666,
+3667,
+3668,
+3669,
+3671,
+3672,
+3673,
+3674,
+3675,
+3676,
+3677,
+3678,
+3679,
+3681,
+3682,
+3683,
+3684,
+3685,
+3686,
+3687,
+3688,
+3689,
+3691,
+3692,
+3693,
+3694,
+3695,
+3696,
+3697,
+3698,
+3699,
+3711,
+3712,
+3713,
+3714,
+3715,
+3716,
+3717,
+3718,
+3719,
+3721,
+3722,
+3723,
+3724,
+3725,
+3726,
+3727,
+3728,
+3729,
+3731,
+3732,
+3733,
+3734,
+3735,
+3736,
+3738,
+3739,
+3741,
+3742,
+3743,
+3744,
+3745,
+3746,
+3747,
+3748,
+3749,
+3751,
+3752,
+3753,
+3754,
+3755,
+3756,
+3757,
+3758,
+3759,
+3761,
+3762,
+3763,
+3764,
+3765,
+3767,
+3768,
+3769,
+3771,
+3772,
+3773,
+3774,
+3775,
+3776,
+3777,
+3778,
+3779,
+3781,
+3782,
+3783,
+3784,
+3785,
+3786,
+3787,
+3788,
+3789,
+3791,
+3792,
+3793,
+3794,
+3795,
+3796,
+3797,
+3798,
+3799,
+3811,
+3812,
+3813,
+3814,
+3815,
+3816,
+3817,
+3818,
+3819,
+3821,
+3822,
+3823,
+3824,
+3836,
+3837,
+3838,
+3839,
+3841,
+3842,
+3843,
+3844,
+3845,
+3846,
+3847,
+3848,
+3849,
+3851,
+3852,
+3853,
+3854,
+3855,
+3856,
+3857,
+3858,
+3859,
+3861,
+3862,
+3863,
+3864,
+3865,
+3866,
+3867,
+3869,
+3871,
+3872,
+3873,
+3874,
+3875,
+3876,
+3877,
+3878,
+3879,
+3881,
+3882,
+3883,
+3884,
+3885,
+3886,
+3887,
+3888,
+3889,
+3891,
+3892,
+3893,
+3894,
+3895,
+3896,
+3897,
+3898,
+3899,
+3911,
+3912,
+3913,
+3914,
+3915,
+3916,
+3917,
+3918,
+3919,
+3921,
+3922,
+3923,
+3924,
+3925,
+3926,
+3927,
+3928,
+3929,
+3931,
+3932,
+3933,
+3934,
+3935,
+3936,
+3937,
+3938,
+3939,
+3941,
+3942,
+3943,
+3944,
+3945,
+3946,
+3947,
+3948,
+3949,
+3951,
+3952,
+3953,
+3954,
+3955,
+3956,
+3957,
+3958,
+3959,
+3961,
+3962,
+3963,
+3964,
+3965,
+3966,
+3967,
+3968,
+3969,
+3971,
+3972,
+3973,
+3974,
+3975,
+3984,
+3985,
+3986,
+3987,
+3988,
+3989,
+3991,
+3992,
+3993,
+3995,
+3996,
+4111,
+4114,
+4132,
+4133,
+4134,
+4138,
+4141,
+4142,
+4143,
+4145,
+4154,
+4161,
+4162,
+4199,
+4321,
+4343,
+4344,
+4345,
+4346,
+4347,
+4348,
+4349,
+4351,
+4352,
+4353,
+4354,
+4355,
+4356,
+4357,
+4358,
+4369,
+4426,
+4442,
+4443,
+4444,
+4445,
+4446,
+4447,
+4448,
+4449,
+4451,
+4452,
+4453,
+4454,
+4455,
+4456,
+4457,
+4484,
+4535,
+4536,
+4537,
+4545,
+4546,
+4547,
+4555,
+4567,
+4568,
+4569,
+4598,
+4658,
+4659,
+4661,
+4662,
+4672,
+4673,
+4674,
+4675,
+4676,
+4677,
+4678,
+4679,
+4681,
+4682,
+4683,
+4684,
+4685,
+4686,
+4687,
+4688,
+4689,
+4691,
+4692,
+4737,
+4738,
+4739,
+4751,
+4752,
+4827,
+4837,
+4838,
+4839,
+4848,
+4849,
+4868,
+4869,
+4885,
+4894,
+4899,
+4949,
+4951,
+4987,
+4988,
+4989,
+5112,
+5133,
+5137,
+5145,
+5151,
+5152,
+5154,
+5155,
+5165,
+5167,
+5168,
+5191,
+5192,
+5193,
+5222,
+5225,
+5226,
+5232,
+5234,
+5236,
+5251,
+5252,
+5264,
+5265,
+5269,
+5272,
+5282,
+5312,
+5313,
+5314,
+5315,
+5343,
+5351,
+5352,
+5353,
+5354,
+5355,
+5356,
+5357,
+5358,
+5397,
+5398,
+5399,
+5411,
+5412,
+5413,
+5414,
+5415,
+5416,
+5417,
+5418,
+5419,
+5421,
+5422,
+5423,
+5424,
+5425,
+5426,
+5427,
+5428,
+5429,
+5431,
+5432,
+5433,
+5434,
+5435,
+5453,
+5454,
+5455,
+5456,
+5461,
+5462,
+5463,
+5465,
+5553,
+5554,
+5555,
+5566,
+5567,
+5584,
+5585,
+5599,
+5631,
+5632,
+5672,
+5673,
+5674,
+5675,
+5676,
+5677,
+5678,
+5679,
+5688,
+5713,
+5714,
+5715,
+5716,
+5717,
+5721,
+5729,
+5741,
+5742,
+5743,
+5744,
+5745,
+5746,
+5747,
+5748,
+5755,
+5757,
+5766,
+5767,
+5768,
+5771,
+5777,
+5813,
+5814,
+5815,
+5859,
+5963,
+5968,
+5969,
+5987,
+5988,
+5989,
+5991,
+5992,
+5999,
+6111,
+6112,
+6122,
+6123,
+6133,
+6141,
+6142,
+6143,
+6144,
+6145,
+6146,
+6147,
+6149,
+6161,
+6162,
+6163,
+6253,
+6321,
+6322,
+6343,
+6346,
+6347,
+6382,
+6389,
+6471,
+6543,
+6547,
+6548,
+6549,
+6558,
+6566,
+6579,
+6581,
+6582,
+6583,
+6621,
+6623,
+6627,
+6628,
+6667,
+6672,
+6673,
+6714,
+6715,
+6767,
+6768,
+6769,
+6771,
+6786,
+6787,
+6788,
+6789,
+6791,
+6831,
+6841,
+6842,
+6888,
+6946,
+6961,
+6962,
+6963,
+6964,
+6965,
+6966,
+6969,
+6998,
+6999,
+7121,
+7161,
+7162,
+7163,
+7174,
+7227,
+7272,
+7273,
+7274,
+7281,
+7391,
+7392,
+7395,
+7397,
+7421,
+7426,
+7427,
+7428,
+7429,
+7431,
+7437,
+7491,
+7511,
+7543,
+7544,
+7545,
+7546,
+7547,
+7566,
+7588,
+7624,
+7626,
+7627,
+7633,
+7674,
+7675,
+7676,
+7677,
+7697,
+7725,
+7726,
+7727,
+7738,
+7743,
+7777,
+7778,
+7779,
+7781,
+7786,
+7794,
+7797,
+7798,
+7845,
+7846,
+7887,
+7913,
+7932,
+7933,
+7967,
+7979,
+7999,
+8115,
+8116,
+8118,
+8121,
+8122,
+8128,
+8129,
+8131,
+8132,
+8148,
+8161,
+8199,
+8351,
+8376,
+8377,
+8378,
+8379,
+8383,
+8416,
+8417,
+8443,
+8444,
+8473,
+8474,
+8554,
+8555,
+8567,
+8611,
+8612,
+8613,
+8614,
+8686,
+8699,
+8733,
+8763,
+8764,
+8765,
+8786,
+8787,
+8873,
+8888,
+8889,
+8891,
+8892,
+8893,
+8894,
+8911,
+8912,
+8913,
+8954,
+8989,
+8999,
+9131,
+9161,
+9162,
+9163,
+9164,
+9191,
+9211,
+9212,
+9213,
+9217,
+9222,
+9281,
+9282,
+9283,
+9284,
+9285,
+9287,
+9292,
+9318,
+9321,
+9343,
+9344,
+9346,
+9359,
+9374,
+9396,
+9397,
+9418,
+9535,
+9555,
+9593,
+9594,
+9595,
+9596,
+9597,
+9598,
+9599,
+9612,
+9747,
+9753,
+9875,
+9876,
+9888,
+9898,
+9899,
+9911,
+9951,
+9952,
+9953,
+9991,
+9992,
+9993,
+9994,
+9995,
+9996,
+9997,
+9998,
+9999,
+11111,
+11112,
+11161,
+11162,
+11163,
+11164,
+11165,
+11319,
+11321,
+11367,
+11371,
+11751,
+11967,
+12121,
+12168,
+12172,
+12321,
+12322,
+12345,
+12753,
+13223,
+13224,
+13721,
+13722,
+13724,
+13782,
+13783,
+13785,
+13786,
+13818,
+13819,
+13821,
+13822,
+14141,
+14145,
+14149,
+14936,
+14937,
+15345,
+15363,
+16161,
+16361,
+16367,
+16368,
+16384,
+16991,
+16992,
+16993,
+16994,
+16995,
+17185,
+17219,
+17235,
+18181,
+18182,
+18183,
+18184,
+18185,
+18186,
+18187,
+18241,
+18463,
+18769,
+18881,
+18888,
+19191,
+19194,
+19283,
+19315,
+19398,
+19411,
+19412,
+19539,
+19541,
+21845,
+21846,
+21847,
+21848,
+21849,
+22273,
+22555,
+22951,
+24242,
+24249,
+24321,
+24386,
+24554,
+24677,
+24678,
+24922,
+25793,
+26261,
+26262,
+26263,
+26264,
+27345,
+27374,
+27782,
+27999,
+31416,
+31457,
+31765,
+32249,
+32483,
+32635,
+32768,
+32769,
+32771,
+32772,
+32773,
+32774,
+32775,
+32896,
+33331,
+33434,
+33656,
+34249,
+34378,
+34379,
+34962,
+34963,
+34964,
+36865,
+37475,
+39681,
+41111,
+41794,
+41795,
+43188,
+43189,
+43441,
+44321,
+44322,
+44553,
+44818,
+45678,
+45966,
+46999,
+47557,
+47624,
+48556,
+48619,