#include <sys/cdefs.h>
#ifndef lint
#if 0
static char yysccsid[] = "@(#)yaccpar	1.9 (Berkeley) 02/21/93";
#else
__IDSTRING(yyrcsid, "$NetBSD: skeleton.c,v 1.14 1997/10/20 03:41:16 lukem Exp $");
#endif
#endif
#include <stdlib.h>
#define YYBYACC 1
#define YYMAJOR 1
#define YYMINOR 9
#define YYLEX yylex()
#define YYEMPTY -1
#define yyclearin (yychar=(YYEMPTY))
#define yyerrok (yyerrflag=0)
#define YYRECOVERING (yyerrflag!=0)
#define YYPREFIX "yy"
#line 22 "parse.y"
#include <sys/types.h>
#include <sys/stat.h>

#include <ctype.h>
#include <grp.h>
#include <pwd.h>
#include <string.h>
#include <syslog.h>

#include "fdm.h"
#include "deliver.h"
#include "fetch.h"
#include "match.h"

struct strb	*parse_tags;
struct macros	 parse_macros;
struct macro	*parse_last;	/* last command-line argument macro */

u_int		 parse_ruleidx;
u_int		 parse_actionidx;

ARRAY_DECL(, struct rule *) parse_rulestack;
struct rule	*parse_rule;

struct files	 parse_filestack;
struct file	*parse_file;

int		 yyparse(void);

int
parse_conf(const char *path, struct strings *macros)
{
	struct macro	*macro;
	FILE		*f;
	u_int		 i;

        if ((f = fopen(path, "r")) == NULL)
                return (-1);

	ARRAY_INIT(&parse_rulestack);
	parse_rule = NULL;

	ARRAY_INIT(&parse_filestack);
	parse_file = xmalloc(sizeof *parse_file);

	parse_file->f = f;
	parse_file->line = 0;
	parse_file->path = path;

	strb_create(&parse_tags);
	default_tags(&parse_tags, NULL);

	TAILQ_INIT(&parse_macros);
	parse_last = NULL;
	for (i = 0; i < ARRAY_LENGTH(macros); i++) {
		parse_last = extract_macro(ARRAY_ITEM(macros, i));
		TAILQ_INSERT_TAIL(&parse_macros, parse_last, entry);
	}

	parse_file->line++;
        yyparse();

	if (!ARRAY_EMPTY(&parse_rulestack))
		yyerror("missing }");
	ARRAY_FREE(&parse_rulestack);

	ARRAY_FREE(&parse_filestack);
	xfree(parse_file);

	while (!TAILQ_EMPTY(&parse_macros)) {
		macro = TAILQ_FIRST(&parse_macros);
		TAILQ_REMOVE(&parse_macros, macro, entry);

		if (macro->type == MACRO_STRING)
			xfree(macro->value.str);
		xfree(macro);
	}

	strb_destroy(&parse_tags);

        fclose(f);
        return (0);
}

__dead printflike1 void
yyerror(const char *fmt, ...)
{
	va_list	ap;
	char   *s;

	xasprintf(&s,
	    "%s: %s at line %d", parse_file->path, fmt, parse_file->line);

	va_start(ap, fmt);
	log_vwrite(NULL, LOG_CRIT, s, ap);
	va_end(ap);

	exit(1);
}

