Imported Upstream version 1.8.7
[debian/sudo] / plugins / sudoers / gram.c
index 7de57f8cf736b7fc36b913d6fe76fb7c322b2466..46e15bea2c3d8382320a106f7f8bea5e131f5e9e 100644 (file)
@@ -9,10 +9,36 @@
 #define yyclearin (yychar=(YYEMPTY))
 #define yyerrok (yyerrflag=0)
 #define YYRECOVERING() (yyerrflag!=0)
-#define YYPREFIX "yy"
+#define yyparse sudoersparse
+#define yylex sudoerslex
+#define yyerror sudoerserror
+#define yychar sudoerschar
+#define yyval sudoersval
+#define yylval sudoerslval
+#define yydebug sudoersdebug
+#define yynerrs sudoersnerrs
+#define yyerrflag sudoerserrflag
+#define yyss sudoersss
+#define yysslim sudoerssslim
+#define yyssp sudoersssp
+#define yyvs sudoersvs
+#define yyvsp sudoersvsp
+#define yystacksize sudoersstacksize
+#define yylhs sudoerslhs
+#define yylen sudoerslen
+#define yydefred sudoersdefred
+#define yydgoto sudoersdgoto
+#define yysindex sudoerssindex
+#define yyrindex sudoersrindex
+#define yygindex sudoersgindex
+#define yytable sudoerstable
+#define yycheck sudoerscheck
+#define yyname sudoersname
+#define yyrule sudoersrule
+#define YYPREFIX "sudoers"
 #line 2 "gram.y"
 /*
- * Copyright (c) 1996, 1998-2005, 2007-2012
+ * Copyright (c) 1996, 1998-2005, 2007-2013
  *     Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -37,7 +63,6 @@
 #include <config.h>
 
 #include <sys/types.h>
-#include <sys/param.h>
 #include <stdio.h>
 #ifdef STDC_HEADERS
 # include <stdlib.h>
@@ -67,7 +92,6 @@
 #include "sudoers.h" /* XXX */
 #include "parse.h"
 #include "toke.h"
