]> granicus.if.org Git - sudo/commitdiff
Add support for command timeouts in sudoers. After the timeout,
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 14 Feb 2017 22:56:34 +0000 (15:56 -0700)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 14 Feb 2017 22:56:34 +0000 (15:56 -0700)
the command will be terminated.

31 files changed:
MANIFEST
doc/sudoers.cat
doc/sudoers.man.in
doc/sudoers.mdoc.in
plugins/sudoers/Makefile.in
plugins/sudoers/def_data.c
plugins/sudoers/def_data.h
plugins/sudoers/def_data.in
plugins/sudoers/defaults.c
plugins/sudoers/defaults.h
plugins/sudoers/gram.c
plugins/sudoers/gram.h
plugins/sudoers/gram.y
plugins/sudoers/ldap.c
plugins/sudoers/mkdefaults
plugins/sudoers/parse.c
plugins/sudoers/parse.h
plugins/sudoers/policy.c
plugins/sudoers/regress/sudoers/test17.in [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test17.json.ok [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test17.out.ok [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test17.toke.ok [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test18.in [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test18.json.ok [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test18.out.ok [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test18.toke.ok [new file with mode: 0644]
plugins/sudoers/testsudoers.c
plugins/sudoers/timeout.c [new file with mode: 0644]
plugins/sudoers/toke.c
plugins/sudoers/toke.l
plugins/sudoers/visudo_json.c

index 057f67b8508cd5e5a7666bf48d6b059a63c265ad..e14e0890c686af1eee752a397457926f5bddb682 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -407,6 +407,14 @@ plugins/sudoers/regress/sudoers/test16.in
 plugins/sudoers/regress/sudoers/test16.json.ok
 plugins/sudoers/regress/sudoers/test16.out.ok
 plugins/sudoers/regress/sudoers/test16.toke.ok
+plugins/sudoers/regress/sudoers/test17.in
+plugins/sudoers/regress/sudoers/test17.json.ok
+plugins/sudoers/regress/sudoers/test17.out.ok
+plugins/sudoers/regress/sudoers/test17.toke.ok
+plugins/sudoers/regress/sudoers/test18.in
+plugins/sudoers/regress/sudoers/test18.json.ok
+plugins/sudoers/regress/sudoers/test18.out.ok
+plugins/sudoers/regress/sudoers/test18.toke.ok
 plugins/sudoers/regress/sudoers/test2.in
 plugins/sudoers/regress/sudoers/test2.json.ok
 plugins/sudoers/regress/sudoers/test2.out.ok
@@ -493,6 +501,7 @@ plugins/sudoers/sudoers_debug.h
 plugins/sudoers/sudoers_version.h
 plugins/sudoers/sudoreplay.c
 plugins/sudoers/testsudoers.c
+plugins/sudoers/timeout.c
 plugins/sudoers/timestamp.c
 plugins/sudoers/timestr.c
 plugins/sudoers/toke.c
index be615baab07bbf29ed0aa2ab32dbdd5df674b5da..9b783b56c265536f9c92ddb1ecac9f3d898ca881 100644 (file)
@@ -95,9 +95,9 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
      was used to authenticate, the terminal session ID, and a time stamp
      (using a monotonic clock if one is available).  The user may then use
      s\bsu\bud\bdo\bo without a password for a short period of time (5 minutes unless
-     overridden by the _\bt_\bi_\bm_\be_\bo_\bu_\bt option).  By default, s\bsu\bud\bdo\boe\ber\brs\bs uses a separate
-     record for each tty, which means that a user's login sessions are
-     authenticated separately.  The _\bt_\bt_\by_\b__\bt_\bi_\bc_\bk_\be_\bt_\bs option can be disabled to
+     overridden by the _\bt_\bi_\bm_\be_\bs_\bt_\ba_\bm_\bp_\b__\bt_\bi_\bm_\be_\bo_\bu_\bt option).  By default, s\bsu\bud\bdo\boe\ber\brs\bs uses a
+     separate record for each tty, which means that a user's login sessions
+     are authenticated separately.  The _\bt_\bt_\by_\b__\bt_\bi_\bc_\bk_\be_\bt_\bs option can be disabled to
      force the use of a single time stamp for all of a user's sessions.
 
    L\bLo\bog\bgg\bgi\bin\bng\bg
@@ -478,12 +478,15 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS F\bFI\bIL\bLE\bE F\bFO\bOR\bRM\bMA\bAT\bT
 
      Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
-     Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Tag_Spec)
+     Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Timeout_Spec |
+                      Tag_Spec)
 
      SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
      Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
 
+     Timeout_Spec ::= 'TIMEOUT=timeout'
+
      Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
                    'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
                    'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
@@ -605,6 +608,16 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS F\bFI\bIL\bLE\bE F\bFO\bOR\bRM\bMA\bAT\bT
      Privileges can be excluded from a set by prefixing the privilege name
      with either an `!' or `-' character.
 
+   T\bTi\bim\bme\beo\bou\but\bt_\b_S\bSp\bpe\bec\bc
+     A command may have a timeout associated with it.  If the timeout expires
+     before the command has exited, the command will be terminated.  The
+     timeout may be specified in combinations of days, hours, minutes and
+     seconds.  For example, a timeout of 7 days, 8 hours, 30 minutes and 10
+     seconds would be written as 7d8h30m10s where the letter following a
+     number indicates the unit of time.  Any of the days, minutes, hours or
+     seconds may be omitted.  If a number is specified without a unit, seconds
+     is assumed.
+
    T\bTa\bag\bg_\b_S\bSp\bpe\bec\bc
      A command may have zero or more tags associated with it.  The following
      tag values are supported: EXEC, NOEXEC, FOLLOW, NOFOLLOW, LOG_INPUT,
@@ -1422,6 +1435,13 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS O\bOP\bPT\bTI\bIO\bON\bNS\bS
                        file descriptor at which to start closing.  The default
                        is 3.
 
+     command_timeout   The maximum amount of time a command is allowed to run
+                       before it is terminated.  See the Timeout_Spec section
+                       for a description of the timeout syntax.
+
+                       This setting is only supported by version 1.8.19 or
+                       higher.
+
      maxseq            The maximum sequence number that will be substituted
                        for the ``%{seq}'' escape in the I/O log file (see the
                        _\bi_\bo_\bl_\bo_\bg_\b__\bd_\bi_\br description above for more information).
index 399e8432a9751c2c3e59d19b041912dd8ebab049..0aa82c9c0bde8d38c4015d23231d4b1853204061 100644 (file)
@@ -224,7 +224,7 @@ The user may then use
 without a password for a short period of time
 (\fR@timeout@\fR
 minutes unless overridden by the
-\fItimeout\fR
+\fItimestamp_timeout\fR
 option)
 \&.
 By default,
@@ -986,12 +986,15 @@ Cmnd_Spec ::= Runas_Spec? Option_Spec* Cmnd
 
 Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
-Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Tag_Spec)
+Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Timeout_Spec |
+                 Tag_Spec)
 
 SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
 Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
 
+Timeout_Spec ::= 'TIMEOUT=timeout'
+
 Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
               'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
               'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
@@ -1253,6 +1256,18 @@ name with either an
 or
 \(oq\-\(cq
 character.
+.SS "Timeout_Spec"
+A command may have a timeout associated with it.
+If the timeout expires before the command has exited, the
+command will be terminated.
+The timeout may be specified in combinations of days, hours,
+minutes and seconds.
+For example, a timeout of 7 days, 8 hours, 30 minutes and
+10 seconds would be written as
+\fR7d8h30m10s\fR
+where the letter following a number indicates the unit of time.
+Any of the days, minutes, hours or seconds may be omitted.
+If a number is specified without a unit, seconds is assumed.
 .SS "Tag_Spec"
 A command may have zero or more tags associated with it.
 The following tag values are supported:
@@ -2988,6 +3003,15 @@ to start closing.
 The default is
 \fR3\fR.
 .TP 18n
+command_timeout
+The maximum amount of time a command is allowed to run before
+it is terminated.
+See the
+\fRTimeout_Spec\fR
+section for a description of the timeout syntax.
+.sp
+This setting is only supported by version 1.8.19 or higher.
+.TP 18n
 maxseq
 The maximum sequence number that will be substituted for the
 \(Lq\fR%{seq}\fR\(Rq
index 85eae4a52da0edaf9211771152558a4b070c848e..4f923ae08ae498bf4732ef21474ee223170fb3f9 100644 (file)
@@ -213,7 +213,7 @@ without a password for a short period of time
 .Po
 .Li @timeout@
 minutes unless overridden by the
-.Em timeout
+.Em timestamp_timeout
 option
 .Pc .
 By default,
@@ -939,12 +939,15 @@ Cmnd_Spec ::= Runas_Spec? Option_Spec* Cmnd
 
 Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
-Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Tag_Spec)
+Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Timeout_Spec |
+                 Tag_Spec)
 
 SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
 Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
 
+Timeout_Spec ::= 'TIMEOUT=timeout'
+
 Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
               'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
               'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
@@ -1176,6 +1179,18 @@ name with either an
 or
 .Ql \-
 character.
+.Ss Timeout_Spec
+A command may have a timeout associated with it.
+If the timeout expires before the command has exited, the
+command will be terminated.
+The timeout may be specified in combinations of days, hours,
+minutes and seconds.
+For example, a timeout of 7 days, 8 hours, 30 minutes and
+10 seconds would be written as
+.Li 7d8h30m10s
+where the letter following a number indicates the unit of time.
+Any of the days, minutes, hours or seconds may be omitted.
+If a number is specified without a unit, seconds is assumed.
 .Ss Tag_Spec
 A command may have zero or more tags associated with it.
 The following tag values are supported:
@@ -2804,6 +2819,14 @@ option can be used to specify a different file descriptor at which
 to start closing.
 The default is
 .Li 3 .
+.It command_timeout
+The maximum amount of time a command is allowed to run before
+it is terminated.
+See the
+.Li Timeout_Spec
+section for a description of the timeout syntax.
+.Pp
+This setting is only supported by version 1.8.20 or higher.
 .It maxseq
 The maximum sequence number that will be substituted for the
 .Dq Li %{seq}
index f36f9ef64735fda6d899de8e84f9c05721e9a208..48e03f7a3a96154ea53acf9911dc94551b15fab3 100644 (file)
@@ -152,8 +152,8 @@ AUTH_OBJS = sudo_auth.lo @AUTH_OBJS@
 
 LIBPARSESUDOERS_OBJS = alias.lo audit.lo base64.lo defaults.lo hexchar.lo \
                       gram.lo match.lo match_addr.lo pwutil.lo pwutil_impl.lo \
-                      rcstr.lo redblack.lo sudoers_debug.lo timestr.lo \
-                      toke.lo toke_util.lo
+                      rcstr.lo redblack.lo sudoers_debug.lo timeout.lo \
+                      timestr.lo toke.lo toke_util.lo
 
 SUDOERS_OBJS = $(AUTH_OBJS) boottime.lo check.lo editor.lo env.lo find_path.lo \
               gc.lo goodpath.lo group_plugin.lo interfaces.lo iolog.lo \
@@ -1077,6 +1077,16 @@ testsudoers.o: $(srcdir)/testsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \
                $(srcdir)/sudoers_debug.h $(srcdir)/tsgetgrpw.h \
                $(top_builddir)/config.h $(top_builddir)/pathnames.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/testsudoers.c
+timeout.lo: $(srcdir)/timeout.c $(devdir)/def_data.h \
+            $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+            $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
+            $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+            $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+            $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \
+            $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \
+            $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \
+            $(top_builddir)/pathnames.h
+       $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/timeout.c
 timestamp.lo: $(srcdir)/timestamp.c $(devdir)/def_data.h \
               $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
               $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
index 891aba2ad235131403859d0e4770a8b4946cea27..3ac51d7e9ee18dab5b1a78d5f08da9f27f73e6c3 100644 (file)
@@ -449,6 +449,10 @@ struct sudo_defs_types sudo_defs_table[] = {
        "ignore_unknown_defaults", T_FLAG,
        N_("Ignore unknown Defaults entries in sudoers instead of producing a warning"),
        NULL,
+    }, {
+       "command_timeout", T_TIMEOUT|T_BOOL,
+       N_("Time in seconds after which the command will be terminated: %u"),
+       NULL,
     }, {
        NULL, 0, NULL
     }
index 2d8e17c19a1bf40e214240f6d76ccc69863a92c7..3a5f5c6608c0141a11e0787479fcb0bf0d7920eb 100644 (file)
 #define def_fdexec              (sudo_defs_table[I_FDEXEC].sd_un.tuple)
 #define I_IGNORE_UNKNOWN_DEFAULTS 104
 #define def_ignore_unknown_defaults (sudo_defs_table[I_IGNORE_UNKNOWN_DEFAULTS].sd_un.flag)
+#define I_COMMAND_TIMEOUT       105
+#define def_command_timeout     (sudo_defs_table[I_COMMAND_TIMEOUT].sd_un.ival)
 
 enum def_tuple {
        never,
index a4f6628975e511fa73b5b4601a0367186b90c8c2..f6fa6c73350fe523bad503562bc946bc1b9d10c2 100644 (file)
@@ -329,3 +329,6 @@ fdexec
 ignore_unknown_defaults
        T_FLAG
        "Ignore unknown Defaults entries in sudoers instead of producing a warning"
+command_timeout
+       T_TIMEOUT|T_BOOL
+       "Time in seconds after which the command will be terminated: %u"
index 869b684f2db49ba282eac71f6fdf08ee130e05a0..8978847722e92b5c7200b86b4669f43bd2311a10 100644 (file)
@@ -101,6 +101,7 @@ static bool store_mode(const char *str, union sudo_defs_val *sd_un);
 static int  store_str(const char *str, union sudo_defs_val *sd_un);
 static bool store_syslogfac(const char *str, union sudo_defs_val *sd_un);
 static bool store_syslogpri(const char *str, union sudo_defs_val *sd_un);
+static bool store_timeout(const char *str, union sudo_defs_val *sd_un);
 static bool store_tuple(const char *str, union sudo_defs_val *sd_un, struct def_values *tuple_vals);
 static bool store_uint(const char *str, union sudo_defs_val *sd_un);
 static bool store_float(const char *str, union sudo_defs_val *sd_un);
@@ -178,6 +179,13 @@ dump_defaults(void)
                        }
                    }
                    break;
+               case T_TIMEOUT:
+                   if (cur->sd_un.ival) {
+                       sudo_printf(SUDO_CONV_INFO_MSG, desc,
+                           cur->sd_un.ival);
+                       sudo_printf(SUDO_CONV_INFO_MSG, "\n");
+                   }
+                   break;
                case T_TUPLE:
                    for (def = cur->values; def->sval; def++) {
                        if (cur->sd_un.tuple == def->nval) {
@@ -301,6 +309,9 @@ parse_default_entry(struct sudo_defs_types *def, const char *val, int op,
        case T_LIST:
            rc = store_list(val, sd_un, op);
            break;
+       case T_TIMEOUT:
+           rc = store_timeout(val, sd_un);
+           break;
        case T_TUPLE:
            rc = store_tuple(val, sd_un, def->values);
            break;
@@ -986,6 +997,25 @@ store_mode(const char *str, union sudo_defs_val *sd_un)
     debug_return_bool(true);
 }
 
+static bool
+store_timeout(const char *str, union sudo_defs_val *sd_un)
+{
+    debug_decl(store_mode, SUDOERS_DEBUG_DEFAULTS)
+
+    if (str == NULL) {
+       sd_un->ival = 0;
+    } else {
+       int seconds = parse_timeout(str);
+       if (seconds == -1) {
+           sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO,
+               "%s", str);
+           debug_return_bool(false);
+       }
+       sd_un->ival = seconds;
+    }
+    debug_return_bool(true);
+}
+
 static bool
 list_op(const char *str, size_t len, union sudo_defs_val *sd_un,
     enum list_ops op)
index 163d3c64d18d459839fc9eadb1b81237addee3da..dda48dc420a17f8461952f05b76322f350321be0 100644 (file)
@@ -99,6 +99,8 @@ struct early_default {
 #define T_TUPLE                0x009
 #undef T_FLOAT
 #define T_FLOAT                0x010
+#undef T_TIMEOUT
+#define T_TIMEOUT      0x020
 #undef T_MASK
 #define T_MASK         0x0FF
 #undef T_BOOL
index 59996acc6fba9f4abaf0057fb812343a9fd1a35e..600780940dc890b75f242b0c5a70c25138083c2a 100644 (file)
@@ -38,7 +38,7 @@
 #define YYPREFIX "sudoers"
 #line 2 "gram.y"
 /*
- * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2016
+ * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2017
  *     Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -81,6 +81,8 @@
 #if defined(YYBISON) && defined(HAVE_ALLOCA_H) && !defined(__GNUC__)
 # include <alloca.h>
 #endif /* YYBISON && HAVE_ALLOCA_H && !__GNUC__ */
+#include <ctype.h>
+#include <errno.h>
 #include <limits.h>
 
 #include "sudoers.h" /* XXX */
@@ -104,12 +106,13 @@ struct userspec_list userspecs = TAILQ_HEAD_INITIALIZER(userspecs);
 /*
  * Local protoypes
  */
+static void init_options(struct command_options *opts);
 static bool add_defaults(int, struct member *, struct defaults *);
 static bool add_userspec(struct member *, struct privilege *);
 static struct defaults *new_default(char *, char *, short);
 static struct member *new_member(char *, int);
 static struct sudo_digest *new_digest(int, const char *);
-#line 76 "gram.y"
+#line 79 "gram.y"
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
@@ -125,7 +128,7 @@ typedef union {
     int tok;
 } YYSTYPE;
 #endif /* YYSTYPE_DEFINED */
-#line 128 "gram.c"
+#line 131 "gram.c"
 #define COMMAND 257
 #define ALIAS 258
 #define DEFVAR 259
@@ -164,11 +167,12 @@ typedef union {
 #define ROLE 292
 #define PRIVS 293
 #define LIMITPRIVS 294
-#define MYSELF 295
-#define SHA224_TOK 296
-#define SHA256_TOK 297
-#define SHA384_TOK 298
-#define SHA512_TOK 299
+#define CMND_TIMEOUT 295
+#define MYSELF 296
+#define SHA224_TOK 297
+#define SHA256_TOK 298
+#define SHA384_TOK 299
+#define SHA512_TOK 300
 #define YYERRCODE 256
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerslhs[] =
@@ -176,17 +180,18 @@ const short sudoerslhs[] =
 short sudoerslhs[] =
 #endif
        {                                        -1,
-    0,    0,   28,   28,   29,   29,   29,   29,   29,   29,
-   29,   29,   29,   29,   29,   29,    4,    4,    3,    3,
+    0,    0,   29,   29,   30,   30,   30,   30,   30,   30,
+   30,   30,   30,   30,   30,   30,    4,    4,    3,    3,
     3,    3,    3,   21,   21,   20,   11,   11,    9,    9,
-    9,    9,    9,    2,    2,    1,   27,   27,   27,   27,
-    7,    7,    6,    6,   23,   24,   25,   26,   18,   18,
-   19,   19,   19,   19,   19,   22,   22,   22,   22,   22,
+    9,    9,    9,    2,    2,    1,   28,   28,   28,   28,
+    7,    7,    6,    6,   27,   23,   24,   25,   26,   18,
+   18,   19,   19,   19,   19,   19,   22,   22,   22,   22,
    22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
-   22,   22,   22,   22,    5,    5,    5,   31,   31,   34,
-   10,   10,   32,   32,   35,    8,    8,   33,   33,   36,
-   30,   30,   37,   14,   14,   12,   12,   13,   13,   13,
-   13,   13,   17,   17,   15,   15,   16,   16,   16,
+   22,   22,   22,   22,   22,   22,    5,    5,    5,   32,
+   32,   35,   10,   10,   33,   33,   36,    8,    8,   34,
+   34,   37,   31,   31,   38,   14,   14,   12,   12,   13,
+   13,   13,   13,   13,   17,   17,   15,   15,   16,   16,
+   16,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerslen[] =
@@ -198,13 +203,14 @@ short sudoerslen[] =
     2,    2,    3,    3,    3,    3,    1,    3,    1,    2,
     3,    3,    3,    1,    3,    3,    1,    2,    1,    1,
     1,    1,    1,    1,    3,    3,    3,    3,    3,    3,
-    1,    2,    1,    2,    3,    3,    3,    3,    0,    3,
-    0,    1,    3,    2,    1,    0,    2,    2,    2,    2,
+    1,    2,    1,    2,    3,    3,    3,    3,    3,    0,
+    3,    0,    1,    3,    2,    1,    0,    2,    2,    2,
     2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-    2,    2,    2,    2,    1,    1,    1,    1,    3,    3,
-    1,    3,    1,    3,    3,    1,    3,    1,    3,    3,
-    1,    3,    3,    1,    3,    1,    2,    1,    1,    1,
-    1,    1,    1,    3,    1,    2,    1,    1,    1,
+    2,    2,    2,    2,    2,    2,    1,    1,    1,    1,
+    3,    3,    1,    3,    1,    3,    3,    1,    3,    1,
+    3,    3,    1,    3,    3,    1,    3,    1,    2,    1,
+    1,    1,    1,    1,    1,    3,    1,    2,    1,    1,
+    1,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersdefred[] =
@@ -212,24 +218,24 @@ const short sudoersdefred[] =
 short sudoersdefred[] =
 #endif
        {                                      0,
-    0,   98,  100,  101,  102,    0,    0,    0,    0,    0,
-   99,    5,    0,    0,    0,    0,    0,    0,   94,   96,
+    0,  100,  102,  103,  104,    0,    0,    0,    0,    0,
+  101,    5,    0,    0,    0,    0,    0,    0,   96,   98,
     0,    0,    3,    6,    0,    0,   17,    0,   29,   32,
-   31,   33,   30,    0,   27,    0,   81,    0,    0,   77,
-   76,   75,    0,    0,    0,    0,    0,   43,   41,   86,
-    0,    0,    0,    0,   78,    0,    0,   83,    0,    0,
-   91,    0,    0,   88,   97,    0,    0,   24,    0,    4,
+   31,   33,   30,    0,   27,    0,   83,    0,    0,   79,
+   78,   77,    0,    0,    0,    0,    0,   43,   41,   88,
+    0,    0,    0,    0,   80,    0,    0,   85,    0,    0,
+   93,    0,    0,   90,   99,    0,    0,   24,    0,    4,
     0,    0,    0,   20,    0,   28,    0,    0,    0,    0,
    44,    0,    0,    0,    0,    0,    0,   42,    0,    0,
-    0,    0,    0,    0,    0,    0,   95,    0,    0,   21,
-   22,   23,   18,   82,   37,   38,   39,   40,   87,    0,
-   79,    0,   84,    0,   92,    0,   89,    0,   34,    0,
-   56,   25,    0,    0,    0,    0,    0,  107,  109,  108,
-    0,  103,  105,    0,    0,   50,   35,   57,   58,   59,
-   60,   61,   62,   63,   64,   65,   66,   69,   70,   67,
-   68,    0,    0,    0,    0,   36,   71,   72,   73,   74,
-  106,    0,    0,    0,    0,    0,    0,  104,   46,   45,
-   47,   48,
+    0,    0,    0,    0,    0,    0,   97,    0,    0,   21,
+   22,   23,   18,   84,   37,   38,   39,   40,   89,    0,
+   81,    0,   86,    0,   94,    0,   91,    0,   34,    0,
+   57,   25,    0,    0,    0,    0,    0,  109,  111,  110,
+    0,  105,  107,    0,    0,   51,   35,   59,   60,   61,
+   62,   63,   64,   65,   66,   67,   68,   71,   72,   69,
+   70,    0,    0,    0,    0,    0,   36,   73,   74,   75,
+   76,   58,  108,    0,    0,    0,    0,    0,    0,    0,
+  106,   47,   46,   48,   49,   45,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersdgoto[] =
@@ -239,69 +245,69 @@ short sudoersdgoto[] =
        {                                      18,
   119,  120,   27,   28,   48,   49,   50,   51,   35,   67,
    37,   19,   20,   21,  132,  133,  134,  121,  125,   68,
-   69,  127,  157,  158,  159,  160,   52,   22,   23,   60,
-   54,   57,   63,   55,   58,   64,   61,
+   69,  127,  158,  159,  160,  161,  162,   52,   22,   23,
+   60,   54,   57,   63,   55,   58,   64,   61,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerssindex[] =
 #else
 short sudoerssindex[] =
 #endif
-       {                                    478,
- -266,    0,    0,    0,    0,  -23,  289,  -19,  -19,   -5,
+       {                                    499,
+ -266,    0,    0,    0,    0,  -23,  227,  -19,  -19,   -5,
     0,    0, -233, -232, -221, -219, -231,    0,    0,    0,
-  -33,  478,    0,    0,   -3, -216,    0,    3,    0,    0,
+  -33,  499,    0,    0,   -3, -216,    0,    3,    0,    0,
     0,    0,    0, -225,    0,  -28,    0,  -24,  -24,    0,
     0,    0, -240,   -8,   -7,   -2,    2,    0,    0,    0,
   -21,  -12,   -9,    8,    0,   -4,   10,    0,    9,   11,
     0,   13,   14,    0,    0,  -19,  -37,    0,   17,    0,
- -208, -202, -192,    0,  -23,    0,  289,    3,    3,    3,
-    0, -188, -186, -185, -184,   -5,    3,    0,  289, -233,
-   -5, -232,  -19, -221,  -19, -219,    0,   41,  289,    0,
+ -208, -202, -192,    0,  -23,    0,  227,    3,    3,    3,
+    0, -188, -186, -185, -184,   -5,    3,    0,  227, -233,
+   -5, -232,  -19, -221,  -19, -219,    0,   41,  227,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,   39,
     0,   40,    0,   42,    0,   42,    0,  -29,    0,   46,
-    0,    0,  405,  -36,   44,   41,  404,    0,    0,    0,
- -217,    0,    0,   47,  405,    0,    0,    0,    0,    0,
+    0,    0,  289,  -36,   44,   41,  404,    0,    0,    0,
+ -217,    0,    0,   47,  289,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,   31,   32,   33,   34,    0,    0,    0,    0,    0,
-    0,  405,   47, -165, -164, -163, -162,    0,    0,    0,
-    0,    0,};
+    0,   31,   32,   33,   34,   37,    0,    0,    0,    0,
+    0,    0,    0,  289,   47, -164, -163, -162, -161, -160,
+    0,    0,    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersrindex[] =
 #else
 short sudoersrindex[] =
 #endif
-       {                                    102,
+       {                                    104,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  103,    0,    0,    1,    0,    0,  145,    0,    0,
+    0,  105,    0,    0,    1,    0,    0,  145,    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,  159,    0,    0,  193,    0,    0,  207,
     0,    0,  241,    0,    0,    0,    0,    0,  275,    0,
     0,    0,    0,    0,    0,    0,    0,  309,  323,  357,
     0,    0,    0,    0,    0,    0,  371,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  434,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  450,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,   15,
-    0,   49,    0,   63,    0,   97,    0,   64,    0,  111,
-    0,    0,   65,   67,    0,  434,    0,    0,    0,    0,
-    0,    0,    0,   68,    0,    0,    0,    0,    0,    0,
+    0,   49,    0,   63,    0,   97,    0,   65,    0,  111,
+    0,    0,   67,   68,    0,  450,    0,    0,    0,    0,
+    0,    0,    0,   69,    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,   69,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,};
+    0,    0,    0,    0,   72,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersgindex[] =
 #else
 short sudoersgindex[] =
 #endif
        {                                      0,
-  -22,    0,   38,   26,   71,   66,  -73,   24,   82,   -1,
-   43,   51,  105,   -6,  -43,    4,  -11,    0,    0,   27,
-    0,    0,    0,    0,    0,    0,    0,    0,  101,    0,
-    0,    0,    0,   35,   36,   37,   45,
+  -11,    0,   43,   26,   71,   64,  -73,   28,   83,   -1,
+   45,   54,  106,   -6,  -40,    4,  -10,    0,    0,   27,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  107,
+    0,    0,    0,    0,   38,   35,   36,   48,
 };
-#define YYTABLESIZE 767
+#define YYTABLESIZE 788
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerstable[] =
 #else
@@ -309,21 +315,21 @@ short sudoerstable[] =
 #endif
        {                                      34,
    19,   38,   39,   17,   26,   36,   77,   66,   26,   26,
-   66,   26,  109,   17,   80,   77,   40,   41,   24,   66,
+   66,   26,  109,   17,   82,   77,   40,   41,   24,   66,
    43,  135,   86,   98,   53,   56,    2,   43,  123,    3,
     4,    5,   29,   19,   30,   31,   59,   32,   62,   72,
-  128,   73,   74,   42,   19,  129,   75,   80,   85,   82,
-   83,   89,   11,  156,  100,   84,   91,   71,   33,   85,
-  101,   78,   93,   79,   80,   90,  130,   92,   94,   93,
-  102,   96,   80,   95,   99,  105,   87,  106,  107,  108,
-  118,   85,   77,   86,  136,   66,  114,  110,  116,  126,
-  162,  164,  165,  166,  167,   93,   90,  169,  170,  171,
-  172,    1,    2,  137,   51,   55,   85,   52,   54,   53,
-   26,  124,  103,   81,  112,   76,   97,   88,  168,  104,
-   93,   65,   70,  163,  111,  122,    0,  113,    0,   90,
-    0,    0,  117,    0,  161,    0,    0,    0,  115,    0,
-    0,    0,    0,   26,   12,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   90,    0,    0,    0,    9,    0,
+  128,   73,   74,   42,   19,  129,   75,   82,   87,   82,
+   83,   89,   11,  157,  100,   84,   91,   71,   33,   85,
+  101,   78,   95,   79,   80,   90,  130,   92,   94,   93,
+  102,   96,   82,   95,   99,  105,   87,  106,  107,  108,
+  118,   87,   77,   86,  136,   66,  114,  110,  116,  126,
+  164,  166,  167,  168,  169,   95,   92,  170,  172,  173,
+  174,  175,  176,    1,    2,   52,   87,   56,   53,   55,
+   26,  124,   54,   81,  137,   88,   76,  103,  112,   97,
+   95,  104,   65,  171,  165,  122,  113,  111,   70,   92,
+    0,  117,    0,    0,  163,    0,    0,    0,    0,    0,
+    0,  115,    0,   26,   12,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   92,    0,    0,    0,    9,    0,
     0,    0,    0,    0,    0,    0,    0,    0,   26,    0,
     0,    0,    0,    0,    0,    0,    0,   12,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -333,39 +339,39 @@ short sudoerstable[] =
     0,    0,    0,    0,   29,   10,   30,   31,    2,   32,
    25,    3,    4,    5,   25,   25,    0,   25,    2,    8,
    11,    3,    4,    5,   40,   41,    0,    0,    0,    0,
-   33,   40,   41,    0,   11,    0,   19,    0,   19,    0,
+   33,   40,   41,    0,   11,    0,   19,    0,   19,   34,
     0,   19,   19,   19,   11,   19,   19,   19,   19,   19,
-   80,   42,   80,   11,    7,   80,   80,   80,   42,   80,
-   80,   80,   80,   80,   19,   19,   19,   19,   19,   19,
-   44,   45,   46,   47,    0,    0,    0,    0,   80,   80,
-   80,   80,   80,   80,   85,    0,   85,    7,   15,   85,
-   85,   85,    0,   85,   85,   85,   85,   85,   93,    0,
-   93,   34,   13,   93,   93,   93,    0,   93,   93,   93,
-   93,   93,   85,   85,   85,   85,   85,   85,    0,    0,
-    0,   15,    0,    0,    0,    0,   93,   93,   93,   93,
-   93,   93,   90,    0,   90,   13,   14,   90,   90,   90,
-    0,   90,   90,   90,   90,   90,   26,    0,   26,    0,
+   82,   42,   82,   11,    7,   82,   82,   82,   42,   82,
+   82,   82,   82,   82,   19,   19,   19,   19,   19,   19,
+    0,   44,   45,   46,   47,    0,    0,    0,   82,   82,
+   82,   82,   82,   82,   87,    0,   87,    7,   15,   87,
+   87,   87,    0,   87,   87,   87,   87,   87,   95,    0,
+   95,  131,   13,   95,   95,   95,    0,   95,   95,   95,
+   95,   95,   87,   87,   87,   87,   87,   87,    0,    0,
+    0,   15,    0,    0,    0,    0,   95,   95,   95,   95,
+   95,   95,   92,    0,   92,   13,   14,   92,   92,   92,
+    0,   92,   92,   92,   92,   92,   26,    0,   26,    0,
    16,   26,   26,   26,    0,   26,   26,   26,   26,   26,
-   90,   90,   90,   90,   90,   90,    0,    0,    0,   14,
+   92,   92,   92,   92,   92,   92,    0,    0,    0,   14,
     0,    0,    0,    0,   26,   26,   26,   26,   26,   26,
    12,    0,   12,   16,    0,   12,   12,   12,    0,   12,
    12,   12,   12,   12,    9,    0,    9,    0,    0,    9,
     9,    9,    0,    9,    9,    9,    9,    9,   12,   12,
-   12,   12,   12,   12,    0,    0,   43,  131,    0,    0,
+   12,   12,   12,   12,    0,    0,   43,    0,    0,    0,
     0,    0,    9,    9,    9,    9,    9,    9,   10,    0,
    10,    0,    0,   10,   10,   10,    0,   10,   10,   10,
-   10,   10,    8,    0,    8,    0,   49,    8,    8,    8,
+   10,   10,    8,    0,    8,    0,    0,    8,    8,    8,
     0,    8,    8,    8,    8,    8,   10,   10,   10,   10,
-   10,   10,    0,    0,    0,    0,    0,    0,    0,    0,
+   10,   10,   50,    0,   29,    0,   30,   31,    0,   32,
     8,    8,    8,    8,    8,    8,   11,    0,   11,    0,
     0,   11,   11,   11,    0,   11,   11,   11,   11,   11,
-   17,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   33,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,   11,   11,   11,   11,   11,   11,
-    7,    0,    7,    0,    0,    7,    7,    7,    0,    7,
-    7,    7,    7,    7,    0,    0,   29,    0,   30,   31,
-    0,   32,    0,    0,    0,    0,    0,    0,    7,    7,
+    7,   17,    7,    0,    0,    7,    7,    7,    0,    7,
+    7,    7,    7,    7,    0,    0,  128,    0,    0,    0,
+    0,  129,    0,    0,    0,    0,    0,    0,    7,    7,
     7,    7,    7,    7,   15,    0,   15,    0,    0,   15,
-   15,   15,   33,   15,   15,   15,   15,   15,   13,    0,
+   15,   15,  130,   15,   15,   15,   15,   15,   13,    0,
    13,    0,    0,   13,   13,   13,    0,   13,   13,   13,
    13,   13,   15,   15,   15,   15,   15,   15,    0,    0,
     0,    0,    0,    0,    0,    0,   13,   13,   13,   13,
@@ -374,17 +380,19 @@ short sudoerstable[] =
     0,   16,   16,   16,    0,   16,   16,   16,   16,   16,
    14,   14,   14,   14,   14,   14,    0,    0,    0,    0,
     0,    0,    0,    0,   16,   16,   16,   16,   16,   16,
-   40,   41,  128,    0,    0,    0,    0,  129,    0,    0,
+   40,   41,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,  138,  139,  140,  141,  142,  143,  144,
-  145,  146,  147,  148,  149,  150,  151,   42,  130,    0,
-   49,   49,    0,    0,  152,  153,  154,  155,    0,   44,
-   45,   46,   47,   49,   49,   49,   49,   49,   49,   49,
-   49,   49,   49,   49,   49,   49,   49,   49,    0,    0,
-    0,    0,    0,    0,   49,   49,   49,   49,    0,   49,
-   49,   49,   49,    1,    0,    2,    0,    0,    3,    4,
-    5,    0,    6,    7,    8,    9,   10,    0,    0,    0,
+  145,  146,  147,  148,  149,  150,  151,   42,    0,    0,
+    0,    0,    0,    0,  152,  153,  154,  155,  156,    0,
+   44,   45,   46,   47,    0,    0,   50,   50,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   50,
+   50,   50,   50,   50,   50,   50,   50,   50,   50,   50,
+   50,   50,   50,   50,    0,    0,    0,    0,    0,    0,
+   50,   50,   50,   50,   50,    0,   50,   50,   50,   50,
+    0,    0,    0,    0,    1,    0,    2,    0,    0,    3,
+    4,    5,    0,    6,    7,    8,    9,   10,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,   11,   12,   13,   14,   15,   16,
+    0,    0,   11,   12,   13,   14,   15,   16,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerscheck[] =
@@ -401,12 +409,12 @@ short sudoerscheck[] =
   263,   36,    0,   38,   39,   58,  284,   58,   58,   61,
   263,   58,   58,   61,   58,  264,   51,  264,  264,  264,
    40,   33,   44,   44,   41,   44,   93,   89,   95,   44,
-   44,   61,   61,   61,   61,   33,    0,  263,  263,  263,
-  263,    0,    0,  126,   41,   41,   58,   41,   41,   41,
-    0,  118,   75,   43,   91,   34,   66,   52,  162,   77,
-   58,   17,   22,  135,   90,   99,   -1,   92,   -1,   33,
-   -1,   -1,   96,   -1,  131,   -1,   -1,   -1,   94,   -1,
-   -1,   -1,   -1,   33,    0,   -1,   -1,   -1,   -1,   -1,
+   44,   61,   61,   61,   61,   33,    0,   61,  263,  263,
+  263,  263,  263,    0,    0,   41,   58,   41,   41,   41,
+    0,  118,   41,   43,  126,   52,   34,   75,   91,   66,
+   58,   77,   17,  164,  135,   99,   92,   90,   22,   33,
+   -1,   96,   -1,   -1,  131,   -1,   -1,   -1,   -1,   -1,
+   -1,   94,   -1,   33,    0,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   58,   -1,   -1,   -1,    0,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,
@@ -417,11 +425,11 @@ short sudoerscheck[] =
    -1,   -1,   -1,   -1,  258,   33,  260,  261,  258,  263,
   259,  261,  262,  263,  259,  259,   -1,  259,  258,   33,
     0,  261,  262,  263,  257,  258,   -1,   -1,   -1,   -1,
-  284,  257,  258,   -1,  284,   -1,  256,   -1,  258,   -1,
+  284,  257,  258,   -1,  284,   -1,  256,   -1,  258,   33,
    -1,  261,  262,  263,  284,  265,  266,  267,  268,  269,
   256,  284,  258,   33,    0,  261,  262,  263,  284,  265,
   266,  267,  268,  269,  284,  285,  286,  287,  288,  289,
-  296,  297,  298,  299,   -1,   -1,   -1,   -1,  284,  285,
+   -1,  297,  298,  299,  300,   -1,   -1,   -1,  284,  285,
   286,  287,  288,  289,  256,   -1,  258,   33,    0,  261,
   262,  263,   -1,  265,  266,  267,  268,  269,  256,   -1,
   258,   33,    0,  261,  262,  263,   -1,  265,  266,  267,
@@ -435,18 +443,18 @@ short sudoerscheck[] =
   256,   -1,  258,   33,   -1,  261,  262,  263,   -1,  265,
   266,  267,  268,  269,  256,   -1,  258,   -1,   -1,  261,
   262,  263,   -1,  265,  266,  267,  268,  269,  284,  285,
-  286,  287,  288,  289,   -1,   -1,   33,   33,   -1,   -1,
+  286,  287,  288,  289,   -1,   -1,   33,   -1,   -1,   -1,
    -1,   -1,  284,  285,  286,  287,  288,  289,  256,   -1,
   258,   -1,   -1,  261,  262,  263,   -1,  265,  266,  267,
-  268,  269,  256,   -1,  258,   -1,   33,  261,  262,  263,
+  268,  269,  256,   -1,  258,   -1,   -1,  261,  262,  263,
    -1,  265,  266,  267,  268,  269,  284,  285,  286,  287,
-  288,  289,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  288,  289,   33,   -1,  258,   -1,  260,  261,   -1,  263,
   284,  285,  286,  287,  288,  289,  256,   -1,  258,   -1,
    -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
-   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  284,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,  284,  285,  286,  287,  288,  289,
-  256,   -1,  258,   -1,   -1,  261,  262,  263,   -1,  265,
-  266,  267,  268,  269,   -1,   -1,  258,   -1,  260,  261,
+  256,   33,  258,   -1,   -1,  261,  262,  263,   -1,  265,
+  266,  267,  268,  269,   -1,   -1,  258,   -1,   -1,   -1,
    -1,  263,   -1,   -1,   -1,   -1,   -1,   -1,  284,  285,
   286,  287,  288,  289,  256,   -1,  258,   -1,   -1,  261,
   262,  263,  284,  265,  266,  267,  268,  269,  256,   -1,
@@ -458,23 +466,25 @@ short sudoerscheck[] =
    -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
   284,  285,  286,  287,  288,  289,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,  284,  285,  286,  287,  288,  289,
-  257,  258,  258,   -1,   -1,   -1,   -1,  263,   -1,   -1,
+  257,  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,  270,  271,  272,  273,  274,  275,  276,
-  277,  278,  279,  280,  281,  282,  283,  284,  284,   -1,
-  257,  258,   -1,   -1,  291,  292,  293,  294,   -1,  296,
-  297,  298,  299,  270,  271,  272,  273,  274,  275,  276,
   277,  278,  279,  280,  281,  282,  283,  284,   -1,   -1,
-   -1,   -1,   -1,   -1,  291,  292,  293,  294,   -1,  296,
-  297,  298,  299,  256,   -1,  258,   -1,   -1,  261,  262,
-  263,   -1,  265,  266,  267,  268,  269,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,   -1,
+  297,  298,  299,  300,   -1,   -1,  257,  258,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  270,
+  271,  272,  273,  274,  275,  276,  277,  278,  279,  280,
+  281,  282,  283,  284,   -1,   -1,   -1,   -1,   -1,   -1,
+  291,  292,  293,  294,  295,   -1,  297,  298,  299,  300,
+   -1,   -1,   -1,   -1,  256,   -1,  258,   -1,   -1,  261,
+  262,  263,   -1,  265,  266,  267,  268,  269,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  284,  285,  286,  287,  288,  289,
+   -1,   -1,  284,  285,  286,  287,  288,  289,
 };
 #define YYFINAL 18
 #ifndef YYDEBUG
 #define YYDEBUG 0
 #endif
-#define YYMAXTOKEN 299
+#define YYMAXTOKEN 300
 #if YYDEBUG
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const sudoersname[] =
@@ -494,8 +504,8 @@ char *sudoersname[] =
 "NOPASSWD","PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT",
 "NOLOG_INPUT","LOG_OUTPUT","NOLOG_OUTPUT","MAIL","NOMAIL","FOLLOW","NOFOLLOW",
 "ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS","RUNASALIAS","ERROR","TYPE",
-"ROLE","PRIVS","LIMITPRIVS","MYSELF","SHA224_TOK","SHA256_TOK","SHA384_TOK",
-"SHA512_TOK",
+"ROLE","PRIVS","LIMITPRIVS","CMND_TIMEOUT","MYSELF","SHA224_TOK","SHA256_TOK",
+"SHA384_TOK","SHA512_TOK",
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const sudoersrule[] =
@@ -547,6 +557,7 @@ char *sudoersrule[] =
 "digcmnd : digest opcmnd",
 "opcmnd : cmnd",
 "opcmnd : '!' cmnd",
+"timeoutspec : CMND_TIMEOUT '=' WORD",
 "rolespec : ROLE '=' WORD",
 "typespec : TYPE '=' WORD",
 "privsspec : PRIVS '=' WORD",
@@ -559,6 +570,7 @@ char *sudoersrule[] =
 "runaslist : ':' grouplist",
 "runaslist : ':'",
 "options :",
+"options : options timeoutspec",
 "options : options NOPASSWD",
 "options : options PASSWD",
 "options : options NOEXEC",
@@ -640,7 +652,7 @@ short *yysslim;
 YYSTYPE *yyvs;
 unsigned int yystacksize;
 int yyparse(void);
-#line 834 "gram.y"
+#line 850 "gram.y"
 void
 sudoerserror(const char *s)
 {
@@ -955,7 +967,25 @@ init_parser(const char *path, bool quiet)
 
     debug_return_bool(ret);
 }
-#line 906 "gram.c"
+
+/*
+ * Initialize all options in a cmndspec.
+ */
+static void
+init_options(struct command_options *opts)
+{
+    TAGS_INIT(opts->tags);
+    opts->timeout = UNSPEC;
+#ifdef HAVE_SELINUX
+    opts->role = NULL;
+    opts->type = NULL;
+#endif
+#ifdef HAVE_PRIV_SET
+    opts->privs = NULL;
+    opts->limitprivs = NULL;
+#endif
+}
+#line 936 "gram.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -1164,23 +1194,23 @@ yyreduce:
     switch (yyn)
     {
 case 1:
-#line 166 "gram.y"
+#line 172 "gram.y"
 { ; }
 break;
 case 5:
-#line 174 "gram.y"
+#line 180 "gram.y"
 {
                            ;
                        }
 break;
 case 6:
-#line 177 "gram.y"
+#line 183 "gram.y"
 {
                            yyerrok;
                        }
 break;
 case 7:
-#line 180 "gram.y"
+#line 186 "gram.y"
 {
                            if (!add_userspec(yyvsp[-1].member, yyvsp[0].privilege)) {
                                sudoerserror(N_("unable to allocate memory"));
@@ -1189,73 +1219,73 @@ case 7:
                        }
 break;
 case 8:
-#line 186 "gram.y"
+#line 192 "gram.y"
 {
                            ;
                        }
 break;
 case 9:
-#line 189 "gram.y"
+#line 195 "gram.y"
 {
                            ;
                        }
 break;
 case 10:
-#line 192 "gram.y"
+#line 198 "gram.y"
 {
                            ;
                        }
 break;
 case 11:
-#line 195 "gram.y"
+#line 201 "gram.y"
 {
                            ;
                        }
 break;
 case 12:
-#line 198 "gram.y"
+#line 204 "gram.y"
 {
                            if (!add_defaults(DEFAULTS, NULL, yyvsp[0].defaults))
                                YYERROR;
                        }
 break;
 case 13:
-#line 202 "gram.y"
+#line 208 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults))
                                YYERROR;
                        }
 break;
 case 14:
-#line 206 "gram.y"
+#line 212 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults))
                                YYERROR;
                        }
 break;
 case 15:
-#line 210 "gram.y"
+#line 216 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults))
                                YYERROR;
                        }
 break;
 case 16:
-#line 214 "gram.y"
+#line 220 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults))
                                YYERROR;
                        }
 break;
 case 18:
-#line 221 "gram.y"
+#line 227 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].defaults, yyvsp[0].defaults, entries);
                            yyval.defaults = yyvsp[-2].defaults;
                        }
 break;
 case 19:
-#line 227 "gram.y"
+#line 233 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, true);
                            if (yyval.defaults == NULL) {
@@ -1265,7 +1295,7 @@ case 19:
                        }
 break;
 case 20:
-#line 234 "gram.y"
+#line 240 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, false);
                            if (yyval.defaults == NULL) {
@@ -1275,7 +1305,7 @@ case 20:
                        }
 break;
 case 21:
-#line 241 "gram.y"
+#line 247 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true);
                            if (yyval.defaults == NULL) {
@@ -1285,7 +1315,7 @@ case 21:
                        }
 break;
 case 22:
-#line 248 "gram.y"
+#line 254 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
                            if (yyval.defaults == NULL) {
@@ -1295,7 +1325,7 @@ case 22:
                        }
 break;
 case 23:
-#line 255 "gram.y"
+#line 261 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
                            if (yyval.defaults == NULL) {
@@ -1305,14 +1335,14 @@ case 23:
                        }
 break;
 case 25:
-#line 265 "gram.y"
+#line 271 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].privilege, yyvsp[0].privilege, entries);
                            yyval.privilege = yyvsp[-2].privilege;
                        }
 break;
 case 26:
-#line 271 "gram.y"
+#line 277 "gram.y"
 {
                            struct privilege *p = calloc(1, sizeof(*p));
                            if (p == NULL) {
@@ -1326,21 +1356,21 @@ case 26:
                        }
 break;
 case 27:
-#line 284 "gram.y"
+#line 290 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 28:
-#line 288 "gram.y"
+#line 294 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 29:
-#line 294 "gram.y"
+#line 300 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -1350,7 +1380,7 @@ case 29:
                        }
 break;
 case 30:
-#line 301 "gram.y"
+#line 307 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -1360,7 +1390,7 @@ case 30:
                        }
 break;
 case 31:
-#line 308 "gram.y"
+#line 314 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                            if (yyval.member == NULL) {
@@ -1370,7 +1400,7 @@ case 31:
                        }
 break;
 case 32:
-#line 315 "gram.y"
+#line 321 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NTWKADDR);
                            if (yyval.member == NULL) {
@@ -1380,7 +1410,7 @@ case 32:
                        }
 break;
 case 33:
-#line 322 "gram.y"
+#line 328 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                            if (yyval.member == NULL) {
@@ -1390,7 +1420,7 @@ case 33:
                        }
 break;
 case 35:
-#line 332 "gram.y"
+#line 338 "gram.y"
 {
                            struct cmndspec *prev;
                            prev = HLTQ_LAST(yyvsp[-2].cmndspec, cmndspec, entries);
@@ -1409,6 +1439,9 @@ case 35:
                            if (yyvsp[0].cmndspec->limitprivs == NULL)
                                yyvsp[0].cmndspec->limitprivs = prev->limitprivs;
 #endif /* HAVE_PRIV_SET */
+                           /* propagate command timeout */
+                           if (yyvsp[0].cmndspec->timeout == UNSPEC)
+                               yyvsp[0].cmndspec->timeout = prev->timeout;
                            /* propagate tags and runas list */
                            if (yyvsp[0].cmndspec->tags.nopasswd == UNSPEC)
                                yyvsp[0].cmndspec->tags.nopasswd = prev->tags.nopasswd;
@@ -1436,7 +1469,7 @@ case 35:
                        }
 break;
 case 36:
-#line 377 "gram.y"
+#line 386 "gram.y"
 {
                            struct cmndspec *cs = calloc(1, sizeof(*cs));
                            if (cs == NULL) {
@@ -1474,6 +1507,7 @@ case 36:
                            cs->privs = yyvsp[-1].options.privs;
                            cs->limitprivs = yyvsp[-1].options.limitprivs;
 #endif
+                           cs->timeout = yyvsp[-1].options.timeout;
                            cs->tags = yyvsp[-1].options.tags;
                            cs->cmnd = yyvsp[0].member;
                            HLTQ_INIT(cs, entries);
@@ -1485,7 +1519,7 @@ case 36:
                        }
 break;
 case 37:
-#line 425 "gram.y"
+#line 435 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA224, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1495,7 +1529,7 @@ case 37:
                        }
 break;
 case 38:
-#line 432 "gram.y"
+#line 442 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA256, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1505,7 +1539,7 @@ case 38:
                        }
 break;
 case 39:
-#line 439 "gram.y"
+#line 449 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA384, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1515,7 +1549,7 @@ case 39:
                        }
 break;
 case 40:
-#line 446 "gram.y"
+#line 456 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA512, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1525,13 +1559,13 @@ case 40:
                        }
 break;
 case 41:
-#line 455 "gram.y"
+#line 465 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                        }
 break;
 case 42:
-#line 458 "gram.y"
+#line 468 "gram.y"
 {
                            if (yyvsp[0].member->type != COMMAND) {
                                sudoerserror(N_("a digest requires a path name"));
@@ -1543,57 +1577,63 @@ case 42:
                        }
 break;
 case 43:
-#line 469 "gram.y"
+#line 479 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 44:
-#line 473 "gram.y"
+#line 483 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 45:
-#line 479 "gram.y"
+#line 489 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 46:
-#line 484 "gram.y"
+#line 494 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 47:
-#line 489 "gram.y"
+#line 499 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 48:
-#line 493 "gram.y"
+#line 504 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 49:
-#line 498 "gram.y"
+#line 508 "gram.y"
 {
-                           yyval.runas = NULL;
+                           yyval.string = yyvsp[0].string;
                        }
 break;
 case 50:
-#line 501 "gram.y"
+#line 513 "gram.y"
 {
-                           yyval.runas = yyvsp[-1].runas;
+                           yyval.runas = NULL;
                        }
 break;
 case 51:
-#line 506 "gram.y"
+#line 516 "gram.y"
+{
+                           yyval.runas = yyvsp[-1].runas;
+                       }
+break;
+case 52:
+#line 521 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas != NULL) {
@@ -1610,8 +1650,8 @@ case 51:
                            }
                        }
 break;