printflike1 void
yywarn(const char *fmt, ...)
{
	va_list	ap;
	char   *s;

	xasprintf(&s,
	    "%s: %s at line %d", parse_file->path, fmt, parse_file->rule_line);

	va_start(ap, fmt);
	log_vwrite(NULL, LOG_CRIT, s, ap);
	va_end(ap);

	xfree(s);
}
#line 157 "parse.y"
typedef union
{
	long long 	 	 number;
        char 			*string;
	int 		 	 flag;
	u_int			 locks;
	struct {
		struct fetch	*fetch;
		void		*data;
	} fetch;
	struct {
		char		*host;
		char		*port;
	} server;
	enum area	 	 area;
	enum exprop		 exprop;
	struct actitem 		*actitem;
	struct actlist 		*actlist;
	struct expr		*expr;
	struct expritem		*expritem;
	struct strings		*strings;
	struct replstrs		*replstrs;
	enum fetch_only		 only;
	struct {
		char		*path;
		enum fetch_only	 only;
	} poponly;
	struct {
		int		 flags;
		char		*str;
	} re;
	uid_t			 uid;
	gid_t			 gid;
	struct {
		struct users	*users;
		int		 find_uid;
	} users;
	enum cmp		 cmp;
	struct rule		*rule;
	struct {
		char		*user;
		int		 user_netrc;
		char		*pass;
		int		 pass_netrc;
	} userpass;
} YYSTYPE;
#line 183 "y.tab.c"
#define TOKALL 257
#define TOKACCOUNT 258
#define TOKSERVER 259
#define TOKPORT 260
#define TOKUSER 261
#define TOKPASS 262
#define TOKACTION 263
#define TOKSET 264
#define TOKACCOUNTS 265
#define TOKMATCH 266
#define TOKIN 267
#define TOKCONTINUE 268
#define TOKSTDIN 269
#define TOKPOP3 270
#define TOKPOP3S 271
#define TOKNONE 272
#define TOKCASE 273
#define TOKAND 274
#define TOKOR 275
#define TOKTO 276
#define TOKACTIONS 277
#define TOKHEADERS 278
#define TOKBODY 279
#define TOKMAXSIZE 280
#define TOKDELTOOBIG 281
#define TOKLOCKTYPES 282
#define TOKDEFUSER 283
#define TOKDOMAIN 284
#define TOKDOMAINS 285
#define TOKHEADER 286
#define TOKFROMHEADERS 287
#define TOKUSERS 288
#define TOKMATCHED 289
#define TOKUNMATCHED 290
#define TOKNOT 291
#define TOKIMAP 292
#define TOKIMAPS 293
#define TOKDISABLED 294
#define TOKFOLDER 295
#define TOKPROXY 296
#define TOKALLOWMANY 297
#define TOKDROP 298
#define TOKLOCKFILE 299
#define TOKRETURNS 300
#define TOKPIPE 301
#define TOKSMTP 302
#define TOKMAILDIR 303
#define TOKMBOX 304
#define TOKMBOXES 305
#define TOKWRITE 306
#define TOKAPPEND 307
#define TOKREWRITE 308
#define TOKTAG 309
#define TOKTAGGED 310
#define TOKSIZE 311
#define TOKMAILDIRS 312
#define TOKEXEC 313
#define TOKSTRING 314
#define TOKKEEP 315
#define TOKIMPLACT 316
#define TOKHOURS 317
#define TOKMINUTES 318
#define TOKSECONDS 319
#define TOKDAYS 320
#define TOKWEEKS 321
#define TOKMONTHS 322
#define TOKYEARS 323
#define TOKAGE 324
#define TOKINVALID 325
#define TOKKILOBYTES 326
#define TOKMEGABYTES 327
#define TOKGIGABYTES 328
#define TOKBYTES 329
#define TOKATTACHMENT 330
#define TOKCOUNT 331
#define TOKTOTALSIZE 332
#define TOKANYTYPE 333
#define TOKANYNAME 334
#define TOKANYSIZE 335
#define TOKEQ 336
#define TOKNE 337
#define TOKNNTP 338
#define TOKNNTPS 339
#define TOKGROUP 340
#define TOKGROUPS 341
#define TOKPURGEAFTER 342
#define TOKCOMPRESS 343
#define TOKNORECEIVED 344
#define TOKFILEUMASK 345
#define TOKFILEGROUP 346
#define TOKVALUE 347
#define TOKTIMEOUT 348
#define TOKREMOVEHEADER 349
#define TOKREMOVEHEADERS 350
#define TOKSTDOUT 351
#define TOKNOVERIFY 352
#define TOKADDHEADER 353
#define TOKQUEUEHIGH 354
#define TOKQUEUELOW 355
#define TOKNOAPOP 356
#define TOKVERIFYCERTS 357
#define TOKEXPIRE 358
#define TOKTOCACHE 359
#define TOKINCACHE 360
#define TOKKEY 361
#define TOKNEWONLY 362
#define TOKOLDONLY 363
#define TOKCACHE 364
#define TOKFLOCK 365
#define TOKFCNTL 366
#define TOKDOTLOCK 367
#define TOKSTRIPCHARACTERS 368
#define NONE 369
#define NUMBER 370
#define STRING 371
#define STRMACRO 372
#define NUMMACRO 373
#define STRCOMMAND 374
#define NUMCOMMAND 375
#define YYERRCODE 256
short yylhs[] = {                                        -1,
    0,    0,    0,    0,    0,    0,    0,    0,    0,   74,
   74,   75,   75,   76,   76,   77,   77,   78,   78,   79,
   79,   80,   80,   81,   81,   82,   82,   51,   51,   52,
   52,   47,   47,   47,   48,   48,   29,   29,   29,   49,
   50,   27,   27,   27,   27,   27,   28,   28,   28,   28,
   28,   28,   28,   28,   31,   31,   73,   71,   71,   71,
   71,   71,   71,   71,   71,   71,   71,   71,   71,   71,
   71,   71,   71,   71,   71,   71,   71,   71,   71,   71,
   69,   69,   35,   35,   53,   53,   54,   54,   61,   61,
   55,   55,   56,   56,   37,   37,   57,   57,   58,   58,
   25,   25,   25,   26,   26,   26,   65,   65,   24,   24,
   66,   66,   60,   60,   60,   60,   40,   40,   13,   13,
   15,   15,   14,   14,   44,   44,   43,   43,   45,   45,
   18,   18,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    2,    2,   68,   68,
   39,   39,   38,   38,   36,   36,   12,   12,    3,    3,
    3,    3,   30,   30,   41,   41,    5,    5,    6,    6,
    4,    4,   16,   16,   17,   17,   10,   10,    9,    9,
    9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
    9,    9,    9,    9,    9,    8,    8,    7,    7,   42,
   42,   42,   42,   72,   70,   46,   46,   59,   59,   19,
   19,   20,   20,   32,   32,   21,   21,   22,   22,   23,
   23,   64,   64,   64,   64,   63,   62,   62,   34,   34,
   33,   33,   11,   11,   11,   11,   11,   11,   11,   11,
   67,
};
short yylen[] = {                                         2,
    0,    2,    2,    2,    2,    2,    2,    2,    2,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    2,    1,    2,
    0,    1,    1,    1,    1,    3,    1,    1,    1,    1,
    1,    1,    2,    2,    2,    2,    1,    2,    2,    2,
    2,    2,    2,    2,    2,    0,    3,    3,    3,    3,
    2,    2,    3,    3,    3,    3,    3,    2,    2,    3,
    2,    3,    3,    3,    3,    2,    3,    3,    3,    3,
    3,    3,    2,    1,    2,    1,    2,    1,    2,    1,
    2,    4,    2,    4,    2,    4,    2,    4,    2,    4,
    1,    1,    1,    2,    1,    1,    1,    1,    1,    1,
    0,    2,    0,    2,    2,    4,    2,    1,    1,    0,
    1,    0,    1,    0,    2,    2,    3,    2,    0,    2,
    1,    0,    2,    2,    2,    2,    1,    3,    3,    3,
    1,    3,    4,    1,    1,    1,    2,    1,    4,    6,
    0,    1,    2,    4,    2,    4,    0,    1,    0,    2,
    2,    2,    1,    0,    1,    0,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
    2,   10,    3,    4,    5,    5,    2,    2,    4,    3,
    5,    5,    5,    4,    4,    3,    2,    1,    2,    4,
    6,    3,    1,    1,    4,    0,    2,    2,    4,    1,
    0,    1,    0,    1,    1,    1,    1,    1,    1,    1,
    1,    4,    0,    2,    2,    4,    1,    0,    3,    0,
    1,    0,    6,    6,    6,    6,    1,    1,    1,    6,
    6,
};
short yydefred[] = {                                      1,
    0,    0,    0,    0,    0,    0,    9,    0,    0,  204,
    2,    3,    4,    5,    6,    7,    8,   33,   34,   32,
   35,    0,    0,    0,   25,    0,   61,    0,    0,   26,
   27,   24,    0,   62,    0,    0,    0,   76,    0,    0,
    0,    0,    0,   71,    0,   68,   69,    0,    0,  119,
    0,    0,    0,    0,    0,    0,    0,    0,  123,    0,
   12,   13,    0,    0,   38,   39,   37,   58,    0,  106,
  102,  101,  103,  105,    0,  108,  107,   63,   70,   60,
   73,   72,   75,   74,   79,   80,   77,   78,  110,  109,
   65,    0,   66,   67,    0,    0,   93,    0,   91,   14,
   15,  152,    0,    0,  177,  178,    0,    0,  179,    0,
  187,  188,  174,    0,    0,  173,    0,    0,    0,    0,
    0,  181,    0,  118,    0,   57,    0,   82,   36,    0,
   10,   11,  145,    0,    0,    0,  175,  176,    0,    0,
  146,   22,   23,  141,    0,    0,    0,  149,    0,    0,
  144,  137,    0,    0,  114,    0,  115,   44,   45,   46,
   43,  104,   48,   49,   50,   51,   52,   53,   54,   86,
    0,    0,  203,  205,    0,    0,    0,    0,  197,  117,
    0,  167,  168,    0,    0,  190,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  180,   55,  237,    0,  217,
    0,  219,   18,   20,   21,   19,  220,  221,    0,    0,
    0,    0,  238,  239,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  148,    0,    0,    0,    0,    0,
    0,    0,    0,   90,   94,   85,   92,    0,    0,    0,
    0,  196,  184,    0,  189,  169,  170,    0,  171,  172,
    0,    0,    0,    0,    0,    0,    0,  160,  161,  162,
    0,    0,  121,  241,    0,    0,    0,    0,   97,    0,
   99,    0,    0,  140,  131,  139,    0,  142,    0,    0,
  138,    0,  150,  147,    0,    0,  116,   89,  158,  202,
    0,    0,  154,    0,  185,  191,  192,  193,    0,  112,
    0,    0,    0,    0,    0,    0,    0,   16,   17,    0,
    0,   88,    0,    0,    0,  127,    0,    0,    0,    0,
  156,   96,    0,  200,    0,    0,    0,    0,  227,    0,
  225,  214,  215,    0,    0,    0,    0,    0,    0,  208,
   98,   87,  100,  126,  125,    0,  163,    0,    0,    0,
    0,    0,    0,  212,    0,  207,  231,    0,    0,    0,
  201,    0,    0,  234,  236,  222,  229,  210,  233,  235,
  240,  209,  165,    0,  226,  182,
};
short yydgoto[] = {                                       1,
  225,  226,  196,  248,  184,  250,   51,  107,   52,  108,
  209,  290,   53,   60,  264,  149,  150,  276,  369,  355,
  210,  211,  212,   88,   74,   75,   68,   91,   76,  348,
  126,  334,  358,  335,  285,  151,  152,  102,  103,  123,
  374,  174,  218,  316,  274,  337,   21,   22,   77,  312,
  281,  278,  171,  313,   46,   47,  213,  214,  310,   63,
  233,  328,  327,  306,   78,  257,   11,   12,   13,   14,
   15,   16,   17,  153,   64,  104,  311,  215,  216,  154,
   48,   49,
};
short yysindex[] = {                                      0,
 1353, -304, -304, 2042, -254, -304,    0,  -21,   -8,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,   15, -228, -229,    0, -268,    0, -221, -297,    0,
    0,    0, -304,    0, -304, -259, -260,    0, -232, -238,
 -268, -268, -268,    0, -304,    0,    0, -123, -118,    0,
 -208, -166, 1898,   15, -287, -304, -268, -304,    0, -229,
    0,    0, 1479,  100,    0,    0,    0,    0, -206,    0,
    0,    0,    0,    0, -171,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0, -223,    0,    0,   15, -304,    0, -304,    0,    0,
    0,    0, -104,  -88,    0,    0, -166, -254,    0, -304,
    0,    0,    0, -304,   21,    0, -304,  -52, -160, -304,
 -304,    0, -183,    0, -268,    0,   15,    0,    0, 2077,
    0,    0,    0, -170, -304, -304,    0,    0, -304, -304,
    0,    0,    0,    0, -304, -304, 2001,    0, -304, -304,
    0,    0,  -44,   -5,    0, -297,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
   54,   72,    0,    0, -225, -304,   15, -254,    0,    0,
   15,    0,    0, -268,  -40,    0, -268,  -56,   21, -304,
 -304,   21, -247,  -36, -224,    0,    0,    0, -195,    0,
 -176,    0,    0,    0,    0,    0,    0,    0, -222, -170,
 -170, -170,    0,    0,    7,   28, -304, -134,   15,  -26,
   15,  -32,  -16, -214,    0, 1791,   15,   15, -304,   15,
 -304,   15,   67,    0,    0,    0,    0, -120, 1691,  105,
   15,    0,    0, -255,    0,    0,    0, -268,    0,    0,
 -268,   15,   15, -268, -304, -297, -148,    0,    0,    0,
 -304, -304,    0,    0, -158, -158, -213, -304,    0, -304,
    0, -100, -304,    0,    0,    0, -304,    0, -304,   15,
    0, -304,    0,    0,  110,  114,    0,    0,    0,    0,
 1947, -120,    0,   15,    0,    0,    0,    0,   15,    0,
  116, -103, -103, -304, -304, -251, -131,    0,    0, -203,
   39,    0,  257,  266, -297,    0,   15,   15,   15,   15,
    0,    0, 1845,    0, -268, -304, -251, -131,    0,  -97,
    0,    0,    0, -197, -175, -304, -251, -304, -304,    0,
    0,    0,    0,    0,    0, -120,    0,  142,  -73, -175,
 -251, -304, -304,    0, -154,    0,    0, -154, -154,  329,
    0, -255, -304,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  159,    0,    0,
};
short yyrindex[] = {                                      0,
    0,    0,    0,    0, 1916,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    1, 2073, 1768,    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,
 -108,  -95,    0,   34,   24,    0,    0,    0,    0, 2102,
    0,    0,    0,    0,    0,    0,    0,    0,   60,    0,
    0,    0,    0,    0,  187,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0, 1294,    0,    0, 1335,    0,    0,    0,    0,    0,
    0,    0, -215,    0,    0,    0,  -51, 1916,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  -59,    0,    0,    0, 1365,    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, 1609, 1916,    0,    0,
 1624,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  -92,    0,    0,    0,    0,  -54,    0,
  -50,    0,    0,    0,    0,    0,    0,    0, 1385,    0,
    0,    0,    0,    0,    0,    0,    0,  234,  311,  389,
  466,  544,    0,    0,    0,    0,  621,  699,    0,  776,
    0,  854,    0,    0,    0,    0,    0, 1396,    0,    0,
  334,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0, 1674, 1750,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  674,  829,    0,    0,    0,    0,
    0,  154,    0,    0,    0,    0,    0,    0,    0,  931,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0, 1396,    0,  339,    0,    0,    0,    0, 1849,    0,
    0,    0,  984,    0,    0, 1266, 1139,    0,    0,    0,
    0,    0,    0,    0,    0,    0, 1009, 1086, 1164, 1241,
    0,    0,    0,    0,  167,    0, 1321, 1309,    0,  519,
    0,    0,    0,    0,  491,    0,  646,    0,    0,    0,
    0,    0,    0,    0,    0, 1396,    0,    0,    0,  801,
  956,    0,    0,    0, 1111,    0,    0, 1111, 1111,    0,
    0,  162,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,
};
short yygindex[] = {                                      0,
  -49,  -78,    0,    0, -102,    0,    0,    0,  -86,  115,
    0, -261,    0,    0,    0,  164,    0,    0, -219, -126,
    0,    0,    0,    0,  152,    0, -163, -105,    4,    0,
    0, -288, -119,  -99, -151,   56,    0,  180,    0, -231,
    0,    0,    9,    0,    0,  -90,  182, 1705, 1604,   30,
    0,    0,  -96,  -29,    0,    0,    0,    0,    0,  -34,
    0,    0,  -61,  -22,  -55,    0,    0,    0,    0,    0,
    0,    0,    0,   75,    0,    0,    0,    0,    0,    0,
    0,    0,
};
#define YYTABLESIZE 2441
short yytable[] = {                                      96,
   40,  172,   58,  182,   98,  183,   58,  182,  157,  183,
   58,   83,  295,  148,  151,  187,   58,  110,  173,  197,
  243,  179,   87,   56,  240,  130,   58,  198,   85,   69,
  324,   61,  258,   41,  176,   55,   50,  131,   81,   56,
   84,   40,   86,   89,   92,   93,   94,  113,  357,  100,
   70,  132,   57,  259,  260,   82,  101,   58,   62,   42,
  128,  113,  357,  159,   80,   59,   18,   19,  175,   20,
  125,  199,   65,   18,   19,   66,   20,   67,  229,  286,
  182,  245,  183,  195,  361,  249,  251,  297,  217,  254,
  298,  242,  263,  163,  164,  165,  166,  167,  168,  169,
  234,   65,  304,  305,   66,  261,   67,  105,  106,   65,
  332,  333,   66,  255,   67,   18,   19,  231,   20,  158,
  159,  160,  161,   40,  262,   40,  308,  309,   92,  268,
  373,   65,   18,   19,   66,   20,   67,   65,  370,  371,
   66,  273,   67,   71,   72,   73,  282,  289,   56,  193,
  270,  301,  151,  128,  151,  325,   61,  326,   41,  315,
  338,  339,  198,  336,  352,  198,  353,  198,  151,  198,
  188,  189,  190,  191,  192,  224,  284,  288,  235,  151,
  354,  198,   42,   62,   42,  362,   59,   69,  363,  292,
   92,  287,  198,   71,   72,   73,  237,  368,  159,  376,
  300,  159,  166,  159,  216,  159,  199,  111,  218,  199,
  164,  199,  323,  199,  159,  159,  121,  159,  265,  266,
  267,  178,  156,  364,  256,  199,  162,  350,  159,  293,
  238,  365,  122,  129,  321,  244,  199,  351,  322,  129,
  314,  329,  360,  307,  269,  271,    0,   18,   19,  239,
   20,  296,   18,   19,   69,   20,    0,   69,   40,    0,
   40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
   40,   40,  186,  284,   40,   40,   40,   40,  128,  246,
  247,   56,   18,   19,    0,   20,   56,   56,   40,   56,
    0,   41,   40,   40,   40,   40,   41,   41,   40,   41,
   40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
  136,   59,   40,   40,  277,   40,  275,   42,  344,    0,
   42,    0,   42,   42,   42,   42,   18,   19,  347,   20,
  279,    0,    0,   42,   42,    0,   42,    0,   40,   40,
   40,   40,  342,  342,    0,    0,    0,   42,   41,   40,
   40,   40,   40,   40,   18,   19,   40,   20,  129,   40,
    0,    0,   40,   40,   40,   18,   19,  359,   20,   40,
   40,   40,   40,   40,   40,   40,    0,   18,   19,    0,
   20,  341,  367,    0,    0,   41,  155,   56,  132,   41,
  343,   41,   56,    0,   41,   56,   56,   41,   18,   19,
    0,   20,   41,    0,   41,   41,   41,   41,    0,   18,
   19,  128,   20,    0,  128,  128,  128,  128,    0,  128,
    0,  128,    0,   42,   18,   19,    0,   20,   42,  128,
  128,   42,   42,    0,    0,  136,   65,   18,   19,   66,
   20,   67,   18,   19,   59,   20,    0,    0,  128,   59,
   59,  128,   59,  372,  128,  128,  128,  128,   84,  128,
  128,  128,  128,   83,    0,  134,  128,    0,  128,   65,
   18,   19,   66,   20,   67,   18,   19,    0,   20,    0,
   18,   19,    0,   20,   18,   19,    0,   20,    0,    0,
  213,  129,    0,  128,  128,    0,  129,  129,    0,  129,
    0,  129,  128,  128,  128,  128,  128,    0,    0,  128,
  129,    0,  128,  132,    0,  128,  128,  128,  224,    0,
    0,    0,  128,    0,    0,  128,  128,    0,    0,    0,
    0,  129,    0,    0,  129,  129,  129,  129,    0,  129,
  129,  129,  129,   31,    0,    0,  129,    0,  129,    0,
   59,    0,    0,    0,    0,   59,    0,    0,   59,   59,
    0,    0,    0,    0,    0,    0,    0,    0,  136,    0,
    0,    0,    0,  136,  136,    0,  136,    0,  136,    0,
    0,    0,  129,  129,  129,    0,  129,  136,    0,    0,
  134,    0,  129,    0,    0,    0,    0,  129,    0,    0,
    0,    0,  129,    0,    0,  129,  129,    0,  136,    0,
    0,  136,  136,  136,  136,  213,  136,  136,  136,  136,
  133,    0,    0,  136,    0,  136,    0,   18,   19,    0,
   20,    0,    0,    0,    0,    0,   18,   19,    0,   20,
    0,    0,    0,  224,    0,  232,  132,    0,    0,    0,
    0,  132,  132,    0,  132,    0,  132,    0,    0,  136,
  136,  136,    0,  136,    0,  132,    0,    0,   31,  136,
    0,    0,    0,  223,  136,    0,    0,    0,    0,  136,
    0,    0,  136,  136,    0,    0,  132,    0,    0,  132,
  132,  132,  132,    0,  132,  132,  132,  132,  135,   18,
   19,  132,   20,  132,   84,   84,    0,   84,    0,   83,
   83,    0,   83,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  134,    0,    0,    0,    0,  134,  134,
    0,  134,    0,  134,    0,    0,    0,  132,  132,  132,
    0,  132,  134,    0,    0,  133,    0,  132,  213,    0,
    0,    0,  132,  213,  213,    0,  213,  132,    0,    0,
  132,  132,    0,  134,    0,    0,  134,  134,  134,  134,
  232,  134,  134,  134,  134,  155,  224,    0,  134,    0,
  134,  224,  224,    0,  224,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  223,    0,
  213,   31,    0,    0,    0,  213,   31,   31,    0,   31,
    0,   31,    0,  224,  134,  134,  134,    0,  134,    0,
   31,    0,    0,  135,  134,    0,    0,    0,  223,  134,
    0,    0,    0,  224,  134,    0,    0,  134,  134,    0,
    0,   31,  213,    0,   31,   31,   31,   31,    0,   31,
   31,   31,   31,   95,  213,    0,   31,    0,   31,  213,
    0,    0,  213,  213,    0,    0,    0,    0,    0,    0,
  224,    0,    0,    0,  224,    0,    0,    0,  133,    0,
  224,  224,  224,  133,  133,    0,  133,  224,  133,    0,
  224,  224,   31,   31,   31,    0,   31,  133,    0,    0,
  155,    0,   31,  232,    0,    0,    0,   31,  232,  232,
    0,  232,   31,    0,    0,   31,   31,    0,  133,    0,
    0,  133,  133,  133,  133,  213,  133,  133,  133,  133,
   29,  223,    0,  133,    0,  133,  223,  223,    0,  223,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  223,    0,  232,  135,    0,    0,    0,
  232,  135,  135,    0,  135,    0,  135,    0,    0,  133,
  133,  133,    0,  133,    0,  135,    0,    0,   95,  133,
    0,    0,    0,  228,  133,    0,    0,    0,  223,  133,
    0,    0,  133,  133,    0,    0,  135,  232,    0,  135,
  135,  135,  135,    0,  135,  135,  135,  135,  130,  232,
    0,  135,    0,  135,  232,    0,    0,  232,  232,    0,
    0,    0,    0,    0,    0,  223,    0,    0,    0,  223,
    0,    0,    0,  155,    0,  223,  223,  223,  155,  155,
    0,  155,  223,  155,    0,  223,  223,  135,  135,  135,
    0,  135,  155,    0,    0,   29,    0,  135,  213,    0,
    0,    0,  135,  213,  213,    0,  213,  135,    0,    0,
  135,  135,    0,  155,    0,    0,  155,  155,  155,  155,
  232,  155,  155,  155,  155,   30,  223,    0,  155,    0,
  155,  223,  223,    0,  223,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  228,    0,
  211,   95,    0,    0,    0,  213,   95,   95,    0,   95,
    0,   95,    0,  223,  155,  155,  155,    0,  155,    0,
   95,    0,    0,  130,  155,    0,    0,    0,  206,  155,
    0,    0,    0,  223,  155,    0,    0,  155,  155,    0,
    0,   95,    0,    0,   95,   95,   95,   95,    0,   95,
   95,   95,   95,   28,  213,    0,   95,    0,   95,  213,
    0,    0,  213,  213,    0,    0,    0,    0,    0,    0,
  223,    0,    0,    0,    0,    0,    0,    0,   29,    0,
  223,  223,  223,   29,   29,    0,   29,  223,   29,    0,
  223,  223,   95,   95,   95,    0,   95,   29,    0,    0,
   30,    0,   95,  232,    0,    0,    0,   95,  232,  232,
    0,  232,   95,    0,    0,   95,   95,    0,   29,    0,
    0,   29,   29,   29,   29,  211,   29,   29,   29,   29,
  143,  228,    0,   29,    0,   29,  228,  228,    0,  228,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  206,    0,  230,  130,    0,    0,    0,
  232,  130,  130,    0,  130,    0,  130,    0,  228,   29,
   29,   29,    0,   29,    0,  130,    0,    0,   28,   29,
    0,    0,    0,   47,   29,    0,    0,    0,  228,   29,
    0,    0,   29,   29,    0,    0,  130,    0,  206,  130,
  130,  130,  130,    0,  130,  130,  130,  130,    0,  232,
  230,  130,    0,  130,  232,    0,    0,  232,  232,    0,
    0,    0,    0,    0,   64,    0,    0,    0,    0,    0,
    0,    0,    0,   30,    0,  228,  228,  228,   30,   30,
    0,   30,  228,   30,    0,  228,  228,  130,  130,  130,
    0,  130,   30,    0,   81,  143,    0,  130,  211,    0,
    0,    0,  130,  211,  211,    0,  211,  130,    0,    0,
  130,  130,    0,   30,  122,    0,   30,   30,   30,   30,
  230,   30,   30,   30,   30,  157,  206,    0,   30,    0,
   30,  206,  206,    0,  206,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,   47,    0,   47,    0,
    0,   28,    0,    0,    0,  211,   28,   28,    0,   28,
    0,   28,    0,  206,   30,   30,   30,    0,   30,    0,
   28,    0,    0,    0,   30,  230,    0,    0,    0,   30,
    0,    0,    0,  206,   30,    0,    0,   30,   30,   64,
    0,   28,    0,    0,   28,   28,   28,   28,    0,   28,
   28,   28,   28,    0,  211,    0,   28,   10,   28,  211,
    0,    0,  211,  211,    0,    0,    0,    0,    0,   81,
  206,    0,    0,    0,    0,    0,    0,    0,  143,    0,
  206,  206,  206,  143,  143,    0,  143,  206,  143,  122,
  206,  206,   28,   28,   28,    0,   28,  143,    0,    0,
  157,    0,   28,  230,    0,    0,    0,   28,  230,  230,
    0,  230,   28,    0,    0,   28,   28,    0,  143,    0,
    0,  143,  143,  143,  143,    0,  143,  143,  143,  143,
    0,   47,    0,  143,   47,  143,   47,   47,   47,   47,
    0,    0,    0,    0,    0,    0,  206,   47,   47,    0,
   47,  206,  206,    0,  206,    0,    0,    0,  230,    0,
  230,   47,    0,  230,  230,    0,  230,    0,    0,  143,
  143,  143,   64,  143,    0,    0,    0,   64,   64,  143,
   64,  147,    0,    0,  143,   23,   24,    0,    0,  143,
    2,    0,  143,  143,    0,    3,    4,  230,    5,    0,
    0,  230,   81,  206,    0,    0,    0,   81,   81,  230,
   81,    0,    0,    0,  230,  230,   79,  230,  230,    0,
    0,    0,  122,   90,    0,    0,    0,  122,  122,    0,
  122,   97,   99,  157,    0,    0,  124,   47,  157,  157,
    0,  157,   47,    0,    0,   47,   47,    0,    0,    0,
  206,  206,  206,    0,    0,    0,  230,  206,    0,    0,
  206,  206,    0,    0,  230,    0,    0,    0,    0,  230,
    0,    0,  230,  230,    0,    0,    0,    0,   64,  170,
    0,  170,    0,   64,    0,    0,   64,   64,    0,    0,
   54,    0,    0,  180,    0,    0,    6,    0,    0,    0,
    0,    7,    0,    0,    8,    9,    0,    0,   81,    0,
    0,  153,    0,   81,    0,    0,   81,   81,    0,   54,
    0,  131,    0,    0,    0,    0,  183,    0,  122,   95,
    0,    0,    0,  122,    0,  132,  122,  122,    0,  157,
  127,    0,    0,    0,  157,    0,    0,  157,  157,    0,
    0,    0,    0,    0,  236,  236,  133,    0,    0,  113,
  134,  135,  136,    0,  137,  138,  139,  140,    0,    0,
    0,  116,    0,  141,    0,    0,  194,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  177,    0,
    0,    0,    0,  291,    0,    0,    0,    0,  181,    0,
  272,  185,    0,    0,   54,  194,    0,  142,  143,  144,
    0,  145,    0,    0,    0,    0,    0,  146,    0,  219,
  220,    0,    0,  221,  222,    0,    0,  124,    0,  223,
   54,    0,    0,  227,  228,    0,    0,  230,  232,    0,
    0,    0,    0,    0,  302,  303,  153,    0,    0,  153,
    0,  153,  195,  153,    0,    0,    0,    0,    0,    0,
  241,  183,  153,  153,  183,  153,  183,    0,  183,    0,
  113,    0,    0,    0,  252,  253,  153,  183,  183,    0,
  183,    0,    0,    0,    0,    0,    0,  330,  331,    0,
    0,  183,    0,    0,  340,  283,    0,    0,  345,   54,
   54,    0,    0,    0,    0,    0,    0,  280,    0,  349,
    0,  194,    0,  241,  194,  241,  194,    0,  194,  356,
    0,    0,  170,  230,  294,    0,    0,  194,  194,    0,
  194,    0,    0,  131,    0,  366,    0,    0,    0,  299,
    0,  194,    0,  236,    0,  124,  375,  132,    0,  346,
    0,  186,   54,    0,   54,    0,    0,  317,    0,    0,
    0,  318,    0,  319,    0,    0,  320,    0,  133,  294,
  294,  113,  134,  135,  136,  241,  137,  138,  139,  140,
    0,    0,    0,  116,    0,  141,    0,  195,    0,    0,
  195,    0,  195,    0,  195,    0,    0,   54,   54,    0,
    0,    0,    0,  195,  195,    0,  195,    0,    0,    0,
  113,    0,    0,    0,    0,    0,    0,  195,    0,  142,
  143,  144,   54,  145,  113,    0,    0,    0,    0,  146,
    0,    0,    0,  131,    0,    0,    0,   54,    0,    0,
    0,   18,   19,    0,   20,  113,    0,  132,  113,  113,
  113,  113,    0,  113,  113,  113,  113,    0,    0,    0,
  113,    0,  113,    0,    0,    0,    0,    0,  133,    0,
    0,  113,  134,  135,  136,    0,  137,  138,  139,  140,
    0,    0,    0,  116,    0,  141,  186,  131,    0,  186,
    0,  186,    0,  186,    0,    0,  113,  113,  113,    0,
  113,  132,  186,  186,    0,  186,  113,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  186,    0,    0,  142,
  143,  144,  133,  145,    0,  113,  134,  135,  136,  146,
  137,  138,  139,  140,  109,  100,    0,  116,    0,  141,
    0,    0,  101,    0,    0,    0,    0,    0,    0,    0,
  110,    0,  120,  120,    0,    0,    0,    0,    0,    0,
  120,    0,    0,    0,    0,    0,  111,  112,  120,    0,
    0,    0,    0,  142,  143,  144,    0,  145,  113,    0,
    0,    0,    0,  146,  120,  120,    0,  114,  115,  131,
  116,  117,    0,    0,    0,    0,  120,    0,    0,    0,
    0,  118,    0,  132,    0,  120,  120,  119,  120,  120,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  120,
    0,    0,    0,    0,  133,  120,    0,  113,  134,  135,
  136,    0,  137,  138,  139,  140,    0,  120,    0,  116,
    0,  141,    0,  131,    0,    0,    0,    0,   18,   19,
    0,   20,    0,    0,    0,  120,    0,  132,    0,    0,
    0,    0,    0,    0,    0,    0,  120,  120,    0,  120,
    0,    0,    0,    0,    0,  142,  143,  144,  133,  145,
    0,  113,  134,  135,  136,  146,  137,  138,  139,  140,
    0,    0,    0,  116,    0,  141,    0,   18,   19,   25,
   20,   26,   27,   28,   29,   30,   31,   32,    0,    0,
    0,    0,    0,  124,    0,    0,    0,   33,   34,    0,
   35,  124,  124,  124,    0,  198,  199,  200,    0,  142,
  143,  144,    0,  145,    0,    0,    0,   36,    0,  146,
  124,    0,    0,    0,  124,  124,    0,    0,  201,  202,
  113,  113,  113,    0,    0,  124,  124,  124,    0,  203,
  204,  205,    0,   37,  124,   38,   39,   40,  206,   41,
    0,    0,    0,  113,  113,   42,   43,    0,   44,    0,
    0,    0,    0,    0,  113,  113,  113,    0,    0,   45,
  124,  124,    0,  113,  207,  208,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  113,
  113,
};
short yycheck[] = {                                     123,
    0,   98,   43,   60,  123,   62,   43,   60,   64,   62,
   43,  272,  244,   63,  123,  118,   43,  273,  123,  125,
  184,  108,  261,    0,  176,   60,   43,  123,  261,   26,
  292,  261,  257,    0,  123,    6,  291,  263,  298,   61,
   37,   41,   39,   40,   41,   42,   43,  263,  337,  258,
  272,  277,   61,  278,  279,  315,  265,   43,  288,    0,
   57,  277,  351,  123,   35,  294,  371,  372,  103,  374,
  358,  123,  370,  371,  372,  373,  374,  375,  123,  231,
   60,  187,   62,  267,  346,  188,  189,  251,  259,  192,
  254,  178,  315,  317,  318,  319,  320,  321,  322,  323,
  156,  370,  261,  262,  373,  301,  375,  274,  275,  370,
  362,  363,  373,  361,  375,  371,  372,  123,  374,  326,
  327,  328,  329,  123,  301,  125,  340,  341,  125,  123,
  362,  370,  371,  372,  373,  374,  375,  370,  358,  359,
  373,  276,  375,  365,  366,  367,  361,  268,  125,  120,
  123,  300,  261,    0,  263,   40,  261,  261,  125,  260,
  364,  123,  258,  295,  262,  261,  364,  263,  277,  265,
  331,  332,  333,  334,  335,  146,  226,  233,  125,  288,
  356,  277,  123,  288,  125,   44,    0,  184,  262,  239,
  187,  125,  288,  365,  366,  367,  125,  352,  258,   41,
  256,  261,   41,  263,  259,  265,  258,  300,  259,  261,
   44,  263,  291,  265,  274,  275,   53,  277,  210,  211,
  212,  107,  123,  350,  261,  277,   75,  327,  288,  125,
  175,  351,   53,    0,  125,  276,  288,  328,  125,   58,
  270,  303,  339,  266,  215,  216,   -1,  371,  372,  175,
  374,  248,  371,  372,  251,  374,   -1,  254,  258,   -1,
  260,  261,  262,  263,  264,  265,  266,  267,  268,  269,
  270,  271,  325,  323,  274,  275,  276,  277,  125,  336,
  337,  258,  371,  372,   -1,  374,  263,  264,  288,  266,
   -1,  258,  292,  293,  294,  295,  263,  264,  298,  266,
  300,  301,  302,  303,  304,  305,  306,  307,  308,  309,
    0,  125,  312,  313,  347,  315,  343,  258,  315,   -1,
  261,   -1,  263,  264,  265,  266,  371,  372,  325,  374,
  347,   -1,   -1,  274,  275,   -1,  277,   -1,  338,  339,
  340,  341,  313,  314,   -1,   -1,   -1,  288,  315,  349,
  350,  351,  352,  353,  371,  372,  356,  374,  125,  359,
   -1,   -1,  362,  363,  364,  371,  372,  338,  374,  369,
  370,  371,  372,  373,  374,  375,   -1,  371,  372,   -1,
  374,  125,  353,   -1,   -1,  352,  287,  364,    0,  356,
  125,  358,  369,   -1,  361,  372,  373,  364,  371,  372,
   -1,  374,  369,   -1,  371,  372,  373,  374,   -1,  371,
  372,  258,  374,   -1,  261,  262,  263,  264,   -1,  266,
   -1,  268,   -1,  364,  371,  372,   -1,  374,  369,  276,
  277,  372,  373,   -1,   -1,  125,  370,  371,  372,  373,
  374,  375,  371,  372,  258,  374,   -1,   -1,  295,  263,
  264,  298,  266,  125,  301,  302,  303,  304,  125,  306,
  307,  308,  309,  125,   -1,    0,  313,   -1,  315,  370,
  371,  372,  373,  374,  375,  371,  372,   -1,  374,   -1,
  371,  372,   -1,  374,  371,  372,   -1,  374,   -1,   -1,
    0,  258,   -1,  340,  341,   -1,  263,  264,   -1,  266,
   -1,  268,  349,  350,  351,  352,  353,   -1,   -1,  356,
  277,   -1,  359,  125,   -1,  362,  363,  364,    0,   -1,
   -1,   -1,  369,   -1,   -1,  372,  373,   -1,   -1,   -1,
   -1,  298,   -1,   -1,  301,  302,  303,  304,   -1,  306,
  307,  308,  309,    0,   -1,   -1,  313,   -1,  315,   -1,
  364,   -1,   -1,   -1,   -1,  369,   -1,   -1,  372,  373,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  258,   -1,
   -1,   -1,   -1,  263,  264,   -1,  266,   -1,  268,   -1,
   -1,   -1,  349,  350,  351,   -1,  353,  277,   -1,   -1,
  125,   -1,  359,   -1,   -1,   -1,   -1,  364,   -1,   -1,
   -1,   -1,  369,   -1,   -1,  372,  373,   -1,  298,   -1,
   -1,  301,  302,  303,  304,  125,  306,  307,  308,  309,
    0,   -1,   -1,  313,   -1,  315,   -1,  371,  372,   -1,
  374,   -1,   -1,   -1,   -1,   -1,  371,  372,   -1,  374,
   -1,   -1,   -1,  125,   -1,    0,  258,   -1,   -1,   -1,
   -1,  263,  264,   -1,  266,   -1,  268,   -1,   -1,  349,
  350,  351,   -1,  353,   -1,  277,   -1,   -1,  125,  359,
   -1,   -1,   -1,    0,  364,   -1,   -1,   -1,   -1,  369,
   -1,   -1,  372,  373,   -1,   -1,  298,   -1,   -1,  301,
  302,  303,  304,   -1,  306,  307,  308,  309,    0,  371,
  372,  313,  374,  315,  371,  372,   -1,  374,   -1,  371,
  372,   -1,  374,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  258,   -1,   -1,   -1,   -1,  263,  264,
   -1,  266,   -1,  268,   -1,   -1,   -1,  349,  350,  351,
   -1,  353,  277,   -1,   -1,  125,   -1,  359,  258,   -1,
   -1,   -1,  364,  263,  264,   -1,  266,  369,   -1,   -1,
  372,  373,   -1,  298,   -1,   -1,  301,  302,  303,  304,
  125,  306,  307,  308,  309,    0,  258,   -1,  313,   -1,
  315,  263,  264,   -1,  266,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  125,   -1,
    0,  258,   -1,   -1,   -1,  315,  263,  264,   -1,  266,
   -1,  268,   -1,  295,  349,  350,  351,   -1,  353,   -1,
  277,   -1,   -1,  125,  359,   -1,   -1,   -1,    0,  364,
   -1,   -1,   -1,  315,  369,   -1,   -1,  372,  373,   -1,
   -1,  298,  352,   -1,  301,  302,  303,  304,   -1,  306,
  307,  308,  309,    0,  364,   -1,  313,   -1,  315,  369,
   -1,   -1,  372,  373,   -1,   -1,   -1,   -1,   -1,   -1,
  352,   -1,   -1,   -1,  356,   -1,   -1,   -1,  258,   -1,
  362,  363,  364,  263,  264,   -1,  266,  369,  268,   -1,
  372,  373,  349,  350,  351,   -1,  353,  277,   -1,   -1,
  125,   -1,  359,  258,   -1,   -1,   -1,  364,  263,  264,
   -1,  266,  369,   -1,   -1,  372,  373,   -1,  298,   -1,
   -1,  301,  302,  303,  304,  125,  306,  307,  308,  309,
    0,  258,   -1,  313,   -1,  315,  263,  264,   -1,  266,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  125,   -1,    0,  258,   -1,   -1,   -1,
  315,  263,  264,   -1,  266,   -1,  268,   -1,   -1,  349,
  350,  351,   -1,  353,   -1,  277,   -1,   -1,  125,  359,
   -1,   -1,   -1,    0,  364,   -1,   -1,   -1,  315,  369,
   -1,   -1,  372,  373,   -1,   -1,  298,  352,   -1,  301,
  302,  303,  304,   -1,  306,  307,  308,  309,    0,  364,
   -1,  313,   -1,  315,  369,   -1,   -1,  372,  373,   -1,
   -1,   -1,   -1,   -1,   -1,  352,   -1,   -1,   -1,  356,
   -1,   -1,   -1,  258,   -1,  362,  363,  364,  263,  264,
   -1,  266,  369,  268,   -1,  372,  373,  349,  350,  351,
   -1,  353,  277,   -1,   -1,  125,   -1,  359,  258,   -1,
   -1,   -1,  364,  263,  264,   -1,  266,  369,   -1,   -1,
  372,  373,   -1,  298,   -1,   -1,  301,  302,  303,  304,
  125,  306,  307,  308,  309,    0,  258,   -1,  313,   -1,
  315,  263,  264,   -1,  266,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  125,   -1,
    0,  258,   -1,   -1,   -1,  315,  263,  264,   -1,  266,
   -1,  268,   -1,  295,  349,  350,  351,   -1,  353,   -1,
  277,   -1,   -1,  125,  359,   -1,   -1,   -1,    0,  364,
   -1,   -1,   -1,  315,  369,   -1,   -1,  372,  373,   -1,
   -1,  298,   -1,   -1,  301,  302,  303,  304,   -1,  306,
  307,  308,  309,    0,  364,   -1,  313,   -1,  315,  369,
   -1,   -1,  372,  373,   -1,   -1,   -1,   -1,   -1,   -1,
  352,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  258,   -1,
  362,  363,  364,  263,  264,   -1,  266,  369,  268,   -1,
  372,  373,  349,  350,  351,   -1,  353,  277,   -1,   -1,
  125,   -1,  359,  258,   -1,   -1,   -1,  364,  263,  264,
   -1,  266,  369,   -1,   -1,  372,  373,   -1,  298,   -1,
   -1,  301,  302,  303,  304,  125,  306,  307,  308,  309,
    0,  258,   -1,  313,   -1,  315,  263,  264,   -1,  266,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  125,   -1,    0,  258,   -1,   -1,   -1,
  315,  263,  264,   -1,  266,   -1,  268,   -1,  295,  349,
  350,  351,   -1,  353,   -1,  277,   -1,   -1,  125,  359,
   -1,   -1,   -1,    0,  364,   -1,   -1,   -1,  315,  369,
   -1,   -1,  372,  373,   -1,   -1,  298,   -1,    0,  301,
  302,  303,  304,   -1,  306,  307,  308,  309,   -1,  364,
    0,  313,   -1,  315,  369,   -1,   -1,  372,  373,   -1,
   -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  258,   -1,  362,  363,  364,  263,  264,
   -1,  266,  369,  268,   -1,  372,  373,  349,  350,  351,
   -1,  353,  277,   -1,    0,  125,   -1,  359,  258,   -1,
   -1,   -1,  364,  263,  264,   -1,  266,  369,   -1,   -1,
  372,  373,   -1,  298,    0,   -1,  301,  302,  303,  304,
  125,  306,  307,  308,  309,    0,  258,   -1,  313,   -1,
  315,  263,  264,   -1,  266,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  123,   -1,  125,   -1,
   -1,  258,   -1,   -1,   -1,  315,  263,  264,   -1,  266,
   -1,  268,   -1,  125,  349,  350,  351,   -1,  353,   -1,
  277,   -1,   -1,   -1,  359,  125,   -1,   -1,   -1,  364,
   -1,   -1,   -1,  315,  369,   -1,   -1,  372,  373,  125,
   -1,  298,   -1,   -1,  301,  302,  303,  304,   -1,  306,
  307,  308,  309,   -1,  364,   -1,  313,  125,  315,  369,
   -1,   -1,  372,  373,   -1,   -1,   -1,   -1,   -1,  125,
  352,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  258,   -1,
  362,  363,  364,  263,  264,   -1,  266,  369,  268,  125,
  372,  373,  349,  350,  351,   -1,  353,  277,   -1,   -1,
  125,   -1,  359,  258,   -1,   -1,   -1,  364,  263,  264,
   -1,  266,  369,   -1,   -1,  372,  373,   -1,  298,   -1,
   -1,  301,  302,  303,  304,   -1,  306,  307,  308,  309,
   -1,  258,   -1,  313,  261,  315,  263,  264,  265,  266,
   -1,   -1,   -1,   -1,   -1,   -1,  258,  274,  275,   -1,
  277,  263,  264,   -1,  266,   -1,   -1,   -1,  258,   -1,
  315,  288,   -1,  263,  264,   -1,  266,   -1,   -1,  349,
  350,  351,  258,  353,   -1,   -1,   -1,  263,  264,  359,
  266,  123,   -1,   -1,  364,    2,    3,   -1,   -1,  369,
  258,   -1,  372,  373,   -1,  263,  264,  352,  266,   -1,
   -1,  356,  258,  315,   -1,   -1,   -1,  263,  264,  364,
  266,   -1,   -1,   -1,  369,  315,   33,  372,  373,   -1,
   -1,   -1,  258,   40,   -1,   -1,   -1,  263,  264,   -1,
  266,   48,   49,  258,   -1,   -1,   53,  364,  263,  264,
   -1,  266,  369,   -1,   -1,  372,  373,   -1,   -1,   -1,
  362,  363,  364,   -1,   -1,   -1,  356,  369,   -1,   -1,
  372,  373,   -1,   -1,  364,   -1,   -1,   -1,   -1,  369,
   -1,   -1,  372,  373,   -1,   -1,   -1,   -1,  364,   96,
   -1,   98,   -1,  369,   -1,   -1,  372,  373,   -1,   -1,
    6,   -1,   -1,  110,   -1,   -1,  364,   -1,   -1,   -1,
   -1,  369,   -1,   -1,  372,  373,   -1,   -1,  364,   -1,
   -1,  123,   -1,  369,   -1,   -1,  372,  373,   -1,   35,
   -1,  263,   -1,   -1,   -1,   -1,  123,   -1,  364,   45,
   -1,   -1,   -1,  369,   -1,  277,  372,  373,   -1,  364,
   56,   -1,   -1,   -1,  369,   -1,   -1,  372,  373,   -1,
   -1,   -1,   -1,   -1,  171,  172,  298,   -1,   -1,  301,
  302,  303,  304,   -1,  306,  307,  308,  309,   -1,   -1,
   -1,  313,   -1,  315,   -1,   -1,  123,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  104,   -1,
   -1,   -1,   -1,  123,   -1,   -1,   -1,   -1,  114,   -1,
  217,  117,   -1,   -1,  120,  121,   -1,  349,  350,  351,
   -1,  353,   -1,   -1,   -1,   -1,   -1,  359,   -1,  135,
  136,   -1,   -1,  139,  140,   -1,   -1,  244,   -1,  145,
  146,   -1,   -1,  149,  150,   -1,   -1,  153,  154,   -1,
   -1,   -1,   -1,   -1,  261,  262,  258,   -1,   -1,  261,
   -1,  263,  123,  265,   -1,   -1,   -1,   -1,   -1,   -1,
  176,  258,  274,  275,  261,  277,  263,   -1,  265,   -1,
  123,   -1,   -1,   -1,  190,  191,  288,  274,  275,   -1,
  277,   -1,   -1,   -1,   -1,   -1,   -1,  304,  305,   -1,
   -1,  288,   -1,   -1,  311,  125,   -1,   -1,  315,  215,
  216,   -1,   -1,   -1,   -1,   -1,   -1,  223,   -1,  326,
   -1,  258,   -1,  229,  261,  231,  263,   -1,  265,  336,
   -1,   -1,  339,  239,  240,   -1,   -1,  274,  275,   -1,
  277,   -1,   -1,  263,   -1,  352,   -1,   -1,   -1,  255,
   -1,  288,   -1,  360,   -1,  362,  363,  277,   -1,  125,
   -1,  123,  268,   -1,  270,   -1,   -1,  273,   -1,   -1,
   -1,  277,   -1,  279,   -1,   -1,  282,   -1,  298,  285,
  286,  301,  302,  303,  304,  291,  306,  307,  308,  309,
   -1,   -1,   -1,  313,   -1,  315,   -1,  258,   -1,   -1,
  261,   -1,  263,   -1,  265,   -1,   -1,  313,  314,   -1,
   -1,   -1,   -1,  274,  275,   -1,  277,   -1,   -1,   -1,
  263,   -1,   -1,   -1,   -1,   -1,   -1,  288,   -1,  349,
  350,  351,  338,  353,  277,   -1,   -1,   -1,   -1,  359,
   -1,   -1,   -1,  263,   -1,   -1,   -1,  353,   -1,   -1,
   -1,  371,  372,   -1,  374,  298,   -1,  277,  301,  302,
  303,  304,   -1,  306,  307,  308,  309,   -1,   -1,   -1,
  313,   -1,  315,   -1,   -1,   -1,   -1,   -1,  298,   -1,
   -1,  301,  302,  303,  304,   -1,  306,  307,  308,  309,
   -1,   -1,   -1,  313,   -1,  315,  258,  263,   -1,  261,
   -1,  263,   -1,  265,   -1,   -1,  349,  350,  351,   -1,
  353,  277,  274,  275,   -1,  277,  359,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  288,   -1,   -1,  349,
  350,  351,  298,  353,   -1,  301,  302,  303,  304,  359,
  306,  307,  308,  309,  257,  258,   -1,  313,   -1,  315,
   -1,   -1,  265,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  273,   -1,  257,  258,   -1,   -1,   -1,   -1,   -1,   -1,
  265,   -1,   -1,   -1,   -1,   -1,  289,  290,  273,   -1,
   -1,   -1,   -1,  349,  350,  351,   -1,  353,  301,   -1,
   -1,   -1,   -1,  359,  289,  290,   -1,  310,  311,  263,
  313,  314,   -1,   -1,   -1,   -1,  301,   -1,   -1,   -1,
   -1,  324,   -1,  277,   -1,  310,  311,  330,  313,  314,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  324,
   -1,   -1,   -1,   -1,  298,  330,   -1,  301,  302,  303,
  304,   -1,  306,  307,  308,  309,   -1,  360,   -1,  313,
   -1,  315,   -1,  263,   -1,   -1,   -1,   -1,  371,  372,
   -1,  374,   -1,   -1,   -1,  360,   -1,  277,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  371,  372,   -1,  374,
   -1,   -1,   -1,   -1,   -1,  349,  350,  351,  298,  353,
   -1,  301,  302,  303,  304,  359,  306,  307,  308,  309,
   -1,   -1,   -1,  313,   -1,  315,   -1,  371,  372,  278,
  374,  280,  281,  282,  283,  284,  285,  286,   -1,   -1,
   -1,   -1,   -1,  261,   -1,   -1,   -1,  296,  297,   -1,
  299,  269,  270,  271,   -1,  269,  270,  271,   -1,  349,
  350,  351,   -1,  353,   -1,   -1,   -1,  316,   -1,  359,
  288,   -1,   -1,   -1,  292,  293,   -1,   -1,  292,  293,
  269,  270,  271,   -1,   -1,  303,  304,  305,   -1,  303,
  304,  305,   -1,  342,  312,  344,  345,  346,  312,  348,
   -1,   -1,   -1,  292,  293,  354,  355,   -1,  357,   -1,
   -1,   -1,   -1,   -1,  303,  304,  305,   -1,   -1,  368,
  338,  339,   -1,  312,  338,  339,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  338,
  339,
};
#define YYFINAL 1
#ifndef YYDEBUG
#define YYDEBUG 0
#endif
#define YYMAXTOKEN 375
#if YYDEBUG
char *yyname[] = {
"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,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,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,"TOKALL","TOKACCOUNT","TOKSERVER","TOKPORT","TOKUSER","TOKPASS","TOKACTION",
"TOKSET","TOKACCOUNTS","TOKMATCH","TOKIN","TOKCONTINUE","TOKSTDIN","TOKPOP3",
"TOKPOP3S","TOKNONE","TOKCASE","TOKAND","TOKOR","TOKTO","TOKACTIONS",
"TOKHEADERS","TOKBODY","TOKMAXSIZE","TOKDELTOOBIG","TOKLOCKTYPES","TOKDEFUSER",
"TOKDOMAIN","TOKDOMAINS","TOKHEADER","TOKFROMHEADERS","TOKUSERS","TOKMATCHED",
"TOKUNMATCHED","TOKNOT","TOKIMAP","TOKIMAPS","TOKDISABLED","TOKFOLDER",
"TOKPROXY","TOKALLOWMANY","TOKDROP","TOKLOCKFILE","TOKRETURNS","TOKPIPE",
"TOKSMTP","TOKMAILDIR","TOKMBOX","TOKMBOXES","TOKWRITE","TOKAPPEND",
"TOKREWRITE","TOKTAG","TOKTAGGED","TOKSIZE","TOKMAILDIRS","TOKEXEC","TOKSTRING",
"TOKKEEP","TOKIMPLACT","TOKHOURS","TOKMINUTES","TOKSECONDS","TOKDAYS",
"TOKWEEKS","TOKMONTHS","TOKYEARS","TOKAGE","TOKINVALID","TOKKILOBYTES",
"TOKMEGABYTES","TOKGIGABYTES","TOKBYTES","TOKATTACHMENT","TOKCOUNT",
"TOKTOTALSIZE","TOKANYTYPE","TOKANYNAME","TOKANYSIZE","TOKEQ","TOKNE","TOKNNTP",
"TOKNNTPS","TOKGROUP","TOKGROUPS","TOKPURGEAFTER","TOKCOMPRESS","TOKNORECEIVED",
"TOKFILEUMASK","TOKFILEGROUP","TOKVALUE","TOKTIMEOUT","TOKREMOVEHEADER",
"TOKREMOVEHEADERS","TOKSTDOUT","TOKNOVERIFY","TOKADDHEADER","TOKQUEUEHIGH",
"TOKQUEUELOW","TOKNOAPOP","TOKVERIFYCERTS","TOKEXPIRE","TOKTOCACHE",
"TOKINCACHE","TOKKEY","TOKNEWONLY","TOKOLDONLY","TOKCACHE","TOKFLOCK",
"TOKFCNTL","TOKDOTLOCK","TOKSTRIPCHARACTERS","NONE","NUMBER","STRING",
"STRMACRO","NUMMACRO","STRCOMMAND","NUMCOMMAND",
};
char *yyrule[] = {
"$accept : cmds",
"cmds :",
"cmds : cmds account",
"cmds : cmds defaction",
"cmds : cmds defmacro",
"cmds : cmds rule",
"cmds : cmds set",
"cmds : cmds close",
"cmds : cmds cache",
"cmds : cmds NONE",
"actionp : TOKACTION",
"actionp : TOKACTIONS",
"userp : TOKUSER",
"userp : TOKUSERS",
"accountp : TOKACCOUNT",
"accountp : TOKACCOUNTS",
"groupp : TOKGROUP",
"groupp : TOKGROUPS",
"maildirp : TOKMAILDIR",
"maildirp : TOKMAILDIRS",
"mboxp : TOKMBOX",
"mboxp : TOKMBOXES",
"rmheaderp : TOKREMOVEHEADER",
"rmheaderp : TOKREMOVEHEADERS",
"headerp : TOKHEADER",
"headerp : TOKHEADERS",
"domainp : TOKDOMAIN",
"domainp : TOKDOMAINS",
"val : TOKVALUE strv",
"val : strv",
"optval : TOKVALUE strv",
"optval :",
"xstrv : STRCOMMAND",
"xstrv : STRING",
"xstrv : STRMACRO",
"strv : xstrv",
"strv : strv '+' xstrv",
"numv : NUMCOMMAND",
"numv : NUMBER",
"numv : NUMMACRO",
"replstrv : strv",
"replpathv : strv",
"size : numv",
"size : numv TOKBYTES",
"size : numv TOKKILOBYTES",
"size : numv TOKMEGABYTES",
"size : numv TOKGIGABYTES",
"time : numv",
"time : numv TOKHOURS",
"time : numv TOKMINUTES",
"time : numv TOKSECONDS",
"time : numv TOKDAYS",
"time : numv TOKWEEKS",
"time : numv TOKMONTHS",
"time : numv TOKYEARS",
"expire : TOKEXPIRE time",
"expire :",
"cache : TOKCACHE replpathv expire",
"set : TOKSET TOKMAXSIZE size",
"set : TOKSET TOKLOCKTYPES locklist",
"set : TOKSET TOKLOCKFILE replpathv",
"set : TOKSET TOKDELTOOBIG",
"set : TOKSET TOKALLOWMANY",
"set : TOKSET TOKDEFUSER uid",
"set : TOKSET TOKSTRIPCHARACTERS strv",
"set : TOKSET TOKTIMEOUT time",
"set : TOKSET TOKQUEUEHIGH numv",
"set : TOKSET TOKQUEUELOW numv",
"set : TOKSET domains",
"set : TOKSET headers",
"set : TOKSET TOKPROXY replstrv",
"set : TOKSET TOKVERIFYCERTS",
"set : TOKSET TOKIMPLACT TOKKEEP",
"set : TOKSET TOKIMPLACT TOKDROP",
"set : TOKSET TOKPURGEAFTER numv",
"set : TOKSET TOKPURGEAFTER TOKNONE",
"set : TOKSET TOKNORECEIVED",
"set : TOKSET TOKFILEGROUP TOKUSER",
"set : TOKSET TOKFILEGROUP gid",
"set : TOKSET TOKFILEUMASK TOKUSER",
"set : TOKSET TOKFILEUMASK numv",
"defmacro : STRMACRO '=' strv",
"defmacro : NUMMACRO '=' numv",
"replstrslist : replstrslist strv",
"replstrslist : strv",
"stringslist : stringslist replstrv",
"stringslist : replstrv",
"pathslist : pathslist replpathv",
"pathslist : replpathv",
"userslist : userslist uid",
"userslist : uid",
"domains : domainp replstrv",
"domains : domainp '{' stringslist '}'",
"headers : headerp replstrv",
"headers : headerp '{' stringslist '}'",
"rmheaders : rmheaderp strv",
"rmheaders : rmheaderp '{' replstrslist '}'",
"maildirs : maildirp replpathv",
"maildirs : maildirp '{' pathslist '}'",
"mboxes : mboxp replpathv",
"mboxes : mboxp '{' pathslist '}'",
"lock : TOKFCNTL",
"lock : TOKFLOCK",
"lock : TOKDOTLOCK",
"locklist : locklist lock",
"locklist : lock",
"locklist : TOKNONE",
"uid : replstrv",
"uid : numv",
"gid : replstrv",
"gid : numv",
"user :",
"user : TOKUSER uid",
"users :",
"users : userp TOKFROMHEADERS",
"users : userp uid",
"users : userp '{' userslist '}'",
"casere : TOKCASE replstrv",
"casere : replstrv",
"not : TOKNOT",
"not :",
"keep : TOKKEEP",
"keep :",
"disabled : TOKDISABLED",
"disabled :",
"port : TOKPORT replstrv",
"port : TOKPORT numv",
"server : TOKSERVER replstrv port",
"server : TOKSERVER replstrv",
"to :",
"to : TOKTO strv",
"compress : TOKCOMPRESS",
"compress :",
"actitem : execpipe strv",
"actitem : TOKREWRITE strv",
"actitem : writeappend strv",
"actitem : TOKMAILDIR strv",
"actitem : rmheaders",
"actitem : TOKADDHEADER strv val",
"actitem : TOKMBOX strv compress",
"actitem : TOKSMTP server to",
"actitem : TOKSTDOUT",
"actitem : TOKTAG strv optval",
"actitem : TOKTOCACHE replpathv TOKKEY strv",
"actitem : actions",
"actitem : TOKDROP",
"actitem : TOKKEEP",
"actlist : actlist actitem",
"actlist : actitem",
"defaction : TOKACTION replstrv users actitem",
"defaction : TOKACTION replstrv users '{' actlist '}'",
"accounts2 :",
"accounts2 : accounts",
"accounts : accountp strv",
"accounts : accountp '{' replstrslist '}'",
"actions : actionp strv",
"actions : actionp '{' replstrslist '}'",
"cont :",
"cont : TOKCONTINUE",
"area :",
"area : TOKIN TOKALL",
"area : TOKIN TOKHEADERS",
"area : TOKIN TOKBODY",
"retrc : numv",
"retrc :",
"retre : casere",
"retre :",
"ltgt : '<'",
"ltgt : '>'",
"eqne : TOKEQ",
"eqne : TOKNE",
"cmp : ltgt",
"cmp : eqne",
"execpipe : TOKEXEC",
"execpipe : TOKPIPE",
"writeappend : TOKWRITE",
"writeappend : TOKAPPEND",
"exprop : TOKAND",
"exprop : TOKOR",
"expritem : not TOKALL",
"expritem : not casere area",
"expritem : not accounts",
"expritem : not execpipe strv user TOKRETURNS '(' retrc ',' retre ')'",
"expritem : not TOKTAGGED strv",
"expritem : not TOKSIZE ltgt size",
"expritem : not TOKSTRING strv TOKTO casere",
"expritem : not TOKINCACHE replpathv TOKKEY strv",
"expritem : not TOKMATCHED",
"expritem : not TOKUNMATCHED",
"expritem : not TOKAGE ltgt time",
"expritem : not TOKAGE TOKINVALID",
"expritem : not TOKATTACHMENT TOKCOUNT cmp numv",
"expritem : not TOKATTACHMENT TOKTOTALSIZE ltgt size",
"expritem : not TOKATTACHMENT TOKANYSIZE ltgt size",
"expritem : not TOKATTACHMENT TOKANYTYPE strv",
"expritem : not TOKATTACHMENT TOKANYNAME strv",
"exprlist : exprlist exprop expritem",
"exprlist : exprop expritem",
"expr : expritem",
"expr : expritem exprlist",
"perform : users actionp actitem cont",
"perform : users actionp '{' actlist '}' cont",
"perform : users actions cont",
"perform : '{'",
"close : '}'",
"rule : TOKMATCH expr accounts2 perform",
"folder :",
"folder : TOKFOLDER replstrv",
"groups : groupp replstrv",
"groups : groupp '{' stringslist '}'",
"verify : TOKNOVERIFY",
"verify :",
"apop : TOKNOAPOP",
"apop :",
"only : TOKNEWONLY",
"only : TOKOLDONLY",
"poptype : TOKPOP3",
"poptype : TOKPOP3S",
"imaptype : TOKIMAP",
"imaptype : TOKIMAPS",
"nntptype : TOKNNTP",
"nntptype : TOKNNTPS",
"userpassnetrc : TOKUSER replstrv TOKPASS replstrv",
"userpassnetrc :",
"userpassnetrc : TOKUSER replstrv",
"userpassnetrc : TOKPASS replstrv",
"userpassreqd : TOKUSER replstrv TOKPASS replstrv",
"userpass : userpassreqd",
"userpass :",
"poponly : only TOKCACHE replpathv",
"poponly :",
"imaponly : only",
"imaponly :",
"fetchtype : poptype server userpassnetrc poponly apop verify",
"fetchtype : TOKPOP3 TOKPIPE replstrv userpassreqd poponly apop",
"fetchtype : imaptype server userpassnetrc folder imaponly verify",
"fetchtype : TOKIMAP TOKPIPE replstrv userpass folder imaponly",
"fetchtype : TOKSTDIN",
"fetchtype : maildirs",
"fetchtype : mboxes",
"fetchtype : nntptype server groups TOKCACHE replpathv verify",
"account : TOKACCOUNT replstrv disabled users fetchtype keep",
};
#endif
#ifdef YYSTACKSIZE
#undef YYMAXDEPTH
#define YYMAXDEPTH YYSTACKSIZE
#else
#ifdef YYMAXDEPTH
#define YYSTACKSIZE YYMAXDEPTH
#else
#define YYSTACKSIZE 10000
#define YYMAXDEPTH 10000
#endif
#endif
#define YYINITSTACKSIZE 200
int yydebug;
int yynerrs;
int yyerrflag;
int yychar;
short *yyssp;
YYSTYPE *yyvsp;
YYSTYPE yyval;
YYSTYPE yylval;
short *yyss;
short *yysslim;
YYSTYPE *yyvs;
int yystacksize;
#line 2503 "parse.y"

