PatterConstraint parsing

diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c
index 954d5f5..82abf17 100644
--- a/libasn1fix/asn1fix_constraint_compat.c
+++ b/libasn1fix/asn1fix_constraint_compat.c
@@ -95,6 +95,10 @@
 		default:
 			return 0;
 		}
+	case ACT_CT_PATTERN:
+		if(expr_type & ASN_STRING_MASK)
+			return 1;
+		return 0;
 	case ACT_CA_SET:
 	case ACT_CA_CRC:
 	case ACT_CA_CSV:
diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c
index ee8d1eb..0b1e892 100644
--- a/libasn1parser/asn1p_constr.c
+++ b/libasn1parser/asn1p_constr.c
@@ -171,6 +171,8 @@
 		return "UserDefinedConstraint";
 	case ACT_CT_CTNG:
 		return "ContentsConstraint";
+	case ACT_CT_PATTERN:
+		return "PatternConstraint";
 	case ACT_CA_SET:
 		return "SET";
 	case ACT_CA_CRC:
diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h
index bb6ba32..accee55 100644
--- a/libasn1parser/asn1p_constr.h
+++ b/libasn1parser/asn1p_constr.h
@@ -27,6 +27,7 @@
 		ACT_CT_WCOMPS,		/* WITH COMPONENTS */
 		ACT_CT_CTDBY,		/* CONSTRAINED BY */
 		ACT_CT_CTNG,		/* CONTAINING Type */
+		ACT_CT_PATTERN,		/* PATTERN Value */
 		/*
 		 * Arrays of constraints.
 		 */
diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c
index 709611c..95d4513 100644
--- a/libasn1parser/asn1p_y.c
+++ b/libasn1parser/asn1p_y.c
@@ -523,16 +523,16 @@
 
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  7
-#define YYLAST   824
+#define YYLAST   871
 
 /* YYNTOKENS -- Number of terminals. */
 #define YYNTOKENS  121
 /* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  120
+#define YYNNTS  121
 /* YYNRULES -- Number of rules. */
-#define YYNRULES  306
+#define YYNRULES  309
 /* YYNRULES -- Number of states. */
-#define YYNSTATES  465
+#define YYNSTATES  469
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -611,23 +611,23 @@
      564,   566,   568,   570,   572,   574,   575,   577,   579,   583,
      585,   590,   594,   599,   601,   603,   607,   613,   615,   619,
      621,   625,   627,   631,   633,   637,   642,   646,   648,   650,
-     654,   658,   662,   666,   668,   670,   672,   674,   676,   678,
-     680,   682,   684,   688,   694,   696,   700,   702,   706,   707,
-     709,   711,   713,   715,   717,   719,   721,   722,   728,   731,
-     733,   736,   739,   743,   745,   747,   751,   756,   758,   762,
-     765,   769,   771,   775,   776,   778,   780,   783,   786,   790,
-     792,   796,   798,   803,   808,   810,   812,   814,   816,   818,
-     820,   821,   823,   826,   831,   832,   834,   836,   838,   839,
-     841,   843,   845,   847,   849,   850,   852
+     654,   658,   662,   666,   668,   670,   673,   676,   678,   680,
+     682,   684,   686,   688,   690,   692,   696,   702,   704,   708,
+     710,   714,   715,   717,   719,   721,   723,   725,   727,   729,
+     730,   736,   739,   741,   744,   747,   751,   753,   755,   759,
+     764,   766,   770,   773,   777,   779,   783,   784,   786,   788,
+     791,   794,   798,   800,   804,   806,   811,   816,   818,   820,
+     822,   824,   826,   828,   829,   831,   834,   839,   840,   842,
+     844,   846,   847,   849,   851,   853,   855,   857,   858,   860
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
 static const short yyrhs[] =
 {
      122,     0,    -1,   123,    -1,   124,    -1,   123,   124,    -1,
-      -1,   237,   125,   126,    39,   130,     3,    26,   133,    44,
+      -1,   238,   125,   126,    39,   130,     3,    26,   133,    44,
       -1,    -1,   127,    -1,   108,   128,   109,    -1,   108,   109,
-      -1,   129,    -1,   128,   129,    -1,   240,    -1,   240,   110,
+      -1,   129,    -1,   128,   129,    -1,   241,    -1,   241,   110,
       10,   111,    -1,    10,    -1,    -1,   131,    -1,   132,    -1,
      131,   132,    -1,    46,    89,    -1,    57,    89,    -1,    25,
       89,    -1,    48,    58,    -1,    16,    62,    -1,    -1,   134,
@@ -635,117 +635,118 @@
      153,    -1,   183,    -1,   151,    -1,    -1,    43,    16,   137,
       -1,   193,    -1,    -1,   139,    -1,    59,   140,   112,    -1,
       59,    51,    -1,    -1,   141,    -1,   143,    -1,   141,   143,
-      -1,    -1,   127,    -1,   144,    51,   237,   142,    -1,   145,
-      -1,   144,   113,   145,    -1,   237,    -1,   237,   108,   109,
-      -1,   240,    -1,    -1,   147,    -1,    47,   148,   112,    -1,
+      -1,    -1,   127,    -1,   144,    51,   238,   142,    -1,   145,
+      -1,   144,   113,   145,    -1,   238,    -1,   238,   108,   109,
+      -1,   241,    -1,    -1,   147,    -1,    47,   148,   112,    -1,
       47,    22,   112,    -1,    47,   112,    -1,   149,    -1,   148,
-     113,   149,    -1,   237,    -1,   237,   108,   109,    -1,   240,
-      -1,   108,   200,   109,    -1,   237,   152,     3,   150,    -1,
-     192,    -1,   177,    -1,   177,   108,   156,   109,    -1,   237,
-       3,   173,    -1,   237,     3,   163,    -1,   237,   108,   154,
-     109,     3,   173,    -1,   237,   108,   154,   109,     3,   163,
-      -1,   155,    -1,   154,   113,   155,    -1,   237,    -1,   237,
-     114,   240,    -1,   237,   114,   237,    -1,   190,   114,   240,
-      -1,   190,   114,   237,    -1,   157,    -1,   156,   113,   157,
-      -1,   173,    -1,   186,    -1,   240,    -1,   150,    -1,    -1,
-     159,    -1,   160,    -1,   159,   113,   160,    -1,   240,   173,
-     225,    -1,   173,   225,    -1,    35,    73,   173,    -1,   172,
-      -1,   162,    -1,   161,   113,   162,    -1,   240,   173,    -1,
+     113,   149,    -1,   238,    -1,   238,   108,   109,    -1,   241,
+      -1,   108,   200,   109,    -1,   238,   152,     3,   150,    -1,
+     192,    -1,   177,    -1,   177,   108,   156,   109,    -1,   238,
+       3,   173,    -1,   238,     3,   163,    -1,   238,   108,   154,
+     109,     3,   173,    -1,   238,   108,   154,   109,     3,   163,
+      -1,   155,    -1,   154,   113,   155,    -1,   238,    -1,   238,
+     114,   241,    -1,   238,   114,   238,    -1,   190,   114,   241,
+      -1,   190,   114,   238,    -1,   157,    -1,   156,   113,   157,
+      -1,   173,    -1,   186,    -1,   241,    -1,   150,    -1,    -1,
+     159,    -1,   160,    -1,   159,   113,   160,    -1,   241,   173,
+     226,    -1,   173,   226,    -1,    35,    73,   173,    -1,   172,
+      -1,   162,    -1,   161,   113,   162,    -1,   241,   173,    -1,
      172,    -1,   173,    -1,    33,   108,   165,   109,   167,    -1,
       -1,    93,    -1,   166,    -1,   165,   113,   166,    -1,    17,
-     225,    -1,    18,   173,   164,   225,    -1,    18,   181,   225,
-      -1,    18,   182,   225,    -1,    17,   181,   225,    -1,    17,
-     173,   225,    -1,    17,   182,   225,    -1,    -1,   168,    -1,
+     226,    -1,    18,   173,   164,   226,    -1,    18,   181,   226,
+      -1,    18,   182,   226,    -1,    17,   181,   226,    -1,    17,
+     173,   226,    -1,    17,   182,   226,    -1,    -1,   168,    -1,
       -1,   100,    87,   108,   169,   170,   109,    -1,   171,    -1,
      170,   171,    -1,     4,    -1,    19,    -1,   180,    -1,   115,
      170,   116,    -1,   107,    -1,   107,   117,   187,    -1,   107,
-     117,   230,    -1,   232,   175,   196,    -1,    -1,   174,   176,
+     117,   231,    -1,   233,   175,   196,    -1,    -1,   174,   176,
       -1,   152,    -1,    32,   108,   161,   109,    -1,    83,   108,
      158,   109,    -1,    84,   108,   158,   109,    -1,    83,   196,
-      73,   239,   232,   175,    -1,    84,   196,    73,   239,   232,
-     175,    -1,    23,    -1,    23,    40,    30,   240,    -1,    61,
-      73,   177,    -1,    15,    -1,    15,   118,   237,    -1,   238,
-     118,   237,    -1,    15,   118,   240,    -1,   238,    -1,   238,
+      73,   240,   233,   175,    -1,    84,   196,    73,   240,   233,
+     175,    -1,    23,    -1,    23,    40,    30,   241,    -1,    61,
+      73,   177,    -1,    15,    -1,    15,   118,   238,    -1,   239,
+     118,   238,    -1,    15,   118,   241,    -1,   239,    -1,   239,
      118,   178,    -1,   179,    -1,   178,   118,   179,    -1,   180,
       -1,    17,    -1,    18,    -1,    17,    -1,   181,   118,    17,
-      -1,   181,   118,    18,    -1,    16,    -1,   240,   152,     3,
-     184,    -1,   186,    -1,   187,    -1,   240,   114,   184,    -1,
+      -1,   181,   118,    18,    -1,    16,    -1,   241,   152,     3,
+     184,    -1,   186,    -1,   187,    -1,   241,   114,   184,    -1,
       -1,   108,   185,   189,    -1,    68,    -1,    50,    -1,    91,
-      -1,     6,    -1,     8,    -1,   188,    -1,   230,    -1,   240,
-      -1,   237,   118,   240,    -1,     7,    -1,    13,    -1,    14,
+      -1,     6,    -1,     8,    -1,   188,    -1,   231,    -1,   241,
+      -1,   238,   118,   241,    -1,     7,    -1,    13,    -1,    14,
       -1,     5,    -1,   189,     5,    -1,    29,    -1,    68,    -1,
       81,    -1,   191,    -1,    72,    86,    -1,    70,    56,    -1,
       82,    -1,    49,    -1,    41,    76,    -1,    31,    86,    -1,
       96,    -1,    52,    -1,   193,    -1,    63,    -1,    45,    -1,
-      27,    86,    -1,   190,    -1,   191,   227,    -1,    28,    -1,
+      27,    86,    -1,   190,    -1,   191,   228,    -1,    28,    -1,
       53,    -1,    54,    -1,    55,    -1,    64,    -1,    69,    -1,
       79,    -1,    88,    -1,    90,    -1,    95,    -1,    97,    -1,
       98,    -1,    99,    -1,    71,    -1,   104,    -1,   105,    -1,
      102,    -1,   103,    -1,    -1,   197,    -1,   198,    -1,   110,
-     214,   111,    -1,   199,    -1,    85,   110,   200,   111,    -1,
+     215,   111,    -1,   199,    -1,    85,   110,   200,   111,    -1,
      110,   200,   111,    -1,   199,   110,   200,   111,    -1,   107,
       -1,   201,    -1,   201,   113,   107,    -1,   201,   113,   107,
      113,   201,    -1,   202,    -1,    22,   101,   205,    -1,   203,
       -1,   202,   194,   203,    -1,   204,    -1,   203,   195,   204,
-      -1,   205,    -1,   205,   101,   205,    -1,   206,   110,   200,
-     111,    -1,   110,   200,   111,    -1,   207,    -1,   208,    -1,
-     207,   218,   207,    -1,    66,   218,   207,    -1,   207,   218,
-      65,    -1,    66,   218,    65,    -1,   209,    -1,    85,    -1,
-      51,    -1,    50,    -1,    91,    -1,   231,    -1,   188,    -1,
-     240,    -1,   237,    -1,   100,    34,   199,    -1,   100,    35,
-     108,   210,   109,    -1,   211,    -1,   210,   113,   211,    -1,
-     107,    -1,   240,   196,   212,    -1,    -1,   213,    -1,    78,
-      -1,    20,    -1,    74,    -1,   215,    -1,   219,    -1,   217,
-      -1,    -1,    36,    30,   108,   216,   189,    -1,    37,   173,
-      -1,   106,    -1,   106,   119,    -1,   119,   106,    -1,   119,
-     106,   119,    -1,   220,    -1,   221,    -1,   108,   237,   109,
-      -1,   220,   108,   222,   109,    -1,   223,    -1,   222,   113,
-     223,    -1,   120,   224,    -1,   120,   118,   224,    -1,   240,
-      -1,   224,   118,   240,    -1,    -1,   226,    -1,    74,    -1,
-      38,   184,    -1,   108,   109,    -1,   108,   228,   109,    -1,
-     229,    -1,   228,   113,   229,    -1,   240,    -1,   240,   110,
-     230,   111,    -1,   240,   110,   187,   111,    -1,   230,    -1,
-     107,    -1,    10,    -1,    11,    -1,   230,    -1,    12,    -1,
-      -1,   233,    -1,   234,   236,    -1,   115,   235,    10,   116,
-      -1,    -1,    94,    -1,    24,    -1,    80,    -1,    -1,    57,
-      -1,    46,    -1,    15,    -1,    16,    -1,    16,    -1,    -1,
-     240,    -1,     9,    -1
+      -1,   205,    -1,   205,   101,   205,    -1,   207,   110,   200,
+     111,    -1,   110,   200,   111,    -1,   208,    -1,   209,    -1,
+     208,   219,   208,    -1,    66,   219,   208,    -1,   208,   219,
+      65,    -1,    66,   219,    65,    -1,   210,    -1,   206,    -1,
+      75,     7,    -1,    75,   241,    -1,    85,    -1,    51,    -1,
+      50,    -1,    91,    -1,   232,    -1,   188,    -1,   241,    -1,
+     238,    -1,   100,    34,   199,    -1,   100,    35,   108,   211,
+     109,    -1,   212,    -1,   211,   113,   212,    -1,   107,    -1,
+     241,   196,   213,    -1,    -1,   214,    -1,    78,    -1,    20,
+      -1,    74,    -1,   216,    -1,   220,    -1,   218,    -1,    -1,
+      36,    30,   108,   217,   189,    -1,    37,   173,    -1,   106,
+      -1,   106,   119,    -1,   119,   106,    -1,   119,   106,   119,
+      -1,   221,    -1,   222,    -1,   108,   238,   109,    -1,   221,
+     108,   223,   109,    -1,   224,    -1,   223,   113,   224,    -1,
+     120,   225,    -1,   120,   118,   225,    -1,   241,    -1,   225,
+     118,   241,    -1,    -1,   227,    -1,    74,    -1,    38,   184,
+      -1,   108,   109,    -1,   108,   229,   109,    -1,   230,    -1,
+     229,   113,   230,    -1,   241,    -1,   241,   110,   231,   111,
+      -1,   241,   110,   187,   111,    -1,   231,    -1,   107,    -1,
+      10,    -1,    11,    -1,   231,    -1,    12,    -1,    -1,   234,
+      -1,   235,   237,    -1,   115,   236,    10,   116,    -1,    -1,
+      94,    -1,    24,    -1,    80,    -1,    -1,    57,    -1,    46,
+      -1,    15,    -1,    16,    -1,    16,    -1,    -1,   241,    -1,
+       9,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short yyrline[] =
 {
-       0,   353,   353,   359,   365,   382,   381,   410,   412,   415,
-     419,   424,   431,   439,   444,   448,   457,   459,   467,   471,
-     479,   483,   486,   489,   493,   513,   515,   523,   532,   536,
-     551,   559,   572,   580,   579,   593,   605,   607,   609,   620,
-     625,   627,   629,   635,   641,   643,   646,   657,   663,   669,
-     676,   682,   691,   693,   704,   708,   711,   718,   724,   730,
-     737,   743,   752,   754,   764,   778,   788,   804,   814,   830,
-     836,   843,   853,   863,   868,   875,   882,   890,   900,   906,
-     912,   916,   924,   935,   957,   959,   961,   967,   973,   981,
-     987,   994,   999,  1005,  1011,  1017,  1020,  1026,  1036,  1038,
-    1041,  1049,  1056,  1069,  1080,  1090,  1101,  1111,  1122,  1133,
-    1135,  1142,  1140,  1149,  1154,  1160,  1165,  1168,  1172,  1177,
-    1186,  1195,  1206,  1228,  1235,  1254,  1258,  1264,  1270,  1276,
-    1286,  1296,  1302,  1313,  1327,  1336,  1346,  1356,  1366,  1374,
-    1395,  1404,  1413,  1415,  1422,  1429,  1435,  1439,  1445,  1465,
-    1475,  1477,  1478,  1485,  1485,  1490,  1497,  1503,  1508,  1512,
-    1516,  1519,  1524,  1536,  1553,  1558,  1563,  1596,  1606,  1620,
-    1622,  1623,  1624,  1625,  1626,  1627,  1628,  1629,  1630,  1631,
-    1632,  1633,  1639,  1641,  1642,  1645,  1652,  1664,  1666,  1670,
-    1674,  1675,  1676,  1677,  1678,  1682,  1683,  1684,  1685,  1689,
-    1690,  1697,  1697,  1698,  1698,  1700,  1702,  1707,  1709,  1714,
-    1718,  1727,  1731,  1736,  1741,  1744,  1750,  1760,  1762,  1767,
-    1769,  1774,  1776,  1782,  1784,  1789,  1798,  1806,  1812,  1818,
-    1825,  1833,  1841,  1850,  1855,  1859,  1864,  1870,  1875,  1876,
-    1877,  1890,  1904,  1908,  1913,  1917,  1922,  1929,  1942,  1944,
-    1947,  1951,  1954,  1961,  1963,  1964,  1969,  1967,  1979,  1987,
-    1989,  1990,  1991,  1993,  1997,  2005,  2020,  2026,  2033,  2046,
-    2058,  2073,  2077,  2094,  2099,  2102,  2107,  2129,  2134,  2139,
-    2145,  2151,  2159,  2167,  2175,  2182,  2192,  2197,  2203,  2205,
-    2235,  2237,  2240,  2247,  2253,  2255,  2256,  2257,  2260,  2262,
-    2263,  2266,  2271,  2278,  2285,  2287,  2292
+       0,   354,   354,   360,   366,   383,   382,   411,   413,   416,
+     420,   425,   432,   440,   445,   449,   458,   460,   468,   472,
+     480,   484,   487,   490,   494,   514,   516,   524,   533,   537,
+     552,   560,   573,   581,   580,   594,   606,   608,   610,   621,
+     626,   628,   630,   636,   642,   644,   647,   658,   664,   670,
+     677,   683,   692,   694,   705,   709,   712,   719,   725,   731,
+     738,   744,   753,   755,   765,   779,   789,   805,   815,   831,
+     837,   844,   854,   864,   869,   876,   883,   891,   901,   907,
+     913,   917,   925,   936,   958,   960,   962,   968,   974,   982,
+     988,   995,  1000,  1006,  1012,  1018,  1021,  1027,  1037,  1039,
+    1042,  1050,  1057,  1070,  1081,  1091,  1102,  1112,  1123,  1134,
+    1136,  1143,  1141,  1150,  1155,  1161,  1166,  1169,  1173,  1178,
+    1187,  1196,  1207,  1229,  1236,  1255,  1259,  1265,  1271,  1277,
+    1287,  1297,  1303,  1314,  1328,  1337,  1347,  1357,  1367,  1375,
+    1396,  1405,  1414,  1416,  1423,  1430,  1436,  1440,  1446,  1466,
+    1476,  1478,  1479,  1486,  1486,  1491,  1498,  1504,  1509,  1513,
+    1517,  1520,  1525,  1537,  1554,  1559,  1564,  1597,  1607,  1621,
+    1623,  1624,  1625,  1626,  1627,  1628,  1629,  1630,  1631,  1632,
+    1633,  1634,  1640,  1642,  1643,  1646,  1653,  1665,  1667,  1671,
+    1675,  1676,  1677,  1678,  1679,  1683,  1684,  1685,  1686,  1690,
+    1691,  1698,  1698,  1699,  1699,  1701,  1703,  1708,  1710,  1715,
+    1719,  1728,  1732,  1737,  1742,  1745,  1751,  1761,  1763,  1768,
+    1770,  1775,  1777,  1783,  1785,  1790,  1799,  1807,  1813,  1819,
+    1826,  1834,  1842,  1851,  1854,  1859,  1865,  1875,  1879,  1884,
+    1890,  1895,  1896,  1897,  1910,  1924,  1928,  1933,  1937,  1942,
+    1949,  1962,  1964,  1967,  1971,  1974,  1981,  1983,  1984,  1989,
+    1987,  1999,  2007,  2009,  2010,  2011,  2013,  2017,  2025,  2040,
+    2046,  2053,  2066,  2078,  2093,  2097,  2114,  2119,  2122,  2127,
+    2149,  2154,  2159,  2165,  2171,  2179,  2187,  2195,  2202,  2212,
+    2217,  2223,  2225,  2255,  2257,  2260,  2267,  2273,  2275,  2276,
+    2277,  2280,  2282,  2283,  2286,  2291,  2298,  2305,  2307,  2312
 };
 #endif
 
@@ -806,16 +807,16 @@
   "BasicString", "UnionMark", "IntersectionMark", "optConstraints", 
   "Constraint", "SubtypeConstraint", "SetOfConstraints", 
   "ElementSetSpecs", "ElementSetSpec", "Unions", "Intersections", 
-  "IntersectionElements", "ConstraintSubtypeElement", "ConstraintSpec", 
-  "SingleValue", "ContainedSubtype", "InnerTypeConstraint", 
-  "WithComponentsList", "WithComponentsElement", "optPresenceConstraint", 
-  "PresenceConstraint", "GeneralConstraint", "UserDefinedConstraint", 
-  "@5", "ContentsConstraint", "ConstraintRangeSpec", "TableConstraint", 
-  "SimpleTableConstraint", "ComponentRelationConstraint", 
-  "AtNotationList", "AtNotationElement", "ComponentIdList", "optMarker", 
-  "Marker", "UniverationDefinition", "UniverationList", 
-  "UniverationElement", "SignedNumber", "RealValue", "optTag", "Tag", 
-  "TagTypeValue", "TagClass", "TagPlicit", "TypeRefName", 
+  "IntersectionElements", "ConstraintSubtypeElement", "PatternConstraint", 
+  "ConstraintSpec", "SingleValue", "ContainedSubtype", 
+  "InnerTypeConstraint", "WithComponentsList", "WithComponentsElement", 
+  "optPresenceConstraint", "PresenceConstraint", "GeneralConstraint", 
+  "UserDefinedConstraint", "@5", "ContentsConstraint", 
+  "ConstraintRangeSpec", "TableConstraint", "SimpleTableConstraint", 
+  "ComponentRelationConstraint", "AtNotationList", "AtNotationElement", 
+  "ComponentIdList", "optMarker", "Marker", "UniverationDefinition", 
+  "UniverationList", "UniverationElement", "SignedNumber", "RealValue", 
+  "optTag", "Tag", "TagTypeValue", "TagClass", "TagPlicit", "TypeRefName", 
   "ObjectClassReference", "optIdentifier", "Identifier", 0
 };
 #endif