-case 52:
-#line 521 "gram.y"
+case 53:
+#line 536 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas == NULL) {
@@ -1622,8 +1662,8 @@ case 52:
                            /* $$->runasgroups = NULL; */
                        }
 break;
-case 53:
-#line 530 "gram.y"
+case 54:
+#line 545 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas == NULL) {
@@ -1634,8 +1674,8 @@ case 53:
                            yyval.runas->runasgroups = yyvsp[0].member;
                        }
 break;
-case 54:
-#line 539 "gram.y"
+case 55:
+#line 554 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas == NULL) {
@@ -1646,8 +1686,8 @@ case 54:
                            yyval.runas->runasgroups = yyvsp[0].member;
                        }
 break;
-case 55:
-#line 548 "gram.y"
+case 56:
+#line 563 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas != NULL) {
@@ -1664,136 +1704,140 @@ case 55:
                            }
                        }
 break;
-case 56:
-#line 565 "gram.y"
+case 57:
+#line 580 "gram.y"
 {
-                           TAGS_INIT(yyval.options.tags);
-#ifdef HAVE_SELINUX
-                           yyval.options.role = NULL, yyval.options.type = NULL;
-#endif
-#ifdef HAVE_PRIV_SET
-                           yyval.options.privs = NULL, yyval.options.limitprivs = NULL;
-#endif
+                           init_options(&yyval.options);
                        }
 break;
-case 57:
-#line 574 "gram.y"
+case 58:
+#line 583 "gram.y"
+{
+                           yyval.options.timeout = parse_timeout(yyvsp[0].string);
+                           if (yyval.options.timeout == -1) {
+                               sudoerserror(N_("unable parse timeout value"));
+                               YYERROR;
+                           }
+                       }
+break;
+case 59:
+#line 590 "gram.y"
 {
                            yyval.options.tags.nopasswd = true;
                        }
 break;
-case 58:
-#line 577 "gram.y"
+case 60:
+#line 593 "gram.y"
 {
                            yyval.options.tags.nopasswd = false;
                        }
 break;
-case 59:
-#line 580 "gram.y"
+case 61:
+#line 596 "gram.y"
 {
                            yyval.options.tags.noexec = true;
                        }
 break;
-case 60:
-#line 583 "gram.y"
+case 62:
+#line 599 "gram.y"
 {
                            yyval.options.tags.noexec = false;
                        }
 break;
-case 61:
-#line 586 "gram.y"
+case 63:
+#line 602 "gram.y"
 {
                            yyval.options.tags.setenv = true;
                        }
 break;
-case 62:
-#line 589 "gram.y"
+case 64:
+#line 605 "gram.y"
 {
                            yyval.options.tags.setenv = false;
                        }
 break;
-case 63:
-#line 592 "gram.y"
+case 65:
+#line 608 "gram.y"
 {
                            yyval.options.tags.log_input = true;
                        }
 break;
-case 64:
-#line 595 "gram.y"
+case 66:
+#line 611 "gram.y"
 {
                            yyval.options.tags.log_input = false;
                        }
 break;
-case 65:
-#line 598 "gram.y"
+case 67:
+#line 614 "gram.y"
 {
                            yyval.options.tags.log_output = true;
                        }
 break;
-case 66:
-#line 601 "gram.y"
+case 68:
+#line 617 "gram.y"
 {
                            yyval.options.tags.log_output = false;
                        }
 break;
-case 67:
-#line 604 "gram.y"
+case 69:
+#line 620 "gram.y"
 {
                            yyval.options.tags.follow = true;
                        }
 break;
-case 68:
-#line 607 "gram.y"
+case 70:
+#line 623 "gram.y"
 {
                            yyval.options.tags.follow = false;
                        }
 break;
-case 69:
-#line 610 "gram.y"
+case 71:
+#line 626 "gram.y"
 {
                            yyval.options.tags.send_mail = true;
                        }
 break;
-case 70:
-#line 613 "gram.y"
+case 72:
+#line 629 "gram.y"
 {
                            yyval.options.tags.send_mail = false;
                        }
 break;
-case 71:
-#line 616 "gram.y"
+case 73:
+#line 632 "gram.y"
 {
 #ifdef HAVE_SELINUX
                            yyval.options.role = yyvsp[0].string;
 #endif
                        }
 break;
-case 72:
-#line 621 "gram.y"
+case 74:
+#line 637 "gram.y"
 {
 #ifdef HAVE_SELINUX
                            yyval.options.type = yyvsp[0].string;
 #endif
                        }
 break;
-case 73:
-#line 626 "gram.y"
+case 75:
+#line 642 "gram.y"
 {
 #ifdef HAVE_PRIV_SET
                            yyval.options.privs = yyvsp[0].string;
 #endif
                        }
 break;
-case 74:
-#line 631 "gram.y"
+case 76:
+#line 647 "gram.y"
 {
 #ifdef HAVE_PRIV_SET
                            yyval.options.limitprivs = yyvsp[0].string;
 #endif
                        }
 break;
-case 75:
-#line 638 "gram.y"
+case 77:
+#line 654 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -1802,8 +1846,8 @@ case 75:
                            }
                        }
 break;
-case 76:
-#line 645 "gram.y"
+case 78:
+#line 661 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -1812,8 +1856,8 @@ case 76:
                            }
                        }
 break;
-case 77:
-#line 652 "gram.y"
+case 79:
+#line 668 "gram.y"
 {
                            struct sudo_command *c = calloc(1, sizeof(*c));
                            if (c == NULL) {
@@ -1830,8 +1874,8 @@ case 77:
                            }
                        }
 break;
-case 80:
-#line 673 "gram.y"
+case 82:
+#line 689 "gram.y"
 {
                            const char *s;
                            s = alias_add(yyvsp[-2].string, HOSTALIAS, sudoers, this_lineno, yyvsp[0].member);
@@ -1841,15 +1885,15 @@ case 80:
                            }
                        }
 break;
-case 82:
-#line 684 "gram.y"
+case 84:
+#line 700 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 85:
-#line 694 "gram.y"
+case 87:
+#line 710 "gram.y"
 {
                            const char *s;
                            s = alias_add(yyvsp[-2].string, CMNDALIAS, sudoers, this_lineno, yyvsp[0].member);
@@ -1859,15 +1903,15 @@ case 85:
                            }
                        }
 break;
-case 87:
-#line 705 "gram.y"
+case 89:
+#line 721 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 90:
-#line 715 "gram.y"
+case 92:
+#line 731 "gram.y"
 {
                            const char *s;
                            s = alias_add(yyvsp[-2].string, RUNASALIAS, sudoers, this_lineno, yyvsp[0].member);
@@ -1877,8 +1921,8 @@ case 90:
                            }
                        }
 break;
-case 93:
-#line 729 "gram.y"
+case 95:
+#line 745 "gram.y"
 {
                            const char *s;
                            s = alias_add(yyvsp[-2].string, USERALIAS, sudoers, this_lineno, yyvsp[0].member);
@@ -1888,29 +1932,29 @@ case 93:
                            }
                        }
 break;
-case 95:
-#line 740 "gram.y"
+case 97:
+#line 756 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 96:
-#line 746 "gram.y"
+case 98:
+#line 762 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 97:
-#line 750 "gram.y"
+case 99:
+#line 766 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 98:
-#line 756 "gram.y"
+case 100:
+#line 772 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -1919,8 +1963,8 @@ case 98:
                            }
                        }
 break;
-case 99:
-#line 763 "gram.y"
+case 101:
+#line 779 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -1929,8 +1973,8 @@ case 99:
                            }
                        }
 break;
-case 100:
-#line 770 "gram.y"
+case 102:
+#line 786 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                            if (yyval.member == NULL) {
@@ -1939,8 +1983,8 @@ case 100:
                            }
                        }
 break;
-case 101:
-#line 777 "gram.y"
+case 103:
+#line 793 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, USERGROUP);
                            if (yyval.member == NULL) {
@@ -1949,8 +1993,8 @@ case 101:
                            }
                        }
 break;
-case 102:
-#line 784 "gram.y"
+case 104:
+#line 800 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                            if (yyval.member == NULL) {
@@ -1959,29 +2003,29 @@ case 102:
                            }
                        }
 break;
-case 104:
-#line 794 "gram.y"
+case 106:
+#line 810 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 105:
-#line 800 "gram.y"
+case 107:
+#line 816 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 106:
-#line 804 "gram.y"
+case 108:
+#line 820 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 107:
-#line 810 "gram.y"
+case 109:
+#line 826 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -1990,8 +2034,8 @@ case 107:
                            }
                        }
 break;
-case 108:
-#line 817 "gram.y"
+case 110:
+#line 833 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -2000,8 +2044,8 @@ case 108:
                            }
                        }
 break;
-case 109:
-#line 824 "gram.y"
+case 111:
+#line 840 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                            if (yyval.member == NULL) {
@@ -2010,7 +2054,7 @@ case 109:
                            }
                        }
 break;
-#line 1961 "gram.c"
+#line 2005 "gram.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
index e2ccaeec27a3d2caceec38b097f79cdf865e6aaa..f86240977648069e99c2447dc2695103a5d4ed0f 100644 (file)
 #define ROLE 292
 #define PRIVS 293
 #define LIMITPRIVS 294