/* Programs */
#line 1302 "y.tab.c"
/* allocate initial stack or double stack size, up to YYMAXDEPTH */
int yyparse __P((void));
static int yygrowstack __P((void));
static int yygrowstack()
{
    int newsize, i;
    short *newss;
    YYSTYPE *newvs;

    if ((newsize = yystacksize) == 0)
        newsize = YYINITSTACKSIZE;
    else if (newsize >= YYMAXDEPTH)
        return -1;
    else if ((newsize *= 2) > YYMAXDEPTH)
        newsize = YYMAXDEPTH;
    i = yyssp - yyss;
    if ((newss = (short *)realloc(yyss, newsize * sizeof *newss)) == NULL)
        return -1;
    yyss = newss;
    yyssp = newss + i;
    if ((newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs)) == NULL)
        return -1;
    yyvs = newvs;
    yyvsp = newvs + i;
    yystacksize = newsize;
    yysslim = yyss + newsize - 1;
    return 0;
}

#define YYABORT goto yyabort
#define YYREJECT goto yyabort
#define YYACCEPT goto yyaccept
#define YYERROR goto yyerrlab
int
yyparse()
{
    int yym, yyn, yystate;
#if YYDEBUG
    char *yys;

    if ((yys = getenv("YYDEBUG")) != NULL)
    {
        yyn = *yys;
        if (yyn >= '0' && yyn <= '9')
            yydebug = yyn - '0';
    }
#endif

    yynerrs = 0;
    yyerrflag = 0;
    yychar = (-1);

    if (yyss == NULL && yygrowstack()) goto yyoverflow;
    yyssp = yyss;
    yyvsp = yyvs;
    *yyssp = yystate = 0;

yyloop:
    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
    if (yychar < 0)
    {
        if ((yychar = yylex()) < 0) yychar = 0;
#if YYDEBUG
        if (yydebug)
        {
            yys = 0;
            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
            if (!yys) yys = "illegal-symbol";
            printf("%sdebug: state %d, reading %d (%s)\n",
                    YYPREFIX, yystate, yychar, yys);
        }
#endif
    }
    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
    {
#if YYDEBUG
        if (yydebug)
            printf("%sdebug: state %d, shifting to state %d\n",
                    YYPREFIX, yystate, yytable[yyn]);
#endif
        if (yyssp >= yysslim && yygrowstack())
        {
            goto yyoverflow;
        }
        *++yyssp = yystate = yytable[yyn];
        *++yyvsp = yylval;
        yychar = (-1);
        if (yyerrflag > 0)  --yyerrflag;
        goto yyloop;
    }
    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
    {
        yyn = yytable[yyn];
        goto yyreduce;
    }
    if (yyerrflag) goto yyinrecovery;
    goto yynewerror;
yynewerror:
    yyerror("syntax error");
    goto yyerrlab;
yyerrlab:
    ++yynerrs;
yyinrecovery:
    if (yyerrflag < 3)
    {
        yyerrflag = 3;
        for (;;)
        {
            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
            {
#if YYDEBUG
                if (yydebug)
                    printf("%sdebug: state %d, error recovery shifting\
 to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
#endif
                if (yyssp >= yysslim && yygrowstack())
                {
                    goto yyoverflow;
                }
                *++yyssp = yystate = yytable[yyn];
                *++yyvsp = yylval;
                goto yyloop;
            }
            else
            {
#if YYDEBUG
                if (yydebug)
                    printf("%sdebug: error recovery discarding state %d\n",
                            YYPREFIX, *yyssp);
#endif
                if (yyssp <= yyss) goto yyabort;
                --yyssp;
                --yyvsp;
            }
        }
    }
    else
    {
        if (yychar == 0) goto yyabort;
#if YYDEBUG
        if (yydebug)
        {
            yys = 0;
            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
            if (!yys) yys = "illegal-symbol";
            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
                    YYPREFIX, yystate, yychar, yys);
        }
#endif
        yychar = (-1);
        goto yyloop;
    }
yyreduce:
#if YYDEBUG
    if (yydebug)
        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
                YYPREFIX, yystate, yyn, yyrule[yyn]);