@@ -867,14 +868,14 @@
      193,   194,   194,   195,   195,   196,   196,   197,   197,   198,
      198,   199,   199,   200,   200,   200,   200,   201,   201,   202,
      202,   203,   203,   204,   204,   205,   205,   205,   205,   205,
-     205,   205,   205,   205,   206,   206,   207,   207,   207,   207,
-     207,   208,   209,   209,   210,   210,   211,   211,   212,   212,
-     213,   213,   213,   214,   214,   214,   216,   215,   217,   218,
-     218,   218,   218,   219,   219,   220,   221,   222,   222,   223,
-     223,   224,   224,   225,   225,   226,   226,   227,   227,   228,
-     228,   229,   229,   229,   229,   229,   230,   230,   231,   231,
-     232,   232,   233,   234,   235,   235,   235,   235,   236,   236,
-     236,   237,   237,   238,   239,   239,   240
+     205,   205,   205,   205,   205,   206,   206,   207,   207,   208,
+     208,   208,   208,   208,   209,   210,   210,   211,   211,   212,
+     212,   213,   213,   214,   214,   214,   215,   215,   215,   217,
+     216,   218,   219,   219,   219,   219,   220,   220,   221,   222,
+     223,   223,   224,   224,   225,   225,   226,   226,   227,   227,
+     228,   228,   229,   229,   230,   230,   230,   230,   230,   231,
+     231,   232,   232,   233,   233,   234,   235,   236,   236,   236,
+     236,   237,   237,   237,   238,   238,   239,   240,   240,   241
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -903,14 +904,14 @@
        1,     1,     1,     1,     1,     0,     1,     1,     3,     1,
        4,     3,     4,     1,     1,     3,     5,     1,     3,     1,
        3,     1,     3,     1,     3,     4,     3,     1,     1,     3,