-#define MYSELF 295
-#define SHA224_TOK 296
-#define SHA256_TOK 297
-#define SHA384_TOK 298
-#define SHA512_TOK 299
+#define CMND_TIMEOUT 295
+#define MYSELF 296
+#define SHA224_TOK 297
+#define SHA256_TOK 298
+#define SHA384_TOK 299
+#define SHA512_TOK 300
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
index 2b1a98a4e4d9e708fd567cfa95f34620d710b874..6a3fb6dde8d1b9f8d0fc962367b2e0199872edd4 100644 (file)
@@ -1,6 +1,6 @@
 %{
 /*
- * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2016
+ * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2017
  *     Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -43,6 +43,8 @@
 #if defined(YYBISON) && defined(HAVE_ALLOCA_H) && !defined(__GNUC__)
 # include <alloca.h>
 #endif /* YYBISON && HAVE_ALLOCA_H && !__GNUC__ */
+#include <ctype.h>
+#include <errno.h>
 #include <limits.h>
 
 #include "sudoers.h" /* XXX */
@@ -66,6 +68,7 @@ struct userspec_list userspecs = TAILQ_HEAD_INITIALIZER(userspecs);
 /*
  * Local protoypes
  */
+static void init_options(struct command_options *opts);
 static bool add_defaults(int, struct member *, struct defaults *);
 static bool add_userspec(struct member *, struct privilege *);
 static struct defaults *new_default(char *, char *, short);
@@ -127,6 +130,7 @@ static struct sudo_digest *new_digest(int, const char *);
 %token <tok>    ROLE                   /* SELinux role */
 %token <tok>    PRIVS                  /* Solaris privileges */
 %token <tok>    LIMITPRIVS             /* Solaris limit privileges */
+%token <tok>    CMND_TIMEOUT           /* command timeout */
 %token <tok>    MYSELF                 /* run as myself, not another user */
 %token <tok>    SHA224_TOK             /* sha224 token */
 %token <tok>    SHA256_TOK             /* sha256 token */
@@ -159,7 +163,9 @@ static struct sudo_digest *new_digest(int, const char *);
 %type <string>   typespec
 %type <string>   privsspec
 %type <string>   limitprivsspec
+%type <string>   timeoutspec
 %type <digest>   digest
+%type <options>          options
 
 %%
 
@@ -347,6 +353,9 @@ cmndspeclist        :       cmndspec
                            if ($3->limitprivs == NULL)
                                $3->limitprivs = prev->limitprivs;
 #endif /* HAVE_PRIV_SET */
+                           /* propagate command timeout */
+                           if ($3->timeout == UNSPEC)
+                               $3->timeout = prev->timeout;
                            /* propagate tags and runas list */
                            if ($3->tags.nopasswd == UNSPEC)
                                $3->tags.nopasswd = prev->tags.nopasswd;
@@ -411,6 +420,7 @@ cmndspec    :       runasspec options digcmnd {
                            cs->privs = $2.privs;
                            cs->limitprivs = $2.limitprivs;
 #endif
+                           cs->timeout = $2.timeout;
                            cs->tags = $2.tags;
                            cs->cmnd = $3;
                            HLTQ_INIT(cs, entries);
@@ -476,6 +486,11 @@ opcmnd             :       cmnd {
                        }
                ;
 
+timeoutspec    :       CMND_TIMEOUT '=' WORD {
+                           $$ = $3;
+                       }
+               ;
+
 rolespec       :       ROLE '=' WORD {
                            $$ = $3;
                        }
@@ -563,13 +578,14 @@ runaslist :       /* empty */ {
                ;
 
 options                :       /* empty */ {
-                           TAGS_INIT($$.tags);
-#ifdef HAVE_SELINUX
-                           $$.role = NULL, $$.type = NULL;
-#endif
-#ifdef HAVE_PRIV_SET
-                           $$.privs = NULL, $$.limitprivs = NULL;
-#endif
+                           init_options(&$$);
+                       }
+               |       options timeoutspec {
+                           $$.timeout = parse_timeout($2);
+                           if ($$.timeout == -1) {
+                               sudoerserror(N_("unable parse timeout value"));
+                               YYERROR;
+                           }
                        }
                |       options NOPASSWD {
                            $$.tags.nopasswd = true;
@@ -1145,3 +1161,21 @@ init_parser(const char *path, bool quiet)
 
     debug_return_bool(ret);
 }
+
+/*
+ * Initialize all options in a cmndspec.
+ */
+static void
+init_options(struct command_options *opts)
+{
+    TAGS_INIT(opts->tags);
+    opts->timeout = UNSPEC;
+#ifdef HAVE_SELINUX
+    opts->role = NULL;
+    opts->type = NULL;
+#endif
+#ifdef HAVE_PRIV_SET
+    opts->privs = NULL;
+    opts->limitprivs = NULL;
+#endif
+}
index 72b2f07a215c22e783b209d937c74aa196e9be4d..7a28cf1165ce92a5422e5dc00f76b0f160fdec01 100644 (file)
@@ -2479,6 +2479,8 @@ sudo_ldap_display_entry_short(LDAP *ld, LDAPMessage *entry, struct passwd *pw,
                sudo_lbuf_append(lbuf, negated ? "NOSETENV: " : "SETENV: ");
            else if (strcmp(val, "mail_all_cmnds") == 0 || strcmp(val, "mail_always") == 0)
                sudo_lbuf_append(lbuf, negated ? "NOMAIL: " : "MAIL: ");
+           else if (!negated && strcmp(val, "command_timeout") == 0)
+               sudo_lbuf_append(lbuf, "TIMEOUT=%s", val);
        }
        ldap_value_free_len(bv);
     }
index 654c5d8febc9ec0960c537c3674a17f88ca08010..603c95c712d283b1ecb7ef70db48926514bfa72d 100755 (executable)
@@ -147,6 +147,7 @@ sub print_record {
        elsif (/^T_LOGPRI/) { $v = "ival"; }
        elsif (/^T_TUPLE/)  { $v = "tuple"; }
        elsif (/^T_FLOAT/)  { $v = "fval"; }
+       elsif (/^T_TIMEOUT/)  { $v = "ival"; }
        else { die "$0: unknown defaults type: $_\n"; }
     }
     printf HEADER "#define %-23s (sudo_defs_table[$defname].sd_un.${v})\n",
index 08474a504090b43139cb178621aeb43a90ae547f..527dd96a7606807f49323a36b86be207769a8163 100644 (file)
@@ -145,7 +145,7 @@ sudo_file_setdefs(struct sudo_nss *nss)
 int
 sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag)
 {
-    int match, host_match, runas_match, cmnd_match;
+    int match, host_match, runas_match, cmnd_match, timeout;
     struct cmndspec *cs;
     struct cmndtag *tags = NULL;
     struct privilege *priv;
@@ -227,6 +227,7 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag)
                    if (cmnd_match != UNSPEC) {
                        match = cmnd_match;
                        tags = &cs->tags;
+                       timeout = cs->timeout;
 #ifdef HAVE_SELINUX
                        /* Set role and type if not specified on command line. */
                        if (user_role == NULL) {
@@ -301,6 +302,8 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag)
     if (match == ALLOW) {
        SET(validated, VALIDATE_SUCCESS);
        CLR(validated, VALIDATE_FAILURE);
+       if (timeout > 0)
+           def_command_timeout = timeout;
        if (tags != NULL) {
            if (tags->nopasswd != UNSPEC)
                def_authenticate = !tags->nopasswd;
@@ -370,6 +373,11 @@ sudo_file_append_cmnd(struct cmndspec *cs, struct cmndtag *tags,
     if (cs->type)
        sudo_lbuf_append(lbuf, "TYPE=%s ", cs->type);
 #endif /* HAVE_SELINUX */
+    if (cs->timeout > 0) {
+       char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2];
+       snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout);
+       sudo_lbuf_append(lbuf, "TIMEOUT=%s ", numbuf);
+    }
     if (TAG_CHANGED(setenv)) {
        tags->setenv = cs->tags.setenv;
        sudo_lbuf_append(lbuf, tags->setenv ? "SETENV: " : "NOSETENV: ");
@@ -481,6 +489,8 @@ new_long_entry(struct cmndspec *cs, struct cmndspec *prev_cs)
     if (cs->type && (!prev_cs->type || strcmp(cs->type, prev_cs->type) != 0))
        return true;
 #endif /* HAVE_SELINUX */
+    if (cs->timeout != prev_cs->timeout)
+       return true;
     return false;
 }
 
@@ -553,6 +563,11 @@ sudo_file_display_priv_long(struct passwd *pw, struct userspec *us,
                if (cs->type)
                    sudo_lbuf_append(lbuf, "    Type: %s\n", cs->type);
 #endif /* HAVE_SELINUX */
+               if (cs->timeout > 0) {
+                   char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2];
+                   snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout);
+                   sudo_lbuf_append(lbuf, "    Timeout: %s\n", numbuf);
+               }
                sudo_lbuf_append(lbuf, _("    Commands:\n"));
            }
            sudo_lbuf_append(lbuf, "\t");
index 6450e2a29981466e4adc21b9a70d06fdf1e146e8..4523648329d9da8605919e8885c71e4b0891aabc 100644 (file)
@@ -113,7 +113,8 @@ struct cmndtag {
  * Per-command option container struct.
  */
 struct command_options {
-    struct cmndtag tags;               /* Command tags */
+    struct cmndtag tags;               /* tag specificaion */
+    int timeout;                       /* command timeout */
 #ifdef HAVE_SELINUX
     char *role, *type;                 /* SELinux role and type */
 #endif
@@ -168,6 +169,7 @@ struct privilege {
 
 /*
  * Structure describing a linked list of Cmnd_Specs.
+ * XXX - include struct command_options instad of its contents inline
  */
 struct cmndspec {
     TAILQ_ENTRY(cmndspec) entries;
@@ -175,6 +177,7 @@ struct cmndspec {
     struct member_list *runasgrouplist;        /* list of runas groups */
     struct member *cmnd;               /* command to allow/deny */
     struct cmndtag tags;               /* tag specificaion */
+    int timeout;                       /* command timeout */
 #ifdef HAVE_SELINUX
     char *role, *type;                 /* SELinux role and type */
 #endif
@@ -275,4 +278,7 @@ int hexchar(const char *s);
 /* base64.c */
 size_t base64_decode(const char *str, unsigned char *dst, size_t dsize);
 
+/* timeout.c */
+int parse_timeout(const char *timestr);
+
 #endif /* SUDOERS_PARSE_H */
index 4ee1e284e3571998dd1edd05892e3c8b2da33513..857601fec4fca63575357ce971fc2b92eac91134 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2010-2017 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -580,6 +580,10 @@ sudoers_policy_exec_setup(char *argv[], char *envp[], mode_t cmnd_umask,
        if ((command_info[info_len++] = sudo_new_key_val("iolog_group", def_iolog_group)) == NULL)
            goto oom;
     }
+    if (def_command_timeout != 0) {
+       if (asprintf(&command_info[info_len++], "timeout=%u", def_command_timeout) == -1)
+           goto oom;
+    }
     if (cmnd_umask != ACCESSPERMS) {
        if (asprintf(&command_info[info_len++], "umask=0%o", (unsigned int)cmnd_umask) == -1)
            goto oom;
diff --git a/plugins/sudoers/regress/sudoers/test17.in b/plugins/sudoers/regress/sudoers/test17.in
new file mode 100644 (file)
index 0000000..37d066c
--- /dev/null
@@ -0,0 +1,13 @@
+# Test parsing of command_timeout and TIMEOUT syntax
+Defaults command_timeout=2d8h10m59s
+user0  ALL = TIMEOUT=7D4H10M30S /usr/bin/id, /usr/bin/who, TIMEOUT=0 /bin/ls
+user1  ALL = TIMEOUT=7d4h10m30s /usr/bin/id
+user2  ALL = TIMEOUT=4h10m30s /usr/bin/id
+user3  ALL = TIMEOUT=10m30s /usr/bin/id
+user4  ALL = TIMEOUT=14d /usr/bin/id
+user5  ALL = TIMEOUT=5m /usr/bin/id
+user6  ALL = TIMEOUT=30s /usr/bin/id
+user7  ALL = TIMEOUT=45 /usr/bin/id
+user8  ALL = TIMEOUT=7d4h10m30s /usr/bin/id, TIMEOUT=4h10m30s /usr/bin/id, \
+             TIMEOUT=10m30s /usr/bin/id, TIMEOUT=14d /usr/bin/id, \
+             TIMEOUT=5m /usr/bin/id, TIMEOUT=30s /usr/bin/id
diff --git a/plugins/sudoers/regress/sudoers/test17.json.ok b/plugins/sudoers/regress/sudoers/test17.json.ok
new file mode 100644 (file)
index 0000000..bd599f0
--- /dev/null
@@ -0,0 +1,180 @@
+{
+    "Defaults": [
+        {
+            "Options": [
+                { "command_timeout": "2d8h10m59s" }
+            ]
+        }
+    ],
+    "User_Specs": [
+        {
+            "User_List": [
+                { "username": "user0" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "command_timeout": 619830 }
+                    ],
+                    "Commands": [
+                        { "command": "/usr/bin/id" },
+                        { "command": "/usr/bin/who" },
+                        { "command": "/bin/ls" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user1" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "command_timeout": 619830 }
+                    ],
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user2" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "command_timeout": 15030 }
+                    ],
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user3" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "command_timeout": 630 }
+                    ],
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user4" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "command_timeout": 1209600 }
+                    ],
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user5" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "command_timeout": 300 }
+                    ],
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user6" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "command_timeout": 30 }
+                    ],
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user7" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "command_timeout": 45 }
+                    ],
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user8" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "command_timeout": 619830 }
+                    ],
+                    "Commands": [
+                        { "command": "/usr/bin/id" },
+                        { "command": "/usr/bin/id" },
+                        { "command": "/usr/bin/id" },
+                        { "command": "/usr/bin/id" },
+                        { "command": "/usr/bin/id" },
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        }
+    ]
+}
diff --git a/plugins/sudoers/regress/sudoers/test17.out.ok b/plugins/sudoers/regress/sudoers/test17.out.ok
new file mode 100644 (file)
index 0000000..c76ef60
--- /dev/null
@@ -0,0 +1,14 @@
+Parses OK.
+
+Defaults       command_timeout=2d8h10m59s
+
+
+user0  ALL = TIMEOUT=619830 /usr/bin/id, TIMEOUT=619830 /usr/bin/who, /bin/ls
+user1  ALL = TIMEOUT=619830 /usr/bin/id
+user2  ALL = TIMEOUT=15030 /usr/bin/id
+user3  ALL = TIMEOUT=630 /usr/bin/id
+user4  ALL = TIMEOUT=1209600 /usr/bin/id
+user5  ALL = TIMEOUT=300 /usr/bin/id
+user6  ALL = TIMEOUT=30 /usr/bin/id
+user7  ALL = TIMEOUT=45 /usr/bin/id
+user8  ALL = TIMEOUT=619830 /usr/bin/id, TIMEOUT=15030 /usr/bin/id, TIMEOUT=630 /usr/bin/id, TIMEOUT=1209600 /usr/bin/id, TIMEOUT=300 /usr/bin/id, TIMEOUT=30 /usr/bin/id
diff --git a/plugins/sudoers/regress/sudoers/test17.toke.ok b/plugins/sudoers/regress/sudoers/test17.toke.ok
new file mode 100644 (file)
index 0000000..17bb5fb
--- /dev/null
@@ -0,0 +1,11 @@
+#
+DEFAULTS DEFVAR = WORD(2) 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND , COMMAND , CMND_TIMEOUT = WORD(5) COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND 
diff --git a/plugins/sudoers/regress/sudoers/test18.in b/plugins/sudoers/regress/sudoers/test18.in
new file mode 100644 (file)
index 0000000..8d94ec7
--- /dev/null
@@ -0,0 +1,8 @@
+# Test command_timeout and TIMEOUT syntax errors
+Defaults command_timeout=2d8h10m59ss
+Defaults:root command_timeout=15f
+user0  ALL = TIMEOUT=7dd4h10m30s /usr/bin/id, /usr/bin/who, TIMEOUT=0 /bin/ls
+user1  ALL = TIMEOUT=7d4h10mm30s /usr/bin/id
+user2  ALL = TIMEOUT=4hg10m30s /usr/bin/id
+user3  ALL = TIMEOUT=10m30ss /usr/bin/id
+user4  ALL = TIMEOUT=14g /usr/bin/id
diff --git a/plugins/sudoers/regress/sudoers/test18.json.ok b/plugins/sudoers/regress/sudoers/test18.json.ok
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/plugins/sudoers/regress/sudoers/test18.out.ok b/plugins/sudoers/regress/sudoers/test18.out.ok
new file mode 100644 (file)
index 0000000..74a9a38
--- /dev/null
@@ -0,0 +1,6 @@
+Parse error in sudoers near line 4 (problem with defaults entries).
+
+Defaults       command_timeout=2d8h10m59ss
+Defaults:root  command_timeout=15f
+
+
diff --git a/plugins/sudoers/regress/sudoers/test18.toke.ok b/plugins/sudoers/regress/sudoers/test18.toke.ok
new file mode 100644 (file)
index 0000000..05fbaef
--- /dev/null
@@ -0,0 +1,10 @@
+#
+DEFAULTS DEFVAR = WORD(2) 
+DEFAULTS_USER WORD(5) DEFVAR = WORD(2) 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND , COMMAND , CMND_TIMEOUT = WORD(5) COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND 
+WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND 
+testsudoers: sudoers:2 value "2d8h10m59ss" is invalid for option "command_timeout"
+testsudoers: sudoers:3 value "15f" is invalid for option "command_timeout"
index 67e4959053682f1d844a8ce98f54228807464791..bfe4f2ad89a4aa0a5341d066a8862305e736cbb5 100644 (file)
@@ -634,6 +634,8 @@ print_privilege(struct privilege *priv)
        if (cs->limitprivs)
            printf("LIMITPRIVS=%s ", cs->limitprivs);
 #endif /* HAVE_PRIV_SET */
+       if (cs->timeout > 0)
+           printf("TIMEOUT=%d ", cs->timeout);
        if (TAG_CHANGED(follow))
            printf("%sFOLLOW: ", cs->tags.follow ? "" : "NO");
        if (TAG_CHANGED(log_input))
diff --git a/plugins/sudoers/timeout.c b/plugins/sudoers/timeout.c
new file mode 100644 (file)
index 0000000..8d6cbfd
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2017 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif /* HAVE_STRING_H */
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif /* HAVE_STRINGS_H */
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+
+#include "sudo_compat.h"
+#include "sudoers_debug.h"
+#include "parse.h"
+
+/*
+ * Parse a command timeout in sudoers in the format 1d2h3m4s
+ * (days, hours, minutes, seconds) or a number of seconds with no suffix.
+ * Returns the number of seconds or -1 on error.
+ */
+int
+parse_timeout(const char *timestr)
+{
+    debug_decl(parse_timeout, SUDOERS_DEBUG_PARSER)
+    const char digits[] = "0123456789";
+    const char suffixes[] = "dhms";
+    const char *cp;
+    int timeout = 0;
+    size_t len = 0;
+    int idx = 0;
+
+    for (cp = timestr; *cp != '\0'; cp += len) {
+       char ch;
+       long l;
+
+       if ((len = strspn(cp, digits)) == 0) {
+           /* parse error */
+           errno = EINVAL;
+           debug_return_int(-1);
+       }
+       if (cp[len] == '\0') {
+           /* no suffix, assume seconds. */
+           ch = 's';
+       } else {
+           ch = tolower(cp[len]);
+           len++;
+       }
+
+       /* Find a matching suffix or return an error. */
+       while (suffixes[idx] != ch) {
+           if (suffixes[idx] == '\0') {
+               /* parse error */
+               errno = EINVAL;
+               debug_return_int(-1);
+           }
+           idx++;
+       }
+
+       errno = 0;
+       l = strtol(cp, NULL, 10);
+       if (errno == ERANGE || l > INT_MAX)
+           goto overflow;
+       switch (ch) {
+       case 'd':
+           if (l > INT_MAX / (24 * 60 * 60))
+               goto overflow;
+           l *= 24 * 60 * 60;
+           break;
+       case 'h':
+           if (l > INT_MAX / (60 * 60))
+               goto overflow;
+           l *= 60 * 60;
+           break;
+       case 'm':
+           if (l > INT_MAX / 60)
+               goto overflow;
+           l *= 60;
+           break;
+       }
+       if (l > INT_MAX - timeout)
+           goto overflow;
+
+       timeout += l;
+    }
+
+    debug_return_int(timeout);
+overflow:
+    errno = EOVERFLOW;
+    debug_return_int(-1);
+}
index f126a96e92cb947c1313815404889760d64940ca..c03ad83561c9358a883d5e825b397752c45710eb 100644 (file)
@@ -306,105 +306,105 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 71
-#define YY_END_OF_BUFFER 72
-static yyconst short int yy_accept[862] =
+#define YY_NUM_RULES 72
+#define YY_END_OF_BUFFER 73
+static yyconst short int yy_accept[868] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   72,   59,   67,   66,   65,   58,
-       69,   38,   60,   61,   38,   62,   59,   59,   59,   59,
-       64,   63,   70,   50,   50,   50,   50,   50,   50,   50,
-       50,   50,   50,   50,   50,   70,   59,   59,   67,   69,
-       50,   50,   50,   50,   50,    2,   70,    1,   59,   50,
-       50,   59,   17,   16,   17,   16,   16,   70,   69,   70,
-        3,    9,    8,    9,    4,    9,    5,   70,   13,   13,
-       13,   11,   12,   70,   19,   19,   18,   18,   18,   19,
+        0,    0,    0,    0,   73,   60,   68,   67,   66,   59,
+       70,   38,   61,   62,   38,   63,   60,   60,   60,   60,
+       65,   64,   71,   51,   51,   51,   51,   51,   51,   51,
+       51,   51,   51,   51,   51,   71,   60,   60,   68,   70,
+       51,   51,   51,   51,   51,    2,   71,    1,   60,   51,
+       51,   60,   17,   16,   17,   16,   16,   71,   70,   71,
+        3,    9,    8,    9,    4,    9,    5,   71,   13,   13,
+       13,   11,   12,   71,   19,   19,   18,   18,   18,   19,
        18,   18,   18,   18,   19,   19,   19,   19,   19,   19,
 
-       18,   19,   19,   59,    0,   67,   65,   69,   69,    0,
-       59,   40,    0,   38,    0,   39,    0,   57,   57,    0,
-       59,   59,    0,   59,   59,   59,   59,    0,   43,   50,
-       50,   50,   50,   50,   50,   50,   50,   50,   50,   50,
-       50,   50,   50,   59,   68,   59,   59,   67,    0,    0,
-        0,    0,    0,   69,   59,   59,   59,   59,   59,    2,
-        1,    0,    1,   51,   51,    0,   59,   17,   17,   15,
-       14,   15,    0,    0,    3,    9,    0,    6,    7,    9,
-        9,   13,    0,   13,   13,    0,   10,   40,    0,    0,
-       39,   19,   19,    0,   19,    0,    0,   18,   18,   18,
-
-       18,   18,   18,   19,   19,   50,   19,   19,   19,   19,
-       19,   19,   19,   19,   19,   69,   69,    0,   40,   59,
-       59,   59,   59,   59,    0,    0,   43,   43,   50,   45,
-       50,   50,   50,   50,   50,   50,   50,   50,   50,   50,
-       50,   50,   50,   50,   50,   50,   59,   59,    0,    0,
-        0,    0,    0,   69,   59,   59,   59,   59,   59,    0,
-       59,   10,    0,    0,    0,   18,   18,   18,   19,   19,
+       18,   19,   19,   60,    0,   68,   66,   70,   70,    0,
+       60,   40,    0,   38,    0,   39,    0,   58,   58,    0,
+       60,   60,    0,   60,   60,   60,   60,    0,   43,   51,
+       51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
+       51,   51,   51,   51,   60,   69,   60,   60,   68,    0,
+        0,    0,    0,    0,   70,   60,   60,   60,   60,   60,
+        2,    1,    0,    1,   52,   52,    0,   60,   17,   17,
+       15,   14,   15,    0,    0,    3,    9,    0,    6,    7,
+        9,    9,   13,    0,   13,   13,    0,   10,   40,    0,
+        0,   39,   19,   19,    0,   19,    0,    0,   18,   18,
+
+       18,   18,   18,   18,   19,   19,   51,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   70,   70,    0,   40,
+       60,   60,   60,   60,   60,    0,    0,   43,   43,   51,
+       45,   51,   51,   51,   51,   51,   51,   51,   51,   51,
+       51,   51,   51,   51,   51,   51,   51,   51,   60,   60,
+        0,    0,    0,    0,    0,   70,   60,   60,   60,   60,
+       60,    0,   60,   10,    0,    0,    0,   18,   18,   18,
        19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,   69,   59,   59,   59,   59,   59,   59,
-        0,   44,   44,   44,    0,    0,   43,   43,   43,   43,
-
-       43,   43,   43,   50,   50,   50,   50,   50,   50,   50,
-       50,   50,   50,   50,   50,   50,   50,   46,   50,   47,
-       59,   59,   59,   59,    0,    0,    0,    0,    0,   69,
-       59,   59,   59,   59,    0,    0,    0,    0,    0,   18,
-       18,   19,   19,   50,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,   19,   19,   19,   19,   59,   59,   59,
-        0,    0,   44,   44,   44,    0,   43,   43,    0,   43,
-       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-        0,   27,   50,   50,   50,   50,    0,   34,   50,   50,
-       50,   50,   50,   50,   50,   48,   50,   59,   59,   59,
-
-       59,   59,    0,    0,    0,   69,   59,   59,   59,    0,
-        0,    0,   18,   18,   19,   50,   50,   19,   19,   19,
+       19,   19,   19,   19,   19,   70,   60,   60,   60,   60,
+       60,   60,    0,   44,   44,   44,    0,    0,   43,   43,
+
+       43,   43,   43,   43,   43,   51,   51,   51,   51,   51,
+       51,   51,   51,   51,   51,   51,   51,   51,   51,   47,
+       51,   51,   48,   60,   60,   60,   60,    0,    0,    0,
+        0,    0,   70,   60,   60,   60,   60,    0,    0,    0,
+        0,    0,   18,   18,   19,   19,   51,   19,   19,   19,
        19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
-       59,   59,   59,   59,   59,    0,   44,    0,   43,   43,
-       43,    0,    0,    0,   43,   43,   43,   43,   43,   43,
-       43,   43,   43,   43,   43,   43,   43,   50,   50,   50,
-       50,   50,   50,   50,   50,   50,   50,   50,   50,   52,
-       53,   54,   55,   59,    0,    0,   69,   59,   59,   59,
-        0,    0,    0,    0,    0,   19,   50,   50,   19,   19,
-       50,   19,   19,   19,   19,   19,   19,   19,   19,   19,
-
-       19,   41,   41,   41,    0,    0,   43,   43,   43,   43,
-       43,   43,   43,    0,    0,    0,    0,    0,   43,   43,
-       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,   43,    0,   36,   50,   50,   50,    0,   26,   50,
-       50,   50,    0,   35,   50,   50,    0,   25,    0,   28,
-       59,    0,    0,   69,   59,   59,   59,   41,   41,   41,
-       50,   50,   19,   50,   50,   19,   19,   19,   59,   41,
-       41,   41,   41,    0,   43,    0,   43,   43,   43,   43,
-       43,   43,   43,   43,   43,   43,   43,    0,    0,    0,
-       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-
-       43,   43,   43,   50,   50,   50,   50,   50,   50,   50,
-       50,   56,    0,    0,   69,   59,   22,   51,    0,   41,
-       41,   41,   41,   50,   50,   19,   50,   50,   19,   19,
-       19,   42,   42,   42,   42,   43,    0,    0,    0,   43,
+       60,   60,   60,    0,    0,   44,   44,   44,    0,   43,
+       43,    0,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,    0,   27,   51,   51,   51,   51,    0,
+       34,   51,   51,   51,   51,   51,   51,   51,   49,   51,
+
+       51,   60,   60,   60,   60,   60,    0,    0,    0,   70,
+       60,   60,   60,    0,    0,    0,   18,   18,   19,   51,
+       51,   19,   19,   19,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   19,   60,   60,   60,   60,   60,    0,
+       44,    0,   43,   43,   43,    0,    0,    0,   43,   43,
        43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,   43,    0,    0,    0,    0,    0,   43,   43,   43,
-       43,   43,   43,   43,   43,   50,   50,   50,    0,   37,
-       50,   50,    0,   24,    0,   29,    0,   22,   69,   69,
-       59,    0,   59,   42,   42,   42,   42,   50,   50,   50,
-       50,   59,   59,   42,   42,   42,   42,    0,    0,    0,
-
-        0,    0,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   51,   51,   51,   51,   51,   51,   51,   51,   51,
+       51,   51,   51,   51,   53,   54,   55,   56,   60,    0,
+        0,   70,   60,   60,   60,    0,    0,    0,    0,    0,
+       19,   51,   51,   19,   19,   51,   19,   19,   19,   19,
+
+       19,   19,   19,   19,   19,   19,   41,   41,   41,    0,
+        0,   43,   43,   43,   43,   43,   43,   43,    0,    0,
+        0,    0,    0,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,    0,   36,   51,
+       51,   51,    0,   26,   51,   51,   51,    0,   35,   51,
+       51,    0,   25,    0,   28,   46,   60,    0,    0,   70,
+       60,   60,   60,   41,   41,   41,   51,   51,   19,   51,
+       51,   19,   19,   19,   60,   41,   41,   41,   41,    0,
+       43,    0,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,    0,    0,    0,   43,   43,   43,   43,
+
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   51,
+       51,   51,   51,   51,   51,   51,   51,   57,    0,    0,
+       70,   60,   22,   52,    0,   41,   41,   41,   41,   51,
+       51,   19,   51,   51,   19,   19,   19,   42,   42,   42,
+       42,   43,    0,    0,    0,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,    0,    0,
+        0,    0,    0,   43,   43,   43,   43,   43,   43,   43,
+       43,   51,   51,   51,    0,   37,   51,   51,    0,   24,
+        0,   29,    0,   22,   70,   70,   60,    0,   60,   42,
+       42,   42,   42,   51,   51,   51,   51,   60,   60,   42,
+
+       42,   42,   42,    0,    0,    0,    0,    0,   43,   43,
        43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,   43,   49,    0,   32,   50,   50,   50,    0,   69,
-       69,   20,   69,   23,   22,    0,    0,    0,    0,    0,
-       22,    0,    0,    0,   42,   42,   42,   42,   50,   50,
-       50,   59,   59,   59,    0,    0,    0,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   50,    0,
+       32,   51,   51,   51,    0,   70,   70,   20,   70,   23,
+       22,    0,    0,    0,    0,    0,   22,    0,    0,    0,
+       42,   42,   42,   42,   51,   51,   51,   60,   60,   60,
+        0,    0,    0,   43,   43,   43,   43,   43,   43,   43,
        43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,   43,   43,   43,   43,    0,   30,   50,   50,   23,
-       69,    0,   22,    0,    0,    0,   50,   50,   59,   59,
-       59,   59,   59,    0,    0,    0,    0,    0,   43,   43,
-
-       43,   43,   43,   43,   43,   43,    0,   33,   50,   69,
-        0,    0,    0,    0,    0,   50,   59,   59,   59,   43,
-       43,   43,   43,   43,   43,    0,   31,   69,   69,   21,
-        0,    0,    0,   59,   59,   59,   59,   59,   43,   43,
-       43,   43,   43,    0,    0,    0,    0,    0,   41,   41,
-       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
-        0
+       43,    0,   30,   51,   51,   23,   70,    0,   22,    0,
+        0,    0,   51,   51,   60,   60,   60,   60,   60,    0,
+
+        0,    0,    0,    0,   43,   43,   43,   43,   43,   43,
+       43,   43,    0,   33,   51,   70,    0,    0,    0,    0,
+        0,   51,   60,   60,   60,   43,   43,   43,   43,   43,
+       43,    0,   31,   70,   70,   21,    0,    0,    0,   60,
+       60,   60,   60,   60,   43,   43,   43,   43,   43,    0,
+        0,    0,    0,    0,   41,   41,   41,   41,   41,   41,
+       41,   41,   41,   41,   41,   41,    0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -451,229 +451,231 @@ static yyconst int yy_meta[72] =
        21
     } ;
 
-static yyconst short int yy_base[979] =
+static yyconst short int yy_base[985] =
     {   0,
         0,   70,   72,   80,   87,  126,  178,  248,  156,  200,
-      132,  140,  319,    0, 4925, 4863, 4908, 5587, 4903, 5587,
-      388,   95, 5587, 5587, 4853, 5587,  142,  400,  198,  155,
-     4878, 5587, 5587,  460, 4863,   37,   40,  516,   62, 4868,
-     4851,   49, 4846, 4852, 4831,  575,  590,  125,  223,  613,
-       33,   45, 4815,   38, 4805,   94, 4860, 4866,  434, 4822,
-     4832,  136,    0, 5587, 4857, 5587,    0,  615,  674,  108,
-        0, 4800, 5587,   70, 5587,  104, 5587,  152, 4799,   73,
-      135, 5587,  161,  171,  651,  705,  749,  256,  245,  807,
-      857, 4807,   82,  151,  913, 4801, 4811, 4797, 4807, 4802,
-
-      960,    0,   94, 4782,  645, 4831, 4824, 4824, 5587,  266,
-      541,  204, 4813,  614,  718, 4771,  843,  947, 4767,  984,
-      997, 1035, 4793, 4804,  572,  719,  276, 4790,  175, 1080,
-     1125, 4767, 4772, 4761, 4757, 4759, 4756,  406, 4728, 4705,
-     4698, 4688, 4688,  391, 5587,  173,  339,  637, 4666, 4663,
-     4650, 4644, 4645,  397,  133,  385,  139,  349,  395,  257,
-     4711,  731, 4710, 1019, 4658, 1036,  345,    0, 4706,  296,
-     5587, 5587,  941,  393,    0, 4649,  654, 5587, 5587, 4643,
-      552, 4641, 4687,  435,  595,  425, 4689,  649,  981, 1159,
-     4637, 1165,    0, 1194, 1222, 1189, 1057, 1261, 4675, 1100,
-
-     1221,  840, 1311, 1367, 4631,    0, 4635, 4599, 4597, 4592,
-      991, 4583, 4580, 4571, 4563, 4614, 4609, 1236, 1246, 1414,
-     1281,  985, 1454, 4595, 4580, 1499,  674, 1545, 1590, 1635,
-     4573, 4557, 4558, 4537, 4548, 4534, 4541, 4538, 4550, 4549,
-     4543, 4522, 4518, 4528, 4525, 4522,  976,  398, 4489, 4487,
-     4477, 4475, 4480,  541,  411, 4483,  396,  490,  499, 1438,
-      515, 4535, 4522, 4521, 1682, 1692, 4520, 1737,    0, 4494,
-     4480, 4464, 4476, 4464, 4471, 4470, 4454, 4453, 4444, 4430,
-     4441,  625, 4407, 4470, 1782,  415,    0,    0, 1061,  658,
-     4446, 4445, 1820,  606, 4358, 4357,  702, 1387, 1833, 1435,
-
-     1110, 1879, 1926, 4356,  660, 4338, 4333,  645,  677, 4345,
-     4338, 4341, 4338, 4329, 4327, 4323, 4326,    0, 4329,    0,
-      832,  176,  419,  648, 4312, 4314, 4298, 4312, 4298,  660,
-      516, 1081,  708,  672, 1474, 4351, 4350, 4349, 1191, 1936,
-     1981,  776, 4319,  678,  820, 4327, 4320, 4323, 4320, 4300,
-     4298, 4294, 4301,  249, 4318, 4324, 4281, 2028, 2040, 2052,
-     4313, 4312, 2062, 4312, 4310, 4309, 4308,  828, 1519, 1139,
-     1565, 1162, 2075,    0, 1612, 2122, 1655, 1291, 2168, 2215,
-      884, 5587, 4283, 4288, 4289, 4282,  965, 5587, 4276, 4267,
-     4252, 4265, 4258, 4269, 4269,    0, 4251,  533,  781,  709,
-
-      980,  896, 4244, 4226, 4227,  937, 1079, 1109, 1116, 4280,
-     4279, 2227, 2237, 4244, 4143, 4139, 4121, 4125, 4095, 4069,
-     4071, 4053, 4053, 4042, 4014, 4031, 4017, 4011, 4006, 3948,
-     2282, 1035, 2322, 2334, 1667, 3979, 3978, 3977, 3966, 2344,
-     1178, 3965, 3953, 2391, 1198, 1299, 1403, 1712, 1749, 2403,
-        0, 1762, 2450, 1792, 1484, 2496, 2543, 2568, 1188, 1246,
-     1394, 1313, 1419, 1880, 1338, 1393, 1440, 1481, 1524, 3902,
-     3890, 3855, 3847,  946, 3863, 3811, 1167, 1164,  575,  983,
-     1802, 3860, 3859, 3858, 1577, 1525, 3811, 3801, 1526, 3786,
-     1510, 1547, 3753, 3736, 1615, 1616,    0,    0,    0,    0,
-
-     3712, 2625, 1853, 1722, 3737, 3734, 3687, 1908, 2665, 1956,
-     1812, 2710, 2757, 2001, 3675, 3667, 3666, 1968, 1454, 1758,
-     1893, 2017, 2095, 2135, 2769,    0, 2148, 2816, 2188, 2105,
-     2862, 2909, 1617, 5587, 2934, 1023, 1596, 1637, 5587, 1411,
-     1001, 2122, 1695, 5587, 1752, 2181, 1763, 5587, 1858, 5587,
-     1393, 3591, 3557, 1130, 2210, 1220, 1721, 3604, 3595, 2991,
-     3549, 3540, 3006, 3490, 3464, 1829,  786, 3418, 3062, 1493,
-     3101,    0, 1391, 3461, 3446, 2258, 2041, 2292, 2145, 3141,
-        0, 2304, 3154, 2364, 2268, 3199, 3246, 3449, 3378, 3258,
-     2311, 2380, 2416, 2425, 3364, 2429, 3270,    0, 2472, 3317,
-
-     2516, 2429, 3364, 3389, 1040,  893, 1915, 1836, 1498, 1981,
-     2102, 3301, 3282, 3252, 2100, 1519, 2519, 3264, 2635, 3292,
-     3282, 3258, 2646, 3206, 3179, 3459, 3182, 3161, 2007, 2008,
-        0, 3517, 2652, 2685, 1619, 3173, 3177, 3142, 3557, 3087,
-     2305, 2427, 2730, 2532, 3569,    0, 2791, 3582, 2836, 2483,
-     3627, 3674, 2882, 3098, 3077, 3020, 2697, 2746, 2898, 3074,
-     1273, 1309, 3686,    0, 2848, 1837, 2171, 1615, 2170, 5587,
-     1399, 1871, 2216, 5587, 2264, 5587, 2834, 2368, 1742, 1858,
-     2280, 2817, 3088, 2802, 2750, 3698, 2742, 2430, 2548, 2523,
-     2452, 3708, 1976, 3748,    0, 2192, 2318, 3085, 2743, 2723,
-
-     2705, 3113, 2686, 2570, 2666, 2792, 3126, 3006, 3788,    0,
-     3176, 3801, 3219, 3119, 3846, 3893, 2509, 2482, 3904, 3235,
-     2442, 1772, 2403, 2736, 5587, 2794, 1916, 1979, 2329, 2288,
-     2173, 5587, 2261, 2212, 3199, 3304, 3309, 3314, 2182, 2934,
-     1982, 3389, 3527, 1994, 1948, 1908, 3448, 1902, 2737, 2889,
-     3180, 3916, 3928, 3940, 1873, 1867, 3952, 1808, 1740, 3085,
-     3155, 3537, 3298, 3964,    0, 3604, 3977, 3647, 3547, 4024,
-     1731, 1704, 1674, 3658, 1667, 2886, 5587, 2888, 2080, 5587,
-     2219, 3718, 3728, 1630, 1585, 4036, 2914, 3296, 4048, 2320,
-     4060, 4072, 3763, 3769, 1578, 1492, 1467, 3615, 1368, 1248,
-
-     3330, 1233, 1220, 4084,    0, 2368, 3033, 5587, 3297, 2325,
-     3821, 1183, 1094, 1016, 3833, 3126, 4096, 4108, 4120, 3866,
-     3997, 4130,  924,    0,  830, 3181, 5587,  754, 2492, 5587,
-      694,  586, 4142, 4154, 3100, 4166, 4178, 3878, 5587, 4188,
-     4198, 3738, 5587, 4208,  571,  286,  244, 4009, 4218, 4256,
-     4294, 4228, 4238, 4266,   55, 4332, 4248, 5587, 4304, 3779,
-     5587, 4385, 4406, 4427, 4448, 4469, 4490, 4511, 4532, 4553,
-     4562, 2563, 4582, 4603, 2523, 4624, 4645, 4666, 4687, 4708,
-     4729, 4750, 4771, 2567, 4792, 4801, 4809, 4818, 4838, 4859,
-     4880, 2794, 4901, 4922, 4943, 4964, 4985, 4994, 5013, 5022,
-
-     5031, 2466, 2897, 5039, 5047, 5055, 5064, 5072, 5079, 5087,
-     5095, 5104, 5114, 2898, 3084, 5122, 5130, 5138, 3085, 3187,
-     5147, 5157, 5177, 3234, 5186, 5194, 3235, 5203, 5213, 5233,
-     2681, 2785, 5242, 5254, 5263, 5273, 3238, 3342, 5282, 5292,
-     5301, 5321, 2832, 5330, 5342, 3347, 3348, 5351, 5361, 3352,
-     5370, 5380, 5400, 5421, 5442, 3353, 3357, 5462, 3358, 5469,
-     5479, 2926, 3006, 5488, 3559, 5508, 3460, 3598, 5517, 5527,
-     3615, 3643, 5535, 5545, 5565, 4279, 3763, 3817
+      132,  140,  319,    0, 4881, 4827, 4873, 5615, 4868, 5615,
+      388,   95, 5615, 5615, 4816, 5615,  142,  400,  198,  155,
+     4842, 5615, 5615,  460, 4825,   37,   40,  516,   62, 4834,
+     4820,   49, 4818, 4822,   58,  575,  590,  125,  223,  613,
+       33,   45, 4788,   38, 4785,  121, 4839, 4846,  434, 4804,
+     4816,  136,    0, 5615, 4840, 5615,    0,  615,  674,  152,
+        0, 4782, 5615,  104, 5615,  112, 5615,  161, 4781,   73,
+      173, 5615,  189,  204,  651,  705,  749,  256,  245,  807,
+      857, 4789,   57,  157,  913, 4783, 4793, 4779, 4772, 4737,
+
+      960,    0,  128, 4713,  645, 4761, 4756, 4756, 5615,  266,
+      541,  614, 4737,  617,  718, 4692,  843,  947, 4690,  984,
+      997, 1035, 4716, 4727,  572,  719,  276, 4714,   96, 1080,
+     1125, 4699, 4704, 4690, 4683, 4686, 4682,  406, 4673, 4680,
+     4677, 4652, 4656, 4623,  391, 5615,  133,  171,  992, 4596,
+     4599, 4590, 4584, 4585,  397,  349,  385,  395,  383,  339,
+      154, 4647,  731, 4643, 1034, 4587, 1160,  547,    0, 4633,
+      256, 5615, 5615,  941,  267,    0, 4581,  654, 5615, 5615,
+     4580,  672, 4572, 4619,  401,  595,  296, 4617,  663,  676,
+     1187, 4563, 1193,    0, 1222, 1250, 1021, 1055, 1289, 4599,
+
+     1100, 1219,  840, 1339, 1395, 4572,    0, 4575, 4568, 4571,
+     4567,  963, 4550, 4548, 4535, 4529, 4581, 4580, 1249, 1264,
+     1442, 1274, 1065, 1482, 4561, 4548, 1527,  528, 1573, 1618,
+     1663, 4537, 4527, 4528, 4511, 4524, 4512, 4519, 4511, 4518,
+     4516, 4510, 4497, 4493, 4507, 4478, 4477, 4472, 1108,  384,
+     4438, 4443, 4433, 4435, 4441,  541,  586, 4444,  499,  342,
+      500, 1206,  633, 4410, 4397, 4396, 1710, 1720, 4395, 1765,
+        0, 4376, 4367, 4352, 4365, 4353, 4360, 4359, 4371, 4370,
+     4365, 4352, 4363,  447, 4329, 4392, 1810,  214,    0,    0,
+     1108,  529, 4368, 4367, 1848,  411, 4366, 4365,  702, 1309,
+
+     1861, 1415, 1157, 1907, 1954, 4364,  620, 4346, 4341,  641,
+      681, 4353, 4346, 4338, 4335, 4326, 4324, 4320, 4323,    0,
+     4326, 4324,    0,  832,  975,  668,  942, 4308, 4310, 4294,
+     4308, 4294,  564,  532, 1081,  419,  949, 1452, 4347, 4346,
+     4345, 1321, 1964, 2009,  776, 4315,  665,  820, 4323, 4316,
+     4318, 4315, 4306, 4303, 4299, 4294, 1013, 4311, 4317, 4274,
+     2056, 2068, 2080, 4306, 4305, 2090, 4305, 4272, 4195, 4183,
+      828, 1462, 1183, 1502, 1187, 2103,    0, 1549, 2150, 1593,
+     1425, 2196, 2243,  884, 5615, 4147, 4141, 4121, 4103,  965,
+     5615, 4107, 4087, 4061, 4063, 4033, 4033, 4020,    0, 4003,
+
+     4003,  635,  709,  704,  988,  896, 3980, 3962, 3963, 1150,
+      996,  982, 1152, 4017, 4006, 2255, 2265, 3981, 3945, 3941,
+     3923, 3904, 3888, 3867, 3863, 3856, 3867, 3867, 3834, 3856,
+     3836, 3837, 3838, 3786, 2310,  610, 2350, 2362, 1605, 3805,
+     3802, 3784, 3777, 2372, 1164, 3777, 3774, 2419, 1178, 1631,
+     1640, 1683, 1645, 2431,    0, 1742, 2478, 1785, 1472, 2524,
+     2571, 2596, 1509, 1274, 1062, 1227, 1529, 1810, 1341, 1506,
+     1723, 1366, 1421, 1665, 3728, 3720, 3688, 3664,  648, 3679,
+     3644,  947, 1192,  592,  781, 1821, 3669, 3649, 3624, 1560,
+     1422, 3581, 3565, 1507, 3557, 1173, 1508, 3541, 3548, 1666,
+
+     1688,    0,    0,    0,    0, 3519, 2653, 1881, 1753, 3534,
+     3514, 3490, 1927, 2693, 1984, 1797, 2738, 2785, 2029, 3501,
+     3486, 3477, 1838, 1646, 1834, 1836, 1943, 2123, 2045, 2797,
+        0, 2172, 2844, 2216, 1891, 2890, 2937, 1765, 5615, 2962,
+     1214,  992, 1887, 5615,  994, 1125, 2156, 1888, 5615, 1631,
+     2209, 1933, 5615, 1934, 5615, 3382, 1101, 3343, 3303, 1216,
+     2238,  708, 1283, 3357, 3334, 3019, 3297, 3291, 3034, 3238,
+     3207, 1714,  786, 3184, 3090, 1208, 3129,    0, 1931, 3210,
+     3158, 2286, 2069, 2320, 2332, 3169,    0, 2333, 3182, 2392,
+     1994, 3227, 3274, 3166, 3160, 3286, 2408, 2443, 2445, 2453,
+
+     3124, 2458, 3298,    0, 2500, 3345, 2544, 2133, 3392, 3417,
+      893, 1253, 2129, 1621, 1014, 2130, 2175, 3079, 2999, 2978,
+     1598, 1262, 2547, 2993, 2663, 2952, 2951, 2902, 2297, 2869,
+     2825, 3487, 2828, 2797, 1990, 1991,    0, 3545, 2673, 2713,
+     1512, 2766, 2774, 2770, 3585, 2739, 2334, 2351, 2758, 2456,
+     3597,    0, 2819, 3610, 2864, 2511, 3655, 3702, 2910, 2726,
+     2686, 2610, 2725, 2459, 2774, 2926, 1337, 1648, 3714,    0,
+     2876, 1448, 2197, 1524, 2035, 5615, 1661, 1667, 2036, 5615,
+     2223, 5615, 2553, 2396, 1790, 2358, 2453, 2845, 3114, 2587,
+     2538, 3726, 2685, 2268, 2576, 2551, 2479, 3736, 1075, 3776,
+
+        0, 2033, 2143, 3105, 2466, 2412, 2406, 3117, 2373, 2331,
+     2560, 2694, 3139, 2820, 3816,    0, 3152, 3829, 3202, 3212,
+     3874, 3921, 2304, 2235, 3932, 3150, 2228, 1976, 2014, 2481,
+     5615, 2822, 1666, 1987, 1949, 1958, 2200, 5615, 2127, 1881,
+     3272, 3332, 3337, 3342, 1902, 2962, 1835, 3417, 3247, 1847,
+     1833, 1805, 3476, 1797, 2764, 2917, 3208, 3944, 3956, 3968,
+     1780, 1752, 3980, 1722, 1691, 3034, 3183, 3555, 3275, 3992,
+        0, 3567, 4005, 3630, 3640, 4052, 1632, 1612, 1605, 3676,
+     1587, 2765, 5615, 2916, 2195, 5615, 2290, 3682, 3746, 1522,
+     1443, 4064, 2942, 3324, 4076, 2348, 4088, 4100, 3758, 3796,
+
+     1435, 1408, 1302, 3766, 1199, 1191, 3326, 1156, 1094, 4112,
+        0, 2453, 3061, 5615, 3325, 2353, 3849, 1031,  973,  927,
+     3788, 3115, 4124, 4136, 4148, 3894, 4025, 4158,  777,    0,
+      556, 3209, 5615,  542, 2416, 5615,  455,  382, 4170, 4182,
+     2733, 4194, 4206, 3906, 5615, 4216, 4226, 3806, 5615, 4236,
+      286,  194,  187, 3861, 4246, 4284, 4322, 4256, 4266, 4294,
+       53, 4360, 4038, 5615, 4304, 4276, 5615, 4413, 4434, 4455,
+     4476, 4497, 4518, 4539, 4560, 4581, 4590, 2187, 4610, 4631,
+     2551, 4652, 4673, 4694, 4715, 4736, 4757, 4778, 4799, 2235,
+     4820, 4829, 4837, 4846, 4866, 4887, 4908, 2822, 4929, 4950,
+
+     4971, 4992, 5013, 5022, 5041, 5050, 5059, 2774, 2925, 5067,
+     5075, 5083, 5092, 5100, 5107, 5115, 5123, 5132, 5142, 2926,
+     3129, 5150, 5158, 5166, 3164, 3168, 5175, 5185, 5205, 3262,
+     5214, 5222, 3268, 5231, 5241, 5261, 2512, 2592, 5270, 5282,
+     5291, 5301, 3370, 3371, 5310, 5320, 5329, 5349, 2692, 5358,
+     5370, 3375, 3376, 5379, 5389, 3380, 5398, 5408, 5428, 5449,
+     5470, 3381, 3385, 5490, 3386, 5497, 5507, 2709, 2813, 5516,
+     3579, 5536, 3488, 3583, 5545, 5555, 3584, 3626, 5563, 5573,
+     5593, 4335, 3651, 3671
     } ;
 
-static yyconst short int yy_def[979] =
+static yyconst short int yy_def[985] =
     {   0,
-      861,    1,    1,    1,  862,  862,  863,  863,  864,  864,
-      865,  865,  861,   13,  861,  866,  861,  861,  861,  861,
-      867,  868,  861,  861,  869,  861,  870,  866,   28,   28,
-      871,  861,  861,  861,   34,   34,   34,   34,   38,   38,
-       38,   38,   38,   38,   38,  866,   28,  866,  861,  867,
-       34,   34,   38,   38,   38,  861,  872,  861,  873,   38,
-       38,  866,  874,  861,  874,  861,  874,  861,  867,  861,
-      875,  876,  861,  876,  861,  876,  861,  877,  878,  878,
-      878,  861,  861,  879,  880,  881,  861,   87,   87,   87,
-      861,   91,   91,   91,   91,   95,   95,   95,   95,   95,
-
-       87,   90,   90,  866,  866,  861,  861,  882,  861,  883,
-      861,  868,  884,  879,  868,  869,  869,  870,  885,  866,
-      866,   28,  886,  122,  122,  122,  122,  887,  888,   38,
+      867,    1,    1,    1,  868,  868,  869,  869,  870,  870,
+      871,  871,  867,   13,  867,  872,  867,  867,  867,  867,
+      873,  874,  867,  867,  875,  867,  876,  872,   28,   28,
+      877,  867,  867,  867,   34,   34,   34,   34,   38,   38,
+       38,   38,   38,   38,   38,  872,   28,  872,  867,  873,
+       34,   34,   38,   38,   38,  867,  878,  867,  879,   38,
+       38,  872,  880,  867,  880,  867,  880,  867,  873,  867,
+      881,  882,  867,  882,  867,  882,  867,  883,  884,  884,
+      884,  867,  867,  885,  886,  887,  867,   87,   87,   87,
+      867,   91,   91,   91,   91,   95,   95,   95,   95,   95,
+
+       87,   90,   90,  872,  872,  867,  867,  888,  867,  889,
+      867,  874,  890,  885,  874,  875,  875,  876,  891,  872,
+      872,   28,  892,  122,  122,  122,  122,  893,  894,   38,
       130,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  866,  861,  866,  866,  861,  861,  861,
-      861,  861,  861,  882,  866,  122,  866,  866,  866,  861,
-      861,  861,  861,  889,  890,  866,  866,  891,  891,  861,
-      861,  861,  883,  861,  892,  893,  893,  861,  861,  893,
-      893,  894,  861,  894,  894,  861,  861,  879,  879,  879,
-      895,  896,   90,  895,  897,  861,  861,   87,  198,  198,
-
-      198,  198,  861,  203,  204,  898,  204,  204,  204,  204,
-      204,  204,  204,   90,   90,  882,  899,  861,  861,  866,
-      220,  220,  122,  223,  900,  861,  901,  861,  131,  229,
-      230,  230,  230,  230,  230,  230,  230,  230,  230,  230,
-      230,  230,  230,  230,  230,  230,  866,  866,  861,  861,
-      861,  861,  861,  882,  866,  223,  866,  866,  866,  861,
-      866,  861,  902,  903,  861,   90,  266,  203,  204,  204,
-      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
-      204,   90,   90,  899,  866,  866,  220,  220,  220,  866,
-      904,  905,  905,  293,  906,  905,  907,  228,  861,  299,
-
-      299,  861,  299,  230,  230,  230,  230,  230,  230,  230,
-      230,  230,  230,  230,  230,  230,  230,  230,  230,  230,
-      866,  866,  866,  866,  861,  861,  861,  861,  861,  882,
-      866,  866,  866,  866,  861,  861,  902,  902,  861,  266,
-      203,  204,  204,  908,  204,  204,  204,  204,  204,  204,
-      204,  204,  204,   90,   90,   90,   90,  220,  220,  220,
-      861,  909,  909,  363,  909,  910,  911,  912,  861,  913,
-      302,  913,  861,  373,  913,  861,  376,  376,  861,  376,
-      861,  861,  230,  230,  230,  230,  861,  861,  230,  230,
-      230,  230,  230,  230,  230,  230,  230,  866,  866,  866,
-
-      866,  866,  861,  861,  861,  882,  866,  866,  866,  914,
-      915,  861,   90,  341,  204,  908,  908,  204,  204,  204,
-      204,  204,  204,  204,  204,   90,   90,   90,   90,   90,
-      866,  866,  220,  220,  866,  916,  916,  917,  918,  861,
-      861,  919,  920,  861,  921,  921,  922,  379,  922,  861,
-      450,  922,  861,  453,  453,  861,  453,  861,  458,  458,
-      458,  458,  458,  458,  458,  458,  458,  458,  458,  866,
-      866,  866,  866,  866,  861,  861,  923,  866,  866,  866,
-      861,  861,  924,  924,  861,  204,  908,  908,  204,  204,
-      908,  204,  204,  204,  204,  204,   90,   90,   90,   90,
-
-       90,  866,  502,  502,  861,  925,  926,  440,  861,  509,
-      509,  861,  509,  861,  861,  927,  927,  861,  861,  928,
-      928,  929,  456,  929,  861,  525,  929,  861,  528,  528,
-      861,  528,  861,  861,  861,  535,  535,  861,  861,  535,
-      535,  535,  861,  861,  535,  535,  861,  861,  861,  861,
-      866,  861,  861,  930,  866,  866,  866,  931,  932,  861,
-      933,  933,  861,  933,  933,  563,  563,  934,  866,  866,
-      866,  571,  571,  861,  935,  861,  936,  512,  936,  936,
-      580,  936,  861,  583,  583,  861,  583,  937,  938,  861,
-      861,  939,  939,  940,  941,  940,  861,  597,  940,  861,
-
-      600,  600,  600,  861,  604,  604,  604,  604,  604,  604,
-      604,  866,  861,  861,  942,  866,  866,  866,  861,  861,
-      943,  943,  861,  944,  944,  861,  944,  944,  626,  626,
-      945,  866,  632,  632,  632,  861,  946,  947,  861,  948,
-      948,  949,  586,  949,  949,  645,  949,  861,  648,  648,
-      861,  648,  861,  861,  950,  950,  861,  861,  951,  951,
-      952,  952,  952,  663,  952,  604,  604,  604,  861,  861,
-      604,  604,  861,  861,  861,  861,  861,  861,  953,  942,
-      866,  954,  955,  956,  957,  861,  956,  958,  958,  958,
-      958,  866,  866,  866,  694,  694,  866,  861,  861,  959,
-
-      959,  861,  861,  960,  960,  961,  651,  961,  961,  709,
-      961,  861,  712,  712,  861,  712,  962,  963,  861,  861,
-      964,  964,  604,  861,  861,  604,  604,  604,  861,  953,
-      953,  861,  942,  866,  954,  954,  954,  954,  965,  954,
-      966,  966,  861,  861,  956,  956,  861,  861,  958,  958,
-      958,  694,  694,  694,  967,  968,  861,  861,  969,  969,
-      970,  715,  970,  970,  764,  970,  861,  767,  767,  767,
-      861,  962,  962,  861,  861,  861,  861,  604,  604,  861,
-      942,  861,  861,  971,  972,  861,  958,  958,  694,  866,
-      694,  694,  866,  861,  861,  967,  967,  861,  861,  973,
-
-      973,  974,  974,  974,  804,  804,  861,  861,  604,  975,
-      861,  861,  971,  971,  861,  958,  694,  694,  694,  861,
-      861,  861,  861,  976,  976,  861,  861,  975,  975,  861,
-      977,  978,  861,  694,  866,  694,  694,  866,  861,  861,
-      861,  861,  861,  861,  861,  977,  977,  861,  866,  866,
-      866,  861,  861,  861,  866,  866,  866,  861,  861,  861,
-        0,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861
+      131,  131,  131,  131,  872,  867,  872,  872,  867,  867,
+      867,  867,  867,  867,  888,  872,  122,  872,  872,  872,
+      867,  867,  867,  867,  895,  896,  872,  872,  897,  897,
+      867,  867,  867,  889,  867,  898,  899,  899,  867,  867,
+      899,  899,  900,  867,  900,  900,  867,  867,  885,  885,
+      885,  901,  902,   90,  901,  903,  867,  867,   87,  199,
+
+      199,  199,  199,  867,  204,  205,  904,  205,  205,  205,
+      205,  205,  205,  205,   90,   90,  888,  905,  867,  867,
+      872,  221,  221,  122,  224,  906,  867,  907,  867,  131,
+      230,  231,  231,  231,  231,  231,  231,  231,  231,  231,
+      231,  231,  231,  231,  231,  231,  231,  231,  872,  872,
+      867,  867,  867,  867,  867,  888,  872,  224,  872,  872,
+      872,  867,  872,  867,  908,  909,  867,   90,  268,  204,
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
+      205,  205,  205,   90,   90,  905,  872,  872,  221,  221,
+      221,  872,  910,  911,  911,  295,  912,  911,  913,  229,
+
+      867,  301,  301,  867,  301,  231,  231,  231,  231,  231,
+      231,  231,  231,  231,  231,  231,  231,  231,  231,  231,
+      231,  231,  231,  872,  872,  872,  872,  867,  867,  867,
+      867,  867,  888,  872,  872,  872,  872,  867,  867,  908,
+      908,  867,  268,  204,  205,  205,  914,  205,  205,  205,
+      205,  205,  205,  205,  205,  205,   90,   90,   90,   90,
+      221,  221,  221,  867,  915,  915,  366,  915,  916,  917,
+      918,  867,  919,  304,  919,  867,  376,  919,  867,  379,
+      379,  867,  379,  867,  867,  231,  231,  231,  231,  867,
+      867,  231,  231,  231,  231,  231,  231,  231,  231,  231,
+
+      231,  872,  872,  872,  872,  872,  867,  867,  867,  888,
+      872,  872,  872,  920,  921,  867,   90,  344,  205,  914,
+      914,  205,  205,  205,  205,  205,  205,  205,  205,   90,
+       90,   90,   90,   90,  872,  872,  221,  221,  872,  922,
+      922,  923,  924,  867,  867,  925,  926,  867,  927,  927,
+      928,  382,  928,  867,  454,  928,  867,  457,  457,  867,
+      457,  867,  462,  462,  462,  462,  462,  462,  462,  462,
+      462,  462,  462,  462,  872,  872,  872,  872,  872,  867,
+      867,  929,  872,  872,  872,  867,  867,  930,  930,  867,
+      205,  914,  914,  205,  205,  914,  205,  205,  205,  205,
+
+      205,   90,   90,   90,   90,   90,  872,  507,  507,  867,
+      931,  932,  444,  867,  514,  514,  867,  514,  867,  867,
+      933,  933,  867,  867,  934,  934,  935,  460,  935,  867,
+      530,  935,  867,  533,  533,  867,  533,  867,  867,  867,
+      540,  540,  867,  867,  540,  540,  540,  867,  867,  540,
+      540,  867,  867,  867,  867,  540,  872,  867,  867,  936,
+      872,  872,  872,  937,  938,  867,  939,  939,  867,  939,
+      939,  569,  569,  940,  872,  872,  872,  577,  577,  867,
+      941,  867,  942,  517,  942,  942,  586,  942,  867,  589,
+      589,  867,  589,  943,  944,  867,  867,  945,  945,  946,
+
+      947,  946,  867,  603,  946,  867,  606,  606,  606,  867,
+      610,  610,  610,  610,  610,  610,  610,  872,  867,  867,
+      948,  872,  872,  872,  867,  867,  949,  949,  867,  950,
+      950,  867,  950,  950,  632,  632,  951,  872,  638,  638,
+      638,  867,  952,  953,  867,  954,  954,  955,  592,  955,
+      955,  651,  955,  867,  654,  654,  867,  654,  867,  867,
+      956,  956,  867,  867,  957,  957,  958,  958,  958,  669,
+      958,  610,  610,  610,  867,  867,  610,  610,  867,  867,
+      867,  867,  867,  867,  959,  948,  872,  960,  961,  962,
+      963,  867,  962,  964,  964,  964,  964,  872,  872,  872,
+
+      700,  700,  872,  867,  867,  965,  965,  867,  867,  966,
+      966,  967,  657,  967,  967,  715,  967,  867,  718,  718,
+      867,  718,  968,  969,  867,  867,  970,  970,  610,  867,
+      867,  610,  610,  610,  867,  959,  959,  867,  948,  872,
+      960,  960,  960,  960,  971,  960,  972,  972,  867,  867,
+      962,  962,  867,  867,  964,  964,  964,  700,  700,  700,
+      973,  974,  867,  867,  975,  975,  976,  721,  976,  976,
+      770,  976,  867,  773,  773,  773,  867,  968,  968,  867,
+      867,  867,  867,  610,  610,  867,  948,  867,  867,  977,
+      978,  867,  964,  964,  700,  872,  700,  700,  872,  867,
+
+      867,  973,  973,  867,  867,  979,  979,  980,  980,  980,
+      810,  810,  867,  867,  610,  981,  867,  867,  977,  977,
+      867,  964,  700,  700,  700,  867,  867,  867,  867,  982,
+      982,  867,  867,  981,  981,  867,  983,  984,  867,  700,
+      872,  700,  700,  872,  867,  867,  867,  867,  867,  867,
+      867,  983,  983,  867,  872,  872,  872,  867,  867,  867,
+      872,  872,  872,  867,  867,  867,    0,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867
     } ;
 
-static yyconst short int yy_nxt[5659] =
+static yyconst short int yy_nxt[5687] =
     {   0,
        16,   17,   18,   19,   20,   21,   22,   23,   24,   16,
        25,   26,   16,   16,   27,   28,   29,   30,   28,   28,
@@ -682,31 +684,31 @@ static yyconst short int yy_nxt[5659] =
        40,   41,   38,   42,   43,   44,   45,   38,   38,   38,
        38,   38,   46,   16,   47,   47,   47,   47,   47,   47,
        16,   16,   16,   16,   16,   16,   16,   16,   48,   16,
-       16,   49,  131,   56,  184,   50,  131,   57,  139,  131,
+       16,   49,  131,   56,  185,   50,  131,   57,  139,  131,
       141,   56,  134,   58,  131,   57,   59,  133,   17,   64,
-       65,   58,   66,  140,   59,  160,  178,  155,   66,  135,
+       65,   58,   66,  140,   59,  143,  205,  156,   66,  135,
 
-      113,   51,   52,  156,  136,  161,   53,  105,  158,  174,
-      145,   60,   66,   67,   54,   61,   38,   55,   38,   60,
-      114,  204,  177,   61,   38,  183,   38,   17,   64,   65,
-      179,   66,  207,   80,   18,   81,   82,   66,  185,   68,
+      113,   51,   52,  157,  136,  105,   53,  208,  159,  144,
+      227,   60,   66,   67,   54,   61,   38,   55,   38,   60,
+      114,  229,  161,   61,   38,  184,   38,   17,   64,   65,
+      179,   66,  162,   80,   18,   81,   82,   66,  180,   68,
        62,   80,   18,   81,   82,  119,  119,  115,   62,  119,
-      119,   66,   67,  181,  145,  214,  177,   17,   18,   19,
-       73,   69,  186,  187,  215,  182,   74,   75,   76,  119,
-      126,  126,  126,  126,  126,  127,  113,  105,   68,   17,
-       18,   19,   77,   69,   83,  105,  146,  183,  105,  226,
-      204,  105,   83,  208,  120,  147,  189,  146,  255,  400,
+      119,   66,   67,  175,  146,  161,  178,   17,   18,   19,
+       73,   69,  182,  146,  178,  162,   74,   75,   76,  119,
+      126,  126,  126,  126,  126,  127,  186,  105,   68,   17,
+       18,   19,   77,   69,   83,  105,  147,  249,  105,  215,
+      187,  188,   83,  183,  120,  148,  205,  147,  216,  209,
 
-      228,   17,   18,   19,   73,   69,  167,  257,   78,  861,
+      850,   17,   18,   19,   73,   69,  168,  850,   78,  113,
        74,   75,   76,  125,  125,  125,  125,  125,  125,  125,
-      125,  125,  125,  190,  148,  105,   77,  247,  105,  861,
+      125,  125,  125,  105,  149,  184,   77,  287,  250,  190,
        70,   71,   71,   71,   71,   71,   71,   71,   71,   71,
        71,   71,   71,   71,   71,   71,   71,   71,   71,   17,
-       18,   19,   78,   69,  149,  150,  115,  844,  160,  151,
-      201,  201,  201,  201,  201,  202,  426,  152,  161,  427,
-      153,  200,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  111,  111,  111,  111,  111,  111,  111,  111,  111,
-      111,  224,  224,  224,  224,  224,  224,  174,  145,  844,
+       18,   19,   78,   69,  150,  151,  191,  175,  146,  152,
+      202,  202,  202,  202,  202,  203,  105,  153,  175,  146,
+      154,  201,  201,  201,  201,  201,  201,  201,  201,  201,
+      201,  111,  111,  111,  111,  111,  111,  111,  111,  111,
+      111,  225,  225,  225,  225,  225,  225,  187,  188,  850,
 
        70,   71,   71,   71,   71,   71,   71,   71,   71,   71,
        71,   71,   71,   71,   71,   71,   71,   71,   71,   33,
@@ -717,589 +719,592 @@ static yyconst short int yy_nxt[5659] =
        98,   95,   99,   95,  100,   95,   95,   95,   95,   95,
        95,   70,   33,  101,  101,  101,  101,  101,  101,  102,
       102,  102,  102,  102,  102,  102,  102,  103,  102,  102,
-      109,  105,  174,  145,  174,  145,  248,  105,  104,  109,
-
-      110,  105,  261,  111,  111,  111,  111,  111,  111,  111,
-      111,  111,  111,  121,  258,  122,  122,  122,  122,  122,
-      122,  122,  122,  122,  122,  123,  186,  187,  285,  124,
-      124,  124,  124,  124,  124,  401,  184,  165,  165,  236,
-      237,  165,  165,  105,  256,  238,  239,  105,  105,  240,
-      105,  241,  105,  259,  124,  124,  124,  124,  124,  124,
-      104,  165,  254,  105,  324,  331,  104,  105,  331,  104,
+      109,  105,  175,  146,  105,  850,  336,  261,  104,  109,
+
+      110,  105,  185,  111,  111,  111,  111,  111,  111,  111,
+      111,  111,  111,  121,  257,  122,  122,  122,  122,  122,
+      122,  122,  122,  122,  122,  123,  368,  368,  368,  124,
+      124,  124,  124,  124,  124,  105,  105,  166,  166,  237,
+      238,  166,  166,  105,  258,  239,  240,  105,  260,  241,
+      327,  242,  105,  184,  124,  124,  124,  124,  124,  124,
+      104,  166,  256,  259,  357,  358,  104,  359,  850,  104,
       104,  105,  104,  104,  104,  130,  130,  130,  130,  130,
-      130,  130,  130,  130,  130,  123,  166,  183,  104,  130,
+      130,  130,  130,  130,  130,  123,  167,  334,  104,  130,
       130,  130,  130,  130,  130,  131,  131,  131,  131,  132,
 
       131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
       131,  131,  105,  131,  124,  124,  124,  124,  124,  124,
       104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
       104,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  861,  105,  109,  333,  131,  131,  131,  131,  131,
-      131,  105,  470,  174,  145,  131,  111,  111,  111,  111,
-      111,  111,  111,  111,  111,  111,  331,  105,  105,  407,
-      104,  104,  104,  104,  104,  104,  144,  145,  104,  104,
-      104,  334,  104,  104,  844,  105,  104,  224,  224,  224,
-      224,  224,  224,  224,  224,  224,  224,  330,  185,  844,
-
-      104,  104,  104,  104,  177,  124,  124,  124,  124,  124,
-      124,  124,  124,  124,  124,  109,  170,  145,  171,  113,
-      172,  365,  365,  365,  171,  110,  172,  105,  111,  111,
-      111,  111,  111,  111,  111,  111,  111,  111,  148,  861,
-      172,  172,  354,  355,  556,  356,  104,  183,  104,  104,
-      104,  191,  104,  104,  861,  176,  104,  191,  176,  176,
-      191,  381,  109,  191,  191,  176,  190,  172,  149,  150,
-      104,  104,  104,  151,  861,  154,  109,  193,  387,  191,
-      176,  152,  385,  123,  153,  382,  173,  386,  226,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  298,
-
-      105,  190,  388,  194,  191,  119,  402,  844,  119,  119,
-      105,  119,  119,  119,  119,  416,  226,  119,  119,  112,
-      417,  112,  112,  406,  105,  112,  112,  298,  472,  112,
-      409,  193,  119,  119,  224,  224,  224,  224,  224,  224,
-      224,  224,  224,  224,  112,  112,  111,  111,  111,  111,
-      111,  111,  111,  111,  111,  111,  830,  196,  119,  193,
-      105,  105,  197,  193,  198,  198,  198,  198,  198,  198,
-      198,  198,  198,  198,  123,  193,  331,  381,  199,  199,
-      199,  199,  199,  199,  193,  193,  193,  193,  193,  193,
-      193,  193,  193,  193,  193,  193,  193,  193,  193,  193,
-
-      193,  382,  471,  199,  199,  199,  199,  199,  199,  193,
-      193,  193,  193,  193,  193,  193,  193,  193,  193,  193,
-      861,  387,  193,  193,  193,  193,  193,  193,  193,  193,
-      193,  193,  861,  105,  630,  204,  193,  193,  193,  193,
-      193,  193,  226,  576,  116,  388,  116,  116,  116,  398,
-      116,  116,  399,  298,  116,  267,  267,  267,  267,  267,
-      267,  193,  193,  193,  193,  193,  193,  193,  116,  116,
-      116,  193,  203,  203,  203,  203,  203,  203,  203,  203,
-      203,  203,  123,  193,  105,  381,  203,  203,  203,  203,
-      203,  203,  204,  204,  204,  204,  205,  204,  204,  204,
-
-      204,  204,  204,  204,  204,  204,  204,  204,  204,  382,
-      206,  199,  199,  199,  199,  199,  199,  193,  193,  193,
-      193,  193,  193,  193,  193,  193,  193,  193,  204,  204,
-      204,  204,  204,  204,  204,  204,  204,  204,  861,  109,
-      668,  131,  204,  204,  204,  204,  204,  204,  105,  762,
-      119,  119,  204,  474,  119,  119,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  387,  193,  193,  193,
-      193,  193,  193,  861,  119,  199,  199,  199,  199,  199,
-      199,  199,  199,  199,  199,  118,  113,  104,  104,  118,
-      388,  104,  104,  321,  322,  118,  323,  473,  105,  120,
-
-      288,  288,  288,  288,  288,  289,  861,  477,  551,  118,
-      118,  104,  220,  221,  222,  220,  220,  220,  220,  220,
-      220,  220,  165,  165,  274,  275,  165,  165,  105,  811,
-      276,  277,  105,  190,  278,  105,  279,  164,  131,  104,
-      104,  164,  608,  104,  104,  557,  165,  164,  431,  105,
-      223,  223,  223,  223,  223,  223,  223,  223,  223,  223,
-      131,  164,  164,  104,  223,  223,  223,  223,  223,  223,
-      605,  166,  263,  264,  265,  263,  263,  263,  263,  263,
-      263,  263,  104,  104,  104,  104,  667,  105,  131,  223,
-      223,  223,  223,  223,  223,  229,  229,  229,  229,  229,
-
-      229,  229,  229,  229,  229,  123,  123,  811,  478,  229,
-      229,  229,  229,  229,  229,  267,  267,  267,  267,  267,
-      267,  267,  267,  267,  267,  374,  374,  374,  374,  374,
-      375,  105,  109,  105,  223,  223,  223,  223,  223,  223,
-      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      861,  408,  369,  226,  131,  131,  131,  131,  131,  131,
-      188,  105,  188,  188,  371,  191,  188,  188,  105,  109,
-      188,  191,  479,  480,  191,  861,  226,  191,  191,  104,
-      104,  104,  104,  104,  104,  188,  188,  371,  615,  861,
-      119,  193,  226,  191,  119,  191,  811,  191,  191,  191,
-
-      119,  191,  191,  298,  335,  191,  336,  336,  336,  336,
-      336,  336,  226,  861,  119,  119,  105,  194,  191,  191,
-      191,  191,  119,  371,  554,  119,  119,  555,  119,  119,
-      119,  119,  535,  861,  119,  119,  267,  267,  267,  267,
-      267,  267,  267,  267,  267,  267,  576,  861,  193,  119,
-      119,  219,  219,  219,  219,  219,  219,  219,  219,  219,
-      219,  219,  219,  219,  219,  219,  219,  219,  219,  219,
-      219,  861,  105,  762,  196,  119,  266,  266,  266,  266,
-      266,  266,  266,  266,  266,  266,  369,  226,  617,  536,
-      266,  266,  266,  266,  266,  266,  287,  287,  287,  287,
-
-      287,  287,  287,  287,  287,  287,  451,  451,  451,  451,
-      451,  452,  369,  226,  538,  266,  266,  266,  266,  266,
-      266,  193,  861,  226,  371,  193,  268,  268,  268,  268,
-      268,  268,  268,  268,  268,  268,  123,  193,  539,  543,
-      268,  268,  268,  268,  268,  268,  204,  204,  204,  204,
-      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
-      204,  204,  204,  544,  206,  266,  266,  266,  266,  266,
-      266,  193,  193,  193,  193,  193,  193,  193,  193,  193,
-      193,  193,  204,  204,  204,  204,  204,  204,  204,  204,
-      204,  204,  861,  707,  861,  861,  204,  204,  204,  204,
-
-      204,  204,  303,  303,  303,  303,  303,  303,  303,  303,
-      303,  303,  104,  104,  104,  104,  369,  226,  861,  861,
-      861,  193,  193,  193,  193,  193,  193,  285,  448,  286,
-      286,  286,  286,  286,  286,  286,  286,  286,  286,  165,
-      537,  861,  545,  165,  861,  105,  727,  131,  131,  165,
-      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
-      607,  540,  612,  165,  165,  861,  105,  104,  226,  290,
-      290,  290,  290,  290,  290,  290,  290,  290,  290,  371,
-      794,  546,  547,  290,  290,  290,  290,  290,  290,  410,
-      411,  412,  410,  410,  410,  410,  410,  410,  410,  526,
-
-      526,  526,  526,  526,  527,  794,  548,  569,  290,  290,
-      290,  290,  290,  290,  292,  293,  294,  294,  294,  294,
-      294,  294,  294,  294,  295,  549,  533,  538,  296,  296,
-      296,  296,  296,  296,  442,  443,  444,  442,  442,  442,
-      442,  442,  442,  442,  672,  105,  131,  564,  543,  550,
-      534,  539,  565,  296,  296,  296,  296,  296,  296,  226,
-      299,  300,  301,  299,  299,  299,  299,  299,  299,  299,
-      302,  105,  544,  681,  303,  303,  303,  303,  303,  303,
-      380,  380,  380,  380,  380,  380,  380,  380,  380,  380,
-      481,  794,  482,  482,  482,  482,  482,  482,  811,  303,
-
-      303,  303,  303,  303,  303,  304,  304,  304,  304,  304,
-      304,  304,  304,  304,  304,  123,  547,  549,  533,  304,
-      304,  304,  304,  304,  304,  369,  226,  446,  446,  446,
-      446,  446,  446,  131,  697,  697,  697,  371,  538,  606,
-      548,  550,  534,  811,  290,  290,  290,  290,  290,  290,
-      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      861,  726,  539,  131,  131,  131,  131,  131,  131,  131,
-      450,  450,  450,  450,  450,  450,  450,  450,  450,  450,
-      431,  226,  432,  432,  432,  432,  432,  432,  226,  104,
-      104,  104,  104,  104,  104,  335,  543,  338,  338,  338,
-
-      338,  338,  339,  336,  336,  336,  336,  340,  340,  340,
-      340,  340,  340,  340,  340,  340,  340,  123,  226,  105,
-      544,  340,  340,  340,  340,  340,  340,  457,  457,  457,
-      457,  457,  457,  457,  457,  457,  457,  572,  572,  572,
-      572,  572,  573,  731,  732,  226,  340,  340,  340,  340,
-      340,  340,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  861,  226,  547,  707,  341,  341,  341,  341,
-      341,  341,  226,  105,  448,  369,  226,  521,  521,  521,
-      521,  521,  521,  448,  610,  369,  226,  448,  548,  131,
-      618,  340,  340,  340,  340,  340,  340,  358,  359,  360,
-
-      358,  358,  358,  358,  358,  358,  358,  525,  525,  525,
-      525,  525,  525,  525,  525,  525,  525,  558,  559,  560,
-      558,  558,  558,  558,  558,  558,  558,  581,  581,  581,
-      581,  581,  582,  643,  105,  363,  363,  364,  365,  365,
-      365,  365,  365,  365,  365,  295,  369,  226,  370,  370,
-      370,  370,  370,  370,  370,  370,  370,  370,  371,  549,
-      109,  629,  372,  372,  372,  372,  372,  372,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  204,  671,
-      794,  861,  723,  550,  131,  131,  794,  372,  372,  372,
-      372,  372,  372,  226,  376,  377,  378,  376,  376,  376,
-
-      376,  376,  376,  376,  379,  861,  369,  226,  380,  380,
-      380,  380,  380,  380,  728,  743,  669,  541,  448,  131,
-      733,  743,  542,  513,  513,  513,  513,  513,  513,  513,
-      513,  513,  513,  380,  380,  380,  380,  380,  380,  861,
-      670,  372,  372,  372,  372,  372,  372,  372,  372,  372,
-      372,  413,  413,  413,  413,  413,  413,  413,  413,  413,
-      413,  743,  778,  131,  131,  413,  413,  413,  413,  413,
-      413,  580,  580,  580,  580,  580,  580,  580,  580,  580,
-      580,  514,  673,  515,  515,  515,  515,  515,  515,  692,
-      413,  413,  413,  413,  413,  413,  414,  414,  414,  414,
-
-      414,  414,  414,  414,  414,  414,  674,  743,  673,  675,
-      414,  414,  414,  414,  414,  414,  588,  589,  590,  588,
-      588,  588,  588,  588,  588,  588,  779,  131,  105,  131,
-      369,  226,  674,  676,  742,  413,  413,  413,  413,  413,
-      413,  431,  523,  432,  432,  432,  432,  432,  432,  432,
-      432,  432,  432,  431,  576,  433,  433,  433,  433,  433,
-      433,  433,  433,  433,  433,  431,  578,  434,  434,  434,
-      434,  434,  435,  432,  432,  432,  432,  437,  437,  437,
-      437,  437,  437,  437,  437,  437,  437,  295,  369,  226,
-      446,  446,  446,  446,  446,  446,  446,  446,  446,  446,
-
-      371,  679,  109,  675,  445,  445,  445,  445,  445,  445,
-      532,  532,  532,  532,  532,  532,  532,  532,  532,  532,
-      598,  598,  598,  598,  598,  599,  809,  676,  131,  445,
-      445,  445,  445,  445,  445,  369,  226,  447,  447,  447,
-      447,  447,  447,  447,  447,  447,  447,  448,  861,  226,
-      131,  449,  449,  449,  449,  449,  449,  680,  861,  131,
-      523,  369,  226,  593,  593,  593,  593,  593,  593,  609,
-      578,  669,  724,  523,  731,  732,  449,  449,  449,  449,
-      449,  449,  226,  453,  454,  455,  453,  453,  453,  453,
-      453,  453,  453,  456,  782,  670,  725,  457,  457,  457,
-
-      457,  457,  457,  597,  597,  597,  597,  597,  597,  597,
-      597,  597,  597,  104,  104,  104,  104,  673,  131,  131,
-      810,  109,  457,  457,  457,  457,  457,  457,  861,  611,
-      449,  449,  449,  449,  449,  449,  449,  449,  449,  449,
-      481,  674,  484,  484,  484,  484,  484,  485,  482,  482,
-      482,  482,  413,  413,  413,  413,  413,  413,  413,  413,
-      413,  413,  105,  109,  105,  675,  413,  413,  413,  413,
-      413,  413,  616,  637,  638,  639,  637,  637,  637,  637,
-      637,  637,  637,  646,  646,  646,  646,  646,  647,  676,
-      732,  413,  413,  413,  413,  413,  413,  502,  503,  504,
-
-      502,  502,  502,  502,  502,  502,  502,  587,  587,  587,
-      587,  587,  587,  587,  587,  587,  587,  576,  576,  641,
-      641,  641,  641,  641,  641,  226,  829,  830,  781,  578,
-      578,  692,  105,  789,  105,  431,  448,  432,  432,  432,
-      432,  432,  432,  432,  432,  432,  432,  431,  734,  432,
-      432,  432,  432,  432,  432,  432,  432,  432,  432,  509,
-      510,  511,  509,  509,  509,  509,  509,  509,  509,  512,
-      105,  682,  105,  513,  513,  513,  513,  513,  513,  645,
-      645,  645,  645,  645,  645,  645,  645,  645,  645,  824,
-      824,  824,  824,  682,  226,  682,  682,  780,  513,  513,
-
-      513,  513,  513,  513,  514,  523,  517,  517,  517,  517,
-      517,  518,  515,  515,  515,  515,  369,  226,  521,  521,
-      521,  521,  521,  521,  521,  521,  521,  521,  448,  369,
-      226,  724,  520,  520,  520,  520,  520,  520,  369,  226,
-      576,  523,  861,  226,  664,  664,  664,  664,  664,  665,
-      595,  131,  643,  861,  595,  725,  226,  520,  520,  520,
-      520,  520,  520,  369,  226,  522,  522,  522,  522,  522,
-      522,  522,  522,  522,  522,  523,  336,  861,  336,  524,
-      524,  524,  524,  524,  524,  369,  226,  660,  660,  660,
-      660,  660,  660,  829,  830,  751,  226,  595,  710,  710,
-
-      710,  710,  710,  711,  524,  524,  524,  524,  524,  524,
-      226,  528,  529,  530,  528,  528,  528,  528,  528,  528,
-      528,  531,  682,  226,  861,  532,  532,  532,  532,  532,
-      532,  663,  663,  663,  663,  663,  663,  663,  663,  663,
-      663,  175,  175,  175,  682,  861,  682,  683,  861,  861,
-      532,  532,  532,  532,  532,  532,  861,  643,  524,  524,
-      524,  524,  524,  524,  524,  524,  524,  524,  104,  533,
-      750,  105,  111,  861,  104,  111,  219,  104,  104,  219,
-      104,  104,  104,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  534,  749,  643,  104,  131,  131,  131,
-
+      131,  867,  227,  109,  836,  131,  131,  131,  131,  131,
+      131,  105,  105,  300,  123,  131,  111,  111,  111,  111,
+      111,  111,  111,  111,  111,  111,  109,  334,  334,  582,
+      104,  104,  104,  104,  104,  104,  145,  146,  104,  104,
+      104,  105,  104,  104,  105,  411,  104,  225,  225,  225,
+      225,  225,  225,  225,  225,  225,  225,  333,  186,  105,
+
+      104,  104,  104,  104,  263,  124,  124,  124,  124,  124,
+      124,  124,  124,  124,  124,  109,  171,  146,  172,  867,
+      173,  384,  113,  435,  172,  110,  173,  410,  111,  111,
+      111,  111,  111,  111,  111,  111,  111,  111,  105,  867,
+      173,  173,  867,  334,  105,  385,  104,  184,  104,  104,
+      104,  192,  104,  104,  475,  177,  104,  192,  177,  177,
+      192,  562,  105,  192,  192,  177,  115,  173,  867,  191,
+      104,  104,  104,  175,  146,  155,  109,  194,  388,  192,
+      177,  113,  390,  389,  405,  105,  174,  105,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  337,
+
+      105,  867,  420,  195,  192,  119,  391,  421,  119,  119,
+      557,  119,  119,  119,  119,  191,  227,  119,  119,  112,
+      105,  112,  112,  477,  178,  112,  112,  300,  191,  112,
+      476,  194,  119,  119,  225,  225,  225,  225,  225,  225,
+      225,  225,  225,  225,  112,  112,  111,  111,  111,  111,
+      111,  111,  111,  111,  111,  111,  105,  197,  119,  194,
+      105,  105,  198,  194,  199,  199,  199,  199,  199,  199,
+      199,  199,  199,  199,  123,  194,  623,  384,  200,  200,
+      200,  200,  200,  200,  194,  194,  194,  194,  194,  194,
+      194,  194,  194,  194,  194,  194,  194,  194,  194,  194,
+
+      194,  385,  768,  200,  200,  200,  200,  200,  200,  194,
+      194,  194,  194,  194,  194,  194,  194,  194,  194,  194,
+      867,  390,  194,  194,  194,  194,  194,  194,  194,  194,
+      194,  194,  867,  105,  636,  205,  194,  194,  194,  194,
+      194,  194,  227,  563,  116,  391,  116,  116,  116,  402,
+      116,  116,  403,  300,  116,  269,  269,  269,  269,  269,
+      269,  194,  194,  194,  194,  194,  194,  194,  116,  116,
+      116,  194,  204,  204,  204,  204,  204,  204,  204,  204,
+      204,  204,  123,  194,  105,  384,  204,  204,  204,  204,
+      204,  204,  205,  205,  205,  205,  206,  205,  205,  205,
+
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  385,
+      207,  200,  200,  200,  200,  200,  200,  194,  194,  194,
+      194,  194,  194,  194,  194,  194,  194,  194,  205,  205,
+      205,  205,  205,  205,  205,  205,  205,  205,  867,  673,
+      817,  131,  205,  205,  205,  205,  205,  205,  105,  109,
+      119,  119,  205,  479,  119,  119,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  390,  194,  194,  194,
+      194,  194,  194,  867,  119,  200,  200,  200,  200,  200,
+      200,  200,  200,  200,  200,  118,  817,  104,  104,  118,
+      391,  104,  104,  149,  105,  118,  276,  277,  404,  120,
+
+      406,  105,  278,  279,  560,  478,  280,  413,  281,  118,
+      118,  104,  221,  222,  223,  221,  221,  221,  221,  221,
+      221,  221,  119,  150,  151,  483,  119,  105,  152,  131,
+      430,  131,  119,  431,  105,  612,  153,  166,  166,  154,
+      105,  166,  166,  613,  817,  484,  119,  119,  105,  105,
+      224,  224,  224,  224,  224,  224,  224,  224,  224,  224,
+      678,  166,  131,  867,  224,  224,  224,  224,  224,  224,
+      265,  266,  267,  265,  265,  265,  265,  265,  265,  265,
+      290,  290,  290,  290,  290,  291,  167,  867,  698,  224,
+      224,  224,  224,  224,  224,  230,  230,  230,  230,  230,
+
+      230,  230,  230,  230,  230,  123,  123,  867,  542,  230,
+      230,  230,  230,  230,  230,  269,  269,  269,  269,  269,
+      269,  269,  269,  269,  269,  324,  325,  105,  326,  104,
+      104,  104,  104,  105,  224,  224,  224,  224,  224,  224,
       131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      867,  412,  109,  105,  131,  131,  131,  131,  131,  131,
+      105,  165,  131,  104,  104,  165,  614,  104,  104,  582,
+      618,  165,  377,  377,  377,  377,  377,  378,  227,  104,
+      104,  104,  104,  104,  104,  165,  165,  104,  189,  300,
+      189,  189,  227,  192,  189,  189,  372,  227,  189,  192,
+
+      867,  227,  192,  374,  105,  192,  192,  166,  374,  485,
+      570,  166,  374,  189,  189,  571,  768,  166,  109,  194,
+      482,  192,  575,  192,  713,  192,  192,  192,  543,  192,
+      192,  166,  166,  192,  269,  269,  269,  269,  269,  269,
+      269,  269,  269,  269,  105,  195,  192,  192,  192,  192,
+      119,  131,  544,  119,  119,  561,  119,  119,  119,  119,
+      105,  611,  119,  119,  220,  220,  220,  220,  220,  220,
+      220,  220,  220,  220,  621,  867,  194,  119,  119,  220,
+      220,  220,  220,  220,  220,  220,  220,  220,  220,  289,
+      289,  289,  289,  289,  289,  289,  289,  289,  289,  867,
+
+      674,  131,  197,  119,  268,  268,  268,  268,  268,  268,
+      268,  268,  268,  268,  105,  800,  687,  541,  268,  268,
+      268,  268,  268,  268,  305,  305,  305,  305,  305,  305,
+      305,  305,  305,  305,  338,  105,  339,  339,  339,  339,
+      339,  339,  548,  268,  268,  268,  268,  268,  268,  194,
+      372,  227,  624,  194,  270,  270,  270,  270,  270,  270,
+      270,  270,  270,  270,  123,  194,  549,  552,  270,  270,
+      270,  270,  270,  270,  205,  205,  205,  205,  205,  205,
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
+      205,  553,  207,  268,  268,  268,  268,  268,  268,  194,
+
+      194,  194,  194,  194,  194,  194,  194,  194,  194,  194,
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
+      867,  800,  554,  538,  205,  205,  205,  205,  205,  205,
+      376,  376,  376,  376,  376,  376,  376,  376,  376,  376,
+      455,  455,  455,  455,  455,  456,  555,  539,  800,  194,
+      194,  194,  194,  194,  194,  287,  817,  288,  288,  288,
+      288,  288,  288,  288,  288,  288,  288,  414,  415,  416,
+      414,  414,  414,  414,  414,  414,  414,  446,  447,  448,
+      446,  446,  446,  446,  446,  446,  446,  531,  531,  531,
+      531,  531,  532,  729,  105,  104,  131,  292,  292,  292,
+
+      292,  292,  292,  292,  292,  292,  292,  867,  543,  548,
+      867,  292,  292,  292,  292,  292,  292,  383,  383,  383,
+      383,  383,  383,  383,  383,  383,  383,  703,  703,  703,
+      867,  867,  544,  549,  867,  817,  292,  292,  292,  292,
+      292,  292,  294,  295,  296,  296,  296,  296,  296,  296,
+      296,  296,  297,  540,  867,  550,  298,  298,  298,  298,
+      298,  298,  372,  227,  450,  450,  450,  450,  450,  450,
+      732,  545,  131,  486,  374,  487,  487,  487,  487,  487,
+      487,  298,  298,  298,  298,  298,  298,  227,  301,  302,
+      303,  301,  301,  301,  301,  301,  301,  301,  304,  685,
+
+      109,  227,  305,  305,  305,  305,  305,  305,  454,  454,
+      454,  454,  454,  454,  454,  454,  454,  454,  435,  227,
+      436,  436,  436,  436,  436,  436,  227,  305,  305,  305,
+      305,  305,  305,  306,  306,  306,  306,  306,  306,  306,
+      306,  306,  306,  123,  372,  227,  227,  306,  306,  306,
+      306,  306,  306,  372,  227,  686,  374,  105,  867,  227,
+      227,  867,  227,  616,  677,  452,  867,  552,  131,  131,
+      452,  374,  292,  292,  292,  292,  292,  292,  131,  131,
+      131,  131,  131,  131,  131,  131,  131,  131,  867,  554,
+      867,  553,  131,  131,  131,  131,  131,  131,  461,  461,
+
+      461,  461,  461,  461,  461,  461,  461,  461,  733,  131,
+      734,  556,  784,  555,  131,  131,  713,  104,  104,  104,
+      104,  104,  104,  338,  867,  341,  341,  341,  341,  341,
+      342,  339,  339,  339,  339,  343,  343,  343,  343,  343,
+      343,  343,  343,  343,  343,  123,  635,  649,  867,  343,
+      343,  343,  343,  343,  343,  372,  227,  526,  526,  526,
+      526,  526,  526,  205,  551,  800,  538,  452,  578,  578,
+      578,  578,  578,  579,  343,  343,  343,  343,  343,  343,
+      344,  344,  344,  344,  344,  344,  344,  344,  344,  344,
+      539,  737,  738,  800,  344,  344,  344,  344,  344,  344,
+
+      530,  530,  530,  530,  530,  530,  530,  530,  530,  530,
+      749,  867,  587,  587,  587,  587,  587,  588,  749,  343,
+      343,  343,  343,  343,  343,  361,  362,  363,  361,  361,
+      361,  361,  361,  361,  361,  867,  564,  565,  566,  564,
+      564,  564,  564,  564,  564,  564,  749,  546,  227,  372,
+      227,  519,  547,  520,  520,  520,  520,  520,  520,  452,
+      749,  452,  105,  366,  366,  367,  368,  368,  368,  368,
+      368,  368,  368,  297,  372,  227,  373,  373,  373,  373,
+      373,  373,  373,  373,  373,  373,  374,  748,  543,  548,
+      375,  375,  375,  375,  375,  375,  577,  577,  577,  577,
+
+      577,  577,  577,  577,  577,  577,  604,  604,  604,  604,
+      604,  605,  544,  549,  788,  375,  375,  375,  375,  375,
+      375,  227,  379,  380,  381,  379,  379,  379,  379,  379,
+      379,  379,  382,  105,  552,  554,  383,  383,  383,  383,
+      383,  383,  518,  518,  518,  518,  518,  518,  518,  518,
+      518,  518,  104,  104,  104,  104,  372,  227,  553,  555,
+      738,  383,  383,  383,  383,  383,  383,  867,  528,  375,
+      375,  375,  375,  375,  375,  375,  375,  375,  375,  417,
+      417,  417,  417,  417,  417,  417,  417,  417,  417,  372,
+      227,  679,  681,  417,  417,  417,  417,  417,  417,  586,
+
+      586,  586,  586,  586,  586,  586,  586,  586,  586,  652,
+      652,  652,  652,  652,  653,  680,  682,  786,  417,  417,
+      417,  417,  417,  417,  418,  418,  418,  418,  418,  418,
+      418,  418,  418,  418,  785,  131,  675,  679,  418,  418,
+      418,  418,  418,  418,  594,  595,  596,  594,  594,  594,
+      594,  594,  594,  594,  104,  104,  104,  104,  867,  227,
+      676,  680,  131,  417,  417,  417,  417,  417,  417,  435,
+      528,  436,  436,  436,  436,  436,  436,  436,  436,  436,
+      436,  435,  582,  437,  437,  437,  437,  437,  437,  437,
+      437,  437,  437,  435,  584,  438,  438,  438,  438,  438,
+
+      439,  436,  436,  436,  436,  441,  441,  441,  441,  441,
+      441,  441,  441,  441,  441,  297,  372,  227,  450,  450,
+      450,  450,  450,  450,  450,  450,  450,  450,  374,  109,
+      675,  679,  449,  449,  449,  449,  449,  449,  537,  537,
+      537,  537,  537,  537,  537,  537,  537,  537,  670,  670,
+      670,  670,  670,  671,  676,  680,  698,  449,  449,  449,
+      449,  449,  449,  372,  227,  451,  451,  451,  451,  451,
+      451,  451,  451,  451,  451,  452,  681,  131,  131,  453,
+      453,  453,  453,  453,  453,  372,  227,  599,  599,  599,
+      599,  599,  599,  131,  787,  105,  111,  528,  730,  111,
+
+      682,  737,  738,  615,  453,  453,  453,  453,  453,  453,
+      227,  457,  458,  459,  457,  457,  457,  457,  457,  457,
+      457,  460,  731,  131,  681,  461,  461,  461,  461,  461,
+      461,  603,  603,  603,  603,  603,  603,  603,  603,  603,
+      603,  815,  227,  131,  220,  131,  131,  220,  682,  227,
+      461,  461,  461,  461,  461,  461,  867,  617,  453,  453,
+      453,  453,  453,  453,  453,  453,  453,  453,  486,  730,
+      489,  489,  489,  489,  489,  490,  487,  487,  487,  487,
+      417,  417,  417,  417,  417,  417,  417,  417,  417,  417,
+      105,  816,  109,  731,  417,  417,  417,  417,  417,  417,
+
+      622,  643,  644,  645,  643,  643,  643,  643,  643,  643,
+      643,  625,  626,  626,  626,  626,  626,  626,  227,  417,
+      417,  417,  417,  417,  417,  507,  508,  509,  507,  507,
+      507,  507,  507,  507,  507,  593,  593,  593,  593,  593,
+      593,  593,  593,  593,  593,  867,  582,  582,  647,  647,
+      647,  647,  647,  647,  835,  836,  649,  584,  584,  584,
+      109,  795,  105,  435,  582,  436,  436,  436,  436,  436,
+      436,  436,  436,  436,  436,  435,  649,  436,  436,  436,
+      436,  436,  436,  436,  436,  436,  436,  514,  515,  516,
+      514,  514,  514,  514,  514,  514,  514,  517,  584,  688,
+
+      105,  518,  518,  518,  518,  518,  518,  651,  651,  651,
+      651,  651,  651,  651,  651,  651,  651,  835,  836,  704,
+      739,  688,  227,  688,  688,  704,  518,  518,  518,  518,
+      518,  518,  519,  452,  522,  522,  522,  522,  522,  523,
+      520,  520,  520,  520,  372,  227,  526,  526,  526,  526,
+      526,  526,  526,  526,  526,  526,  452,  227,  372,  227,
+      525,  525,  525,  525,  525,  525,  372,  227,  528,  867,
+      528,  867,  227,  227,  830,  830,  830,  830,  601,  704,
+      867,  649,  730,  601,  528,  525,  525,  525,  525,  525,
+      525,  372,  227,  527,  527,  527,  527,  527,  527,  527,
+
+      527,  527,  527,  528,  867,  105,  731,  529,  529,  529,
+      529,  529,  529,  372,  227,  666,  666,  666,  666,  666,
+      666,  740,  757,  626,  626,  601,  716,  716,  716,  716,
+      716,  717,  529,  529,  529,  529,  529,  529,  227,  533,
+      534,  535,  533,  533,  533,  533,  533,  533,  533,  536,
+      688,  749,  867,  537,  537,  537,  537,  537,  537,  669,
+      669,  669,  669,  669,  669,  669,  669,  669,  669,  176,
+      176,  176,  688,  582,  688,  689,  867,  867,  537,  537,
+      537,  537,  537,  537,  867,  649,  529,  529,  529,  529,
+      529,  529,  529,  529,  529,  529,  104,  538,  756,  105,
+
+      749,  867,  104,  627,  627,  104,  104,  735,  104,  104,
+      104,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  539,  755,  659,  104,  131,  131,  131,  131,  131,
       131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      105,  131,  104,  104,  104,  104,  104,  104,  104,  104,
-      104,  104,  104,  104,  104,  104,  104,  104,  104,  569,
-      570,  570,  570,  570,  570,  570,  570,  570,  570,  570,
-      684,  685,  686,  687,  684,  684,  684,  684,  684,  684,
-      619,  620,  620,  620,  620,  620,  620,  694,  694,  694,
-      694,  694,  694,  694,  694,  694,  694,  105,  576,  576,
-      577,  577,  577,  577,  577,  577,  577,  577,  577,  577,
-      578,  643,  620,  620,  579,  579,  579,  579,  579,  579,
-
-      695,  695,  695,  695,  695,  696,  697,  697,  697,  697,
-      653,  578,  654,  654,  654,  654,  654,  654,  698,  579,
-      579,  579,  579,  579,  579,  583,  584,  585,  583,  583,
-      583,  583,  583,  583,  583,  586,  698,  724,  776,  587,
-      587,  587,  587,  587,  587,  652,  652,  652,  652,  652,
-      652,  652,  652,  652,  652,  743,  698,  748,  748,  748,
-      226,  725,  777,  743,  587,  587,  587,  587,  587,  587,
-      861,  523,  579,  579,  579,  579,  579,  579,  579,  579,
-      579,  579,  369,  226,  593,  593,  593,  593,  593,  593,
-      593,  593,  593,  593,  523,  776,  621,  621,  592,  592,
-
-      592,  592,  592,  592,  576,  576,  705,  705,  705,  705,
-      705,  705,  175,  175,  175,  743,  643,  707,  736,  777,
-      737,  738,  739,  592,  592,  592,  592,  592,  592,  369,
-      226,  594,  594,  594,  594,  594,  594,  594,  594,  594,
-      594,  595,  131,  620,  620,  596,  596,  596,  596,  596,
-      596,  709,  709,  709,  709,  709,  709,  709,  709,  709,
-      709,  369,  226,  722,  722,  722,  722,  722,  722,  740,
-      596,  596,  596,  596,  596,  596,  226,  600,  601,  602,
-      600,  600,  600,  600,  600,  600,  600,  776,  729,  807,
-      861,  603,  603,  603,  603,  603,  603,  717,  718,  719,
-
-      717,  717,  717,  717,  717,  717,  717,  337,  482,  337,
-      482,  777,  226,  808,  861,  807,  603,  603,  603,  603,
-      603,  603,  861,  595,  596,  596,  596,  596,  596,  596,
-      596,  596,  596,  596,  104,  787,  131,  771,  771,  808,
-      104,  735,  735,  104,  104,  735,  104,  104,  104,  131,
-      131,  131,  131,  131,  131,  131,  131,  131,  131,  735,
-      735,  735,  104,  131,  131,  131,  131,  131,  131,  131,
-      131,  604,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  131,  131,  105,  131,  104,  104,
+      131,  131,  131,  131,  131,  131,  131,  131,  105,  131,
       104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  575,  576,  576,
+      576,  576,  576,  576,  576,  576,  576,  576,  690,  691,
+      692,  693,  690,  690,  690,  690,  690,  690,  700,  700,
+      700,  700,  700,  700,  700,  700,  700,  700,  749,  659,
+
+      754,  754,  754,  626,  626,  105,  582,  582,  583,  583,
+      583,  583,  583,  583,  583,  583,  583,  583,  584,  713,
+      777,  777,  585,  585,  585,  585,  585,  585,  701,  701,
+      701,  701,  701,  702,  703,  703,  703,  703,  659,  659,
+      660,  660,  660,  660,  660,  660,  840,  585,  585,  585,
+      585,  585,  585,  589,  590,  591,  589,  589,  589,  589,
+      589,  589,  589,  592,  584,  782,  782,  593,  593,  593,
+      593,  593,  593,  658,  658,  658,  658,  658,  658,  658,
+      658,  658,  658,  704,  339,  105,  339,  704,  227,  783,
+      783,  513,  593,  593,  593,  593,  593,  593,  867,  601,
+
+      585,  585,  585,  585,  585,  585,  585,  585,  585,  585,
+      372,  227,  599,  599,  599,  599,  599,  599,  599,  599,
+      599,  599,  528,  782,  778,  778,  598,  598,  598,  598,
+      598,  598,  582,  867,  711,  711,  711,  711,  711,  711,
+      176,  176,  176,  697,  649,  713,  742,  783,  743,  744,
+      745,  598,  598,  598,  598,  598,  598,  372,  227,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  601,
+      131,  696,  695,  602,  602,  602,  602,  602,  602,  715,
+      715,  715,  715,  715,  715,  715,  715,  715,  715,  372,
+      227,  728,  728,  728,  728,  728,  728,  746,  602,  602,
+
+      602,  602,  602,  602,  227,  606,  607,  608,  606,  606,
+      606,  606,  606,  606,  606,  694,  625,  813,  867,  609,
+      609,  609,  609,  609,  609,  723,  724,  725,  723,  723,
+      723,  723,  723,  723,  723,  340,  487,  340,  487,  372,
+      227,  814,  867,  813,  609,  609,  609,  609,  609,  609,
+      867,  601,  602,  602,  602,  602,  602,  602,  602,  602,
+      602,  602,  104,  793,  131,  625,  625,  814,  104,  741,
+      741,  104,  104,  741,  104,  104,  104,  131,  131,  131,
+      131,  131,  131,  131,  131,  131,  131,  741,  741,  741,
+      104,  131,  131,  131,  131,  131,  131,  131,  131,  610,
 
-      104,  104,  104,  104,  104,  619,  622,  622,  622,  622,
-      622,  623,  620,  620,  620,  620,  193,  772,  772,  861,
-      193,  204,  204,  204,  204,  204,  204,  204,  204,  204,
-      204,  707,  193,  653,  807,  204,  204,  204,  204,  204,
-      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
-      204,  204,  204,  204,  204,  626,  204,  204,  808,  206,
-      193,  193,  193,  193,  193,  193,  193,  193,  193,  193,
-      193,  193,  193,  193,  193,  193,  193,  632,  633,  634,
-      635,  632,  632,  632,  632,  632,  632,  369,  226,  736,
-      653,  737,  738,  739,  483,  515,  483,  515,  576,  595,
-
-      755,  756,  757,  755,  755,  755,  755,  755,  755,  755,
-      707,  653,  578,  834,  105,  569,  570,  570,  570,  570,
-      570,  570,  570,  570,  570,  570,  698,  826,  699,  699,
-      699,  699,  699,  699,  765,  765,  765,  765,  765,  766,
-      742,  716,  716,  716,  716,  716,  716,  716,  716,  716,
-      716,  827,  105,  105,  576,  698,  641,  641,  641,  641,
-      641,  641,  641,  641,  641,  641,  578,  576,  576,  642,
-      642,  642,  642,  642,  642,  642,  642,  642,  642,  643,
-      762,  861,  826,  644,  644,  644,  644,  644,  644,  576,
-      698,  760,  760,  760,  760,  760,  760,  516,  508,  516,
-
-      861,  707,  861,  861,  861,  861,  827,  691,  644,  644,
-      644,  644,  644,  644,  648,  649,  650,  648,  648,  648,
-      648,  648,  648,  648,  651,  690,  689,  788,  652,  652,
-      652,  652,  652,  652,  764,  764,  764,  764,  764,  764,
-      764,  764,  764,  764,  482,  515,  482,  515,  654,  226,
-      654,  740,  688,  652,  652,  652,  652,  652,  652,  861,
-      595,  644,  644,  644,  644,  644,  644,  644,  644,  644,
-      644,  653,  619,  656,  656,  656,  656,  656,  657,  654,
-      654,  654,  654,  369,  226,  660,  660,  660,  660,  660,
-      660,  660,  660,  660,  660,  595,  619,  861,  826,  659,
-
-      659,  659,  659,  659,  659,  736,  619,  737,  738,  739,
-      861,  861,  737,  738,  739,  861,  105,  861,  861,  739,
-      678,  861,  827,  762,  659,  659,  659,  659,  659,  659,
-      369,  226,  661,  661,  661,  661,  661,  661,  661,  661,
-      661,  661,  816,  576,  677,  131,  662,  662,  662,  662,
-      662,  662,  655,  105,  655,  762,  740,  699,  700,  699,
-      700,  740,  654,  744,  654,  744,  740,  745,  699,  745,
-      699,  662,  662,  662,  662,  662,  662,  861,  226,  662,
-      662,  662,  662,  662,  662,  662,  662,  662,  662,  104,
-      741,  653,  741,  741,  741,  104,  741,  741,  104,  104,
-
-      741,  104,  104,  104,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  741,  741,  741,  104,  131,  131,
       131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  131,  131,  131,  666,  131,  131,
-      131,  105,  131,  104,  104,  104,  104,  104,  104,  104,
+      131,  131,  131,  131,  105,  131,  104,  104,  104,  104,
       104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
-      669,  743,  653,  744,  744,  744,  744,  744,  744,  193,
-      795,  508,  795,  193,  204,  204,  204,  204,  204,  204,
-      204,  204,  204,  204,  670,  193,  367,  631,  204,  204,
-      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
-
-      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
-      204,  628,  206,  193,  193,  193,  193,  193,  193,  193,
-      193,  193,  193,  193,  193,  193,  193,  193,  193,  193,
-      692,  627,  693,  693,  693,  693,  693,  693,  693,  693,
-      693,  693,  784,  785,  786,  784,  784,  784,  784,  784,
-      784,  784,  770,  770,  770,  770,  770,  770,  770,  770,
-      770,  770,  805,  805,  805,  805,  805,  806,  783,  105,
-      698,  783,  701,  701,  701,  701,  701,  702,  699,  699,
-      699,  699,  576,  625,  705,  705,  705,  705,  705,  705,
-      705,  705,  705,  705,  643,  576,  624,  706,  706,  706,
-
-      706,  706,  706,  706,  706,  706,  706,  707,  796,  619,
-      796,  708,  708,  708,  708,  708,  708,  576,  619,  801,
-      801,  801,  801,  801,  801,  812,  614,  812,  794,  762,
-      795,  795,  795,  795,  795,  795,  708,  708,  708,  708,
-      708,  708,  712,  713,  714,  712,  712,  712,  712,  712,
-      712,  712,  715,  813,  613,  813,  716,  716,  716,  716,
-      716,  716,  804,  804,  804,  804,  804,  804,  804,  804,
-      804,  804,  226,  771,  771,  771,  771,  771,  771,  514,
-      514,  716,  716,  716,  716,  716,  716,  861,  514,  708,
-      708,  708,  708,  708,  708,  708,  708,  708,  708,  369,
-
-      226,  722,  722,  722,  722,  722,  722,  722,  722,  722,
-      722,  743,  508,  746,  746,  746,  746,  746,  747,  748,
-      748,  748,  748,  752,  753,  754,  752,  752,  752,  752,
-      752,  752,  752,  783,  783,  783,  783,  783,  783,  783,
-      783,  783,  783,  783,  783,  783,  783,  783,  783,  783,
-      783,  783,  783,  839,  839,  839,  839,  839,  839,  367,
-      105,  692,  295,  693,  693,  693,  693,  693,  693,  693,
-      693,  693,  693,  845,  568,  845,  789,  567,  790,  790,
-      790,  790,  790,  790,  820,  821,  822,  820,  820,  820,
-      820,  820,  820,  820,  858,  858,  858,  858,  858,  858,
-
-      105,  576,  566,  760,  760,  760,  760,  760,  760,  760,
-      760,  760,  760,  707,  576,  105,  761,  761,  761,  761,
-      761,  761,  761,  761,  761,  761,  762,  846,  563,  846,
-      763,  763,  763,  763,  763,  763,  831,  832,  833,  831,
-      831,  831,  831,  831,  831,  831,  811,  562,  812,  812,
-      812,  812,  812,  812,  561,  763,  763,  763,  763,  763,
-      763,  767,  768,  769,  767,  767,  767,  767,  767,  767,
-      767,  481,  481,  481,  553,  770,  770,  770,  770,  770,
-      770,  839,  839,  839,  839,  839,  839,  839,  839,  839,
-      839,  834,  552,  835,  835,  835,  835,  835,  835,  105,
-
-      770,  770,  770,  770,  770,  770,  861,  105,  763,  763,
-      763,  763,  763,  763,  763,  763,  763,  763,  226,  773,
-      773,  773,  773,  773,  774,  771,  771,  771,  771,  789,
-      105,  790,  790,  790,  790,  790,  790,  790,  790,  790,
-      790,  789,  105,  791,  791,  791,  791,  791,  791,  791,
-      791,  791,  791,  789,  105,  792,  792,  792,  792,  792,
-      793,  790,  790,  790,  790,  794,  514,  797,  797,  797,
-      797,  797,  798,  795,  795,  795,  795,  576,  514,  801,
-      801,  801,  801,  801,  801,  801,  801,  801,  801,  762,
-      576,  508,  802,  802,  802,  802,  802,  802,  802,  802,
-
-      802,  802,  367,  295,  295,  501,  803,  803,  803,  803,
-      803,  803,  840,  840,  840,  840,  840,  840,  840,  840,
-      840,  840,  844,  500,  845,  845,  845,  845,  845,  845,
-      499,  803,  803,  803,  803,  803,  803,  861,  498,  803,
-      803,  803,  803,  803,  803,  803,  803,  803,  803,  811,
-      497,  814,  814,  814,  814,  814,  815,  812,  812,  812,
-      812,  104,  496,  817,  818,  819,  817,  817,  817,  817,
-      817,  817,  817,  789,  495,  790,  790,  790,  790,  790,
-      790,  790,  790,  790,  790,  789,  494,  790,  790,  790,
-      790,  790,  790,  790,  790,  790,  790,  576,  493,  825,
-
-      825,  825,  825,  825,  825,  825,  825,  825,  825,  834,
-      492,  835,  835,  835,  835,  835,  835,  835,  835,  835,
-      835,  834,  491,  836,  836,  836,  836,  836,  836,  836,
-      836,  836,  836,  834,  490,  837,  837,  837,  837,  837,
-      838,  835,  835,  835,  835,  841,  841,  841,  841,  841,
-      842,  839,  839,  839,  839,  844,  489,  847,  847,  847,
-      847,  847,  848,  845,  845,  845,  845,  104,  488,  849,
-      850,  851,  849,  849,  849,  849,  849,  849,  849,  834,
-      487,  835,  835,  835,  835,  835,  835,  835,  835,  835,
-      835,  834,  486,  835,  835,  835,  835,  835,  835,  835,
-
-      835,  835,  835,  839,  839,  839,  839,  839,  839,  839,
-      839,  839,  839,  839,  839,  839,  839,  839,  839,  839,
-      839,  839,  839,  852,  853,  854,  852,  852,  852,  852,
-      852,  852,  852,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  858,  858,  858,  858,  858,  858,  858,
-      858,  858,  858,  852,  852,  852,  852,  852,  852,  852,
-      852,  852,  852,  855,  855,  855,  855,  855,  855,  861,
-      105,  849,  849,  849,  849,  849,  849,  849,  849,  849,
-      849,  859,  859,  859,  859,  859,  860,  858,  858,  858,
-      858,  843,  481,  481,  843,  403,  476,  475,  843,  469,
-
-      105,  468,  467,  466,  465,  464,  463,  462,  105,  856,
-      856,  856,  856,  856,  857,  855,  855,  855,  855,  858,
-      858,  858,  858,  858,  858,  858,  858,  858,  858,  461,
-      460,  459,  458,  440,  367,  295,  436,  295,  129,  430,
-      429,  428,  425,  424,  423,  422,  105,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  421,  420,  419,
-      418,  415,  335,  335,  335,  403,  405,  403,  404,  403,
-      397,  396,  395,  394,  393,  392,  391,  390,  389,  384,
-      383,  123,  295,  367,  105,   63,   63,   63,   63,   63,
+      104,  104,  104,  625,  628,  628,  628,  628,  628,  629,
+      626,  626,  626,  626,  194,  105,  684,  582,  194,  205,
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  713,
+      194,  683,  813,  205,  205,  205,  205,  205,  205,  205,
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
+      205,  205,  205,  632,  205,  205,  814,  207,  194,  194,
+      194,  194,  194,  194,  194,  194,  194,  194,  194,  194,
+
+      194,  194,  194,  194,  194,  638,  639,  640,  641,  638,
+      638,  638,  638,  638,  638,  742,  832,  743,  744,  745,
+      761,  762,  763,  761,  761,  761,  761,  761,  761,  761,
+      704,  105,  705,  705,  705,  705,  705,  705,  227,  488,
+      833,  488,  105,  575,  576,  576,  576,  576,  576,  576,
+      576,  576,  576,  576,  722,  722,  722,  722,  722,  722,
+      722,  722,  722,  722,  227,  582,  748,  766,  766,  766,
+      766,  766,  766,  659,  520,  601,  520,  713,  521,  659,
+      521,  105,  582,  513,  647,  647,  647,  647,  647,  647,
+      647,  647,  647,  647,  584,  582,  582,  648,  648,  648,
+
+      648,  648,  648,  648,  648,  648,  648,  649,  768,  867,
+      832,  650,  650,  650,  650,  650,  650,  770,  770,  770,
+      770,  770,  770,  770,  770,  770,  770,  771,  771,  771,
+      771,  771,  772,  867,  833,  370,  650,  650,  650,  650,
+      650,  650,  654,  655,  656,  654,  654,  654,  654,  654,
+      654,  654,  657,  637,  634,  794,  658,  658,  658,  658,
+      658,  658,  790,  791,  792,  790,  790,  790,  790,  790,
+      790,  790,  487,  867,  487,  867,  867,  867,  520,  633,
+      520,  658,  658,  658,  658,  658,  658,  867,  867,  650,
+      650,  650,  650,  650,  650,  650,  650,  650,  650,  659,
+
+      768,  662,  662,  662,  662,  662,  663,  660,  660,  660,
+      660,  372,  227,  666,  666,  666,  666,  666,  666,  666,
+      666,  666,  666,  601,  746,  867,  832,  665,  665,  665,
+      665,  665,  665,  742,  631,  743,  744,  745,  867,  582,
+      743,  744,  745,  867,  630,  867,  867,  745,  625,  867,
+      833,  768,  665,  665,  665,  665,  665,  665,  372,  227,
+      667,  667,  667,  667,  667,  667,  667,  667,  667,  667,
+      822,  625,  620,  131,  668,  668,  668,  668,  668,  668,
+      660,  661,  660,  661,  746,  705,  706,  705,  706,  746,
+      660,  750,  660,  750,  746,  751,  705,  751,  705,  668,
+
+      668,  668,  668,  668,  668,  867,  619,  668,  668,  668,
+      668,  668,  668,  668,  668,  668,  668,  104,  747,  131,
+      747,  747,  747,  104,  747,  747,  104,  104,  747,  104,
+      104,  104,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  131,  747,  747,  747,  104,  131,  131,  131,  131,
+      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  131,  131,  131,  131,  672,  131,  131,  131,  105,
+      131,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  104,  675,  749,
+      519,  750,  750,  750,  750,  750,  750,  194,  801,  519,
+
+      801,  194,  205,  205,  205,  205,  205,  205,  205,  205,
+      205,  205,  676,  194,  519,  513,  205,  205,  205,  205,
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  370,
+      207,  194,  194,  194,  194,  194,  194,  194,  194,  194,
+      194,  194,  194,  194,  194,  194,  194,  194,  698,  297,
+      699,  699,  699,  699,  699,  699,  699,  699,  699,  699,
+      776,  776,  776,  776,  776,  776,  776,  776,  776,  776,
+      582,  574,  807,  807,  807,  807,  807,  807,  789,  573,
+      572,  789,  768,  802,  818,  802,  818,  105,  704,  569,
+
+      707,  707,  707,  707,  707,  708,  705,  705,  705,  705,
+      582,  568,  711,  711,  711,  711,  711,  711,  711,  711,
+      711,  711,  649,  582,  567,  712,  712,  712,  712,  712,
+      712,  712,  712,  712,  712,  713,  819,  486,  819,  714,
+      714,  714,  714,  714,  714,  810,  810,  810,  810,  810,
+      810,  810,  810,  810,  810,  811,  811,  811,  811,  811,
+      812,  851,  486,  851,  714,  714,  714,  714,  714,  714,
+      718,  719,  720,  718,  718,  718,  718,  718,  718,  718,
+      721,  852,  486,  852,  722,  722,  722,  722,  722,  722,
+      227,  777,  777,  777,  777,  777,  777,  789,  789,  789,
+
+      789,  789,  789,  789,  789,  789,  789,  559,  558,  722,
+      722,  722,  722,  722,  722,  867,  105,  714,  714,  714,
+      714,  714,  714,  714,  714,  714,  714,  372,  227,  728,
+      728,  728,  728,  728,  728,  728,  728,  728,  728,  749,
+      105,  752,  752,  752,  752,  752,  753,  754,  754,  754,
+      754,  758,  759,  760,  758,  758,  758,  758,  758,  758,
+      758,  789,  789,  789,  789,  789,  789,  789,  789,  789,
+      789,  795,  105,  796,  796,  796,  796,  796,  796,  800,
+      105,  801,  801,  801,  801,  801,  801,  519,  105,  698,
+      519,  699,  699,  699,  699,  699,  699,  699,  699,  699,
+
+      699,  817,  513,  818,  818,  818,  818,  818,  818,  370,
+      105,  826,  827,  828,  826,  826,  826,  826,  826,  826,
+      826,  845,  845,  845,  845,  845,  845,  297,  105,  582,
+      297,  766,  766,  766,  766,  766,  766,  766,  766,  766,
+      766,  713,  582,  506,  767,  767,  767,  767,  767,  767,
+      767,  767,  767,  767,  768,  505,  504,  503,  769,  769,
+      769,  769,  769,  769,  837,  838,  839,  837,  837,  837,
+      837,  837,  837,  837,  850,  502,  851,  851,  851,  851,
+      851,  851,  501,  769,  769,  769,  769,  769,  769,  773,
+      774,  775,  773,  773,  773,  773,  773,  773,  773,  500,
+
+      499,  498,  497,  776,  776,  776,  776,  776,  776,  845,
+      845,  845,  845,  845,  845,  845,  845,  845,  845,  840,
+      496,  841,  841,  841,  841,  841,  841,  495,  776,  776,
+      776,  776,  776,  776,  867,  494,  769,  769,  769,  769,
+      769,  769,  769,  769,  769,  769,  227,  779,  779,  779,
+      779,  779,  780,  777,  777,  777,  777,  795,  105,  796,
+      796,  796,  796,  796,  796,  796,  796,  796,  796,  795,
+      493,  797,  797,  797,  797,  797,  797,  797,  797,  797,
+      797,  795,  492,  798,  798,  798,  798,  798,  799,  796,
+      796,  796,  796,  800,  491,  803,  803,  803,  803,  803,
+
+      804,  801,  801,  801,  801,  582,  867,  807,  807,  807,
+      807,  807,  807,  807,  807,  807,  807,  768,  582,  486,
+      808,  808,  808,  808,  808,  808,  808,  808,  808,  808,
+      486,  407,  481,  480,  809,  809,  809,  809,  809,  809,
+      846,  846,  846,  846,  846,  846,  846,  846,  846,  846,
+      474,  473,  472,  861,  861,  861,  861,  861,  861,  809,
+      809,  809,  809,  809,  809,  867,  471,  809,  809,  809,
+      809,  809,  809,  809,  809,  809,  809,  817,  470,  820,
+      820,  820,  820,  820,  821,  818,  818,  818,  818,  104,
+      105,  823,  824,  825,  823,  823,  823,  823,  823,  823,
+
+      823,  795,  469,  796,  796,  796,  796,  796,  796,  796,
+      796,  796,  796,  795,  468,  796,  796,  796,  796,  796,
+      796,  796,  796,  796,  796,  582,  467,  831,  831,  831,
+      831,  831,  831,  831,  831,  831,  831,  840,  466,  841,
+      841,  841,  841,  841,  841,  841,  841,  841,  841,  840,
+      465,  842,  842,  842,  842,  842,  842,  842,  842,  842,
+      842,  840,  464,  843,  843,  843,  843,  843,  844,  841,
+      841,  841,  841,  847,  847,  847,  847,  847,  848,  845,
+      845,  845,  845,  850,  463,  853,  853,  853,  853,  853,
+      854,  851,  851,  851,  851,  104,  462,  855,  856,  857,
+
+      855,  855,  855,  855,  855,  855,  855,  840,  444,  841,
+      841,  841,  841,  841,  841,  841,  841,  841,  841,  840,
+      370,  841,  841,  841,  841,  841,  841,  841,  841,  841,
+      841,  845,  845,  845,  845,  845,  845,  845,  845,  845,
+      845,  845,  845,  845,  845,  845,  845,  845,  845,  845,
+      845,  858,  859,  860,  858,  858,  858,  858,  858,  858,
+      858,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  864,  864,  864,  864,  864,  864,  864,  864,  864,
+      864,  858,  858,  858,  858,  858,  858,  858,  858,  858,
+      858,  864,  864,  864,  864,  864,  864,  297,  105,  855,
+
+      855,  855,  855,  855,  855,  855,  855,  855,  855,  865,
+      865,  865,  865,  865,  866,  864,  864,  864,  864,  864,
+      864,  864,  864,  864,  864,  864,  864,  864,  864,  440,
+      297,  129,  434,  433,  432,  429,  105,  862,  862,  862,
+      862,  862,  863,  861,  861,  861,  861,  849,  428,  427,
+      849,  426,  425,  424,  849,  423,  422,  419,  338,  338,
+      338,  407,  409,  407,  408,  407,  401,  400,  399,  398,
+      397,  396,  395,  394,  105,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  393,  392,  387,  386,  123,
+      297,  370,  297,  129,  109,  360,  356,  355,  354,  353,
+
+      352,  351,  350,  349,  348,  347,  346,  345,  198,  338,
+      338,  264,  105,   63,   63,   63,   63,   63,   63,   63,
        63,   63,   63,   63,   63,   63,   63,   63,   63,   63,
-
-       63,   63,   63,   63,   63,   63,   33,   33,   33,   33,
+       63,   63,   63,   63,   33,   33,   33,   33,   33,   33,
        33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
-       33,   33,   33,   33,   33,   33,   33,   72,   72,   72,
+       33,   33,   33,   33,   33,   72,   72,   72,   72,   72,
        72,   72,   72,   72,   72,   72,   72,   72,   72,   72,
-       72,   72,   72,   72,   72,   72,   72,   72,   79,   79,
+       72,   72,   72,   72,   72,   72,   79,   79,   79,   79,
        79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,   79,   79,   79,   79,  104,
-      295,  129,  109,  357,  353,  352,  104,  351,  104,  104,
-      104,  104,  350,  349,  104,  104,  104,  104,  104,  104,
-      108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
+       79,   79,   79,   79,   79,   79,   79,  104,  335,  332,
 
+      331,  330,  329,  328,  104,  323,  104,  104,  104,  104,
+      322,  321,  104,  104,  104,  104,  104,  104,  108,  108,
       108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
-      108,  112,  348,  347,  346,  345,  112,  344,  112,  343,
-      112,  112,  112,  112,  112,  342,  112,  112,  112,  112,
-      112,  112,  116,  197,  335,  335,  262,  332,  329,  116,
-      328,  116,  116,  116,  116,  327,  326,  116,  116,  116,
-      116,  116,  116,  118,  325,  320,  118,  118,  319,  118,
-      118,  318,  118,  118,  118,  118,  317,  316,  118,  118,
-      118,  118,  118,  118,  128,  128,  315,  128,  314,  313,
-      312,  128,  164,  311,  310,  164,  164,  309,  164,  164,
-      308,  164,  164,  164,  164,  307,  306,  164,  164,  164,
-
-      164,  164,  164,  168,  305,  129,  168,  168,  121,  168,
-      168,  109,  168,  168,  168,  168,  109,  168,  168,  168,
-      283,  168,  168,  168,  176,  282,  281,  176,  280,  273,
-      176,  176,  272,  176,  176,  176,  176,  176,  271,  176,
-      176,  176,  176,  176,  176,  180,  180,  180,  180,  180,
-      180,  180,  180,  180,  180,  180,  180,  180,  180,  180,
-      180,  180,  180,  180,  180,  180,  182,  182,  270,  182,
-      269,  182,  182,  182,  182,  182,  182,  182,  182,  182,
-      182,  182,  182,  182,  182,  182,  182,  188,  861,  194,
-      262,  182,  188,  183,  188,  177,  188,  188,  188,  188,
-
-      188,  177,  188,  188,  188,  188,  188,  188,  192,  169,
-      260,  163,  163,  253,  252,  192,  251,  192,  192,  192,
-      192,  250,  192,  192,  192,  192,  192,  192,  192,  195,
-      249,  246,  195,  195,  245,  195,  195,  244,  195,  195,
-      195,  195,  243,  195,  195,  195,  195,  195,  195,  195,
-      216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
-      216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
-      216,  217,  217,  242,  217,  217,  217,  217,  217,  217,
+      108,  108,  108,  108,  108,  108,  108,  108,  108,  112,
+      320,  319,  318,  317,  112,  316,  112,  315,  112,  112,
+      112,  112,  112,  314,  112,  112,  112,  112,  112,  112,
+      116,  313,  312,  311,  310,  309,  308,  116,  307,  116,
+      116,  116,  116,  129,  121,  116,  116,  116,  116,  116,
+      116,  118,  109,  109,  118,  118,  285,  118,  118,  284,
+      118,  118,  118,  118,  283,  282,  118,  118,  118,  118,
+
+      118,  118,  128,  128,  275,  128,  274,  273,  272,  128,
+      165,  271,  867,  165,  165,  195,  165,  165,  264,  165,
+      165,  165,  165,  183,  184,  165,  165,  165,  165,  165,
+      165,  169,  178,  178,  169,  169,  170,  169,  169,  262,
+      169,  169,  169,  169,  164,  169,  169,  169,  164,  169,
+      169,  169,  177,  255,  254,  177,  253,  252,  177,  177,
+      251,  177,  177,  177,  177,  177,  248,  177,  177,  177,
+      177,  177,  177,  181,  181,  181,  181,  181,  181,  181,
+      181,  181,  181,  181,  181,  181,  181,  181,  181,  181,
+      181,  181,  181,  181,  183,  183,  247,  183,  246,  183,
+
+      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
+      183,  183,  183,  183,  183,  189,  245,  244,  243,  236,
+      189,  235,  189,  234,  189,  189,  189,  189,  189,  233,
+      189,  189,  189,  189,  189,  189,  193,  232,  231,  129,
+      104,  129,  197,  193,  117,  193,  193,  193,  193,  219,
+      193,  193,  193,  193,  193,  193,  193,  196,  109,  107,
+      196,  196,  106,  196,  196,  105,  196,  196,  196,  196,
+      214,  196,  196,  196,  196,  196,  196,  196,  217,  217,
       217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
-      217,  217,  119,  235,  234,  119,  119,  233,  119,  119,
-
-      232,  119,  119,  119,  119,  231,  230,  119,  119,  119,
-      119,  119,  119,  128,  128,  129,  128,  104,  129,  196,
-      128,  225,  225,  117,  225,  218,  109,  107,  225,  227,
-      227,  227,  106,  227,  105,  213,  212,  227,  164,  211,
-      210,  164,  164,  209,  164,  164,  204,  164,  164,  164,
-      164,  183,  177,  164,  164,  164,  164,  164,  164,  165,
-      169,  139,  165,  165,  136,  165,  165,  163,  165,  165,
-      165,  165,  162,  159,  165,  165,  165,  165,  165,  165,
-      168,  157,  143,  168,  168,  142,  168,  168,  141,  168,
-      168,  168,  168,  138,  168,  168,  168,  137,  168,  168,
-
-      168,  176,  131,  129,  176,  117,  107,  176,  176,  106,
-      176,  176,  176,  176,  176,  105,  176,  176,  176,  176,
-      176,  176,  182,  182,  861,  182,  861,  182,  182,  182,
-      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
-      182,  182,  182,  191,  861,  861,  861,  861,  861,  861,
-      191,  861,  191,  191,  191,  191,  861,  861,  191,  191,
-      191,  191,  191,  191,  192,  861,  861,  861,  861,  861,
-      861,  192,  861,  192,  192,  192,  192,  861,  192,  192,
-      192,  192,  192,  192,  192,  195,  861,  861,  195,  195,
-      861,  195,  195,  861,  195,  195,  195,  195,  861,  195,
-
-      195,  195,  195,  195,  195,  195,  206,  861,  861,  206,
-      206,  861,  206,  284,  284,  284,  284,  284,  284,  284,
-      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
-      284,  284,  284,  284,  291,  291,  861,  291,  861,  861,
-      861,  291,  297,  297,  297,  861,  297,  861,  861,  861,
-      297,  361,  361,  861,  361,  861,  861,  861,  361,  362,
-      362,  861,  362,  861,  861,  861,  362,  366,  366,  861,
-      366,  861,  861,  861,  366,  368,  368,  368,  861,  368,
-      861,  861,  861,  368,  206,  861,  861,  206,  206,  861,
-      206,  436,  436,  861,  436,  861,  861,  861,  436,  438,
-
-      438,  861,  438,  861,  861,  861,  438,  439,  439,  861,
-      439,  861,  861,  861,  439,  441,  441,  441,  861,  441,
-      861,  861,  861,  441,  445,  445,  445,  445,  861,  445,
-      861,  861,  861,  445,  505,  505,  861,  505,  861,  861,
-      861,  505,  506,  506,  861,  506,  861,  861,  861,  506,
-      507,  507,  861,  507,  861,  861,  861,  507,  519,  519,
-      519,  861,  519,  861,  861,  861,  519,  520,  520,  520,
-      520,  861,  520,  861,  861,  861,  520,  216,  216,  216,
-      216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
-      216,  216,  216,  216,  216,  216,  216,  216,  574,  574,
-
-      861,  574,  861,  861,  861,  574,  575,  575,  861,  575,
-      861,  861,  861,  575,  591,  591,  591,  861,  591,  861,
-      861,  861,  591,  592,  592,  592,  592,  861,  592,  861,
-      861,  861,  592,  216,  216,  216,  216,  216,  216,  216,
-      216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
-      216,  216,  216,  216,  206,  861,  861,  206,  206,  861,
-      206,  193,  861,  861,  861,  193,  193,  861,  193,  193,
-      193,  861,  861,  193,  193,  636,  636,  861,  636,  861,
-      861,  861,  636,  640,  861,  640,  640,  861,  640,  861,
-      861,  861,  640,  658,  658,  658,  861,  658,  861,  861,
-
-      861,  658,  659,  659,  659,  659,  861,  659,  861,  861,
-      861,  659,  603,  603,  861,  861,  603,  861,  861,  861,
-      603,  216,  216,  216,  216,  216,  216,  216,  216,  216,
-      216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
-      216,  216,  206,  861,  861,  206,  206,  861,  206,  193,
-      861,  861,  861,  193,  193,  861,  193,  193,  193,  861,
-      861,  193,  193,  703,  703,  861,  703,  861,  861,  861,
-      703,  704,  861,  704,  704,  861,  704,  861,  861,  861,
-      704,  720,  720,  720,  861,  720,  861,  861,  861,  720,
-      721,  721,  721,  861,  861,  721,  861,  861,  861,  721,
-
-      730,  730,  730,  730,  730,  730,  730,  730,  730,  730,
-      730,  730,  730,  730,  730,  730,  730,  730,  730,  730,
-      730,  735,  735,  861,  735,  735,  735,  861,  735,  861,
-      735,  735,  735,  735,  861,  861,  735,  735,  735,  735,
-      735,  735,  741,  741,  861,  741,  741,  741,  861,  741,
-      861,  741,  741,  741,  741,  861,  861,  741,  741,  741,
-      741,  741,  741,  206,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  206,  206,  861,  206,  206,  861,
-      206,  758,  758,  861,  758,  861,  861,  861,  758,  759,
-      861,  759,  759,  861,  759,  861,  861,  861,  759,  775,
-
-      775,  861,  861,  775,  861,  861,  861,  775,  741,  861,
-      861,  861,  861,  861,  861,  741,  861,  741,  741,  741,
-      741,  861,  861,  741,  741,  741,  741,  741,  741,  799,
-      799,  861,  799,  861,  861,  861,  799,  800,  861,  800,
-      800,  861,  800,  861,  861,  861,  800,  823,  823,  861,
-      823,  861,  861,  861,  823,  824,  861,  824,  861,  861,
-      824,  861,  861,  861,  824,  828,  828,  828,  828,  828,
-      828,  828,  828,  828,  828,  828,  828,  828,  828,  828,
-      828,  828,  828,  828,  828,  828,   15,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861
+      217,  217,  217,  217,  217,  217,  217,  217,  217,  218,
+
+      218,  213,  218,  218,  218,  218,  218,  218,  218,  218,
+      218,  218,  218,  218,  218,  218,  218,  218,  218,  218,
+      119,  212,  211,  119,  119,  210,  119,  119,  205,  119,
+      119,  119,  119,  184,  178,  119,  119,  119,  119,  119,
+      119,  128,  128,  170,  128,  139,  136,  164,  128,  226,
+      226,  163,  226,  160,  158,  142,  226,  228,  228,  228,
+      141,  228,  138,  137,  131,  228,  165,  129,  117,  165,
+      165,  107,  165,  165,  106,  165,  165,  165,  165,  105,
+      867,  165,  165,  165,  165,  165,  165,  166,  867,  867,
+      166,  166,  867,  166,  166,  867,  166,  166,  166,  166,
+
+      867,  867,  166,  166,  166,  166,  166,  166,  169,  867,
+      867,  169,  169,  867,  169,  169,  867,  169,  169,  169,
+      169,  867,  169,  169,  169,  867,  169,  169,  169,  177,
+      867,  867,  177,  867,  867,  177,  177,  867,  177,  177,
+      177,  177,  177,  867,  177,  177,  177,  177,  177,  177,
+      183,  183,  867,  183,  867,  183,  183,  183,  183,  183,
+      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
+      183,  192,  867,  867,  867,  867,  867,  867,  192,  867,
+      192,  192,  192,  192,  867,  867,  192,  192,  192,  192,
+      192,  192,  193,  867,  867,  867,  867,  867,  867,  193,
+
+      867,  193,  193,  193,  193,  867,  193,  193,  193,  193,
+      193,  193,  193,  196,  867,  867,  196,  196,  867,  196,
+      196,  867,  196,  196,  196,  196,  867,  196,  196,  196,
+      196,  196,  196,  196,  207,  867,  867,  207,  207,  867,
+      207,  286,  286,  286,  286,  286,  286,  286,  286,  286,
+      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
+      286,  286,  293,  293,  867,  293,  867,  867,  867,  293,
+      299,  299,  299,  867,  299,  867,  867,  867,  299,  364,
+      364,  867,  364,  867,  867,  867,  364,  365,  365,  867,
+      365,  867,  867,  867,  365,  369,  369,  867,  369,  867,
+
+      867,  867,  369,  371,  371,  371,  867,  371,  867,  867,
+      867,  371,  207,  867,  867,  207,  207,  867,  207,  440,
+      440,  867,  440,  867,  867,  867,  440,  442,  442,  867,
+      442,  867,  867,  867,  442,  443,  443,  867,  443,  867,
+      867,  867,  443,  445,  445,  445,  867,  445,  867,  867,
+      867,  445,  449,  449,  449,  449,  867,  449,  867,  867,
+      867,  449,  510,  510,  867,  510,  867,  867,  867,  510,
+      511,  511,  867,  511,  867,  867,  867,  511,  512,  512,
+      867,  512,  867,  867,  867,  512,  524,  524,  524,  867,
+      524,  867,  867,  867,  524,  525,  525,  525,  525,  867,
+
+      525,  867,  867,  867,  525,  217,  217,  217,  217,  217,
+      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
+      217,  217,  217,  217,  217,  217,  580,  580,  867,  580,
+      867,  867,  867,  580,  581,  581,  867,  581,  867,  867,
+      867,  581,  597,  597,  597,  867,  597,  867,  867,  867,
+      597,  598,  598,  598,  598,  867,  598,  867,  867,  867,
+      598,  217,  217,  217,  217,  217,  217,  217,  217,  217,
+      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
+      217,  217,  207,  867,  867,  207,  207,  867,  207,  194,
+      867,  867,  867,  194,  194,  867,  194,  194,  194,  867,
+
+      867,  194,  194,  642,  642,  867,  642,  867,  867,  867,
+      642,  646,  867,  646,  646,  867,  646,  867,  867,  867,
+      646,  664,  664,  664,  867,  664,  867,  867,  867,  664,
+      665,  665,  665,  665,  867,  665,  867,  867,  867,  665,
+      609,  609,  867,  867,  609,  867,  867,  867,  609,  217,
+      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
+      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
+      207,  867,  867,  207,  207,  867,  207,  194,  867,  867,
+      867,  194,  194,  867,  194,  194,  194,  867,  867,  194,
+      194,  709,  709,  867,  709,  867,  867,  867,  709,  710,
+
+      867,  710,  710,  867,  710,  867,  867,  867,  710,  726,
+      726,  726,  867,  726,  867,  867,  867,  726,  727,  727,
+      727,  867,  867,  727,  867,  867,  867,  727,  736,  736,
+      736,  736,  736,  736,  736,  736,  736,  736,  736,  736,
+      736,  736,  736,  736,  736,  736,  736,  736,  736,  741,
+      741,  867,  741,  741,  741,  867,  741,  867,  741,  741,
+      741,  741,  867,  867,  741,  741,  741,  741,  741,  741,
+      747,  747,  867,  747,  747,  747,  867,  747,  867,  747,
+      747,  747,  747,  867,  867,  747,  747,  747,  747,  747,
+      747,  207,  867,  867,  867,  867,  867,  867,  867,  867,
+
+      867,  867,  207,  207,  867,  207,  207,  867,  207,  764,
+      764,  867,  764,  867,  867,  867,  764,  765,  867,  765,
+      765,  867,  765,  867,  867,  867,  765,  781,  781,  867,
+      867,  781,  867,  867,  867,  781,  747,  867,  867,  867,
+      867,  867,  867,  747,  867,  747,  747,  747,  747,  867,
+      867,  747,  747,  747,  747,  747,  747,  805,  805,  867,
+      805,  867,  867,  867,  805,  806,  867,  806,  806,  867,
+      806,  867,  867,  867,  806,  829,  829,  867,  829,  867,
+      867,  867,  829,  830,  867,  830,  867,  867,  830,  867,
+      867,  867,  830,  834,  834,  834,  834,  834,  834,  834,
+
+      834,  834,  834,  834,  834,  834,  834,  834,  834,  834,
+      834,  834,  834,  834,   15,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867
     } ;
 
-static yyconst short int yy_chk[5659] =
+static yyconst short int yy_chk[5687] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1310,29 +1315,29 @@ static yyconst short int yy_chk[5659] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    2,   51,    3,   80,    2,   36,    3,   42,   37,
        54,    4,   37,    3,   52,    4,    3,   36,    5,    5,
-        5,    4,    5,   42,    4,   56,   74,   51,    5,   39,
+        5,    4,    5,   42,    4,   45,   93,   51,    5,   39,
 
-       22,    2,    2,   52,   39,   56,    2,  855,   54,   70,
-       70,    3,    5,    5,    2,    3,    3,    2,    3,    4,
-       22,   93,   74,    4,    4,   80,    4,    6,    6,    6,
-       76,    6,   93,   11,   11,   11,   11,    6,   81,    5,
+       22,    2,    2,   52,   39,  861,    2,   93,   54,   45,
+      129,    3,    5,    5,    2,    3,    3,    2,    3,    4,
+       22,  129,   56,    4,    4,   80,    4,    6,    6,    6,
+       74,    6,   56,   11,   11,   11,   11,    6,   76,    5,
         3,   12,   12,   12,   12,   27,   27,   22,    4,   27,
-       27,    6,    6,   78,   78,  103,   76,    9,    9,    9,
-        9,    9,   83,   83,  103,   83,    9,    9,    9,   27,
-       30,   30,   30,   30,   30,   30,   84,   48,    6,    7,
-        7,    7,    9,    7,   11,  155,   48,   81,   62,  129,
-       94,  157,   12,   94,   27,   48,   84,   62,  155,  322,
+       27,    6,    6,   70,   70,  161,   74,    9,    9,    9,
+        9,    9,   78,   78,   76,  161,    9,    9,    9,   27,
+       30,   30,   30,   30,   30,   30,   81,   48,    6,    7,
+        7,    7,    9,    7,   11,  147,   48,  147,   62,  103,
+       83,   83,   12,   83,   27,   48,   94,   62,  103,   94,
 
-      129,   10,   10,   10,   10,   10,   62,  157,    9,  112,
+      853,   10,   10,   10,   10,   10,   62,  852,    9,   84,
        10,   10,   10,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   84,   49,  146,   10,  146,  322,  112,
+       29,   29,   29,  148,   49,   81,   10,  288,  148,   84,
         7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
         7,    7,    7,    7,    7,    7,    7,    7,    7,    8,
-        8,    8,   10,    8,   49,   49,  112,  847,  160,   49,
-       89,   89,   89,   89,   89,   89,  354,   49,  160,  354,
+        8,    8,   10,    8,   49,   49,   84,  171,  171,   49,
+       89,   89,   89,   89,   89,   89,  288,   49,  175,  175,
        49,   88,   88,   88,   88,   88,   88,   88,   88,   88,
        88,  110,  110,  110,  110,  110,  110,  110,  110,  110,
-      110,  127,  127,  127,  127,  127,  127,  170,  170,  846,
+      110,  127,  127,  127,  127,  127,  127,  187,  187,  851,
 
         8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
         8,    8,    8,    8,    8,    8,    8,    8,    8,   13,
@@ -1343,586 +1348,589 @@ static yyconst short int yy_chk[5659] =
        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,
-       21,  147,  144,  144,  174,  174,  147,  167,  156,  154,
-
-       21,  158,  167,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   28,  158,   28,   28,   28,   28,   28,
-       28,   28,   28,   28,   28,   28,  186,  186,  286,   28,
-       28,   28,   28,   28,   28,  323,  184,   59,   59,  138,
-      138,   59,   59,  144,  156,  138,  138,  159,  257,  138,
-      248,  138,   28,  159,   28,   28,   28,   28,   28,   28,
-       34,   59,  154,  255,  248,  257,   34,  286,  255,   34,
-       34,  323,   34,   34,   34,   34,   34,   34,   34,   34,
-       34,   34,   34,   34,   34,   34,   59,  184,   34,   34,
+       21,  160,  145,  145,  260,  838,  260,  160,  157,  155,
+
+       21,  156,  185,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   28,  156,   28,   28,   28,   28,   28,
+       28,   28,   28,   28,   28,   28,  296,  296,  296,   28,
+       28,   28,   28,   28,   28,  159,  250,   59,   59,  138,
+      138,   59,   59,  145,  157,  138,  138,  158,  159,  138,
+      250,  138,   28,  185,   28,   28,   28,   28,   28,   28,
+       34,   59,  155,  158,  284,  284,   34,  284,  837,   34,
+       34,  336,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   59,  336,   34,   34,
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
 
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
        34,   38,   38,   38,   38,   38,   38,   38,   38,   38,
-       38,   38,  258,  254,  258,   38,   38,   38,   38,   38,
-       38,  259,  398,  181,  181,   38,  111,  111,  111,  111,
-      111,  111,  111,  111,  111,  111,  259,  261,  331,  331,
+       38,   38,  228,  256,  834,   38,   38,   38,   38,   38,
+       38,  259,  261,  228,  292,   38,  111,  111,  111,  111,
+      111,  111,  111,  111,  111,  111,  333,  261,  259,  831,
        38,   38,   38,   38,   38,   38,   46,   46,   46,   46,
-       46,  261,   46,   46,  845,  398,   46,  125,  125,  125,
-      125,  125,  125,  125,  125,  125,  125,  254,  185,  832,
-
-       46,   46,   46,   47,  181,   47,   47,   47,   47,   47,
-       47,   47,   47,   47,   47,   50,   68,   68,   68,  114,
-       68,  294,  294,  294,   68,   50,   68,  479,   50,   50,
-       50,   50,   50,   50,   50,   50,   50,   50,  148,  114,
-       68,   68,  282,  282,  479,  282,  105,  185,  105,  105,
-      105,   85,  105,  105,  188,  177,  105,   85,  177,  177,
-       85,  305,  330,   85,   85,  177,  114,   68,  148,  148,
-      105,  105,  105,  148,  188,   50,   69,   85,  309,   85,
-      177,  148,  308,  290,  148,  305,   69,  308,  227,   69,
-       69,   69,   69,   69,   69,   69,   69,   69,   69,  227,
-
-      324,  188,  309,   85,   85,   86,  324,  831,   86,   86,
-      290,   86,   86,   86,   86,  344,  297,   86,   86,  115,
-      344,  115,  115,  330,  334,  115,  115,  297,  400,  115,
-      334,   86,   86,   86,  126,  126,  126,  126,  126,  126,
-      126,  126,  126,  126,  115,  115,  162,  162,  162,  162,
-      162,  162,  162,  162,  162,  162,  828,   86,   86,   87,
-      333,  400,   87,   87,   87,   87,   87,   87,   87,   87,
-       87,   87,   87,   87,   87,   87,  333,  342,   87,   87,
+       46,  292,   46,   46,  334,  334,   46,  125,  125,  125,
+      125,  125,  125,  125,  125,  125,  125,  256,  186,  168,
+
+       46,   46,   46,   47,  168,   47,   47,   47,   47,   47,
+       47,   47,   47,   47,   47,   50,   68,   68,   68,  112,
+       68,  307,  114,  436,   68,   50,   68,  333,   50,   50,
+       50,   50,   50,   50,   50,   50,   50,   50,  257,  112,
+       68,   68,  114,  257,  484,  307,  105,  186,  105,  105,
+      105,   85,  105,  105,  402,  178,  105,   85,  178,  178,
+       85,  484,  436,   85,   85,  178,  112,   68,  189,  114,
+      105,  105,  105,  182,  182,   50,   69,   85,  310,   85,
+      178,  190,  311,  310,  326,  263,   69,  402,  189,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,  263,
+
+      479,  190,  347,   85,   85,   86,  311,  347,   86,   86,
+      479,   86,   86,   86,   86,  189,  299,   86,   86,  115,
+      326,  115,  115,  404,  182,  115,  115,  299,  190,  115,
+      403,   86,   86,   86,  126,  126,  126,  126,  126,  126,
+      126,  126,  126,  126,  115,  115,  163,  163,  163,  163,
+      163,  163,  163,  163,  163,  163,  404,   86,   86,   87,
+      562,  403,   87,   87,   87,   87,   87,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,  562,  345,   87,   87,
        87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
        87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
 
-       87,  342,  399,   87,   87,   87,   87,   87,   87,   87,
+       87,  345,  829,   87,   87,   87,   87,   87,   87,   87,
        87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
-       90,  345,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,  399,  567,  567,   90,   90,   90,   90,
-       90,   90,  368,  825,  117,  345,  117,  117,  117,  321,
-      117,  117,  321,  368,  117,  202,  202,  202,  202,  202,
-      202,   90,   90,   90,   90,   90,   90,   91,  117,  117,
+       90,  348,   90,   90,   90,   90,   90,   90,   90,   90,
+       90,   90,   90,  485,  573,  573,   90,   90,   90,   90,
+       90,   90,  371,  485,  117,  348,  117,  117,  117,  324,
+      117,  117,  324,  371,  117,  203,  203,  203,  203,  203,
+      203,   90,   90,   90,   90,   90,   90,   91,  117,  117,
       117,   91,   91,   91,   91,   91,   91,   91,   91,   91,
-       91,   91,   91,   91,  321,  381,   91,   91,   91,   91,
+       91,   91,   91,   91,  324,  384,   91,   91,   91,   91,
        91,   91,   91,   91,   91,   91,   91,   91,   91,   91,
 
-       91,   91,   91,   91,   91,   91,   91,   91,   91,  381,
+       91,   91,   91,   91,   91,   91,   91,   91,   91,  384,
        91,   91,   91,   91,   91,   91,   91,   91,   91,   91,
        91,   91,   91,   91,   91,   91,   91,   91,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,  406,
-      606,  606,   95,   95,   95,   95,   95,   95,  402,  823,
-      118,  118,   95,  402,  118,  118,  173,  173,  173,  173,
-      173,  173,  173,  173,  173,  173,  387,   95,   95,   95,
+       95,   95,   95,   95,   95,   95,   95,   95,   95,  611,
+      820,  611,   95,   95,   95,   95,   95,   95,  406,  482,
+      118,  118,   95,  406,  118,  118,  174,  174,  174,  174,
+      174,  174,  174,  174,  174,  174,  390,   95,   95,   95,
        95,   95,   95,  101,  118,  101,  101,  101,  101,  101,
-      101,  101,  101,  101,  101,  120,  189,  120,  120,  120,
-      387,  120,  120,  247,  247,  120,  247,  401,  474,  118,
+      101,  101,  101,  101,  101,  120,  819,  120,  120,  120,
+      390,  120,  120,  149,  327,  120,  212,  212,  325,  118,
 
-      222,  222,  222,  222,  222,  222,  189,  406,  474,  120,
+      327,  337,  212,  212,  482,  405,  212,  337,  212,  120,
       120,  120,  121,  121,  121,  121,  121,  121,  121,  121,
-      121,  121,  164,  164,  211,  211,  164,  164,  247,  814,
-      211,  211,  401,  189,  211,  480,  211,  166,  541,  166,
-      166,  166,  541,  166,  166,  480,  164,  166,  432,  121,
+      121,  121,  197,  149,  149,  411,  197,  325,  149,  542,
+      357,  545,  197,  357,  412,  542,  149,  165,  165,  149,
+      405,  165,  165,  545,  818,  412,  197,  197,  411,  121,
       122,  122,  122,  122,  122,  122,  122,  122,  122,  122,
-      536,  166,  166,  166,  122,  122,  122,  122,  122,  122,
-      536,  164,  197,  197,  197,  197,  197,  197,  197,  197,
-      197,  197,  289,  289,  289,  289,  605,  432,  605,  122,
+      615,  165,  615,  465,  122,  122,  122,  122,  122,  122,
+      198,  198,  198,  198,  198,  198,  198,  198,  198,  198,
+      223,  223,  223,  223,  223,  223,  165,  465,  699,  122,
       122,  122,  122,  122,  122,  130,  130,  130,  130,  130,
 
-      130,  130,  130,  130,  130,  130,  332,  813,  407,  130,
-      130,  130,  130,  130,  130,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,  301,  301,  301,  301,  301,
-      301,  407,  554,  332,  130,  130,  130,  130,  130,  130,
+      130,  130,  130,  130,  130,  130,  335,  809,  465,  130,
+      130,  130,  130,  130,  130,  201,  201,  201,  201,  201,
+      201,  201,  201,  201,  201,  249,  249,  699,  249,  291,
+      291,  291,  291,  335,  130,  130,  130,  130,  130,  130,
       131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  332,  370,  370,  131,  131,  131,  131,  131,  131,
-      190,  408,  190,  190,  370,  192,  190,  190,  409,  477,
-      190,  192,  408,  409,  192,  372,  372,  192,  192,  131,
-      131,  131,  131,  131,  131,  190,  190,  372,  554,  459,
-      196,  192,  441,  192,  196,  194,  812,  194,  194,  194,
-
-      196,  194,  194,  441,  339,  194,  339,  339,  339,  339,
-      339,  339,  445,  459,  196,  196,  478,  192,  192,  194,
-      194,  194,  195,  445,  477,  195,  195,  478,  195,  195,
-      195,  195,  459,  803,  195,  195,  201,  201,  201,  201,
-      201,  201,  201,  201,  201,  201,  802,  460,  195,  195,
-      195,  218,  218,  218,  218,  218,  218,  218,  218,  218,
-      218,  219,  219,  219,  219,  219,  219,  219,  219,  219,
-      219,  460,  556,  800,  195,  195,  198,  198,  198,  198,
-      198,  198,  198,  198,  198,  198,  661,  661,  556,  460,
-      198,  198,  198,  198,  198,  198,  221,  221,  221,  221,
-
-      221,  221,  221,  221,  221,  221,  378,  378,  378,  378,
-      378,  378,  446,  446,  462,  198,  198,  198,  198,  198,
-      198,  203,  662,  662,  446,  203,  203,  203,  203,  203,
-      203,  203,  203,  203,  203,  203,  203,  203,  462,  465,
-      203,  203,  203,  203,  203,  203,  203,  203,  203,  203,
-      203,  203,  203,  203,  203,  203,  203,  203,  203,  203,
-      203,  203,  203,  465,  203,  203,  203,  203,  203,  203,
-      203,  203,  203,  203,  203,  203,  203,  203,  203,  203,
-      203,  203,  204,  204,  204,  204,  204,  204,  204,  204,
-      204,  204,  204,  799,  466,  461,  204,  204,  204,  204,
-
-      204,  204,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  573,  573,  573,  573,  447,  447,  466,  461,
-      463,  204,  204,  204,  204,  204,  204,  220,  447,  220,
-      220,  220,  220,  220,  220,  220,  220,  220,  220,  260,
-      461,  467,  466,  260,  463,  551,  671,  671,  540,  260,
-      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
-      540,  463,  551,  260,  260,  467,  220,  223,  519,  223,
-      223,  223,  223,  223,  223,  223,  223,  223,  223,  519,
-      797,  467,  468,  223,  223,  223,  223,  223,  223,  335,
-      335,  335,  335,  335,  335,  335,  335,  335,  335,  455,
-
-      455,  455,  455,  455,  455,  796,  468,  570,  223,  223,
-      223,  223,  223,  223,  226,  226,  226,  226,  226,  226,
-      226,  226,  226,  226,  226,  469,  486,  489,  226,  226,
-      226,  226,  226,  226,  369,  369,  369,  369,  369,  369,
-      369,  369,  369,  369,  609,  570,  609,  491,  492,  469,
-      486,  489,  491,  226,  226,  226,  226,  226,  226,  228,
-      228,  228,  228,  228,  228,  228,  228,  228,  228,  228,
-      228,  616,  492,  616,  228,  228,  228,  228,  228,  228,
-      371,  371,  371,  371,  371,  371,  371,  371,  371,  371,
-      485,  795,  485,  485,  485,  485,  485,  485,  785,  228,
-
-      228,  228,  228,  228,  228,  229,  229,  229,  229,  229,
-      229,  229,  229,  229,  229,  229,  495,  496,  533,  229,
-      229,  229,  229,  229,  229,  375,  375,  375,  375,  375,
-      375,  375,  375,  537,  635,  635,  635,  375,  538,  537,
-      495,  496,  533,  784,  229,  229,  229,  229,  229,  229,
-      230,  230,  230,  230,  230,  230,  230,  230,  230,  230,
-      230,  668,  538,  668,  230,  230,  230,  230,  230,  230,
-      377,  377,  377,  377,  377,  377,  377,  377,  377,  377,
-      435,  775,  435,  435,  435,  435,  435,  435,  773,  230,
-      230,  230,  230,  230,  230,  265,  543,  265,  265,  265,
-
-      265,  265,  265,  265,  265,  265,  265,  266,  266,  266,
-      266,  266,  266,  266,  266,  266,  266,  266,  772,  435,
-      543,  266,  266,  266,  266,  266,  266,  448,  448,  448,
-      448,  448,  448,  448,  448,  448,  448,  504,  504,  504,
-      504,  504,  504,  679,  679,  771,  266,  266,  266,  266,
-      266,  266,  268,  268,  268,  268,  268,  268,  268,  268,
-      268,  268,  449,  449,  547,  759,  268,  268,  268,  268,
-      268,  268,  520,  557,  449,  452,  452,  452,  452,  452,
-      452,  452,  452,  520,  545,  722,  722,  452,  547,  545,
-      557,  268,  268,  268,  268,  268,  268,  285,  285,  285,
-
-      285,  285,  285,  285,  285,  285,  285,  454,  454,  454,
-      454,  454,  454,  454,  454,  454,  454,  481,  481,  481,
-      481,  481,  481,  481,  481,  481,  481,  511,  511,  511,
-      511,  511,  511,  758,  285,  293,  293,  293,  293,  293,
-      293,  293,  293,  293,  293,  293,  299,  299,  299,  299,
-      299,  299,  299,  299,  299,  299,  299,  299,  299,  549,
-      680,  566,  299,  299,  299,  299,  299,  299,  503,  503,
-      503,  503,  503,  503,  503,  503,  503,  503,  566,  608,
-      756,  464,  666,  549,  608,  666,  755,  299,  299,  299,
-      299,  299,  299,  302,  302,  302,  302,  302,  302,  302,
-
-      302,  302,  302,  302,  302,  464,  521,  521,  302,  302,
-      302,  302,  302,  302,  672,  748,  607,  464,  521,  672,
-      680,  746,  464,  508,  508,  508,  508,  508,  508,  508,
-      508,  508,  508,  302,  302,  302,  302,  302,  302,  303,
-      607,  303,  303,  303,  303,  303,  303,  303,  303,  303,
-      303,  340,  340,  340,  340,  340,  340,  340,  340,  340,
-      340,  745,  727,  607,  727,  340,  340,  340,  340,  340,
-      340,  510,  510,  510,  510,  510,  510,  510,  510,  510,
-      510,  518,  610,  518,  518,  518,  518,  518,  518,  693,
-      340,  340,  340,  340,  340,  340,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  610,  744,  629,  630,
-      341,  341,  341,  341,  341,  341,  514,  514,  514,  514,
-      514,  514,  514,  514,  514,  514,  728,  728,  693,  610,
-      522,  522,  629,  630,  741,  341,  341,  341,  341,  341,
-      341,  358,  522,  358,  358,  358,  358,  358,  358,  358,
-      358,  358,  358,  359,  577,  359,  359,  359,  359,  359,
-      359,  359,  359,  359,  359,  360,  577,  360,  360,  360,
-      360,  360,  360,  360,  360,  360,  360,  363,  363,  363,
-      363,  363,  363,  363,  363,  363,  363,  363,  373,  373,
-      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
-
-      373,  615,  615,  611,  373,  373,  373,  373,  373,  373,
-      523,  523,  523,  523,  523,  523,  523,  523,  523,  523,
-      530,  530,  530,  530,  530,  530,  779,  611,  779,  373,
-      373,  373,  373,  373,  373,  376,  376,  376,  376,  376,
-      376,  376,  376,  376,  376,  376,  376,  376,  524,  524,
-      611,  376,  376,  376,  376,  376,  376,  615,  579,  542,
-      524,  527,  527,  527,  527,  527,  527,  527,  527,  542,
-      579,  669,  667,  527,  731,  731,  376,  376,  376,  376,
-      376,  376,  379,  379,  379,  379,  379,  379,  379,  379,
-      379,  379,  379,  379,  739,  669,  667,  379,  379,  379,
-
-      379,  379,  379,  529,  529,  529,  529,  529,  529,  529,
-      529,  529,  529,  696,  696,  696,  696,  673,  546,  667,
-      781,  781,  379,  379,  379,  379,  379,  379,  380,  546,
-      380,  380,  380,  380,  380,  380,  380,  380,  380,  380,
-      412,  673,  412,  412,  412,  412,  412,  412,  412,  412,
-      412,  412,  413,  413,  413,  413,  413,  413,  413,  413,
-      413,  413,  555,  733,  734,  675,  413,  413,  413,  413,
-      413,  413,  555,  576,  576,  576,  576,  576,  576,  576,
-      576,  576,  576,  585,  585,  585,  585,  585,  585,  675,
-      730,  413,  413,  413,  413,  413,  413,  431,  431,  431,
-
-      431,  431,  431,  431,  431,  431,  431,  578,  578,  578,
-      578,  578,  578,  578,  578,  578,  578,  582,  641,  582,
-      582,  582,  582,  582,  582,  591,  810,  810,  733,  582,
-      641,  697,  681,  790,  431,  433,  591,  433,  433,  433,
-      433,  433,  433,  433,  433,  433,  433,  434,  681,  434,
-      434,  434,  434,  434,  434,  434,  434,  434,  434,  440,
-      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
-      697,  678,  790,  440,  440,  440,  440,  440,  440,  584,
-      584,  584,  584,  584,  584,  584,  584,  584,  584,  806,
-      806,  806,  806,  678,  592,  678,  678,  729,  440,  440,
-
-      440,  440,  440,  440,  444,  592,  444,  444,  444,  444,
-      444,  444,  444,  444,  444,  444,  450,  450,  450,  450,
-      450,  450,  450,  450,  450,  450,  450,  450,  450,  593,
-      593,  688,  450,  450,  450,  450,  450,  450,  594,  594,
-      642,  593,  596,  596,  602,  602,  602,  602,  602,  602,
-      594,  723,  642,  691,  596,  688,  721,  450,  450,  450,
-      450,  450,  450,  453,  453,  453,  453,  453,  453,  453,
-      453,  453,  453,  453,  453,  453,  902,  691,  902,  453,
-      453,  453,  453,  453,  453,  599,  599,  599,  599,  599,
-      599,  599,  599,  829,  829,  691,  718,  599,  650,  650,
-
-      650,  650,  650,  650,  453,  453,  453,  453,  453,  453,
-      456,  456,  456,  456,  456,  456,  456,  456,  456,  456,
-      456,  456,  617,  717,  690,  456,  456,  456,  456,  456,
-      456,  601,  601,  601,  601,  601,  601,  601,  601,  601,
-      601,  875,  875,  875,  617,  644,  617,  617,  690,  689,
-      456,  456,  456,  456,  456,  456,  457,  644,  457,  457,
-      457,  457,  457,  457,  457,  457,  457,  457,  458,  458,
-      690,  617,  872,  689,  458,  872,  884,  458,  458,  884,
-      458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
-      458,  458,  458,  458,  689,  704,  458,  458,  458,  458,
+      131,  335,  410,  557,  131,  131,  131,  131,  131,  131,
+      249,  167,  546,  167,  167,  167,  546,  167,  167,  808,
+      557,  167,  303,  303,  303,  303,  303,  303,  445,  131,
+      131,  131,  131,  131,  131,  167,  167,  167,  191,  445,
+      191,  191,  449,  193,  191,  191,  373,  373,  191,  193,
+
+      375,  375,  193,  449,  413,  193,  193,  262,  373,  413,
+      496,  262,  375,  191,  191,  496,  806,  262,  560,  193,
+      410,  193,  576,  195,  805,  195,  195,  195,  466,  195,
+      195,  262,  262,  195,  202,  202,  202,  202,  202,  202,
+      202,  202,  202,  202,  483,  193,  193,  195,  195,  195,
+      196,  541,  466,  196,  196,  483,  196,  196,  196,  196,
+      576,  541,  196,  196,  219,  219,  219,  219,  219,  219,
+      219,  219,  219,  219,  560,  464,  196,  196,  196,  220,
+      220,  220,  220,  220,  220,  220,  220,  220,  220,  222,
+      222,  222,  222,  222,  222,  222,  222,  222,  222,  464,
+
+      612,  612,  196,  196,  199,  199,  199,  199,  199,  199,
+      199,  199,  199,  199,  622,  803,  622,  464,  199,  199,
+      199,  199,  199,  199,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  342,  563,  342,  342,  342,  342,
+      342,  342,  469,  199,  199,  199,  199,  199,  199,  204,
+      667,  667,  563,  204,  204,  204,  204,  204,  204,  204,
+      204,  204,  204,  204,  204,  204,  469,  472,  204,  204,
+      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
+      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
+      204,  472,  204,  204,  204,  204,  204,  204,  204,  204,
 
-      458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
-      458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
-      458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
-      458,  458,  458,  458,  458,  458,  458,  458,  458,  502,
-      502,  502,  502,  502,  502,  502,  502,  502,  502,  502,
-      619,  619,  619,  619,  619,  619,  619,  619,  619,  619,
-      623,  623,  623,  623,  623,  623,  623,  633,  633,  633,
-      633,  633,  633,  633,  633,  633,  633,  502,  509,  705,
-      509,  509,  509,  509,  509,  509,  509,  509,  509,  509,
-      509,  705,  931,  931,  509,  509,  509,  509,  509,  509,
-
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      657,  703,  657,  657,  657,  657,  657,  657,  701,  509,
-      509,  509,  509,  509,  509,  512,  512,  512,  512,  512,
-      512,  512,  512,  512,  512,  512,  700,  724,  749,  512,
-      512,  512,  512,  512,  512,  643,  643,  643,  643,  643,
-      643,  643,  643,  643,  643,  687,  699,  687,  687,  687,
-      658,  724,  749,  685,  512,  512,  512,  512,  512,  512,
-      513,  658,  513,  513,  513,  513,  513,  513,  513,  513,
-      513,  513,  525,  525,  525,  525,  525,  525,  525,  525,
-      525,  525,  525,  525,  525,  726,  932,  932,  525,  525,
-
-      525,  525,  525,  525,  647,  706,  647,  647,  647,  647,
-      647,  647,  892,  892,  892,  684,  647,  706,  682,  726,
-      682,  682,  682,  525,  525,  525,  525,  525,  525,  528,
-      528,  528,  528,  528,  528,  528,  528,  528,  528,  528,
-      528,  528,  726,  943,  943,  528,  528,  528,  528,  528,
-      528,  649,  649,  649,  649,  649,  649,  649,  649,  649,
-      649,  665,  665,  665,  665,  665,  665,  665,  665,  682,
-      528,  528,  528,  528,  528,  528,  531,  531,  531,  531,
-      531,  531,  531,  531,  531,  531,  531,  776,  677,  778,
-      750,  531,  531,  531,  531,  531,  531,  653,  653,  653,
-
-      653,  653,  653,  653,  653,  653,  653,  903,  914,  903,
-      914,  776,  659,  778,  750,  787,  531,  531,  531,  531,
-      531,  531,  532,  659,  532,  532,  532,  532,  532,  532,
-      532,  532,  532,  532,  535,  750,  778,  962,  962,  787,
-      535,  740,  740,  535,  535,  740,  535,  535,  535,  535,
-      535,  535,  535,  535,  535,  535,  535,  535,  535,  740,
-      740,  740,  535,  535,  535,  535,  535,  535,  535,  535,
-      535,  535,  535,  535,  535,  535,  535,  535,  535,  535,
-      535,  535,  535,  535,  535,  535,  535,  535,  535,  535,
-      535,  535,  535,  535,  535,  535,  535,  535,  535,  535,
-
-      535,  535,  535,  535,  535,  560,  560,  560,  560,  560,
-      560,  560,  560,  560,  560,  560,  563,  963,  963,  708,
-      563,  563,  563,  563,  563,  563,  563,  563,  563,  563,
-      563,  708,  563,  656,  807,  563,  563,  563,  563,  563,
-      563,  563,  563,  563,  563,  563,  563,  563,  563,  563,
-      563,  563,  563,  563,  563,  563,  563,  563,  807,  563,
-      563,  563,  563,  563,  563,  563,  563,  563,  563,  563,
-      563,  563,  563,  563,  563,  563,  563,  569,  569,  569,
-      569,  569,  569,  569,  569,  569,  569,  660,  660,  683,
-      655,  683,  683,  683,  915,  919,  915,  919,  760,  660,
-
-      698,  698,  698,  698,  698,  698,  698,  698,  698,  698,
-      760,  654,  640,  835,  569,  571,  571,  571,  571,  571,
-      571,  571,  571,  571,  571,  571,  702,  816,  702,  702,
-      702,  702,  702,  702,  714,  714,  714,  714,  714,  714,
-      683,  707,  707,  707,  707,  707,  707,  707,  707,  707,
-      707,  816,  835,  571,  580,  638,  580,  580,  580,  580,
-      580,  580,  580,  580,  580,  580,  580,  583,  761,  583,
-      583,  583,  583,  583,  583,  583,  583,  583,  583,  583,
-      761,  751,  826,  583,  583,  583,  583,  583,  583,  711,
-      637,  711,  711,  711,  711,  711,  711,  920,  636,  920,
-
-      735,  711,  735,  735,  735,  751,  826,  628,  583,  583,
-      583,  583,  583,  583,  586,  586,  586,  586,  586,  586,
-      586,  586,  586,  586,  586,  627,  625,  751,  586,  586,
-      586,  586,  586,  586,  713,  713,  713,  713,  713,  713,
-      713,  713,  713,  713,  924,  927,  924,  927,  937,  720,
-      937,  735,  624,  586,  586,  586,  586,  586,  586,  587,
-      720,  587,  587,  587,  587,  587,  587,  587,  587,  587,
-      587,  590,  622,  590,  590,  590,  590,  590,  590,  590,
-      590,  590,  590,  597,  597,  597,  597,  597,  597,  597,
-      597,  597,  597,  597,  597,  597,  621,  788,  809,  597,
-
-      597,  597,  597,  597,  597,  736,  620,  736,  736,  736,
-      737,  763,  737,  737,  737,  738,  618,  738,  738,  738,
-      614,  788,  809,  763,  597,  597,  597,  597,  597,  597,
-      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
-      600,  600,  788,  801,  613,  809,  600,  600,  600,  600,
-      600,  600,  938,  612,  938,  801,  736,  946,  947,  946,
-      947,  737,  950,  956,  950,  956,  738,  957,  959,  957,
-      959,  600,  600,  600,  600,  600,  600,  603,  595,  603,
-      603,  603,  603,  603,  603,  603,  603,  603,  603,  604,
-      742,  589,  742,  742,  742,  604,  742,  742,  604,  604,
-
-      742,  604,  604,  604,  604,  604,  604,  604,  604,  604,
-      604,  604,  604,  604,  742,  742,  742,  604,  604,  604,
-      604,  604,  604,  604,  604,  604,  604,  604,  604,  604,
-      604,  604,  604,  604,  604,  604,  604,  604,  604,  604,
-      604,  604,  604,  604,  604,  604,  604,  604,  604,  604,
-      604,  604,  604,  604,  604,  604,  604,  604,  604,  604,
-      626,  747,  588,  747,  747,  747,  747,  747,  747,  626,
-      967,  575,  967,  626,  626,  626,  626,  626,  626,  626,
-      626,  626,  626,  626,  626,  626,  574,  568,  626,  626,
-      626,  626,  626,  626,  626,  626,  626,  626,  626,  626,
-
-      626,  626,  626,  626,  626,  626,  626,  626,  626,  626,
-      626,  565,  626,  626,  626,  626,  626,  626,  626,  626,
-      626,  626,  626,  626,  626,  626,  626,  626,  626,  626,
-      632,  564,  632,  632,  632,  632,  632,  632,  632,  632,
-      632,  632,  743,  743,  743,  743,  743,  743,  743,  743,
-      743,  743,  762,  762,  762,  762,  762,  762,  762,  762,
-      762,  762,  769,  769,  769,  769,  769,  769,  965,  632,
-      639,  965,  639,  639,  639,  639,  639,  639,  639,  639,
-      639,  639,  645,  562,  645,  645,  645,  645,  645,  645,
-      645,  645,  645,  645,  645,  648,  561,  648,  648,  648,
-
-      648,  648,  648,  648,  648,  648,  648,  648,  968,  559,
-      968,  648,  648,  648,  648,  648,  648,  766,  558,  766,
-      766,  766,  766,  766,  766,  971,  553,  971,  798,  766,
-      798,  798,  798,  798,  798,  798,  648,  648,  648,  648,
-      648,  648,  651,  651,  651,  651,  651,  651,  651,  651,
-      651,  651,  651,  972,  552,  972,  651,  651,  651,  651,
-      651,  651,  768,  768,  768,  768,  768,  768,  768,  768,
-      768,  768,  774,  774,  774,  774,  774,  774,  774,  517,
-      516,  651,  651,  651,  651,  651,  651,  652,  515,  652,
-      652,  652,  652,  652,  652,  652,  652,  652,  652,  663,
-
-      663,  663,  663,  663,  663,  663,  663,  663,  663,  663,
-      663,  686,  507,  686,  686,  686,  686,  686,  686,  686,
-      686,  686,  686,  692,  692,  692,  692,  692,  692,  692,
-      692,  692,  692,  782,  782,  782,  782,  782,  782,  782,
-      782,  782,  782,  783,  783,  783,  783,  783,  783,  783,
-      783,  783,  783,  842,  842,  842,  842,  842,  842,  506,
-      692,  694,  505,  694,  694,  694,  694,  694,  694,  694,
-      694,  694,  694,  977,  501,  977,  793,  494,  793,  793,
-      793,  793,  793,  793,  794,  794,  794,  794,  794,  794,
-      794,  794,  794,  794,  860,  860,  860,  860,  860,  860,
-
-      694,  709,  493,  709,  709,  709,  709,  709,  709,  709,
-      709,  709,  709,  709,  712,  793,  712,  712,  712,  712,
-      712,  712,  712,  712,  712,  712,  712,  978,  490,  978,
-      712,  712,  712,  712,  712,  712,  811,  811,  811,  811,
-      811,  811,  811,  811,  811,  811,  815,  488,  815,  815,
-      815,  815,  815,  815,  487,  712,  712,  712,  712,  712,
-      712,  715,  715,  715,  715,  715,  715,  715,  715,  715,
-      715,  484,  483,  482,  476,  715,  715,  715,  715,  715,
-      715,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  838,  475,  838,  838,  838,  838,  838,  838,  473,
-
-      715,  715,  715,  715,  715,  715,  716,  472,  716,  716,
-      716,  716,  716,  716,  716,  716,  716,  716,  719,  719,
-      719,  719,  719,  719,  719,  719,  719,  719,  719,  752,
-      838,  752,  752,  752,  752,  752,  752,  752,  752,  752,
-      752,  753,  471,  753,  753,  753,  753,  753,  753,  753,
-      753,  753,  753,  754,  470,  754,  754,  754,  754,  754,
-      754,  754,  754,  754,  754,  757,  443,  757,  757,  757,
-      757,  757,  757,  757,  757,  757,  757,  764,  442,  764,
-      764,  764,  764,  764,  764,  764,  764,  764,  764,  764,
-      767,  439,  767,  767,  767,  767,  767,  767,  767,  767,
-
-      767,  767,  438,  437,  436,  430,  767,  767,  767,  767,
-      767,  767,  821,  821,  821,  821,  821,  821,  821,  821,
-      821,  821,  848,  429,  848,  848,  848,  848,  848,  848,
-      428,  767,  767,  767,  767,  767,  767,  770,  427,  770,
-      770,  770,  770,  770,  770,  770,  770,  770,  770,  786,
-      426,  786,  786,  786,  786,  786,  786,  786,  786,  786,
-      786,  789,  425,  789,  789,  789,  789,  789,  789,  789,
-      789,  789,  789,  791,  424,  791,  791,  791,  791,  791,
-      791,  791,  791,  791,  791,  792,  423,  792,  792,  792,
-      792,  792,  792,  792,  792,  792,  792,  804,  422,  804,
-
-      804,  804,  804,  804,  804,  804,  804,  804,  804,  817,
-      421,  817,  817,  817,  817,  817,  817,  817,  817,  817,
-      817,  818,  420,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  819,  419,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  822,  822,  822,  822,  822,
-      822,  822,  822,  822,  822,  833,  418,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  834,  417,  834,
-      834,  834,  834,  834,  834,  834,  834,  834,  834,  836,
-      416,  836,  836,  836,  836,  836,  836,  836,  836,  836,
-      836,  837,  415,  837,  837,  837,  837,  837,  837,  837,
-
-      837,  837,  837,  840,  840,  840,  840,  840,  840,  840,
-      840,  840,  840,  841,  841,  841,  841,  841,  841,  841,
-      841,  841,  841,  844,  844,  844,  844,  844,  844,  844,
-      844,  844,  844,  849,  849,  849,  849,  849,  849,  849,
-      849,  849,  849,  852,  852,  852,  852,  852,  852,  852,
-      852,  852,  852,  853,  853,  853,  853,  853,  853,  853,
-      853,  853,  853,  857,  857,  857,  857,  857,  857,  414,
-      849,  850,  850,  850,  850,  850,  850,  850,  850,  850,
-      850,  854,  854,  854,  854,  854,  854,  854,  854,  854,
-      854,  976,  411,  410,  976,  405,  404,  403,  976,  397,
-
-      857,  395,  394,  393,  392,  391,  390,  389,  850,  851,
-      851,  851,  851,  851,  851,  851,  851,  851,  851,  859,
-      859,  859,  859,  859,  859,  859,  859,  859,  859,  386,
-      385,  384,  383,  367,  366,  365,  364,  362,  361,  357,
-      356,  355,  353,  352,  351,  350,  851,  856,  856,  856,
-      856,  856,  856,  856,  856,  856,  856,  349,  348,  347,
-      346,  343,  338,  337,  336,  329,  328,  327,  326,  325,
-      319,  317,  316,  315,  314,  313,  312,  311,  310,  307,
-      306,  304,  296,  295,  856,  862,  862,  862,  862,  862,
-      862,  862,  862,  862,  862,  862,  862,  862,  862,  862,
-
-      862,  862,  862,  862,  862,  862,  863,  863,  863,  863,
-      863,  863,  863,  863,  863,  863,  863,  863,  863,  863,
-      863,  863,  863,  863,  863,  863,  863,  864,  864,  864,
-      864,  864,  864,  864,  864,  864,  864,  864,  864,  864,
-      864,  864,  864,  864,  864,  864,  864,  864,  865,  865,
-      865,  865,  865,  865,  865,  865,  865,  865,  865,  865,
-      865,  865,  865,  865,  865,  865,  865,  865,  865,  866,
-      292,  291,  284,  283,  281,  280,  866,  279,  866,  866,
-      866,  866,  278,  277,  866,  866,  866,  866,  866,  866,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
+      205,  802,  473,  491,  205,  205,  205,  205,  205,  205,
+      302,  302,  302,  302,  302,  302,  302,  302,  302,  302,
+      381,  381,  381,  381,  381,  381,  473,  491,  801,  205,
+      205,  205,  205,  205,  205,  221,  791,  221,  221,  221,
+      221,  221,  221,  221,  221,  221,  221,  338,  338,  338,
+      338,  338,  338,  338,  338,  338,  338,  372,  372,  372,
+      372,  372,  372,  372,  372,  372,  372,  459,  459,  459,
+      459,  459,  459,  672,  221,  224,  672,  224,  224,  224,
+
+      224,  224,  224,  224,  224,  224,  224,  470,  494,  497,
+      463,  224,  224,  224,  224,  224,  224,  374,  374,  374,
+      374,  374,  374,  374,  374,  374,  374,  641,  641,  641,
+      467,  470,  494,  497,  463,  790,  224,  224,  224,  224,
+      224,  224,  227,  227,  227,  227,  227,  227,  227,  227,
+      227,  227,  227,  463,  467,  470,  227,  227,  227,  227,
+      227,  227,  378,  378,  378,  378,  378,  378,  378,  378,
+      674,  467,  674,  490,  378,  490,  490,  490,  490,  490,
+      490,  227,  227,  227,  227,  227,  227,  229,  229,  229,
+      229,  229,  229,  229,  229,  229,  229,  229,  229,  621,
+
+      621,  781,  229,  229,  229,  229,  229,  229,  380,  380,
+      380,  380,  380,  380,  380,  380,  380,  380,  439,  779,
+      439,  439,  439,  439,  439,  439,  778,  229,  229,  229,
+      229,  229,  229,  230,  230,  230,  230,  230,  230,  230,
+      230,  230,  230,  230,  450,  450,  777,  230,  230,  230,
+      230,  230,  230,  451,  451,  621,  450,  439,  453,  453,
+      524,  668,  668,  550,  614,  451,  474,  500,  550,  614,
+      453,  524,  230,  230,  230,  230,  230,  230,  231,  231,
+      231,  231,  231,  231,  231,  231,  231,  231,  231,  501,
+      474,  500,  231,  231,  231,  231,  231,  231,  452,  452,
+
+      452,  452,  452,  452,  452,  452,  452,  452,  677,  677,
+      678,  474,  733,  501,  733,  678,  765,  231,  231,  231,
+      231,  231,  231,  267,  471,  267,  267,  267,  267,  267,
+      267,  267,  267,  267,  267,  268,  268,  268,  268,  268,
+      268,  268,  268,  268,  268,  268,  572,  764,  471,  268,
+      268,  268,  268,  268,  268,  456,  456,  456,  456,  456,
+      456,  456,  456,  572,  471,  762,  538,  456,  509,  509,
+      509,  509,  509,  509,  268,  268,  268,  268,  268,  268,
+      270,  270,  270,  270,  270,  270,  270,  270,  270,  270,
+      538,  685,  685,  761,  270,  270,  270,  270,  270,  270,
 
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  868,  276,  275,  274,  273,  868,  272,  868,  271,
-      868,  868,  868,  868,  868,  270,  868,  868,  868,  868,
-      868,  868,  869,  267,  264,  263,  262,  256,  253,  869,
-      252,  869,  869,  869,  869,  251,  250,  869,  869,  869,
-      869,  869,  869,  870,  249,  246,  870,  870,  245,  870,
-      870,  244,  870,  870,  870,  870,  243,  242,  870,  870,
-      870,  870,  870,  870,  871,  871,  241,  871,  240,  239,
-      238,  871,  873,  237,  236,  873,  873,  235,  873,  873,
-      234,  873,  873,  873,  873,  233,  232,  873,  873,  873,
-
-      873,  873,  873,  874,  231,  225,  874,  874,  224,  874,
-      874,  217,  874,  874,  874,  874,  216,  874,  874,  874,
-      215,  874,  874,  874,  876,  214,  213,  876,  212,  210,
-      876,  876,  209,  876,  876,  876,  876,  876,  208,  876,
-      876,  876,  876,  876,  876,  877,  877,  877,  877,  877,
-      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
-      877,  877,  877,  877,  877,  877,  878,  878,  207,  878,
-      205,  878,  878,  878,  878,  878,  878,  878,  878,  878,
-      878,  878,  878,  878,  878,  878,  878,  879,  199,  191,
-      187,  183,  879,  182,  879,  180,  879,  879,  879,  879,
-
-      879,  176,  879,  879,  879,  879,  879,  879,  880,  169,
-      165,  163,  161,  153,  152,  880,  151,  880,  880,  880,
-      880,  150,  880,  880,  880,  880,  880,  880,  880,  881,
-      149,  143,  881,  881,  142,  881,  881,  141,  881,  881,
-      881,  881,  140,  881,  881,  881,  881,  881,  881,  881,
-      882,  882,  882,  882,  882,  882,  882,  882,  882,  882,
-      882,  882,  882,  882,  882,  882,  882,  882,  882,  882,
-      882,  883,  883,  139,  883,  883,  883,  883,  883,  883,
+      458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
+      754,  468,  516,  516,  516,  516,  516,  516,  752,  270,
+      270,  270,  270,  270,  270,  287,  287,  287,  287,  287,
+      287,  287,  287,  287,  287,  468,  486,  486,  486,  486,
+      486,  486,  486,  486,  486,  486,  751,  468,  525,  526,
+      526,  523,  468,  523,  523,  523,  523,  523,  523,  525,
+      750,  526,  287,  295,  295,  295,  295,  295,  295,  295,
+      295,  295,  295,  295,  301,  301,  301,  301,  301,  301,
+      301,  301,  301,  301,  301,  301,  301,  747,  543,  548,
+      301,  301,  301,  301,  301,  301,  508,  508,  508,  508,
+
+      508,  508,  508,  508,  508,  508,  535,  535,  535,  535,
+      535,  535,  543,  548,  745,  301,  301,  301,  301,  301,
+      301,  304,  304,  304,  304,  304,  304,  304,  304,  304,
+      304,  304,  304,  740,  552,  554,  304,  304,  304,  304,
+      304,  304,  513,  513,  513,  513,  513,  513,  513,  513,
+      513,  513,  579,  579,  579,  579,  527,  527,  552,  554,
+      736,  304,  304,  304,  304,  304,  304,  305,  527,  305,
+      305,  305,  305,  305,  305,  305,  305,  305,  305,  343,
+      343,  343,  343,  343,  343,  343,  343,  343,  343,  728,
+      728,  635,  636,  343,  343,  343,  343,  343,  343,  515,
+
+      515,  515,  515,  515,  515,  515,  515,  515,  515,  591,
+      591,  591,  591,  591,  591,  635,  636,  735,  343,  343,
+      343,  343,  343,  343,  344,  344,  344,  344,  344,  344,
+      344,  344,  344,  344,  734,  734,  675,  679,  344,  344,
+      344,  344,  344,  344,  519,  519,  519,  519,  519,  519,
+      519,  519,  519,  519,  702,  702,  702,  702,  529,  529,
+      675,  679,  729,  344,  344,  344,  344,  344,  344,  361,
+      529,  361,  361,  361,  361,  361,  361,  361,  361,  361,
+      361,  362,  583,  362,  362,  362,  362,  362,  362,  362,
+      362,  362,  362,  363,  583,  363,  363,  363,  363,  363,
+
+      363,  363,  363,  363,  363,  366,  366,  366,  366,  366,
+      366,  366,  366,  366,  366,  366,  376,  376,  376,  376,
+      376,  376,  376,  376,  376,  376,  376,  376,  376,  739,
+      613,  616,  376,  376,  376,  376,  376,  376,  528,  528,
+      528,  528,  528,  528,  528,  528,  528,  528,  608,  608,
+      608,  608,  608,  608,  613,  616,  703,  376,  376,  376,
+      376,  376,  376,  379,  379,  379,  379,  379,  379,  379,
+      379,  379,  379,  379,  379,  379,  617,  613,  616,  379,
+      379,  379,  379,  379,  379,  532,  532,  532,  532,  532,
+      532,  532,  532,  547,  739,  703,  878,  532,  673,  878,
+
+      617,  737,  737,  547,  379,  379,  379,  379,  379,  379,
+      382,  382,  382,  382,  382,  382,  382,  382,  382,  382,
+      382,  382,  673,  617,  681,  382,  382,  382,  382,  382,
+      382,  534,  534,  534,  534,  534,  534,  534,  534,  534,
+      534,  785,  727,  785,  890,  673,  551,  890,  681,  724,
+      382,  382,  382,  382,  382,  382,  383,  551,  383,  383,
+      383,  383,  383,  383,  383,  383,  383,  383,  416,  694,
+      416,  416,  416,  416,  416,  416,  416,  416,  416,  416,
+      417,  417,  417,  417,  417,  417,  417,  417,  417,  417,
+      561,  787,  787,  694,  417,  417,  417,  417,  417,  417,
+
+      561,  582,  582,  582,  582,  582,  582,  582,  582,  582,
+      582,  629,  629,  629,  629,  629,  629,  629,  723,  417,
+      417,  417,  417,  417,  417,  435,  435,  435,  435,  435,
+      435,  435,  435,  435,  435,  584,  584,  584,  584,  584,
+      584,  584,  584,  584,  584,  585,  588,  647,  588,  588,
+      588,  588,  588,  588,  816,  816,  710,  585,  588,  647,
+      686,  796,  435,  437,  648,  437,  437,  437,  437,  437,
+      437,  437,  437,  437,  437,  438,  648,  438,  438,  438,
+      438,  438,  438,  438,  438,  438,  438,  444,  444,  444,
+      444,  444,  444,  444,  444,  444,  444,  444,  709,  684,
+
+      796,  444,  444,  444,  444,  444,  444,  590,  590,  590,
+      590,  590,  590,  590,  590,  590,  590,  835,  835,  707,
+      686,  684,  597,  684,  684,  706,  444,  444,  444,  444,
+      444,  444,  448,  597,  448,  448,  448,  448,  448,  448,
+      448,  448,  448,  448,  454,  454,  454,  454,  454,  454,
+      454,  454,  454,  454,  454,  454,  454,  598,  599,  599,
+      454,  454,  454,  454,  454,  454,  600,  600,  598,  650,
+      599,  602,  602,  664,  812,  812,  812,  812,  600,  705,
+      697,  650,  730,  602,  664,  454,  454,  454,  454,  454,
+      454,  457,  457,  457,  457,  457,  457,  457,  457,  457,
+
+      457,  457,  457,  457,  697,  687,  730,  457,  457,  457,
+      457,  457,  457,  605,  605,  605,  605,  605,  605,  605,
+      605,  687,  697,  937,  937,  605,  656,  656,  656,  656,
+      656,  656,  457,  457,  457,  457,  457,  457,  460,  460,
+      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
+      623,  691,  696,  460,  460,  460,  460,  460,  460,  607,
+      607,  607,  607,  607,  607,  607,  607,  607,  607,  881,
+      881,  881,  623,  711,  623,  623,  696,  695,  460,  460,
+      460,  460,  460,  460,  461,  711,  461,  461,  461,  461,
+      461,  461,  461,  461,  461,  461,  462,  462,  696,  623,
+
+      690,  695,  462,  938,  938,  462,  462,  683,  462,  462,
+      462,  462,  462,  462,  462,  462,  462,  462,  462,  462,
+      462,  462,  695,  662,  462,  462,  462,  462,  462,  462,
+      462,  462,  462,  462,  462,  462,  462,  462,  462,  462,
+      462,  462,  462,  462,  462,  462,  462,  462,  462,  462,
+      462,  462,  462,  462,  462,  462,  462,  462,  462,  462,
+      462,  462,  462,  462,  462,  462,  462,  507,  507,  507,
+      507,  507,  507,  507,  507,  507,  507,  507,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  639,  639,
+      639,  639,  639,  639,  639,  639,  639,  639,  693,  661,
+
+      693,  693,  693,  949,  949,  507,  514,  712,  514,  514,
+      514,  514,  514,  514,  514,  514,  514,  514,  514,  712,
+      968,  968,  514,  514,  514,  514,  514,  514,  640,  640,
+      640,  640,  640,  640,  640,  640,  640,  640,  663,  660,
+      663,  663,  663,  663,  663,  663,  841,  514,  514,  514,
+      514,  514,  514,  517,  517,  517,  517,  517,  517,  517,
+      517,  517,  517,  517,  646,  755,  782,  517,  517,  517,
+      517,  517,  517,  649,  649,  649,  649,  649,  649,  649,
+      649,  649,  649,  644,  908,  841,  908,  643,  665,  755,
+      782,  642,  517,  517,  517,  517,  517,  517,  518,  665,
+
+      518,  518,  518,  518,  518,  518,  518,  518,  518,  518,
+      530,  530,  530,  530,  530,  530,  530,  530,  530,  530,
+      530,  530,  530,  732,  969,  969,  530,  530,  530,  530,
+      530,  530,  653,  714,  653,  653,  653,  653,  653,  653,
+      898,  898,  898,  634,  653,  714,  688,  732,  688,  688,
+      688,  530,  530,  530,  530,  530,  530,  533,  533,  533,
+      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
+      732,  633,  631,  533,  533,  533,  533,  533,  533,  655,
+      655,  655,  655,  655,  655,  655,  655,  655,  655,  671,
+      671,  671,  671,  671,  671,  671,  671,  688,  533,  533,
+
+      533,  533,  533,  533,  536,  536,  536,  536,  536,  536,
+      536,  536,  536,  536,  536,  630,  628,  784,  756,  536,
+      536,  536,  536,  536,  536,  659,  659,  659,  659,  659,
+      659,  659,  659,  659,  659,  909,  920,  909,  920,  666,
+      666,  784,  756,  793,  536,  536,  536,  536,  536,  536,
+      537,  666,  537,  537,  537,  537,  537,  537,  537,  537,
+      537,  537,  540,  756,  784,  627,  626,  793,  540,  746,
+      746,  540,  540,  746,  540,  540,  540,  540,  540,  540,
+      540,  540,  540,  540,  540,  540,  540,  746,  746,  746,
+      540,  540,  540,  540,  540,  540,  540,  540,  540,  540,
+
+      540,  540,  540,  540,  540,  540,  540,  540,  540,  540,
+      540,  540,  540,  540,  540,  540,  540,  540,  540,  540,
+      540,  540,  540,  540,  540,  540,  540,  540,  540,  540,
+      540,  540,  540,  566,  566,  566,  566,  566,  566,  566,
+      566,  566,  566,  566,  569,  624,  620,  766,  569,  569,
+      569,  569,  569,  569,  569,  569,  569,  569,  569,  766,
+      569,  619,  813,  569,  569,  569,  569,  569,  569,  569,
+      569,  569,  569,  569,  569,  569,  569,  569,  569,  569,
+      569,  569,  569,  569,  569,  569,  813,  569,  569,  569,
+      569,  569,  569,  569,  569,  569,  569,  569,  569,  569,
+
+      569,  569,  569,  569,  569,  575,  575,  575,  575,  575,
+      575,  575,  575,  575,  575,  689,  822,  689,  689,  689,
+      704,  704,  704,  704,  704,  704,  704,  704,  704,  704,
+      708,  618,  708,  708,  708,  708,  708,  708,  601,  921,
+      822,  921,  575,  577,  577,  577,  577,  577,  577,  577,
+      577,  577,  577,  577,  713,  713,  713,  713,  713,  713,
+      713,  713,  713,  713,  726,  717,  689,  717,  717,  717,
+      717,  717,  717,  595,  925,  726,  925,  717,  926,  594,
+      926,  577,  586,  581,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  589,  767,  589,  589,  589,
+
+      589,  589,  589,  589,  589,  589,  589,  589,  767,  757,
+      832,  589,  589,  589,  589,  589,  589,  719,  719,  719,
+      719,  719,  719,  719,  719,  719,  719,  720,  720,  720,
+      720,  720,  720,  757,  832,  580,  589,  589,  589,  589,
+      589,  589,  592,  592,  592,  592,  592,  592,  592,  592,
+      592,  592,  592,  574,  571,  757,  592,  592,  592,  592,
+      592,  592,  749,  749,  749,  749,  749,  749,  749,  749,
+      749,  749,  930,  741,  930,  741,  741,  741,  933,  570,
+      933,  592,  592,  592,  592,  592,  592,  593,  769,  593,
+      593,  593,  593,  593,  593,  593,  593,  593,  593,  596,
+
+      769,  596,  596,  596,  596,  596,  596,  596,  596,  596,
+      596,  603,  603,  603,  603,  603,  603,  603,  603,  603,
+      603,  603,  603,  603,  741,  794,  815,  603,  603,  603,
+      603,  603,  603,  742,  568,  742,  742,  742,  743,  807,
+      743,  743,  743,  744,  567,  744,  744,  744,  565,  794,
+      815,  807,  603,  603,  603,  603,  603,  603,  606,  606,
+      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
+      794,  564,  559,  815,  606,  606,  606,  606,  606,  606,
+      943,  944,  943,  944,  742,  952,  953,  952,  953,  743,
+      956,  962,  956,  962,  744,  963,  965,  963,  965,  606,
+
+      606,  606,  606,  606,  606,  609,  558,  609,  609,  609,
+      609,  609,  609,  609,  609,  609,  609,  610,  748,  556,
+      748,  748,  748,  610,  748,  748,  610,  610,  748,  610,
+      610,  610,  610,  610,  610,  610,  610,  610,  610,  610,
+      610,  610,  748,  748,  748,  610,  610,  610,  610,  610,
+      610,  610,  610,  610,  610,  610,  610,  610,  610,  610,
+      610,  610,  610,  610,  610,  610,  610,  610,  610,  610,
+      610,  610,  610,  610,  610,  610,  610,  610,  610,  610,
+      610,  610,  610,  610,  610,  610,  610,  610,  632,  753,
+      522,  753,  753,  753,  753,  753,  753,  632,  973,  521,
+
+      973,  632,  632,  632,  632,  632,  632,  632,  632,  632,
+      632,  632,  632,  632,  520,  512,  632,  632,  632,  632,
+      632,  632,  632,  632,  632,  632,  632,  632,  632,  632,
+      632,  632,  632,  632,  632,  632,  632,  632,  632,  511,
+      632,  632,  632,  632,  632,  632,  632,  632,  632,  632,
+      632,  632,  632,  632,  632,  632,  632,  632,  638,  510,
+      638,  638,  638,  638,  638,  638,  638,  638,  638,  638,
+      768,  768,  768,  768,  768,  768,  768,  768,  768,  768,
+      772,  506,  772,  772,  772,  772,  772,  772,  971,  499,
+      498,  971,  772,  974,  977,  974,  977,  638,  645,  495,
+
+      645,  645,  645,  645,  645,  645,  645,  645,  645,  645,
+      651,  493,  651,  651,  651,  651,  651,  651,  651,  651,
+      651,  651,  651,  654,  492,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654,  978,  489,  978,  654,
+      654,  654,  654,  654,  654,  774,  774,  774,  774,  774,
+      774,  774,  774,  774,  774,  775,  775,  775,  775,  775,
+      775,  983,  488,  983,  654,  654,  654,  654,  654,  654,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  984,  487,  984,  657,  657,  657,  657,  657,  657,
+      780,  780,  780,  780,  780,  780,  780,  788,  788,  788,
+
+      788,  788,  788,  788,  788,  788,  788,  481,  480,  657,
+      657,  657,  657,  657,  657,  658,  478,  658,  658,  658,
+      658,  658,  658,  658,  658,  658,  658,  669,  669,  669,
+      669,  669,  669,  669,  669,  669,  669,  669,  669,  692,
+      477,  692,  692,  692,  692,  692,  692,  692,  692,  692,
+      692,  698,  698,  698,  698,  698,  698,  698,  698,  698,
+      698,  789,  789,  789,  789,  789,  789,  789,  789,  789,
+      789,  799,  476,  799,  799,  799,  799,  799,  799,  804,
+      475,  804,  804,  804,  804,  804,  804,  447,  698,  700,
+      446,  700,  700,  700,  700,  700,  700,  700,  700,  700,
+
+      700,  821,  443,  821,  821,  821,  821,  821,  821,  442,
+      799,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  848,  848,  848,  848,  848,  848,  441,  700,  715,
+      440,  715,  715,  715,  715,  715,  715,  715,  715,  715,
+      715,  715,  718,  434,  718,  718,  718,  718,  718,  718,
+      718,  718,  718,  718,  718,  433,  432,  431,  718,  718,
+      718,  718,  718,  718,  817,  817,  817,  817,  817,  817,
+      817,  817,  817,  817,  854,  430,  854,  854,  854,  854,
+      854,  854,  429,  718,  718,  718,  718,  718,  718,  721,
+      721,  721,  721,  721,  721,  721,  721,  721,  721,  428,
+
+      427,  426,  425,  721,  721,  721,  721,  721,  721,  826,
+      826,  826,  826,  826,  826,  826,  826,  826,  826,  844,
+      424,  844,  844,  844,  844,  844,  844,  423,  721,  721,
+      721,  721,  721,  721,  722,  422,  722,  722,  722,  722,
+      722,  722,  722,  722,  722,  722,  725,  725,  725,  725,
+      725,  725,  725,  725,  725,  725,  725,  758,  844,  758,
+      758,  758,  758,  758,  758,  758,  758,  758,  758,  759,
+      421,  759,  759,  759,  759,  759,  759,  759,  759,  759,
+      759,  760,  420,  760,  760,  760,  760,  760,  760,  760,
+      760,  760,  760,  763,  419,  763,  763,  763,  763,  763,
+
+      763,  763,  763,  763,  763,  770,  418,  770,  770,  770,
+      770,  770,  770,  770,  770,  770,  770,  770,  773,  415,
+      773,  773,  773,  773,  773,  773,  773,  773,  773,  773,
+      414,  409,  408,  407,  773,  773,  773,  773,  773,  773,
+      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
+      401,  400,  398,  863,  863,  863,  863,  863,  863,  773,
+      773,  773,  773,  773,  773,  776,  397,  776,  776,  776,
+      776,  776,  776,  776,  776,  776,  776,  792,  396,  792,
+      792,  792,  792,  792,  792,  792,  792,  792,  792,  795,
+      863,  795,  795,  795,  795,  795,  795,  795,  795,  795,
+
+      795,  797,  395,  797,  797,  797,  797,  797,  797,  797,
+      797,  797,  797,  798,  394,  798,  798,  798,  798,  798,
+      798,  798,  798,  798,  798,  810,  393,  810,  810,  810,
+      810,  810,  810,  810,  810,  810,  810,  823,  392,  823,
+      823,  823,  823,  823,  823,  823,  823,  823,  823,  824,
+      389,  824,  824,  824,  824,  824,  824,  824,  824,  824,
+      824,  825,  388,  825,  825,  825,  825,  825,  825,  825,
+      825,  825,  825,  828,  828,  828,  828,  828,  828,  828,
+      828,  828,  828,  839,  387,  839,  839,  839,  839,  839,
+      839,  839,  839,  839,  839,  840,  386,  840,  840,  840,
+
+      840,  840,  840,  840,  840,  840,  840,  842,  370,  842,
+      842,  842,  842,  842,  842,  842,  842,  842,  842,  843,
+      369,  843,  843,  843,  843,  843,  843,  843,  843,  843,
+      843,  846,  846,  846,  846,  846,  846,  846,  846,  846,
+      846,  847,  847,  847,  847,  847,  847,  847,  847,  847,
+      847,  850,  850,  850,  850,  850,  850,  850,  850,  850,
+      850,  855,  855,  855,  855,  855,  855,  855,  855,  855,
+      855,  858,  858,  858,  858,  858,  858,  858,  858,  858,
+      858,  859,  859,  859,  859,  859,  859,  859,  859,  859,
+      859,  866,  866,  866,  866,  866,  866,  368,  855,  856,
+
+      856,  856,  856,  856,  856,  856,  856,  856,  856,  860,
+      860,  860,  860,  860,  860,  860,  860,  860,  860,  865,
+      865,  865,  865,  865,  865,  865,  865,  865,  865,  367,
+      365,  364,  360,  359,  358,  356,  856,  857,  857,  857,
+      857,  857,  857,  857,  857,  857,  857,  982,  355,  354,
+      982,  353,  352,  351,  982,  350,  349,  346,  341,  340,
+      339,  332,  331,  330,  329,  328,  322,  321,  319,  318,
+      317,  316,  315,  314,  857,  862,  862,  862,  862,  862,
+      862,  862,  862,  862,  862,  313,  312,  309,  308,  306,
+      298,  297,  294,  293,  286,  285,  283,  282,  281,  280,
+
+      279,  278,  277,  276,  275,  274,  273,  272,  269,  266,
+      265,  264,  862,  868,  868,  868,  868,  868,  868,  868,
+      868,  868,  868,  868,  868,  868,  868,  868,  868,  868,
+      868,  868,  868,  868,  869,  869,  869,  869,  869,  869,
+      869,  869,  869,  869,  869,  869,  869,  869,  869,  869,
+      869,  869,  869,  869,  869,  870,  870,  870,  870,  870,
+      870,  870,  870,  870,  870,  870,  870,  870,  870,  870,
+      870,  870,  870,  870,  870,  870,  871,  871,  871,  871,
+      871,  871,  871,  871,  871,  871,  871,  871,  871,  871,
+      871,  871,  871,  871,  871,  871,  871,  872,  258,  255,
+
+      254,  253,  252,  251,  872,  248,  872,  872,  872,  872,
+      247,  246,  872,  872,  872,  872,  872,  872,  873,  873,
+      873,  873,  873,  873,  873,  873,  873,  873,  873,  873,
+      873,  873,  873,  873,  873,  873,  873,  873,  873,  874,
+      245,  244,  243,  242,  874,  241,  874,  240,  874,  874,
+      874,  874,  874,  239,  874,  874,  874,  874,  874,  874,
+      875,  238,  237,  236,  235,  234,  233,  875,  232,  875,
+      875,  875,  875,  226,  225,  875,  875,  875,  875,  875,
+      875,  876,  218,  217,  876,  876,  216,  876,  876,  215,
+      876,  876,  876,  876,  214,  213,  876,  876,  876,  876,
+
+      876,  876,  877,  877,  211,  877,  210,  209,  208,  877,
+      879,  206,  200,  879,  879,  192,  879,  879,  188,  879,
+      879,  879,  879,  184,  183,  879,  879,  879,  879,  879,
+      879,  880,  181,  177,  880,  880,  170,  880,  880,  166,
+      880,  880,  880,  880,  164,  880,  880,  880,  162,  880,
+      880,  880,  882,  154,  153,  882,  152,  151,  882,  882,
+      150,  882,  882,  882,  882,  882,  144,  882,  882,  882,
+      882,  882,  882,  883,  883,  883,  883,  883,  883,  883,
       883,  883,  883,  883,  883,  883,  883,  883,  883,  883,
-      883,  883,  885,  137,  136,  885,  885,  135,  885,  885,
-
-      134,  885,  885,  885,  885,  133,  132,  885,  885,  885,
-      885,  885,  885,  886,  886,  128,  886,  124,  123,  119,
-      886,  887,  887,  116,  887,  113,  108,  107,  887,  888,
-      888,  888,  106,  888,  104,  100,   99,  888,  889,   98,
-       97,  889,  889,   96,  889,  889,   92,  889,  889,  889,
-      889,   79,   72,  889,  889,  889,  889,  889,  889,  890,
-       65,   61,  890,  890,   60,  890,  890,   58,  890,  890,
-      890,  890,   57,   55,  890,  890,  890,  890,  890,  890,
-      891,   53,   45,  891,  891,   44,  891,  891,   43,  891,
-      891,  891,  891,   41,  891,  891,  891,   40,  891,  891,
-
-      891,  893,   35,   31,  893,   25,   19,  893,  893,   17,
-      893,  893,  893,  893,  893,   16,  893,  893,  893,  893,
-      893,  893,  894,  894,   15,  894,    0,  894,  894,  894,
-      894,  894,  894,  894,  894,  894,  894,  894,  894,  894,
-      894,  894,  894,  895,    0,    0,    0,    0,    0,    0,
-      895,    0,  895,  895,  895,  895,    0,    0,  895,  895,
-      895,  895,  895,  895,  896,    0,    0,    0,    0,    0,
-        0,  896,    0,  896,  896,  896,  896,    0,  896,  896,
-      896,  896,  896,  896,  896,  897,    0,    0,  897,  897,
-        0,  897,  897,    0,  897,  897,  897,  897,    0,  897,
-
-      897,  897,  897,  897,  897,  897,  898,    0,    0,  898,
-      898,    0,  898,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  900,  900,    0,  900,    0,    0,
-        0,  900,  901,  901,  901,    0,  901,    0,    0,    0,
-      901,  904,  904,    0,  904,    0,    0,    0,  904,  905,
-      905,    0,  905,    0,    0,    0,  905,  906,  906,    0,
-      906,    0,    0,    0,  906,  907,  907,  907,    0,  907,
-        0,    0,    0,  907,  908,    0,    0,  908,  908,    0,
-      908,  909,  909,    0,  909,    0,    0,    0,  909,  910,
-
+      883,  883,  883,  883,  884,  884,  143,  884,  142,  884,
+
+      884,  884,  884,  884,  884,  884,  884,  884,  884,  884,
+      884,  884,  884,  884,  884,  885,  141,  140,  139,  137,
+      885,  136,  885,  135,  885,  885,  885,  885,  885,  134,
+      885,  885,  885,  885,  885,  885,  886,  133,  132,  128,
+      124,  123,  119,  886,  116,  886,  886,  886,  886,  113,
+      886,  886,  886,  886,  886,  886,  886,  887,  108,  107,
+      887,  887,  106,  887,  887,  104,  887,  887,  887,  887,
+      100,  887,  887,  887,  887,  887,  887,  887,  888,  888,
+      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
+      888,  888,  888,  888,  888,  888,  888,  888,  888,  889,
+
+      889,   99,  889,  889,  889,  889,  889,  889,  889,  889,
+      889,  889,  889,  889,  889,  889,  889,  889,  889,  889,
+      891,   98,   97,  891,  891,   96,  891,  891,   92,  891,
+      891,  891,  891,   79,   72,  891,  891,  891,  891,  891,
+      891,  892,  892,   65,  892,   61,   60,   58,  892,  893,
+      893,   57,  893,   55,   53,   44,  893,  894,  894,  894,
+       43,  894,   41,   40,   35,  894,  895,   31,   25,  895,
+      895,   19,  895,  895,   17,  895,  895,  895,  895,   16,
+       15,  895,  895,  895,  895,  895,  895,  896,    0,    0,
+      896,  896,    0,  896,  896,    0,  896,  896,  896,  896,
+
+        0,    0,  896,  896,  896,  896,  896,  896,  897,    0,
+        0,  897,  897,    0,  897,  897,    0,  897,  897,  897,
+      897,    0,  897,  897,  897,    0,  897,  897,  897,  899,
+        0,    0,  899,    0,    0,  899,  899,    0,  899,  899,
+      899,  899,  899,    0,  899,  899,  899,  899,  899,  899,
+      900,  900,    0,  900,    0,  900,  900,  900,  900,  900,
+      900,  900,  900,  900,  900,  900,  900,  900,  900,  900,
+      900,  901,    0,    0,    0,    0,    0,    0,  901,    0,
+      901,  901,  901,  901,    0,    0,  901,  901,  901,  901,
+      901,  901,  902,    0,    0,    0,    0,    0,    0,  902,
+
+        0,  902,  902,  902,  902,    0,  902,  902,  902,  902,
+      902,  902,  902,  903,    0,    0,  903,  903,    0,  903,
+      903,    0,  903,  903,  903,  903,    0,  903,  903,  903,
+      903,  903,  903,  903,  904,    0,    0,  904,  904,    0,
+      904,  905,  905,  905,  905,  905,  905,  905,  905,  905,
+      905,  905,  905,  905,  905,  905,  905,  905,  905,  905,
+      905,  905,  906,  906,    0,  906,    0,    0,    0,  906,
+      907,  907,  907,    0,  907,    0,    0,    0,  907,  910,
       910,    0,  910,    0,    0,    0,  910,  911,  911,    0,
-      911,    0,    0,    0,  911,  912,  912,  912,    0,  912,
-        0,    0,    0,  912,  913,  913,  913,  913,    0,  913,
-        0,    0,    0,  913,  916,  916,    0,  916,    0,    0,
-        0,  916,  917,  917,    0,  917,    0,    0,    0,  917,
-      918,  918,    0,  918,    0,    0,    0,  918,  921,  921,
-      921,    0,  921,    0,    0,    0,  921,  922,  922,  922,
-      922,    0,  922,    0,    0,    0,  922,  923,  923,  923,
-      923,  923,  923,  923,  923,  923,  923,  923,  923,  923,
-      923,  923,  923,  923,  923,  923,  923,  923,  925,  925,
-
-        0,  925,    0,    0,    0,  925,  926,  926,    0,  926,
-        0,    0,    0,  926,  928,  928,  928,    0,  928,    0,
-        0,    0,  928,  929,  929,  929,  929,    0,  929,    0,
-        0,    0,  929,  930,  930,  930,  930,  930,  930,  930,
-      930,  930,  930,  930,  930,  930,  930,  930,  930,  930,
-      930,  930,  930,  930,  933,    0,    0,  933,  933,    0,
-      933,  934,    0,    0,    0,  934,  934,    0,  934,  934,
-      934,    0,    0,  934,  934,  935,  935,    0,  935,    0,
-        0,    0,  935,  936,    0,  936,  936,    0,  936,    0,
-        0,    0,  936,  939,  939,  939,    0,  939,    0,    0,
-
-        0,  939,  940,  940,  940,  940,    0,  940,    0,    0,
-        0,  940,  941,  941,    0,    0,  941,    0,    0,    0,
-      941,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  944,    0,    0,  944,  944,    0,  944,  945,
-        0,    0,    0,  945,  945,    0,  945,  945,  945,    0,
-        0,  945,  945,  948,  948,    0,  948,    0,    0,    0,
-      948,  949,    0,  949,  949,    0,  949,    0,    0,    0,
-      949,  951,  951,  951,    0,  951,    0,    0,    0,  951,
-      952,  952,  952,    0,    0,  952,    0,    0,    0,  952,
-
-      953,  953,  953,  953,  953,  953,  953,  953,  953,  953,
-      953,  953,  953,  953,  953,  953,  953,  953,  953,  953,
-      953,  954,  954,    0,  954,  954,  954,    0,  954,    0,
-      954,  954,  954,  954,    0,    0,  954,  954,  954,  954,
-      954,  954,  955,  955,    0,  955,  955,  955,    0,  955,
-        0,  955,  955,  955,  955,    0,    0,  955,  955,  955,
-      955,  955,  955,  958,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  958,  958,    0,  958,  958,    0,
-      958,  960,  960,    0,  960,    0,    0,    0,  960,  961,
-        0,  961,  961,    0,  961,    0,    0,    0,  961,  964,
-
-      964,    0,    0,  964,    0,    0,    0,  964,  966,    0,
-        0,    0,    0,    0,    0,  966,    0,  966,  966,  966,
-      966,    0,    0,  966,  966,  966,  966,  966,  966,  969,
-      969,    0,  969,    0,    0,    0,  969,  970,    0,  970,
-      970,    0,  970,    0,    0,    0,  970,  973,  973,    0,
-      973,    0,    0,    0,  973,  974,    0,  974,    0,    0,
-      974,    0,    0,    0,  974,  975,  975,  975,  975,  975,
-      975,  975,  975,  975,  975,  975,  975,  975,  975,  975,
-      975,  975,  975,  975,  975,  975,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  861,  861,  861
+      911,    0,    0,    0,  911,  912,  912,    0,  912,    0,
+
+        0,    0,  912,  913,  913,  913,    0,  913,    0,    0,
+        0,  913,  914,    0,    0,  914,  914,    0,  914,  915,
+      915,    0,  915,    0,    0,    0,  915,  916,  916,    0,
+      916,    0,    0,    0,  916,  917,  917,    0,  917,    0,
+        0,    0,  917,  918,  918,  918,    0,  918,    0,    0,
+        0,  918,  919,  919,  919,  919,    0,  919,    0,    0,
+        0,  919,  922,  922,    0,  922,    0,    0,    0,  922,
+      923,  923,    0,  923,    0,    0,    0,  923,  924,  924,
+        0,  924,    0,    0,    0,  924,  927,  927,  927,    0,
+      927,    0,    0,    0,  927,  928,  928,  928,  928,    0,
+
+      928,    0,    0,    0,  928,  929,  929,  929,  929,  929,
+      929,  929,  929,  929,  929,  929,  929,  929,  929,  929,
+      929,  929,  929,  929,  929,  929,  931,  931,    0,  931,
+        0,    0,    0,  931,  932,  932,    0,  932,    0,    0,
+        0,  932,  934,  934,  934,    0,  934,    0,    0,    0,
+      934,  935,  935,  935,  935,    0,  935,    0,    0,    0,
+      935,  936,  936,  936,  936,  936,  936,  936,  936,  936,
+      936,  936,  936,  936,  936,  936,  936,  936,  936,  936,
+      936,  936,  939,    0,    0,  939,  939,    0,  939,  940,
+        0,    0,    0,  940,  940,    0,  940,  940,  940,    0,
+
+        0,  940,  940,  941,  941,    0,  941,    0,    0,    0,
+      941,  942,    0,  942,  942,    0,  942,    0,    0,    0,
+      942,  945,  945,  945,    0,  945,    0,    0,    0,  945,
+      946,  946,  946,  946,    0,  946,    0,    0,    0,  946,
+      947,  947,    0,    0,  947,    0,    0,    0,  947,  948,
+      948,  948,  948,  948,  948,  948,  948,  948,  948,  948,
+      948,  948,  948,  948,  948,  948,  948,  948,  948,  948,
+      950,    0,    0,  950,  950,    0,  950,  951,    0,    0,
+        0,  951,  951,    0,  951,  951,  951,    0,    0,  951,
+      951,  954,  954,    0,  954,    0,    0,    0,  954,  955,
+
+        0,  955,  955,    0,  955,    0,    0,    0,  955,  957,
+      957,  957,    0,  957,    0,    0,    0,  957,  958,  958,
+      958,    0,    0,  958,    0,    0,    0,  958,  959,  959,
+      959,  959,  959,  959,  959,  959,  959,  959,  959,  959,
+      959,  959,  959,  959,  959,  959,  959,  959,  959,  960,
+      960,    0,  960,  960,  960,    0,  960,    0,  960,  960,
+      960,  960,    0,    0,  960,  960,  960,  960,  960,  960,
+      961,  961,    0,  961,  961,  961,    0,  961,    0,  961,
+      961,  961,  961,    0,    0,  961,  961,  961,  961,  961,
+      961,  964,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,  964,  964,    0,  964,  964,    0,  964,  966,
+      966,    0,  966,    0,    0,    0,  966,  967,    0,  967,
+      967,    0,  967,    0,    0,    0,  967,  970,  970,    0,
+        0,  970,    0,    0,    0,  970,  972,    0,    0,    0,
+        0,    0,    0,  972,    0,  972,  972,  972,  972,    0,
+        0,  972,  972,  972,  972,  972,  972,  975,  975,    0,
+      975,    0,    0,    0,  975,  976,    0,  976,  976,    0,
+      976,    0,    0,    0,  976,  979,  979,    0,  979,    0,
+        0,    0,  979,  980,    0,  980,    0,    0,  980,    0,
+        0,    0,  980,  981,  981,  981,  981,  981,  981,  981,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  867,  867,  867,  867,  867
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -2047,7 +2055,7 @@ int (*trace_print)(const char *msg) = sudoers_trace_print;
 
 #define WANTDIGEST 6
 
-#line 2050 "lex.sudoers.c"
+#line 2058 "lex.sudoers.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -2203,7 +2211,7 @@ YY_DECL
 
 #line 122 "toke.l"
 
-#line 2206 "lex.sudoers.c"
+#line 2214 "lex.sudoers.c"
 
        if ( yy_init )
                {
@@ -2255,13 +2263,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 >= 862 )
+                               if ( yy_current_state >= 868 )
                                        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] != 5587 );