#endif
    yym = yylen[yyn];
    yyval = yyvsp[1-yym];
    switch (yyn)
    {
case 28:
#line 283 "parse.y"
{
	     yyval.string = yyvsp[0].string;
     }
break;
case 29:
#line 288 "parse.y"
{
	     yyval.string = yyvsp[0].string;
     }
break;
case 30:
#line 295 "parse.y"
{
		yyval.string = yyvsp[0].string;
        }
break;
case 31:
#line 299 "parse.y"
{
		yyval.string = NULL;
	}
break;
case 32:
#line 305 "parse.y"
{
	       yyval.string = run_command(yyvsp[0].string, parse_file->path);
	       xfree(yyvsp[0].string);
       }
break;
case 33:
#line 310 "parse.y"
{
	       yyval.string = yyvsp[0].string;
       }
break;
case 34:
#line 314 "parse.y"
{
	       struct macro	*macro;

	       if (strlen(yyvsp[0].string) > MAXNAMESIZE)
		       yyerror("macro name too long: %s", yyvsp[0].string);

	       if ((macro = find_macro(yyvsp[0].string)) == NULL)
		       yyerror("undefined macro: %s", yyvsp[0].string);
	       if (macro->type != MACRO_STRING)
		       yyerror("string macro expected: %s", yyvsp[0].string);

	       yyval.string = xstrdup(macro->value.str);

	       xfree(yyvsp[0].string);
       }
break;
case 35:
#line 333 "parse.y"
{
	      yyval.string = yyvsp[0].string;
      }
break;
case 36:
#line 338 "parse.y"
{
	      size_t	size;

	      size = strlen(yyvsp[-2].string) + strlen(yyvsp[0].string) + 1;
	      yyval.string = xrealloc(yyvsp[-2].string, 1, size);
	      strlcat(yyval.string, yyvsp[0].string, size);
	      xfree(yyvsp[0].string);
      }
break;
case 37:
#line 349 "parse.y"
{
	      const char	*errstr;
	      char		*s;

	      s = run_command(yyvsp[0].string, parse_file->path);

	      yyval.number = strtonum(s, 0, LLONG_MAX, &errstr);
	      if (errstr != NULL)
		      yyerror("number is %s", errstr);

	      xfree(s);

	      xfree(yyvsp[0].string);
      }
break;
case 38:
#line 364 "parse.y"
{
	      yyval.number = yyvsp[0].number;
      }
break;
case 39:
#line 368 "parse.y"
{
	      struct macro	*macro;

	      if (strlen(yyvsp[0].string) > MAXNAMESIZE)
		      yyerror("macro name too long: %s", yyvsp[0].string);

	      if ((macro = find_macro(yyvsp[0].string)) == NULL)
		      yyerror("undefined macro: %s", yyvsp[0].string);
	      if (macro->type != MACRO_NUMBER)
		      yyerror("number macro expected: %s", yyvsp[0].string);

	      yyval.number = macro->value.num;

	      xfree(yyvsp[0].string);
      }
break;
case 40:
#line 387 "parse.y"
{
		  struct replstr	rs;

		  rs.str = yyvsp[0].string;
		  yyval.string = replacestr(&rs, parse_tags, NULL, NULL);
		  xfree(yyvsp[0].string);
	  }
break;
case 41:
#line 398 "parse.y"
{
		  struct replpath	rp;

		  rp.str = yyvsp[0].string;
		  yyval.string = replacepath(&rp, parse_tags, NULL, NULL);
		  xfree(yyvsp[0].string);
	   }
break;
case 42:
#line 409 "parse.y"
{
	      yyval.number = yyvsp[0].number;
      }
break;
case 43:
#line 414 "parse.y"
{
	      yyval.number = yyvsp[-1].number;
      }
break;
case 44:
#line 419 "parse.y"
{
	      if (yyvsp[-1].number > LLONG_MAX / 1024)
		      yyerror("size is too big");
	      yyval.number = yyvsp[-1].number * 1024;
      }
break;
case 45:
#line 426 "parse.y"
{
	      if (yyvsp[-1].number > LLONG_MAX / (1024 * 1024))
		      yyerror("size is too big");
	      yyval.number = yyvsp[-1].number * (1024 * 1024);
      }
break;
case 46:
#line 433 "parse.y"
{
	      if (yyvsp[-1].number > LLONG_MAX / (1024 * 1024 * 1024))
		      yyerror("size is too big");
	      yyval.number = yyvsp[-1].number * (1024 * 1024 * 1024);
      }
break;
case 47:
#line 442 "parse.y"
{
	      yyval.number = yyvsp[0].number;
      }
break;
case 48:
#line 447 "parse.y"
{
	      if (yyvsp[-1].number > LLONG_MAX / TIME_HOUR)
		      yyerror("time is too long");
	      yyval.number = yyvsp[-1].number * TIME_HOUR;
      }
break;
case 49:
#line 454 "parse.y"
{
	      if (yyvsp[-1].number > LLONG_MAX / TIME_MINUTE)
		      yyerror("time is too long");
	      yyval.number = yyvsp[-1].number * TIME_MINUTE;
      }
break;
case 50:
#line 461 "parse.y"
{
	      yyval.number = yyvsp[-1].number;
      }
break;
case 51:
#line 466 "parse.y"
{
	      if (yyvsp[-1].number > LLONG_MAX / TIME_DAY)
		      yyerror("time is too long");
	      yyval.number = yyvsp[-1].number * TIME_DAY;
      }
break;
case 52:
#line 473 "parse.y"
{
	      if (yyvsp[-1].number > LLONG_MAX / TIME_WEEK)
		      yyerror("time is too long");
	      yyval.number = yyvsp[-1].number * TIME_WEEK;
      }
break;
case 53:
#line 480 "parse.y"
{
	      if (yyvsp[-1].number > LLONG_MAX / TIME_MONTH)
		      yyerror("time is too long");
	      yyval.number = yyvsp[-1].number * TIME_MONTH;
      }
break;
case 54:
#line 487 "parse.y"
{
	      if (yyvsp[-1].number > LLONG_MAX / TIME_YEAR)
		      yyerror("time is too long");
	      yyval.number = yyvsp[-1].number * TIME_YEAR;
      }
break;
case 55:
#line 496 "parse.y"
{
#if UINT64_MAX < LLONG_MAX
		if (yyvsp[0].number > UINT64_MAX)
			yyerror("time too long");
#endif

		yyval.number = yyvsp[0].number;
	}
break;
case 56:
#line 505 "parse.y"
{
		yyval.number = -1;
	}
break;
case 57:
#line 512 "parse.y"
{
	       struct cache	*cache;

	       TAILQ_FOREACH(cache, &conf.caches, entry) {
		       if (strcmp(cache->path, yyvsp[-1].string) == 0)
			       yyerror("duplicate cache path");
	       }

	       cache = xcalloc(1, sizeof *cache);
	       cache->path = yyvsp[-1].string;
	       cache->expire = yyvsp[0].number;

	       TAILQ_INSERT_TAIL(&conf.caches, cache, entry);

	       log_debug2("added cache \"%s\": expire %lld", cache->path, yyvsp[0].number);
       }
break;
case 58:
#line 532 "parse.y"
{
	     if (yyvsp[0].number == 0)
		     yyerror("zero maximum size");
	     if (yyvsp[0].number > MAXMAILSIZE)
		     yyerror("maximum size too large: %lld", yyvsp[0].number);
	     conf.max_size = yyvsp[0].number;
     }
break;
case 59:
#line 541 "parse.y"
{
	     if (yyvsp[0].locks & LOCK_FCNTL && yyvsp[0].locks & LOCK_FLOCK)
		     yyerror("fcntl and flock locking cannot be used together");
	     conf.lock_types = yyvsp[0].locks;
     }
break;
case 60:
#line 548 "parse.y"
{
	     if (conf.lock_file != NULL)
		     xfree(conf.lock_file);
	     conf.lock_file = yyvsp[0].string;
     }
break;
case 61:
#line 554 "parse.y"
{
	     conf.del_big = 1;
     }
break;
case 62:
#line 558 "parse.y"
{
	     conf.allow_many = 1;
     }
break;
case 63:
#line 563 "parse.y"
{
	     conf.def_user = yyvsp[0].uid;
     }
break;
case 64:
#line 568 "parse.y"
{
	     xfree(conf.strip_chars);
	     conf.strip_chars = yyvsp[0].string;
     }
break;
case 65:
#line 574 "parse.y"
{
	     if (yyvsp[0].number == 0)
		     yyerror("zero timeout");
	     if (yyvsp[0].number > INT_MAX / 1000)
		     yyerror("timeout too long: %lld", yyvsp[0].number);
	     conf.timeout = yyvsp[0].number * 1000;
     }
break;
case 66:
#line 583 "parse.y"
{
	     if (yyvsp[0].number == 0)
		     yyerror("zero queue-high");
	     if (yyvsp[0].number > MAXQUEUEVALUE)
		     yyerror("queue-high too big: %lld", yyvsp[0].number);
	     if (conf.queue_low != -1 && yyvsp[0].number <= conf.queue_low)
		     yyerror("queue-high must be larger than queue-low");
	     conf.queue_high = yyvsp[0].number;
     }
break;
case 67:
#line 594 "parse.y"
{
	     if (yyvsp[0].number > MAXQUEUEVALUE)
		     yyerror("queue-low too big: %lld", yyvsp[0].number);
	     if (conf.queue_high == -1)
		     yyerror("queue-high not specified");
	     if (yyvsp[0].number >= conf.queue_high)
		     yyerror("queue-low must be smaller than queue-high");
	     conf.queue_low = yyvsp[0].number;
     }
break;
case 68:
#line 605 "parse.y"
{
	     u_int	i;

	     if (conf.domains != NULL) {
		     for (i = 0; i < ARRAY_LENGTH(conf.domains); i++)
			     xfree(ARRAY_ITEM(conf.domains, i));
		     ARRAY_FREE(conf.domains);
		     xfree(conf.domains);
	     }

	     conf.domains = yyvsp[0].strings;
     }
break;
case 69:
#line 619 "parse.y"
{
	     u_int	i;

	     if (conf.headers != NULL) {
		     for (i = 0; i < ARRAY_LENGTH(conf.headers); i++)
			     xfree(ARRAY_ITEM(conf.headers, i));
		     ARRAY_FREE(conf.headers);
		     xfree(conf.headers);
	     }

	     conf.headers = yyvsp[0].strings;
     }
break;
case 70:
#line 633 "parse.y"
{
	     if (conf.proxy != NULL) {
		     xfree(conf.proxy->server.host);
		     xfree(conf.proxy->server.port);
		     if (conf.proxy->user != NULL)
			     xfree(conf.proxy->user);
		     if (conf.proxy->pass != NULL)
			     xfree(conf.proxy->pass);
	     }
	     if ((conf.proxy = getproxy(yyvsp[0].string)) == NULL)
		     yyerror("invalid proxy");
	     xfree(yyvsp[0].string);
     }
break;
case 71:
#line 647 "parse.y"
{
	     conf.verify_certs = 1;
     }
break;
case 72:
#line 651 "parse.y"
{
	     conf.impl_act = DECISION_KEEP;
     }
break;
case 73:
#line 655 "parse.y"
{
	     conf.impl_act = DECISION_DROP;
     }
break;
case 74:
#line 660 "parse.y"
{
	     if (yyvsp[0].number == 0)
		     yyerror("invalid purge-after value: 0");
	     if (yyvsp[0].number > UINT_MAX)
		     yyerror("purge-after value too large: %lld", yyvsp[0].number);

	     conf.purge_after = yyvsp[0].number;
     }
break;
case 75:
#line 669 "parse.y"
{
	     conf.purge_after = 0;
     }
break;
case 76:
#line 673 "parse.y"
{
	     conf.no_received = 1;
     }
break;
case 77:
#line 677 "parse.y"
{
	     conf.file_group = -1;
     }
break;
case 78:
#line 682 "parse.y"
{
	     conf.file_group = yyvsp[0].gid;
     }
break;
case 79:
#line 686 "parse.y"
{
	     conf.file_umask = umask(0);
	     umask(conf.file_umask);
     }
break;
case 80:
#line 692 "parse.y"
{
	     char	s[8];
	     u_int	n;

	     /*
	      * We can't differentiate umasks in octal from normal numbers
	      * (requiring a leading zero a la C would be nice, but it would
	      * potentially break existing configs), so we need to fiddle to
	      * convert.
	      */
	     memset(s, 0, sizeof s);
	     xsnprintf(s, sizeof s, "%03lld", yyvsp[0].number);
	     if (s[3] != '\0' || s[0] < '0' || s[0] > '7' ||
		 s[1] < 0 || s[1] > '7' || s[2] < '0' || s[2] > '7')
		     yyerror("invalid umask: %s", s);
	     if (sscanf(s, "%o", &n) != 1)
		     yyerror("invalid umask: %s", s);
	     conf.file_umask = n;
     }
break;
case 81:
#line 715 "parse.y"
{
		  struct macro	*macro;

		  if (strlen(yyvsp[-2].string) > MAXNAMESIZE)
			  yyerror("macro name too long: %s", yyvsp[-2].string);

		  macro = xmalloc(sizeof *macro);
		  strlcpy(macro->name, yyvsp[-2].string, sizeof macro->name);
		  macro->type = MACRO_STRING;
		  macro->value.str = yyvsp[0].string;

		  if (parse_last == NULL)
			  TAILQ_INSERT_HEAD(&parse_macros, macro, entry);
		  else {
			  TAILQ_INSERT_AFTER(
			      &parse_macros, parse_last, macro, entry);
		  }

		  log_debug3("added macro \"%s\": \"%s\"", macro->name,
		      macro->value.str);
		  xfree(yyvsp[-2].string);
	  }
break;
case 82:
#line 739 "parse.y"
{
		  struct macro	*macro;

		  if (strlen(yyvsp[-2].string) > MAXNAMESIZE)
			  yyerror("macro name too long: %s", yyvsp[-2].string);

		  macro = xmalloc(sizeof *macro);
		  strlcpy(macro->name, yyvsp[-2].string, sizeof macro->name);
		  macro->type = MACRO_NUMBER;
		  macro->value.num = yyvsp[0].number;

		  if (parse_last == NULL)
			  TAILQ_INSERT_HEAD(&parse_macros, macro, entry);
		  else {
			  TAILQ_INSERT_AFTER(
			      &parse_macros, parse_last, macro, entry);
		  }

		  log_debug3("added macro \"%s\": %lld", macro->name,
		      macro->value.num);
		  xfree(yyvsp[-2].string);
	  }
break;
case 83:
#line 765 "parse.y"
{
		      if (*yyvsp[0].string == '\0')
			      yyerror("empty string in list");

		      yyval.replstrs = yyvsp[-1].replstrs;
		      ARRAY_EXPAND(yyval.replstrs, 1);
		      ARRAY_LAST(yyval.replstrs).str = yyvsp[0].string;
	      }
break;
case 84:
#line 775 "parse.y"
{
		      if (*yyvsp[0].string == '\0')
			     yyerror("empty string in list");

		      yyval.replstrs = xmalloc(sizeof *yyval.replstrs);
		      ARRAY_INIT(yyval.replstrs);
		      ARRAY_EXPAND(yyval.replstrs, 1);
		      ARRAY_LAST(yyval.replstrs).str = yyvsp[0].string;
	      }
break;
case 85:
#line 788 "parse.y"
{
		     if (*yyvsp[0].string == '\0')
			     yyerror("empty string in list");

		     yyval.strings = yyvsp[-1].strings;
		     ARRAY_ADD(yyval.strings, yyvsp[0].string);
	     }
break;
case 86:
#line 797 "parse.y"
{
		     if (*yyvsp[0].string == '\0')
			     yyerror("empty string in list");

		     yyval.strings = xmalloc(sizeof *yyval.strings);
		     ARRAY_INIT(yyval.strings);
		     ARRAY_ADD(yyval.strings, yyvsp[0].string);
	     }
break;
case 87:
#line 809 "parse.y"
{
		   if (*yyvsp[0].string == '\0')
			   yyerror("invalid path");

		   yyval.strings = yyvsp[-1].strings;
		   ARRAY_ADD(yyval.strings, yyvsp[0].string);
	   }
break;
case 88:
#line 818 "parse.y"
{
		   if (*yyvsp[0].string == '\0')
			   yyerror("invalid path");

		   yyval.strings = xmalloc(sizeof *yyval.strings);
		   ARRAY_INIT(yyval.strings);
		   ARRAY_ADD(yyval.strings, yyvsp[0].string);
	   }
break;
case 89:
#line 830 "parse.y"
{
		   yyval.users = yyvsp[-1].users;
		   ARRAY_ADD(yyval.users.users, yyvsp[0].uid);
	   }
break;
case 90:
#line 836 "parse.y"
{
		   yyval.users.users = xmalloc(sizeof *yyval.users.users);
		   ARRAY_INIT(yyval.users.users);
		   ARRAY_ADD(yyval.users.users, yyvsp[0].uid);
	   }
break;
case 91:
#line 845 "parse.y"
{
		 if (*yyvsp[0].string == '\0')
			 yyerror("invalid domain");

		 yyval.strings = xmalloc(sizeof *yyval.strings);
		 ARRAY_INIT(yyval.strings);
		 ARRAY_ADD(yyval.strings, yyvsp[0].string);
	 }
break;
case 92:
#line 855 "parse.y"
{
		 yyval.strings = yyvsp[-1].strings;
	 }
break;
case 93:
#line 862 "parse.y"
{
		 if (*yyvsp[0].string == '\0')
			 yyerror("invalid header");

		 yyval.strings = xmalloc(sizeof *yyval.strings);
		 ARRAY_INIT(yyval.strings);
		 ARRAY_ADD(yyval.strings, yyvsp[0].string);
	 }
break;
case 94:
#line 872 "parse.y"
{
		 yyval.strings = yyvsp[-1].strings;
	 }
break;
case 95:
#line 879 "parse.y"
{
		   if (*yyvsp[0].string == '\0')
			   yyerror("invalid header");

		   yyval.replstrs = xmalloc(sizeof *yyval.replstrs);
		   ARRAY_INIT(yyval.replstrs);
		   ARRAY_EXPAND(yyval.replstrs, 1);
		   ARRAY_LAST(yyval.replstrs).str = yyvsp[0].string;
	   }
break;
case 96:
#line 890 "parse.y"
{
		   yyval.replstrs = yyvsp[-1].replstrs;
	   }
break;
case 97:
#line 897 "parse.y"
{
		  if (*yyvsp[0].string == '\0')
			  yyerror("invalid path");

		  yyval.strings = xmalloc(sizeof *yyval.strings);
		  ARRAY_INIT(yyval.strings);
		  ARRAY_ADD(yyval.strings, yyvsp[0].string);
	  }
break;
case 98:
#line 907 "parse.y"
{
		  yyval.strings = yyvsp[-1].strings;
	  }
break;
case 99:
#line 914 "parse.y"
{
		if (*yyvsp[0].string == '\0')
			yyerror("invalid path");

		yyval.strings = xmalloc(sizeof *yyval.strings);
		ARRAY_INIT(yyval.strings);
		ARRAY_ADD(yyval.strings, yyvsp[0].string);
	}
break;
case 100:
#line 924 "parse.y"
{
		yyval.strings = yyvsp[-1].strings;
	}
break;
case 101:
#line 930 "parse.y"
{
	      yyval.locks = LOCK_FCNTL;
      }
break;
case 102:
#line 934 "parse.y"
{
	      yyval.locks = LOCK_FLOCK;
      }
break;
case 103:
#line 938 "parse.y"
{
	      yyval.locks = LOCK_DOTLOCK;
      }
break;
case 104:
#line 945 "parse.y"
{
		  yyval.locks = yyvsp[-1].locks | yyvsp[0].locks;
	  }
break;
case 105:
#line 950 "parse.y"
{
		  yyval.locks = yyvsp[0].locks;
	  }
break;
case 106:
#line 954 "parse.y"
{
		  yyval.locks = 0;
	  }
break;
case 107:
#line 961 "parse.y"
{
	     struct passwd	*pw;

	     if (*yyvsp[0].string == '\0')
		     yyerror("invalid user");

	     pw = getpwnam(yyvsp[0].string);
	     if (pw == NULL)
		     yyerror("unknown user: %s", yyvsp[0].string);
	     yyval.uid = pw->pw_uid;
	     endpwent();

	     xfree(yyvsp[0].string);
     }
break;
case 108:
#line 977 "parse.y"
{
	     struct passwd	*pw;

	     if (yyvsp[0].number > UID_MAX)
		     yyerror("invalid uid: %llu", yyvsp[0].number);
	     pw = getpwuid(yyvsp[0].number);
	     if (pw == NULL)
		     yyerror("unknown uid: %llu", yyvsp[0].number);
	     yyval.uid = pw->pw_uid;
	     endpwent();
     }
break;
case 109:
#line 992 "parse.y"
{
	     struct group	*gr;

	     if (*yyvsp[0].string == '\0')
		     yyerror("invalid group");

	     gr = getgrnam(yyvsp[0].string);
	     if (gr == NULL)
		     yyerror("unknown group: %s", yyvsp[0].string);
	     yyval.gid = gr->gr_gid;
	     endgrent();

	     xfree(yyvsp[0].string);
     }
break;
case 110:
#line 1008 "parse.y"
{
	     struct group	*gr;

	     if (yyvsp[0].number > GID_MAX)
		     yyerror("invalid gid: %llu", yyvsp[0].number);
	     gr = getgrgid(yyvsp[0].number);
	     if (gr == NULL)
		     yyerror("unknown gid: %llu", yyvsp[0].number);
	     yyval.gid = gr->gr_gid;
	     endgrent();
     }
break;
case 111:
#line 1022 "parse.y"
{
	      yyval.uid = -1;
      }
break;
case 112:
#line 1027 "parse.y"
{
	      yyval.uid = yyvsp[0].uid;
      }
break;
case 113:
#line 1034 "parse.y"
{
	       yyval.users.users = NULL;
	       yyval.users.find_uid = 0;
       }
break;
case 114:
#line 1039 "parse.y"
{
	       yyval.users.users = NULL;
	       yyval.users.find_uid = 1;
       }
break;
case 115:
#line 1045 "parse.y"
{
	       yyval.users.users = xmalloc(sizeof *yyval.users.users);
	       ARRAY_INIT(yyval.users.users);
	       ARRAY_ADD(yyval.users.users, yyvsp[0].uid);
	       yyval.users.find_uid = 0;
       }
break;
case 116:
#line 1053 "parse.y"
{
	       yyval.users = yyvsp[-1].users;
	       yyval.users.users = yyval.users.users;
	       yyval.users.find_uid = 0;
       }
break;
case 117:
#line 1062 "parse.y"
{
		/* match case */
		yyval.re.flags = 0;
		yyval.re.str = yyvsp[0].string;
        }
break;
case 118:
#line 1069 "parse.y"
{
		/* ignore case */
		yyval.re.flags = RE_IGNCASE;
		yyval.re.str = yyvsp[0].string;
	}
break;
case 119:
#line 1077 "parse.y"
{
	      yyval.flag = 1;
      }
break;
case 120:
#line 1081 "parse.y"
{
	      yyval.flag = 0;
      }
break;
case 121:
#line 1087 "parse.y"
{
	      yyval.flag = 1;
      }
break;
case 122:
#line 1091 "parse.y"
{
	      yyval.flag = 0;
      }
break;
case 123:
#line 1097 "parse.y"
{
		  yyval.flag = 1;
          }
break;
case 124:
#line 1101 "parse.y"
{
		  yyval.flag = 0;
	  }
break;
case 125:
#line 1108 "parse.y"
{
	      if (*yyvsp[0].string == '\0')
		      yyerror("invalid port");

	      yyval.string = yyvsp[0].string;
      }
break;
case 126:
#line 1116 "parse.y"
{
	      if (yyvsp[0].number == 0 || yyvsp[0].number > 65535)
		      yyerror("invalid port");

	      xasprintf(&yyval.string, "%lld", yyvsp[0].number);
      }
break;
case 127:
#line 1126 "parse.y"
{
		if (*yyvsp[-1].string == '\0')
			yyerror("invalid host");

		yyval.server.host = yyvsp[-1].string;
		yyval.server.port = yyvsp[0].string;
	}
break;
case 128:
#line 1135 "parse.y"
{
		if (*yyvsp[0].string == '\0')
			yyerror("invalid host");

		yyval.server.host = yyvsp[0].string;
		yyval.server.port = NULL;
	}
break;
case 129:
#line 1145 "parse.y"
{
	    yyval.string = NULL;
    }
break;
case 130:
#line 1150 "parse.y"
{
	    yyval.string = yyvsp[0].string;
    }
break;
case 131:
#line 1156 "parse.y"
{
		  yyval.flag = 1;
	  }
break;
case 132:
#line 1160 "parse.y"
{
		  yyval.flag = 0;
	  }
break;
case 133:
#line 1167 "parse.y"
{
		 struct deliver_pipe_data	*data;

		 if (*yyvsp[0].string == '\0')
			 yyerror("invalid command");

		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_pipe;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->pipe = yyvsp[-1].flag;
		 data->cmd.str = yyvsp[0].string;
	 }
break;
case 134:
#line 1184 "parse.y"
{
		 struct deliver_rewrite_data	*data;

		 if (*yyvsp[0].string == '\0')
			 yyerror("invalid command");

		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_rewrite;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->cmd.str = yyvsp[0].string;
	 }
break;
case 135:
#line 1200 "parse.y"
{
		 struct deliver_write_data	*data;

		 if (*yyvsp[0].string == '\0')
			 yyerror("invalid path");

		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_write;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->append = yyvsp[-1].flag;
		 data->path.str = yyvsp[0].string;
	 }
break;
case 136:
#line 1217 "parse.y"
{
		 struct deliver_maildir_data	*data;

		 if (*yyvsp[0].string == '\0')
			 yyerror("invalid path");

		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_maildir;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->path.str = yyvsp[0].string;
	 }
break;
case 137:
#line 1233 "parse.y"
{
		 struct deliver_remove_header_data *data;

		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_remove_header;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->hdrs = yyvsp[0].replstrs;
	 }
break;
case 138:
#line 1246 "parse.y"
{
		 struct deliver_add_header_data	*data;

		 if (*yyvsp[-1].string == '\0')
			 yyerror("invalid header");

		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_add_header;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->hdr.str = yyvsp[-1].string;
		 data->value.str = yyvsp[0].string;
	 }
break;
case 139:
#line 1263 "parse.y"
{
		 struct deliver_mbox_data	*data;

		 if (*yyvsp[-1].string == '\0')
			 yyerror("invalid path");

		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_mbox;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->path.str = yyvsp[-1].string;
		 data->compress = yyvsp[0].flag;
	 }
break;
case 140:
#line 1280 "parse.y"
{
		 struct deliver_smtp_data	*data;

		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_smtp;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->server.host = yyvsp[-1].server.host;
		 if (yyvsp[-1].server.port != NULL)
			 data->server.port = yyvsp[-1].server.port;
		 else
			 data->server.port = xstrdup("smtp");
		 data->server.ai = NULL;
		 data->to.str = yyvsp[0].string;
	 }
break;
case 141:
#line 1298 "parse.y"
{
		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_stdout;
	 }
break;
case 142:
#line 1304 "parse.y"
{
		 struct deliver_tag_data	*data;

		 if (*yyvsp[-1].string == '\0')
			 yyerror("invalid tag");

		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_tag;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->key.str = yyvsp[-1].string;
		 data->value.str = yyvsp[0].string;
	 }
break;
case 143:
#line 1321 "parse.y"
{
		 struct deliver_to_cache_data	*data;

		 if (*yyvsp[-2].string == '\0')
			 yyerror("invalid path");
		 if (*yyvsp[0].string == '\0')
			 yyerror("invalid key");

		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_to_cache;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->key.str = yyvsp[0].string;
		 data->path = yyvsp[-2].string;
	 }
break;
case 144:
#line 1340 "parse.y"
{
		 struct deliver_action_data	*data;

		 /*
		  * This is a special-case, handled when the list of delivery
		  * targets is resolved rather than by calling a deliver
		  * function, so the deliver pointer is NULL.
		  */
		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = NULL;

		 data = xcalloc(1, sizeof *data);
		 yyval.actitem->data = data;

		 data->actions = yyvsp[0].replstrs;
 	 }
break;
case 145:
#line 1357 "parse.y"
{
		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_drop;
	 }
break;
case 146:
#line 1362 "parse.y"
{
		 yyval.actitem = xcalloc(1, sizeof *yyval.actitem);
		 yyval.actitem->deliver = &deliver_keep;
	 }
break;
case 147:
#line 1370 "parse.y"
{
		 yyval.actlist = yyvsp[-1].actlist;

		 TAILQ_INSERT_TAIL(yyval.actlist, yyvsp[0].actitem, entry);
		 yyvsp[0].actitem->idx = parse_actionidx++;
	 }
break;
case 148:
#line 1378 "parse.y"
{
		 yyval.actlist = xmalloc(sizeof *yyval.actlist);
		 TAILQ_INIT(yyval.actlist);

		 TAILQ_INSERT_HEAD(yyval.actlist, yyvsp[0].actitem, entry);
		 yyvsp[0].actitem->idx = 0;

		 parse_actionidx = 1;
	 }
break;
case 149:
#line 1392 "parse.y"
{
		   struct action	*t;

		   if (strlen(yyvsp[-2].string) >= MAXNAMESIZE)
			   yyerror("action name too long: %s", yyvsp[-2].string);
		   if (*yyvsp[-2].string == '\0')
			   yyerror("invalid action name");
		   if (find_action(yyvsp[-2].string) != NULL)
			   yyerror("duplicate action: %s", yyvsp[-2].string);

		   t = xmalloc(sizeof *t);
		   strlcpy(t->name, yyvsp[-2].string, sizeof t->name);

		   t->list = xmalloc(sizeof *t->list);
		   TAILQ_INIT(t->list);
		   TAILQ_INSERT_HEAD(t->list, yyvsp[0].actitem, entry);
		   yyvsp[0].actitem->idx = 0;

		   t->users = yyvsp[-1].users.users;
		   t->find_uid = yyvsp[-1].users.find_uid;
		   TAILQ_INSERT_TAIL(&conf.actions, t, entry);

		   print_action(t);

		   xfree(yyvsp[-2].string);
	   }
break;
case 150:
#line 1421 "parse.y"
{
		   struct action	*t;

		   if (strlen(yyvsp[-4].string) >= MAXNAMESIZE)
			   yyerror("action name too long: %s", yyvsp[-4].string);
		   if (*yyvsp[-4].string == '\0')
			   yyerror("invalid action name");
		   if (find_action(yyvsp[-4].string) != NULL)
			   yyerror("duplicate action: %s", yyvsp[-4].string);

		   t = xmalloc(sizeof *t);
		   strlcpy(t->name, yyvsp[-4].string, sizeof t->name);

		   t->list = yyvsp[-1].actlist;

		   t->users = yyvsp[-3].users.users;
		   t->find_uid = yyvsp[-3].users.find_uid;
		   TAILQ_INSERT_TAIL(&conf.actions, t, entry);

		   print_action(t);

		   xfree(yyvsp[-4].string);
	   }
break;
case 151:
#line 1447 "parse.y"
{
		  yyval.replstrs = NULL;
	  }
break;
case 152:
#line 1452 "parse.y"
{
		  yyval.replstrs = yyvsp[0].replstrs;
	  }
break;
case 153:
#line 1459 "parse.y"
{
		  if (*yyvsp[0].string == '\0')
			  yyerror("invalid account name");
		  if (!have_accounts(yyvsp[0].string))
			  yyerror("no matching accounts: %s", yyvsp[0].string);

		  yyval.replstrs = xmalloc(sizeof *yyval.replstrs);
		  ARRAY_INIT(yyval.replstrs);
		  ARRAY_EXPAND(yyval.replstrs, 1);
		  ARRAY_LAST(yyval.replstrs).str = yyvsp[0].string;
	  }
break;
case 154:
#line 1472 "parse.y"
{
		  yyval.replstrs = yyvsp[-1].replstrs;
	  }
break;
case 155:
#line 1479 "parse.y"
{
		 if (*yyvsp[0].string == '\0')
			 yyerror("invalid action name");

		 yyval.replstrs = xmalloc(sizeof *yyval.replstrs);
		 ARRAY_INIT(yyval.replstrs);
		 ARRAY_EXPAND(yyval.replstrs, 1);
		 ARRAY_LAST(yyval.replstrs).str = yyvsp[0].string;
	 }
break;
case 156:
#line 1490 "parse.y"
{
		 yyval.replstrs = yyvsp[-1].replstrs;
	 }
break;
case 157:
#line 1496 "parse.y"
{
	      yyval.flag = 0;
      }
break;
case 158:
#line 1500 "parse.y"
{
	      yyval.flag = 1;
      }
break;
case 159:
#line 1506 "parse.y"
{
	      yyval.area = AREA_ANY;
      }
break;
case 160:
#line 1510 "parse.y"
{
	      yyval.area = AREA_ANY;
      }
break;
case 161:
#line 1514 "parse.y"
{
	      yyval.area = AREA_HEADERS;
      }
break;
case 162:
#line 1518 "parse.y"
{
	      yyval.area = AREA_BODY;
      }
break;
case 163:
#line 1525 "parse.y"
{
	       if (yyvsp[0].number < 0 || yyvsp[0].number > 255)
		       yyerror("invalid return code");

	       yyval.number = yyvsp[0].number;
       }
break;
case 164:
#line 1532 "parse.y"
{
	       yyval.number = -1;
       }
break;
case 165:
#line 1539 "parse.y"
{
	       yyval.re = yyvsp[0].re;
       }
break;
case 166:
#line 1543 "parse.y"
{
	       yyval.re.str = NULL;
       }
break;
case 167:
#line 1549 "parse.y"
{
	     yyval.cmp = CMP_LT;
     }
break;
case 168:
#line 1553 "parse.y"
{
	     yyval.cmp = CMP_GT;
     }
break;
case 169:
#line 1559 "parse.y"
{
	      yyval.cmp = CMP_EQ;
      }
break;
case 170:
#line 1563 "parse.y"
{
	      yyval.cmp = CMP_NE;
      }
break;
case 171:
#line 1570 "parse.y"
{
	     yyval.cmp = yyvsp[0].cmp;
     }
break;
case 172:
#line 1575 "parse.y"
{
	     yyval.cmp = yyvsp[0].cmp;
     }
break;
case 173:
#line 1581 "parse.y"
{
		  yyval.flag = 0;
	  }
break;
case 174:
#line 1585 "parse.y"
{
		  yyval.flag = 1;
	  }
break;
case 175:
#line 1591 "parse.y"
{
		     yyval.flag = 0;
	     }
break;
case 176:
#line 1595 "parse.y"
{
		     yyval.flag = 1;
	     }
break;
case 177:
#line 1601 "parse.y"
{
		yyval.exprop = OP_AND;
        }
break;
case 178:
#line 1605 "parse.y"
{
		yyval.exprop = OP_OR;
	}
break;
case 179:
#line 1612 "parse.y"
{
		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);
		  yyval.expritem->match = &match_all;
		  yyval.expritem->inverted = yyvsp[-1].flag;
	  }