-#include "gram.h"
 
 /*
  * We must define SIZE_MAX for yacc's skeleton.c.
@@ -103,33 +127,8 @@ static void  add_defaults(int, struct member *, struct defaults *);
 static void  add_userspec(struct member *, struct privilege *);
 static struct defaults *new_default(char *, char *, int);
 static struct member *new_member(char *, int);
-       void  yyerror(const char *);
-
-void
-yyerror(const char *s)
-{
-    debug_decl(yyerror, SUDO_DEBUG_PARSER)
-
-    /* If we last saw a newline the error is on the preceding line. */
-    if (last_token == COMMENT)
-       sudolineno--;
-
-    /* Save the line the first error occurred on. */
-    if (errorlineno == -1) {
-       errorlineno = sudolineno;
-       errorfile = estrdup(sudoers);
-    }
-    if (sudoers_warnings && s != NULL) {
-       LEXTRACE("<*> ");
-#ifndef TRACELEXER
-       if (trace_print == NULL || trace_print == sudoers_trace_print)
-           warningx(_(">>> %s: %s near line %d <<<"), sudoers, s, sudolineno);
-#endif
-    }
-    parse_error = true;
-    debug_return;
-}
-#line 122 "gram.y"
+static struct sudo_digest *new_digest(int, const char *);
+#line 95 "gram.y"
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
@@ -138,6 +137,7 @@ typedef union {
     struct member *member;
     struct runascontainer *runas;
     struct privilege *privilege;
+    struct sudo_digest *digest;
     struct sudo_command command;
     struct cmndtag tag;
     struct selinux_info seinfo;
@@ -154,372 +154,391 @@ typedef union {
 #define NETGROUP 261
 #define USERGROUP 262
 #define WORD 263
-#define DEFAULTS 264
-#define DEFAULTS_HOST 265
-#define DEFAULTS_USER 266
-#define DEFAULTS_RUNAS 267
-#define DEFAULTS_CMND 268
-#define NOPASSWD 269
-#define PASSWD 270
-#define NOEXEC 271
-#define EXEC 272
-#define SETENV 273
-#define NOSETENV 274
-#define LOG_INPUT 275
-#define NOLOG_INPUT 276
-#define LOG_OUTPUT 277
-#define NOLOG_OUTPUT 278
-#define ALL 279
-#define COMMENT 280
-#define HOSTALIAS 281
-#define CMNDALIAS 282
-#define USERALIAS 283
-#define RUNASALIAS 284
-#define ERROR 285
-#define TYPE 286
-#define ROLE 287
-#define PRIVS 288
-#define LIMITPRIVS 289
-#define MYSELF 290
+#define DIGEST 264
+#define DEFAULTS 265
+#define DEFAULTS_HOST 266
+#define DEFAULTS_USER 267
+#define DEFAULTS_RUNAS 268
+#define DEFAULTS_CMND 269
+#define NOPASSWD 270
+#define PASSWD 271
+#define NOEXEC 272
+#define EXEC 273
+#define SETENV 274
+#define NOSETENV 275
+#define LOG_INPUT 276
+#define NOLOG_INPUT 277
+#define LOG_OUTPUT 278
+#define NOLOG_OUTPUT 279
+#define ALL 280
+#define COMMENT 281
+#define HOSTALIAS 282
+#define CMNDALIAS 283
+#define USERALIAS 284
+#define RUNASALIAS 285
+#define ERROR 286
+#define TYPE 287
+#define ROLE 288
+#define PRIVS 289
+#define LIMITPRIVS 290
+#define MYSELF 291
+#define SHA224 292
+#define SHA256 293
+#define SHA384 294
+#define SHA512 295
 #define YYERRCODE 256
 #if defined(__cplusplus) || defined(__STDC__)
-const short yylhs[] =
+const short sudoerslhs[] =
 #else
-short yylhs[] =
+short sudoerslhs[] =
 #endif
        {                                        -1,
-    0,    0,   28,   28,   29,   29,   29,   29,   29,   29,
-   29,   29,   29,   29,   29,   29,    4,    4,    3,    3,
-    3,    3,    3,   20,   20,   19,   10,   10,    8,    8,
-    8,    8,    8,    2,    2,    1,    6,    6,   23,   24,
-   22,   22,   22,   22,   22,   26,   27,   25,   25,   25,
-   25,   25,   17,   17,   18,   18,   18,   18,   18,   21,
-   21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-    5,    5,    5,   31,   31,   34,    9,    9,   32,   32,
-   35,    7,    7,   33,   33,   36,   30,   30,   37,   13,
-   13,   11,   11,   12,   12,   12,   12,   12,   16,   16,
-   14,   14,   15,   15,   15,
+    0,    0,   30,   30,   31,   31,   31,   31,   31,   31,
+   31,   31,   31,   31,   31,   31,    4,    4,    3,    3,
+    3,    3,    3,   21,   21,   20,   11,   11,    9,    9,
+    9,    9,    9,    2,    2,    1,   29,   29,   29,   29,
+    7,    7,    6,    6,   24,   25,   23,   23,   23,   23,
+   23,   27,   28,   26,   26,   26,   26,   26,   18,   18,
+   19,   19,   19,   19,   19,   22,   22,   22,   22,   22,
+   22,   22,   22,   22,   22,   22,    5,    5,    5,   33,
+   33,   36,   10,   10,   34,   34,   37,    8,    8,   35,
+   35,   38,   32,   32,   39,   14,   14,   12,   12,   13,
+   13,   13,   13,   13,   17,   17,   15,   15,   16,   16,
+   16,
 };
 #if defined(__cplusplus) || defined(__STDC__)
-const short yylen[] =
+const short sudoerslen[] =
 #else
-short yylen[] =
+short sudoerslen[] =
 #endif
        {                                         2,
     0,    1,    1,    2,    1,    2,    2,    2,    2,    2,
     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,    5,    1,    2,    3,    3,
-    0,    1,    1,    2,    2,    3,    3,    0,    1,    1,
-    2,    2,    0,    3,    0,    1,    3,    2,    1,    0,
-    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,
+    1,    1,    1,    1,    3,    5,    3,    3,    3,    3,
+    1,    2,    1,    2,    3,    3,    0,    1,    1,    2,
+    2,    3,    3,    0,    1,    1,    2,    2,    0,    3,
+    0,    1,    3,    2,    1,    0,    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,
 };
 #if defined(__cplusplus) || defined(__STDC__)
-const short yydefred[] =
+const short sudoersdefred[] =
 #else
-short yydefred[] =
+short sudoersdefred[] =
 #endif
        {                                      0,
-    0,   94,   96,   97,   98,    0,    0,    0,    0,    0,
-   95,    5,    0,    0,    0,    0,    0,    0,   90,   92,
+    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,   77,    0,    0,   73,
-   72,   71,    0,   37,   82,    0,    0,    0,   74,    0,
-    0,   79,    0,    0,   87,    0,    0,   84,   93,    0,
-    0,   24,    0,    4,    0,    0,    0,   20,    0,   28,
-    0,    0,    0,    0,   38,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   91,    0,    0,   21,   22,
-   23,   18,   78,   83,    0,   75,    0,   80,    0,   88,
-    0,   85,    0,   34,    0,    0,   25,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  103,  105,  104,    0,
-   99,  101,    0,    0,   54,   35,    0,    0,    0,    0,
-   60,    0,    0,   44,   45,  102,    0,    0,   40,   39,
-    0,    0,    0,   51,   52,  100,   46,   47,   61,   62,
-   63,   64,   65,   66,   67,   68,   69,   70,   36,
+   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,   97,    0,    0,   21,
+   22,   23,   18,   84,   37,   38,   39,   40,   89,    0,
+   81,    0,   86,    0,   94,    0,   91,    0,   34,    0,
+    0,   25,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  109,  111,  110,    0,  105,  107,    0,    0,   60,
+   35,    0,    0,    0,    0,   66,    0,    0,   50,   51,
+  108,    0,    0,   46,   45,    0,    0,    0,   57,   58,
+  106,   52,   53,   67,   68,   69,   70,   71,   72,   73,
+   74,   75,   76,   36,
 };
 #if defined(__cplusplus) || defined(__STDC__)
-const short yydgoto[] =
+const short sudoersdgoto[] =
 #else
-short yydgoto[] =
+short sudoersdgoto[] =
 #endif
        {                                      18,
-  104,  105,   27,   28,   44,   45,   46,   35,   61,   37,
-   19,   20,   21,  121,  122,  123,  106,  110,   62,   63,
-  143,  114,  115,  116,  131,  132,  133,   22,   23,   54,
-   48,   51,   57,   49,   52,   58,   55,
+  119,  120,   27,   28,   48,   49,   50,   51,   35,   67,
+   37,   19,   20,   21,  136,  137,  138,  121,  125,   68,
+   69,  158,  129,  130,  131,  146,  147,  148,   52,   22,
+   23,   60,   54,   57,   63,   55,   58,   64,   61,
 };
 #if defined(__cplusplus) || defined(__STDC__)
-const short yysindex[] =
+const short sudoerssindex[] =
 #else
-short yysindex[] =
+short sudoerssindex[] =
 #endif
-       {                                    541,
- -270,    0,    0,    0,    0,  -21,   -5,  553,  553,   20,
-    0,    0, -242, -229, -216, -214, -240,    0,    0,    0,
-  -27,  541,    0,    0,  -18, -227,    0,    2,    0,    0,
-    0,    0,    0, -223,    0,  -33,    0,  -31,  -31,    0,
-    0,    0, -243,    0,    0,  -24,  -12,   -6,    0,    3,
-    4,    0,    5,    7,    0,    6,   10,    0,    0,  553,
-  -20,    0,   11,    0, -206, -193, -191,    0,  -21,    0,
-   -5,    2,    2,    2,    0,   20,    2,   -5, -242,   20,
- -229,  553, -216,  553, -214,    0,   33,   -5,    0,    0,
-    0,    0,    0,    0,   31,    0,   32,    0,   34,    0,
-   34,    0,  513,    0,   35, -226,    0,   86,  -25,   36,
-   33,   19,   21, -234, -202, -201,    0,    0,    0, -232,
-    0,    0,   41,   86,    0,    0, -176, -173,   37,   38,
-    0, -198, -195,    0,    0,    0,   86,   41,    0,    0,
- -169, -168,  569,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,};
+       {                                    -33,
+ -277,    0,    0,    0,    0,  -13,   75,  105,  105,  -15,
+    0,    0, -246, -241, -217, -210, -226,    0,    0,    0,
+   -5,  -33,    0,    0,   -3, -244,    0,    5,    0,    0,
+    0,    0,    0, -237,    0,  -28,    0,  -19,  -19,    0,
+    0,    0, -251,   -7,   -1,    4,    7,    0,    0,    0,
+  -14,  -20,   -2,    8,    0,    6,   11,    0,    9,   13,
+    0,   12,   14,    0,    0,  105,  -11,    0,   18,    0,
+ -203, -200, -188,    0,  -13,    0,   75,    5,    5,    5,
+    0, -187, -185, -184, -183,  -15,    5,    0,   75, -246,
+  -15, -241,  105, -217,  105, -210,    0,   42,   75,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   39,
+    0,   40,    0,   43,    0,   43,    0,   45,    0,   44,
+ -279,    0,  135,   -6,   49,   42,   25,   32, -243, -195,
+ -192,    0,    0,    0, -236,    0,    0,   54,  135,    0,
+    0, -164, -163,   41,   46,    0, -189, -180,    0,    0,
+    0,  135,   54,    0,    0, -159, -158,  585,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
-const short yyrindex[] =
+const short sudoersrindex[] =
 #else
-short yyrindex[] =
+short sudoersrindex[] =
 #endif
-       {                                     96,
+       {                                    106,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  110,    0,    0,    1,    0,    0,  181,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,   97,    0,    0,    1,    0,    0,  177,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  207,    0,    0,
-  237,    0,    0,  271,    0,    0,  300,    0,    0,    0,
-    0,    0,  329,    0,    0,    0,    0,    0,    0,    0,
-    0,  358,  387,  417,    0,    0,  446,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  463,    0,    0,    0,
-    0,    0,    0,    0,   30,    0,   59,    0,   89,    0,
-  118,    0,   60,    0,  148,  -28,    0,   62,   63,    0,
-  463,    0,    0,  594,  489,  512,    0,    0,    0,    0,
-    0,    0,   64,    0,    0,    0,    0,    0,    0,    0,
-    0,  623,  653,    0,    0,    0,    0,   65,    0,    0,
+    0,    0,    0,  211,    0,    0,  241,    0,    0,  271,
+    0,    0,  301,    0,    0,    0,    0,    0,  331,    0,
+    0,    0,    0,    0,    0,    0,    0,  361,  391,  421,
+    0,    0,    0,    0,    0,    0,  451,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  467,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   31,
+    0,   61,    0,   91,    0,  121,    0,   70,    0,  151,
+  495,    0,   71,   72,    0,  467,    0,    0,  615,  525,
+  555,    0,    0,    0,    0,    0,    0,   73,    0,    0,
+    0,    0,    0,    0,    0,    0,  645,  675,    0,    0,
+    0,    0,   74,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,};
+    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
-const short yygindex[] =
+const short sudoersgindex[] =
 #else
-short yygindex[] =
+short sudoersgindex[] =
 #endif
        {                                      0,
-  -11,    0,   39,   12,   66,  -72,   27,   76,   -4,   40,
-   52,   98,   -1,  -23,   -7,   -8,    0,    0,   42,    0,
-    0,    0,    8,   13,    0,  -13,   -9,    0,   99,    0,
-    0,    0,    0,   46,   45,   44,   48,
+  -10,    0,   47,   17,   80,   65,  -84,   27,   92,   -4,
+   48,   62,  112,    2,  -25,   10,   -9,    0,    0,   33,
+    0,    0,    0,    3,   16,    0,  -17,  -12,    0,    0,
+  111,    0,    0,    0,    0,   50,   51,   52,   53,
 };
-#define YYTABLESIZE 932
+#define YYTABLESIZE 970
 #if defined(__cplusplus) || defined(__STDC__)
-const short yytable[] =
+const short sudoerstable[] =
 #else
-short yytable[] =
+short sudoerstable[] =
 #endif
-       {                                      26,
-   19,   26,   36,   94,   41,   34,   38,   39,   26,   24,
-   71,   26,   60,   40,   41,   47,   60,    2,   60,   76,
-    3,    4,    5,   71,   66,  117,   67,   34,   50,   76,
-  118,   68,  124,   19,   29,   42,   30,   31,   11,   32,
-   87,   53,   65,   56,   19,   69,  119,   72,   78,   73,
-   74,   79,   43,  129,  130,   33,   89,   77,   81,  112,
-  113,   81,   76,   80,   83,   82,   84,   85,   88,   90,
-  159,   91,  103,   95,   71,   76,  125,   60,  111,  127,
-   99,  128,  101,  112,  137,  113,  139,   76,   89,  140,
-  130,   81,  129,  147,  148,    1,    2,  141,  142,  126,
-   55,  109,   59,   56,   58,   57,   97,   92,   75,   70,
-   93,   86,  136,  146,   59,  138,   81,   86,  120,  145,
-   64,   89,  144,  135,   96,   98,    0,  134,  102,  107,
-  100,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   89,   26,    0,    0,
-   86,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       {                                      17,
+   19,  109,   36,   24,   26,   40,   41,  127,  128,   38,
+   39,   53,   43,   26,   74,   77,   56,   43,   26,   26,
+   29,  132,   30,   31,   66,   32,  133,   34,   42,   86,
+   82,    2,   77,   19,    3,    4,    5,   66,   66,   72,
+   59,   73,   33,  134,   19,  144,  145,   62,   75,   98,
+   82,  139,   78,   11,   79,   80,   83,   71,   89,  100,
+   87,   84,  101,   82,   85,   90,   91,   87,   92,   93,
+   94,   96,   95,  174,  102,   99,  105,   17,  106,  107,
+  108,  118,   77,   86,  110,  142,   66,  126,   82,  140,
+   95,  127,  143,   87,  114,  128,  116,  152,  154,  155,
+  145,  156,  123,  162,  163,    1,  157,   34,  144,    2,
+   61,   65,   62,   64,   63,  141,   88,  112,   87,  124,
+   92,  103,   81,   95,  104,   76,  161,   97,   65,  153,
+  160,  122,   70,  150,  159,    0,    0,   17,    0,  111,
+    0,    0,  113,    0,  151,  149,  115,  117,   95,    0,
+   26,    0,    0,   92,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  135,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   92,    0,
+   12,    0,    0,   26,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   26,    0,
+    9,    0,    0,   12,    0,    0,    0,    0,    0,    0,
+    0,    0,    1,    0,    2,    0,    0,    3,    4,    5,
+   25,    6,    7,    8,    9,   10,   40,   41,    0,   25,
+   10,   40,   41,    9,   25,   25,   11,   12,   13,   14,
+   15,   16,   29,    0,   30,   31,   19,   32,   19,   42,
+    0,   19,   19,   19,   42,   19,   19,   19,   19,   19,
+    8,    0,    0,   10,   33,    0,   44,   45,   46,   47,
+   19,   19,   19,   19,   19,   19,   82,    0,   82,    0,
+    0,   82,   82,   82,    0,   82,   82,   82,   82,   82,
+   11,    0,    2,    8,    0,    3,    4,    5,    0,    0,
+   82,   82,   82,   82,   82,   82,   87,    0,   87,    0,
+    0,   87,   87,   87,   11,   87,   87,   87,   87,   87,
+    7,    0,   29,   11,   30,   31,    0,   32,    0,    0,
+   87,   87,   87,   87,   87,   87,   95,    0,   95,    0,
+    0,   95,   95,   95,   33,   95,   95,   95,   95,   95,
+   15,    0,    2,    7,    0,    3,    4,    5,    0,    0,
+   95,   95,   95,   95,   95,   95,   92,    0,   92,    0,
+    0,   92,   92,   92,   11,   92,   92,   92,   92,   92,
+   13,    0,  132,   15,    0,    0,    0,  133,    0,    0,
+   92,   92,   92,   92,   92,   92,   26,    0,   26,    0,
+    0,   26,   26,   26,  134,   26,   26,   26,   26,   26,
+   14,    0,    0,   13,    0,    0,    0,    0,    0,    0,
+   26,   26,   26,   26,   26,   26,   12,    0,   12,    0,
+    0,   12,   12,   12,    0,   12,   12,   12,   12,   12,
+   16,    0,    0,   14,    0,    0,    0,    0,    0,    0,
+   12,   12,   12,   12,   12,   12,    9,    0,    9,    0,
+    0,    9,    9,    9,    0,    9,    9,    9,    9,    9,
+    0,    0,    0,   16,    0,    0,    0,    0,    0,    0,
+    9,    9,    9,    9,    9,    9,   10,    0,   10,   59,
+    0,   10,   10,   10,    0,   10,   10,   10,   10,   10,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   86,   12,    0,    0,    0,
-   26,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   10,   10,   10,   10,   10,   10,    8,   47,    8,    0,
+    0,    8,    8,    8,    0,    8,    8,    8,    8,    8,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   26,    9,    0,    0,   12,
+    8,    8,    8,    8,    8,    8,   11,   48,   11,    0,
+    0,   11,   11,   11,    0,   11,   11,   11,   11,   11,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   25,    0,   25,   41,   41,
-   29,    0,   30,   31,   25,   32,   10,   25,    0,    9,
-   41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
-   41,   33,   29,    0,   30,   31,   19,   32,   19,   41,
-   41,   19,   19,   19,   19,   19,   19,   19,   19,   10,
-    8,    0,    0,   33,    0,    0,   40,   41,    0,   19,
-   19,   19,   19,   19,   19,   76,    0,   76,    0,    0,
-   76,   76,   76,   76,   76,   76,   76,   76,   42,   11,
-    0,    0,    0,    8,    0,    0,    0,    0,   76,   76,
-   76,   76,   76,   76,   81,    0,   81,    0,    0,   81,
-   81,   81,   81,   81,   81,   81,   81,    0,    7,    0,
-    0,    0,   11,    0,    0,    0,    0,   81,   81,   81,
-   81,   81,   81,  117,   89,    0,   89,    0,  118,   89,
-   89,   89,   89,   89,   89,   89,   89,   15,    0,    0,
-    0,    7,    0,    0,  119,    0,    0,   89,   89,   89,
-   89,   89,   89,   86,    0,   86,    0,    0,   86,   86,
-   86,   86,   86,   86,   86,   86,   13,    0,    0,    0,
-   15,    0,    0,    0,    0,    0,   86,   86,   86,   86,
-   86,   86,    0,   26,    0,   26,    0,    0,   26,   26,
-   26,   26,   26,   26,   26,   26,   14,    0,    0,   13,
-    0,    0,    0,    0,    0,    0,   26,   26,   26,   26,
-   26,   26,   12,    0,   12,    0,    0,   12,   12,   12,
-   12,   12,   12,   12,   12,   16,    0,    0,    0,   14,
-    0,    0,    0,    0,    0,   12,   12,   12,   12,   12,
-   12,    0,    9,    0,    9,    0,    0,    9,    9,    9,
-    9,    9,    9,    9,    9,    0,    0,    0,   16,    0,
-    0,    0,    0,    0,    0,    9,    9,    9,    9,    9,
-    9,    0,   10,    0,   10,   53,    0,   10,   10,   10,
-   10,   10,   10,   10,   10,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   10,   10,   10,   10,   10,
-   10,   42,    0,    0,    0,    0,    8,    0,    8,    0,
-    0,    8,    8,    8,    8,    8,    8,    8,    8,    0,
-    0,    0,    0,    0,   43,   17,    0,    0,    0,    8,
-    8,    8,    8,    8,    8,   11,    0,   11,    0,    0,
-   11,   11,   11,   11,   11,   11,   11,   11,    0,    0,
-  108,    0,    0,   17,    0,    0,    0,    0,   11,   11,
-   11,   11,   11,   11,    7,   17,    7,    0,    0,    7,
-    7,    7,    7,    7,    7,    7,    7,    0,    0,    0,
-    0,   43,    0,    0,    0,    0,    0,    7,    7,    7,
-    7,    7,    7,   15,    0,   15,    0,    0,   15,   15,
-   15,   15,   15,   15,   15,   15,   48,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   15,   15,   15,   15,
-   15,   15,   13,    0,   13,    0,    0,   13,   13,   13,
-   13,   13,   13,   13,   13,   49,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   13,   13,   13,   13,   13,
-   13,    0,   14,    0,   14,    0,    0,   14,   14,   14,
-   14,   14,   14,   14,   14,   50,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   14,   14,   14,   14,   14,
-   14,   16,    0,   16,    0,    0,   16,   16,   16,   16,
-   16,   16,   16,   16,    0,    0,    0,    0,    0,   53,
-   53,    0,    0,    0,   16,   16,   16,   16,   16,   16,
-    0,   53,   53,   53,   53,   53,   53,   53,   53,   53,
-   53,   53,    0,    0,    0,   42,   42,    0,   53,   53,
-   53,   53,    0,    0,    0,    0,    0,   42,   42,   42,
-   42,   42,   42,   42,   42,   42,   42,   42,   43,   43,
-    2,    0,    0,    3,    4,    5,   42,   42,    0,    0,
-   43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-   43,   11,    0,    0,    0,    0,    1,    0,    2,   43,
-   43,    3,    4,    5,    6,    7,    8,    9,   10,    0,
-    2,    0,    0,    3,    4,    5,    0,    0,    0,   11,
-   12,   13,   14,   15,   16,   40,   41,    0,    0,    0,
-    0,   11,    0,    0,    0,    0,    0,  149,  150,  151,
-  152,  153,  154,  155,  156,  157,  158,   42,    0,    0,
-   48,   48,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   48,   48,   48,   48,   48,   48,   48,   48,
-   48,   48,   48,    0,    0,    0,    0,    0,    0,   49,
-   49,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,   49,   49,   49,   49,   49,   49,   49,   49,   49,
-   49,   49,    0,    0,    0,    0,    0,    0,    0,   50,
-   50,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,   50,   50,   50,   50,   50,   50,   50,   50,   50,
-   50,   50,
+   11,   11,   11,   11,   11,   11,    7,   49,    7,    0,
+    0,    7,    7,    7,    0,    7,    7,    7,    7,    7,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    7,    7,    7,    7,    7,    7,   15,   43,   15,    0,
+    0,   15,   15,   15,    0,   15,   15,   15,   15,   15,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   15,   15,   15,   15,   15,   15,   13,   54,   13,    0,
+    0,   13,   13,   13,    0,   13,   13,   13,   13,   13,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   13,   13,   13,   13,   13,   13,   14,   55,   14,    0,
+    0,   14,   14,   14,    0,   14,   14,   14,   14,   14,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   14,   14,   14,   14,   14,   14,   16,   56,   16,    0,
+    0,   16,   16,   16,    0,   16,   16,   16,   16,   16,
+    0,    0,    0,   59,   59,    0,    0,    0,    0,    0,
+   16,   16,   16,   16,   16,   16,   59,   59,   59,   59,
+   59,   59,   59,   59,   59,   59,   59,    0,    0,    0,
+    0,   47,   47,   59,   59,   59,   59,    0,   59,   59,
+   59,   59,    0,    0,   47,   47,   47,   47,   47,   47,
+   47,   47,   47,   47,   47,    0,    0,    0,    0,    0,
+    0,   48,   48,   47,   47,    0,   47,   47,   47,   47,
+    0,    0,    0,    0,   48,   48,   48,   48,   48,   48,
+   48,   48,   48,   48,   48,    0,    0,    0,    0,    0,
+    0,   49,   49,   48,   48,    0,   48,   48,   48,   48,
+    0,    0,    0,    0,   49,   49,   49,   49,   49,   49,
+   49,   49,   49,   49,   49,    0,    0,    0,    0,    0,
+    0,   40,   41,   49,   49,    0,   49,   49,   49,   49,
+    0,    0,    0,    0,  164,  165,  166,  167,  168,  169,
+  170,  171,  172,  173,   42,    0,    0,    0,    0,    0,
+    0,   54,   54,    0,    0,    0,   44,   45,   46,   47,
+    0,    0,    0,    0,   54,   54,   54,   54,   54,   54,
+   54,   54,   54,   54,   54,    0,    0,    0,    0,    0,
+    0,   55,   55,    0,    0,    0,   54,   54,   54,   54,
+    0,    0,    0,    0,   55,   55,   55,   55,   55,   55,
+   55,   55,   55,   55,   55,    0,    0,    0,    0,    0,
+    0,   56,   56,    0,    0,    0,   55,   55,   55,   55,
+    0,    0,    0,    0,   56,   56,   56,   56,   56,   56,
+   56,   56,   56,   56,   56,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   56,   56,   56,   56,
 };
 #if defined(__cplusplus) || defined(__STDC__)
-const short yycheck[] =
+const short sudoerscheck[] =
 #else
-short yycheck[] =
+short sudoerscheck[] =
 #endif
        {                                      33,
-    0,   33,    7,   76,   33,   33,    8,    9,   33,  280,
-   44,   33,   44,  257,  258,  258,   44,  258,   44,   44,
-  261,  262,  263,   44,   43,  258,   45,   33,  258,    0,
-  263,  259,   58,   33,  258,  279,  260,  261,  279,  263,
-   61,  258,   61,  258,   44,   44,  279,   36,   61,   38,
-   39,   58,   33,  288,  289,  279,  263,   46,    0,  286,
-  287,   58,   33,   61,   58,   61,   61,   58,   58,  263,
-  143,  263,   40,   78,   44,   44,   41,   44,   44,   61,
-   82,   61,   84,  286,   44,  287,  263,   58,    0,  263,
-  289,   33,  288,  263,  263,    0,    0,   61,   61,  111,
-   41,  103,   41,   41,   41,   41,   80,   69,   43,   34,
-   71,   60,  120,  137,   17,  124,   58,    0,   33,  133,
-   22,   33,  132,  116,   79,   81,   -1,  115,   85,   88,
-   83,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,
-   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+    0,   86,    7,  281,   33,  257,  258,  287,  288,    8,
+    9,  258,   33,   33,  259,   44,  258,   33,   33,   33,
+  258,  258,  260,  261,   44,  263,  263,   33,  280,   44,
+    0,  258,   44,   33,  261,  262,  263,   44,   44,   43,
+  258,   45,  280,  280,   44,  289,  290,  258,   44,   61,
+   58,   58,   36,  280,   38,   39,   58,   61,   61,  263,
+    0,   58,  263,   33,   58,   58,   61,   51,   58,   61,
+   58,   58,   61,  158,  263,   58,  264,   33,  264,  264,
+  264,   40,   44,   44,   89,   61,   44,   44,   58,   41,
+    0,  287,   61,   33,   93,  288,   95,   44,  263,  263,
+  290,   61,   58,  263,  263,    0,   61,   33,  289,    0,
+   41,   41,   41,   41,   41,  126,   52,   91,   58,  118,
+    0,   75,   43,   33,   77,   34,  152,   66,   17,  139,
+  148,   99,   22,  131,  147,   -1,   -1,   33,   -1,   90,
+   -1,   -1,   92,   -1,  135,  130,   94,   96,   58,   -1,
+    0,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   -1,
+    0,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   -1,
+    0,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
+  259,  265,  266,  267,  268,  269,  257,  258,   -1,  259,
+    0,  257,  258,   33,  259,  259,  280,  281,  282,  283,
+  284,  285,  258,   -1,  260,  261,  256,  263,  258,  280,
+   -1,  261,  262,  263,  280,  265,  266,  267,  268,  269,
+    0,   -1,   -1,   33,  280,   -1,  292,  293,  294,  295,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+    0,   -1,  258,   33,   -1,  261,  262,  263,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,  280,  265,  266,  267,  268,  269,
+    0,   -1,  258,   33,  260,  261,   -1,  263,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,  280,  265,  266,  267,  268,  269,
+    0,   -1,  258,   33,   -1,  261,  262,  263,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,  280,  265,  266,  267,  268,  269,
+    0,   -1,  258,   33,   -1,   -1,   -1,  263,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,  280,  265,  266,  267,  268,  269,
+    0,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+    0,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   33,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  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,   -1,   -1,   58,    0,   -1,   -1,   -1,
-   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  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,   -1,   -1,   58,    0,   -1,   -1,   33,
+  280,  281,  282,  283,  284,  285,  256,   33,  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,   -1,   -1,  259,   -1,  259,  257,  258,
-  258,   -1,  260,  261,  259,  263,    0,  259,   -1,   33,
-  269,  270,  271,  272,  273,  274,  275,  276,  277,  278,
-  279,  279,  258,   -1,  260,  261,  256,  263,  258,  288,
-  289,  261,  262,  263,  264,  265,  266,  267,  268,   33,
-    0,   -1,   -1,  279,   -1,   -1,  257,  258,   -1,  279,
-  280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
-  261,  262,  263,  264,  265,  266,  267,  268,  279,    0,
-   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
-  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,
-  262,  263,  264,  265,  266,  267,  268,   -1,    0,   -1,
-   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,  281,
-  282,  283,  284,  258,  256,   -1,  258,   -1,  263,  261,
-  262,  263,  264,  265,  266,  267,  268,    0,   -1,   -1,
-   -1,   33,   -1,   -1,  279,   -1,   -1,  279,  280,  281,
-  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,
-  263,  264,  265,  266,  267,  268,    0,   -1,   -1,   -1,
-   33,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
-  283,  284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,
-  263,  264,  265,  266,  267,  268,    0,   -1,   -1,   33,
-   -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
-  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,    0,   -1,   -1,   -1,   33,
-   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   -1,   -1,   -1,   33,   -1,
-   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   -1,  256,   -1,  258,   33,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   33,   -1,   -1,   -1,   -1,  256,   -1,  258,   -1,
-   -1,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
-   -1,   -1,   -1,   -1,   33,   33,   -1,   -1,   -1,  279,
-  280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
-  261,  262,  263,  264,  265,  266,  267,  268,   -1,   -1,
-   58,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
-  281,  282,  283,  284,  256,   33,  258,   -1,   -1,  261,
-  262,  263,  264,  265,  266,  267,  268,   -1,   -1,   -1,
-   -1,   33,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,
-  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,
-  263,  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
-  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
-  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,  257,
-  258,   -1,   -1,   -1,  279,  280,  281,  282,  283,  284,
-   -1,  269,  270,  271,  272,  273,  274,  275,  276,  277,
-  278,  279,   -1,   -1,   -1,  257,  258,   -1,  286,  287,
-  288,  289,   -1,   -1,   -1,   -1,   -1,  269,  270,  271,
-  272,  273,  274,  275,  276,  277,  278,  279,  257,  258,
-  258,   -1,   -1,  261,  262,  263,  288,  289,   -1,   -1,
-  269,  270,  271,  272,  273,  274,  275,  276,  277,  278,
-  279,  279,   -1,   -1,   -1,   -1,  256,   -1,  258,  288,
-  289,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
-  258,   -1,   -1,  261,  262,  263,   -1,   -1,   -1,  279,
-  280,  281,  282,  283,  284,  257,  258,   -1,   -1,   -1,
-   -1,  279,   -1,   -1,   -1,   -1,   -1,  269,  270,  271,
-  272,  273,  274,  275,  276,  277,  278,  279,   -1,   -1,
-  257,  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  269,  270,  271,  272,  273,  274,  275,  276,
-  277,  278,  279,   -1,   -1,   -1,   -1,   -1,   -1,  257,
-  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  269,  270,  271,  272,  273,  274,  275,  276,  277,
-  278,  279,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,
-  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  269,  270,  271,  272,  273,  274,  275,  276,  277,
-  278,  279,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+   -1,   -1,   -1,  257,  258,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  270,  271,  272,  273,
+  274,  275,  276,  277,  278,  279,  280,   -1,   -1,   -1,
+   -1,  257,  258,  287,  288,  289,  290,   -1,  292,  293,
+  294,  295,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,  289,  290,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,  289,  290,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,  289,  290,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,   -1,   -1,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,   -1,   -1,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,   -1,   -1,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  292,  293,  294,  295,
 };
 #define YYFINAL 18
 #ifndef YYDEBUG
 #define YYDEBUG 0
 #endif
-#define YYMAXTOKEN 290
+#define YYMAXTOKEN 295
 #if YYDEBUG
 #if defined(__cplusplus) || defined(__STDC__)
-const char * const yyname[] =
+const char * const sudoersname[] =
 #else
-char *yyname[] =
+char *sudoersname[] =
 #endif
        {
 "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -529,16 +548,17 @@ char *yyname[] =
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-"COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DEFAULTS",
-"DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND","NOPASSWD",
-"PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT","NOLOG_INPUT",
-"LOG_OUTPUT","NOLOG_OUTPUT","ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS",
-"RUNASALIAS","ERROR","TYPE","ROLE","PRIVS","LIMITPRIVS","MYSELF",
+"COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DIGEST",
+"DEFAULTS","DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND",
+"NOPASSWD","PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT",
+"NOLOG_INPUT","LOG_OUTPUT","NOLOG_OUTPUT","ALL","COMMENT","HOSTALIAS",
+"CMNDALIAS","USERALIAS","RUNASALIAS","ERROR","TYPE","ROLE","PRIVS","LIMITPRIVS",
+"MYSELF","SHA224","SHA256","SHA384","SHA512",
 };
 #if defined(__cplusplus) || defined(__STDC__)
-const char * const yyrule[] =
+const char * const sudoersrule[] =
 #else
-char *yyrule[] =
+char *sudoersrule[] =
 #endif
        {"$accept : file",
 "file :",
@@ -576,7 +596,13 @@ char *yyrule[] =
 "host : WORD",
 "cmndspeclist : cmndspec",
 "cmndspeclist : cmndspeclist ',' cmndspec",
-"cmndspec : runasspec selinux solarisprivs cmndtag opcmnd",
+"cmndspec : runasspec selinux solarisprivs cmndtag digcmnd",
+"digest : SHA224 ':' DIGEST",
+"digest : SHA256 ':' DIGEST",
+"digest : SHA384 ':' DIGEST",
+"digest : SHA512 ':' DIGEST",
+"digcmnd : opcmnd",
+"digcmnd : digest opcmnd",
 "opcmnd : cmnd",
 "opcmnd : '!' cmnd",
 "rolespec : ROLE '=' WORD",
@@ -622,8 +648,8 @@ char *yyrule[] =
 "cmndaliases : cmndalias",
 "cmndaliases : cmndaliases ':' cmndalias",
 "cmndalias : ALIAS '=' cmndlist",
-"cmndlist : opcmnd",
-"cmndlist : cmndlist ',' opcmnd",
+"cmndlist : digcmnd",
+"cmndlist : cmndlist ',' digcmnd",
 "runasaliases : runasalias",
 "runasaliases : runasaliases ':' runasalias",
 "runasalias : ALIAS '=' userlist",
@@ -673,7 +699,39 @@ short *yyss;
 short *yysslim;
 YYSTYPE *yyvs;
 int yystacksize;
-#line 674 "gram.y"
+#line 681 "gram.y"
+void
+sudoerserror(const char *s)
+{
+    debug_decl(sudoerserror, SUDO_DEBUG_PARSER)
+
+    /* If we last saw a newline the error is on the preceding line. */
+    if (last_token == COMMENT)
+       sudolineno--;
+
+    /* Save the line the first error occurred on. */
+    if (errorlineno == -1) {
+       errorlineno = sudolineno;
+       errorfile = estrdup(sudoers);
+    }
+    if (sudoers_warnings && s != NULL) {
+       LEXTRACE("<*> ");
+#ifndef TRACELEXER
+       if (trace_print == NULL || trace_print == sudoers_trace_print) {
+           const char fmt[] = ">>> %s: %s near line %d <<<\n";
+           int oldlocale;
+
+           /* Warnings are displayed in the user's locale. */
+           sudoers_setlocale(SUDOERS_LOCALE_USER, &oldlocale);
+           sudo_printf(SUDO_CONV_ERROR_MSG, _(fmt), sudoers, _(s), sudolineno);
+           sudoers_setlocale(oldlocale, NULL);
+       }
+#endif
+    }
+    parse_error = true;
+    debug_return;
+}
+
 static struct defaults *
 new_default(char *var, char *val, int op)
 {
@@ -707,6 +765,19 @@ new_member(char *name, int type)
     debug_return_ptr(m);
 }
 
+struct sudo_digest *
+new_digest(int digest_type, const char *digest_str)
+{
+    struct sudo_digest *dig;
+    debug_decl(new_digest, SUDO_DEBUG_PARSER)
+
+    dig = emalloc(sizeof(*dig));
+    dig->digest_type = digest_type;
+    dig->digest_str = estrdup(digest_str);
+
+    debug_return_ptr(dig);
+}
+
 /*
  * Add a list of defaults structures to the defaults list.
  * The binding, if non-NULL, specifies a list of hosts, users, or
@@ -876,7 +947,7 @@ init_parser(const char *path, bool quiet)
 
     debug_return;
 }
-#line 827 "gram.c"
+#line 898 "gram.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -1079,127 +1150,127 @@ yyreduce:
     switch (yyn)
     {
 case 1:
-#line 204 "gram.y"
+#line 185 "gram.y"
 { ; }
 break;
 case 5:
-#line 212 "gram.y"
+#line 193 "gram.y"
 {
                            ;
                        }
 break;
 case 6:
-#line 215 "gram.y"
+#line 196 "gram.y"
 {
                            yyerrok;
                        }
 break;
 case 7:
-#line 218 "gram.y"
+#line 199 "gram.y"
 {
                            add_userspec(yyvsp[-1].member, yyvsp[0].privilege);
                        }
 break;
 case 8:
-#line 221 "gram.y"
+#line 202 "gram.y"
 {
                            ;
                        }
 break;
 case 9:
-#line 224 "gram.y"
+#line 205 "gram.y"
 {
                            ;
                        }
 break;
 case 10:
-#line 227 "gram.y"
+#line 208 "gram.y"
 {
                            ;
                        }
 break;
 case 11:
-#line 230 "gram.y"
+#line 211 "gram.y"
 {
                            ;
                        }
 break;
 case 12:
-#line 233 "gram.y"
+#line 214 "gram.y"
 {
                            add_defaults(DEFAULTS, NULL, yyvsp[0].defaults);
                        }
 break;
 case 13:
-#line 236 "gram.y"
+#line 217 "gram.y"
 {
                            add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 14:
-#line 239 "gram.y"
+#line 220 "gram.y"
 {
                            add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 15:
-#line 242 "gram.y"
+#line 223 "gram.y"
 {
                            add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 16:
-#line 245 "gram.y"
+#line 226 "gram.y"
 {
                            add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 18:
-#line 251 "gram.y"
+#line 232 "gram.y"
 {
                            list_append(yyvsp[-2].defaults, yyvsp[0].defaults);
                            yyval.defaults = yyvsp[-2].defaults;
                        }
 break;
 case 19:
-#line 257 "gram.y"
+#line 238 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, true);
                        }
 break;
 case 20:
-#line 260 "gram.y"
+#line 241 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, false);
                        }
 break;
 case 21:
-#line 263 "gram.y"
+#line 244 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true);
                        }
 break;
 case 22:
-#line 266 "gram.y"
+#line 247 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
                        }
 break;
 case 23:
-#line 269 "gram.y"
+#line 250 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
                        }
 break;
 case 25:
-#line 275 "gram.y"
+#line 256 "gram.y"
 {
                            list_append(yyvsp[-2].privilege, yyvsp[0].privilege);
                            yyval.privilege = yyvsp[-2].privilege;
                        }
 break;
 case 26:
-#line 281 "gram.y"
+#line 262 "gram.y"
 {
                            struct privilege *p = ecalloc(1, sizeof(*p));
                            list2tq(&p->hostlist, yyvsp[-2].member);
@@ -1210,51 +1281,51 @@ case 26:
                        }
 break;
 case 27:
-#line 291 "gram.y"
+#line 272 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 28:
-#line 295 "gram.y"
+#line 276 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 29:
-#line 301 "gram.y"
+#line 282 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
 case 30:
-#line 304 "gram.y"
+#line 285 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
 case 31:
-#line 307 "gram.y"
+#line 288 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                        }
 break;
 case 32:
-#line 310 "gram.y"
+#line 291 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NTWKADDR);
                        }
 break;
 case 33:
-#line 313 "gram.y"
+#line 294 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
 case 35:
-#line 319 "gram.y"
+#line 300 "gram.y"
 {
                            list_append(yyvsp[-2].cmndspec, yyvsp[0].cmndspec);
 #ifdef HAVE_SELINUX
@@ -1294,7 +1365,7 @@ case 35:
                        }
 break;
 case 36:
-#line 358 "gram.y"
+#line 339 "gram.y"
 {
                            struct cmndspec *cs = ecalloc(1, sizeof(*cs));
                            if (yyvsp[-4].runas != NULL) {
@@ -1325,246 +1396,285 @@ case 36:
                        }
 break;
 case 37:
-#line 388 "gram.y"
+#line 369 "gram.y"
+{
+                           yyval.digest = new_digest(SUDO_DIGEST_SHA224, yyvsp[0].string);
+                       }
+break;
+case 38:
+#line 372 "gram.y"
+{
+                           yyval.digest = new_digest(SUDO_DIGEST_SHA256, yyvsp[0].string);
+                       }
+break;
+case 39:
+#line 375 "gram.y"
+{
+                           yyval.digest = new_digest(SUDO_DIGEST_SHA384, yyvsp[0].string);
+                       }
+break;
+case 40:
+#line 378 "gram.y"
+{
+                           yyval.digest = new_digest(SUDO_DIGEST_SHA512, yyvsp[0].string);
+                       }
+break;
+case 41:
+#line 383 "gram.y"
+{
+                           yyval.member = yyvsp[0].member;
+                       }
+break;
+case 42:
+#line 386 "gram.y"
+{
+                           /* XXX - yuck */
+                           struct sudo_command *c = (struct sudo_command *)(yyvsp[0].member->name);
+                           c->digest = yyvsp[-1].digest;
+                           yyval.member = yyvsp[0].member;
+                       }
+break;
+case 43:
+#line 394 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 38:
-#line 392 "gram.y"
+case 44:
+#line 398 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 39:
-#line 398 "gram.y"
+case 45:
+#line 404 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
-case 40:
-#line 403 "gram.y"
+case 46:
+#line 409 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
-case 41:
-#line 408 "gram.y"
+case 47:
+#line 414 "gram.y"
 {
                            yyval.seinfo.role = NULL;
                            yyval.seinfo.type = NULL;
                        }
 break;
-case 42:
-#line 412 "gram.y"
+case 48:
+#line 418 "gram.y"
 {
                            yyval.seinfo.role = yyvsp[0].string;
                            yyval.seinfo.type = NULL;
                        }
 break;
-case 43:
-#line 416 "gram.y"
+case 49:
+#line 422 "gram.y"
 {
                            yyval.seinfo.type = yyvsp[0].string;
                            yyval.seinfo.role = NULL;
                        }
 break;
-case 44:
-#line 420 "gram.y"
+case 50:
+#line 426 "gram.y"
 {
                            yyval.seinfo.role = yyvsp[-1].string;
                            yyval.seinfo.type = yyvsp[0].string;
                        }
 break;
-case 45:
-#line 424 "gram.y"
+case 51:
+#line 430 "gram.y"
 {
                            yyval.seinfo.type = yyvsp[-1].string;
                            yyval.seinfo.role = yyvsp[0].string;
                        }
 break;
-case 46:
-#line 430 "gram.y"
+case 52:
+#line 436 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
-case 47:
-#line 434 "gram.y"
+case 53:
+#line 440 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
-case 48:
-#line 439 "gram.y"
+case 54:
+#line 445 "gram.y"
 {
                            yyval.privinfo.privs = NULL;
                            yyval.privinfo.limitprivs = NULL;
                        }
 break;
-case 49:
-#line 443 "gram.y"
+case 55:
+#line 449 "gram.y"
 {
                            yyval.privinfo.privs = yyvsp[0].string;
                            yyval.privinfo.limitprivs = NULL;
                        }
 break;
-case 50:
-#line 447 "gram.y"
+case 56:
+#line 453 "gram.y"
 {
                            yyval.privinfo.privs = NULL;
                            yyval.privinfo.limitprivs = yyvsp[0].string;
                        }
 break;
-case 51:
-#line 451 "gram.y"
+case 57:
+#line 457 "gram.y"
 {
                            yyval.privinfo.privs = yyvsp[-1].string;
                            yyval.privinfo.limitprivs = yyvsp[0].string;
                        }
 break;
-case 52:
-#line 455 "gram.y"
+case 58:
+#line 461 "gram.y"
 {
                            yyval.privinfo.limitprivs = yyvsp[-1].string;
                            yyval.privinfo.privs = yyvsp[0].string;
                        }
 break;
-case 53:
-#line 460 "gram.y"
+case 59:
+#line 467 "gram.y"
 {
                            yyval.runas = NULL;
                        }
 break;
-case 54:
-#line 463 "gram.y"
+case 60:
+#line 470 "gram.y"
 {
                            yyval.runas = yyvsp[-1].runas;
                        }
 break;
-case 55:
-#line 468 "gram.y"
+case 61:
+#line 475 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = new_member(NULL, MYSELF);
                            /* $$->runasgroups = NULL; */
                        }
 break;
-case 56:
-#line 473 "gram.y"
+case 62:
+#line 480 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = yyvsp[0].member;
                            /* $$->runasgroups = NULL; */
                        }
 break;
-case 57:
-#line 478 "gram.y"
+case 63:
+#line 485 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = yyvsp[-2].member;
                            yyval.runas->runasgroups = yyvsp[0].member;
                        }
 break;
-case 58:
-#line 483 "gram.y"
+case 64:
+#line 490 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            /* $$->runasusers = NULL; */
                            yyval.runas->runasgroups = yyvsp[0].member;
                        }
 break;
-case 59:
-#line 488 "gram.y"
+case 65:
+#line 495 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = new_member(NULL, MYSELF);
                            /* $$->runasgroups = NULL; */
                        }
 break;
