cmd/gc: support x[i:j:k]

Design doc at golang.org/s/go12slice.
This is an experimental feature and may not be included in the release.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/10743046
diff --git a/src/cmd/5g/cgen.c b/src/cmd/5g/cgen.c
index 1620f41..997eae7 100644
--- a/src/cmd/5g/cgen.c
+++ b/src/cmd/5g/cgen.c
@@ -34,6 +34,8 @@
 	case OSLICE:
 	case OSLICEARR:
 	case OSLICESTR:
+	case OSLICE3:
+	case OSLICE3ARR:
 		if (res->op != ONAME || !res->addable) {
 			tempname(&n1, n->type);
 			cgen_slice(n, &n1);
@@ -629,6 +631,8 @@
 	case OSLICE:
 	case OSLICEARR:
 	case OSLICESTR:
+	case OSLICE3:
+	case OSLICE3ARR:
 		tempname(&n1, n->type);
 		cgen_slice(n, &n1);
 		agen(&n1, res);
diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c
index 884ccff..d2b51f0 100644
--- a/src/cmd/6g/cgen.c
+++ b/src/cmd/6g/cgen.c
@@ -37,6 +37,8 @@
 	case OSLICE:
 	case OSLICEARR:
 	case OSLICESTR:
+	case OSLICE3:
+	case OSLICE3ARR:
 		if (res->op != ONAME || !res->addable) {
 			tempname(&n1, n->type);
 			cgen_slice(n, &n1);
@@ -841,6 +843,8 @@
 	case OSLICE:
 	case OSLICEARR:
 	case OSLICESTR:
+	case OSLICE3:
+	case OSLICE3ARR:
 		tempname(&n1, n->type);
 		cgen_slice(n, &n1);
 		agen(&n1, res);
diff --git a/src/cmd/8g/cgen.c b/src/cmd/8g/cgen.c
index 0294a42..9e79771 100644
--- a/src/cmd/8g/cgen.c
+++ b/src/cmd/8g/cgen.c
@@ -67,6 +67,8 @@
 	case OSLICE:
 	case OSLICEARR:
 	case OSLICESTR:
+	case OSLICE3:
+	case OSLICE3ARR:
 		if (res->op != ONAME || !res->addable) {
 			tempname(&n1, n->type);
 			cgen_slice(n, &n1);
@@ -547,6 +549,8 @@
 	case OSLICE:
 	case OSLICEARR:
 	case OSLICESTR:
+	case OSLICE3:
+	case OSLICE3ARR:
 		tempname(&n1, n->type);
 		cgen_slice(n, &n1);
 		agen(&n1, res);
diff --git a/src/cmd/gc/esc.c b/src/cmd/gc/esc.c
index 497645a..b84b66e 100644
--- a/src/cmd/gc/esc.c
+++ b/src/cmd/gc/esc.c
@@ -749,6 +749,8 @@
 	case ODOTTYPE2:
 	case OSLICE:
 	case OSLICEARR:
+	case OSLICE3:
+	case OSLICE3ARR:
 		// Conversions, field access, slice all preserve the input value.
 		escassign(e, dst, src->left);
 		break;
diff --git a/src/cmd/gc/fmt.c b/src/cmd/gc/fmt.c
index c7519c9..cf9c353 100644
--- a/src/cmd/gc/fmt.c
+++ b/src/cmd/gc/fmt.c
@@ -1022,6 +1022,8 @@
 	[OSLICE] = 8,
 	[OSLICESTR] = 8,
 	[OSLICEARR] = 8,
+	[OSLICE3] = 8,
+	[OSLICE3ARR] = 8,
 	[ODOTINTER] = 8,
 	[ODOTMETH] = 8,
 	[ODOTPTR] = 8,
@@ -1295,6 +1297,8 @@
 	case OSLICE:
 	case OSLICESTR:
 	case OSLICEARR:
+	case OSLICE3:
+	case OSLICE3ARR:
 		exprfmt(f, n->left, nprec);
 		return fmtprint(f, "[%N]", n->right);
 
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 518b992..db25013 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -520,6 +520,8 @@
 	OSLICE,	// v[1:2], typechecking may convert to a more specfic OSLICEXXX.
 	OSLICEARR,	// a[1:2]
 	OSLICESTR,	// s[1:2]
+	OSLICE3,	// v[1:2:3], typechecking may convert to OSLICE3ARR.
+	OSLICE3ARR,	// a[1:2:3]
 	ORECOVER,	// recover
 	ORECV,	// <-c
 	ORUNESTR,	// string(i)
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index 29cd370..ad192ac 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -23,6 +23,8 @@
 #include <libc.h>
 #include "go.h"
 
+static int isrelease = -1;
+
 static void fixlbrace(int);
 %}
 %union	{
@@ -950,6 +952,21 @@
 	{
 		$$ = nod(OSLICE, $1, nod(OKEY, $3, $5));
 	}
+|	pexpr '[' oexpr ':' oexpr ':' oexpr ']'
+	{
+		// Make sure we don't accidentally release this experimental feature.
+		// http://golang.org/s/go12slice.
+		if(isrelease < 0)
+			isrelease = strstr(getgoversion(), "release") != nil;
+		if(isrelease)
+			yyerror("3-index slice not available in release");
+
+		if($5 == N)
+			yyerror("middle index required in 3-index slice");
+		if($7 == N)
+			yyerror("final index required in 3-index slice");
+		$$ = nod(OSLICE3, $1, nod(OKEY, $3, nod(OKEY, $5, $7)));
+	}
 |	pseudocall
 |	convtype '(' expr ocomma ')'
 	{
diff --git a/src/cmd/gc/racewalk.c b/src/cmd/gc/racewalk.c
index 7d5196b..dbb11d7 100644
--- a/src/cmd/gc/racewalk.c
+++ b/src/cmd/gc/racewalk.c
@@ -304,6 +304,8 @@
 
 	case OSLICE:
 	case OSLICEARR:
+	case OSLICE3:
+	case OSLICE3ARR:
 		// Seems to only lead to double instrumentation.
 		//racewalknode(&n->left, init, 0, 0);
 		goto ret;
diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c
index 29fc430..d4dc081 100644
--- a/src/cmd/gc/typecheck.c
+++ b/src/cmd/gc/typecheck.c
@@ -33,6 +33,8 @@
 static Node*	resolve(Node*);
 static void	checkdefergo(Node*);
 static int	checkmake(Type*, char*, Node*);
+static int	checksliceindex(Node*, Type*);
+static int	checksliceconst(Node*, Node*);
 
 static	NodeList*	typecheckdefstack;
 
@@ -303,7 +305,7 @@
 typecheck1(Node **np, int top)
 {
 	int et, aop, op, ptr;
-	Node *n, *l, *r;
+	Node *n, *l, *r, *lo, *mid, *hi;
 	NodeList *args;
 	int ok, ntop;
 	Type *t, *tp, *missing, *have, *badtype;
@@ -993,54 +995,63 @@
 			yyerror("cannot slice %N (type %T)", l, t);
 			goto error;
 		}
-		if(n->right->left != N) {
-			if((t = n->right->left->type) == T)
-				goto error;
-			if(!isint[t->etype]) {
-				yyerror("invalid slice index %N (type %T)", n->right->left, t);
+		if((lo = n->right->left) != N && checksliceindex(lo, tp) < 0)
+			goto error;
+		if((hi = n->right->right) != N && checksliceindex(hi, tp) < 0)
+			goto error;
+		if(checksliceconst(lo, hi) < 0)
+			goto error;
+		goto ret;
+
+	case OSLICE3:
+		ok |= Erv;
+		typecheck(&n->left, top);
+		typecheck(&n->right->left, Erv);
+		typecheck(&n->right->right->left, Erv);
+		typecheck(&n->right->right->right, Erv);
+		defaultlit(&n->left, T);
+		indexlit(&n->right->left);
+		indexlit(&n->right->right->left);
+		indexlit(&n->right->right->right);
+		l = n->left;
+		if(isfixedarray(l->type)) {
+			if(!islvalue(n->left)) {
+				yyerror("invalid operation %N (slice of unaddressable value)", n);
 				goto error;
 			}
-			if(n->right->left->op == OLITERAL) {
-				if(mpgetfix(n->right->left->val.u.xval) < 0) {
-					yyerror("invalid slice index %N (index must be non-negative)", n->right->left);
-					goto error;
-				} else if(tp != nil && tp->bound > 0 && mpgetfix(n->right->left->val.u.xval) > tp->bound) {
-					yyerror("invalid slice index %N (out of bounds for %d-element array)", n->right->left, tp->bound);
-					goto error;
-				} else if(mpcmpfixfix(n->right->left->val.u.xval, maxintval[TINT]) > 0) {
-					yyerror("invalid slice index %N (index too large)", n->right->left);
-					goto error;
-				}
-			}
+			n->left = nod(OADDR, n->left, N);
+			n->left->implicit = 1;
+			typecheck(&n->left, Erv);
+			l = n->left;
 		}
-		if(n->right->right != N) {
-			if((t = n->right->right->type) == T)
-				goto error;
-			if(!isint[t->etype]) {
-				yyerror("invalid slice index %N (type %T)", n->right->right, t);
-				goto error;
-			}
-			if(n->right->right->op == OLITERAL) {
-				if(mpgetfix(n->right->right->val.u.xval) < 0) {
-					yyerror("invalid slice index %N (index must be non-negative)", n->right->right);
-					goto error;
-				} else if(tp != nil && tp->bound > 0 && mpgetfix(n->right->right->val.u.xval) > tp->bound) {
-					yyerror("invalid slice index %N (out of bounds for %d-element array)", n->right->right, tp->bound);
-					goto error;
-				} else if(mpcmpfixfix(n->right->right->val.u.xval, maxintval[TINT]) > 0) {
-					yyerror("invalid slice index %N (index too large)", n->right->right);
-					goto error;
-				}
-			}
-		}
-		if(n->right->left != N
-		   && n->right->right != N
-		   && n->right->left->op == OLITERAL
-		   && n->right->right->op == OLITERAL
-		   && mpcmpfixfix(n->right->left->val.u.xval, n->right->right->val.u.xval) > 0) {
-			yyerror("inverted slice index %N > %N", n->right->left, n->right->right);
+		if((t = l->type) == T)
+			goto error;
+		tp = nil;
+		if(istype(t, TSTRING)) {
+			yyerror("invalid operation %N (3-index slice of string)", n);
 			goto error;
 		}
+		if(isptr[t->etype] && isfixedarray(t->type)) {
+			tp = t->type;
+			n->type = typ(TARRAY);
+			n->type->type = tp->type;
+			n->type->bound = -1;
+			dowidth(n->type);
+			n->op = OSLICE3ARR;
+		} else if(isslice(t)) {
+			n->type = t;
+		} else {
+			yyerror("cannot slice %N (type %T)", l, t);
+			goto error;
+		}
+		if((lo = n->right->left) != N && checksliceindex(lo, tp) < 0)
+			goto error;
+		if((mid = n->right->right->left) != N && checksliceindex(mid, tp) < 0)
+			goto error;
+		if((hi = n->right->right->right) != N && checksliceindex(hi, tp) < 0)
+			goto error;
+		if(checksliceconst(lo, hi) < 0 || checksliceconst(lo, mid) < 0 || checksliceconst(mid, hi) < 0)
+			goto error;
 		goto ret;
 
 	/*
@@ -1757,6 +1768,43 @@
 	*np = n;
 }
 
+static int
+checksliceindex(Node *r, Type *tp)
+{
+	Type *t;
+
+	if((t = r->type) == T)
+		return -1;
+	if(!isint[t->etype]) {
+		yyerror("invalid slice index %N (type %T)", r, t);
+		return -1;
+	}
+	if(r->op == OLITERAL) {
+		if(mpgetfix(r->val.u.xval) < 0) {
+			yyerror("invalid slice index %N (index must be non-negative)", r);
+			return -1;
+		} else if(tp != nil && tp->bound > 0 && mpgetfix(r->val.u.xval) > tp->bound) {
+			yyerror("invalid slice index %N (out of bounds for %d-element array)", r, tp->bound);
+			return -1;
+		} else if(mpcmpfixfix(r->val.u.xval, maxintval[TINT]) > 0) {
+			yyerror("invalid slice index %N (index too large)", r);
+			return -1;
+		}
+	}
+	return 0;
+}
+
+static int
+checksliceconst(Node *lo, Node *hi)
+{
+	if(lo != N && hi != N && lo->op == OLITERAL && hi->op == OLITERAL
+	   && mpcmpfixfix(lo->val.u.xval, hi->val.u.xval) > 0) {
+		yyerror("invalid slice index: %N > %N", lo, hi);
+		return -1;
+	}
+	return 0;
+}
+
 static void
 checkdefergo(Node *n)
 {
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 893c77e..c5a5874 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -1116,6 +1116,27 @@
 		n->right->right = safeexpr(n->right->right, init);
 		n = sliceany(n, init);  // chops n->right, sets n->list
 		goto ret;
+	
+	case OSLICE3:
+	case OSLICE3ARR:
+		if(n->right == N) // already processed
+			goto ret;
+
+		walkexpr(&n->left, init);
+		// TODO the OINDEX case is a bug elsewhere that needs to be traced.  it causes a crash on ([2][]int{ ... })[1][lo:hi]
+		// TODO the comment on the previous line was copied from case OSLICE. it might not even be true.
+		if(n->left->op == OINDEX)
+			n->left = copyexpr(n->left, n->left->type, init);
+		else
+			n->left = safeexpr(n->left, init);
+		walkexpr(&n->right->left, init);
+		n->right->left = safeexpr(n->right->left, init);
+		walkexpr(&n->right->right->left, init);
+		n->right->right->left = safeexpr(n->right->right->left, init);
+		walkexpr(&n->right->right->right, init);
+		n->right->right->right = safeexpr(n->right->right->right, init);
+		n = sliceany(n, init);  // chops n->right, sets n->list
+		goto ret;
 
 	case OADDR:
 		walkexpr(&n->left, init);
@@ -2575,21 +2596,28 @@
 }
 
 
-// Generate frontend part for OSLICE[ARR|STR]
+// Generate frontend part for OSLICE[3][ARR|STR]
 // 
 static	Node*
 sliceany(Node* n, NodeList **init)
 {
-	int bounded;
-	Node *src, *lb, *hb, *bound, *chk, *chk1, *chk2;
-	int64 lbv, hbv, bv, w;
+	int bounded, slice3;
+	Node *src, *lb, *hb, *cb, *bound, *chk, *chk0, *chk1, *chk2;
+	int64 lbv, hbv, cbv, bv, w;
 	Type *bt;
 
 //	print("before sliceany: %+N\n", n);
 
 	src = n->left;
 	lb = n->right->left;
-	hb = n->right->right;
+	slice3 = n->op == OSLICE3 || n->op == OSLICE3ARR;
+	if(slice3) {
+		hb = n->right->right->left;
+		cb = n->right->right->right;
+	} else {
+		hb = n->right->right;
+		cb = hb;
+	}
 
 	bounded = n->etype;
 	
@@ -2610,6 +2638,13 @@
 			bv = mpgetfix(bound->val.u.xval);
 	}
 
+	if(isconst(cb, CTINT)) {
+		cbv = mpgetfix(cb->val.u.xval);
+		if(cbv < 0 || cbv > bv) {
+			yyerror("slice index out of bounds");
+			cbv = -1;
+		}
+	}
 	if(isconst(hb, CTINT)) {
 		hbv = mpgetfix(hb->val.u.xval);
 		if(hbv < 0 || hbv > bv) {
@@ -2631,10 +2666,13 @@
 	// generate
 	//     if hb > bound || lb > hb { panicslice() }
 	chk = N;
+	chk0 = N;
 	chk1 = N;
 	chk2 = N;
 
 	bt = types[simtype[TUINT]];
+	if(cb != N && cb->type->width > 4)
+		bt = types[TUINT64];
 	if(hb != N && hb->type->width > 4)
 		bt = types[TUINT64];
 	if(lb != N && lb->type->width > 4)
@@ -2642,10 +2680,26 @@
 
 	bound = cheapexpr(conv(bound, bt), init);
 
+	if(cb != N) {
+		cb = cheapexpr(conv(cb, bt), init);
+		if(!bounded)
+			chk0 = nod(OLT, bound, cb);
+	} else if(slice3) {
+		// When we figure out what this means, implement it.
+		fatal("slice3 with cb == N"); // rejected by parser
+	}
+		
 	if(hb != N) {
 		hb = cheapexpr(conv(hb, bt), init);
-		if(!bounded)
-			chk1 = nod(OLT, bound, hb);  
+		if(!bounded) {
+			if(cb != N)
+				chk1 = nod(OLT, cb, hb);
+			else
+				chk1 = nod(OLT, bound, hb);
+		}
+	} else if(slice3) {
+		// When we figure out what this means, implement it.
+		fatal("slice3 with hb == N"); // rejected by parser
 	} else if(n->op == OSLICEARR) {
 		hb = bound;
 	} else {
@@ -2661,11 +2715,17 @@
 			chk2 = nod(OLT, hb, lb);  
 	}
 
-	if(chk1 != N || chk2 != N) {
+	if(chk0 != N || chk1 != N || chk2 != N) {
 		chk = nod(OIF, N, N);
 		chk->nbody = list1(mkcall("panicslice", T, init));
-		if(chk1 != N)
-			chk->ntest = chk1;
+		if(chk0 != N)
+			chk->ntest = chk0;
+		if(chk1 != N) {
+			if(chk->ntest == N)
+				chk->ntest = chk1;
+			else
+				chk->ntest = nod(OOROR, chk->ntest, chk1);
+		}
 		if(chk2 != N) {
 			if(chk->ntest == N)
 				chk->ntest = chk2;
@@ -2683,10 +2743,12 @@
 	// cap = bound [ - lo ]
 	n->right = N;
 	n->list = nil;
+	if(!slice3)
+		cb = bound;
 	if(lb == N)
-		bound = conv(bound, types[simtype[TUINT]]);
+		bound = conv(cb, types[simtype[TUINT]]);
 	else
-		bound = nod(OSUB, conv(bound, types[simtype[TUINT]]), conv(lb, types[simtype[TUINT]]));
+		bound = nod(OSUB, conv(cb, types[simtype[TUINT]]), conv(lb, types[simtype[TUINT]]));
 	typecheck(&bound, Erv);
 	walkexpr(&bound, init);
 	n->list = list(n->list, bound);
diff --git a/src/cmd/gc/y.tab.c b/src/cmd/gc/y.tab.c
index 21c67e8..ef1c2c6 100644
--- a/src/cmd/gc/y.tab.c
+++ b/src/cmd/gc/y.tab.c
@@ -440,16 +440,16 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  4
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   2194
+#define YYLAST   2198
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  76
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  142
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  349
+#define YYNRULES  350
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  663
+#define YYNSTATES  666
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -512,28 +512,29 @@
      326,   330,   334,   338,   342,   346,   350,   354,   358,   362,
      366,   370,   374,   378,   382,   384,   387,   390,   393,   396,
      399,   402,   405,   408,   412,   418,   425,   427,   429,   433,
-     439,   445,   450,   457,   459,   465,   471,   477,   485,   487,
-     488,   492,   494,   499,   501,   506,   508,   512,   514,   516,
-     518,   520,   522,   524,   526,   527,   529,   531,   533,   535,
-     540,   542,   544,   546,   549,   551,   553,   555,   557,   559,
-     563,   565,   567,   569,   572,   574,   576,   578,   580,   584,
-     586,   588,   590,   592,   594,   596,   598,   600,   602,   606,
-     611,   616,   619,   623,   629,   631,   633,   636,   640,   646,
-     650,   656,   660,   664,   670,   679,   685,   694,   700,   701,
-     705,   706,   708,   712,   714,   719,   722,   723,   727,   729,
-     733,   735,   739,   741,   745,   747,   751,   753,   757,   761,
-     764,   769,   773,   779,   785,   787,   791,   793,   796,   798,
-     802,   807,   809,   812,   815,   817,   819,   823,   824,   827,
-     828,   830,   832,   834,   836,   838,   840,   842,   844,   846,
-     847,   852,   854,   857,   860,   863,   866,   869,   872,   874,
-     878,   880,   884,   886,   890,   892,   896,   898,   902,   904,
-     906,   910,   914,   915,   918,   919,   921,   922,   924,   925,
-     927,   928,   930,   931,   933,   934,   936,   937,   939,   940,
-     942,   943,   945,   950,   955,   961,   968,   973,   978,   980,
-     982,   984,   986,   988,   990,   992,   994,   996,  1000,  1005,
-    1011,  1016,  1021,  1024,  1027,  1032,  1036,  1040,  1046,  1050,
-    1055,  1059,  1065,  1067,  1068,  1070,  1074,  1076,  1078,  1081,
-    1083,  1085,  1091,  1092,  1095,  1097,  1101,  1103,  1107,  1109
+     439,   445,   450,   457,   466,   468,   474,   480,   486,   494,
+     496,   497,   501,   503,   508,   510,   515,   517,   521,   523,
+     525,   527,   529,   531,   533,   535,   536,   538,   540,   542,
+     544,   549,   551,   553,   555,   558,   560,   562,   564,   566,
+     568,   572,   574,   576,   578,   581,   583,   585,   587,   589,
+     593,   595,   597,   599,   601,   603,   605,   607,   609,   611,
+     615,   620,   625,   628,   632,   638,   640,   642,   645,   649,
+     655,   659,   665,   669,   673,   679,   688,   694,   703,   709,
+     710,   714,   715,   717,   721,   723,   728,   731,   732,   736,
+     738,   742,   744,   748,   750,   754,   756,   760,   762,   766,
+     770,   773,   778,   782,   788,   794,   796,   800,   802,   805,
+     807,   811,   816,   818,   821,   824,   826,   828,   832,   833,
+     836,   837,   839,   841,   843,   845,   847,   849,   851,   853,
+     855,   856,   861,   863,   866,   869,   872,   875,   878,   881,
+     883,   887,   889,   893,   895,   899,   901,   905,   907,   911,
+     913,   915,   919,   923,   924,   927,   928,   930,   931,   933,
+     934,   936,   937,   939,   940,   942,   943,   945,   946,   948,
+     949,   951,   952,   954,   959,   964,   970,   977,   982,   987,
+     989,   991,   993,   995,   997,   999,  1001,  1003,  1005,  1009,
+    1014,  1020,  1025,  1030,  1033,  1036,  1041,  1045,  1049,  1055,
+    1059,  1064,  1068,  1074,  1076,  1077,  1079,  1083,  1085,  1087,
+    1090,  1092,  1094,  1100,  1101,  1104,  1106,  1110,  1112,  1116,
+    1118
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -584,73 +585,74 @@
      187,    11,   191,    60,    -1,     3,    -1,   143,    -1,   134,
       63,   141,    -1,   134,    63,    59,   135,    60,    -1,   134,
       63,    59,    31,    60,    -1,   134,    71,   126,    72,    -1,
-     134,    71,   192,    66,   192,    72,    -1,   128,    -1,   149,
-      59,   126,   191,    60,    -1,   150,   137,   130,   189,    68,
-      -1,   129,    67,   130,   189,    68,    -1,    59,   135,    60,
-      67,   130,   189,    68,    -1,   165,    -1,    -1,   126,    66,
-     133,    -1,   126,    -1,    67,   130,   189,    68,    -1,   126,
-      -1,    67,   130,   189,    68,    -1,   129,    -1,    59,   135,
-      60,    -1,   126,    -1,   147,    -1,   146,    -1,    35,    -1,
-      67,    -1,   141,    -1,   141,    -1,    -1,   138,    -1,    24,
-      -1,   142,    -1,    73,    -1,    74,     3,    63,    24,    -1,
-     141,    -1,   138,    -1,    11,    -1,    11,   146,    -1,   155,
+     134,    71,   192,    66,   192,    72,    -1,   134,    71,   192,
+      66,   192,    66,   192,    72,    -1,   128,    -1,   149,    59,
+     126,   191,    60,    -1,   150,   137,   130,   189,    68,    -1,
+     129,    67,   130,   189,    68,    -1,    59,   135,    60,    67,
+     130,   189,    68,    -1,   165,    -1,    -1,   126,    66,   133,
+      -1,   126,    -1,    67,   130,   189,    68,    -1,   126,    -1,
+      67,   130,   189,    68,    -1,   129,    -1,    59,   135,    60,
+      -1,   126,    -1,   147,    -1,   146,    -1,    35,    -1,    67,
+      -1,   141,    -1,   141,    -1,    -1,   138,    -1,    24,    -1,
+     142,    -1,    73,    -1,    74,     3,    63,    24,    -1,   141,
+      -1,   138,    -1,    11,    -1,    11,   146,    -1,   155,    -1,
+     161,    -1,   153,    -1,   154,    -1,   152,    -1,    59,   146,
+      60,    -1,   155,    -1,   161,    -1,   153,    -1,    53,   147,
       -1,   161,    -1,   153,    -1,   154,    -1,   152,    -1,    59,
-     146,    60,    -1,   155,    -1,   161,    -1,   153,    -1,    53,
-     147,    -1,   161,    -1,   153,    -1,   154,    -1,   152,    -1,
-      59,   146,    60,    -1,   161,    -1,   153,    -1,   153,    -1,
-     155,    -1,   161,    -1,   153,    -1,   154,    -1,   152,    -1,
-     143,    -1,   143,    63,   141,    -1,    71,   192,    72,   146,
-      -1,    71,    11,    72,   146,    -1,     8,   148,    -1,     8,
-      36,   146,    -1,    23,    71,   146,    72,   146,    -1,   156,
-      -1,   157,    -1,    53,   146,    -1,    36,     8,   146,    -1,
-      29,   137,   170,   190,    68,    -1,    29,   137,    68,    -1,
-      22,   137,   171,   190,    68,    -1,    22,   137,    68,    -1,
-      17,   159,   162,    -1,   141,    59,   179,    60,   163,    -1,
-      59,   179,    60,   141,    59,   179,    60,   163,    -1,   200,
-      59,   195,    60,   210,    -1,    59,   215,    60,   141,    59,
-     195,    60,   210,    -1,    17,    59,   179,    60,   163,    -1,
-      -1,    67,   183,    68,    -1,    -1,   151,    -1,    59,   179,
-      60,    -1,   161,    -1,   164,   137,   183,    68,    -1,   164,
-       1,    -1,    -1,   166,    90,    62,    -1,    93,    -1,   167,
-      62,    93,    -1,    95,    -1,   168,    62,    95,    -1,    97,
-      -1,   169,    62,    97,    -1,   172,    -1,   170,    62,   172,
-      -1,   175,    -1,   171,    62,   175,    -1,   184,   146,   198,
-      -1,   174,   198,    -1,    59,   174,    60,   198,    -1,    53,
-     174,   198,    -1,    59,    53,   174,    60,   198,    -1,    53,
-      59,   174,    60,   198,    -1,    24,    -1,    24,    63,   141,
-      -1,   173,    -1,   138,   176,    -1,   173,    -1,    59,   173,
-      60,    -1,    59,   179,    60,   163,    -1,   136,    -1,   141,
-     136,    -1,   141,   145,    -1,   145,    -1,   177,    -1,   178,
-      75,   177,    -1,    -1,   178,   191,    -1,    -1,   100,    -1,
-      91,    -1,   181,    -1,     1,    -1,    98,    -1,   110,    -1,
-     121,    -1,   124,    -1,   113,    -1,    -1,   144,    66,   182,
-     180,    -1,    15,    -1,     6,   140,    -1,    10,   140,    -1,
-      18,   128,    -1,    13,   128,    -1,    19,   138,    -1,    27,
-     193,    -1,   180,    -1,   183,    62,   180,    -1,   138,    -1,
-     184,    75,   138,    -1,   139,    -1,   185,    75,   139,    -1,
-     126,    -1,   186,    75,   126,    -1,   135,    -1,   187,    75,
-     135,    -1,   131,    -1,   132,    -1,   188,    75,   131,    -1,
-     188,    75,   132,    -1,    -1,   188,   191,    -1,    -1,    62,
-      -1,    -1,    75,    -1,    -1,   126,    -1,    -1,   186,    -1,
-      -1,    98,    -1,    -1,   215,    -1,    -1,   216,    -1,    -1,
-     217,    -1,    -1,     3,    -1,    21,    24,     3,    62,    -1,
-      32,   200,   202,    62,    -1,     9,   200,    65,   213,    62,
-      -1,     9,   200,   202,    65,   213,    62,    -1,    31,   201,
-     202,    62,    -1,    17,   160,   162,    62,    -1,   142,    -1,
-     200,    -1,   204,    -1,   205,    -1,   206,    -1,   204,    -1,
-     206,    -1,   142,    -1,    24,    -1,    71,    72,   202,    -1,
-      71,     3,    72,   202,    -1,    23,    71,   202,    72,   202,
-      -1,    29,    67,   196,    68,    -1,    22,    67,   197,    68,
-      -1,    53,   202,    -1,     8,   203,    -1,     8,    59,   205,
-      60,    -1,     8,    36,   202,    -1,    36,     8,   202,    -1,
-      17,    59,   195,    60,   210,    -1,   141,   202,   198,    -1,
-     141,    11,   202,   198,    -1,   141,   202,   198,    -1,   141,
-      59,   195,    60,   210,    -1,   202,    -1,    -1,   211,    -1,
-      59,   195,    60,    -1,   202,    -1,     3,    -1,    50,     3,
-      -1,   141,    -1,   212,    -1,    59,   212,    49,   212,    60,
-      -1,    -1,   214,   199,    -1,   207,    -1,   215,    75,   207,
-      -1,   208,    -1,   216,    62,   208,    -1,   209,    -1,   217,
-      62,   209,    -1
+     146,    60,    -1,   161,    -1,   153,    -1,   153,    -1,   155,
+      -1,   161,    -1,   153,    -1,   154,    -1,   152,    -1,   143,
+      -1,   143,    63,   141,    -1,    71,   192,    72,   146,    -1,
+      71,    11,    72,   146,    -1,     8,   148,    -1,     8,    36,
+     146,    -1,    23,    71,   146,    72,   146,    -1,   156,    -1,
+     157,    -1,    53,   146,    -1,    36,     8,   146,    -1,    29,
+     137,   170,   190,    68,    -1,    29,   137,    68,    -1,    22,
+     137,   171,   190,    68,    -1,    22,   137,    68,    -1,    17,
+     159,   162,    -1,   141,    59,   179,    60,   163,    -1,    59,
+     179,    60,   141,    59,   179,    60,   163,    -1,   200,    59,
+     195,    60,   210,    -1,    59,   215,    60,   141,    59,   195,
+      60,   210,    -1,    17,    59,   179,    60,   163,    -1,    -1,
+      67,   183,    68,    -1,    -1,   151,    -1,    59,   179,    60,
+      -1,   161,    -1,   164,   137,   183,    68,    -1,   164,     1,
+      -1,    -1,   166,    90,    62,    -1,    93,    -1,   167,    62,
+      93,    -1,    95,    -1,   168,    62,    95,    -1,    97,    -1,
+     169,    62,    97,    -1,   172,    -1,   170,    62,   172,    -1,
+     175,    -1,   171,    62,   175,    -1,   184,   146,   198,    -1,
+     174,   198,    -1,    59,   174,    60,   198,    -1,    53,   174,
+     198,    -1,    59,    53,   174,    60,   198,    -1,    53,    59,
+     174,    60,   198,    -1,    24,    -1,    24,    63,   141,    -1,
+     173,    -1,   138,   176,    -1,   173,    -1,    59,   173,    60,
+      -1,    59,   179,    60,   163,    -1,   136,    -1,   141,   136,
+      -1,   141,   145,    -1,   145,    -1,   177,    -1,   178,    75,
+     177,    -1,    -1,   178,   191,    -1,    -1,   100,    -1,    91,
+      -1,   181,    -1,     1,    -1,    98,    -1,   110,    -1,   121,
+      -1,   124,    -1,   113,    -1,    -1,   144,    66,   182,   180,
+      -1,    15,    -1,     6,   140,    -1,    10,   140,    -1,    18,
+     128,    -1,    13,   128,    -1,    19,   138,    -1,    27,   193,
+      -1,   180,    -1,   183,    62,   180,    -1,   138,    -1,   184,
+      75,   138,    -1,   139,    -1,   185,    75,   139,    -1,   126,
+      -1,   186,    75,   126,    -1,   135,    -1,   187,    75,   135,
+      -1,   131,    -1,   132,    -1,   188,    75,   131,    -1,   188,
+      75,   132,    -1,    -1,   188,   191,    -1,    -1,    62,    -1,
+      -1,    75,    -1,    -1,   126,    -1,    -1,   186,    -1,    -1,
+      98,    -1,    -1,   215,    -1,    -1,   216,    -1,    -1,   217,
+      -1,    -1,     3,    -1,    21,    24,     3,    62,    -1,    32,
+     200,   202,    62,    -1,     9,   200,    65,   213,    62,    -1,
+       9,   200,   202,    65,   213,    62,    -1,    31,   201,   202,
+      62,    -1,    17,   160,   162,    62,    -1,   142,    -1,   200,
+      -1,   204,    -1,   205,    -1,   206,    -1,   204,    -1,   206,
+      -1,   142,    -1,    24,    -1,    71,    72,   202,    -1,    71,
+       3,    72,   202,    -1,    23,    71,   202,    72,   202,    -1,
+      29,    67,   196,    68,    -1,    22,    67,   197,    68,    -1,
+      53,   202,    -1,     8,   203,    -1,     8,    59,   205,    60,
+      -1,     8,    36,   202,    -1,    36,     8,   202,    -1,    17,
+      59,   195,    60,   210,    -1,   141,   202,   198,    -1,   141,
+      11,   202,   198,    -1,   141,   202,   198,    -1,   141,    59,
+     195,    60,   210,    -1,   202,    -1,    -1,   211,    -1,    59,
+     195,    60,    -1,   202,    -1,     3,    -1,    50,     3,    -1,
+     141,    -1,   212,    -1,    59,   212,    49,   212,    60,    -1,
+      -1,   214,   199,    -1,   207,    -1,   215,    75,   207,    -1,
+     208,    -1,   216,    62,   208,    -1,   209,    -1,   217,    62,
+     209,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
@@ -669,28 +671,29 @@
      798,   802,   806,   810,   814,   818,   822,   826,   830,   834,
      838,   842,   846,   851,   857,   858,   862,   873,   877,   881,
      885,   890,   894,   904,   908,   913,   921,   925,   926,   937,
-     941,   945,   949,   953,   954,   960,   967,   973,   980,   983,
-     990,   996,  1013,  1020,  1021,  1028,  1029,  1048,  1049,  1052,
-    1055,  1059,  1070,  1079,  1085,  1088,  1091,  1098,  1099,  1105,
-    1120,  1128,  1140,  1145,  1151,  1152,  1153,  1154,  1155,  1156,
-    1162,  1163,  1164,  1165,  1171,  1172,  1173,  1174,  1175,  1181,
-    1182,  1185,  1188,  1189,  1190,  1191,  1192,  1195,  1196,  1209,
-    1213,  1218,  1223,  1228,  1232,  1233,  1236,  1242,  1249,  1255,
-    1262,  1268,  1279,  1293,  1322,  1362,  1387,  1405,  1414,  1417,
-    1425,  1429,  1433,  1440,  1446,  1451,  1463,  1466,  1476,  1477,
-    1483,  1484,  1490,  1494,  1500,  1501,  1507,  1511,  1517,  1540,
-    1545,  1551,  1557,  1564,  1573,  1582,  1597,  1603,  1608,  1612,
-    1619,  1632,  1633,  1639,  1645,  1648,  1652,  1658,  1661,  1670,
-    1673,  1674,  1678,  1679,  1685,  1686,  1687,  1688,  1689,  1691,
-    1690,  1705,  1710,  1714,  1718,  1722,  1726,  1731,  1750,  1756,
-    1764,  1768,  1774,  1778,  1784,  1788,  1794,  1798,  1807,  1811,
-    1815,  1819,  1825,  1828,  1836,  1837,  1839,  1840,  1843,  1846,
-    1849,  1852,  1855,  1858,  1861,  1864,  1867,  1870,  1873,  1876,
-    1879,  1882,  1888,  1892,  1896,  1900,  1904,  1908,  1928,  1935,
-    1946,  1947,  1948,  1951,  1952,  1955,  1959,  1969,  1973,  1977,
-    1981,  1985,  1989,  1993,  1999,  2005,  2013,  2021,  2027,  2034,
-    2050,  2068,  2072,  2078,  2081,  2084,  2088,  2098,  2102,  2117,
-    2125,  2126,  2138,  2139,  2142,  2146,  2152,  2156,  2162,  2166
+     941,   945,   949,   953,   961,   962,   968,   975,   981,   988,
+     991,   998,  1004,  1021,  1028,  1029,  1036,  1037,  1056,  1057,
+    1060,  1063,  1067,  1078,  1087,  1093,  1096,  1099,  1106,  1107,
+    1113,  1128,  1136,  1148,  1153,  1159,  1160,  1161,  1162,  1163,
+    1164,  1170,  1171,  1172,  1173,  1179,  1180,  1181,  1182,  1183,
+    1189,  1190,  1193,  1196,  1197,  1198,  1199,  1200,  1203,  1204,
+    1217,  1221,  1226,  1231,  1236,  1240,  1241,  1244,  1250,  1257,
+    1263,  1270,  1276,  1287,  1301,  1330,  1370,  1395,  1413,  1422,
+    1425,  1433,  1437,  1441,  1448,  1454,  1459,  1471,  1474,  1484,
+    1485,  1491,  1492,  1498,  1502,  1508,  1509,  1515,  1519,  1525,
+    1548,  1553,  1559,  1565,  1572,  1581,  1590,  1605,  1611,  1616,
+    1620,  1627,  1640,  1641,  1647,  1653,  1656,  1660,  1666,  1669,
+    1678,  1681,  1682,  1686,  1687,  1693,  1694,  1695,  1696,  1697,
+    1699,  1698,  1713,  1718,  1722,  1726,  1730,  1734,  1739,  1758,
+    1764,  1772,  1776,  1782,  1786,  1792,  1796,  1802,  1806,  1815,
+    1819,  1823,  1827,  1833,  1836,  1844,  1845,  1847,  1848,  1851,
+    1854,  1857,  1860,  1863,  1866,  1869,  1872,  1875,  1878,  1881,
+    1884,  1887,  1890,  1896,  1900,  1904,  1908,  1912,  1916,  1936,
+    1943,  1954,  1955,  1956,  1959,  1960,  1963,  1967,  1977,  1981,
+    1985,  1989,  1993,  1997,  2001,  2007,  2013,  2021,  2029,  2035,
+    2042,  2058,  2076,  2080,  2086,  2089,  2092,  2096,  2106,  2110,
+    2125,  2133,  2134,  2146,  2147,  2150,  2154,  2160,  2164,  2170,
+    2174
 };
 #endif
 
@@ -775,28 +778,29 @@
      126,   126,   126,   126,   126,   126,   126,   126,   126,   126,
      126,   126,   126,   126,   127,   127,   127,   127,   127,   127,
      127,   127,   127,   128,   128,   128,   129,   129,   129,   129,
-     129,   129,   129,   129,   129,   129,   129,   129,   129,   130,
-     131,   132,   132,   133,   133,   134,   134,   135,   135,   136,
-     137,   137,   138,   139,   140,   140,   141,   141,   141,   142,
-     143,   144,   145,   145,   146,   146,   146,   146,   146,   146,
-     147,   147,   147,   147,   148,   148,   148,   148,   148,   149,
-     149,   150,   151,   151,   151,   151,   151,   152,   152,   153,
-     153,   153,   153,   153,   153,   153,   154,   155,   156,   156,
-     157,   157,   158,   159,   159,   160,   160,   161,   162,   162,
-     163,   163,   163,   164,   165,   165,   166,   166,   167,   167,
-     168,   168,   169,   169,   170,   170,   171,   171,   172,   172,
-     172,   172,   172,   172,   173,   173,   174,   175,   175,   175,
-     176,   177,   177,   177,   177,   178,   178,   179,   179,   180,
-     180,   180,   180,   180,   181,   181,   181,   181,   181,   182,
-     181,   181,   181,   181,   181,   181,   181,   181,   183,   183,
-     184,   184,   185,   185,   186,   186,   187,   187,   188,   188,
-     188,   188,   189,   189,   190,   190,   191,   191,   192,   192,
-     193,   193,   194,   194,   195,   195,   196,   196,   197,   197,
-     198,   198,   199,   199,   199,   199,   199,   199,   200,   201,
-     202,   202,   202,   203,   203,   204,   204,   204,   204,   204,
-     204,   204,   204,   204,   204,   204,   205,   206,   207,   207,
-     208,   209,   209,   210,   210,   211,   211,   212,   212,   212,
-     213,   213,   214,   214,   215,   215,   216,   216,   217,   217
+     129,   129,   129,   129,   129,   129,   129,   129,   129,   129,
+     130,   131,   132,   132,   133,   133,   134,   134,   135,   135,
+     136,   137,   137,   138,   139,   140,   140,   141,   141,   141,
+     142,   143,   144,   145,   145,   146,   146,   146,   146,   146,
+     146,   147,   147,   147,   147,   148,   148,   148,   148,   148,
+     149,   149,   150,   151,   151,   151,   151,   151,   152,   152,
+     153,   153,   153,   153,   153,   153,   153,   154,   155,   156,
+     156,   157,   157,   158,   159,   159,   160,   160,   161,   162,
+     162,   163,   163,   163,   164,   165,   165,   166,   166,   167,
+     167,   168,   168,   169,   169,   170,   170,   171,   171,   172,
+     172,   172,   172,   172,   172,   173,   173,   174,   175,   175,
+     175,   176,   177,   177,   177,   177,   178,   178,   179,   179,
+     180,   180,   180,   180,   180,   181,   181,   181,   181,   181,
+     182,   181,   181,   181,   181,   181,   181,   181,   181,   183,
+     183,   184,   184,   185,   185,   186,   186,   187,   187,   188,
+     188,   188,   188,   189,   189,   190,   190,   191,   191,   192,
+     192,   193,   193,   194,   194,   195,   195,   196,   196,   197,
+     197,   198,   198,   199,   199,   199,   199,   199,   199,   200,
+     201,   202,   202,   202,   203,   203,   204,   204,   204,   204,
+     204,   204,   204,   204,   204,   204,   204,   205,   206,   207,
+     207,   208,   209,   209,   210,   210,   211,   211,   212,   212,
+     212,   213,   213,   214,   214,   215,   215,   216,   216,   217,
+     217
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -815,28 +819,29 @@
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
        3,     3,     3,     3,     1,     2,     2,     2,     2,     2,
        2,     2,     2,     3,     5,     6,     1,     1,     3,     5,
-       5,     4,     6,     1,     5,     5,     5,     7,     1,     0,
-       3,     1,     4,     1,     4,     1,     3,     1,     1,     1,
-       1,     1,     1,     1,     0,     1,     1,     1,     1,     4,
-       1,     1,     1,     2,     1,     1,     1,     1,     1,     3,
-       1,     1,     1,     2,     1,     1,     1,     1,     3,     1,
+       5,     4,     6,     8,     1,     5,     5,     5,     7,     1,
+       0,     3,     1,     4,     1,     4,     1,     3,     1,     1,
+       1,     1,     1,     1,     1,     0,     1,     1,     1,     1,
+       4,     1,     1,     1,     2,     1,     1,     1,     1,     1,
+       3,     1,     1,     1,     2,     1,     1,     1,     1,     3,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     3,
+       4,     4,     2,     3,     5,     1,     1,     2,     3,     5,
+       3,     5,     3,     3,     5,     8,     5,     8,     5,     0,
+       3,     0,     1,     3,     1,     4,     2,     0,     3,     1,
+       3,     1,     3,     1,     3,     1,     3,     1,     3,     3,
+       2,     4,     3,     5,     5,     1,     3,     1,     2,     1,
+       3,     4,     1,     2,     2,     1,     1,     3,     0,     2,
+       0,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       0,     4,     1,     2,     2,     2,     2,     2,     2,     1,
+       3,     1,     3,     1,     3,     1,     3,     1,     3,     1,
+       1,     3,     3,     0,     2,     0,     1,     0,     1,     0,
+       1,     0,     1,     0,     1,     0,     1,     0,     1,     0,
+       1,     0,     1,     4,     4,     5,     6,     4,     4,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     3,     4,
-       4,     2,     3,     5,     1,     1,     2,     3,     5,     3,
-       5,     3,     3,     5,     8,     5,     8,     5,     0,     3,
-       0,     1,     3,     1,     4,     2,     0,     3,     1,     3,
-       1,     3,     1,     3,     1,     3,     1,     3,     3,     2,
-       4,     3,     5,     5,     1,     3,     1,     2,     1,     3,
-       4,     1,     2,     2,     1,     1,     3,     0,     2,     0,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     0,
-       4,     1,     2,     2,     2,     2,     2,     2,     1,     3,
-       1,     3,     1,     3,     1,     3,     1,     3,     1,     1,
-       3,     3,     0,     2,     0,     1,     0,     1,     0,     1,
-       0,     1,     0,     1,     0,     1,     0,     1,     0,     1,
-       0,     1,     4,     4,     5,     6,     4,     4,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     3,     4,     5,
-       4,     4,     2,     2,     4,     3,     3,     5,     3,     4,
-       3,     5,     1,     0,     1,     3,     1,     1,     2,     1,
-       1,     5,     0,     2,     1,     3,     1,     3,     1,     3
+       5,     4,     4,     2,     2,     4,     3,     3,     5,     3,
+       4,     3,     5,     1,     0,     1,     3,     1,     1,     2,
+       1,     1,     5,     0,     2,     1,     3,     1,     3,     1,
+       3
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -844,73 +849,73 @@
    means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       5,     0,     3,     0,     1,     0,     7,     0,    22,   156,
-     158,     0,     0,   157,   216,    20,     6,   342,     0,     4,
+       5,     0,     3,     0,     1,     0,     7,     0,    22,   157,
+     159,     0,     0,   158,   217,    20,     6,   343,     0,     4,
        0,     0,     0,    21,     0,     0,     0,    16,     0,     0,
-       9,    22,     0,     8,    28,   126,   154,     0,    39,   154,
-       0,   261,    74,     0,     0,     0,    78,     0,     0,   290,
+       9,    22,     0,     8,    28,   126,   155,     0,    39,   155,
+       0,   262,    74,     0,     0,     0,    78,     0,     0,   291,
       91,     0,    88,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   288,     0,    25,     0,   254,   255,
-     258,   256,   257,    50,    93,   133,   145,   114,   161,   160,
-     127,     0,     0,     0,   181,   194,   195,    26,   213,     0,
-     138,    27,     0,    19,     0,     0,     0,     0,     0,     0,
-     343,   159,    11,    14,   284,    18,    22,    13,    17,   155,
-     262,   152,     0,     0,     0,     0,   160,   187,   191,   177,
-     175,   176,   174,   263,   133,     0,   292,   247,     0,   208,
-     133,   266,   292,   150,   151,     0,     0,   274,   291,   267,
-       0,     0,   292,     0,     0,    36,    48,     0,    29,   272,
-     153,     0,   122,   117,   118,   121,   115,   116,     0,     0,
-     147,     0,   148,   172,   170,   171,   119,   120,     0,   289,
-       0,   217,     0,    32,     0,     0,     0,     0,     0,    55,
+       0,     0,     0,     0,   289,     0,    25,     0,   255,   256,
+     259,   257,   258,    50,    93,   134,   146,   114,   162,   161,
+     127,     0,     0,     0,   182,   195,   196,    26,   214,     0,
+     139,    27,     0,    19,     0,     0,     0,     0,     0,     0,
+     344,   160,    11,    14,   285,    18,    22,    13,    17,   156,
+     263,   153,     0,     0,     0,     0,   161,   188,   192,   178,
+     176,   177,   175,   264,   134,     0,   293,   248,     0,   209,
+     134,   267,   293,   151,   152,     0,     0,   275,   292,   268,
+       0,     0,   293,     0,     0,    36,    48,     0,    29,   273,
+     154,     0,   122,   117,   118,   121,   115,   116,     0,     0,
+     148,     0,   149,   173,   171,   172,   119,   120,     0,   290,
+       0,   218,     0,    32,     0,     0,     0,     0,     0,    55,
        0,     0,     0,    54,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   139,     0,
-       0,   288,   259,     0,   139,   215,     0,     0,     0,     0,
-     308,     0,     0,   208,     0,     0,   309,     0,     0,    23,
-     285,     0,    12,   247,     0,     0,   192,   168,   166,   167,
-     164,   165,   196,     0,     0,   293,    72,     0,    75,     0,
-      71,   162,   241,   160,   244,   149,   245,   286,     0,   247,
-       0,   202,    79,    76,   156,     0,   201,     0,   284,   238,
-     226,     0,    64,     0,     0,   199,   270,   284,   224,   236,
-     300,     0,    89,    38,   222,   284,    49,    31,   218,   284,
-       0,     0,    40,     0,   173,   146,     0,     0,    35,   284,
+       0,     0,     0,     0,     0,     0,     0,     0,   140,     0,
+       0,   289,   260,     0,   140,   216,     0,     0,     0,     0,
+     309,     0,     0,   209,     0,     0,   310,     0,     0,    23,
+     286,     0,    12,   248,     0,     0,   193,   169,   167,   168,
+     165,   166,   197,     0,     0,   294,    72,     0,    75,     0,
+      71,   163,   242,   161,   245,   150,   246,   287,     0,   248,
+       0,   203,    79,    76,   157,     0,   202,     0,   285,   239,
+     227,     0,    64,     0,     0,   200,   271,   285,   225,   237,
+     301,     0,    89,    38,   223,   285,    49,    31,   219,   285,
+       0,     0,    40,     0,   174,   147,     0,     0,    35,   285,
        0,     0,    51,    95,   110,   113,    96,   100,   101,    99,
      111,    98,    97,    94,   112,   102,   103,   104,   105,   106,
-     107,   108,   109,   282,   123,   276,   286,     0,   128,   289,
-       0,     0,   286,   282,   253,    60,   251,   250,   268,   252,
-       0,    53,    52,   275,     0,     0,     0,     0,   316,     0,
-       0,     0,     0,     0,   315,     0,   310,   311,   312,     0,
-     344,     0,     0,   294,     0,     0,     0,    15,    10,     0,
-       0,     0,   178,   188,    66,    73,     0,     0,   292,   163,
-     242,   243,   287,   248,   210,     0,     0,     0,   292,     0,
-     234,     0,   247,   237,   285,     0,     0,     0,     0,   300,
-       0,     0,   285,     0,   301,   229,     0,   300,     0,   285,
-       0,   285,     0,    42,   273,     0,     0,     0,   197,   168,
-     166,   167,   165,   139,   190,   189,   285,     0,    44,     0,
-     139,   141,   278,   279,   286,     0,   286,   287,     0,     0,
-       0,   131,   288,   260,   287,     0,     0,     0,     0,   214,
-       0,     0,   323,   313,   314,   294,   298,     0,   296,     0,
-     322,   337,     0,     0,   339,   340,     0,     0,     0,     0,
-       0,   300,     0,     0,   307,     0,   295,   302,   306,   303,
-     210,   169,     0,     0,     0,     0,   246,   247,   160,   211,
-     186,   184,   185,   182,   183,   207,   210,   209,    80,    77,
-     235,   239,     0,   227,   200,   193,     0,     0,    92,    62,
-      65,     0,   231,     0,   300,   225,   198,   271,   228,    64,
-     223,    37,   219,    30,    41,     0,   282,    45,   220,   284,
-      47,    33,    43,   282,     0,   287,   283,   136,     0,   277,
-     124,   130,   129,     0,   134,   135,     0,   269,   325,     0,
-       0,   316,     0,   315,     0,   332,   348,   299,     0,     0,
-       0,   346,   297,   326,   338,     0,   304,     0,   317,     0,
-     300,   328,     0,   345,   333,     0,    69,    68,   292,     0,
-     247,   203,    84,   210,     0,    59,     0,   300,   300,   230,
-       0,   169,     0,   285,     0,    46,     0,   139,   143,   140,
-     280,   281,   125,   132,    61,   324,   333,   294,   321,     0,
-       0,   300,   320,     0,     0,   318,   305,   329,   294,   294,
-     336,   205,   334,    67,    70,   212,     0,    86,   240,     0,
-       0,    56,     0,    63,   233,   232,    90,   137,   221,    34,
-     142,   282,   327,     0,   349,   319,   330,   347,     0,     0,
-       0,   210,     0,    85,    81,     0,     0,     0,   333,   341,
-     333,   335,   204,    82,    87,    58,    57,   144,   331,   206,
-     292,     0,    83
+     107,   108,   109,   283,   123,   277,   287,     0,   128,   290,
+       0,     0,   287,   283,   254,    60,   252,   251,   269,   253,
+       0,    53,    52,   276,     0,     0,     0,     0,   317,     0,
+       0,     0,     0,     0,   316,     0,   311,   312,   313,     0,
+     345,     0,     0,   295,     0,     0,     0,    15,    10,     0,
+       0,     0,   179,   189,    66,    73,     0,     0,   293,   164,
+     243,   244,   288,   249,   211,     0,     0,     0,   293,     0,
+     235,     0,   248,   238,   286,     0,     0,     0,     0,   301,
+       0,     0,   286,     0,   302,   230,     0,   301,     0,   286,
+       0,   286,     0,    42,   274,     0,     0,     0,   198,   169,
+     167,   168,   166,   140,   191,   190,   286,     0,    44,     0,
+     140,   142,   279,   280,   287,     0,   287,   288,     0,     0,
+       0,   131,   289,   261,   288,     0,     0,     0,     0,   215,
+       0,     0,   324,   314,   315,   295,   299,     0,   297,     0,
+     323,   338,     0,     0,   340,   341,     0,     0,     0,     0,
+       0,   301,     0,     0,   308,     0,   296,   303,   307,   304,
+     211,   170,     0,     0,     0,     0,   247,   248,   161,   212,
+     187,   185,   186,   183,   184,   208,   211,   210,    80,    77,
+     236,   240,     0,   228,   201,   194,     0,     0,    92,    62,
+      65,     0,   232,     0,   301,   226,   199,   272,   229,    64,
+     224,    37,   220,    30,    41,     0,   283,    45,   221,   285,
+      47,    33,    43,   283,     0,   288,   284,   137,     0,   278,
+     124,   130,   129,     0,   135,   136,     0,   270,   326,     0,
+       0,   317,     0,   316,     0,   333,   349,   300,     0,     0,
+       0,   347,   298,   327,   339,     0,   305,     0,   318,     0,
+     301,   329,     0,   346,   334,     0,    69,    68,   293,     0,
+     248,   204,    84,   211,     0,    59,     0,   301,   301,   231,
+       0,   170,     0,   286,     0,    46,     0,   140,   144,   141,
+     281,   282,   125,   289,   132,    61,   325,   334,   295,   322,
+       0,     0,   301,   321,     0,     0,   319,   306,   330,   295,
+     295,   337,   206,   335,    67,    70,   213,     0,    86,   241,
+       0,     0,    56,     0,    63,   234,   233,    90,   138,   222,
+      34,   143,   283,     0,   328,     0,   350,   320,   331,   348,
+       0,     0,     0,   211,     0,    85,    81,     0,     0,     0,
+     133,   334,   342,   334,   336,   205,    82,    87,    58,    57,
+     145,   332,   207,   293,     0,    83
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
@@ -920,7 +925,7 @@
        8,    24,    16,    17,    65,   326,    67,   148,   517,   518,
      144,   145,    68,   499,   327,   437,   500,   576,   387,   365,
      472,   236,   237,   238,    69,   126,   252,    70,   132,   377,
-     572,   643,   660,   617,   644,    71,   142,   398,    72,   140,
+     572,   645,   663,   618,   646,    71,   142,   398,    72,   140,
       73,    74,    75,    76,   313,   422,   423,   589,    77,   315,
      242,   135,    78,   149,   110,   116,    13,    80,    81,   244,
      245,   162,   118,    82,    83,   479,   227,    84,   229,   230,
@@ -928,556 +933,556 @@
       22,   279,   519,   275,   267,   258,   268,   269,   270,   260,
      383,   246,   247,   248,   328,   329,   321,   330,   271,   151,
       92,   316,   424,   425,   221,   373,   170,   139,   253,   465,
-     550,   544,   395,   100,   211,   217,   610,   442,   346,   347,
-     348,   350,   551,   546,   611,   612,   455,   456,    25,   466,
+     550,   544,   395,   100,   211,   217,   611,   442,   346,   347,
+     348,   350,   551,   546,   612,   613,   455,   456,    25,   466,
      552,   547
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -485
+#define YYPACT_NINF -552
 static const yytype_int16 yypact[] =
 {
-    -485,    67,    35,    55,  -485,    44,  -485,    64,  -485,  -485,
-    -485,    96,    38,  -485,    77,    85,  -485,  -485,    66,  -485,
-      34,    84,  1059,  -485,    86,   294,   147,  -485,   165,   210,
-    -485,    55,   221,  -485,  -485,  -485,    44,  1762,  -485,    44,
-     290,  -485,  -485,   442,   290,    44,  -485,    80,    69,  1608,
-    -485,    80,  -485,   450,   452,  1608,  1608,  1608,  1608,  1608,
-    1608,  1651,  1608,  1608,   920,   157,  -485,   460,  -485,  -485,
-    -485,  -485,  -485,   718,  -485,  -485,   167,   344,  -485,   176,
-    -485,   180,   193,    80,   206,  -485,  -485,  -485,   218,    91,
-    -485,  -485,    76,  -485,   205,    10,   260,   205,   205,   223,
-    -485,  -485,  -485,  -485,   230,  -485,  -485,  -485,  -485,  -485,
-    -485,  -485,   237,  1770,  1770,  1770,  -485,   236,  -485,  -485,
-    -485,  -485,  -485,  -485,   220,   344,  1608,   990,   241,   235,
-     262,  -485,  1608,  -485,  -485,   405,  1770,  2090,   254,  -485,
-     297,   444,  1608,    61,  1770,  -485,  -485,   271,  -485,  -485,
-    -485,   671,  -485,  -485,  -485,  -485,  -485,  -485,  1694,  1651,
-    2090,   291,  -485,   181,  -485,    60,  -485,  -485,   287,  2090,
-     301,  -485,   496,  -485,   912,  1608,  1608,  1608,  1608,  -485,
-    1608,  1608,  1608,  -485,  1608,  1608,  1608,  1608,  1608,  1608,
-    1608,  1608,  1608,  1608,  1608,  1608,  1608,  1608,  -485,  1290,
-     468,  1608,  -485,  1608,  -485,  -485,  1221,  1608,  1608,  1608,
-    -485,   573,    44,   235,   275,   347,  -485,  1301,  1301,  -485,
-     113,   302,  -485,   990,   358,  1770,  -485,  -485,  -485,  -485,
-    -485,  -485,  -485,   316,    44,  -485,  -485,   340,  -485,    78,
-     318,  1770,  -485,   990,  -485,  -485,  -485,   307,   325,   990,
-    1221,  -485,  -485,   324,   117,   365,  -485,   343,   337,  -485,
-    -485,   333,  -485,    32,    23,  -485,  -485,   350,  -485,  -485,
-     406,  1737,  -485,  -485,  -485,   351,  -485,  -485,  -485,   352,
-    1608,    44,   354,  1796,  -485,   353,  1770,  1770,  -485,   359,
-    1608,   357,  2090,  1928,  -485,  2114,  1212,  1212,  1212,  1212,
-    -485,  1212,  1212,  2138,  -485,   566,   566,   566,   566,  -485,
-    -485,  -485,  -485,  1345,  -485,  -485,    31,  1400,  -485,  1988,
-     360,  1147,  1955,  1345,  -485,  -485,  -485,  -485,  -485,  -485,
-      95,   254,   254,  2090,  1857,   368,   361,   371,  -485,   363,
-     427,  1301,   247,    51,  -485,   374,  -485,  -485,  -485,  1890,
-    -485,    36,   382,    44,   384,   385,   387,  -485,  -485,   391,
-    1770,   395,  -485,  -485,  -485,  -485,  1455,  1510,  1608,  -485,
-    -485,  -485,   990,  -485,  1823,   399,   135,   340,  1608,    44,
-     397,   403,   990,  -485,   542,   407,  1770,   278,   365,   406,
-     365,   411,   364,   413,  -485,  -485,    44,   406,   430,    44,
-     423,    44,   425,   254,  -485,  1608,  1849,  1770,  -485,   216,
-     219,   274,   288,  -485,  -485,  -485,    44,   426,   254,  1608,
-    -485,  2018,  -485,  -485,   414,   422,   416,  1651,   433,   434,
-     436,  -485,  1608,  -485,  -485,   439,   437,  1221,  1147,  -485,
-    1301,   466,  -485,  -485,  -485,    44,  1882,  1301,    44,  1301,
-    -485,  -485,   504,   207,  -485,  -485,   446,   438,  1301,   247,
-    1301,   406,    44,    44,  -485,   453,   455,  -485,  -485,  -485,
-    1823,  -485,  1221,  1608,  1608,   467,  -485,   990,   472,  -485,
-    -485,  -485,  -485,  -485,  -485,  -485,  1823,  -485,  -485,  -485,
-    -485,  -485,   475,  -485,  -485,  -485,  1651,   470,  -485,  -485,
-    -485,   490,  -485,   493,   406,  -485,  -485,  -485,  -485,  -485,
-    -485,  -485,  -485,  -485,   254,   495,  1345,  -485,  -485,   498,
-     912,  -485,   254,  1345,  1553,  1345,  -485,  -485,   497,  -485,
-    -485,  -485,  -485,   486,  -485,  -485,   143,  -485,  -485,   501,
-     502,   473,   508,   513,   505,  -485,  -485,   515,   503,  1301,
-     511,  -485,   518,  -485,  -485,   533,  -485,  1301,  -485,   522,
-     406,  -485,   526,  -485,  1916,   144,  2090,  2090,  1608,   527,
-     990,  -485,  -485,  1823,    39,  -485,  1147,   406,   406,  -485,
-     315,   293,   521,    44,   548,   357,   525,  -485,  2090,  -485,
-    -485,  -485,  -485,  -485,  -485,  -485,  1916,    44,  -485,  1882,
-    1301,   406,  -485,    44,   207,  -485,  -485,  -485,    44,    44,
-    -485,  -485,  -485,  -485,  -485,  -485,   551,   572,  -485,  1608,
-    1608,  -485,  1651,   550,  -485,  -485,  -485,  -485,  -485,  -485,
-    -485,  1345,  -485,   558,  -485,  -485,  -485,  -485,   563,   564,
-     565,  1823,    46,  -485,  -485,  2042,  2066,   559,  1916,  -485,
-    1916,  -485,  -485,  -485,  -485,  -485,  -485,  -485,  -485,  -485,
-    1608,   340,  -485
+    -552,    44,    35,    38,  -552,   199,  -552,    37,  -552,  -552,
+    -552,    83,    22,  -552,    66,    79,  -552,  -552,    60,  -552,
+     107,    89,   993,  -552,   110,   454,   150,  -552,   155,   179,
+    -552,    38,   182,  -552,  -552,  -552,   199,  1760,  -552,   199,
+      42,  -552,  -552,   257,    42,   199,  -552,     7,   125,  1606,
+    -552,     7,  -552,   394,   407,  1606,  1606,  1606,  1606,  1606,
+    1606,  1649,  1606,  1606,  1229,   137,  -552,   506,  -552,  -552,
+    -552,  -552,  -552,   874,  -552,  -552,   140,   285,  -552,   142,
+    -552,   154,   176,     7,   177,  -552,  -552,  -552,   194,    90,
+    -552,  -552,    65,  -552,   186,   -18,   250,   186,   186,   207,
+    -552,  -552,  -552,  -552,   220,  -552,  -552,  -552,  -552,  -552,
+    -552,  -552,   228,  1768,  1768,  1768,  -552,   229,  -552,  -552,
+    -552,  -552,  -552,  -552,    86,   285,  1606,  1735,   245,   246,
+     180,  -552,  1606,  -552,  -552,   216,  1768,  2118,   264,  -552,
+     287,   436,  1606,   418,  1768,  -552,  -552,   452,  -552,  -552,
+    -552,   669,  -552,  -552,  -552,  -552,  -552,  -552,  1692,  1649,
+    2118,   286,  -552,    13,  -552,   243,  -552,  -552,   261,  2118,
+     280,  -552,   455,  -552,   772,  1606,  1606,  1606,  1606,  -552,
+    1606,  1606,  1606,  -552,  1606,  1606,  1606,  1606,  1606,  1606,
+    1606,  1606,  1606,  1606,  1606,  1606,  1606,  1606,  -552,  1288,
+     549,  1606,  -552,  1606,  -552,  -552,  1156,  1606,  1606,  1606,
+    -552,  1251,   199,   246,   317,   361,  -552,  1944,  1944,  -552,
+      55,   322,  -552,  1735,   369,  1768,  -552,  -552,  -552,  -552,
+    -552,  -552,  -552,   323,   199,  -552,  -552,   349,  -552,    84,
+     329,  1768,  -552,  1735,  -552,  -552,  -552,   310,   333,  1735,
+    1156,  -552,  -552,   335,   121,   379,  -552,   346,   348,  -552,
+    -552,   341,  -552,    16,   166,  -552,  -552,   352,  -552,  -552,
+     413,   545,  -552,  -552,  -552,   358,  -552,  -552,  -552,   360,
+    1606,   199,   363,  1793,  -552,   356,  1768,  1768,  -552,   373,
+    1606,   371,  2118,   846,  -552,  2142,   620,   620,   620,   620,
+    -552,   620,   620,   917,  -552,   587,   587,   587,   587,  -552,
+    -552,  -552,  -552,  1343,  -552,  -552,    36,  1398,  -552,  2016,
+     375,  1068,  1983,  1343,  -552,  -552,  -552,  -552,  -552,  -552,
+       0,   264,   264,  2118,  1860,   387,   384,   398,  -552,   403,
+     466,  1944,   238,    34,  -552,   417,  -552,  -552,  -552,  1036,
+    -552,    -6,   422,   199,   425,   431,   432,  -552,  -552,   439,
+    1768,   440,  -552,  -552,  -552,  -552,  1453,  1508,  1606,  -552,
+    -552,  -552,  1735,  -552,  1827,   442,   159,   349,  1606,   199,
+     433,   445,  1735,  -552,   554,   459,  1768,    85,   379,   413,
+     379,   453,   448,   464,  -552,  -552,   199,   413,   473,   199,
+     456,   199,   474,   264,  -552,  1606,  1852,  1768,  -552,   143,
+     258,   259,   260,  -552,  -552,  -552,   199,   485,   264,  1606,
+    -552,  2046,  -552,  -552,   471,   479,   480,  1649,   494,   497,
+     498,  -552,  1606,  -552,  -552,   510,   503,  1156,  1068,  -552,
+    1944,   530,  -552,  -552,  -552,   199,  1885,  1944,   199,  1944,
+    -552,  -552,   569,   305,  -552,  -552,   513,   505,  1944,   238,
+    1944,   413,   199,   199,  -552,   523,   509,  -552,  -552,  -552,
+    1827,  -552,  1156,  1606,  1606,   525,  -552,  1735,   533,  -552,
+    -552,  -552,  -552,  -552,  -552,  -552,  1827,  -552,  -552,  -552,
+    -552,  -552,   529,  -552,  -552,  -552,  1649,   528,  -552,  -552,
+    -552,   535,  -552,   537,   413,  -552,  -552,  -552,  -552,  -552,
+    -552,  -552,  -552,  -552,   264,   540,  1343,  -552,  -552,   539,
+     772,  -552,   264,  1343,  1551,  1343,  -552,  -552,   542,  -552,
+    -552,  -552,  -552,   165,  -552,  -552,   237,  -552,  -552,   543,
+     555,   550,   558,   565,   546,  -552,  -552,   567,   560,  1944,
+     566,  -552,   576,  -552,  -552,   595,  -552,  1944,  -552,   583,
+     413,  -552,   588,  -552,  1919,   247,  2118,  2118,  1606,   586,
+    1735,  -552,  -552,  1827,    80,  -552,  1068,   413,   413,  -552,
+     156,   265,   581,   199,   591,   371,   585,  -552,  2118,  -552,
+    -552,  -552,  -552,  1606,  -552,  -552,  -552,  1919,   199,  -552,
+    1885,  1944,   413,  -552,   199,   305,  -552,  -552,  -552,   199,
+     199,  -552,  -552,  -552,  -552,  -552,  -552,   596,   641,  -552,
+    1606,  1606,  -552,  1649,   599,  -552,  -552,  -552,  -552,  -552,
+    -552,  -552,  1343,   590,  -552,   598,  -552,  -552,  -552,  -552,
+     605,   606,   618,  1827,    74,  -552,  -552,  2070,  2094,   613,
+    -552,  1919,  -552,  1919,  -552,  -552,  -552,  -552,  -552,  -552,
+    -552,  -552,  -552,  1606,   349,  -552
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -485,  -485,  -485,  -485,  -485,  -485,  -485,    -6,  -485,  -485,
-     597,  -485,    -3,  -485,  -485,   608,  -485,  -131,   -28,    50,
-    -485,  -135,  -106,  -485,    -7,  -485,  -485,  -485,   125,  -370,
-    -485,  -485,  -485,  -485,  -485,  -485,  -138,  -485,  -485,  -485,
-    -485,  -485,  -485,  -485,  -485,  -485,  -485,  -485,  -485,  -485,
-     665,    15,   116,  -485,  -190,   111,   112,  -485,   164,   -59,
-     398,   137,    14,   367,   603,    -5,   454,   432,  -485,   402,
-     -50,   491,  -485,  -485,  -485,  -485,   -36,    18,   -34,    -9,
-    -485,  -485,  -485,  -485,  -485,   257,   441,  -445,  -485,  -485,
-    -485,  -485,  -485,  -485,  -485,  -485,   259,  -116,  -218,   265,
-    -485,   284,  -485,  -217,  -286,   636,  -485,  -237,  -485,   -62,
-     -24,   166,  -485,  -314,  -246,  -265,  -177,  -485,  -115,  -415,
-    -485,  -485,  -379,  -485,    -8,  -485,   435,  -485,   326,   225,
-     327,   204,    65,    70,  -484,  -485,  -426,   211,  -485,   462,
-    -485,  -485
+    -552,  -552,  -552,  -552,  -552,  -552,  -552,   -15,  -552,  -552,
+     651,  -552,     2,  -552,  -552,   661,  -552,  -131,   -29,   101,
+    -552,  -134,  -112,  -552,    41,  -552,  -552,  -552,   178,  -366,
+    -552,  -552,  -552,  -552,  -552,  -552,  -139,  -552,  -552,  -552,
+    -552,  -552,  -552,  -552,  -552,  -552,  -552,  -552,  -552,  -552,
+     674,   303,   307,  -552,  -187,   163,   164,  -552,   327,   -59,
+     447,   -16,    81,   414,   655,   376,   103,    20,  -552,   458,
+     273,   547,  -552,  -552,  -552,  -552,   -36,   -37,   -31,   -38,
+    -552,  -552,  -552,  -552,  -552,   -32,   483,  -468,  -552,  -552,
+    -552,  -552,  -552,  -552,  -552,  -552,   315,  -116,  -238,   318,
+    -552,   336,  -552,  -213,  -294,   677,  -552,  -242,  -552,   -63,
+       6,   213,  -552,  -291,  -236,  -288,  -194,  -552,  -111,  -433,
+    -552,  -552,  -301,  -552,   -46,  -552,   190,  -552,   377,   269,
+     378,   251,   109,   115,  -551,  -552,  -432,   262,  -552,   504,
+    -552,  -552
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -275
+#define YYTABLE_NINF -276
 static const yytype_int16 yytable[] =
 {
-      12,   119,   161,   121,   272,   174,   359,   488,   274,   436,
-     502,   240,   385,   376,   323,    32,   278,    79,   508,   259,
-     235,   393,   103,    32,   320,   138,   235,   555,   107,   400,
-     540,   111,   375,   402,   111,   433,   235,    27,   128,   173,
-     111,   571,   426,   417,   619,   389,   391,   380,   146,   150,
-     109,   428,   164,   109,   457,   120,   380,   435,     9,   131,
-       5,  -213,   150,   226,   232,   233,   653,     4,     9,   212,
-     152,   153,   154,   155,   156,   157,   390,   166,   167,   163,
-       7,   207,   561,   366,    11,     9,   261,   214,    15,   216,
-     218,   388,   205,    28,   276,  -213,   462,    29,    20,    18,
-      19,   282,   239,   222,   620,   621,   427,    10,    11,    23,
-     174,   463,   632,   325,   622,   133,    27,    10,    11,  -179,
-    -234,   273,   243,   458,   291,   579,   133,  -213,   618,    26,
-     111,   228,   228,   228,    10,    11,   111,     9,   146,   381,
-     136,   208,   150,   367,   289,   228,    33,   134,    93,   257,
-     164,   209,   537,   209,   228,   266,   124,   438,   134,   526,
-     130,   528,   228,   439,   658,   492,   659,   150,    27,   228,
-     501,   101,   503,   152,   156,   361,    29,   163,   638,  -234,
-     379,   607,   633,   331,   332,  -234,    10,    11,   141,     9,
-     164,   369,   228,   639,   640,   318,   652,   438,   624,   625,
-     536,    79,   582,   487,   125,   438,   438,   349,   125,   586,
-     451,   594,   613,   105,   357,    32,  -181,   163,   243,   171,
-     204,   397,   636,   516,   108,   102,   206,  -265,    29,   363,
-     523,     9,  -265,   408,   198,   565,   414,   415,    10,    11,
-    -180,   228,  -152,   228,   243,    79,   202,   409,  -181,   411,
-     451,  -177,   203,   475,  -175,   533,   403,   452,   430,   228,
-     569,   228,   235,   489,   510,  -180,   418,   228,   259,  -264,
-     512,     9,   235,   584,  -264,  -177,   150,  -179,  -175,    11,
-      10,    11,  -265,  -177,   215,   496,  -175,   219,  -265,   228,
-     497,   662,   220,    35,   122,     9,   223,   452,    37,   234,
-     249,   410,   250,    94,   228,   228,   453,   112,   164,  -176,
-     408,    95,    47,    48,     9,    96,    79,   647,   165,    51,
-      10,    11,   496,  -174,  -264,    97,    98,   497,  -178,   209,
-    -264,   277,   262,  -176,   353,   163,   495,   454,   480,   623,
-     482,  -176,   331,   332,    10,    11,   498,  -174,   349,    61,
-     354,   285,  -178,   616,   520,  -174,   226,   515,    99,   286,
-    -178,    64,   358,    10,    11,   483,   360,   243,   529,   478,
-     231,   231,   231,   287,   490,   364,   362,   243,   228,   111,
-     368,   514,   372,   626,   231,   374,   378,   111,   254,   380,
-     228,   111,   481,   231,   146,   522,   150,   631,   257,   384,
-     228,   231,   382,   199,   228,   386,   266,   200,   231,   394,
-     507,   150,   392,   399,   401,   201,   165,   263,   164,   405,
-     413,   416,   419,   264,   228,   228,   432,   445,   446,   254,
-     448,   231,    79,    79,   480,   449,   482,    10,    11,   459,
-     349,   542,   447,   549,   464,   163,   467,   468,   454,   469,
-     480,   470,   482,   614,   454,   471,   165,   562,   349,   486,
-     379,   483,   235,   491,   255,   509,     9,    79,   254,   117,
-     585,   504,   243,   256,     9,   494,     9,   483,    10,    11,
-     231,   506,   231,   511,     9,   513,   521,   164,   481,   525,
-     527,   434,     9,   530,   531,   228,   532,   263,   231,   534,
-     231,   127,   340,   264,   481,   535,   231,   554,   556,   143,
-     557,   147,   265,   564,   163,    10,    11,    10,    11,   172,
-       9,   520,   661,    10,    11,    10,    11,   317,   231,   568,
-     463,   570,  -156,    10,    11,   573,   575,   480,   228,   482,
-     412,    10,    11,   231,   231,   117,   117,   117,   210,   210,
-     577,   210,   210,   578,   235,   581,   288,   592,   593,   117,
-     583,   595,   596,   529,   483,   243,   254,   597,   117,    10,
-      11,    79,  -157,   598,   165,   600,   117,   599,   150,   602,
-     603,   334,   604,   117,   606,   608,   642,   615,   228,   627,
-     335,   481,   349,   630,   542,   336,   337,   338,   549,   454,
-     177,   255,   339,   349,   349,   480,   117,   482,   629,   340,
-     185,   641,   438,   164,   189,    10,    11,   231,   648,   194,
-     195,   196,   197,   649,   650,   651,   341,   657,   106,   231,
-      66,   484,   483,   628,   580,   654,   590,   591,   342,   231,
-     163,   370,   123,   231,   343,   371,   345,    11,   404,   493,
-     284,   505,   355,   356,   352,   117,   476,   117,    91,   481,
-     443,   444,   574,   231,   231,   344,   539,   563,   637,   634,
-     559,   344,   344,   117,   351,   117,     0,     0,     0,    37,
-       0,   117,     0,     0,   165,     0,     0,     0,   112,     0,
-       0,     0,     0,    47,    48,     9,     0,     0,     0,     0,
-      51,     0,     0,   117,     0,     0,     0,   224,     0,     0,
-       0,     0,     0,     0,   137,   117,     0,     0,   117,   117,
-       0,     0,   175,  -274,   114,     0,   160,   484,     0,   169,
-     225,     0,     0,     0,   231,     0,   280,     0,     0,     0,
-       0,     0,    64,   484,    10,    11,   281,     0,     0,     0,
-       0,   176,   177,   165,   178,   179,   180,   181,   182,     0,
-     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,     0,   450,   231,     0,     0,
-       0,     0,     0,  -274,   461,     0,     0,     0,   344,     0,
-       0,     0,   117,  -274,     0,   344,     0,     0,     0,     0,
-       0,     0,     0,   344,   117,     0,   117,     0,     0,     0,
-       0,     0,     0,     0,   117,     0,     0,     0,   117,     0,
-       0,     0,     0,     0,     0,     0,     0,   231,     0,     0,
-     484,     0,     0,     0,     0,     0,     0,     0,   117,   117,
-     292,   293,   294,   295,     0,   296,   297,   298,     0,   299,
-     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
-     310,   311,   312,     0,   160,     0,   319,     0,   322,     0,
-       0,     0,   137,   137,   333,   538,     0,     0,     0,   165,
-       0,   545,   548,     0,   553,     0,     0,     0,     0,     0,
-       0,     0,     0,   558,   344,   560,     0,     0,   484,     0,
-     543,   344,   117,   344,     0,     0,     0,     0,     0,   117,
-       0,     0,   344,     0,   344,     0,     0,     0,   117,     0,
-      37,     0,     0,    35,     0,     0,     0,     0,    37,   112,
-       0,   168,     0,     0,    47,    48,     9,   112,     0,     0,
-       0,    51,    47,    48,     9,   137,     0,     0,   224,    51,
-       0,     0,   117,     0,     0,   137,    55,     0,     0,     0,
-       0,     0,     0,     0,     0,   114,     0,     0,     0,    56,
-      57,   225,    58,    59,     0,     0,    60,   290,   421,    61,
-       0,     0,   160,    64,   601,    10,    11,   281,   421,    62,
-      63,    64,   605,    10,    11,     0,     0,     0,    37,     0,
-       0,   241,   117,   344,     0,   117,     0,   112,     0,     0,
-       0,   344,    47,    48,     9,     0,     0,     0,   344,    51,
-       0,     0,     0,     0,     0,     0,   224,     0,     0,     0,
-       0,   137,   137,     0,   545,   635,     0,     0,     0,     0,
-       0,     0,     0,   114,     0,     0,     0,     0,     0,   225,
-     344,     0,     0,   543,   344,     0,     0,     0,     0,    -2,
-      34,    64,    35,    10,    11,    36,     0,    37,    38,    39,
-     137,     0,    40,   117,    41,    42,    43,    44,    45,    46,
-       0,    47,    48,     9,   137,     0,    49,    50,    51,    52,
-      53,    54,   160,     0,     0,    55,     0,   169,     0,     0,
-       0,     0,   344,     0,   344,     0,     0,     0,    56,    57,
-       0,    58,    59,     0,     0,    60,     0,     0,    61,     0,
-       0,   -24,     0,     0,     0,     0,     0,     0,    62,    63,
-      64,     0,    10,    11,     0,     0,     0,     0,   566,   567,
-       0,     0,     0,     0,     0,     0,     0,     0,   324,     0,
-      35,     0,     0,    36,  -249,    37,    38,    39,     0,  -249,
-      40,   160,    41,    42,   112,    44,    45,    46,     0,    47,
-      48,     9,     0,     0,    49,    50,    51,    52,    53,    54,
-       0,   421,     0,    55,     0,     0,     0,     0,   421,   588,
-     421,     0,     0,     0,     0,     0,    56,    57,     0,    58,
-      59,     0,     0,    60,     0,     0,    61,     0,     0,  -249,
-       0,     0,     0,     0,   325,  -249,    62,    63,    64,     0,
-      10,    11,   324,     0,    35,     0,     0,    36,     0,    37,
-      38,    39,     0,     0,    40,     0,    41,    42,   112,    44,
-      45,    46,     0,    47,    48,     9,   177,     0,    49,    50,
-      51,    52,    53,    54,     0,     0,   185,    55,     0,     0,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,     0,
-      56,    57,     0,    58,    59,     0,     0,    60,     0,     0,
-      61,     0,     0,  -249,   645,   646,     0,   160,   325,  -249,
-      62,    63,    64,    35,    10,    11,   421,     0,    37,     0,
-       0,     0,     0,     0,     0,     0,     0,   112,     0,   334,
-       0,     0,    47,    48,     9,     0,     0,     0,   335,    51,
-       0,     0,     0,   336,   337,   338,   158,     0,     0,     0,
-     339,     0,     0,     0,     0,     0,     0,   340,     0,    56,
-      57,     0,    58,   159,     0,     0,    60,     0,    35,    61,
-     314,     0,     0,    37,   341,     0,     0,     0,     0,    62,
-      63,    64,   112,    10,    11,     0,     0,    47,    48,     9,
-       0,     0,   343,     0,    51,    11,     0,     0,     0,     0,
-       0,    55,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    56,    57,     0,    58,    59,     0,
-       0,    60,     0,    35,    61,     0,     0,     0,    37,     0,
-       0,     0,   420,     0,    62,    63,    64,   112,    10,    11,
-       0,     0,    47,    48,     9,     0,     0,     0,     0,    51,
-       0,   429,     0,     0,     0,     0,   158,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    56,
-      57,     0,    58,   159,     0,     0,    60,     0,    35,    61,
-       0,     0,     0,    37,     0,     0,     0,     0,     0,    62,
-      63,    64,   112,    10,    11,     0,     0,    47,    48,     9,
-       0,   473,     0,     0,    51,     0,     0,     0,     0,     0,
-       0,    55,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    56,    57,     0,    58,    59,     0,
-       0,    60,     0,    35,    61,     0,     0,     0,    37,     0,
-       0,     0,     0,     0,    62,    63,    64,   112,    10,    11,
-       0,     0,    47,    48,     9,     0,   474,     0,     0,    51,
-       0,     0,     0,     0,     0,     0,    55,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    35,     0,     0,    56,
-      57,    37,    58,    59,     0,     0,    60,     0,     0,    61,
-     112,     0,     0,     0,     0,    47,    48,     9,     0,    62,
-      63,    64,    51,    10,    11,     0,     0,     0,     0,    55,
+     120,   119,   161,   272,   174,   122,   121,   320,   376,   274,
+     359,   488,   540,   103,   235,   240,   278,   323,   571,   259,
+     235,   555,   385,   164,   163,   389,   391,   433,   428,   165,
+     235,   393,   436,   107,   435,   141,   375,   457,   173,   400,
+     380,   212,   133,   402,     4,    35,   634,   426,  -182,   214,
+      37,   216,   218,   417,   462,   138,    11,   117,    27,   112,
+       5,    15,   438,     7,    47,    48,     9,   204,   439,   463,
+     207,    51,  -181,   206,   134,   388,   228,   228,   228,     9,
+    -182,   231,   231,   231,    19,   620,    18,    20,   502,   366,
+     228,   205,   496,  -266,   656,   231,   508,   497,  -266,   228,
+     661,    61,   662,    23,   231,   619,   458,   228,   222,   174,
+      27,   427,   231,    64,   228,    10,    11,   109,    29,   231,
+     109,   164,   163,    26,  -235,   133,   131,   165,    10,    11,
+     208,     9,   239,   117,   117,   117,   526,   228,   528,   381,
+     209,   325,   231,   289,   537,   621,   622,   117,  -266,   367,
+     501,    33,   503,   498,  -266,   623,   117,   134,    27,   209,
+     561,   164,   163,   496,   117,   635,    28,   165,   497,   492,
+      29,   117,    93,   640,   101,   655,   641,   642,  -178,     9,
+      10,    11,   105,  -235,   379,   108,   228,  -265,   228,  -235,
+     380,   231,  -265,   231,   117,   536,   136,   210,   210,   171,
+     210,   210,  -178,   579,   228,   357,   228,   198,  -153,   231,
+    -178,   231,   228,   331,   332,   102,   257,   231,    29,   390,
+     202,   438,   266,     9,   627,   582,   516,   487,    10,    11,
+     565,   593,   586,   523,   228,   203,  -181,   594,   533,   231,
+     254,   451,  -265,   117,  -214,   117,   410,   409,  -265,   228,
+     228,   412,   411,  -180,   231,   231,   235,   475,   430,   608,
+      11,   117,     9,   117,   569,   510,   235,   489,   259,   117,
+     512,   219,    10,    11,   215,   255,   625,   626,  -214,   164,
+     163,     9,   220,   584,   256,   165,   403,   223,   452,    10,
+      11,   117,   234,  -176,  -177,  -175,   418,   453,   665,   438,
+    -179,   638,  -180,   117,   249,   595,   117,   117,   451,   438,
+    -214,    10,    11,   250,   344,   614,   127,  -176,  -177,  -175,
+     344,   344,   262,   228,  -179,  -176,  -177,  -175,   231,     9,
+      10,    11,  -179,   286,   624,   228,   483,   481,   480,   209,
+     231,   649,   484,   482,   199,   228,   285,   124,   200,   228,
+     231,   130,   287,   520,   231,   452,   201,   617,   152,   153,
+     154,   155,   156,   157,   354,   166,   167,   125,   529,   228,
+     228,   125,   331,   332,   231,   231,   353,   360,    10,    11,
+     117,    12,   358,   362,   364,   372,   226,   232,   233,   164,
+     163,   368,   117,   374,   117,   165,    32,   378,    79,   633,
+     632,   345,   117,   380,    32,   382,   117,   355,   356,   261,
+     384,   514,   111,   386,   392,   111,   394,   276,     9,   128,
+     399,   111,   401,   413,   282,   522,   117,   117,   405,   146,
+     150,     9,   483,   481,   480,   416,   419,   344,   484,   482,
+     228,   432,     9,   150,   344,   231,   445,   291,   483,   481,
+     480,   446,   344,   143,   484,   482,   235,   615,   164,   163,
+     254,   152,   156,    94,   165,   257,   147,    10,    11,   447,
+     448,    95,   254,   266,   449,    96,     9,   507,   273,     9,
+      10,    11,   459,   228,   464,    97,    98,   467,   231,   263,
+     117,    10,    11,   468,   469,   264,   379,   117,   361,   470,
+     471,   263,   486,   243,   265,   491,   117,   264,   509,    10,
+      11,   111,   277,   504,   369,   288,   511,   111,    99,   146,
+     520,    10,    11,   150,   664,    10,    11,   494,    10,    11,
+       9,   450,   506,   228,   513,   483,   481,   480,   231,   461,
+     117,   484,   482,   344,   397,   521,   525,   527,   150,   543,
+     344,   235,   344,    37,   530,   434,   408,   531,   532,   414,
+     415,   344,   112,   344,   529,   172,   340,    47,    48,     9,
+     534,   535,   554,     9,    51,   556,   318,   557,   254,    10,
+      11,   224,    79,   564,   463,   164,   163,   568,   349,   573,
+     117,   165,   570,   117,   575,   577,    32,   578,   114,   243,
+     581,   583,   592,   596,   225,   483,   481,   480,   317,  -157,
+     363,   484,   482,   255,   599,   597,    64,   598,    10,    11,
+     396,   177,    10,    11,  -158,   243,    79,    10,    11,   600,
+     538,   185,   601,   408,   603,   189,   545,   548,   604,   553,
+     194,   195,   196,   197,   605,   607,   616,   609,   558,   628,
+     560,   630,   344,   631,   177,   644,   643,   150,   651,   495,
+     344,   438,   650,   117,   185,   652,   653,   344,   189,   190,
+     191,   192,   193,   194,   195,   196,   197,    37,   654,   226,
+     515,   660,   106,    66,   629,   657,   112,   580,   590,   591,
+     370,    47,    48,     9,   123,   404,   352,    79,    51,    91,
+     344,   371,   493,   543,   344,   224,   284,   505,   476,   574,
+     539,   443,   444,   639,   563,   636,   351,     0,   454,     0,
+       0,   559,   114,   137,     0,     0,     0,     0,   225,   349,
+       0,     0,     0,     0,   280,   160,     0,     0,   169,   602,
+      64,     0,    10,    11,   281,     0,     0,   606,   243,     0,
+     478,     0,     0,     0,   344,   490,   344,     0,   243,     0,
+     111,     0,     0,     0,     0,     0,     0,     0,   111,     0,
+       0,     0,   111,     0,     0,   146,     0,   150,     0,     0,
+      37,     0,     0,     0,     0,     0,     0,     0,     0,   112,
+     545,   637,   150,   585,    47,    48,     9,     0,     0,     0,
+       0,    51,     0,     0,     0,     0,     0,     0,   224,     0,
+       0,     0,     0,    79,    79,     0,     0,     0,     0,     0,
+       0,   349,   542,     0,   549,   114,     0,     0,     0,   454,
+       0,   225,     0,     0,     0,   454,     0,   290,   562,   349,
+       0,     0,     0,    64,     0,    10,    11,   281,    79,   292,
+     293,   294,   295,   243,   296,   297,   298,     0,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,     0,   160,     0,   319,     0,   322,   175,  -275,
+     177,   137,   137,   333,   180,   181,   182,     0,     0,   184,
+     185,   186,   187,     0,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,     0,     0,     0,     0,   176,   177,     0,
+     178,   179,   180,   181,   182,     0,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,     0,     0,     0,     0,     0,     0,     0,     0,  -275,
+       0,     0,     0,     0,     0,     0,   243,     0,     0,  -275,
+     176,   177,    79,     0,   137,   180,   181,   182,     0,   150,
+     184,   185,   186,   187,   137,   189,   190,   191,   192,   193,
+     194,   195,   196,   197,   349,     0,   542,     0,     0,     0,
+     549,   454,     0,     0,     0,   349,   349,   421,     0,     0,
+       0,   160,     0,    -2,    34,     0,    35,   421,     0,    36,
+       0,    37,    38,    39,     0,     0,    40,     0,    41,    42,
+      43,    44,    45,    46,     0,    47,    48,     9,     0,     0,
+      49,    50,    51,    52,    53,    54,     0,     0,     0,    55,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     137,   137,    56,    57,   334,    58,    59,   460,     0,    60,
+       0,     0,    61,   335,     0,   -24,     0,     0,   336,   337,
+     338,     0,    62,    63,    64,   339,    10,    11,     0,   324,
+       0,    35,   340,     0,    36,  -250,    37,    38,    39,   137,
+    -250,    40,     0,    41,    42,   112,    44,    45,    46,   341,
+      47,    48,     9,   137,     0,    49,    50,    51,    52,    53,
+      54,   160,     0,     0,    55,     0,   169,   343,     0,     0,
+      11,     0,     0,     0,     0,     0,     0,    56,    57,     0,
+      58,    59,     0,     0,    60,     0,     0,    61,     0,     0,
+    -250,     0,     0,     0,     0,   325,  -250,    62,    63,    64,
+       0,    10,    11,     0,     0,     0,     0,   566,   567,     0,
+       0,     0,     0,     0,     0,     0,     0,   324,     0,    35,
+       0,     0,    36,     0,    37,    38,    39,     0,     0,    40,
+     160,    41,    42,   112,    44,    45,    46,     0,    47,    48,
+       9,     0,     0,    49,    50,    51,    52,    53,    54,     0,
+     421,     0,    55,     0,     0,     0,     0,   421,   588,   421,
+       0,     0,     0,     0,     0,    56,    57,     0,    58,    59,
+       0,     0,    60,     0,     0,    61,     0,     0,  -250,     0,
+       0,     0,     0,   325,  -250,    62,    63,    64,     0,    10,
+      11,     0,    35,     0,     0,     0,     0,    37,     0,     0,
+     168,     0,     0,     0,     0,     0,   112,     0,     0,     0,
+       0,    47,    48,     9,     0,     0,     0,     0,    51,   334,
+       0,     0,     0,     0,     0,    55,     0,   169,   335,     0,
+       0,     0,     0,   336,   337,   338,     0,     0,    56,    57,
+     339,    58,    59,     0,     0,    60,     0,   340,    61,     0,
+       0,    35,     0,     0,   647,   648,    37,   160,    62,    63,
+      64,     0,    10,    11,   341,   112,   421,     0,     0,     0,
+      47,    48,     9,     0,     0,     0,   342,    51,     0,     0,
+       0,     0,   343,     0,   158,    11,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    56,    57,     0,
+      58,   159,     0,     0,    60,     0,    35,    61,   314,     0,
+       0,    37,     0,     0,     0,     0,     0,    62,    63,    64,
+     112,    10,    11,     0,     0,    47,    48,     9,     0,     0,
+       0,     0,    51,     0,     0,     0,     0,     0,     0,    55,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,    56,    57,     0,    58,    59,     0,     0,    60,
        0,    35,    61,     0,     0,     0,    37,     0,     0,     0,
-     587,     0,    62,    63,    64,   112,    10,    11,     0,     0,
-      47,    48,     9,     0,     0,     0,     0,    51,     0,     0,
+     420,     0,    62,    63,    64,   112,    10,    11,     0,     0,
+      47,    48,     9,     0,     0,     0,     0,    51,     0,   429,
+       0,     0,     0,     0,   158,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    56,    57,     0,
+      58,   159,     0,     0,    60,     0,    35,    61,     0,     0,
+       0,    37,     0,     0,     0,     0,     0,    62,    63,    64,
+     112,    10,    11,     0,     0,    47,    48,     9,     0,   473,
+       0,     0,    51,     0,     0,     0,     0,     0,     0,    55,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    56,    57,     0,    58,    59,     0,     0,    60,
+       0,    35,    61,     0,     0,     0,    37,     0,     0,     0,
+       0,     0,    62,    63,    64,   112,    10,    11,     0,     0,
+      47,    48,     9,     0,   474,     0,     0,    51,     0,     0,
        0,     0,     0,     0,    55,     0,     0,     0,     0,     0,
        0,     0,     0,     0,    35,     0,     0,    56,    57,    37,
       58,    59,     0,     0,    60,     0,     0,    61,   112,     0,
        0,     0,     0,    47,    48,     9,     0,    62,    63,    64,
-      51,    10,    11,     0,     0,     0,     0,   158,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    35,     0,     0,
-      56,    57,   283,    58,   159,     0,     0,    60,     0,     0,
-      61,   112,     0,     0,     0,     0,    47,    48,     9,     0,
-      62,    63,    64,    51,    10,    11,     0,     0,     0,     0,
-      55,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    56,    57,    37,    58,    59,     0,     0,
-      60,     0,     0,    61,   112,     0,     0,     0,     0,    47,
-      48,     9,     0,    62,    63,    64,    51,    10,    11,     0,
-      37,     0,     0,   224,     0,     0,     0,     0,    37,   112,
-       0,     0,     0,     0,    47,    48,     9,   112,     0,     0,
-     114,    51,    47,    48,     9,     0,   225,     0,   113,    51,
-       0,     0,     0,     0,    37,     0,   224,     0,    64,     0,
-      10,    11,   396,   112,     0,   114,     0,     0,    47,    48,
-       9,   115,     0,   114,     0,    51,     0,     0,     0,   225,
-       0,    37,   406,    64,     0,    10,    11,     0,     0,     0,
-     112,    64,     0,    10,    11,    47,    48,     9,     0,   114,
-       0,     0,    51,     0,     0,   407,     0,   283,     0,   224,
-       0,     0,     0,     0,     0,   334,   112,    64,     0,    10,
-      11,    47,    48,     9,   335,     0,   114,     0,    51,   336,
-     337,   338,   477,     0,     0,   224,   339,     0,     0,     0,
-     334,     0,     0,   440,    64,     0,    10,    11,   334,   335,
-       0,   460,   114,     0,   336,   337,   541,   335,   225,     0,
-     341,   339,   336,   337,   338,     0,   441,     0,   340,   339,
-      64,     0,    10,    11,   334,     0,   340,     0,   343,     0,
-       0,    11,     0,   335,     0,   341,     0,     0,   336,   337,
-     338,     0,     0,   341,     0,   339,     0,     0,     0,     0,
-       0,     0,   340,   343,     0,    10,    11,     0,     0,     0,
-       0,   343,   177,     0,    11,     0,   180,   181,   182,   341,
-       0,   184,   185,   186,   187,   609,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,     0,     0,   343,   176,   177,
-      11,   178,     0,   180,   181,   182,     0,     0,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   176,   177,     0,   178,     0,   180,   181,   182,     0,
-     434,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,     0,     0,     0,     0,     0,
-       0,   176,   177,     0,   178,     0,   180,   181,   182,     0,
-     431,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,   176,   177,     0,   178,     0,
-     180,   181,   182,     0,   524,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   176,
-     177,     0,   178,     0,   180,   181,   182,     0,   655,   184,
+      51,    10,    11,     0,     0,     0,     0,    55,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      56,    57,     0,    58,    59,     0,     0,    60,     0,    35,
+      61,     0,     0,     0,    37,     0,     0,     0,   587,     0,
+      62,    63,    64,   112,    10,    11,     0,     0,    47,    48,
+       9,     0,     0,     0,     0,    51,     0,     0,     0,     0,
+       0,     0,    55,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    35,     0,     0,    56,    57,    37,    58,    59,
+       0,     0,    60,     0,     0,    61,   112,     0,     0,     0,
+       0,    47,    48,     9,     0,    62,    63,    64,    51,    10,
+      11,     0,     0,     0,     0,   158,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    35,     0,     0,    56,    57,
+     283,    58,   159,     0,     0,    60,     0,     0,    61,   112,
+       0,     0,     0,     0,    47,    48,     9,     0,    62,    63,
+      64,    51,    10,    11,     0,     0,     0,     0,    55,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    56,    57,    37,    58,    59,   241,     0,    60,     0,
+       0,    61,   112,     0,     0,     0,     0,    47,    48,     9,
+       0,    62,    63,    64,    51,    10,    11,     0,    37,     0,
+       0,   224,     0,     0,     0,     0,    37,   112,     0,     0,
+       0,     0,    47,    48,     9,   112,     0,     0,   114,    51,
+      47,    48,     9,     0,   225,     0,   113,    51,     0,     0,
+       0,    37,     0,     0,   224,     0,    64,     0,    10,    11,
+     112,     0,     0,   114,     0,    47,    48,     9,     0,   115,
+       0,   114,    51,     0,     0,     0,     0,   225,     0,   406,
+       0,    64,     0,    10,    11,    37,     0,     0,     0,    64,
+       0,    10,    11,     0,   112,     0,   114,     0,     0,    47,
+      48,     9,   407,     0,     0,     0,    51,     0,     0,     0,
+     283,     0,     0,   224,    64,     0,    10,    11,   334,   112,
+       0,     0,     0,     0,    47,    48,     9,   335,     0,     0,
+     114,    51,   336,   337,   338,     0,   477,     0,   224,   339,
+       0,     0,     0,   334,     0,     0,   440,     0,    64,     0,
+      10,    11,   335,     0,     0,   114,     0,   336,   337,   541,
+       0,   225,     0,   341,   339,     0,     0,     0,     0,   441,
+       0,   340,     0,    64,     0,    10,    11,   334,     0,     0,
+       0,   343,     0,     0,    11,     0,   335,     0,   341,     0,
+       0,   336,   337,   338,     0,     0,     0,     0,   339,     0,
+       0,     0,   334,     0,     0,   340,   343,     0,    10,    11,
+       0,   335,     0,     0,     0,     0,   336,   337,   338,     0,
+       0,     0,   341,   339,     0,     0,     0,     0,   610,     0,
+     340,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     343,     0,     0,    11,     0,     0,     0,   341,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   343,   176,   177,    11,   178,
+       0,   180,   181,   182,     0,     0,   184,   185,   186,   187,
+     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   176,
+     177,     0,   178,     0,   180,   181,   182,     0,   434,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,     0,     0,     0,     0,     0,     0,   176,
+     177,     0,   178,     0,   180,   181,   182,     0,   431,   184,
      185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
      195,   196,   197,   176,   177,     0,   178,     0,   180,   181,
-     182,     0,   656,   184,   185,   186,   187,   188,   189,   190,
+     182,     0,   524,   184,   185,   186,   187,   188,   189,   190,
      191,   192,   193,   194,   195,   196,   197,   176,   177,     0,
-       0,     0,   180,   181,   182,     0,     0,   184,   185,   186,
+     178,     0,   180,   181,   182,     0,   658,   184,   185,   186,
      187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,   176,   177,     0,     0,     0,   180,   181,   182,     0,
-       0,   184,   185,   186,   187,     0,   189,   190,   191,   192,
-     193,   194,   195,   196,   197
+     197,   176,   177,     0,   178,     0,   180,   181,   182,     0,
+     659,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   176,   177,     0,     0,     0,
+     180,   181,   182,     0,     0,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197
 };
 
 static const yytype_int16 yycheck[] =
 {
-       5,    37,    61,    37,   142,    67,   223,   377,   143,   323,
-     389,   126,   258,   250,   204,    20,   147,    22,   397,   135,
-     126,   267,    28,    28,   201,    49,   132,   453,    31,   275,
-     445,    36,   249,   279,    39,   321,   142,     3,    43,    67,
-      45,   486,    11,   289,     5,   263,   264,    24,    53,    54,
-      36,   316,    61,    39,     3,    37,    24,   322,    24,    45,
-      25,     1,    67,   113,   114,   115,    20,     0,    24,    59,
-      55,    56,    57,    58,    59,    60,    53,    62,    63,    61,
-      25,     5,   461,     5,    74,    24,   136,    95,    24,    97,
-      98,    59,     1,    59,   144,    35,    60,    63,    21,     3,
-      62,   151,   126,   106,    65,    66,    75,    73,    74,    24,
-     172,    75,   596,    67,    75,    35,     3,    73,    74,    59,
-       3,    60,   127,    72,   174,   504,    35,    67,   573,    63,
-     135,   113,   114,   115,    73,    74,   141,    24,   143,   255,
-      71,    65,   147,    65,   172,   127,    62,    67,    62,   135,
-     159,    75,   438,    75,   136,   141,    40,    62,    67,   424,
-      44,   426,   144,    68,   648,   382,   650,   172,     3,   151,
-     388,    24,   390,   158,   159,   225,    63,   159,   604,    62,
-      63,   560,   597,   207,   208,    68,    73,    74,    51,    24,
-     199,   241,   174,   608,   609,   200,   641,    62,   577,   578,
-     437,   206,   516,    68,    40,    62,    62,   212,    44,   523,
-       3,    68,    68,     3,   220,   220,    35,   199,   223,    62,
-      83,   271,   601,   413,     3,    60,    89,     7,    63,   234,
-     420,    24,    12,   283,    67,   472,   286,   287,    73,    74,
-      59,   223,    66,   225,   249,   250,    66,   283,    67,   283,
-       3,    35,    59,   368,    35,   432,   280,    50,   317,   241,
-     477,   243,   368,   378,   399,    59,   290,   249,   384,     7,
-     401,    24,   378,   519,    12,    59,   281,    59,    59,    74,
-      73,    74,    62,    67,    24,     7,    67,    64,    68,   271,
-      12,   661,    62,     3,    37,    24,    59,    50,     8,    63,
-      59,   283,    67,     9,   286,   287,    59,    17,   317,    35,
-     360,    17,    22,    23,    24,    21,   321,   631,    61,    29,
-      73,    74,     7,    35,    62,    31,    32,    12,    35,    75,
-      68,    60,    35,    59,    59,   317,   386,   342,   374,   576,
-     374,    67,   366,   367,    73,    74,    68,    59,   353,    59,
-       3,    60,    59,   570,   416,    67,   406,   407,    64,    72,
-      67,    71,    60,    73,    74,   374,     8,   372,   427,   374,
-     113,   114,   115,    72,   379,    35,    60,   382,   360,   384,
-      62,   405,    75,    68,   127,    60,    62,   392,    24,    24,
-     372,   396,   374,   136,   399,   419,   401,   587,   384,    62,
-     382,   144,    59,    59,   386,    72,   392,    63,   151,     3,
-     396,   416,    62,    62,    62,    71,   159,    53,   427,    65,
-      67,    62,    65,    59,   406,   407,    66,    59,    67,    24,
-      67,   174,   437,   438,   470,     8,   470,    73,    74,    65,
-     445,   446,    71,   448,    62,   427,    62,    62,   453,    62,
-     486,    60,   486,   568,   459,    60,   199,   462,   463,    60,
-      63,   470,   568,    60,    59,    35,    24,   472,    24,    37,
-     520,    60,   477,    68,    24,    68,    24,   486,    73,    74,
-     223,    68,   225,    60,    24,    60,    60,   496,   470,    75,
-      68,    75,    24,    60,    60,   477,    60,    53,   241,    60,
-     243,    59,    36,    59,   486,    68,   249,     3,    62,    59,
-      72,    59,    68,    60,   496,    73,    74,    73,    74,    59,
-      24,   583,   660,    73,    74,    73,    74,    59,   271,    62,
-      75,    59,    59,    73,    74,    60,    66,   573,   520,   573,
-     283,    73,    74,   286,   287,   113,   114,   115,    94,    95,
-      60,    97,    98,    60,   660,    60,    60,    60,    72,   127,
-      62,    60,    60,   622,   573,   570,    24,    59,   136,    73,
-      74,   576,    59,    68,   317,    72,   144,    62,   583,    68,
-      62,     8,    49,   151,    62,    59,    14,    60,   570,    68,
-      17,   573,   597,    68,   599,    22,    23,    24,   603,   604,
-      34,    59,    29,   608,   609,   641,   174,   641,    60,    36,
-      44,    60,    62,   622,    48,    73,    74,   360,    60,    53,
-      54,    55,    56,    60,    60,    60,    53,    68,    31,   372,
-      22,   374,   641,   583,   509,   642,   525,   525,    65,   382,
-     622,   243,    39,   386,    71,   243,   211,    74,   281,   384,
-     159,   392,   217,   218,   213,   223,   372,   225,    22,   641,
-     334,   334,   496,   406,   407,   211,   441,   463,   603,   599,
-     459,   217,   218,   241,   212,   243,    -1,    -1,    -1,     8,
-      -1,   249,    -1,    -1,   427,    -1,    -1,    -1,    17,    -1,
-      -1,    -1,    -1,    22,    23,    24,    -1,    -1,    -1,    -1,
-      29,    -1,    -1,   271,    -1,    -1,    -1,    36,    -1,    -1,
-      -1,    -1,    -1,    -1,    49,   283,    -1,    -1,   286,   287,
-      -1,    -1,     4,     5,    53,    -1,    61,   470,    -1,    64,
-      59,    -1,    -1,    -1,   477,    -1,    65,    -1,    -1,    -1,
-      -1,    -1,    71,   486,    73,    74,    75,    -1,    -1,    -1,
-      -1,    33,    34,   496,    36,    37,    38,    39,    40,    -1,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    -1,   341,   520,    -1,    -1,
-      -1,    -1,    -1,    65,   349,    -1,    -1,    -1,   334,    -1,
-      -1,    -1,   360,    75,    -1,   341,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   349,   372,    -1,   374,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   382,    -1,    -1,    -1,   386,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   570,    -1,    -1,
-     573,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   406,   407,
-     175,   176,   177,   178,    -1,   180,   181,   182,    -1,   184,
-     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,    -1,   199,    -1,   201,    -1,   203,    -1,
-      -1,    -1,   207,   208,   209,   440,    -1,    -1,    -1,   622,
-      -1,   446,   447,    -1,   449,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   458,   440,   460,    -1,    -1,   641,    -1,
-     446,   447,   470,   449,    -1,    -1,    -1,    -1,    -1,   477,
-      -1,    -1,   458,    -1,   460,    -1,    -1,    -1,   486,    -1,
-       8,    -1,    -1,     3,    -1,    -1,    -1,    -1,     8,    17,
-      -1,    11,    -1,    -1,    22,    23,    24,    17,    -1,    -1,
-      -1,    29,    22,    23,    24,   280,    -1,    -1,    36,    29,
-      -1,    -1,   520,    -1,    -1,   290,    36,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    53,    -1,    -1,    -1,    49,
-      50,    59,    52,    53,    -1,    -1,    56,    65,   313,    59,
-      -1,    -1,   317,    71,   549,    73,    74,    75,   323,    69,
-      70,    71,   557,    73,    74,    -1,    -1,    -1,     8,    -1,
-      -1,    11,   570,   549,    -1,   573,    -1,    17,    -1,    -1,
-      -1,   557,    22,    23,    24,    -1,    -1,    -1,   564,    29,
-      -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,
-      -1,   366,   367,    -1,   599,   600,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    53,    -1,    -1,    -1,    -1,    -1,    59,
-     596,    -1,    -1,   599,   600,    -1,    -1,    -1,    -1,     0,
-       1,    71,     3,    73,    74,     6,    -1,     8,     9,    10,
-     405,    -1,    13,   641,    15,    16,    17,    18,    19,    20,
-      -1,    22,    23,    24,   419,    -1,    27,    28,    29,    30,
-      31,    32,   427,    -1,    -1,    36,    -1,   432,    -1,    -1,
-      -1,    -1,   648,    -1,   650,    -1,    -1,    -1,    49,    50,
-      -1,    52,    53,    -1,    -1,    56,    -1,    -1,    59,    -1,
-      -1,    62,    -1,    -1,    -1,    -1,    -1,    -1,    69,    70,
-      71,    -1,    73,    74,    -1,    -1,    -1,    -1,   473,   474,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,    -1,
-       3,    -1,    -1,     6,     7,     8,     9,    10,    -1,    12,
-      13,   496,    15,    16,    17,    18,    19,    20,    -1,    22,
-      23,    24,    -1,    -1,    27,    28,    29,    30,    31,    32,
-      -1,   516,    -1,    36,    -1,    -1,    -1,    -1,   523,   524,
-     525,    -1,    -1,    -1,    -1,    -1,    49,    50,    -1,    52,
-      53,    -1,    -1,    56,    -1,    -1,    59,    -1,    -1,    62,
-      -1,    -1,    -1,    -1,    67,    68,    69,    70,    71,    -1,
-      73,    74,     1,    -1,     3,    -1,    -1,     6,    -1,     8,
-       9,    10,    -1,    -1,    13,    -1,    15,    16,    17,    18,
-      19,    20,    -1,    22,    23,    24,    34,    -1,    27,    28,
-      29,    30,    31,    32,    -1,    -1,    44,    36,    -1,    -1,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    -1,
-      49,    50,    -1,    52,    53,    -1,    -1,    56,    -1,    -1,
-      59,    -1,    -1,    62,   619,   620,    -1,   622,    67,    68,
-      69,    70,    71,     3,    73,    74,   631,    -1,     8,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    17,    -1,     8,
-      -1,    -1,    22,    23,    24,    -1,    -1,    -1,    17,    29,
-      -1,    -1,    -1,    22,    23,    24,    36,    -1,    -1,    -1,
-      29,    -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,    49,
-      50,    -1,    52,    53,    -1,    -1,    56,    -1,     3,    59,
-      60,    -1,    -1,     8,    53,    -1,    -1,    -1,    -1,    69,
-      70,    71,    17,    73,    74,    -1,    -1,    22,    23,    24,
-      -1,    -1,    71,    -1,    29,    74,    -1,    -1,    -1,    -1,
-      -1,    36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    49,    50,    -1,    52,    53,    -1,
-      -1,    56,    -1,     3,    59,    -1,    -1,    -1,     8,    -1,
-      -1,    -1,    67,    -1,    69,    70,    71,    17,    73,    74,
-      -1,    -1,    22,    23,    24,    -1,    -1,    -1,    -1,    29,
-      -1,    31,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    49,
-      50,    -1,    52,    53,    -1,    -1,    56,    -1,     3,    59,
-      -1,    -1,    -1,     8,    -1,    -1,    -1,    -1,    -1,    69,
-      70,    71,    17,    73,    74,    -1,    -1,    22,    23,    24,
-      -1,    26,    -1,    -1,    29,    -1,    -1,    -1,    -1,    -1,
-      -1,    36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    49,    50,    -1,    52,    53,    -1,
-      -1,    56,    -1,     3,    59,    -1,    -1,    -1,     8,    -1,
-      -1,    -1,    -1,    -1,    69,    70,    71,    17,    73,    74,
-      -1,    -1,    22,    23,    24,    -1,    26,    -1,    -1,    29,
-      -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     3,    -1,    -1,    49,
-      50,     8,    52,    53,    -1,    -1,    56,    -1,    -1,    59,
-      17,    -1,    -1,    -1,    -1,    22,    23,    24,    -1,    69,
-      70,    71,    29,    73,    74,    -1,    -1,    -1,    -1,    36,
+      37,    37,    61,   142,    67,    37,    37,   201,   250,   143,
+     223,   377,   445,    28,   126,   126,   147,   204,   486,   135,
+     132,   453,   258,    61,    61,   263,   264,   321,   316,    61,
+     142,   267,   323,    31,   322,    51,   249,     3,    67,   275,
+      24,    59,    35,   279,     0,     3,   597,    11,    35,    95,
+       8,    97,    98,   289,    60,    49,    74,    37,     3,    17,
+      25,    24,    62,    25,    22,    23,    24,    83,    68,    75,
+       5,    29,    59,    89,    67,    59,   113,   114,   115,    24,
+      67,   113,   114,   115,    62,     5,     3,    21,   389,     5,
+     127,     1,     7,     7,    20,   127,   397,    12,    12,   136,
+     651,    59,   653,    24,   136,   573,    72,   144,   106,   172,
+       3,    75,   144,    71,   151,    73,    74,    36,    63,   151,
+      39,   159,   159,    63,     3,    35,    45,   159,    73,    74,
+      65,    24,   126,   113,   114,   115,   424,   174,   426,   255,
+      75,    67,   174,   172,   438,    65,    66,   127,    62,    65,
+     388,    62,   390,    68,    68,    75,   136,    67,     3,    75,
+     461,   199,   199,     7,   144,   598,    59,   199,    12,   382,
+      63,   151,    62,   605,    24,   643,   609,   610,    35,    24,
+      73,    74,     3,    62,    63,     3,   223,     7,   225,    68,
+      24,   223,    12,   225,   174,   437,    71,    94,    95,    62,
+      97,    98,    59,   504,   241,   220,   243,    67,    66,   241,
+      67,   243,   249,   207,   208,    60,   135,   249,    63,    53,
+      66,    62,   141,    24,    68,   516,   413,    68,    73,    74,
+     472,    66,   523,   420,   271,    59,    59,    72,   432,   271,
+      24,     3,    62,   223,     1,   225,   283,   283,    68,   286,
+     287,   283,   283,    59,   286,   287,   368,   368,   317,   560,
+      74,   241,    24,   243,   477,   399,   378,   378,   384,   249,
+     401,    64,    73,    74,    24,    59,   577,   578,    35,   317,
+     317,    24,    62,   519,    68,   317,   280,    59,    50,    73,
+      74,   271,    63,    35,    35,    35,   290,    59,   664,    62,
+      35,   602,    59,   283,    59,    68,   286,   287,     3,    62,
+      67,    73,    74,    67,   211,    68,    59,    59,    59,    59,
+     217,   218,    35,   360,    59,    67,    67,    67,   360,    24,
+      73,    74,    67,    72,   576,   372,   374,   374,   374,    75,
+     372,   632,   374,   374,    59,   382,    60,    40,    63,   386,
+     382,    44,    72,   416,   386,    50,    71,   570,    55,    56,
+      57,    58,    59,    60,     3,    62,    63,    40,   427,   406,
+     407,    44,   366,   367,   406,   407,    59,     8,    73,    74,
+     360,     5,    60,    60,    35,    75,   113,   114,   115,   427,
+     427,    62,   372,    60,   374,   427,    20,    62,    22,   593,
+     587,   211,   382,    24,    28,    59,   386,   217,   218,   136,
+      62,   405,    36,    72,    62,    39,     3,   144,    24,    43,
+      62,    45,    62,    67,   151,   419,   406,   407,    65,    53,
+      54,    24,   470,   470,   470,    62,    65,   334,   470,   470,
+     477,    66,    24,    67,   341,   477,    59,   174,   486,   486,
+     486,    67,   349,    59,   486,   486,   568,   568,   496,   496,
+      24,   158,   159,     9,   496,   384,    59,    73,    74,    71,
+      67,    17,    24,   392,     8,    21,    24,   396,    60,    24,
+      73,    74,    65,   520,    62,    31,    32,    62,   520,    53,
+     470,    73,    74,    62,    62,    59,    63,   477,   225,    60,
+      60,    53,    60,   127,    68,    60,   486,    59,    35,    73,
+      74,   135,    60,    60,   241,    60,    60,   141,    64,   143,
+     583,    73,    74,   147,   663,    73,    74,    68,    73,    74,
+      24,   341,    68,   570,    60,   573,   573,   573,   570,   349,
+     520,   573,   573,   440,   271,    60,    75,    68,   172,   446,
+     447,   663,   449,     8,    60,    75,   283,    60,    60,   286,
+     287,   458,    17,   460,   623,    59,    36,    22,    23,    24,
+      60,    68,     3,    24,    29,    62,   200,    72,    24,    73,
+      74,    36,   206,    60,    75,   623,   623,    62,   212,    60,
+     570,   623,    59,   573,    66,    60,   220,    60,    53,   223,
+      60,    62,    60,    60,    59,   643,   643,   643,    59,    59,
+     234,   643,   643,    59,    68,    60,    71,    59,    73,    74,
+      75,    34,    73,    74,    59,   249,   250,    73,    74,    62,
+     440,    44,    72,   360,    68,    48,   446,   447,    62,   449,
+      53,    54,    55,    56,    49,    62,    60,    59,   458,    68,
+     460,    60,   549,    68,    34,    14,    60,   281,    60,   386,
+     557,    62,    72,   643,    44,    60,    60,   564,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,     8,    60,   406,
+     407,    68,    31,    22,   583,   644,    17,   509,   525,   525,
+     243,    22,    23,    24,    39,   281,   213,   321,    29,    22,
+     597,   243,   384,   600,   601,    36,   159,   392,   372,   496,
+     441,   334,   334,   604,   463,   600,   212,    -1,   342,    -1,
+      -1,   459,    53,    49,    -1,    -1,    -1,    -1,    59,   353,
+      -1,    -1,    -1,    -1,    65,    61,    -1,    -1,    64,   549,
+      71,    -1,    73,    74,    75,    -1,    -1,   557,   372,    -1,
+     374,    -1,    -1,    -1,   651,   379,   653,    -1,   382,    -1,
+     384,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   392,    -1,
+      -1,    -1,   396,    -1,    -1,   399,    -1,   401,    -1,    -1,
+       8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    17,
+     600,   601,   416,   520,    22,    23,    24,    -1,    -1,    -1,
+      -1,    29,    -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,
+      -1,    -1,    -1,   437,   438,    -1,    -1,    -1,    -1,    -1,
+      -1,   445,   446,    -1,   448,    53,    -1,    -1,    -1,   453,
+      -1,    59,    -1,    -1,    -1,   459,    -1,    65,   462,   463,
+      -1,    -1,    -1,    71,    -1,    73,    74,    75,   472,   175,
+     176,   177,   178,   477,   180,   181,   182,    -1,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,    -1,   199,    -1,   201,    -1,   203,     4,     5,
+      34,   207,   208,   209,    38,    39,    40,    -1,    -1,    43,
+      44,    45,    46,    -1,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    -1,    -1,    -1,    -1,    33,    34,    -1,
+      36,    37,    38,    39,    40,    -1,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    65,
+      -1,    -1,    -1,    -1,    -1,    -1,   570,    -1,    -1,    75,
+      33,    34,   576,    -1,   280,    38,    39,    40,    -1,   583,
+      43,    44,    45,    46,   290,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,   598,    -1,   600,    -1,    -1,    -1,
+     604,   605,    -1,    -1,    -1,   609,   610,   313,    -1,    -1,
+      -1,   317,    -1,     0,     1,    -1,     3,   323,    -1,     6,
+      -1,     8,     9,    10,    -1,    -1,    13,    -1,    15,    16,
+      17,    18,    19,    20,    -1,    22,    23,    24,    -1,    -1,
+      27,    28,    29,    30,    31,    32,    -1,    -1,    -1,    36,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     366,   367,    49,    50,     8,    52,    53,    11,    -1,    56,
+      -1,    -1,    59,    17,    -1,    62,    -1,    -1,    22,    23,
+      24,    -1,    69,    70,    71,    29,    73,    74,    -1,     1,
+      -1,     3,    36,    -1,     6,     7,     8,     9,    10,   405,
+      12,    13,    -1,    15,    16,    17,    18,    19,    20,    53,
+      22,    23,    24,   419,    -1,    27,    28,    29,    30,    31,
+      32,   427,    -1,    -1,    36,    -1,   432,    71,    -1,    -1,
+      74,    -1,    -1,    -1,    -1,    -1,    -1,    49,    50,    -1,
+      52,    53,    -1,    -1,    56,    -1,    -1,    59,    -1,    -1,
+      62,    -1,    -1,    -1,    -1,    67,    68,    69,    70,    71,
+      -1,    73,    74,    -1,    -1,    -1,    -1,   473,   474,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,    -1,     3,
+      -1,    -1,     6,    -1,     8,     9,    10,    -1,    -1,    13,
+     496,    15,    16,    17,    18,    19,    20,    -1,    22,    23,
+      24,    -1,    -1,    27,    28,    29,    30,    31,    32,    -1,
+     516,    -1,    36,    -1,    -1,    -1,    -1,   523,   524,   525,
+      -1,    -1,    -1,    -1,    -1,    49,    50,    -1,    52,    53,
+      -1,    -1,    56,    -1,    -1,    59,    -1,    -1,    62,    -1,
+      -1,    -1,    -1,    67,    68,    69,    70,    71,    -1,    73,
+      74,    -1,     3,    -1,    -1,    -1,    -1,     8,    -1,    -1,
+      11,    -1,    -1,    -1,    -1,    -1,    17,    -1,    -1,    -1,
+      -1,    22,    23,    24,    -1,    -1,    -1,    -1,    29,     8,
+      -1,    -1,    -1,    -1,    -1,    36,    -1,   593,    17,    -1,
+      -1,    -1,    -1,    22,    23,    24,    -1,    -1,    49,    50,
+      29,    52,    53,    -1,    -1,    56,    -1,    36,    59,    -1,
+      -1,     3,    -1,    -1,   620,   621,     8,   623,    69,    70,
+      71,    -1,    73,    74,    53,    17,   632,    -1,    -1,    -1,
+      22,    23,    24,    -1,    -1,    -1,    65,    29,    -1,    -1,
+      -1,    -1,    71,    -1,    36,    74,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    49,    50,    -1,
+      52,    53,    -1,    -1,    56,    -1,     3,    59,    60,    -1,
+      -1,     8,    -1,    -1,    -1,    -1,    -1,    69,    70,    71,
+      17,    73,    74,    -1,    -1,    22,    23,    24,    -1,    -1,
+      -1,    -1,    29,    -1,    -1,    -1,    -1,    -1,    -1,    36,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    49,    50,    -1,    52,    53,    -1,    -1,    56,
       -1,     3,    59,    -1,    -1,    -1,     8,    -1,    -1,    -1,
       67,    -1,    69,    70,    71,    17,    73,    74,    -1,    -1,
-      22,    23,    24,    -1,    -1,    -1,    -1,    29,    -1,    -1,
+      22,    23,    24,    -1,    -1,    -1,    -1,    29,    -1,    31,
+      -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    49,    50,    -1,
+      52,    53,    -1,    -1,    56,    -1,     3,    59,    -1,    -1,
+      -1,     8,    -1,    -1,    -1,    -1,    -1,    69,    70,    71,
+      17,    73,    74,    -1,    -1,    22,    23,    24,    -1,    26,
+      -1,    -1,    29,    -1,    -1,    -1,    -1,    -1,    -1,    36,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    49,    50,    -1,    52,    53,    -1,    -1,    56,
+      -1,     3,    59,    -1,    -1,    -1,     8,    -1,    -1,    -1,
+      -1,    -1,    69,    70,    71,    17,    73,    74,    -1,    -1,
+      22,    23,    24,    -1,    26,    -1,    -1,    29,    -1,    -1,
       -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,     3,    -1,    -1,    49,    50,     8,
       52,    53,    -1,    -1,    56,    -1,    -1,    59,    17,    -1,
       -1,    -1,    -1,    22,    23,    24,    -1,    69,    70,    71,
       29,    73,    74,    -1,    -1,    -1,    -1,    36,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,    -1,    -1,
-      49,    50,     8,    52,    53,    -1,    -1,    56,    -1,    -1,
-      59,    17,    -1,    -1,    -1,    -1,    22,    23,    24,    -1,
-      69,    70,    71,    29,    73,    74,    -1,    -1,    -1,    -1,
-      36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    49,    50,     8,    52,    53,    -1,    -1,
-      56,    -1,    -1,    59,    17,    -1,    -1,    -1,    -1,    22,
-      23,    24,    -1,    69,    70,    71,    29,    73,    74,    -1,
-       8,    -1,    -1,    36,    -1,    -1,    -1,    -1,     8,    17,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      49,    50,    -1,    52,    53,    -1,    -1,    56,    -1,     3,
+      59,    -1,    -1,    -1,     8,    -1,    -1,    -1,    67,    -1,
+      69,    70,    71,    17,    73,    74,    -1,    -1,    22,    23,
+      24,    -1,    -1,    -1,    -1,    29,    -1,    -1,    -1,    -1,
+      -1,    -1,    36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,     3,    -1,    -1,    49,    50,     8,    52,    53,
+      -1,    -1,    56,    -1,    -1,    59,    17,    -1,    -1,    -1,
+      -1,    22,    23,    24,    -1,    69,    70,    71,    29,    73,
+      74,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,     3,    -1,    -1,    49,    50,
+       8,    52,    53,    -1,    -1,    56,    -1,    -1,    59,    17,
+      -1,    -1,    -1,    -1,    22,    23,    24,    -1,    69,    70,
+      71,    29,    73,    74,    -1,    -1,    -1,    -1,    36,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    49,    50,     8,    52,    53,    11,    -1,    56,    -1,
+      -1,    59,    17,    -1,    -1,    -1,    -1,    22,    23,    24,
+      -1,    69,    70,    71,    29,    73,    74,    -1,     8,    -1,
+      -1,    36,    -1,    -1,    -1,    -1,     8,    17,    -1,    -1,
+      -1,    -1,    22,    23,    24,    17,    -1,    -1,    53,    29,
+      22,    23,    24,    -1,    59,    -1,    36,    29,    -1,    -1,
+      -1,     8,    -1,    -1,    36,    -1,    71,    -1,    73,    74,
+      17,    -1,    -1,    53,    -1,    22,    23,    24,    -1,    59,
+      -1,    53,    29,    -1,    -1,    -1,    -1,    59,    -1,    36,
+      -1,    71,    -1,    73,    74,     8,    -1,    -1,    -1,    71,
+      -1,    73,    74,    -1,    17,    -1,    53,    -1,    -1,    22,
+      23,    24,    59,    -1,    -1,    -1,    29,    -1,    -1,    -1,
+       8,    -1,    -1,    36,    71,    -1,    73,    74,     8,    17,
       -1,    -1,    -1,    -1,    22,    23,    24,    17,    -1,    -1,
       53,    29,    22,    23,    24,    -1,    59,    -1,    36,    29,
-      -1,    -1,    -1,    -1,     8,    -1,    36,    -1,    71,    -1,
-      73,    74,    75,    17,    -1,    53,    -1,    -1,    22,    23,
-      24,    59,    -1,    53,    -1,    29,    -1,    -1,    -1,    59,
-      -1,     8,    36,    71,    -1,    73,    74,    -1,    -1,    -1,
-      17,    71,    -1,    73,    74,    22,    23,    24,    -1,    53,
-      -1,    -1,    29,    -1,    -1,    59,    -1,     8,    -1,    36,
-      -1,    -1,    -1,    -1,    -1,     8,    17,    71,    -1,    73,
-      74,    22,    23,    24,    17,    -1,    53,    -1,    29,    22,
-      23,    24,    59,    -1,    -1,    36,    29,    -1,    -1,    -1,
-       8,    -1,    -1,    36,    71,    -1,    73,    74,     8,    17,
-      -1,    11,    53,    -1,    22,    23,    24,    17,    59,    -1,
-      53,    29,    22,    23,    24,    -1,    59,    -1,    36,    29,
-      71,    -1,    73,    74,     8,    -1,    36,    -1,    71,    -1,
-      -1,    74,    -1,    17,    -1,    53,    -1,    -1,    22,    23,
-      24,    -1,    -1,    53,    -1,    29,    -1,    -1,    -1,    -1,
-      -1,    -1,    36,    71,    -1,    73,    74,    -1,    -1,    -1,
-      -1,    71,    34,    -1,    74,    -1,    38,    39,    40,    53,
-      -1,    43,    44,    45,    46,    59,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    -1,    -1,    71,    33,    34,
-      74,    36,    -1,    38,    39,    40,    -1,    -1,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    33,    34,    -1,    36,    -1,    38,    39,    40,    -1,
-      75,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    -1,    -1,    -1,    -1,    -1,
-      -1,    33,    34,    -1,    36,    -1,    38,    39,    40,    -1,
-      72,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    33,    34,    -1,    36,    -1,
-      38,    39,    40,    -1,    66,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    33,
-      34,    -1,    36,    -1,    38,    39,    40,    -1,    66,    43,
+      -1,    -1,    -1,     8,    -1,    -1,    36,    -1,    71,    -1,
+      73,    74,    17,    -1,    -1,    53,    -1,    22,    23,    24,
+      -1,    59,    -1,    53,    29,    -1,    -1,    -1,    -1,    59,
+      -1,    36,    -1,    71,    -1,    73,    74,     8,    -1,    -1,
+      -1,    71,    -1,    -1,    74,    -1,    17,    -1,    53,    -1,
+      -1,    22,    23,    24,    -1,    -1,    -1,    -1,    29,    -1,
+      -1,    -1,     8,    -1,    -1,    36,    71,    -1,    73,    74,
+      -1,    17,    -1,    -1,    -1,    -1,    22,    23,    24,    -1,
+      -1,    -1,    53,    29,    -1,    -1,    -1,    -1,    59,    -1,
+      36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      71,    -1,    -1,    74,    -1,    -1,    -1,    53,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    71,    33,    34,    74,    36,
+      -1,    38,    39,    40,    -1,    -1,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    33,
+      34,    -1,    36,    -1,    38,    39,    40,    -1,    75,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    -1,    -1,    -1,    -1,    -1,    -1,    33,
+      34,    -1,    36,    -1,    38,    39,    40,    -1,    72,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
       54,    55,    56,    33,    34,    -1,    36,    -1,    38,    39,
       40,    -1,    66,    43,    44,    45,    46,    47,    48,    49,
       50,    51,    52,    53,    54,    55,    56,    33,    34,    -1,
-      -1,    -1,    38,    39,    40,    -1,    -1,    43,    44,    45,
+      36,    -1,    38,    39,    40,    -1,    66,    43,    44,    45,
       46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    33,    34,    -1,    -1,    -1,    38,    39,    40,    -1,
-      -1,    43,    44,    45,    46,    -1,    48,    49,    50,    51,
-      52,    53,    54,    55,    56
+      56,    33,    34,    -1,    36,    -1,    38,    39,    40,    -1,
+      66,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,    56,    33,    34,    -1,    -1,    -1,
+      38,    39,    40,    -1,    -1,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1543,14 +1548,14 @@
      202,   198,   141,   207,    60,   183,   126,   126,    62,   179,
       59,   163,   116,    60,   187,    66,   103,    60,    60,   198,
      104,    60,   189,    62,   190,   146,   189,    67,   126,   133,
-     131,   132,    60,    72,    68,    60,    60,    59,    68,    62,
-      72,   202,    68,    62,    49,   202,    62,   198,    59,    59,
-     202,   210,   211,    68,   194,    60,   179,   119,   163,     5,
-      65,    66,    75,   183,   198,   198,    68,    68,    95,    60,
-      68,   130,   210,   195,   209,   202,   198,   208,   212,   195,
-     195,    60,    14,   117,   120,   126,   126,   189,    60,    60,
-      60,    60,   163,    20,   100,    66,    66,    68,   210,   210,
-     118,   112,   105
+     131,   132,    60,    66,    72,    68,    60,    60,    59,    68,
+      62,    72,   202,    68,    62,    49,   202,    62,   198,    59,
+      59,   202,   210,   211,    68,   194,    60,   179,   119,   163,
+       5,    65,    66,    75,   183,   198,   198,    68,    68,    95,
+      60,    68,   130,   192,   210,   195,   209,   202,   198,   208,
+     212,   195,   195,    60,    14,   117,   120,   126,   126,   189,
+      72,    60,    60,    60,    60,   163,    20,   100,    66,    66,
+      68,   210,   210,   118,   112,   105
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -3438,8 +3443,19 @@
 	}
     break;
 
-  case 134:
-#line 955 "go.y"
+  case 133:
+#line 954 "go.y"
+    {
+		if((yyvsp[(5) - (8)].node) == N)
+			yyerror("middle index required in 3-index slice");
+		if((yyvsp[(7) - (8)].node) == N)
+			yyerror("final index required in 3-index slice");
+		(yyval.node) = nod(OSLICE3, (yyvsp[(1) - (8)].node), nod(OKEY, (yyvsp[(3) - (8)].node), nod(OKEY, (yyvsp[(5) - (8)].node), (yyvsp[(7) - (8)].node))));
+	}
+    break;
+
+  case 135:
+#line 963 "go.y"
     {
 		// conversion
 		(yyval.node) = nod(OCALL, (yyvsp[(1) - (5)].node), N);
@@ -3447,8 +3463,8 @@
 	}
     break;
 
-  case 135:
-#line 961 "go.y"
+  case 136:
+#line 969 "go.y"
     {
 		(yyval.node) = (yyvsp[(3) - (5)].node);
 		(yyval.node)->right = (yyvsp[(1) - (5)].node);
@@ -3457,8 +3473,8 @@
 	}
     break;
 
-  case 136:
-#line 968 "go.y"
+  case 137:
+#line 976 "go.y"
     {
 		(yyval.node) = (yyvsp[(3) - (5)].node);
 		(yyval.node)->right = (yyvsp[(1) - (5)].node);
@@ -3466,8 +3482,8 @@
 	}
     break;
 
-  case 137:
-#line 974 "go.y"
+  case 138:
+#line 982 "go.y"
     {
 		yyerror("cannot parenthesize type in composite literal");
 		(yyval.node) = (yyvsp[(5) - (7)].node);
@@ -3476,8 +3492,8 @@
 	}
     break;
 
-  case 139:
-#line 983 "go.y"
+  case 140:
+#line 991 "go.y"
     {
 		// composite expression.
 		// make node early so we get the right line number.
@@ -3485,15 +3501,15 @@
 	}
     break;
 
-  case 140:
-#line 991 "go.y"
+  case 141:
+#line 999 "go.y"
     {
 		(yyval.node) = nod(OKEY, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));
 	}
     break;
 
-  case 141:
-#line 997 "go.y"
+  case 142:
+#line 1005 "go.y"
     {
 		// These nodes do not carry line numbers.
 		// Since a composite literal commonly spans several lines,
@@ -3512,15 +3528,7 @@
 	}
     break;
 
-  case 142:
-#line 1014 "go.y"
-    {
-		(yyval.node) = (yyvsp[(2) - (4)].node);
-		(yyval.node)->list = (yyvsp[(3) - (4)].list);
-	}
-    break;
-
-  case 144:
+  case 143:
 #line 1022 "go.y"
     {
 		(yyval.node) = (yyvsp[(2) - (4)].node);
@@ -3528,9 +3536,17 @@
 	}
     break;
 
-  case 146:
+  case 145:
 #line 1030 "go.y"
     {
+		(yyval.node) = (yyvsp[(2) - (4)].node);
+		(yyval.node)->list = (yyvsp[(3) - (4)].list);
+	}
+    break;
+
+  case 147:
+#line 1038 "go.y"
+    {
 		(yyval.node) = (yyvsp[(2) - (3)].node);
 		
 		// Need to know on lhs of := whether there are ( ).
@@ -3548,22 +3564,22 @@
 	}
     break;
 
-  case 150:
-#line 1056 "go.y"
+  case 151:
+#line 1064 "go.y"
     {
 		(yyval.i) = LBODY;
 	}
     break;
 
-  case 151:
-#line 1060 "go.y"
+  case 152:
+#line 1068 "go.y"
     {
 		(yyval.i) = '{';
 	}
     break;
 
-  case 152:
-#line 1071 "go.y"
+  case 153:
+#line 1079 "go.y"
     {
 		if((yyvsp[(1) - (1)].sym) == S)
 			(yyval.node) = N;
@@ -3572,22 +3588,22 @@
 	}
     break;
 
-  case 153:
-#line 1080 "go.y"
+  case 154:
+#line 1088 "go.y"
     {
 		(yyval.node) = dclname((yyvsp[(1) - (1)].sym));
 	}
     break;
 
-  case 154:
-#line 1085 "go.y"
+  case 155:
+#line 1093 "go.y"
     {
 		(yyval.node) = N;
 	}
     break;
 
-  case 156:
-#line 1092 "go.y"
+  case 157:
+#line 1100 "go.y"
     {
 		(yyval.sym) = (yyvsp[(1) - (1)].sym);
 		// during imports, unqualified non-exported identifiers are from builtinpkg
@@ -3596,15 +3612,15 @@
 	}
     break;
 
-  case 158:
-#line 1100 "go.y"
+  case 159:
+#line 1108 "go.y"
     {
 		(yyval.sym) = S;
 	}
     break;
 
-  case 159:
-#line 1106 "go.y"
+  case 160:
+#line 1114 "go.y"
     {
 		Pkg *p;
 
@@ -3619,8 +3635,8 @@
 	}
     break;
 
-  case 160:
-#line 1121 "go.y"
+  case 161:
+#line 1129 "go.y"
     {
 		(yyval.node) = oldname((yyvsp[(1) - (1)].sym));
 		if((yyval.node)->pack != N)
@@ -3628,44 +3644,44 @@
 	}
     break;
 
-  case 162:
-#line 1141 "go.y"
+  case 163:
+#line 1149 "go.y"
     {
 		yyerror("final argument in variadic function missing type");
 		(yyval.node) = nod(ODDD, typenod(typ(TINTER)), N);
 	}
     break;
 
-  case 163:
-#line 1146 "go.y"
+  case 164:
+#line 1154 "go.y"
     {
 		(yyval.node) = nod(ODDD, (yyvsp[(2) - (2)].node), N);
 	}
     break;
 
-  case 169:
-#line 1157 "go.y"
+  case 170:
+#line 1165 "go.y"
     {
 		(yyval.node) = nod(OTPAREN, (yyvsp[(2) - (3)].node), N);
 	}
     break;
 
-  case 173:
-#line 1166 "go.y"
+  case 174:
+#line 1174 "go.y"
     {
 		(yyval.node) = nod(OIND, (yyvsp[(2) - (2)].node), N);
 	}
     break;
 
-  case 178:
-#line 1176 "go.y"
+  case 179:
+#line 1184 "go.y"
     {
 		(yyval.node) = nod(OTPAREN, (yyvsp[(2) - (3)].node), N);
 	}
     break;
 
-  case 188:
-#line 1197 "go.y"
+  case 189:
+#line 1205 "go.y"
     {
 		if((yyvsp[(1) - (3)].node)->op == OPACK) {
 			Sym *s;
@@ -3678,61 +3694,61 @@
 	}
     break;
 
-  case 189:
-#line 1210 "go.y"
+  case 190:
+#line 1218 "go.y"
     {
 		(yyval.node) = nod(OTARRAY, (yyvsp[(2) - (4)].node), (yyvsp[(4) - (4)].node));
 	}
     break;
 
-  case 190:
-#line 1214 "go.y"
+  case 191:
+#line 1222 "go.y"
     {
 		// array literal of nelem
 		(yyval.node) = nod(OTARRAY, nod(ODDD, N, N), (yyvsp[(4) - (4)].node));
 	}
     break;
 
-  case 191:
-#line 1219 "go.y"
+  case 192:
+#line 1227 "go.y"
     {
 		(yyval.node) = nod(OTCHAN, (yyvsp[(2) - (2)].node), N);
 		(yyval.node)->etype = Cboth;
 	}
     break;
 
-  case 192:
-#line 1224 "go.y"
+  case 193:
+#line 1232 "go.y"
     {
 		(yyval.node) = nod(OTCHAN, (yyvsp[(3) - (3)].node), N);
 		(yyval.node)->etype = Csend;
 	}
     break;
 
-  case 193:
-#line 1229 "go.y"
+  case 194:
+#line 1237 "go.y"
     {
 		(yyval.node) = nod(OTMAP, (yyvsp[(3) - (5)].node), (yyvsp[(5) - (5)].node));
 	}
     break;
 
-  case 196:
-#line 1237 "go.y"
+  case 197:
+#line 1245 "go.y"
     {
 		(yyval.node) = nod(OIND, (yyvsp[(2) - (2)].node), N);
 	}
     break;
 
-  case 197:
-#line 1243 "go.y"
+  case 198:
+#line 1251 "go.y"
     {
 		(yyval.node) = nod(OTCHAN, (yyvsp[(3) - (3)].node), N);
 		(yyval.node)->etype = Crecv;
 	}
     break;
 
-  case 198:
-#line 1250 "go.y"
+  case 199:
+#line 1258 "go.y"
     {
 		(yyval.node) = nod(OTSTRUCT, N, N);
 		(yyval.node)->list = (yyvsp[(3) - (5)].list);
@@ -3740,16 +3756,16 @@
 	}
     break;
 
-  case 199:
-#line 1256 "go.y"
-    {
-		(yyval.node) = nod(OTSTRUCT, N, N);
-		fixlbrace((yyvsp[(2) - (3)].i));
-	}
-    break;
-
   case 200:
-#line 1263 "go.y"
+#line 1264 "go.y"
+    {
+		(yyval.node) = nod(OTSTRUCT, N, N);
+		fixlbrace((yyvsp[(2) - (3)].i));
+	}
+    break;
+
+  case 201:
+#line 1271 "go.y"
     {
 		(yyval.node) = nod(OTINTER, N, N);
 		(yyval.node)->list = (yyvsp[(3) - (5)].list);
@@ -3757,16 +3773,16 @@
 	}
     break;
 
-  case 201:
-#line 1269 "go.y"
+  case 202:
+#line 1277 "go.y"
     {
 		(yyval.node) = nod(OTINTER, N, N);
 		fixlbrace((yyvsp[(2) - (3)].i));
 	}
     break;
 
-  case 202:
-#line 1280 "go.y"
+  case 203:
+#line 1288 "go.y"
     {
 		(yyval.node) = (yyvsp[(2) - (3)].node);
 		if((yyval.node) == N)
@@ -3780,8 +3796,8 @@
 	}
     break;
 
-  case 203:
-#line 1294 "go.y"
+  case 204:
+#line 1302 "go.y"
     {
 		Node *t;
 
@@ -3812,8 +3828,8 @@
 	}
     break;
 
-  case 204:
-#line 1323 "go.y"
+  case 205:
+#line 1331 "go.y"
     {
 		Node *rcvr, *t;
 
@@ -3853,8 +3869,8 @@
 	}
     break;
 
-  case 205:
-#line 1363 "go.y"
+  case 206:
+#line 1371 "go.y"
     {
 		Sym *s;
 		Type *t;
@@ -3881,8 +3897,8 @@
 	}
     break;
 
-  case 206:
-#line 1388 "go.y"
+  case 207:
+#line 1396 "go.y"
     {
 		(yyval.node) = methodname1(newname((yyvsp[(4) - (8)].sym)), (yyvsp[(2) - (8)].list)->n->right); 
 		(yyval.node)->type = functype((yyvsp[(2) - (8)].list)->n, (yyvsp[(6) - (8)].list), (yyvsp[(8) - (8)].list));
@@ -3900,8 +3916,8 @@
 	}
     break;
 
-  case 207:
-#line 1406 "go.y"
+  case 208:
+#line 1414 "go.y"
     {
 		(yyvsp[(3) - (5)].list) = checkarglist((yyvsp[(3) - (5)].list), 1);
 		(yyval.node) = nod(OTFUNC, N, N);
@@ -3910,15 +3926,15 @@
 	}
     break;
 
-  case 208:
-#line 1414 "go.y"
+  case 209:
+#line 1422 "go.y"
     {
 		(yyval.list) = nil;
 	}
     break;
 
-  case 209:
-#line 1418 "go.y"
+  case 210:
+#line 1426 "go.y"
     {
 		(yyval.list) = (yyvsp[(2) - (3)].list);
 		if((yyval.list) == nil)
@@ -3926,59 +3942,59 @@
 	}
     break;
 
-  case 210:
-#line 1426 "go.y"
+  case 211:
+#line 1434 "go.y"
     {
 		(yyval.list) = nil;
 	}
     break;
 
-  case 211:
-#line 1430 "go.y"
+  case 212:
+#line 1438 "go.y"
     {
 		(yyval.list) = list1(nod(ODCLFIELD, N, (yyvsp[(1) - (1)].node)));
 	}
     break;
 
-  case 212:
-#line 1434 "go.y"
+  case 213:
+#line 1442 "go.y"
     {
 		(yyvsp[(2) - (3)].list) = checkarglist((yyvsp[(2) - (3)].list), 0);
 		(yyval.list) = (yyvsp[(2) - (3)].list);
 	}
     break;
 
-  case 213:
-#line 1441 "go.y"
+  case 214:
+#line 1449 "go.y"
     {
 		closurehdr((yyvsp[(1) - (1)].node));
 	}
     break;
 
-  case 214:
-#line 1447 "go.y"
+  case 215:
+#line 1455 "go.y"
     {
 		(yyval.node) = closurebody((yyvsp[(3) - (4)].list));
 		fixlbrace((yyvsp[(2) - (4)].i));
 	}
     break;
 
-  case 215:
-#line 1452 "go.y"
+  case 216:
+#line 1460 "go.y"
     {
 		(yyval.node) = closurebody(nil);
 	}
     break;
 
-  case 216:
-#line 1463 "go.y"
+  case 217:
+#line 1471 "go.y"
     {
 		(yyval.list) = nil;
 	}
     break;
 
-  case 217:
-#line 1467 "go.y"
+  case 218:
+#line 1475 "go.y"
     {
 		(yyval.list) = concat((yyvsp[(1) - (3)].list), (yyvsp[(2) - (3)].list));
 		if(nsyntaxerrors == 0)
@@ -3988,57 +4004,57 @@
 	}
     break;
 
-  case 219:
-#line 1478 "go.y"
-    {
-		(yyval.list) = concat((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list));
-	}
-    break;
-
-  case 221:
-#line 1485 "go.y"
+  case 220:
+#line 1486 "go.y"
     {
 		(yyval.list) = concat((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list));
 	}
     break;
 
   case 222:
-#line 1491 "go.y"
-    {
-		(yyval.list) = list1((yyvsp[(1) - (1)].node));
-	}
-    break;
-
-  case 223:
-#line 1495 "go.y"
-    {
-		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
-	}
-    break;
-
-  case 225:
-#line 1502 "go.y"
+#line 1493 "go.y"
     {
 		(yyval.list) = concat((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list));
 	}
     break;
 
-  case 226:
-#line 1508 "go.y"
+  case 223:
+#line 1499 "go.y"
     {
 		(yyval.list) = list1((yyvsp[(1) - (1)].node));
 	}
     break;
 
-  case 227:
-#line 1512 "go.y"
+  case 224:
+#line 1503 "go.y"
     {
 		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
 	}
     break;
 
+  case 226:
+#line 1510 "go.y"
+    {
+		(yyval.list) = concat((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list));
+	}
+    break;
+
+  case 227:
+#line 1516 "go.y"
+    {
+		(yyval.list) = list1((yyvsp[(1) - (1)].node));
+	}
+    break;
+
   case 228:
-#line 1518 "go.y"
+#line 1520 "go.y"
+    {
+		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
+	}
+    break;
+
+  case 229:
+#line 1526 "go.y"
     {
 		NodeList *l;
 
@@ -4063,16 +4079,16 @@
 	}
     break;
 
-  case 229:
-#line 1541 "go.y"
+  case 230:
+#line 1549 "go.y"
     {
 		(yyvsp[(1) - (2)].node)->val = (yyvsp[(2) - (2)].val);
 		(yyval.list) = list1((yyvsp[(1) - (2)].node));
 	}
     break;
 
-  case 230:
-#line 1546 "go.y"
+  case 231:
+#line 1554 "go.y"
     {
 		(yyvsp[(2) - (4)].node)->val = (yyvsp[(4) - (4)].val);
 		(yyval.list) = list1((yyvsp[(2) - (4)].node));
@@ -4080,8 +4096,8 @@
 	}
     break;
 
-  case 231:
-#line 1552 "go.y"
+  case 232:
+#line 1560 "go.y"
     {
 		(yyvsp[(2) - (3)].node)->right = nod(OIND, (yyvsp[(2) - (3)].node)->right, N);
 		(yyvsp[(2) - (3)].node)->val = (yyvsp[(3) - (3)].val);
@@ -4089,18 +4105,8 @@
 	}
     break;
 
-  case 232:
-#line 1558 "go.y"
-    {
-		(yyvsp[(3) - (5)].node)->right = nod(OIND, (yyvsp[(3) - (5)].node)->right, N);
-		(yyvsp[(3) - (5)].node)->val = (yyvsp[(5) - (5)].val);
-		(yyval.list) = list1((yyvsp[(3) - (5)].node));
-		yyerror("cannot parenthesize embedded type");
-	}
-    break;
-
   case 233:
-#line 1565 "go.y"
+#line 1566 "go.y"
     {
 		(yyvsp[(3) - (5)].node)->right = nod(OIND, (yyvsp[(3) - (5)].node)->right, N);
 		(yyvsp[(3) - (5)].node)->val = (yyvsp[(5) - (5)].val);
@@ -4110,7 +4116,17 @@
     break;
 
   case 234:
-#line 1574 "go.y"
+#line 1573 "go.y"
+    {
+		(yyvsp[(3) - (5)].node)->right = nod(OIND, (yyvsp[(3) - (5)].node)->right, N);
+		(yyvsp[(3) - (5)].node)->val = (yyvsp[(5) - (5)].val);
+		(yyval.list) = list1((yyvsp[(3) - (5)].node));
+		yyerror("cannot parenthesize embedded type");
+	}
+    break;
+
+  case 235:
+#line 1582 "go.y"
     {
 		Node *n;
 
@@ -4121,8 +4137,8 @@
 	}
     break;
 
-  case 235:
-#line 1583 "go.y"
+  case 236:
+#line 1591 "go.y"
     {
 		Pkg *pkg;
 
@@ -4137,38 +4153,38 @@
 	}
     break;
 
-  case 236:
-#line 1598 "go.y"
+  case 237:
+#line 1606 "go.y"
     {
 		(yyval.node) = embedded((yyvsp[(1) - (1)].sym));
 	}
     break;
 
-  case 237:
-#line 1604 "go.y"
+  case 238:
+#line 1612 "go.y"
     {
 		(yyval.node) = nod(ODCLFIELD, (yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node));
 		ifacedcl((yyval.node));
 	}
     break;
 
-  case 238:
-#line 1609 "go.y"
+  case 239:
+#line 1617 "go.y"
     {
 		(yyval.node) = nod(ODCLFIELD, N, oldname((yyvsp[(1) - (1)].sym)));
 	}
     break;
 
-  case 239:
-#line 1613 "go.y"
+  case 240:
+#line 1621 "go.y"
     {
 		(yyval.node) = nod(ODCLFIELD, N, oldname((yyvsp[(2) - (3)].sym)));
 		yyerror("cannot parenthesize embedded type");
 	}
     break;
 
-  case 240:
-#line 1620 "go.y"
+  case 241:
+#line 1628 "go.y"
     {
 		// without func keyword
 		(yyvsp[(2) - (4)].list) = checkarglist((yyvsp[(2) - (4)].list), 1);
@@ -4178,17 +4194,8 @@
 	}
     break;
 
-  case 242:
-#line 1634 "go.y"
-    {
-		(yyval.node) = nod(ONONAME, N, N);
-		(yyval.node)->sym = (yyvsp[(1) - (2)].sym);
-		(yyval.node) = nod(OKEY, (yyval.node), (yyvsp[(2) - (2)].node));
-	}
-    break;
-
   case 243:
-#line 1640 "go.y"
+#line 1642 "go.y"
     {
 		(yyval.node) = nod(ONONAME, N, N);
 		(yyval.node)->sym = (yyvsp[(1) - (2)].sym);
@@ -4196,65 +4203,74 @@
 	}
     break;
 
-  case 245:
-#line 1649 "go.y"
+  case 244:
+#line 1648 "go.y"
+    {
+		(yyval.node) = nod(ONONAME, N, N);
+		(yyval.node)->sym = (yyvsp[(1) - (2)].sym);
+		(yyval.node) = nod(OKEY, (yyval.node), (yyvsp[(2) - (2)].node));
+	}
+    break;
+
+  case 246:
+#line 1657 "go.y"
     {
 		(yyval.list) = list1((yyvsp[(1) - (1)].node));
 	}
     break;
 
-  case 246:
-#line 1653 "go.y"
+  case 247:
+#line 1661 "go.y"
     {
 		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
 	}
     break;
 
-  case 247:
-#line 1658 "go.y"
+  case 248:
+#line 1666 "go.y"
     {
 		(yyval.list) = nil;
 	}
     break;
 
-  case 248:
-#line 1662 "go.y"
-    {
-		(yyval.list) = (yyvsp[(1) - (2)].list);
-	}
-    break;
-
   case 249:
 #line 1670 "go.y"
     {
+		(yyval.list) = (yyvsp[(1) - (2)].list);
+	}
+    break;
+
+  case 250:
+#line 1678 "go.y"
+    {
 		(yyval.node) = N;
 	}
     break;
 
-  case 251:
-#line 1675 "go.y"
+  case 252:
+#line 1683 "go.y"
     {
 		(yyval.node) = liststmt((yyvsp[(1) - (1)].list));
 	}
     break;
 
-  case 253:
-#line 1680 "go.y"
+  case 254:
+#line 1688 "go.y"
     {
 		(yyval.node) = N;
 	}
     break;
 
-  case 259:
-#line 1691 "go.y"
+  case 260:
+#line 1699 "go.y"
     {
 		(yyvsp[(1) - (2)].node) = nod(OLABEL, (yyvsp[(1) - (2)].node), N);
 		(yyvsp[(1) - (2)].node)->sym = dclstack;  // context, for goto restrictions
 	}
     break;
 
-  case 260:
-#line 1696 "go.y"
+  case 261:
+#line 1704 "go.y"
     {
 		NodeList *l;
 
@@ -4266,52 +4282,52 @@
 	}
     break;
 
-  case 261:
-#line 1706 "go.y"
+  case 262:
+#line 1714 "go.y"
     {
 		// will be converted to OFALL
 		(yyval.node) = nod(OXFALL, N, N);
 	}
     break;
 
-  case 262:
-#line 1711 "go.y"
+  case 263:
+#line 1719 "go.y"
     {
 		(yyval.node) = nod(OBREAK, (yyvsp[(2) - (2)].node), N);
 	}
     break;
 
-  case 263:
-#line 1715 "go.y"
+  case 264:
+#line 1723 "go.y"
     {
 		(yyval.node) = nod(OCONTINUE, (yyvsp[(2) - (2)].node), N);
 	}
     break;
 
-  case 264:
-#line 1719 "go.y"
+  case 265:
+#line 1727 "go.y"
     {
 		(yyval.node) = nod(OPROC, (yyvsp[(2) - (2)].node), N);
 	}
     break;
 
-  case 265:
-#line 1723 "go.y"
+  case 266:
+#line 1731 "go.y"
     {
 		(yyval.node) = nod(ODEFER, (yyvsp[(2) - (2)].node), N);
 	}
     break;
 
-  case 266:
-#line 1727 "go.y"
+  case 267:
+#line 1735 "go.y"
     {
 		(yyval.node) = nod(OGOTO, (yyvsp[(2) - (2)].node), N);
 		(yyval.node)->sym = dclstack;  // context, for goto restrictions
 	}
     break;
 
-  case 267:
-#line 1732 "go.y"
+  case 268:
+#line 1740 "go.y"
     {
 		(yyval.node) = nod(ORETURN, N, N);
 		(yyval.node)->list = (yyvsp[(2) - (2)].list);
@@ -4330,8 +4346,8 @@
 	}
     break;
 
-  case 268:
-#line 1751 "go.y"
+  case 269:
+#line 1759 "go.y"
     {
 		(yyval.list) = nil;
 		if((yyvsp[(1) - (1)].node) != N)
@@ -4339,8 +4355,8 @@
 	}
     break;
 
-  case 269:
-#line 1757 "go.y"
+  case 270:
+#line 1765 "go.y"
     {
 		(yyval.list) = (yyvsp[(1) - (3)].list);
 		if((yyvsp[(3) - (3)].node) != N)
@@ -4348,190 +4364,190 @@
 	}
     break;
 
-  case 270:
-#line 1765 "go.y"
+  case 271:
+#line 1773 "go.y"
     {
 		(yyval.list) = list1((yyvsp[(1) - (1)].node));
 	}
     break;
 
-  case 271:
-#line 1769 "go.y"
-    {
-		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
-	}
-    break;
-
   case 272:
-#line 1775 "go.y"
+#line 1777 "go.y"
     {
-		(yyval.list) = list1((yyvsp[(1) - (1)].node));
+		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
 	}
     break;
 
   case 273:
-#line 1779 "go.y"
+#line 1783 "go.y"
     {
-		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
+		(yyval.list) = list1((yyvsp[(1) - (1)].node));
 	}
     break;
 
   case 274:
-#line 1785 "go.y"
+#line 1787 "go.y"
     {
-		(yyval.list) = list1((yyvsp[(1) - (1)].node));
+		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
 	}
     break;
 
   case 275:
-#line 1789 "go.y"
+#line 1793 "go.y"
     {
-		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
+		(yyval.list) = list1((yyvsp[(1) - (1)].node));
 	}
     break;
 
   case 276:
-#line 1795 "go.y"
-    {
-		(yyval.list) = list1((yyvsp[(1) - (1)].node));
-	}
-    break;
-
-  case 277:
-#line 1799 "go.y"
+#line 1797 "go.y"
     {
 		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
 	}
     break;
 
-  case 278:
-#line 1808 "go.y"
+  case 277:
+#line 1803 "go.y"
     {
 		(yyval.list) = list1((yyvsp[(1) - (1)].node));
 	}
     break;
 
+  case 278:
+#line 1807 "go.y"
+    {
+		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
+	}
+    break;
+
   case 279:
-#line 1812 "go.y"
+#line 1816 "go.y"
     {
 		(yyval.list) = list1((yyvsp[(1) - (1)].node));
 	}
     break;
 
   case 280:
-#line 1816 "go.y"
+#line 1820 "go.y"
     {
-		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
+		(yyval.list) = list1((yyvsp[(1) - (1)].node));
 	}
     break;
 
   case 281:
-#line 1820 "go.y"
+#line 1824 "go.y"
     {
 		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
 	}
     break;
 
   case 282:
-#line 1825 "go.y"
+#line 1828 "go.y"
+    {
+		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
+	}
+    break;
+
+  case 283:
+#line 1833 "go.y"
     {
 		(yyval.list) = nil;
 	}
     break;
 
-  case 283:
-#line 1829 "go.y"
+  case 284:
+#line 1837 "go.y"
     {
 		(yyval.list) = (yyvsp[(1) - (2)].list);
 	}
     break;
 
-  case 288:
-#line 1843 "go.y"
+  case 289:
+#line 1851 "go.y"
     {
 		(yyval.node) = N;
 	}
     break;
 
-  case 290:
-#line 1849 "go.y"
+  case 291:
+#line 1857 "go.y"
     {
 		(yyval.list) = nil;
 	}
     break;
 
-  case 292:
-#line 1855 "go.y"
+  case 293:
+#line 1863 "go.y"
     {
 		(yyval.node) = N;
 	}
     break;
 
-  case 294:
-#line 1861 "go.y"
+  case 295:
+#line 1869 "go.y"
     {
 		(yyval.list) = nil;
 	}
     break;
 
-  case 296:
-#line 1867 "go.y"
+  case 297:
+#line 1875 "go.y"
     {
 		(yyval.list) = nil;
 	}
     break;
 
-  case 298:
-#line 1873 "go.y"
+  case 299:
+#line 1881 "go.y"
     {
 		(yyval.list) = nil;
 	}
     break;
 
-  case 300:
-#line 1879 "go.y"
+  case 301:
+#line 1887 "go.y"
     {
 		(yyval.val).ctype = CTxxx;
 	}
     break;
 
-  case 302:
-#line 1889 "go.y"
+  case 303:
+#line 1897 "go.y"
     {
 		importimport((yyvsp[(2) - (4)].sym), (yyvsp[(3) - (4)].val).u.sval);
 	}
     break;
 
-  case 303:
-#line 1893 "go.y"
+  case 304:
+#line 1901 "go.y"
     {
 		importvar((yyvsp[(2) - (4)].sym), (yyvsp[(3) - (4)].type));
 	}
     break;
 
-  case 304:
-#line 1897 "go.y"
+  case 305:
+#line 1905 "go.y"
     {
 		importconst((yyvsp[(2) - (5)].sym), types[TIDEAL], (yyvsp[(4) - (5)].node));
 	}
     break;
 
-  case 305:
-#line 1901 "go.y"
+  case 306:
+#line 1909 "go.y"
     {
 		importconst((yyvsp[(2) - (6)].sym), (yyvsp[(3) - (6)].type), (yyvsp[(5) - (6)].node));
 	}
     break;
 
-  case 306:
-#line 1905 "go.y"
+  case 307:
+#line 1913 "go.y"
     {
 		importtype((yyvsp[(2) - (4)].type), (yyvsp[(3) - (4)].type));
 	}
     break;
 
-  case 307:
-#line 1909 "go.y"
+  case 308:
+#line 1917 "go.y"
     {
 		if((yyvsp[(2) - (4)].node) == N) {
 			dclcontext = PEXTERN;  // since we skip the funcbody below
@@ -4551,31 +4567,31 @@
 	}
     break;
 
-  case 308:
-#line 1929 "go.y"
+  case 309:
+#line 1937 "go.y"
     {
 		(yyval.sym) = (yyvsp[(1) - (1)].sym);
 		structpkg = (yyval.sym)->pkg;
 	}
     break;
 
-  case 309:
-#line 1936 "go.y"
+  case 310:
+#line 1944 "go.y"
     {
 		(yyval.type) = pkgtype((yyvsp[(1) - (1)].sym));
 		importsym((yyvsp[(1) - (1)].sym), OTYPE);
 	}
     break;
 
-  case 315:
-#line 1956 "go.y"
+  case 316:
+#line 1964 "go.y"
     {
 		(yyval.type) = pkgtype((yyvsp[(1) - (1)].sym));
 	}
     break;
 
-  case 316:
-#line 1960 "go.y"
+  case 317:
+#line 1968 "go.y"
     {
 		// predefined name like uint8
 		(yyvsp[(1) - (1)].sym) = pkglookup((yyvsp[(1) - (1)].sym)->name, builtinpkg);
@@ -4587,50 +4603,50 @@
 	}
     break;
 
-  case 317:
-#line 1970 "go.y"
+  case 318:
+#line 1978 "go.y"
     {
 		(yyval.type) = aindex(N, (yyvsp[(3) - (3)].type));
 	}
     break;
 
-  case 318:
-#line 1974 "go.y"
+  case 319:
+#line 1982 "go.y"
     {
 		(yyval.type) = aindex(nodlit((yyvsp[(2) - (4)].val)), (yyvsp[(4) - (4)].type));
 	}
     break;
 
-  case 319:
-#line 1978 "go.y"
+  case 320:
+#line 1986 "go.y"
     {
 		(yyval.type) = maptype((yyvsp[(3) - (5)].type), (yyvsp[(5) - (5)].type));
 	}
     break;
 
-  case 320:
-#line 1982 "go.y"
+  case 321:
+#line 1990 "go.y"
     {
 		(yyval.type) = tostruct((yyvsp[(3) - (4)].list));
 	}
     break;
 
-  case 321:
-#line 1986 "go.y"
+  case 322:
+#line 1994 "go.y"
     {
 		(yyval.type) = tointerface((yyvsp[(3) - (4)].list));
 	}
     break;
 
-  case 322:
-#line 1990 "go.y"
+  case 323:
+#line 1998 "go.y"
     {
 		(yyval.type) = ptrto((yyvsp[(2) - (2)].type));
 	}
     break;
 
-  case 323:
-#line 1994 "go.y"
+  case 324:
+#line 2002 "go.y"
     {
 		(yyval.type) = typ(TCHAN);
 		(yyval.type)->type = (yyvsp[(2) - (2)].type);
@@ -4638,8 +4654,8 @@
 	}
     break;
 
-  case 324:
-#line 2000 "go.y"
+  case 325:
+#line 2008 "go.y"
     {
 		(yyval.type) = typ(TCHAN);
 		(yyval.type)->type = (yyvsp[(3) - (4)].type);
@@ -4647,33 +4663,33 @@
 	}
     break;
 
-  case 325:
-#line 2006 "go.y"
-    {
-		(yyval.type) = typ(TCHAN);
-		(yyval.type)->type = (yyvsp[(3) - (3)].type);
-		(yyval.type)->chan = Csend;
-	}
-    break;
-
   case 326:
 #line 2014 "go.y"
     {
 		(yyval.type) = typ(TCHAN);
 		(yyval.type)->type = (yyvsp[(3) - (3)].type);
-		(yyval.type)->chan = Crecv;
+		(yyval.type)->chan = Csend;
 	}
     break;
 
   case 327:
 #line 2022 "go.y"
     {
-		(yyval.type) = functype(nil, (yyvsp[(3) - (5)].list), (yyvsp[(5) - (5)].list));
+		(yyval.type) = typ(TCHAN);
+		(yyval.type)->type = (yyvsp[(3) - (3)].type);
+		(yyval.type)->chan = Crecv;
 	}
     break;
 
   case 328:
-#line 2028 "go.y"
+#line 2030 "go.y"
+    {
+		(yyval.type) = functype(nil, (yyvsp[(3) - (5)].list), (yyvsp[(5) - (5)].list));
+	}
+    break;
+
+  case 329:
+#line 2036 "go.y"
     {
 		(yyval.node) = nod(ODCLFIELD, N, typenod((yyvsp[(2) - (3)].type)));
 		if((yyvsp[(1) - (3)].sym))
@@ -4682,8 +4698,8 @@
 	}
     break;
 
-  case 329:
-#line 2035 "go.y"
+  case 330:
+#line 2043 "go.y"
     {
 		Type *t;
 	
@@ -4699,8 +4715,8 @@
 	}
     break;
 
-  case 330:
-#line 2051 "go.y"
+  case 331:
+#line 2059 "go.y"
     {
 		Sym *s;
 
@@ -4718,50 +4734,50 @@
 	}
     break;
 
-  case 331:
-#line 2069 "go.y"
+  case 332:
+#line 2077 "go.y"
     {
 		(yyval.node) = nod(ODCLFIELD, newname((yyvsp[(1) - (5)].sym)), typenod(functype(fakethis(), (yyvsp[(3) - (5)].list), (yyvsp[(5) - (5)].list))));
 	}
     break;
 
-  case 332:
-#line 2073 "go.y"
+  case 333:
+#line 2081 "go.y"
     {
 		(yyval.node) = nod(ODCLFIELD, N, typenod((yyvsp[(1) - (1)].type)));
 	}
     break;
 
-  case 333:
-#line 2078 "go.y"
+  case 334:
+#line 2086 "go.y"
     {
 		(yyval.list) = nil;
 	}
     break;
 
-  case 335:
-#line 2085 "go.y"
+  case 336:
+#line 2093 "go.y"
     {
 		(yyval.list) = (yyvsp[(2) - (3)].list);
 	}
     break;
 
-  case 336:
-#line 2089 "go.y"
+  case 337:
+#line 2097 "go.y"
     {
 		(yyval.list) = list1(nod(ODCLFIELD, N, typenod((yyvsp[(1) - (1)].type))));
 	}
     break;
 
-  case 337:
-#line 2099 "go.y"
+  case 338:
+#line 2107 "go.y"
     {
 		(yyval.node) = nodlit((yyvsp[(1) - (1)].val));
 	}
     break;
 
-  case 338:
-#line 2103 "go.y"
+  case 339:
+#line 2111 "go.y"
     {
 		(yyval.node) = nodlit((yyvsp[(2) - (2)].val));
 		switch((yyval.node)->val.ctype){
@@ -4778,8 +4794,8 @@
 	}
     break;
 
-  case 339:
-#line 2118 "go.y"
+  case 340:
+#line 2126 "go.y"
     {
 		(yyval.node) = oldname(pkglookup((yyvsp[(1) - (1)].sym)->name, builtinpkg));
 		if((yyval.node)->op != OLITERAL)
@@ -4787,8 +4803,8 @@
 	}
     break;
 
-  case 341:
-#line 2127 "go.y"
+  case 342:
+#line 2135 "go.y"
     {
 		if((yyvsp[(2) - (5)].node)->val.ctype == CTRUNE && (yyvsp[(4) - (5)].node)->val.ctype == CTINT) {
 			(yyval.node) = (yyvsp[(2) - (5)].node);
@@ -4801,43 +4817,43 @@
 	}
     break;
 
-  case 344:
-#line 2143 "go.y"
+  case 345:
+#line 2151 "go.y"
     {
 		(yyval.list) = list1((yyvsp[(1) - (1)].node));
 	}
     break;
 
-  case 345:
-#line 2147 "go.y"
-    {
-		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
-	}
-    break;
-
   case 346:
-#line 2153 "go.y"
-    {
-		(yyval.list) = list1((yyvsp[(1) - (1)].node));
-	}
-    break;
-
-  case 347:
-#line 2157 "go.y"
+#line 2155 "go.y"
     {
 		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
 	}
     break;
 
-  case 348:
-#line 2163 "go.y"
+  case 347:
+#line 2161 "go.y"
     {
 		(yyval.list) = list1((yyvsp[(1) - (1)].node));
 	}
     break;
 
+  case 348:
+#line 2165 "go.y"
+    {
+		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
+	}
+    break;
+
   case 349:
-#line 2167 "go.y"
+#line 2171 "go.y"
+    {
+		(yyval.list) = list1((yyvsp[(1) - (1)].node));
+	}
+    break;
+
+  case 350:
+#line 2175 "go.y"
     {
 		(yyval.list) = list((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node));
 	}
@@ -4845,7 +4861,7 @@
 
 
 /* Line 1267 of yacc.c.  */
-#line 4850 "y.tab.c"
+#line 4866 "y.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -5059,7 +5075,7 @@
 }
 
 
-#line 2171 "go.y"
+#line 2179 "go.y"
 
 
 static void
diff --git a/src/cmd/gc/yerr.h b/src/cmd/gc/yerr.h
index 4cbbd39..d575afd 100644
--- a/src/cmd/gc/yerr.h
+++ b/src/cmd/gc/yerr.h
@@ -74,6 +74,6 @@
 	112, LNAME,
 	"nested func not allowed",
 
-	642, ';',
+	644, ';',
 	"else must be followed by if or statement block"
 };
diff --git a/test/fixedbugs/issue4251.go b/test/fixedbugs/issue4251.go
index a14e089..4adec2b 100644
--- a/test/fixedbugs/issue4251.go
+++ b/test/fixedbugs/issue4251.go
@@ -9,13 +9,13 @@
 package p
 
 func F1(s []byte) []byte {
-	return s[2:1]		// ERROR "inverted"
+	return s[2:1]		// ERROR "invalid slice index"
 }
 
 func F2(a [10]byte) []byte {
-	return a[2:1]		// ERROR "inverted"
+	return a[2:1]		// ERROR "invalid slice index"
 }
 
 func F3(s string) string {
-	return s[2:1]		// ERROR "inverted"
+	return s[2:1]		// ERROR "invalid slice index"
 }
diff --git a/test/slice3.go b/test/slice3.go
new file mode 100644
index 0000000..3cf34b5
--- /dev/null
+++ b/test/slice3.go
@@ -0,0 +1,156 @@
+// runoutput
+
+// Copyright 2013 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test run-time behavior of 3-index slice expressions.
+
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+	"strconv"
+)
+
+var bout *bufio.Writer
+
+func main() {
+	bout = bufio.NewWriter(os.Stdout)
+	
+	fmt.Fprintf(bout, "%s", programTop)
+	fmt.Fprintf(bout, "func main() {\n")
+	
+	index := []string{
+		"0",
+		"1",
+		"2",
+		"3",
+		"10",
+		"20",
+		"vminus1",
+		"v0",
+		"v1",
+		"v2",
+		"v3",
+		"v10",
+		"v20",
+	}
+	
+	parse := func(s string) (n int, isconst bool) {
+		if s == "vminus1" {
+			return -1, false
+		}
+		isconst = true
+		if s[0] == 'v' {
+			isconst = false
+			s = s[1:]
+		}
+		n, _ = strconv.Atoi(s)
+		return n, isconst
+	}
+
+	const Cap = 10 // cap of slice, array
+
+	for _, base := range []string{"array", "slice"} {
+		for _, i := range index {
+			iv, iconst := parse(i)
+			for _, j := range index {
+				jv, jconst := parse(j)
+				for _, k := range index {
+					kv, kconst := parse(k)
+					// Avoid errors that would make the program not compile.
+					// Those are tested by slice3err.go.
+					switch {
+					case iconst && jconst && iv > jv,
+						jconst && kconst && jv > kv,
+						iconst && kconst && iv > kv,
+						iconst && base == "array" && iv > Cap,
+						jconst && base == "array" && jv > Cap,
+						kconst && base == "array" && kv > Cap:				
+						continue
+					}
+
+					expr := base + "[" + i + ":" + j + ":" + k + "]"
+					var xbase, xlen, xcap int
+					if iv > jv || jv > kv || kv > Cap || iv < 0 || jv < 0 || kv < 0 {
+						xbase, xlen, xcap = -1, -1, -1
+					} else {
+						xbase = iv
+						xlen = jv - iv
+						xcap = kv - iv
+					}
+					fmt.Fprintf(bout, "\tcheckSlice(%q, func() []byte { return %s }, %d, %d, %d)\n", expr, expr, xbase, xlen, xcap)									
+				}
+			}
+		}
+	}
+
+	fmt.Fprintf(bout, "\tif !ok { os.Exit(1) }\n")
+	fmt.Fprintf(bout, "}\n")
+	bout.Flush()
+}
+
+var programTop = `
+package main
+
+import (
+	"fmt"
+	"os"
+	"unsafe"
+)
+
+var ok = true
+
+var (
+	array = new([10]byte)
+	slice = array[:]
+
+	vminus1 = -1
+	v0 = 0
+	v1 = 1
+	v2 = 2
+	v3 = 3
+	v4 = 4
+	v5 = 5
+	v10 = 10
+	v20 = 20
+)
+
+func notOK() {
+	if ok {
+		println("BUG:")
+		ok = false
+	}
+}
+
+func checkSlice(desc string, f func() []byte, xbase, xlen, xcap int) {
+	defer func() {
+		if err := recover(); err != nil {
+			if xbase >= 0 {
+				notOK()
+				println(desc, " unexpected panic: ", fmt.Sprint(err))
+			}
+		}
+		// "no panic" is checked below
+	}()
+	
+	x := f()
+
+	arrayBase := uintptr(unsafe.Pointer(array))
+	raw := *(*[3]uintptr)(unsafe.Pointer(&x))
+	base, len, cap := raw[0] - arrayBase, raw[1], raw[2]
+	if xbase < 0 {
+		notOK()
+		println(desc, "=", base, len, cap, "want panic")
+		return
+	}
+	if base != uintptr(xbase) || len != uintptr(xlen) || cap != uintptr(xcap) {
+		notOK()
+		println(desc, "=", base, len, cap, "want", xbase, xlen, xcap)
+	}
+}
+
+`
diff --git a/test/slice3err.go b/test/slice3err.go
new file mode 100644
index 0000000..c48ebfe
--- /dev/null
+++ b/test/slice3err.go
@@ -0,0 +1,121 @@
+// errorcheck
+
+// Copyright 2013 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+var array *[10]int
+var slice []int
+var str string
+var i, j, k int
+
+func f() {
+	// check what missing arguments are allowed
+	_ = array[:]
+	_ = array[i:]
+	_ = array[:j]
+	_ = array[i:j]
+	_ = array[::] // ERROR "middle index required in 3-index slice" "final index required in 3-index slice"
+	_ = array[i::] // ERROR "middle index required in 3-index slice" "final index required in 3-index slice"
+	_ = array[:j:] // ERROR "final index required in 3-index slice"
+	_ = array[i:j:] // ERROR  "final index required in 3-index slice"
+	_ = array[::k] // ERROR "middle index required in 3-index slice"
+	_ = array[i::k] // ERROR "middle index required in 3-index slice"
+	_ = array[:j:k]
+	_ = array[i:j:k]
+	
+	_ = slice[:]
+	_ = slice[i:]
+	_ = slice[:j]
+	_ = slice[i:j]
+	_ = slice[::] // ERROR "middle index required in 3-index slice" "final index required in 3-index slice"
+	_ = slice[i::] // ERROR "middle index required in 3-index slice" "final index required in 3-index slice"
+	_ = slice[:j:] // ERROR "final index required in 3-index slice"
+	_ = slice[i:j:] // ERROR "final index required in 3-index slice"
+	_ = slice[::k] // ERROR "middle index required in 3-index slice"
+	_ = slice[i::k] // ERROR "middle index required in 3-index slice"
+	_ = slice[:j:k]
+	_ = slice[i:j:k]
+	
+	_ = str[:]
+	_ = str[i:]
+	_ = str[:j]
+	_ = str[i:j]
+	_ = str[::] // ERROR "3-index slice of string" "middle index required in 3-index slice" "final index required in 3-index slice"
+	_ = str[i::] // ERROR "3-index slice of string" "middle index required in 3-index slice" "final index required in 3-index slice"
+	_ = str[:j:] // ERROR "3-index slice of string" "final index required in 3-index slice"
+	_ = str[i:j:] // ERROR "3-index slice of string" "final index required in 3-index slice"
+	_ = str[::k] // ERROR "3-index slice of string" "middle index required in 3-index slice"
+	_ = str[i::k] // ERROR "3-index slice of string" "middle index required in 3-index slice"
+	_ = str[:j:k] // ERROR "3-index slice of string"
+	_ = str[i:j:k] // ERROR "3-index slice of string"
+
+	// check invalid indices
+	_ = array[1:2]
+	_ = array[2:1] // ERROR "invalid slice index"
+	_ = array[2:2]
+	_ = array[i:1]
+	_ = array[1:j]
+	_ = array[1:2:3]
+	_ = array[1:3:2] // ERROR "invalid slice index"
+	_ = array[2:1:3] // ERROR "invalid slice index"
+	_ = array[2:3:1] // ERROR "invalid slice index"
+	_ = array[3:1:2] // ERROR "invalid slice index"
+	_ = array[3:2:1] // ERROR "invalid slice index"
+	_ = array[i:1:2]
+	_ = array[i:2:1] // ERROR "invalid slice index"
+	_ = array[1:j:2]
+	_ = array[2:j:1] // ERROR "invalid slice index"
+	_ = array[1:2:k]
+	_ = array[2:1:k] // ERROR "invalid slice index"
+	
+	_ = slice[1:2]
+	_ = slice[2:1] // ERROR "invalid slice index"
+	_ = slice[2:2]
+	_ = slice[i:1]
+	_ = slice[1:j]
+	_ = slice[1:2:3]
+	_ = slice[1:3:2] // ERROR "invalid slice index"
+	_ = slice[2:1:3] // ERROR "invalid slice index"
+	_ = slice[2:3:1] // ERROR "invalid slice index"
+	_ = slice[3:1:2] // ERROR "invalid slice index"
+	_ = slice[3:2:1] // ERROR "invalid slice index"
+	_ = slice[i:1:2]
+	_ = slice[i:2:1] // ERROR "invalid slice index"
+	_ = slice[1:j:2]
+	_ = slice[2:j:1] // ERROR "invalid slice index"
+	_ = slice[1:2:k]
+	_ = slice[2:1:k] // ERROR "invalid slice index"
+	
+	_ = str[1:2]
+	_ = str[2:1] // ERROR "invalid slice index"
+	_ = str[2:2]
+	_ = str[i:1]
+	_ = str[1:j]
+
+	// check out of bounds indices on array
+	_ = array[11:11] // ERROR "out of bounds for 10-element array"
+	_ = array[11:12] // ERROR "out of bounds for 10-element array"
+	_ = array[11:] // ERROR "out of bounds for 10-element array"
+	_ = array[:11] // ERROR "out of bounds for 10-element array"
+	_ = array[1:11] // ERROR "out of bounds for 10-element array"
+	_ = array[1:11:12] // ERROR "out of bounds for 10-element array"
+	_ = array[1:2:11] // ERROR "out of bounds for 10-element array"
+	_ = array[1:11:3] // ERROR "out of bounds for 10-element array"
+	_ = array[11:2:3] // ERROR "out of bounds for 10-element array"
+	_ = array[11:12:13] // ERROR "out of bounds for 10-element array"
+
+	// slice bounds not checked
+	_ = slice[11:11]
+	_ = slice[11:12]
+	_ = slice[11:]
+	_ = slice[:11]
+	_ = slice[1:11]
+	_ = slice[1:11:12]
+	_ = slice[1:2:11]
+	_ = slice[1:11:3] // ERROR "invalid slice index"
+	_ = slice[11:2:3] // ERROR "invalid slice index"
+	_ = slice[11:12:13]
+}