break;
case 180:
#line 1620 "parse.y"
{
		  struct match_regexp_data	*data;
		  char				*cause;

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);
		  yyval.expritem->match = &match_regexp;
		  yyval.expritem->inverted = yyvsp[-2].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->area = yyvsp[0].area;

		  if (re_compile(&data->re, yyvsp[-1].re.str, yyvsp[-1].re.flags, &cause) != 0)
			  yyerror("%s", cause);
		  xfree(yyvsp[-1].re.str);
	  }
break;
case 181:
#line 1639 "parse.y"
{
		  struct match_account_data	*data;

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);
		  yyval.expritem->match = &match_account;
		  yyval.expritem->inverted = yyvsp[-1].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->accounts = yyvsp[0].replstrs;
	  }
break;
case 182:
#line 1655 "parse.y"
{
		  struct match_command_data	*data;
		  char				*cause;

		  if (*yyvsp[-7].string == '\0' || (yyvsp[-7].string[0] == '|' && yyvsp[-7].string[1] == '\0'))
			  yyerror("invalid command");
		  if (yyvsp[-3].number == -1 && yyvsp[-1].re.str == NULL)
			  yyerror("return code or regexp must be specified");

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);
		  yyval.expritem->match = &match_command;
		  yyval.expritem->inverted = yyvsp[-9].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->uid = yyvsp[-6].uid;
		  data->pipe = yyvsp[-8].flag;
		  data->cmd.str = yyvsp[-7].string;

		  data->ret = yyvsp[-3].number;

		  if (yyvsp[-1].re.str != NULL) {
			  if (re_compile(
			      &data->re, yyvsp[-1].re.str, yyvsp[-1].re.flags, &cause) != 0)
				  yyerror("%s", cause);
			  xfree(yyvsp[-1].re.str);
		  }

	  }