+               while ( yy_base[yy_current_state] != 5615 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -2835,6 +2843,14 @@ YY_RULE_SETUP
 case 46:
 YY_RULE_SETUP
 #line 533 "toke.l"
+{
+                           LEXTRACE("CMND_TIMEOUT ");
+                           LEXRETURN(CMND_TIMEOUT);
+                       }
+       YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 538 "toke.l"
 {
 #ifdef HAVE_SELINUX
                            LEXTRACE("ROLE ");
@@ -2844,9 +2860,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 47:
+case 48:
 YY_RULE_SETUP
-#line 542 "toke.l"
+#line 547 "toke.l"
 {
 #ifdef HAVE_SELINUX
                            LEXTRACE("TYPE ");
@@ -2856,9 +2872,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 48:
+case 49:
 YY_RULE_SETUP
-#line 550 "toke.l"
+#line 555 "toke.l"
 {
 #ifdef HAVE_PRIV_SET
                            LEXTRACE("PRIVS ");
@@ -2868,9 +2884,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 49:
+case 50:
 YY_RULE_SETUP
-#line 559 "toke.l"
+#line 564 "toke.l"
 {
 #ifdef HAVE_PRIV_SET
                            LEXTRACE("LIMITPRIVS ");
@@ -2880,9 +2896,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 50:
+case 51:
 YY_RULE_SETUP
-#line 568 "toke.l"
+#line 573 "toke.l"
 {
                        got_alias:
                            if (!fill(sudoerstext, sudoersleng))
@@ -2891,9 +2907,9 @@ YY_RULE_SETUP
                            LEXRETURN(ALIAS);
                        }
        YY_BREAK
-case 51:
+case 52:
 YY_RULE_SETUP
-#line 576 "toke.l"
+#line 581 "toke.l"
 {
                            /* XXX - no way to specify digest for command */
                            /* no command args allowed for Defaults!/path */
@@ -2903,9 +2919,9 @@ YY_RULE_SETUP
                            LEXRETURN(COMMAND);
                        }
        YY_BREAK
-case 52:
+case 53:
 YY_RULE_SETUP
-#line 585 "toke.l"
+#line 590 "toke.l"
 {
                            digest_len = SHA224_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2913,9 +2929,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA224_TOK);
                        }
        YY_BREAK
-case 53:
+case 54:
 YY_RULE_SETUP
-#line 592 "toke.l"
+#line 597 "toke.l"
 {
                            digest_len = SHA256_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2923,9 +2939,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA256_TOK);
                        }
        YY_BREAK
-case 54:
+case 55:
 YY_RULE_SETUP
-#line 599 "toke.l"
+#line 604 "toke.l"
 {
                            digest_len = SHA384_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2933,9 +2949,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA384_TOK);
                        }
        YY_BREAK
-case 55:
+case 56:
 YY_RULE_SETUP
-#line 606 "toke.l"
+#line 611 "toke.l"
 {
                            digest_len = SHA512_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2943,9 +2959,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA512_TOK);
                        }
        YY_BREAK
-case 56:
+case 57:
 YY_RULE_SETUP
-#line 613 "toke.l"
+#line 618 "toke.l"
 {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
@@ -2953,9 +2969,9 @@ YY_RULE_SETUP
                                yyterminate();
                        }                       /* sudo -e */
        YY_BREAK
-case 57:
+case 58:
 YY_RULE_SETUP
-#line 620 "toke.l"
+#line 625 "toke.l"
 {
                            /* directories can't have args... */
                            if (sudoerstext[sudoersleng - 1] == '/') {
@@ -2971,9 +2987,9 @@ YY_RULE_SETUP
                            }
                        }                       /* a pathname */
        YY_BREAK
-case 58:
+case 59:
 YY_RULE_SETUP
-#line 635 "toke.l"
+#line 640 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            sudoerslval.string = NULL;
@@ -2981,9 +2997,9 @@ YY_RULE_SETUP
                            BEGIN INSTR;
                        }
        YY_BREAK