-case 60:
-#line 495 "gram.y"
+case 66:
+#line 502 "gram.y"
 {
                            yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv =
                                yyval.tag.log_input = yyval.tag.log_output = UNSPEC;
                        }
 break;
-case 61:
-#line 499 "gram.y"
+case 67:
+#line 506 "gram.y"
 {
                            yyval.tag.nopasswd = true;
                        }
 break;
-case 62:
-#line 502 "gram.y"
+case 68:
+#line 509 "gram.y"
 {
                            yyval.tag.nopasswd = false;
                        }
 break;
-case 63:
-#line 505 "gram.y"
+case 69:
+#line 512 "gram.y"
 {
                            yyval.tag.noexec = true;
                        }
 break;
-case 64:
-#line 508 "gram.y"
+case 70:
+#line 515 "gram.y"
 {
                            yyval.tag.noexec = false;
                        }
 break;
-case 65:
-#line 511 "gram.y"
+case 71:
+#line 518 "gram.y"
 {
                            yyval.tag.setenv = true;
                        }
 break;
-case 66:
-#line 514 "gram.y"
+case 72:
+#line 521 "gram.y"
 {
                            yyval.tag.setenv = false;
                        }
 break;
-case 67:
-#line 517 "gram.y"
+case 73:
+#line 524 "gram.y"
 {
                            yyval.tag.log_input = true;
                        }
 break;