break;
case 183:
#line 1687 "parse.y"
{
		  struct match_tagged_data	*data;

		  if (*yyvsp[0].string == '\0')
			  yyerror("invalid tag");

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_tagged;
		  yyval.expritem->inverted = yyvsp[-2].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->tag.str = yyvsp[0].string;
	  }
break;
case 184:
#line 1705 "parse.y"
{
		  struct match_size_data	*data;

#if SIZE_MAX < LLONG_MAX
		  if (yyvsp[0].number > SIZE_MAX)
			  yyerror("size too large");
#endif

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_size;
		  yyval.expritem->inverted = yyvsp[-3].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->size = yyvsp[0].number;
		  data->cmp = yyvsp[-1].cmp;
	  }
break;
case 185:
#line 1727 "parse.y"
{
		  struct match_string_data	*data;
		  char				*cause;

		  if (*yyvsp[-2].string == '\0')
			  yyerror("invalid string");

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_string;
		  yyval.expritem->inverted = yyvsp[-4].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->str.str = yyvsp[-2].string;
		  if (re_compile(
		      &data->re, yyvsp[0].re.str, yyvsp[0].re.flags|RE_NOSUBST, &cause) != 0)
			  yyerror("%s", cause);
		  xfree(yyvsp[0].re.str);
	  }