-case 59:
+case 60:
 YY_RULE_SETUP
-#line 642 "toke.l"
+#line 647 "toke.l"
 {
                            /* a word */
                            if (!fill(sudoerstext, sudoersleng))
@@ -2992,49 +3008,49 @@ YY_RULE_SETUP
                            LEXRETURN(WORD);
                        }
        YY_BREAK
-case 60:
+case 61:
 YY_RULE_SETUP
-#line 650 "toke.l"
+#line 655 "toke.l"
 {
                            LEXTRACE("( ");
                            LEXRETURN('(');
                        }
        YY_BREAK
-case 61:
+case 62:
 YY_RULE_SETUP
-#line 655 "toke.l"
+#line 660 "toke.l"
 {
                            LEXTRACE(") ");
                            LEXRETURN(')');
                        }
        YY_BREAK
-case 62:
+case 63:
 YY_RULE_SETUP
-#line 660 "toke.l"
+#line 665 "toke.l"
 {
                            LEXTRACE(", ");
                            LEXRETURN(',');
                        }                       /* return ',' */
        YY_BREAK
-case 63:
+case 64:
 YY_RULE_SETUP
-#line 665 "toke.l"
+#line 670 "toke.l"
 {
                            LEXTRACE("= ");
                            LEXRETURN('=');
                        }                       /* return '=' */
        YY_BREAK