-case 68:
-#line 520 "gram.y"
+case 74:
+#line 527 "gram.y"
 {
                            yyval.tag.log_input = false;
                        }
 break;
-case 69:
-#line 523 "gram.y"
+case 75:
+#line 530 "gram.y"
 {
                            yyval.tag.log_output = true;
                        }
 break;
-case 70:
-#line 526 "gram.y"
+case 76:
+#line 533 "gram.y"
 {
                            yyval.tag.log_output = false;
                        }
 break;
-case 71:
-#line 531 "gram.y"
+case 77:
+#line 538 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
-case 72:
-#line 534 "gram.y"
+case 78:
+#line 541 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
-case 73:
-#line 537 "gram.y"
+case 79:
+#line 544 "gram.y"
 {
                            struct sudo_command *c = ecalloc(1, sizeof(*c));
                            c->cmnd = yyvsp[0].command.cmnd;
@@ -1572,151 +1682,151 @@ case 73:
                            yyval.member = new_member((char *)c, COMMAND);
                        }
 break;
-case 76:
-#line 549 "gram.y"
+case 82:
+#line 556 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
-                               yyerror(s);
+                               sudoerserror(s);
                                YYERROR;
                            }
                        }
 break;
-case 78:
-#line 559 "gram.y"
+case 84:
+#line 566 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 81:
-#line 569 "gram.y"
+case 87:
+#line 576 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
-                               yyerror(s);
+                               sudoerserror(s);
                                YYERROR;
                            }
                        }
 break;