break;
case 186:
#line 1750 "parse.y"
{
		  struct match_in_cache_data	*data;

		  if (*yyvsp[-2].string == '\0')
			  yyerror("invalid path");
		  if (*yyvsp[0].string == '\0')
			  yyerror("invalid key");

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_in_cache;
		  yyval.expritem->inverted = yyvsp[-4].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->key.str = yyvsp[0].string;
		  data->path = yyvsp[-2].string;
	  }
break;
case 187:
#line 1771 "parse.y"
{
		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_matched;
		  yyval.expritem->inverted = yyvsp[-1].flag;
          }
break;
case 188:
#line 1779 "parse.y"
{
		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_unmatched;
		  yyval.expritem->inverted = yyvsp[-1].flag;
          }
break;
case 189:
#line 1787 "parse.y"
{
		  struct match_age_data	*data;

		  if (yyvsp[0].number == 0)
			  yyerror("invalid time");

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_age;
		  yyval.expritem->inverted = yyvsp[-3].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->time = yyvsp[0].number;
		  data->cmp = yyvsp[-1].cmp;
	  }
break;
case 190:
#line 1806 "parse.y"
{
		  struct match_age_data	*data;

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_age;
		  yyval.expritem->inverted = yyvsp[-2].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->time = -1;
	  }
break;
case 191:
#line 1821 "parse.y"
{
		  struct match_attachment_data	*data;

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_attachment;
		  yyval.expritem->inverted = yyvsp[-4].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->op = ATTACHOP_COUNT;
		  data->cmp = yyvsp[-1].cmp;
		  data->value.num = yyvsp[0].number;
	  }
break;
case 192:
#line 1838 "parse.y"
{
		  struct match_attachment_data	*data;

#if SIZE_MAX < LLONG_MAX
		  if (yyvsp[0].number > SIZE_MAX)
			  yyerror("size too large");
#endif

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_attachment;
		  yyval.expritem->inverted = yyvsp[-4].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->op = ATTACHOP_TOTALSIZE;
		  data->cmp = yyvsp[-1].cmp;
		  data->value.size = yyvsp[0].number;
	  }
break;
case 193:
#line 1860 "parse.y"
{
		  struct match_attachment_data	*data;

#if SIZE_MAX < LLONG_MAX
		  if (yyvsp[0].number > SIZE_MAX)
			  yyerror("size too large");
#endif

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_attachment;
		  yyval.expritem->inverted = yyvsp[-4].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->op = ATTACHOP_ANYSIZE;
		  data->cmp = yyvsp[-1].cmp;
		  data->value.size = yyvsp[0].number;
	  }
break;
case 194:
#line 1882 "parse.y"
{
		  struct match_attachment_data	*data;

		  if (*yyvsp[0].string == '\0')
			  yyerror("invalid string");

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_attachment;
		  yyval.expritem->inverted = yyvsp[-3].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->op = ATTACHOP_ANYTYPE;
		  data->value.str.str = yyvsp[0].string;
	  }
break;
case 195:
#line 1901 "parse.y"
{
		  struct match_attachment_data	*data;

		  if (*yyvsp[0].string == '\0')
			  yyerror("invalid string");

		  yyval.expritem = xcalloc(1, sizeof *yyval.expritem);

		  yyval.expritem->match = &match_attachment;
		  yyval.expritem->inverted = yyvsp[-3].flag;

		  data = xcalloc(1, sizeof *data);
		  yyval.expritem->data = data;

		  data->op = ATTACHOP_ANYNAME;
		  data->value.str.str = yyvsp[0].string;
	  }
break;
case 196:
#line 1923 "parse.y"
{
		  yyval.expr = yyvsp[-2].expr;

		  yyvsp[0].expritem->op = yyvsp[-1].exprop;
		  TAILQ_INSERT_TAIL(yyval.expr, yyvsp[0].expritem, entry);
	  }
break;
case 197:
#line 1931 "parse.y"
{
		  yyval.expr = xmalloc(sizeof *yyval.expr);
		  TAILQ_INIT(yyval.expr);

		  yyvsp[0].expritem->op = yyvsp[-1].exprop;
		  TAILQ_INSERT_HEAD(yyval.expr, yyvsp[0].expritem, entry);
	  }
break;
case 198:
#line 1942 "parse.y"
{
	      yyval.expr = xmalloc(sizeof *yyval.expr);
	      TAILQ_INIT(yyval.expr);

	      TAILQ_INSERT_HEAD(yyval.expr, yyvsp[0].expritem, entry);
      }
break;
case 199:
#line 1950 "parse.y"
{
	      yyval.expr = yyvsp[0].expr;

	      TAILQ_INSERT_HEAD(yyval.expr, yyvsp[-1].expritem, entry);
      }
break;
case 200:
#line 1960 "parse.y"
{
		 struct action	*t;

		 yyval.rule = xcalloc(1, sizeof *yyval.rule);
		 yyval.rule->idx = parse_ruleidx++;
		 yyval.rule->actions = NULL;
		 TAILQ_INIT(&yyval.rule->rules);
		 yyval.rule->stop = !yyvsp[0].flag;
		 yyval.rule->users = yyvsp[-3].users.users;
		 yyval.rule->find_uid = yyvsp[-3].users.find_uid;

		 t = yyval.rule->lambda = xcalloc(1, sizeof *yyval.rule->lambda);
		 xsnprintf(t->name, sizeof t->name, "<rule %u>", yyval.rule->idx);
		 t->users = NULL;
		 t->find_uid = 0;
		 t->list = xmalloc(sizeof *t->list);
		 TAILQ_INIT(t->list);
		 TAILQ_INSERT_HEAD(t->list, yyvsp[-1].actitem, entry);
		 yyvsp[-1].actitem->idx = 0;

		 if (parse_rule == NULL)
			 TAILQ_INSERT_TAIL(&conf.rules, yyval.rule, entry);
		 else
			 TAILQ_INSERT_TAIL(&parse_rule->rules, yyval.rule, entry);
	 }
break;
case 201:
#line 1988 "parse.y"
{
		 struct action	*t;

		 yyval.rule = xcalloc(1, sizeof *yyval.rule);
		 yyval.rule->idx = parse_ruleidx++;
		 yyval.rule->actions = NULL;
		 TAILQ_INIT(&yyval.rule->rules);
		 yyval.rule->stop = !yyvsp[0].flag;
		 yyval.rule->users = yyvsp[-5].users.users;
		 yyval.rule->find_uid = yyvsp[-5].users.find_uid;

		 t = yyval.rule->lambda = xcalloc(1, sizeof *yyval.rule->lambda);
		 xsnprintf(t->name, sizeof t->name, "<rule %u>", yyval.rule->idx);
		 t->users = NULL;
		 t->find_uid = 0;
		 t->list = yyvsp[-2].actlist;

		 if (parse_rule == NULL)
			 TAILQ_INSERT_TAIL(&conf.rules, yyval.rule, entry);
		 else
			 TAILQ_INSERT_TAIL(&parse_rule->rules, yyval.rule, entry);
	 }