-case 64:
+case 65:
 YY_RULE_SETUP
-#line 670 "toke.l"
+#line 675 "toke.l"
 {
                            LEXTRACE(": ");
                            LEXRETURN(':');
                        }                       /* return ':' */
        YY_BREAK
-case 65:
+case 66:
 YY_RULE_SETUP
-#line 675 "toke.l"
+#line 680 "toke.l"
 {
                            if (sudoersleng & 1) {
                                LEXTRACE("!");
@@ -3042,9 +3058,9 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 66:
+case 67:
 YY_RULE_SETUP
-#line 682 "toke.l"
+#line 687 "toke.l"
 {
                            if (YY_START == INSTR) {
                                LEXTRACE("ERROR ");
@@ -3057,25 +3073,25 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* return newline */
        YY_BREAK
-case 67:
+case 68:
 YY_RULE_SETUP
-#line 694 "toke.l"
+#line 699 "toke.l"
 {                      /* throw away space/tabs */
                            sawspace = true;    /* but remember for fill_args */
                        }
        YY_BREAK
-case 68:
+case 69:
 YY_RULE_SETUP
-#line 698 "toke.l"
+#line 703 "toke.l"
 {
                            sawspace = true;    /* remember for fill_args */
                            sudolineno++;
                            continued = true;
                        }                       /* throw away EOL after \ */
        YY_BREAK
-case 69:
+case 70:
 YY_RULE_SETUP
-#line 704 "toke.l"
+#line 709 "toke.l"
 {
                            if (sudoerstext[sudoersleng - 1] == '\n') {
                                /* comment ending in a newline */
@@ -3090,9 +3106,9 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* comment, not uid/gid */
        YY_BREAK
-case 70:
+case 71:
 YY_RULE_SETUP
-#line 718 "toke.l"
+#line 723 "toke.l"
 {
                            LEXTRACE("ERROR ");
                            LEXRETURN(ERROR);
@@ -3105,7 +3121,7 @@ case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):
 case YY_STATE_EOF(INSTR):
 case YY_STATE_EOF(WANTDIGEST):
-#line 723 "toke.l"
+#line 728 "toke.l"
 {
                            if (YY_START != INITIAL) {
                                BEGIN INITIAL;
@@ -3116,12 +3132,12 @@ case YY_STATE_EOF(WANTDIGEST):
                                yyterminate();
                        }
        YY_BREAK
-case 71:
+case 72:
 YY_RULE_SETUP
-#line 733 "toke.l"
+#line 738 "toke.l"
 ECHO;
        YY_BREAK
-#line 3124 "lex.sudoers.c"
+#line 3140 "lex.sudoers.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -3412,7 +3428,7 @@ static yy_state_type yy_get_previous_state YY_PROTO(( 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 >= 862 )
+                       if ( yy_current_state >= 868 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -3447,11 +3463,11 @@ yy_state_type yy_current_state;
        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 >= 862 )
+               if ( yy_current_state >= 868 )
                        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 == 861);
+       yy_is_jam = (yy_current_state == 867);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -4012,7 +4028,7 @@ int main()
        return 0;
        }
 #endif
-#line 733 "toke.l"
+#line 738 "toke.l"
 
 struct path_list {
     SLIST_ENTRY(path_list) entries;
index 3a6a083c7d8c7d8743a3526702432a6286a9b5a2..12784b7ac7afc7ee2fd73678cd71a983e5b2f716 100644 (file)
@@ -530,6 +530,11 @@ ALL {
 
                        }
 
+<INITIAL>TIMEOUT {
+                           LEXTRACE("CMND_TIMEOUT ");
+                           LEXRETURN(CMND_TIMEOUT);
+                       }
+
 <INITIAL>ROLE {
 #ifdef HAVE_SELINUX
                            LEXTRACE("ROLE ");
index d21bf90f50804e36e87ac1a2049e135cce021b06..bbea8d89109799fab950da22f40ad08b2b364792 100644 (file)
@@ -781,11 +781,17 @@ print_cmndspec_json(FILE *fp, struct cmndspec *cs, struct cmndspec **nextp,
     }
 
     /* Print tags */
-    if (TAGS_SET(cs->tags)) {
+    if (cs->timeout > 0 || TAGS_SET(cs->tags)) {
        struct cmndtag tag = cs->tags;
 
        fprintf(fp, "%*s\"Options\": [\n", indent, "");
        indent += 4;
+       if (cs->timeout > 0) {
+           value.type = JSON_NUMBER;
+           value.u.number = cs->timeout;
+           print_pair_json(fp, "{ ", "command_timeout", &value,
+               TAGS_SET(tag) ? " },\n" : " }\n", indent);
+       }
        if (tag.nopasswd != UNSPEC) {
            value.type = JSON_BOOL;
            value.u.boolean = !tag.nopasswd;