-case 83:
-#line 579 "gram.y"
+case 89:
+#line 586 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 86:
-#line 589 "gram.y"
+case 92:
+#line 596 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
-                               yyerror(s);
+                               sudoerserror(s);
                                YYERROR;
                            }
                        }
 break;
-case 89:
-#line 602 "gram.y"
+case 95:
+#line 609 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
-                               yyerror(s);
+                               sudoerserror(s);
                                YYERROR;
                            }
                        }
 break;
-case 91:
-#line 612 "gram.y"
+case 97:
+#line 619 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 92:
-#line 618 "gram.y"
+case 98:
+#line 625 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 93:
-#line 622 "gram.y"
+case 99:
+#line 629 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 94:
-#line 628 "gram.y"
+case 100:
+#line 635 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
-case 95:
-#line 631 "gram.y"
+case 101:
+#line 638 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
-case 96:
-#line 634 "gram.y"
+case 102:
+#line 641 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                        }
 break;
-case 97:
-#line 637 "gram.y"
+case 103:
+#line 644 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, USERGROUP);
                        }
 break;
-case 98:
-#line 640 "gram.y"
+case 104:
+#line 647 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
-case 100:
-#line 646 "gram.y"
+case 106:
+#line 653 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 101:
-#line 652 "gram.y"
+case 107:
+#line 659 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 102:
-#line 656 "gram.y"
+case 108:
+#line 663 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 103:
-#line 662 "gram.y"
+case 109:
+#line 669 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
-case 104:
-#line 665 "gram.y"
+case 110:
+#line 672 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
-case 105:
-#line 668 "gram.y"
+case 111:
+#line 675 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
-#line 1667 "gram.c"
+#line 1777 "gram.c"
     }
     yyssp -= yym;
     yystate = *yyssp;