break;
case 202:
#line 2013 "parse.y"
{
		 yyval.rule = xcalloc(1, sizeof *yyval.rule);
		 yyval.rule->idx = parse_ruleidx++;
		 yyval.rule->lambda = NULL;
		 yyval.rule->actions = yyvsp[-1].replstrs;
		 TAILQ_INIT(&yyval.rule->rules);
		 yyval.rule->stop = !yyvsp[0].flag;
		 yyval.rule->users = yyvsp[-2].users.users;
		 yyval.rule->find_uid = yyvsp[-2].users.find_uid;

		 if (parse_rule == NULL)
			 TAILQ_INSERT_TAIL(&conf.rules, yyval.rule, entry);
		 else
			 TAILQ_INSERT_TAIL(&parse_rule->rules, yyval.rule, entry);
	 }
break;
case 203:
#line 2029 "parse.y"
{
		 yyval.rule = xcalloc(1, sizeof *yyval.rule);
		 yyval.rule->idx = parse_ruleidx++;
		 yyval.rule->lambda = NULL;
		 yyval.rule->actions = NULL;
		 TAILQ_INIT(&yyval.rule->rules);
		 yyval.rule->stop = 0;
		 yyval.rule->users = NULL;
		 yyval.rule->find_uid = 0;

		 if (parse_rule == NULL)
			 TAILQ_INSERT_TAIL(&conf.rules, yyval.rule, entry);
		 else
			 TAILQ_INSERT_TAIL(&parse_rule->rules, yyval.rule, entry);

		 ARRAY_ADD(&parse_rulestack, parse_rule);
		 parse_rule = yyval.rule;
	 }
break;
case 204:
#line 2050 "parse.y"
{
	       if (parse_rule == NULL)
		       yyerror("missing {");

	       parse_rule = ARRAY_LAST(&parse_rulestack);
	       ARRAY_TRUNC(&parse_rulestack, 1);
       }
break;
case 205:
#line 2062 "parse.y"
{
	      struct expritem		*ei;
	      struct match_account_data	*data;

	      yyvsp[0].rule->expr = yyvsp[-2].expr;

	      /* Prepend an accounts rule to the expression. */
	      if (yyvsp[-1].replstrs != NULL) {
		      yywarn("match ... accounts ... is deprecated");
		      yywarn("please use the 'accounts' match condition");

		      if (yyvsp[0].rule->expr == NULL) {
			      yyvsp[0].rule->expr = xmalloc(sizeof *yyvsp[0].rule->expr);
			      TAILQ_INIT(yyvsp[0].rule->expr);
		      } else
			      TAILQ_FIRST(yyvsp[0].rule->expr)->op = OP_AND;

		      ei = xcalloc(1, sizeof *ei);
		      ei->match = &match_account;
		      ei->op = OP_NONE;
		      TAILQ_INSERT_HEAD(yyvsp[0].rule->expr, ei, entry);

		      data = xcalloc(1, sizeof *data);
		      ei->data = data;

		      data->accounts = yyvsp[-1].replstrs;
	      }

	      print_rule(yyvsp[0].rule);
      }
break;
case 206:
#line 2095 "parse.y"
{
		yyval.string = NULL;
        }
break;
case 207:
#line 2100 "parse.y"
{
		if (*yyvsp[0].string == '\0')
			yyerror("invalid folder");

		yyval.string = yyvsp[0].string;
	}
break;
case 208:
#line 2110 "parse.y"
{
		if (*yyvsp[0].string == '\0')
			yyerror("invalid group");

		yyval.strings = xmalloc(sizeof *yyval.strings);
		ARRAY_INIT(yyval.strings);
		ARRAY_ADD(yyval.strings, yyvsp[0].string);
	}
break;
case 209:
#line 2120 "parse.y"
{
		yyval.strings = yyvsp[-1].strings;
	}
break;
case 210:
#line 2126 "parse.y"
{
		yyval.flag = 0;
	}
break;
case 211:
#line 2130 "parse.y"
{
		yyval.flag = 1;
	}
break;
case 212:
#line 2136 "parse.y"
{
	      yyval.flag = 0;
      }
break;
case 213:
#line 2140 "parse.y"
{
	      yyval.flag = 1;
      }
break;
case 214:
#line 2146 "parse.y"
{
	      yyval.only = FETCH_ONLY_NEW;
      }
break;
case 215:
#line 2150 "parse.y"
{
	      yyval.only = FETCH_ONLY_OLD;
      }
break;
case 216:
#line 2156 "parse.y"
{
		 yyval.flag = 0;
         }
break;
case 217:
#line 2160 "parse.y"
{
		 yyval.flag = 1;
	 }
break;
case 218:
#line 2166 "parse.y"
{
		  yyval.flag = 0;
          }
break;
case 219:
#line 2170 "parse.y"
{
		  yyval.flag = 1;
	  }
break;
case 220:
#line 2176 "parse.y"
{
		  yyval.flag = 0;
          }
break;
case 221:
#line 2180 "parse.y"
{
		  yyval.flag = 1;
	  }
break;
case 222:
#line 2187 "parse.y"
{
		       if (*yyvsp[-2].string == '\0')
			       yyerror("invalid user");
		       if (*yyvsp[0].string == '\0')
			       yyerror("invalid pass");

		       yyval.userpass.user = yyvsp[-2].string;
		       yyval.userpass.user_netrc = 0;
		       yyval.userpass.pass = yyvsp[0].string;
		       yyval.userpass.pass_netrc = 0;
	       }
break;
case 223:
#line 2199 "parse.y"
{
		       yyval.userpass.user = NULL;
		       yyval.userpass.user_netrc = 1;
		       yyval.userpass.pass = NULL;
		       yyval.userpass.pass_netrc = 1;
	       }
break;
case 224:
#line 2207 "parse.y"
{
		       if (*yyvsp[0].string == '\0')
			       yyerror("invalid user");

		       yyval.userpass.user = yyvsp[0].string;
		       yyval.userpass.user_netrc = 0;
		       yyval.userpass.pass = NULL;
		       yyval.userpass.pass_netrc = 1;
	       }
break;
case 225:
#line 2218 "parse.y"
{
		       if (*yyvsp[0].string == '\0')
			       yyerror("invalid pass");

		       yyval.userpass.user = NULL;
		       yyval.userpass.user_netrc = 1;
		       yyval.userpass.pass = yyvsp[0].string;
		       yyval.userpass.pass_netrc = 0;
	       }
break;
case 226:
#line 2231 "parse.y"
{
		      if (*yyvsp[-2].string == '\0')
			      yyerror("invalid user");
		      if (*yyvsp[0].string == '\0')
			      yyerror("invalid pass");

		      yyval.userpass.user = yyvsp[-2].string;
		      yyval.userpass.user_netrc = 0;
		      yyval.userpass.pass = yyvsp[0].string;
		      yyval.userpass.pass_netrc = 0;
	      }
break;
case 227:
#line 2246 "parse.y"
{
		  yyval.userpass.user = yyvsp[0].userpass.user;
		  yyval.userpass.user_netrc = yyvsp[0].userpass.user_netrc;
		  yyval.userpass.pass = yyvsp[0].userpass.pass;
		  yyval.userpass.pass_netrc = yyvsp[0].userpass.pass_netrc;
	  }
break;
case 228:
#line 2253 "parse.y"
{
		  yyval.userpass.user = NULL;
		  yyval.userpass.user_netrc = 0;
		  yyval.userpass.pass = NULL;
		  yyval.userpass.pass_netrc = 0;
	  }
break;
case 229:
#line 2263 "parse.y"
{
		 yyval.poponly.path = yyvsp[0].string;
		 yyval.poponly.only = yyvsp[-2].only;
	 }
break;
case 230:
#line 2268 "parse.y"
{
		 yyval.poponly.path = NULL;
		 yyval.poponly.only = FETCH_ONLY_ALL;
	 }
break;
case 231:
#line 2276 "parse.y"
{
		  yyval.only = yyvsp[0].only;
	  }
break;
case 232:
#line 2280 "parse.y"
{
		  yyval.only = FETCH_ONLY_ALL;
	  }
break;
case 233:
#line 2289 "parse.y"
{
		   struct fetch_pop3_data	*data;

		   yyval.fetch.fetch = &fetch_pop3;
		   data = xcalloc(1, sizeof *data);
		   yyval.fetch.data = data;

		   if (yyvsp[-3].userpass.user_netrc && yyvsp[-3].userpass.pass_netrc)
			  find_netrc(yyvsp[-4].server.host, &data->user, &data->pass);
		   else {
			   if (yyvsp[-3].userpass.user_netrc)
				   find_netrc(yyvsp[-4].server.host, &data->user, NULL);
			   else
				   data->user = yyvsp[-3].userpass.user;
			   if (yyvsp[-3].userpass.pass_netrc)
				   find_netrc(yyvsp[-4].server.host, NULL, &data->pass);
			   else
				   data->pass = yyvsp[-3].userpass.pass;
		   }

		   data->server.ssl = yyvsp[-5].flag;
		   data->server.verify = yyvsp[0].flag;
		   data->server.host = yyvsp[-4].server.host;
		   if (yyvsp[-4].server.port != NULL)
			   data->server.port = yyvsp[-4].server.port;
		   else if (yyvsp[-5].flag)
			   data->server.port = xstrdup("pop3s");
		   else
			   data->server.port = xstrdup("pop3");
		   data->server.ai = NULL;
		   data->apop = yyvsp[-1].flag;

		   data->path = yyvsp[-2].poponly.path;
		   data->only = yyvsp[-2].poponly.only;
	   }
break;
case 234:
#line 2328 "parse.y"
{
		   struct fetch_pop3_data	*data;

		   yyval.fetch.fetch = &fetch_pop3pipe;
		   data = xcalloc(1, sizeof *data);
		   yyval.fetch.data = data;
		   data->user = yyvsp[-2].userpass.user;
		   data->pass = yyvsp[-2].userpass.pass;
		   data->pipecmd = yyvsp[-3].string;
		   if (data->pipecmd == NULL || *data->pipecmd == '\0')
			   yyerror("invalid pipe command");
		   data->apop = yyvsp[0].flag;
		   data->path = yyvsp[-1].poponly.path;
		   data->only = yyvsp[-1].poponly.only;
	   }
break;
case 235:
#line 2347 "parse.y"
{
		   struct fetch_imap_data	*data;

		   if (yyvsp[-2].string != NULL && *yyvsp[-2].string == '\0')
			   yyerror("invalid folder");

		   yyval.fetch.fetch = &fetch_imap;
		   data = xcalloc(1, sizeof *data);
		   yyval.fetch.data = data;

		   if (yyvsp[-3].userpass.user_netrc && yyvsp[-3].userpass.pass_netrc)
			  find_netrc(yyvsp[-4].server.host, &data->user, &data->pass);
		   else {
			   if (yyvsp[-3].userpass.user_netrc)
				   find_netrc(yyvsp[-4].server.host, &data->user, NULL);
			   else
				   data->user = yyvsp[-3].userpass.user;
			   if (yyvsp[-3].userpass.pass_netrc)
				   find_netrc(yyvsp[-4].server.host, NULL, &data->pass);
			   else
				   data->pass = yyvsp[-3].userpass.pass;
		   }

		   data->folder = yyvsp[-2].string == NULL ? xstrdup("INBOX") : yyvsp[-2].string;
		   data->server.ssl = yyvsp[-5].flag;
		   data->server.verify = yyvsp[0].flag;
		   data->server.host = yyvsp[-4].server.host;
		   if (yyvsp[-4].server.port != NULL)
			   data->server.port = yyvsp[-4].server.port;
		   else if (yyvsp[-5].flag)
			   data->server.port = xstrdup("imaps");
		   else
			   data->server.port = xstrdup("imap");
		   data->server.ai = NULL;
		   data->only = yyvsp[-1].only;
	   }
break;
case 236:
#line 2387 "parse.y"
{
		   struct fetch_imap_data	*data;

		   if (yyvsp[-1].string != NULL && *yyvsp[-1].string == '\0')
			   yyerror("invalid folder");

		   yyval.fetch.fetch = &fetch_imappipe;
		   data = xcalloc(1, sizeof *data);
		   yyval.fetch.data = data;
		   data->user = yyvsp[-2].userpass.user;
		   data->pass = yyvsp[-2].userpass.pass;
		   data->folder = yyvsp[-1].string == NULL ? xstrdup("INBOX") : yyvsp[-1].string;
		   data->pipecmd = yyvsp[-3].string;
		   if (data->pipecmd == NULL || *data->pipecmd == '\0')
			   yyerror("invalid pipe command");
		   data->only = yyvsp[0].only;
	   }
break;
case 237:
#line 2405 "parse.y"
{
		   yyval.fetch.fetch = &fetch_stdin;
	   }
break;
case 238:
#line 2410 "parse.y"
{
		   struct fetch_maildir_data	*data;

		   yyval.fetch.fetch = &fetch_maildir;
		   data = xcalloc(1, sizeof *data);
		   yyval.fetch.data = data;
		   data->maildirs = yyvsp[0].strings;
	   }
break;
case 239:
#line 2420 "parse.y"
{
		   struct fetch_mbox_data	*data;

		   yyval.fetch.fetch = &fetch_mbox;
		   data = xcalloc(1, sizeof *data);
		   yyval.fetch.data = data;
		   data->mboxes = yyvsp[0].strings;
	   }
break;
case 240:
#line 2432 "parse.y"
{
		   struct fetch_nntp_data	*data;
		   char				*group;

		   if (*yyvsp[-1].string == '\0')
			   yyerror("invalid cache");

		   yyval.fetch.fetch = &fetch_nntp;
		   data = xcalloc(1, sizeof *data);
		   yyval.fetch.data = data;
		   data->names = yyvsp[-3].strings;

		   if (ARRAY_LENGTH(yyvsp[-3].strings) == 1)
			   group = ARRAY_FIRST(yyvsp[-3].strings);
		   else
			   group = NULL;
		   data->path = yyvsp[-1].string;
		   if (data->path == NULL || *data->path == '\0')
			   yyerror("invalid cache");

		   data->server.ssl = yyvsp[-5].flag;
		   data->server.verify = yyvsp[0].flag;
		   data->server.host = yyvsp[-4].server.host;
		   if (yyvsp[-4].server.port != NULL)
			   data->server.port = yyvsp[-4].server.port;
		   else if (yyvsp[-5].flag)
                           data->server.port = xstrdup("nntps");
                   else
			   data->server.port = xstrdup("nntp");
		   data->server.ai = NULL;
	   }
break;
case 241:
#line 2469 "parse.y"
{
		 struct account		*a;
		 char			*su, desc[DESCBUFSIZE];

		 if (strlen(yyvsp[-4].string) >= MAXNAMESIZE)
			 yyerror("account name too long: %s", yyvsp[-4].string);
		 if (*yyvsp[-4].string == '\0')
			 yyerror("invalid account name");
		 if (find_account(yyvsp[-4].string) != NULL)
			 yyerror("duplicate account: %s", yyvsp[-4].string);

		 a = xcalloc(1, sizeof *a);
		 strlcpy(a->name, yyvsp[-4].string, sizeof a->name);
		 a->keep = yyvsp[0].flag;
		 a->disabled = yyvsp[-3].flag;
		 a->users = yyvsp[-2].users.users;
		 a->find_uid = yyvsp[-2].users.find_uid;
		 a->fetch = yyvsp[-1].fetch.fetch;
		 a->data = yyvsp[-1].fetch.data;
		 TAILQ_INSERT_TAIL(&conf.accounts, a, entry);

		 if (a->users != NULL)
			 su = fmt_users(" users=", a->users);
		 else
			 su = xstrdup("");
		 a->fetch->desc(a, desc, sizeof desc);
		 log_debug2("added account \"%s\":%s fetch=%s", a->name, su,
		     desc);
		 xfree(su);

		 xfree(yyvsp[-4].string);
	 }
break;
#line 3809 "y.tab.c"
    }
    yyssp -= yym;
    yystate = *yyssp;
    yyvsp -= yym;
    yym = yylhs[yyn];
    if (yystate == 0 && yym == 0)
    {
#if YYDEBUG
        if (yydebug)
            printf("%sdebug: after reduction, shifting from state 0 to\
 state %d\n", YYPREFIX, YYFINAL);
#endif
        yystate = YYFINAL;
        *++yyssp = YYFINAL;
        *++yyvsp = yyval;
        if (yychar < 0)
        {
            if ((yychar = yylex()) < 0) yychar = 0;
#if YYDEBUG
            if (yydebug)
            {
                yys = 0;
                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
                if (!yys) yys = "illegal-symbol";
                printf("%sdebug: state %d, reading %d (%s)\n",
                        YYPREFIX, YYFINAL, yychar, yys);
            }
#endif
        }
        if (yychar == 0) goto yyaccept;
        goto yyloop;
    }
    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
        yystate = yytable[yyn];
    else
        yystate = yydgoto[yym];
#if YYDEBUG
    if (yydebug)
        printf("%sdebug: after reduction, shifting from state %d \
to state %d\n", YYPREFIX, *yyssp, yystate);
#endif
    if (yyssp >= yysslim && yygrowstack())
    {
        goto yyoverflow;
    }
    *++yyssp = yystate;
    *++yyvsp = yyval;
    goto yyloop;
yyoverflow:
    yyerror("yacc stack overflow");
yyabort:
    return (1);
yyaccept:
    return (0);
}


syntax highlighted by Code2HTML, v. 0.9.1