-       3,     3,     3,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     3,     5,     1,     3,     1,     3,     0,     1,
-       1,     1,     1,     1,     1,     1,     0,     5,     2,     1,
-       2,     2,     3,     1,     1,     3,     4,     1,     3,     2,
-       3,     1,     3,     0,     1,     1,     2,     2,     3,     1,
-       3,     1,     4,     4,     1,     1,     1,     1,     1,     1,
-       0,     1,     2,     4,     0,     1,     1,     1,     0,     1,
-       1,     1,     1,     1,     0,     1,     1
+       3,     3,     3,     1,     1,     2,     2,     1,     1,     1,
+       1,     1,     1,     1,     1,     3,     5,     1,     3,     1,
+       3,     0,     1,     1,     1,     1,     1,     1,     1,     0,
+       5,     2,     1,     2,     2,     3,     1,     1,     3,     4,
+       1,     3,     2,     3,     1,     3,     0,     1,     1,     2,
+       2,     3,     1,     3,     1,     4,     4,     1,     1,     1,
+       1,     1,     1,     0,     1,     2,     4,     0,     1,     1,
+       1,     0,     1,     1,     1,     1,     1,     0,     1,     1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -918,8 +919,8 @@
    means the default is an error.  */
 static const unsigned short yydefact[] =
 {
-       0,   301,   302,     0,     2,     3,     5,     1,     4,     7,
-       0,     0,     8,   306,    15,    10,     0,    11,    13,    16,
+       0,   304,   305,     0,     2,     3,     5,     1,     4,     7,
+       0,     0,     8,   309,    15,    10,     0,    11,    13,    16,
        9,    12,     0,     0,     0,     0,     0,     0,     0,    17,
       18,     0,    24,    22,    20,    23,    21,     0,    19,    14,
       52,     0,     0,    26,    36,    53,     0,    56,     0,    57,
@@ -928,43 +929,43 @@
      188,   189,   190,   191,   192,   200,   193,   194,   195,   196,
      197,   198,   199,    27,    28,    32,    30,    31,    35,     0,
        0,    58,    60,    38,    43,     0,     0,     0,    33,    29,
-     290,   134,   303,     0,   169,     0,     0,   183,   176,   180,
+     293,   134,   306,     0,   169,     0,     0,   183,   176,   180,
      182,   170,     0,     0,   171,   175,   179,     0,     0,    65,
      185,   172,    64,   181,   138,     0,    44,    48,    50,    34,
-       0,   294,    68,    67,   123,   291,   298,     0,   184,   178,
-     177,   174,   173,     0,    71,     0,   172,    73,     0,   290,
-       0,   186,     0,     0,    45,    46,     0,   296,   297,   295,
-       0,     0,   205,   300,   299,   292,   135,   137,     0,     0,
-       0,     0,     0,    63,   158,   164,   159,   286,   287,   165,
+       0,   297,    68,    67,   123,   294,   301,     0,   184,   178,
+     177,   174,   173,     0,    71,     0,   172,    73,     0,   293,
+       0,   186,     0,     0,    45,    46,     0,   299,   300,   298,
+       0,     0,   205,   303,   302,   295,   135,   137,     0,     0,
+       0,     0,     0,    63,   158,   164,   159,   289,   290,   165,
      166,   156,   157,    83,     0,    78,    80,    81,   160,   161,
-      82,   285,   277,     0,   279,   284,   281,   143,   144,   139,
+      82,   288,   280,     0,   282,   287,   284,   143,   144,   139,
      140,   142,   136,   155,   153,   149,   150,   151,     0,   162,
-     290,   290,     0,   100,     0,   131,     0,     0,   205,   205,
-     125,   124,     0,     0,   122,   206,   207,   209,   290,    72,
-      77,    76,    75,    74,   289,     0,   236,   235,     0,   234,
-     237,     0,   213,     0,   239,     0,   214,   217,   219,   221,
-     223,     0,   227,   228,   233,   288,   238,   241,   240,    66,
-     290,   278,     0,     0,     0,     0,     0,     0,   148,   145,
-       0,   275,   273,   273,   273,   102,   274,    98,   273,   273,
-     109,     0,   293,     0,   290,     0,   290,     0,   290,     0,
-       0,     0,   290,     0,     0,     0,   253,   255,   254,   263,
-     264,     0,    70,    69,     0,   259,     0,     0,     0,     0,
-       0,    62,     0,   201,   202,     0,   203,   204,     0,     0,
-       0,     0,    79,   280,     0,     0,   162,   141,   167,   154,
-     163,   152,   276,   107,     0,   106,   108,    99,   273,   104,
-     105,     0,    97,   110,   101,     0,   119,     0,    92,    95,
-      96,   290,   133,     0,     0,    85,    86,    91,   273,   290,
-     304,     0,   304,     0,     0,   258,     0,   211,   208,     0,
-       0,   218,   260,   261,   232,   230,     0,   242,     0,   226,
-     215,   220,   222,   224,     0,   231,   229,   283,   282,   168,
-     146,   147,   103,     0,   132,     0,   126,   290,    94,   290,
-     127,   290,    89,   273,   290,   305,   128,   290,   210,   256,
-     265,     0,     0,   267,   212,   262,   246,     0,   244,   205,
-       0,   225,   111,   120,   121,    93,    90,    87,    88,   123,
-     123,     0,     0,   269,   271,   266,     0,   243,     0,   248,
-     216,     0,   129,   130,   257,   270,     0,   268,   245,   251,
-     252,   250,   247,   249,   115,   116,     0,     0,   113,   117,
-     272,     0,   112,   114,   118
+     293,   293,     0,   100,     0,   131,     0,     0,   205,   205,
+     125,   124,     0,     0,   122,   206,   207,   209,   293,    72,
+      77,    76,    75,    74,   292,     0,   239,   238,     0,     0,
+     237,   240,     0,   213,     0,   242,     0,   214,   217,   219,
+     221,   223,   234,     0,   227,   228,   233,   291,   241,   244,
+     243,    66,   293,   281,     0,     0,     0,     0,     0,     0,
+     148,   145,     0,   278,   276,   276,   276,   102,   277,    98,
+     276,   276,   109,     0,   296,     0,   293,     0,   293,     0,
+     293,     0,     0,     0,   293,     0,     0,     0,   256,   258,
+     257,   266,   267,     0,    70,    69,     0,   262,     0,     0,
+     235,   236,     0,     0,     0,    62,     0,   201,   202,     0,
+     203,   204,     0,     0,     0,     0,    79,   283,     0,     0,
+     162,   141,   167,   154,   163,   152,   279,   107,     0,   106,
+     108,    99,   276,   104,   105,     0,    97,   110,   101,     0,
+     119,     0,    92,    95,    96,   293,   133,     0,     0,    85,
+      86,    91,   276,   293,   307,     0,   307,     0,     0,   261,
+       0,   211,   208,     0,     0,   218,   263,   264,   232,   230,
+       0,   245,     0,   226,   215,   220,   222,   224,     0,   231,
+     229,   286,   285,   168,   146,   147,   103,     0,   132,     0,
+     126,   293,    94,   293,   127,   293,    89,   276,   293,   308,
+     128,   293,   210,   259,   268,     0,     0,   270,   212,   265,
+     249,     0,   247,   205,     0,   225,   111,   120,   121,    93,
+      90,    87,    88,   123,   123,     0,     0,   272,   274,   269,
+       0,   246,     0,   251,   216,     0,   129,   130,   260,   273,
+       0,   271,   248,   254,   255,   253,   250,   252,   115,   116,
+       0,     0,   113,   117,   275,     0,   112,   114,   118
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
@@ -973,318 +974,330 @@
       -1,     3,     4,     5,     9,    11,    12,    16,    17,    28,
       29,    30,    42,    43,    83,    84,   129,    54,    55,    61,
       62,   155,    63,    64,    65,    44,    45,    48,    49,   183,
-      85,   118,    86,   143,   144,   184,   185,   354,   355,   356,
-     347,   348,   132,   338,   212,   213,   342,   343,   441,   457,
-     458,   357,   358,   161,   162,   221,   119,   199,   200,   459,
-     273,   274,    87,   205,   265,   206,   207,   244,   329,   120,
-     121,   122,   123,   315,   318,   224,   225,   226,   227,   294,
-     246,   247,   248,   249,   250,   251,   252,   253,   254,   417,
-     418,   452,   453,   295,   296,   431,   297,   307,   298,   299,
-     300,   412,   413,   433,   275,   276,   151,   193,   194,   255,
-     256,   134,   135,   136,   160,   165,   257,   124,   404,   258
+      85,   118,    86,   143,   144,   184,   185,   358,   359,   360,
+     351,   352,   132,   342,   212,   213,   346,   347,   445,   461,
+     462,   361,   362,   161,   162,   221,   119,   199,   200,   463,
+     275,   276,    87,   205,   267,   206,   207,   245,   333,   120,
+     121,   122,   123,   319,   322,   224,   225,   226,   227,   296,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     421,   422,   456,   457,   297,   298,   435,   299,   309,   300,
+     301,   302,   416,   417,   437,   277,   278,   151,   193,   194,
+     257,   258,   134,   135,   136,   160,   165,   259,   124,   408,
+     260
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -274
+#define YYPACT_NINF -292
 static const short yypact[] =
 {
-      77,  -274,  -274,    33,    77,  -274,  -274,  -274,  -274,   -52,
-       8,   107,  -274,  -274,  -274,  -274,    36,  -274,    42,   267,
-    -274,  -274,   149,    20,    79,    96,   132,   111,   208,   267,
-    -274,   105,  -274,  -274,  -274,  -274,  -274,   220,  -274,  -274,
-      69,    72,   193,  -274,   213,  -274,   158,  -274,   117,  -274,
-     178,  -274,  -274,   183,   478,  -274,  -274,  -274,   266,   182,
-    -274,   181,   266,  -274,   -28,  -274,   189,  -274,  -274,   292,
-    -274,  -274,  -274,  -274,  -274,  -274,  -274,  -274,  -274,  -274,
-    -274,  -274,  -274,   478,  -274,  -274,  -274,  -274,  -274,   345,
-     631,  -274,  -274,  -274,  -274,    77,   266,   201,  -274,  -274,
-      -6,   194,  -274,   236,  -274,   248,   268,  -274,  -274,  -274,
-    -274,  -274,   291,   263,  -274,  -274,  -274,   707,   348,   247,
-    -274,   251,  -274,  -274,   238,   354,   -52,  -274,  -274,  -274,
-     255,    83,  -274,  -274,  -274,  -274,    55,   266,  -274,  -274,
-    -274,  -274,  -274,   -81,  -274,   252,  -274,   253,   257,    58,
-      80,  -274,   310,   199,  -274,  -274,   241,  -274,  -274,  -274,
-     359,   555,    10,  -274,  -274,  -274,  -274,  -274,   367,   707,
-     266,   266,   229,  -274,  -274,  -274,  -274,  -274,  -274,  -274,
-    -274,  -274,  -274,  -274,    82,  -274,  -274,  -274,  -274,  -274,
-    -274,  -274,  -274,    88,  -274,  -274,   261,  -274,  -274,   259,
-    -274,  -274,  -274,  -274,  -274,  -274,  -274,  -274,   260,   265,
-     249,    41,   119,  -274,   264,   335,   273,   309,    94,   109,
-    -274,  -274,   274,   211,  -274,  -274,  -274,   278,    -6,  -274,
-    -274,  -274,  -274,  -274,  -274,   288,  -274,  -274,    74,  -274,
-    -274,   282,  -274,   229,  -274,   283,   270,   227,   235,  -274,
-     294,   293,    74,  -274,  -274,  -274,  -274,  -274,  -274,  -274,
-      58,  -274,    40,   289,   323,   388,   393,   199,  -274,  -274,
-     199,  -274,     0,    32,     0,  -274,  -274,   311,    32,     0,
-     305,   241,  -274,   376,    71,   327,    67,   334,    67,   337,
-     229,   381,   297,    77,   307,   308,  -274,  -274,  -274,   312,
-    -274,   229,  -274,  -274,   459,   302,   317,   469,   315,   321,
-     319,  -274,   324,  -274,  -274,   459,  -274,  -274,   459,   459,
-     229,   733,  -274,  -274,   326,   336,  -274,  -274,  -274,   427,
-    -274,  -274,  -274,  -274,   328,  -274,  -274,  -274,     0,  -274,
-    -274,   347,  -274,  -274,  -274,   393,   322,   122,  -274,  -274,
-    -274,   297,  -274,   365,   339,   332,  -274,  -274,     0,   297,
-     393,   340,   393,   351,   338,  -274,   341,  -274,  -274,   331,
-     352,  -274,  -274,   346,  -274,  -274,   229,   278,    16,  -274,
-     364,   235,  -274,  -274,   353,  -274,  -274,  -274,  -274,  -274,
-    -274,  -274,  -274,   377,  -274,   289,  -274,    71,  -274,   297,
-    -274,    68,  -274,     0,   297,  -274,  -274,   297,  -274,  -274,
-    -274,    12,   160,  -274,  -274,  -274,  -274,   175,  -274,    10,
-     445,  -274,  -274,  -274,  -274,  -274,  -274,  -274,  -274,  -274,
-    -274,   388,   393,   366,  -274,  -274,   331,  -274,    16,    91,
-    -274,    43,  -274,  -274,   427,   366,   393,  -274,  -274,  -274,
-    -274,  -274,  -274,  -274,  -274,  -274,    43,    22,  -274,  -274,
-    -274,    18,  -274,  -274,  -274
+     104,  -292,  -292,    27,   104,  -292,  -292,  -292,  -292,   -75,
+      71,    17,  -292,  -292,  -292,  -292,    81,  -292,   -36,   141,
+    -292,  -292,    90,   107,   134,   139,   182,   172,   181,   141,
+    -292,   156,  -292,  -292,  -292,  -292,  -292,   243,  -292,  -292,
+     245,    73,   235,  -292,   222,  -292,   171,  -292,    80,  -292,
+     183,  -292,  -292,   167,   528,  -292,  -292,  -292,   186,   191,
+    -292,   190,   186,  -292,   -21,  -292,   196,  -292,  -292,   293,
+    -292,  -292,  -292,  -292,  -292,  -292,  -292,  -292,  -292,  -292,
+    -292,  -292,  -292,   528,  -292,  -292,  -292,  -292,  -292,   279,
+     696,  -292,  -292,  -292,  -292,   104,   186,   204,  -292,  -292,
+      -5,   201,  -292,   237,  -292,   249,   262,  -292,  -292,  -292,
+    -292,  -292,   284,   255,  -292,  -292,  -292,   772,   341,   238,
+    -292,   244,  -292,  -292,   227,   350,   -75,  -292,  -292,  -292,
+     247,     5,  -292,  -292,  -292,  -292,   -12,   186,  -292,  -292,
+    -292,  -292,  -292,     2,  -292,   248,  -292,   250,   251,    95,
+      68,  -292,   270,   206,  -292,  -292,   233,  -292,  -292,  -292,
+     347,   620,    36,  -292,  -292,  -292,  -292,  -292,   360,   772,
+     186,   186,   442,  -292,  -292,  -292,  -292,  -292,  -292,  -292,
+    -292,  -292,  -292,  -292,   121,  -292,  -292,  -292,  -292,  -292,
+    -292,  -292,  -292,   124,  -292,  -292,   256,  -292,  -292,   252,
+    -292,  -292,  -292,  -292,  -292,  -292,  -292,  -292,   253,   254,
+     162,    52,   126,  -292,   257,   325,   271,   307,    89,    96,
+    -292,  -292,   272,   397,  -292,  -292,  -292,   273,    -5,  -292,
+    -292,  -292,  -292,  -292,  -292,   280,  -292,  -292,   105,    57,
+    -292,  -292,   277,  -292,   442,  -292,   275,   281,   211,   215,
+    -292,   285,  -292,   278,   105,  -292,  -292,  -292,  -292,  -292,
+    -292,  -292,    95,  -292,    30,   216,   304,   380,   381,   206,
+    -292,  -292,   206,  -292,    20,    76,    20,  -292,  -292,   299,
+      76,    20,   296,   233,  -292,   363,    58,   311,    40,   324,
+      40,   326,   442,   368,   286,   104,   291,   292,  -292,  -292,
+    -292,   306,  -292,   442,  -292,  -292,   554,   297,   309,   234,
+    -292,  -292,   317,   320,   318,  -292,   310,  -292,  -292,   554,
+    -292,  -292,   554,   554,   442,   411,  -292,  -292,   319,   327,
+    -292,  -292,  -292,   426,  -292,  -292,  -292,  -292,   312,  -292,
+    -292,  -292,    20,  -292,  -292,   348,  -292,  -292,  -292,   381,
+     322,   129,  -292,  -292,  -292,   286,  -292,   364,   332,   323,
+    -292,  -292,    20,   286,   381,   333,   381,   334,   335,  -292,
+     337,  -292,  -292,   330,   349,  -292,  -292,   340,  -292,  -292,
+     442,   273,     9,  -292,   331,   215,  -292,  -292,   351,  -292,
+    -292,  -292,  -292,  -292,  -292,  -292,  -292,   357,  -292,   216,
+    -292,    58,  -292,   286,  -292,    41,  -292,    20,   286,  -292,
+    -292,   286,  -292,  -292,  -292,    26,   140,  -292,  -292,  -292,
+    -292,   151,  -292,    36,   509,  -292,  -292,  -292,  -292,  -292,
+    -292,  -292,  -292,  -292,  -292,   380,   381,   352,  -292,  -292,
+     330,  -292,     9,   131,  -292,    19,  -292,  -292,   426,   352,
+     381,  -292,  -292,  -292,  -292,  -292,  -292,  -292,  -292,  -292,
+      19,    53,  -292,  -292,  -292,    43,  -292,  -292,  -292
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const short yypgoto[] =
 {
-    -274,  -274,  -274,   482,  -274,  -274,   362,  -274,   473,  -274,
-    -274,   461,  -274,  -274,  -274,   408,  -274,  -274,  -274,  -274,
-    -274,  -274,   430,  -274,   401,  -274,  -274,  -274,   440,   355,
-    -274,   -61,  -274,  -274,   330,  -274,   240,   214,  -274,   100,
-    -274,   108,   276,  -274,  -274,   226,  -274,  -274,  -274,    52,
-    -172,  -273,   -96,  -274,   -76,  -274,   228,  -274,   250,  -136,
-     301,   304,  -274,    39,  -274,  -125,  -253,  -119,    85,   -12,
-      -7,  -274,    21,  -274,  -274,  -216,  -274,  -274,   209,  -165,
-      98,  -274,   205,   204,  -221,  -274,  -140,  -274,  -274,  -274,
-      86,  -274,  -274,  -274,  -274,  -274,  -274,   271,  -274,  -274,
-    -274,  -274,    90,    95,  -259,  -274,  -274,  -274,   275,  -141,
-    -274,   -74,  -274,  -274,  -274,  -274,     1,  -274,   166,   -10
+    -292,  -292,  -292,   462,  -292,  -292,   342,  -292,   451,  -292,
+    -292,   440,  -292,  -292,  -292,   388,  -292,  -292,  -292,  -292,
+    -292,  -292,   412,  -292,   377,  -292,  -292,  -292,   417,   329,
+    -292,   -68,  -292,  -292,   314,  -292,   217,   188,  -292,    75,
+    -292,    83,   258,  -292,  -292,   198,  -292,  -292,  -292,    25,
+    -193,  -278,   -98,  -292,   -97,  -292,   200,  -292,   223,  -142,
+     283,   287,  -292,    21,  -292,  -140,  -258,  -137,    55,   -71,
+     -52,  -292,   -30,  -292,  -292,  -215,  -292,  -292,   179,  -161,
+      72,  -292,   176,   177,  -291,  -292,  -292,  -118,  -292,  -292,
+    -292,    59,  -292,  -292,  -292,  -292,  -292,  -292,   246,  -292,
+    -292,  -292,  -292,    63,    70,  -255,  -292,  -292,  -292,   264,
+    -136,  -292,  -110,  -292,  -292,  -292,  -292,     1,  -292,   143,
+     -10
 };
 
 /* 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, parse error.  */
-#define YYTABLE_NINF -274
+#define YYTABLE_NINF -277
 static const short yytable[] =
 {
-      18,     6,   287,   289,   133,     6,    18,   245,   189,   195,
-     324,   349,   189,   333,   335,   336,   201,    13,    14,   339,
-     340,    13,   454,    95,   187,    13,   454,   130,   168,   125,
-     188,    51,   169,     7,   188,   197,   198,   455,   270,   197,
-     198,   455,    50,    67,    90,    13,    14,   454,    51,    13,
-     177,   178,    67,   186,    66,    89,    10,   268,   269,    50,
-     197,   198,   455,    66,   174,   175,   176,    13,   177,   178,
-     270,   179,   180,    90,   271,    88,    13,    13,   310,   392,
-      13,    13,    32,   371,    89,    96,    67,     1,     2,    13,
-     177,   178,     1,     2,    46,   222,   126,    66,   383,   402,
-     220,   163,   353,   353,    88,   145,   271,   157,   181,   131,
-     146,   449,   164,   -25,   272,   277,    41,    15,   147,   189,
-     223,   195,   325,   416,   349,   363,   189,   167,   201,   189,
-     432,   462,   303,   456,   464,   187,   370,   456,   166,   190,
-     196,   188,   423,   209,   428,    20,    19,   191,   188,   182,
-     334,   188,    22,   202,   208,   384,   131,   145,   456,    31,
-     231,   233,   146,   158,   186,   450,   172,   375,    33,   451,
-     147,   230,   232,   131,   346,   346,   -84,   159,   346,   222,
-     305,   386,   131,   131,    47,    34,   131,   191,   350,   192,
-      35,   259,    13,   306,   222,   260,   365,   261,     1,     2,
-      36,   262,   286,   439,   223,   174,   175,   176,    13,   177,
-     178,    37,   179,   180,     1,     2,    39,   288,   175,   223,
-      13,   177,   178,   234,   179,   180,     1,     2,   280,    57,
-      58,   396,   281,   235,    60,   397,   175,    52,    13,   177,
-     178,   234,   179,   180,     1,     2,    40,   291,   292,   181,
-     190,   235,   196,   326,   424,   398,   330,   209,   210,   211,
-     209,   236,   237,   403,   208,   268,   269,   203,   208,   435,
-      56,   208,    53,   436,   351,    13,   359,   238,   359,   236,
-     237,     1,     2,    23,   437,   463,    59,   270,   438,   463,
-     182,    92,    24,    93,   366,   238,   239,    97,    13,   177,
-     178,   350,   240,   426,     1,     2,   331,   204,    98,   332,
-     128,   241,   137,    25,   239,    26,   308,   309,   242,   293,
-     240,   243,   138,   271,    27,     1,     2,   197,   198,   241,
-     429,   313,   314,   430,   139,   394,   242,   316,   317,   243,
-     197,   198,   101,   102,   140,   390,   391,   141,   100,   142,
-     405,   148,   405,   442,   443,   149,   152,   153,  -273,   150,
-     101,   102,  -273,   156,   131,   172,   170,   171,   419,   214,
-     228,   263,   103,    68,   104,   283,   105,   264,   266,   267,
-     282,   284,   285,   312,   290,   326,   106,   351,   301,   304,
-     107,   359,   311,   328,   108,   319,   208,   109,    70,    71,
-      72,   434,    13,   320,   337,   341,   345,   360,   110,    73,
-     362,   364,   131,   111,    74,   112,    75,   113,   367,   368,
-     369,   372,   434,   373,    76,   376,   114,   115,   419,   378,
-     379,   380,   389,    77,   393,    78,   460,   387,   399,   395,
-      79,   116,    80,    81,    82,   401,   409,   388,   400,   406,
-     410,   411,   175,   117,    13,   177,   178,   234,   179,   180,
-       1,     2,   408,   414,   421,   415,   175,   235,    13,   177,
-     178,   234,   179,   180,     1,     2,   175,   420,    13,   177,
-     178,   234,   179,   180,   446,   422,     8,    13,   154,    21,
-      38,    99,    94,     1,     2,   236,   237,   127,    91,   229,
-     322,   427,   361,   173,   302,   425,    68,   344,   461,   236,
-     237,   238,   278,   352,   327,   279,   444,   377,   440,   236,
-     381,    69,   382,   321,   448,   238,   447,   445,   407,     0,
-     239,    70,    71,    72,   374,     0,   240,   323,     0,     0,
-       0,     0,    73,     0,   239,   241,     0,    74,     0,    75,
-     240,     0,     0,     0,     0,   243,     0,    76,     0,   241,
-     240,     0,     0,     0,     0,     0,    77,     0,    78,   243,
-     101,   102,     0,    79,     0,    80,    81,    82,   215,     0,
-       0,     0,   103,    68,   104,     0,   105,   216,     0,     0,
-       0,     0,     0,     0,     0,     0,   106,     0,     0,     0,
-     107,     0,     0,     0,   108,     0,     0,   109,    70,    71,
-      72,     0,     0,     0,     0,     0,   217,     0,   110,    73,
-       0,     0,     0,   111,    74,   112,    75,   113,     0,     0,
-       0,     0,     0,     0,    76,     0,   114,   115,   218,   219,
-       0,     0,     0,    77,     0,    78,   101,   102,     0,     0,
-      79,   116,    80,    81,    82,     0,     0,     0,   103,    68,
-     104,     0,   105,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   106,     0,     0,     0,   107,     0,     0,     0,
-     108,     0,     0,   109,    70,    71,    72,     0,     0,     0,
-       0,     0,     0,     0,   110,    73,     0,     0,     0,   111,
-      74,   112,    75,   113,     0,     0,     0,     0,     0,     0,
-      76,     0,   114,   115,     0,     0,     0,     0,     0,    77,
-       0,    78,     1,     2,     0,     0,    79,   116,    80,    81,
-      82,     0,     0,     0,   103,    68,   104,     0,   105,     0,
-     175,     0,    13,   177,   178,   234,   179,   180,   106,     0,
-       0,     0,   107,     0,     0,     0,   108,     0,     0,   109,
-      70,    71,    72,     0,     0,     0,     0,     0,     0,     0,
-     110,    73,     0,     0,     0,   111,    74,   112,    75,   113,
-       0,     0,     0,   236,     0,     0,    76,     0,   114,   115,
-       0,     0,     0,     0,     0,    77,     0,    78,   385,     0,
-       0,     0,    79,   116,    80,    81,    82,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   240
+      18,     6,   133,   289,   291,     6,    18,   328,   353,   187,
+     201,   246,   188,   189,   195,   375,   188,   189,    13,   337,
+     339,   340,   125,   458,    88,   343,   344,     7,   130,   157,
+      95,    51,   387,    10,   163,    13,   197,   198,   459,    13,
+     177,   178,    50,    67,    90,   164,   145,   458,    51,    13,
+      13,   186,    67,    88,    66,    89,    19,   458,   272,    50,
+     197,   198,   459,    66,   310,   146,    13,    13,   270,   271,
+     197,   198,   459,    90,    22,   357,   357,    13,   177,   178,
+      13,    14,    13,   314,    89,   158,    67,   396,     1,     2,
+      13,    14,    96,   220,   273,    46,   126,    66,   145,   159,
+      31,   174,   175,   176,    13,   177,   178,   406,   179,   180,
+     131,   168,   274,   279,   272,   169,   420,   146,   147,     1,
+       2,   222,   187,   353,   201,   188,   189,   167,   195,   329,
+     305,   367,   188,   189,   460,   188,   189,   191,   166,   190,
+     196,   427,   374,   209,   436,   181,   223,   350,   350,   -84,
+     273,   453,   432,   202,   208,   131,   131,    23,   460,   468,
+     231,   233,   466,   388,   186,   350,    24,   131,   460,    32,
+     147,   230,   232,   131,   222,   191,    13,   192,   270,   271,
+      15,   222,     1,     2,    37,    47,   182,    25,   354,    26,
+      20,   379,    57,    58,   338,    13,   369,   288,    27,   223,
+     272,     1,     2,   172,   290,   454,   223,   390,   443,   455,
+     131,   307,   174,   175,   176,    13,   177,   178,    60,   179,
+     180,     1,     2,    33,   308,    13,   177,   178,    34,   311,
+     261,     1,     2,   263,   262,   282,   273,   264,   400,   283,
+      35,   175,   401,    13,   177,   178,   234,   179,   180,   439,
+     210,   211,   190,   440,   196,   330,   181,   402,   334,   209,
+     441,    36,   209,   428,   442,   407,   208,    39,   467,    40,
+     208,  -276,   467,   208,   203,  -276,   355,   131,   363,    52,
+     363,    53,   100,    56,   236,     1,     2,   197,   198,   -25,
+     335,    59,    41,   336,   101,   102,   370,   182,   433,   378,
+      92,   434,    93,   354,    97,   430,   103,    68,   104,    98,
+     105,   312,   313,   128,   204,   317,   318,   320,   321,   137,
+     106,   197,   198,   138,   107,   241,   101,   102,   108,   394,
+     395,   109,    70,    71,    72,   139,   446,   447,   140,   398,
+     141,   142,   110,    73,   148,   152,   149,   111,    74,   112,
+      75,   113,   150,   153,   409,   156,   409,   214,    76,   172,
+     114,   115,   170,   228,   171,   285,   265,    77,   269,    78,
+     266,   268,   423,   284,    79,   116,    80,    81,    82,   286,
+     287,   306,   292,   303,   315,   332,   323,   117,   324,   330,
+      13,   355,   341,   349,   316,   363,   345,   364,   368,   366,
+     208,   131,   371,   372,   175,   438,    13,   177,   178,   234,
+     179,   180,     1,     2,   373,   377,   376,   384,   175,   235,
+      13,   177,   178,   234,   179,   180,   438,   380,   382,   383,
+     391,   393,   423,   293,   294,   397,   405,   403,   392,   399,
+     464,   404,   410,   413,   424,   412,   414,   236,   237,   175,
+     415,    13,   177,   178,   234,   179,   180,     1,     2,   419,
+     418,   236,   425,   238,   235,   426,     8,    21,   154,    38,
+     450,    99,   239,   127,    94,    91,   389,   173,   365,   326,
+     431,   348,   240,   229,   429,   465,   304,   356,   241,   331,
+     448,   381,   236,   237,   280,   385,   444,   242,   281,   386,
+     325,   452,   241,   451,   243,   295,   449,   244,   238,   411,
+       0,     0,     0,     0,     0,     0,   175,   239,    13,   177,
+     178,   234,   179,   180,     1,     2,     0,   240,   327,     0,
+       0,   235,     0,   241,     0,     0,     0,    13,     0,     0,
+       0,     0,   242,     1,     2,     0,     0,     0,     0,   243,
+       0,     0,   244,     0,     0,     0,    68,     0,     0,   236,
+     237,   175,     0,    13,   177,   178,   234,   179,   180,     1,
+       2,    69,     0,     0,     0,   238,     0,     0,     0,     0,
+       0,    70,    71,    72,   239,     0,     0,     0,     0,     0,
+       0,     0,    73,     0,   240,     0,     0,    74,     0,    75,
+     241,     0,     0,     0,   236,   237,     0,    76,     0,   242,
+       0,     0,     0,     0,     0,     0,    77,     0,    78,   244,
+     238,     0,     0,    79,     0,    80,    81,    82,     0,   239,
+       0,     0,     0,     0,     0,   101,   102,     0,     0,   240,
+       0,     0,     0,   215,     0,   241,     0,   103,    68,   104,
+       0,   105,   216,     0,   242,     0,     0,     0,     0,     0,
+       0,   106,     0,     0,   244,   107,     0,     0,     0,   108,
+       0,     0,   109,    70,    71,    72,     0,     0,     0,     0,
+       0,   217,     0,   110,    73,     0,     0,     0,   111,    74,
+     112,    75,   113,     0,     0,     0,     0,     0,     0,    76,
+       0,   114,   115,   218,   219,     0,     0,     0,    77,     0,
+      78,   101,   102,     0,     0,    79,   116,    80,    81,    82,
+       0,     0,     0,   103,    68,   104,     0,   105,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   106,     0,     0,
+       0,   107,     0,     0,     0,   108,     0,     0,   109,    70,
+      71,    72,     0,     0,     0,     0,     0,     0,     0,   110,
+      73,     0,     0,     0,   111,    74,   112,    75,   113,     0,
+       0,     0,     0,     0,     0,    76,     0,   114,   115,     0,
+       0,     0,     0,     0,    77,     0,    78,     1,     2,     0,
+       0,    79,   116,    80,    81,    82,     0,     0,     0,   103,
+      68,   104,     0,   105,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   106,     0,     0,     0,   107,     0,     0,
+       0,   108,     0,     0,   109,    70,    71,    72,     0,     0,
+       0,     0,     0,     0,     0,   110,    73,     0,     0,     0,
+     111,    74,   112,    75,   113,     0,     0,     0,     0,     0,
+       0,    76,     0,   114,   115,     0,     0,     0,     0,     0,
+      77,     0,    78,     0,     0,     0,     0,    79,   116,    80,
+      81,    82
 };
 
 static const short yycheck[] =
 {
-      10,     0,   218,   219,   100,     4,    16,   172,   149,   150,
-     263,   284,   153,   272,   273,   274,   152,     9,    10,   278,
-     279,     9,     4,    51,   149,     9,     4,    33,   109,    90,
-     149,    41,   113,     0,   153,    17,    18,    19,    38,    17,
-      18,    19,    41,    53,    54,     9,    10,     4,    58,     9,
-      10,    11,    62,   149,    53,    54,   108,    16,    17,    58,
-      17,    18,    19,    62,     6,     7,     8,     9,    10,    11,
-      38,    13,    14,    83,    74,    54,     9,     9,   243,   338,
-       9,     9,    62,   304,    83,   113,    96,    15,    16,     9,
-      10,    11,    15,    16,    22,    85,    95,    96,   319,   358,
-     161,    46,    35,    35,    83,   117,    74,    24,    50,   115,
-     117,    20,    57,    44,   210,   211,    47,   109,   117,   260,
-     110,   262,   263,   107,   397,   290,   267,   137,   264,   270,
-     118,   109,   228,   115,   116,   260,   301,   115,   137,   149,
-     150,   260,   395,   153,   403,   109,    39,   107,   267,    91,
-     118,   270,   110,   152,   153,   320,   115,   169,   115,    10,
-     170,   171,   169,    80,   260,    74,   108,   307,    89,    78,
-     169,   170,   171,   115,   107,   107,   109,    94,   107,    85,
-     106,   321,   115,   115,   112,    89,   115,   107,   284,   109,
-      58,   109,     9,   119,    85,   113,   292,   109,    15,    16,
-      89,   113,   108,   419,   110,     6,     7,     8,     9,    10,
-      11,     3,    13,    14,    15,    16,   111,   108,     7,   110,
-       9,    10,    11,    12,    13,    14,    15,    16,   109,   112,
-     113,   109,   113,    22,    51,   113,     7,    44,     9,    10,
-      11,    12,    13,    14,    15,    16,    26,    36,    37,    50,
-     260,    22,   262,   263,   395,   351,   266,   267,    17,    18,
-     270,    50,    51,   359,   263,    16,    17,    68,   267,   109,
-     112,   270,    59,   113,   284,     9,   286,    66,   288,    50,
-      51,    15,    16,    16,   109,   457,   108,    38,   113,   461,
-      91,   109,    25,   112,   293,    66,    85,   108,     9,    10,
-      11,   397,    91,   399,    15,    16,   267,   108,    16,   270,
-     109,   100,   118,    46,    85,    48,    34,    35,   107,   108,
-      91,   110,    86,    74,    57,    15,    16,    17,    18,   100,
-     404,   104,   105,   407,    86,   345,   107,   102,   103,   110,
-      17,    18,    15,    16,    76,    17,    18,    56,     3,    86,
-     360,     3,   362,   429,   430,   108,   118,     3,   109,   108,
-      15,    16,   113,   108,   115,   108,   114,   114,   378,    10,
-       3,   110,    27,    28,    29,    40,    31,   118,   118,   114,
-     116,   108,    73,   113,   110,   395,    41,   397,   110,   101,
-      45,   401,   109,     5,    49,   101,   395,    52,    53,    54,
-      55,   411,     9,   110,    93,   100,    30,    73,    63,    64,
-      73,    30,   115,    68,    69,    70,    71,    72,   111,   111,
-     108,   119,   432,   106,    79,   110,    81,    82,   438,   108,
-     111,   107,     5,    88,    87,    90,   446,   111,    73,   117,
-      95,    96,    97,    98,    99,   113,   108,   111,   109,   109,
-     109,   120,     7,   108,     9,    10,    11,    12,    13,    14,
-      15,    16,   111,   111,   111,   119,     7,    22,     9,    10,
-      11,    12,    13,    14,    15,    16,     7,   113,     9,    10,
-      11,    12,    13,    14,   118,   108,     4,     9,   126,    16,
-      29,    83,    62,    15,    16,    50,    51,    96,    58,   169,
-     260,   401,   288,   148,   228,   397,    28,   281,   456,    50,
-      51,    66,   211,   285,   264,   211,   431,   308,   420,    50,
-     315,    43,   318,   252,   438,    66,   436,   432,   362,    -1,
-      85,    53,    54,    55,    65,    -1,    91,   262,    -1,    -1,
-      -1,    -1,    64,    -1,    85,   100,    -1,    69,    -1,    71,
-      91,    -1,    -1,    -1,    -1,   110,    -1,    79,    -1,   100,
-      91,    -1,    -1,    -1,    -1,    -1,    88,    -1,    90,   110,
-      15,    16,    -1,    95,    -1,    97,    98,    99,    23,    -1,
-      -1,    -1,    27,    28,    29,    -1,    31,    32,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    41,    -1,    -1,    -1,
-      45,    -1,    -1,    -1,    49,    -1,    -1,    52,    53,    54,
-      55,    -1,    -1,    -1,    -1,    -1,    61,    -1,    63,    64,
-      -1,    -1,    -1,    68,    69,    70,    71,    72,    -1,    -1,
-      -1,    -1,    -1,    -1,    79,    -1,    81,    82,    83,    84,
-      -1,    -1,    -1,    88,    -1,    90,    15,    16,    -1,    -1,
-      95,    96,    97,    98,    99,    -1,    -1,    -1,    27,    28,
-      29,    -1,    31,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    41,    -1,    -1,    -1,    45,    -1,    -1,    -1,
-      49,    -1,    -1,    52,    53,    54,    55,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    63,    64,    -1,    -1,    -1,    68,
-      69,    70,    71,    72,    -1,    -1,    -1,    -1,    -1,    -1,
-      79,    -1,    81,    82,    -1,    -1,    -1,    -1,    -1,    88,
-      -1,    90,    15,    16,    -1,    -1,    95,    96,    97,    98,
-      99,    -1,    -1,    -1,    27,    28,    29,    -1,    31,    -1,
-       7,    -1,     9,    10,    11,    12,    13,    14,    41,    -1,
-      -1,    -1,    45,    -1,    -1,    -1,    49,    -1,    -1,    52,
-      53,    54,    55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      63,    64,    -1,    -1,    -1,    68,    69,    70,    71,    72,
-      -1,    -1,    -1,    50,    -1,    -1,    79,    -1,    81,    82,
-      -1,    -1,    -1,    -1,    -1,    88,    -1,    90,    65,    -1,
-      -1,    -1,    95,    96,    97,    98,    99,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    91
+      10,     0,   100,   218,   219,     4,    16,   265,   286,   149,
+     152,   172,   149,   149,   150,   306,   153,   153,     9,   274,
+     275,   276,    90,     4,    54,   280,   281,     0,    33,    24,
+      51,    41,   323,   108,    46,     9,    17,    18,    19,     9,
+      10,    11,    41,    53,    54,    57,   117,     4,    58,     9,
+       9,   149,    62,    83,    53,    54,    39,     4,    38,    58,
+      17,    18,    19,    62,     7,   117,     9,     9,    16,    17,
+      17,    18,    19,    83,   110,    35,    35,     9,    10,    11,
+       9,    10,     9,   244,    83,    80,    96,   342,    15,    16,
+       9,    10,   113,   161,    74,    22,    95,    96,   169,    94,
+      10,     6,     7,     8,     9,    10,    11,   362,    13,    14,
+     115,   109,   210,   211,    38,   113,   107,   169,   117,    15,
+      16,    85,   262,   401,   266,   262,   262,   137,   264,   265,
+     228,   292,   269,   269,   115,   272,   272,   107,   137,   149,
+     150,   399,   303,   153,   118,    50,   110,   107,   107,   109,
+      74,    20,   407,   152,   153,   115,   115,    16,   115,   116,
+     170,   171,   109,   324,   262,   107,    25,   115,   115,    62,
+     169,   170,   171,   115,    85,   107,     9,   109,    16,    17,
+     109,    85,    15,    16,     3,   112,    91,    46,   286,    48,
+     109,   309,   112,   113,   118,     9,   294,   108,    57,   110,
+      38,    15,    16,   108,   108,    74,   110,   325,   423,    78,
+     115,   106,     6,     7,     8,     9,    10,    11,    51,    13,
+      14,    15,    16,    89,   119,     9,    10,    11,    89,   239,
+     109,    15,    16,   109,   113,   109,    74,   113,   109,   113,
+      58,     7,   113,     9,    10,    11,    12,    13,    14,   109,
+      17,    18,   262,   113,   264,   265,    50,   355,   268,   269,
+     109,    89,   272,   399,   113,   363,   265,   111,   461,    26,
+     269,   109,   465,   272,    68,   113,   286,   115,   288,    44,
+     290,    59,     3,   112,    50,    15,    16,    17,    18,    44,
+     269,   108,    47,   272,    15,    16,   295,    91,   408,    65,
+     109,   411,   112,   401,   108,   403,    27,    28,    29,    16,
+      31,    34,    35,   109,   108,   104,   105,   102,   103,   118,
+      41,    17,    18,    86,    45,    91,    15,    16,    49,    17,
+      18,    52,    53,    54,    55,    86,   433,   434,    76,   349,
+      56,    86,    63,    64,     3,   118,   108,    68,    69,    70,
+      71,    72,   108,     3,   364,   108,   366,    10,    79,   108,
+      81,    82,   114,     3,   114,    40,   110,    88,   114,    90,
+     118,   118,   382,   116,    95,    96,    97,    98,    99,   108,
+      73,   101,   110,   110,   109,     5,   101,   108,   110,   399,
+       9,   401,    93,    30,   113,   405,   100,    73,    30,    73,
+     399,   115,   111,   111,     7,   415,     9,    10,    11,    12,
+      13,    14,    15,    16,   108,   106,   119,   107,     7,    22,
+       9,    10,    11,    12,    13,    14,   436,   110,   108,   111,
+     111,     5,   442,    36,    37,    87,   113,    73,   111,   117,
+     450,   109,   109,   108,   113,   111,   109,    50,    51,     7,
+     120,     9,    10,    11,    12,    13,    14,    15,    16,   119,
+     111,    50,   111,    66,    22,   108,     4,    16,   126,    29,
+     118,    83,    75,    96,    62,    58,    65,   148,   290,   262,
+     405,   283,    85,   169,   401,   460,   228,   287,    91,   266,
+     435,   312,    50,    51,   211,   319,   424,   100,   211,   322,
+     254,   442,    91,   440,   107,   108,   436,   110,    66,   366,
+      -1,    -1,    -1,    -1,    -1,    -1,     7,    75,     9,    10,
+      11,    12,    13,    14,    15,    16,    -1,    85,   264,    -1,
+      -1,    22,    -1,    91,    -1,    -1,    -1,     9,    -1,    -1,
+      -1,    -1,   100,    15,    16,    -1,    -1,    -1,    -1,   107,
+      -1,    -1,   110,    -1,    -1,    -1,    28,    -1,    -1,    50,
+      51,     7,    -1,     9,    10,    11,    12,    13,    14,    15,
+      16,    43,    -1,    -1,    -1,    66,    -1,    -1,    -1,    -1,
+      -1,    53,    54,    55,    75,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    64,    -1,    85,    -1,    -1,    69,    -1,    71,
+      91,    -1,    -1,    -1,    50,    51,    -1,    79,    -1,   100,
+      -1,    -1,    -1,    -1,    -1,    -1,    88,    -1,    90,   110,
+      66,    -1,    -1,    95,    -1,    97,    98,    99,    -1,    75,
+      -1,    -1,    -1,    -1,    -1,    15,    16,    -1,    -1,    85,
+      -1,    -1,    -1,    23,    -1,    91,    -1,    27,    28,    29,
+      -1,    31,    32,    -1,   100,    -1,    -1,    -1,    -1,    -1,
+      -1,    41,    -1,    -1,   110,    45,    -1,    -1,    -1,    49,
+      -1,    -1,    52,    53,    54,    55,    -1,    -1,    -1,    -1,
+      -1,    61,    -1,    63,    64,    -1,    -1,    -1,    68,    69,
+      70,    71,    72,    -1,    -1,    -1,    -1,    -1,    -1,    79,
+      -1,    81,    82,    83,    84,    -1,    -1,    -1,    88,    -1,
+      90,    15,    16,    -1,    -1,    95,    96,    97,    98,    99,
+      -1,    -1,    -1,    27,    28,    29,    -1,    31,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    41,    -1,    -1,
+      -1,    45,    -1,    -1,    -1,    49,    -1,    -1,    52,    53,
+      54,    55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    63,
+      64,    -1,    -1,    -1,    68,    69,    70,    71,    72,    -1,
+      -1,    -1,    -1,    -1,    -1,    79,    -1,    81,    82,    -1,
+      -1,    -1,    -1,    -1,    88,    -1,    90,    15,    16,    -1,
+      -1,    95,    96,    97,    98,    99,    -1,    -1,    -1,    27,
+      28,    29,    -1,    31,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    41,    -1,    -1,    -1,    45,    -1,    -1,
+      -1,    49,    -1,    -1,    52,    53,    54,    55,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    63,    64,    -1,    -1,    -1,
+      68,    69,    70,    71,    72,    -1,    -1,    -1,    -1,    -1,
+      -1,    79,    -1,    81,    82,    -1,    -1,    -1,    -1,    -1,
+      88,    -1,    90,    -1,    -1,    -1,    -1,    95,    96,    97,
+      98,    99
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const unsigned char yystos[] =
 {
-       0,    15,    16,   122,   123,   124,   237,     0,   124,   125,
-     108,   126,   127,     9,    10,   109,   128,   129,   240,    39,
+       0,    15,    16,   122,   123,   124,   238,     0,   124,   125,
+     108,   126,   127,     9,    10,   109,   128,   129,   241,    39,
      109,   129,   110,    16,    25,    46,    48,    57,   130,   131,
      132,    10,    62,    89,    89,    58,    89,     3,   132,   111,
       26,    47,   133,   134,   146,   147,    22,   112,   148,   149,
-     237,   240,    44,    59,   138,   139,   112,   112,   113,   108,
-      51,   140,   141,   143,   144,   145,   237,   240,    28,    43,
+     238,   241,    44,    59,   138,   139,   112,   112,   113,   108,
+      51,   140,   141,   143,   144,   145,   238,   241,    28,    43,
       53,    54,    55,    64,    69,    71,    79,    88,    90,    95,
-      97,    98,    99,   135,   136,   151,   153,   183,   193,   237,
-     240,   149,   109,   112,   143,    51,   113,   108,    16,   136,
+      97,    98,    99,   135,   136,   151,   153,   183,   193,   238,
+     241,   149,   109,   112,   143,    51,   113,   108,    16,   136,
        3,    15,    16,    27,    29,    31,    41,    45,    49,    52,
       63,    68,    70,    72,    81,    82,    96,   108,   152,   177,
-     190,   191,   192,   193,   238,   152,   237,   145,   109,   137,
-      33,   115,   163,   173,   232,   233,   234,   118,    86,    86,
-      76,    56,    86,   154,   155,   190,   191,   237,     3,   108,
-     108,   227,   118,     3,   127,   142,   108,    24,    80,    94,
-     235,   174,   175,    46,    57,   236,   237,   240,   109,   113,
+     190,   191,   192,   193,   239,   152,   238,   145,   109,   137,
+      33,   115,   163,   173,   233,   234,   235,   118,    86,    86,
+      76,    56,    86,   154,   155,   190,   191,   238,     3,   108,
+     108,   228,   118,     3,   127,   142,   108,    24,    80,    94,
+     236,   174,   175,    46,    57,   237,   238,   241,   109,   113,
      114,   114,   108,   150,     6,     7,     8,    10,    11,    13,
-      14,    50,    91,   150,   156,   157,   173,   186,   188,   230,
-     240,   107,   109,   228,   229,   230,   240,    17,    18,   178,
-     179,   180,   237,    68,   108,   184,   186,   187,   237,   240,
+      14,    50,    91,   150,   156,   157,   173,   186,   188,   231,
+     241,   107,   109,   229,   230,   231,   241,    17,    18,   178,
+     179,   180,   238,    68,   108,   184,   186,   187,   238,   241,
       17,    18,   165,   166,    10,    23,    32,    61,    83,    84,
      152,   176,    85,   110,   196,   197,   198,   199,     3,   155,
-     237,   240,   237,   240,    12,    22,    50,    51,    66,    85,
-      91,   100,   107,   110,   188,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,   230,   231,   237,   240,   109,
-     113,   109,   113,   110,   118,   185,   118,   114,    16,    17,
-      38,    74,   173,   181,   182,   225,   226,   173,   181,   182,
-     109,   113,   116,    40,   108,    73,   108,   196,   108,   196,
-     110,    36,    37,   108,   200,   214,   215,   217,   219,   220,
-     221,   110,   163,   173,   101,   106,   119,   218,    34,    35,
-     200,   109,   113,   104,   105,   194,   102,   103,   195,   101,
-     110,   218,   157,   229,   187,   230,   240,   179,     5,   189,
-     240,   184,   184,   225,   118,   225,   225,    93,   164,   225,
-     225,   100,   167,   168,   166,    30,   107,   161,   162,   172,
-     173,   240,   177,    35,   158,   159,   160,   172,   173,   240,
-      73,   158,    73,   200,    30,   173,   237,   111,   111,   108,
-     200,   205,   119,   106,    65,   207,   110,   199,   108,   111,
-     107,   203,   204,   205,   200,    65,   207,   111,   111,     5,
-      17,    18,   225,    87,   240,   117,   109,   113,   173,    73,
-     109,   113,   225,   173,   239,   240,   109,   239,   111,   108,
-     109,   120,   222,   223,   111,   119,   107,   210,   211,   240,
-     113,   111,   108,   187,   230,   162,   173,   160,   225,   232,
-     232,   216,   118,   224,   240,   109,   113,   109,   113,   196,
-     201,   169,   175,   175,   189,   224,   118,   223,   211,    20,
-      74,    78,   212,   213,     4,    19,   115,   170,   171,   180,
-     240,   170,   109,   171,   116
+     238,   241,   238,   241,    12,    22,    50,    51,    66,    75,
+      85,    91,   100,   107,   110,   188,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   210,   231,   232,   238,
+     241,   109,   113,   109,   113,   110,   118,   185,   118,   114,
+      16,    17,    38,    74,   173,   181,   182,   226,   227,   173,
+     181,   182,   109,   113,   116,    40,   108,    73,   108,   196,
+     108,   196,   110,    36,    37,   108,   200,   215,   216,   218,
+     220,   221,   222,   110,   163,   173,   101,   106,   119,   219,
+       7,   241,    34,    35,   200,   109,   113,   104,   105,   194,
+     102,   103,   195,   101,   110,   219,   157,   230,   187,   231,
+     241,   179,     5,   189,   241,   184,   184,   226,   118,   226,
+     226,    93,   164,   226,   226,   100,   167,   168,   166,    30,
+     107,   161,   162,   172,   173,   241,   177,    35,   158,   159,
+     160,   172,   173,   241,    73,   158,    73,   200,    30,   173,
+     238,   111,   111,   108,   200,   205,   119,   106,    65,   208,
+     110,   199,   108,   111,   107,   203,   204,   205,   200,    65,
+     208,   111,   111,     5,    17,    18,   226,    87,   241,   117,
+     109,   113,   173,    73,   109,   113,   226,   173,   240,   241,
+     109,   240,   111,   108,   109,   120,   223,   224,   111,   119,
+     107,   211,   212,   241,   113,   111,   108,   187,   231,   162,
+     173,   160,   226,   233,   233,   217,   118,   225,   241,   109,
+     113,   109,   113,   196,   201,   169,   175,   175,   189,   225,
+     118,   224,   212,    20,    74,    78,   213,   214,     4,    19,
+     115,   170,   171,   180,   241,   170,   109,   171,   116
 };
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
@@ -1835,14 +1848,14 @@
   switch (yyn)
     {
         case 2:
-#line 354 "asn1p_y.y"
+#line 355 "asn1p_y.y"
     {
 		*(void **)param = yyvsp[0].a_grammar;
 	}
     break;
 
   case 3:
-#line 360 "asn1p_y.y"
+#line 361 "asn1p_y.y"
     {
 		yyval.a_grammar = asn1p_new();
 		checkmem(yyval.a_grammar);
@@ -1851,7 +1864,7 @@
     break;
 
   case 4:
-#line 365 "asn1p_y.y"
+#line 366 "asn1p_y.y"
     {
 		yyval.a_grammar = yyvsp[-1].a_grammar;
 		TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next);
@@ -1859,12 +1872,12 @@
     break;
 
   case 5:
-#line 382 "asn1p_y.y"
+#line 383 "asn1p_y.y"
     { currentModule = asn1p_module_new(); }
     break;
 
   case 6:
-#line 387 "asn1p_y.y"
+#line 388 "asn1p_y.y"
     {
 
 		yyval.a_module = currentModule;
@@ -1885,31 +1898,31 @@
     break;
 
   case 7:
-#line 411 "asn1p_y.y"
+#line 412 "asn1p_y.y"
     { yyval.a_oid = 0; }
     break;
 
   case 8:
-#line 412 "asn1p_y.y"
+#line 413 "asn1p_y.y"
     { yyval.a_oid = yyvsp[0].a_oid; }
     break;
 
   case 9:
-#line 416 "asn1p_y.y"
+#line 417 "asn1p_y.y"
     {
 		yyval.a_oid = yyvsp[-1].a_oid;
 	}
     break;
 
   case 10:
-#line 419 "asn1p_y.y"
+#line 420 "asn1p_y.y"
     {
 		yyval.a_oid = 0;
 	}
     break;
 
   case 11:
-#line 425 "asn1p_y.y"
+#line 426 "asn1p_y.y"
     {
 		yyval.a_oid = asn1p_oid_new();
 		asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc);
@@ -1919,7 +1932,7 @@
     break;
 
   case 12:
-#line 431 "asn1p_y.y"
+#line 432 "asn1p_y.y"
     {
 		yyval.a_oid = yyvsp[-1].a_oid;
 		asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc);
@@ -1929,7 +1942,7 @@
     break;
 
   case 13:
-#line 440 "asn1p_y.y"
+#line 441 "asn1p_y.y"
     {					/* iso */
 		yyval.a_oid_arc.name = yyvsp[0].tv_str;
 		yyval.a_oid_arc.number = -1;
@@ -1937,7 +1950,7 @@
     break;
 
   case 14:
-#line 444 "asn1p_y.y"
+#line 445 "asn1p_y.y"
     {		/* iso(1) */
 		yyval.a_oid_arc.name = yyvsp[-3].tv_str;
 		yyval.a_oid_arc.number = yyvsp[-1].a_int;
@@ -1945,7 +1958,7 @@
     break;
 
   case 15:
-#line 448 "asn1p_y.y"
+#line 449 "asn1p_y.y"
     {					/* 1 */
 		yyval.a_oid_arc.name = 0;
 		yyval.a_oid_arc.number = yyvsp[0].a_int;
@@ -1953,61 +1966,61 @@
     break;
 
   case 16:
-#line 458 "asn1p_y.y"
+#line 459 "asn1p_y.y"
     { yyval.a_module_flags = MSF_NOFLAGS; }
     break;
 
   case 17:
-#line 459 "asn1p_y.y"
+#line 460 "asn1p_y.y"
     {
 		yyval.a_module_flags = yyvsp[0].a_module_flags;
 	}
     break;
 
   case 18:
-#line 468 "asn1p_y.y"
+#line 469 "asn1p_y.y"
     {
 		yyval.a_module_flags = yyvsp[0].a_module_flags;
 	}
     break;
 
   case 19:
-#line 471 "asn1p_y.y"
+#line 472 "asn1p_y.y"
     {
 		yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags;
 	}
     break;
 
   case 20:
-#line 480 "asn1p_y.y"
+#line 481 "asn1p_y.y"
     {
 		yyval.a_module_flags = MSF_EXPLICIT_TAGS;
 	}
     break;
 
   case 21:
-#line 483 "asn1p_y.y"
+#line 484 "asn1p_y.y"
     {
 		yyval.a_module_flags = MSF_IMPLICIT_TAGS;
 	}
     break;
 
   case 22:
-#line 486 "asn1p_y.y"
+#line 487 "asn1p_y.y"
     {
 		yyval.a_module_flags = MSF_AUTOMATIC_TAGS;
 	}
     break;
 
   case 23:
-#line 489 "asn1p_y.y"
+#line 490 "asn1p_y.y"
     {
 		yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED;
 	}
     break;
 
   case 24:
-#line 493 "asn1p_y.y"
+#line 494 "asn1p_y.y"
     {
 		/* X.680Amd1 specifies TAG and XER */
 		if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) {
@@ -2026,19 +2039,19 @@
     break;
 
   case 25:
-#line 514 "asn1p_y.y"
+#line 515 "asn1p_y.y"
     { yyval.a_module = 0; }
     break;
 
   case 26:
-#line 515 "asn1p_y.y"
+#line 516 "asn1p_y.y"
     {
 		yyval.a_module = yyvsp[0].a_module;
 	}
     break;
 
   case 27:
-#line 524 "asn1p_y.y"
+#line 525 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		AL_IMPORT(yyval.a_module, exports, yyvsp[-2].a_module, xp_next);
@@ -2048,14 +2061,14 @@
     break;
 
   case 28:
-#line 533 "asn1p_y.y"
+#line 534 "asn1p_y.y"
     {
 		yyval.a_module = yyvsp[0].a_module;
 	}
     break;
 
   case 29:
-#line 536 "asn1p_y.y"
+#line 537 "asn1p_y.y"
     {
 		if(yyvsp[-1].a_module) {
 			yyval.a_module = yyvsp[-1].a_module;
@@ -2068,7 +2081,7 @@
     break;
 
   case 30:
-#line 552 "asn1p_y.y"
+#line 553 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -2079,7 +2092,7 @@
     break;
 
   case 31:
-#line 559 "asn1p_y.y"
+#line 560 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -2090,7 +2103,7 @@
     break;
 
   case 32:
-#line 572 "asn1p_y.y"
+#line 573 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -2101,12 +2114,12 @@
     break;
 
   case 33:
-#line 580 "asn1p_y.y"
+#line 581 "asn1p_y.y"
     { asn1p_lexer_hack_push_encoding_control(); }
     break;
 
   case 34:
-#line 581 "asn1p_y.y"
+#line 582 "asn1p_y.y"
     {
 		fprintf(stderr,
 			"WARNING: ENCODING-CONTROL %s "
@@ -2118,7 +2131,7 @@
     break;
 
   case 35:
-#line 593 "asn1p_y.y"
+#line 594 "asn1p_y.y"
     {
 		return yyerror(
 			"Attempt to redefine a standard basic string type, "
@@ -2127,12 +2140,12 @@
     break;
 
   case 36:
-#line 606 "asn1p_y.y"
+#line 607 "asn1p_y.y"
     { yyval.a_module = 0; }
     break;
 
   case 38:
-#line 610 "asn1p_y.y"
+#line 611 "asn1p_y.y"
     {
 		if(!saved_aid && 0)
 			return yyerror("Unterminated IMPORTS FROM, "
@@ -2143,19 +2156,19 @@
     break;
 
   case 39:
-#line 620 "asn1p_y.y"
+#line 621 "asn1p_y.y"
     {
 		return yyerror("Empty IMPORTS list");
 	}
     break;
 
   case 40:
-#line 626 "asn1p_y.y"
+#line 627 "asn1p_y.y"
     { yyval.a_module = asn1p_module_new(); }
     break;
 
   case 42:
-#line 630 "asn1p_y.y"
+#line 631 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -2164,7 +2177,7 @@
     break;
 
   case 43:
-#line 635 "asn1p_y.y"
+#line 636 "asn1p_y.y"
     {
 		yyval.a_module = yyvsp[-1].a_module;
 		TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next);
@@ -2172,17 +2185,17 @@
     break;
 
   case 44:
-#line 642 "asn1p_y.y"
+#line 643 "asn1p_y.y"
     { memset(&yyval.a_aid, 0, sizeof(yyval.a_aid)); }
     break;
 
   case 45:
-#line 643 "asn1p_y.y"
+#line 644 "asn1p_y.y"
     { yyval.a_aid.oid = yyvsp[0].a_oid; }
     break;
 
   case 46:
-#line 647 "asn1p_y.y"
+#line 648 "asn1p_y.y"
     {
 		yyval.a_xports = yyvsp[-3].a_xports;
 		yyval.a_xports->fromModuleName = yyvsp[-1].tv_str;
@@ -2194,7 +2207,7 @@
     break;
 
   case 47:
-#line 658 "asn1p_y.y"
+#line 659 "asn1p_y.y"
     {
 		yyval.a_xports = asn1p_xports_new();
 		checkmem(yyval.a_xports);
@@ -2203,7 +2216,7 @@
     break;
 
   case 48:
-#line 663 "asn1p_y.y"
+#line 664 "asn1p_y.y"
     {
 		yyval.a_xports = yyvsp[-2].a_xports;
 		TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next);
@@ -2211,7 +2224,7 @@
     break;
 
   case 49:
-#line 670 "asn1p_y.y"
+#line 671 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2221,7 +2234,7 @@
     break;
 
   case 50:
-#line 676 "asn1p_y.y"
+#line 677 "asn1p_y.y"
     {		/* Completely equivalent to above */
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2231,7 +2244,7 @@
     break;
 
   case 51:
-#line 682 "asn1p_y.y"
+#line 683 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2241,12 +2254,12 @@
     break;
 
   case 52:
-#line 692 "asn1p_y.y"
+#line 693 "asn1p_y.y"
     { yyval.a_module = 0; }
     break;
 
   case 53:
-#line 693 "asn1p_y.y"
+#line 694 "asn1p_y.y"
     {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -2259,21 +2272,21 @@
     break;
 
   case 54:
-#line 705 "asn1p_y.y"
+#line 706 "asn1p_y.y"
     {
 		yyval.a_xports = yyvsp[-1].a_xports;
 	}
     break;
 
   case 55:
-#line 708 "asn1p_y.y"
+#line 709 "asn1p_y.y"
     {
 		yyval.a_xports = 0;
 	}
     break;
 
   case 56:
-#line 711 "asn1p_y.y"
+#line 712 "asn1p_y.y"
     {
 		/* Empty EXPORTS clause effectively prohibits export. */
 		yyval.a_xports = asn1p_xports_new();
@@ -2282,7 +2295,7 @@
     break;
 
   case 57:
-#line 719 "asn1p_y.y"
+#line 720 "asn1p_y.y"
     {
 		yyval.a_xports = asn1p_xports_new();
 		assert(yyval.a_xports);
@@ -2291,7 +2304,7 @@
     break;
 
   case 58:
-#line 724 "asn1p_y.y"
+#line 725 "asn1p_y.y"
     {
 		yyval.a_xports = yyvsp[-2].a_xports;
 		TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next);
@@ -2299,7 +2312,7 @@
     break;
 
   case 59:
-#line 731 "asn1p_y.y"
+#line 732 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2309,7 +2322,7 @@
     break;
 
   case 60:
-#line 737 "asn1p_y.y"
+#line 738 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2319,7 +2332,7 @@
     break;
 
   case 61:
-#line 743 "asn1p_y.y"
+#line 744 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2329,12 +2342,12 @@
     break;
 
   case 62:
-#line 752 "asn1p_y.y"
+#line 753 "asn1p_y.y"
     { yyval.a_constr = yyvsp[-1].a_constr; }
     break;
 
   case 63:
-#line 755 "asn1p_y.y"
+#line 756 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -2345,14 +2358,14 @@
     break;
 
   case 64:
-#line 765 "asn1p_y.y"
+#line 766 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 	}
     break;
 
   case 65:
-#line 778 "asn1p_y.y"
+#line 779 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2363,7 +2376,7 @@
     break;
 
   case 66:
-#line 788 "asn1p_y.y"
+#line 789 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2375,7 +2388,7 @@
     break;
 
   case 67:
-#line 808 "asn1p_y.y"
+#line 809 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -2385,7 +2398,7 @@
     break;
 
   case 68:
-#line 814 "asn1p_y.y"
+#line 815 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -2395,7 +2408,7 @@
     break;
 
   case 69:
-#line 830 "asn1p_y.y"
+#line 831 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-5].tv_str;
@@ -2404,7 +2417,7 @@
     break;
 
   case 70:
-#line 836 "asn1p_y.y"
+#line 837 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-5].tv_str;
@@ -2413,7 +2426,7 @@
     break;
 
   case 71:
-#line 844 "asn1p_y.y"
+#line 845 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_plist = asn1p_paramlist_new(yylineno);
@@ -2426,7 +2439,7 @@
     break;
 
   case 72:
-#line 853 "asn1p_y.y"
+#line 854 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_plist = yyvsp[-2].a_plist;
@@ -2438,7 +2451,7 @@
     break;
 
   case 73:
-#line 864 "asn1p_y.y"
+#line 865 "asn1p_y.y"
     {
 		yyval.a_parg.governor = NULL;
 		yyval.a_parg.argument = yyvsp[0].tv_str;
@@ -2446,7 +2459,7 @@
     break;
 
   case 74:
-#line 868 "asn1p_y.y"
+#line 869 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -2457,7 +2470,7 @@
     break;
 
   case 75:
-#line 875 "asn1p_y.y"
+#line 876 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -2468,7 +2481,7 @@
     break;
 
   case 76:
-#line 882 "asn1p_y.y"
+#line 883 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -2480,7 +2493,7 @@
     break;
 
   case 77:
-#line 890 "asn1p_y.y"
+#line 891 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -2492,7 +2505,7 @@
     break;
 
   case 78:
-#line 901 "asn1p_y.y"
+#line 902 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2501,7 +2514,7 @@
     break;
 
   case 79:
-#line 906 "asn1p_y.y"
+#line 907 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
@@ -2509,14 +2522,14 @@
     break;
 
   case 80:
-#line 913 "asn1p_y.y"
+#line 914 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 	}
     break;
 
   case 81:
-#line 916 "asn1p_y.y"
+#line 917 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2528,7 +2541,7 @@
     break;
 
   case 82:
-#line 924 "asn1p_y.y"
+#line 925 "asn1p_y.y"
     {
 		asn1p_ref_t *ref;
 		yyval.a_expr = NEW_EXPR();
@@ -2543,7 +2556,7 @@
     break;
 
   case 83:
-#line 935 "asn1p_y.y"
+#line 936 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		yyval.a_expr->expr_type = A1TC_VALUESET;
@@ -2553,17 +2566,17 @@
     break;
 
   case 84:
-#line 958 "asn1p_y.y"
+#line 959 "asn1p_y.y"
     { yyval.a_expr = NEW_EXPR(); }
     break;
 
   case 85:
-#line 959 "asn1p_y.y"
+#line 960 "asn1p_y.y"
     { yyval.a_expr = yyvsp[0].a_expr; }
     break;
 
   case 86:
-#line 962 "asn1p_y.y"
+#line 963 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2572,7 +2585,7 @@
     break;
 
   case 87:
-#line 967 "asn1p_y.y"
+#line 968 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
@@ -2580,7 +2593,7 @@
     break;
 
   case 88:
-#line 974 "asn1p_y.y"
+#line 975 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -2591,7 +2604,7 @@
     break;
 
   case 89:
-#line 981 "asn1p_y.y"
+#line 982 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		yyvsp[0].a_marker.flags |= yyval.a_expr->marker.flags;
@@ -2601,7 +2614,7 @@
     break;
 
   case 90:
-#line 987 "asn1p_y.y"
+#line 988 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2612,14 +2625,14 @@
     break;
 
   case 91:
-#line 994 "asn1p_y.y"
+#line 995 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 	}
     break;
 
   case 92:
-#line 1000 "asn1p_y.y"
+#line 1001 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2628,7 +2641,7 @@
     break;
 
   case 93:
-#line 1005 "asn1p_y.y"
+#line 1006 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
@@ -2636,7 +2649,7 @@
     break;
 
   case 94:
-#line 1012 "asn1p_y.y"
+#line 1013 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -2645,14 +2658,14 @@
     break;
 
   case 95:
-#line 1017 "asn1p_y.y"
+#line 1018 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 	}
     break;
 
   case 96:
-#line 1020 "asn1p_y.y"
+#line 1021 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		_fixup_anonymous_identifier(yyval.a_expr);
@@ -2660,7 +2673,7 @@
     break;
 
   case 97:
-#line 1027 "asn1p_y.y"
+#line 1028 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		checkmem(yyval.a_expr);
@@ -2671,17 +2684,17 @@
     break;
 
   case 98:
-#line 1037 "asn1p_y.y"
+#line 1038 "asn1p_y.y"
     { yyval.a_int = 0; }
     break;
 
   case 99:
-#line 1038 "asn1p_y.y"
+#line 1039 "asn1p_y.y"
     { yyval.a_int = 1; }
     break;
 
   case 100:
-#line 1042 "asn1p_y.y"
+#line 1043 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2692,7 +2705,7 @@
     break;
 
   case 101:
-#line 1049 "asn1p_y.y"
+#line 1050 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
@@ -2700,7 +2713,7 @@
     break;
 
   case 102:
-#line 1059 "asn1p_y.y"
+#line 1060 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2712,7 +2725,7 @@
     break;
 
   case 103:
-#line 1069 "asn1p_y.y"
+#line 1070 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		yyval.a_expr->Identifier = yyvsp[-3].tv_str;
@@ -2725,7 +2738,7 @@
     break;
 
   case 104:
-#line 1080 "asn1p_y.y"
+#line 1081 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -2737,7 +2750,7 @@
     break;
 
   case 105:
-#line 1090 "asn1p_y.y"
+#line 1091 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2750,7 +2763,7 @@
     break;
 
   case 106:
-#line 1101 "asn1p_y.y"
+#line 1102 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -2762,7 +2775,7 @@
     break;
 
   case 107:
-#line 1111 "asn1p_y.y"
+#line 1112 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2775,7 +2788,7 @@
     break;
 
   case 108:
-#line 1122 "asn1p_y.y"
+#line 1123 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2788,31 +2801,31 @@
     break;
 
   case 109:
-#line 1134 "asn1p_y.y"
+#line 1135 "asn1p_y.y"
     { yyval.a_wsynt = 0; }
     break;
 
   case 110:
-#line 1135 "asn1p_y.y"
+#line 1136 "asn1p_y.y"
     {
 		yyval.a_wsynt = yyvsp[0].a_wsynt;
 	}
     break;
 
   case 111:
-#line 1142 "asn1p_y.y"
+#line 1143 "asn1p_y.y"
     { asn1p_lexer_hack_enable_with_syntax(); }
     break;
 
   case 112:
-#line 1144 "asn1p_y.y"
+#line 1145 "asn1p_y.y"
     {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 	}
     break;
 
   case 113:
-#line 1150 "asn1p_y.y"
+#line 1151 "asn1p_y.y"
     {
 		yyval.a_wsynt = asn1p_wsyntx_new();
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
@@ -2820,7 +2833,7 @@
     break;
 
   case 114:
-#line 1154 "asn1p_y.y"
+#line 1155 "asn1p_y.y"
     {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
@@ -2828,7 +2841,7 @@
     break;
 
   case 115:
-#line 1161 "asn1p_y.y"
+#line 1162 "asn1p_y.y"
     {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].tv_opaque.buf, 0);
 		yyval.a_wchunk->type = WC_WHITESPACE;
@@ -2836,14 +2849,14 @@
     break;
 
   case 116:
-#line 1165 "asn1p_y.y"
+#line 1166 "asn1p_y.y"
     {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].tv_str, 0);
 	}
     break;
 
   case 117:
-#line 1168 "asn1p_y.y"
+#line 1169 "asn1p_y.y"
     {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].a_refcomp.name, 0);
 		yyval.a_wchunk->type = WC_FIELD;
@@ -2851,14 +2864,14 @@
     break;
 
   case 118:
-#line 1172 "asn1p_y.y"
+#line 1173 "asn1p_y.y"
     {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_fromsyntax(yyvsp[-1].a_wsynt);
 	}
     break;
 
   case 119:
-#line 1178 "asn1p_y.y"
+#line 1179 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2870,7 +2883,7 @@
     break;
 
   case 120:
-#line 1186 "asn1p_y.y"
+#line 1187 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2883,7 +2896,7 @@
     break;
 
   case 121:
-#line 1195 "asn1p_y.y"
+#line 1196 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2896,7 +2909,7 @@
     break;
 
   case 122:
-#line 1207 "asn1p_y.y"
+#line 1208 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		yyval.a_expr->tag = yyvsp[-2].a_tag;
@@ -2919,7 +2932,7 @@
     break;
 
   case 123:
-#line 1229 "asn1p_y.y"
+#line 1230 "asn1p_y.y"
     {
 		yyval.a_int = asn1p_as_pointer ? EM_INDIRECT : 0;
 		asn1p_as_pointer = 0;
@@ -2927,7 +2940,7 @@
     break;
 
   case 124:
-#line 1236 "asn1p_y.y"
+#line 1237 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->marker.flags |= yyvsp[-1].a_int;
@@ -2947,14 +2960,14 @@
     break;
 
   case 125:
-#line 1255 "asn1p_y.y"
+#line 1256 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[0].a_expr;
 	}
     break;
 
   case 126:
-#line 1258 "asn1p_y.y"
+#line 1259 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2964,7 +2977,7 @@
     break;
 
   case 127:
-#line 1264 "asn1p_y.y"
+#line 1265 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2974,7 +2987,7 @@
     break;
 
   case 128:
-#line 1270 "asn1p_y.y"
+#line 1271 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2984,7 +2997,7 @@
     break;
 
   case 129:
-#line 1276 "asn1p_y.y"
+#line 1277 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -2998,7 +3011,7 @@
     break;
 
   case 130:
-#line 1286 "asn1p_y.y"
+#line 1287 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -3012,7 +3025,7 @@
     break;
 
   case 131:
-#line 1296 "asn1p_y.y"
+#line 1297 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -3022,7 +3035,7 @@
     break;
 
   case 132:
-#line 1302 "asn1p_y.y"
+#line 1303 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_expr = NEW_EXPR();
@@ -3037,7 +3050,7 @@
     break;
 
   case 133:
-#line 1313 "asn1p_y.y"
+#line 1314 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -3048,7 +3061,7 @@
     break;
 
   case 134:
-#line 1328 "asn1p_y.y"
+#line 1329 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3060,7 +3073,7 @@
     break;
 
   case 135:
-#line 1336 "asn1p_y.y"
+#line 1337 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3074,7 +3087,7 @@
     break;
 
   case 136:
-#line 1346 "asn1p_y.y"
+#line 1347 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3088,7 +3101,7 @@
     break;
 
   case 137:
-#line 1356 "asn1p_y.y"
+#line 1357 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3102,7 +3115,7 @@
     break;
 
   case 138:
-#line 1366 "asn1p_y.y"
+#line 1367 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3114,7 +3127,7 @@
     break;
 
   case 139:
-#line 1374 "asn1p_y.y"
+#line 1375 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = yyvsp[0].a_ref;
@@ -3137,7 +3150,7 @@
     break;
 
   case 140:
-#line 1396 "asn1p_y.y"
+#line 1397 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -3149,7 +3162,7 @@
     break;
 
   case 141:
-#line 1404 "asn1p_y.y"
+#line 1405 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_ref = yyvsp[-2].a_ref;
@@ -3160,7 +3173,7 @@
     break;
 
   case 143:
-#line 1417 "asn1p_y.y"
+#line 1418 "asn1p_y.y"
     {
 		yyval.a_refcomp.lex_type = RLT_AmpUppercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
@@ -3168,7 +3181,7 @@
     break;
 
   case 144:
-#line 1422 "asn1p_y.y"
+#line 1423 "asn1p_y.y"
     {
 		yyval.a_refcomp.lex_type = RLT_Amplowercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
@@ -3176,7 +3189,7 @@
     break;
 
   case 145:
-#line 1431 "asn1p_y.y"
+#line 1432 "asn1p_y.y"
     {
 		yyval.a_ref = asn1p_ref_new(yylineno);
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase);
@@ -3184,7 +3197,7 @@
     break;
 
   case 146:
-#line 1435 "asn1p_y.y"
+#line 1436 "asn1p_y.y"
     {
 		yyval.a_ref = yyval.a_ref;
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase);
@@ -3192,7 +3205,7 @@
     break;
 
   case 147:
-#line 1439 "asn1p_y.y"
+#line 1440 "asn1p_y.y"
     {
 		yyval.a_ref = yyval.a_ref;
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_Amplowercase);
@@ -3200,7 +3213,7 @@
     break;
 
   case 148:
-#line 1446 "asn1p_y.y"
+#line 1447 "asn1p_y.y"
     {
 		yyval.a_ref = asn1p_ref_new(yylineno);
 		asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS);
@@ -3208,7 +3221,7 @@
     break;
 
   case 149:
-#line 1466 "asn1p_y.y"
+#line 1467 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		assert(yyval.a_expr->Identifier == NULL);
@@ -3219,7 +3232,7 @@
     break;
 
   case 152:
-#line 1478 "asn1p_y.y"
+#line 1479 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -3230,12 +3243,12 @@
     break;
 
   case 153:
-#line 1485 "asn1p_y.y"
+#line 1486 "asn1p_y.y"
     { asn1p_lexer_hack_push_opaque_state(); }
     break;
 
   case 154:
-#line 1485 "asn1p_y.y"
+#line 1486 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		checkmem(yyval.a_value);
@@ -3244,7 +3257,7 @@
     break;
 
   case 155:
-#line 1490 "asn1p_y.y"
+#line 1491 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -3253,7 +3266,7 @@
     break;
 
   case 156:
-#line 1498 "asn1p_y.y"
+#line 1499 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -3262,7 +3275,7 @@
     break;
 
   case 157:
-#line 1503 "asn1p_y.y"
+#line 1504 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -3271,7 +3284,7 @@
     break;
 
   case 158:
-#line 1508 "asn1p_y.y"
+#line 1509 "asn1p_y.y"
     {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B');
 		checkmem(yyval.a_value);
@@ -3279,7 +3292,7 @@
     break;
 
   case 159:
-#line 1512 "asn1p_y.y"
+#line 1513 "asn1p_y.y"
     {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H');
 		checkmem(yyval.a_value);
@@ -3287,21 +3300,21 @@
     break;
 
   case 160:
-#line 1516 "asn1p_y.y"
+#line 1517 "asn1p_y.y"
     {
 		yyval.a_value = yyval.a_value;
 	}
     break;
 
   case 161:
-#line 1519 "asn1p_y.y"
+#line 1520 "asn1p_y.y"
     {
 		yyval.a_value = yyvsp[0].a_value;
 	}
     break;
 
   case 162:
-#line 1525 "asn1p_y.y"
+#line 1526 "asn1p_y.y"
     {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3316,7 +3329,7 @@
     break;
 
   case 163:
-#line 1536 "asn1p_y.y"
+#line 1537 "asn1p_y.y"
     {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3334,7 +3347,7 @@
     break;
 
   case 164:
-#line 1554 "asn1p_y.y"
+#line 1555 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		checkmem(yyval.a_value);
@@ -3342,7 +3355,7 @@
     break;
 
   case 165:
-#line 1558 "asn1p_y.y"
+#line 1559 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
@@ -3351,7 +3364,7 @@
     break;
 
   case 166:
-#line 1563 "asn1p_y.y"
+#line 1564 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
@@ -3360,7 +3373,7 @@
     break;
 
   case 167:
-#line 1597 "asn1p_y.y"
+#line 1598 "asn1p_y.y"
     {
 		yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1;
 		yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1);
@@ -3373,7 +3386,7 @@
     break;
 
   case 168:
-#line 1606 "asn1p_y.y"
+#line 1607 "asn1p_y.y"
     {
 		int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len;
 		char *p = malloc(newsize + 1);
@@ -3389,87 +3402,87 @@
     break;
 
   case 169:
-#line 1621 "asn1p_y.y"
+#line 1622 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_BOOLEAN; }
     break;
 
   case 170:
-#line 1622 "asn1p_y.y"
+#line 1623 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_NULL; }
     break;
 
   case 171:
-#line 1623 "asn1p_y.y"
+#line 1624 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_REAL; }
     break;
 
   case 172:
-#line 1624 "asn1p_y.y"
+#line 1625 "asn1p_y.y"
     { yyval.a_type = yyvsp[0].a_type; }
     break;
 
   case 173:
-#line 1625 "asn1p_y.y"
+#line 1626 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_OCTET_STRING; }
     break;
 
   case 174:
-#line 1626 "asn1p_y.y"
+#line 1627 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; }
     break;
 
   case 175:
-#line 1627 "asn1p_y.y"
+#line 1628 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_RELATIVE_OID; }
     break;
 
   case 176:
-#line 1628 "asn1p_y.y"
+#line 1629 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_EXTERNAL; }
     break;
 
   case 177:
-#line 1629 "asn1p_y.y"
+#line 1630 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; }
     break;
 
   case 178:
-#line 1630 "asn1p_y.y"
+#line 1631 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_CHARACTER_STRING; }
     break;
 
   case 179:
-#line 1631 "asn1p_y.y"
+#line 1632 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_UTCTime; }
     break;
 
   case 180:
-#line 1632 "asn1p_y.y"
+#line 1633 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_GeneralizedTime; }
     break;
 
   case 181:
-#line 1633 "asn1p_y.y"
+#line 1634 "asn1p_y.y"
     { yyval.a_type = yyvsp[0].a_type; }
     break;
 
   case 182:
-#line 1640 "asn1p_y.y"
+#line 1641 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_INTEGER; }
     break;
 
   case 183:
-#line 1641 "asn1p_y.y"
+#line 1642 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_ENUMERATED; }
     break;
 
   case 184:
-#line 1642 "asn1p_y.y"
+#line 1643 "asn1p_y.y"
     { yyval.a_type = ASN_BASIC_BIT_STRING; }
     break;
 
   case 185:
-#line 1646 "asn1p_y.y"
+#line 1647 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -3479,7 +3492,7 @@
     break;
 
   case 186:
-#line 1652 "asn1p_y.y"
+#line 1653 "asn1p_y.y"
     {
 		if(yyvsp[0].a_expr) {
 			yyval.a_expr = yyvsp[0].a_expr;
@@ -3493,12 +3506,12 @@
     break;
 
   case 187:
-#line 1665 "asn1p_y.y"
+#line 1666 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_BMPString; }
     break;
 
   case 188:
-#line 1666 "asn1p_y.y"
+#line 1667 "asn1p_y.y"
     {
 		yyval.a_type = ASN_STRING_GeneralString;
 		fprintf(stderr, "WARNING: GeneralString is not fully supported\n");
@@ -3506,7 +3519,7 @@
     break;
 
   case 189:
-#line 1670 "asn1p_y.y"
+#line 1671 "asn1p_y.y"
     {
 		yyval.a_type = ASN_STRING_GraphicString;
 		fprintf(stderr, "WARNING: GraphicString is not fully supported\n");
@@ -3514,27 +3527,27 @@
     break;
 
   case 190:
-#line 1674 "asn1p_y.y"
+#line 1675 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_IA5String; }
     break;
 
   case 191:
-#line 1675 "asn1p_y.y"
+#line 1676 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_ISO646String; }
     break;
 
   case 192:
-#line 1676 "asn1p_y.y"
+#line 1677 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_NumericString; }
     break;
 
   case 193:
-#line 1677 "asn1p_y.y"
+#line 1678 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_PrintableString; }
     break;
 
   case 194:
-#line 1678 "asn1p_y.y"
+#line 1679 "asn1p_y.y"
     {
 		yyval.a_type = ASN_STRING_T61String;
 		fprintf(stderr, "WARNING: T61String is not fully supported\n");
@@ -3542,22 +3555,22 @@
     break;
 
   case 195:
-#line 1682 "asn1p_y.y"
+#line 1683 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_TeletexString; }
     break;
 
   case 196:
-#line 1683 "asn1p_y.y"
+#line 1684 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_UniversalString; }
     break;
 
   case 197:
-#line 1684 "asn1p_y.y"
+#line 1685 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_UTF8String; }
     break;
 
   case 198:
-#line 1685 "asn1p_y.y"
+#line 1686 "asn1p_y.y"
     {
 		yyval.a_type = ASN_STRING_VideotexString;
 		fprintf(stderr, "WARNING: VideotexString is not fully supported\n");
@@ -3565,43 +3578,43 @@
     break;
 
   case 199:
-#line 1689 "asn1p_y.y"
+#line 1690 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_VisibleString; }
     break;
 
   case 200:
-#line 1690 "asn1p_y.y"
+#line 1691 "asn1p_y.y"
     { yyval.a_type = ASN_STRING_ObjectDescriptor; }
     break;
 
   case 205:
-#line 1701 "asn1p_y.y"
+#line 1702 "asn1p_y.y"
     { yyval.a_constr = 0; }
     break;
 
   case 206:
-#line 1702 "asn1p_y.y"
+#line 1703 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
   case 208:
-#line 1709 "asn1p_y.y"
+#line 1710 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[-1].a_constr;
 	}
     break;
 
   case 209:
-#line 1715 "asn1p_y.y"
+#line 1716 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0);
 	}
     break;
 
   case 210:
-#line 1718 "asn1p_y.y"
+#line 1719 "asn1p_y.y"
     {
 		/*
 		 * This is a special case, for compatibility purposes.
@@ -3612,21 +3625,21 @@
     break;
 
   case 211:
-#line 1728 "asn1p_y.y"
+#line 1729 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[-1].a_constr;
 	}
     break;
 
   case 212:
-#line 1731 "asn1p_y.y"
+#line 1732 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	}
     break;
 
   case 213:
-#line 1737 "asn1p_y.y"
+#line 1738 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		yyval.a_constr->type = ACT_EL_EXT;
@@ -3634,14 +3647,14 @@
     break;
 
   case 214:
-#line 1741 "asn1p_y.y"
+#line 1742 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
   case 215:
-#line 1744 "asn1p_y.y"
+#line 1745 "asn1p_y.y"
     {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -3651,7 +3664,7 @@
     break;
 
   case 216:
-#line 1750 "asn1p_y.y"
+#line 1751 "asn1p_y.y"
     {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -3663,35 +3676,35 @@
     break;
 
   case 218:
-#line 1762 "asn1p_y.y"
+#line 1763 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0);
 	}
     break;
 
   case 220:
-#line 1769 "asn1p_y.y"
+#line 1770 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	}
     break;
 
   case 222:
-#line 1776 "asn1p_y.y"
+#line 1777 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	}
     break;
 
   case 224:
-#line 1784 "asn1p_y.y"
+#line 1785 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	}
     break;
 
   case 225:
-#line 1790 "asn1p_y.y"
+#line 1791 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -3703,7 +3716,7 @@
     break;
 
   case 226:
-#line 1798 "asn1p_y.y"
+#line 1799 "asn1p_y.y"
     {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -3715,7 +3728,7 @@
     break;
 
   case 227:
-#line 1806 "asn1p_y.y"
+#line 1807 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3725,7 +3738,7 @@
     break;
 
   case 228:
-#line 1812 "asn1p_y.y"
+#line 1813 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3735,7 +3748,7 @@
     break;
 
   case 229:
-#line 1818 "asn1p_y.y"
+#line 1819 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3746,7 +3759,7 @@
     break;
 
   case 230:
-#line 1825 "asn1p_y.y"
+#line 1826 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3758,7 +3771,7 @@
     break;
 
   case 231:
-#line 1833 "asn1p_y.y"
+#line 1834 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3770,7 +3783,7 @@
     break;
 
   case 232:
-#line 1841 "asn1p_y.y"
+#line 1842 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3783,37 +3796,65 @@
     break;
 
   case 233:
-#line 1850 "asn1p_y.y"
+#line 1851 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
   case 234:
-#line 1856 "asn1p_y.y"
+#line 1854 "asn1p_y.y"
     {
-		yyval.a_ctype = ACT_CT_SIZE;
+		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
   case 235:
-#line 1859 "asn1p_y.y"
+#line 1860 "asn1p_y.y"
     {
-		yyval.a_ctype = ACT_CT_FROM;
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		yyval.a_constr->type = ACT_CT_PATTERN;
+		yyval.a_constr->value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 	}
     break;
 
   case 236:
 #line 1865 "asn1p_y.y"
     {
+		asn1p_ref_t *ref;
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		yyval.a_constr->type = ACT_CT_PATTERN;
+		ref = asn1p_ref_new(yylineno);
+		asn1p_ref_add_component(ref, yyvsp[0].tv_str, RLT_lowercase);
+		yyval.a_constr->value = asn1p_value_fromref(ref, 0);
+	}
+    break;
+
+  case 237:
+#line 1876 "asn1p_y.y"
+    {
+		yyval.a_ctype = ACT_CT_SIZE;
+	}
+    break;
+
+  case 238:
+#line 1879 "asn1p_y.y"
+    {
+		yyval.a_ctype = ACT_CT_FROM;
+	}
+    break;
+
+  case 239:
+#line 1885 "asn1p_y.y"
+    {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_FALSE;
 	}
     break;
 
-  case 237:
-#line 1870 "asn1p_y.y"
+  case 240:
+#line 1890 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromint(1);
 		checkmem(yyval.a_value);
@@ -3821,8 +3862,8 @@
 	}
     break;
 
-  case 240:
-#line 1877 "asn1p_y.y"
+  case 243:
+#line 1897 "asn1p_y.y"
     {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3836,8 +3877,8 @@
 	}
     break;
 
-  case 241:
-#line 1891 "asn1p_y.y"
+  case 244:
+#line 1911 "asn1p_y.y"
     {
 		asn1p_ref_t *ref;
 		int ret;
@@ -3851,36 +3892,36 @@
 	}
     break;
 
-  case 242:
-#line 1905 "asn1p_y.y"
+  case 245:
+#line 1925 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0);
 	}
     break;
 
-  case 243:
-#line 1908 "asn1p_y.y"
+  case 246:
+#line 1928 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0);
 	}
     break;
 
-  case 244:
-#line 1914 "asn1p_y.y"
+  case 247:
+#line 1934 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
-  case 245:
-#line 1917 "asn1p_y.y"
+  case 248:
+#line 1937 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	}
     break;
 
-  case 246:
-#line 1923 "asn1p_y.y"
+  case 249:
+#line 1943 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3889,8 +3930,8 @@
 	}
     break;
 
-  case 247:
-#line 1929 "asn1p_y.y"
+  case 250:
+#line 1949 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3901,44 +3942,44 @@
 	}
     break;
 
-  case 248:
-#line 1943 "asn1p_y.y"
+  case 251:
+#line 1963 "asn1p_y.y"
     { yyval.a_pres = ACPRES_DEFAULT; }
     break;
 
-  case 249:
-#line 1944 "asn1p_y.y"
+  case 252:
+#line 1964 "asn1p_y.y"
     { yyval.a_pres = yyvsp[0].a_pres; }
     break;
 
-  case 250:
-#line 1948 "asn1p_y.y"
+  case 253:
+#line 1968 "asn1p_y.y"
     {
 		yyval.a_pres = ACPRES_PRESENT;
 	}
     break;
 
-  case 251:
-#line 1951 "asn1p_y.y"
+  case 254:
+#line 1971 "asn1p_y.y"
     {
 		yyval.a_pres = ACPRES_ABSENT;
 	}
     break;
 
-  case 252:
-#line 1954 "asn1p_y.y"
+  case 255:
+#line 1974 "asn1p_y.y"
     {
 		yyval.a_pres = ACPRES_OPTIONAL;
 	}
     break;
 
-  case 256:
-#line 1969 "asn1p_y.y"
+  case 259:
+#line 1989 "asn1p_y.y"
     { asn1p_lexer_hack_push_opaque_state(); }
     break;
 
-  case 257:
-#line 1969 "asn1p_y.y"
+  case 260:
+#line 1989 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3949,8 +3990,8 @@
 	}
     break;
 
-  case 258:
-#line 1980 "asn1p_y.y"
+  case 261:
+#line 2000 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		yyval.a_constr->type = ACT_CT_CTNG;
@@ -3958,42 +3999,42 @@
 	}
     break;
 
-  case 259:
-#line 1988 "asn1p_y.y"
+  case 262:
+#line 2008 "asn1p_y.y"
     { yyval.a_ctype = ACT_EL_RANGE; }
     break;
 
-  case 260:
-#line 1989 "asn1p_y.y"
+  case 263:
+#line 2009 "asn1p_y.y"
     { yyval.a_ctype = ACT_EL_RLRANGE; }
     break;
 
-  case 261:
-#line 1990 "asn1p_y.y"
+  case 264:
+#line 2010 "asn1p_y.y"
     { yyval.a_ctype = ACT_EL_LLRANGE; }
     break;
 
-  case 262:
-#line 1991 "asn1p_y.y"
+  case 265:
+#line 2011 "asn1p_y.y"
     { yyval.a_ctype = ACT_EL_ULRANGE; }
     break;
 
-  case 263:
-#line 1994 "asn1p_y.y"
+  case 266:
+#line 2014 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
-  case 264:
-#line 1997 "asn1p_y.y"
+  case 267:
+#line 2017 "asn1p_y.y"
     {
 		yyval.a_constr = yyvsp[0].a_constr;
 	}
     break;
 
-  case 265:
-#line 2006 "asn1p_y.y"
+  case 268:
+#line 2026 "asn1p_y.y"
     {
 		asn1p_ref_t *ref = asn1p_ref_new(yylineno);
 		asn1p_constraint_t *ct;
@@ -4008,15 +4049,15 @@
 	}
     break;
 
-  case 266:
-#line 2021 "asn1p_y.y"
+  case 269:
+#line 2041 "asn1p_y.y"
     {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	}
     break;
 
-  case 267:
-#line 2027 "asn1p_y.y"
+  case 270:
+#line 2047 "asn1p_y.y"
     {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -4025,8 +4066,8 @@
 	}
     break;
 
-  case 268:
-#line 2033 "asn1p_y.y"
+  case 271:
+#line 2053 "asn1p_y.y"
     {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -4037,8 +4078,8 @@
 	}
     break;
 
-  case 269:
-#line 2047 "asn1p_y.y"
+  case 272:
+#line 2067 "asn1p_y.y"
     {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 2);
 		int ret;
@@ -4052,8 +4093,8 @@
 	}
     break;
 
-  case 270:
-#line 2058 "asn1p_y.y"
+  case 273:
+#line 2078 "asn1p_y.y"
     {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 3);
 		int ret;
@@ -4068,15 +4109,15 @@
 	}
     break;
 
-  case 271:
-#line 2074 "asn1p_y.y"
+  case 274:
+#line 2094 "asn1p_y.y"
     {
 		yyval.tv_str = yyvsp[0].tv_str;
 	}
     break;
 
-  case 272:
-#line 2077 "asn1p_y.y"
+  case 275:
+#line 2097 "asn1p_y.y"
     {
 		int l1 = strlen(yyvsp[-2].tv_str);
 		int l3 = strlen(yyvsp[0].tv_str);
@@ -4088,52 +4129,52 @@
 	}
     break;
 
-  case 273:
-#line 2095 "asn1p_y.y"
+  case 276:
+#line 2115 "asn1p_y.y"
     {
 		yyval.a_marker.flags = EM_NOMARK;
 		yyval.a_marker.default_value = 0;
 	}
     break;
 
-  case 274:
-#line 2099 "asn1p_y.y"
+  case 277:
+#line 2119 "asn1p_y.y"
     { yyval.a_marker = yyvsp[0].a_marker; }
     break;
 
-  case 275:
-#line 2103 "asn1p_y.y"
+  case 278:
+#line 2123 "asn1p_y.y"
     {
 		yyval.a_marker.flags = EM_OPTIONAL | EM_INDIRECT;
 		yyval.a_marker.default_value = 0;
 	}
     break;
 
-  case 276:
-#line 2107 "asn1p_y.y"
+  case 279:
+#line 2127 "asn1p_y.y"
     {
 		yyval.a_marker.flags = EM_DEFAULT;
 		yyval.a_marker.default_value = yyvsp[0].a_value;
 	}
     break;
 
-  case 277:
-#line 2130 "asn1p_y.y"
+  case 280:
+#line 2150 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
 	}
     break;
 
-  case 278:
-#line 2134 "asn1p_y.y"
+  case 281:
+#line 2154 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-1].a_expr;
 	}
     break;
 
-  case 279:
-#line 2140 "asn1p_y.y"
+  case 282:
+#line 2160 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -4141,16 +4182,16 @@
 	}
     break;
 
-  case 280:
-#line 2145 "asn1p_y.y"
+  case 283:
+#line 2165 "asn1p_y.y"
     {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	}
     break;
 
-  case 281:
-#line 2152 "asn1p_y.y"
+  case 284:
+#line 2172 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -4160,8 +4201,8 @@
 	}
     break;
 
-  case 282:
-#line 2159 "asn1p_y.y"
+  case 285:
+#line 2179 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -4172,8 +4213,8 @@
 	}
     break;
 
-  case 283:
-#line 2167 "asn1p_y.y"
+  case 286:
+#line 2187 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -4184,8 +4225,8 @@
 	}
     break;
 
-  case 284:
-#line 2175 "asn1p_y.y"
+  case 287:
+#line 2195 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -4195,8 +4236,8 @@
 	}
     break;
 
-  case 285:
-#line 2182 "asn1p_y.y"
+  case 288:
+#line 2202 "asn1p_y.y"
     {
 		yyval.a_expr = NEW_EXPR();
 		checkmem(yyval.a_expr);
@@ -4207,129 +4248,129 @@
 	}
     break;
 
-  case 286:
-#line 2193 "asn1p_y.y"
-    {
-		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
-		checkmem(yyval.a_value);
-	}
-    break;
-
-  case 287:
-#line 2197 "asn1p_y.y"
-    {
-		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
-		checkmem(yyval.a_value);
-	}
-    break;
-
   case 289:
-#line 2205 "asn1p_y.y"
+#line 2213 "asn1p_y.y"
+    {
+		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
+		checkmem(yyval.a_value);
+	}
+    break;
+
+  case 290:
+#line 2217 "asn1p_y.y"
+    {
+		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
+		checkmem(yyval.a_value);
+	}
+    break;
+
+  case 292:
+#line 2225 "asn1p_y.y"
     {
 		yyval.a_value = asn1p_value_fromdouble(yyvsp[0].a_dbl);
 		checkmem(yyval.a_value);
 	}
     break;
 
-  case 290:
-#line 2236 "asn1p_y.y"
+  case 293:
+#line 2256 "asn1p_y.y"
     { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); }
     break;
 
-  case 291:
-#line 2237 "asn1p_y.y"
+  case 294:
+#line 2257 "asn1p_y.y"
     { yyval.a_tag = yyvsp[0].a_tag; }
     break;
 
-  case 292:
-#line 2241 "asn1p_y.y"
+  case 295:
+#line 2261 "asn1p_y.y"
     {
 		yyval.a_tag = yyvsp[-1].a_tag;
 		yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode;
 	}
     break;
 
-  case 293:
-#line 2248 "asn1p_y.y"
+  case 296:
+#line 2268 "asn1p_y.y"
     {
 		yyval.a_tag = yyvsp[-2].a_tag;
 		yyval.a_tag.tag_value = yyvsp[-1].a_int;
 	}
     break;
 
-  case 294:
-#line 2254 "asn1p_y.y"
+  case 297:
+#line 2274 "asn1p_y.y"
     { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; }
     break;
 
-  case 295:
-#line 2255 "asn1p_y.y"
+  case 298:
+#line 2275 "asn1p_y.y"
     { yyval.a_tag.tag_class = TC_UNIVERSAL; }
     break;
 
-  case 296:
-#line 2256 "asn1p_y.y"
+  case 299:
+#line 2276 "asn1p_y.y"
     { yyval.a_tag.tag_class = TC_APPLICATION; }
     break;
 
-  case 297:
-#line 2257 "asn1p_y.y"
+  case 300:
+#line 2277 "asn1p_y.y"
     { yyval.a_tag.tag_class = TC_PRIVATE; }
     break;
 
-  case 298:
-#line 2261 "asn1p_y.y"
+  case 301:
+#line 2281 "asn1p_y.y"
     { yyval.a_tag.tag_mode = TM_DEFAULT; }
     break;
 
-  case 299:
-#line 2262 "asn1p_y.y"
+  case 302:
+#line 2282 "asn1p_y.y"
     { yyval.a_tag.tag_mode = TM_IMPLICIT; }
     break;
 
-  case 300:
-#line 2263 "asn1p_y.y"
+  case 303:
+#line 2283 "asn1p_y.y"
     { yyval.a_tag.tag_mode = TM_EXPLICIT; }
     break;
 
-  case 301:
-#line 2267 "asn1p_y.y"
-    {
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	}
-    break;
-
-  case 302:
-#line 2271 "asn1p_y.y"
-    {
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	}
-    break;
-
-  case 303:
-#line 2279 "asn1p_y.y"
-    {
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	}
-    break;
-
   case 304:
-#line 2286 "asn1p_y.y"
-    { yyval.tv_str = 0; }
+#line 2287 "asn1p_y.y"
+    {
+		checkmem(yyvsp[0].tv_str);
+		yyval.tv_str = yyvsp[0].tv_str;
+	}
     break;
 
   case 305:
-#line 2287 "asn1p_y.y"
+#line 2291 "asn1p_y.y"
     {
+		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
 	}
     break;
 
   case 306:
-#line 2293 "asn1p_y.y"
+#line 2299 "asn1p_y.y"
+    {
+		checkmem(yyvsp[0].tv_str);
+		yyval.tv_str = yyvsp[0].tv_str;
+	}
+    break;
+
+  case 307:
+#line 2306 "asn1p_y.y"
+    { yyval.tv_str = 0; }
+    break;
+
+  case 308:
+#line 2307 "asn1p_y.y"
+    {
+		yyval.tv_str = yyvsp[0].tv_str;
+	}
+    break;
+
+  case 309:
+#line 2313 "asn1p_y.y"
     {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
@@ -4340,7 +4381,7 @@
     }
 
 /* Line 1016 of /usr/local/share/bison/yacc.c.  */
-#line 4344 "asn1p_y.c"
+#line 4385 "asn1p_y.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -4559,7 +4600,7 @@
 }
 
 
-#line 2299 "asn1p_y.y"
+#line 2319 "asn1p_y.y"
 
 
 
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index 7e63853..8289fa9 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -325,6 +325,7 @@
 %type	<a_constr>		UserDefinedConstraint
 %type	<a_constr>		TableConstraint
 %type	<a_constr>		ContentsConstraint
+%type	<a_constr>		PatternConstraint
 %type	<a_constr>		InnerTypeConstraint
 %type	<a_constr>		WithComponentsList
 %type	<a_constr>		WithComponentsElement
@@ -1850,6 +1851,25 @@
 	| InnerTypeConstraint {
 		$$ = $1;
 	}
+	| PatternConstraint {
+		$$ = $1;
+	}
+	;
+
+PatternConstraint:
+	TOK_PATTERN TOK_cstring {
+		$$ = asn1p_constraint_new(yylineno);
+		$$->type = ACT_CT_PATTERN;
+		$$->value = asn1p_value_frombuf($2.buf, $2.len, 0);
+	}
+	| TOK_PATTERN Identifier {
+		asn1p_ref_t *ref;
+		$$ = asn1p_constraint_new(yylineno);
+		$$->type = ACT_CT_PATTERN;
+		ref = asn1p_ref_new(yylineno);
+		asn1p_ref_add_component(ref, $2, RLT_lowercase);
+		$$->value = asn1p_value_fromref(ref, 0);
+	}
 	;
 
 ConstraintSpec:
diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c
index 3462d1a..1c6461b 100644
--- a/libasn1print/asn1print.c
+++ b/libasn1print/asn1print.c
@@ -368,6 +368,11 @@
 			flags, 1);
 		printf(")");
 		break;
+	case ACT_CT_PATTERN:
+		printf("(PATTERN ");
+		asn1print_value(ct->value, flags);
+		printf(")");
+		break;
 	case ACT_CA_SET: symno++;
 	case ACT_CA_CRC: symno++;
 	case ACT_CA_CSV: symno++;
diff --git a/tests/122-pattern-OK.asn1 b/tests/122-pattern-OK.asn1
new file mode 100644
index 0000000..16c823f
--- /dev/null
+++ b/tests/122-pattern-OK.asn1
@@ -0,0 +1,23 @@
+
+-- OK: Everything is fine
+
+-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
+-- .spelio.software.asn1c.test (9363.1.5.1)
+-- .122
+
+ModulePatternConstraint
+	{ iso org(3) dod(6) internet (1) private(4) enterprise(1)
+		spelio(9363) software(1) asn1c(5) test(1) 122 }
+	DEFINITIONS AUTOMATIC TAGS ::=
+BEGIN
+
+	Language ::= VisibleString (FROM ("a".."z" | "A".."Z" | "-" | "0".."9"))
+		(PATTERN "[a-zA-Z]#(1,8)(-[a-zA-Z0-9]#(1,8))*")
+
+	PatternByRef1 ::= VisibleString (PATTERN refPattern1)
+	PatternByRef2 ::= VisibleString (PATTERN refPattern2)
+
+	refPattern1 UniversalString ::= "[a-zA-Z]#(1,8)(-[a-zA-Z0-9]#(1,8))*"
+	refPattern2 UTF8String ::= "[a-zA-Z]#(1,8)(-[a-zA-Z0-9]#(1,8))*"
+
+END