Click here to Skip to main content
15,894,405 members
Articles / Programming Languages / C#

How does it work in Mono's C# compiler?

Rate me:
Please Sign up or sign in to vote.
4.99/5 (54 votes)
30 Apr 2012CPOL19 min read 143.4K   1.1K   77  
The Mono is an Open Source free programming language project. It has the implementation of Microsoft’s .NET Framework based on the ECMA standards for C# language and Common Language Runtime (CLR). In this article, I will explore how the Mono C# compiler works.
// created by jay 0.7 (c) 1998 Axel.Schreiner@informatik.uni-osnabrueck.de

#line 2 "cs-parser.jay"
//
// cs-parser.jay: The Parser for the C# compiler
//
// Authors: Miguel de Icaza (miguel@gnu.org)
//          Ravi Pratap     (ravi@ximian.com)
//          Marek Safar		(marek.safar@gmail.com)
//
// Dual Licensed under the terms of the GNU GPL and the MIT X11 license
//
// (C) 2001 Ximian, Inc (http://www.ximian.com)
// (C) 2004 Novell, Inc
//
// TODO:
//   (1) Figure out why error productions dont work.  `type-declaration' is a
//       great spot to put an `error' because you can reproduce it with this input:
//	 "public X { }"
//
// Possible optimization:
//   Run memory profiler with parsing only, and consider dropping 
//   arraylists where not needed.   Some pieces can use linked lists.


using System.Text;
using System.IO;
using System;

namespace Mono.CSharp
{
	using System.Collections;

	/// <summary>
	///    The C# Parser
	/// </summary>
	public class CSharpParser
	{
		[Flags]
		enum ParameterModifierType
		{
			Ref		= 1 << 1,
			Out		= 1 << 2,
			This	= 1 << 3,
			Params	= 1 << 4,
			Arglist	= 1 << 5,
			DefaultValue = 1 << 6,
			
			All = Ref | Out | This | Params | Arglist | DefaultValue
		}
	
		NamespaceEntry  current_namespace;
		TypeContainer   current_container;
		DeclSpace	current_class;
	
		/// <summary>
		///   Current block is used to add statements as we find
		///   them.  
		/// </summary>
		Block      current_block;

		Delegate   current_delegate;
		
		GenericMethod current_generic_method;
		AnonymousMethodExpression current_anonymous_method;

		/// <summary>
		///   This is used by the unary_expression code to resolve
		///   a name against a parameter.  
		/// </summary>
		
		// FIXME: This is very ugly and it's very hard to reset it correctly
		// on all places, especially when some parameters are autogenerated.
		ParametersCompiled current_local_parameters;

		/// <summary>
		///   Using during property parsing to describe the implicit
		///   value parameter that is passed to the "set" and "get"accesor
		///   methods (properties and indexers).
		/// </summary>
		FullNamedExpression implicit_value_parameter_type;
		ParametersCompiled indexer_parameters;

		/// <summary>
		///   Hack to help create non-typed array initializer
		/// </summary>
		public static FullNamedExpression current_array_type;
		FullNamedExpression pushed_current_array_type;

		/// <summary>
		///   Used to determine if we are parsing the get/set pair
		///   of an indexer or a property
		/// </summmary>
		bool parsing_indexer;

		bool parsing_anonymous_method;

		///
		/// An out-of-band stack.
		///
		static Stack oob_stack;

		///
		/// Switch stack.
		///
		Stack switch_stack;

		///
		/// Controls the verbosity of the errors produced by the parser
		///
		static public int yacc_verbose_flag;

		/// 
		/// Used by the interactive shell, flags whether EOF was reached
		/// and an error was produced
		///
		public bool UnexpectedEOF;

		///
		/// The current file.
		///
		CompilationUnit file;

		///
		/// Temporary Xml documentation cache.
		/// For enum types, we need one more temporary store.
		///
		string tmpComment;
		string enumTypeComment;
	       		
		/// Current attribute target
		string current_attr_target;
		
		/// assembly and module attribute definitions are enabled
		bool global_attrs_enabled = true;
		bool has_get, has_set;
		
		ParameterModifierType valid_param_mod;
		
		bool default_parameter_used;

		/// When using the interactive parser, this holds the
		/// resulting expression
		public object InteractiveResult;

		//
		// Keeps track of global data changes to undo on parser error
		//
		public Undo undo;
		
		// Stack<ToplevelBlock>
		Stack linq_clause_blocks;

		// A counter to create new class names in interactive mode
		static int class_count;
		
		CompilerContext compiler;
#line default

  /** error output stream.
      It should be changeable.
    */
  public System.IO.TextWriter ErrorOutput = System.Console.Out;

  /** simplified error message.
      @see <a href="#yyerror(java.lang.String, java.lang.String[])">yyerror</a>
    */
  public void yyerror (string message) {
    yyerror(message, null);
  }

  /* An EOF token */
  public int eof_token;

  /** (syntax) error message.
      Can be overwritten to control message format.
      @param message text to be displayed.
      @param expected vector of acceptable tokens, if available.
    */
  public void yyerror (string message, string[] expected) {
    if ((yacc_verbose_flag > 0) && (expected != null) && (expected.Length  > 0)) {
      ErrorOutput.Write (message+", expecting");
      for (int n = 0; n < expected.Length; ++ n)
        ErrorOutput.Write (" "+expected[n]);
        ErrorOutput.WriteLine ();
    } else
      ErrorOutput.WriteLine (message);
  }

  /** debugging support, requires the package jay.yydebug.
      Set to null to suppress debugging messages.
    */
  internal yydebug.yyDebug debug;

  protected static  int yyFinal = 8;
 // Put this array into a separate class so it is only initialized if debugging is actually used
 // Use MarshalByRefObject to disable inlining
 class YYRules : MarshalByRefObject {
  public static  string [] yyRule = {
    "$accept : compilation_unit",
    "compilation_unit : outer_declarations opt_EOF",
    "compilation_unit : outer_declarations global_attributes opt_EOF",
    "compilation_unit : global_attributes opt_EOF",
    "compilation_unit : opt_EOF",
    "$$1 :",
    "compilation_unit : interactive_parsing $$1 opt_EOF",
    "opt_EOF :",
    "opt_EOF : EOF",
    "outer_declarations : outer_declaration",
    "outer_declarations : outer_declarations outer_declaration",
    "outer_declaration : extern_alias_directive",
    "outer_declaration : using_directive",
    "outer_declaration : namespace_member_declaration",
    "extern_alias_directives : extern_alias_directive",
    "extern_alias_directives : extern_alias_directives extern_alias_directive",
    "extern_alias_directive : EXTERN_ALIAS IDENTIFIER IDENTIFIER SEMICOLON",
    "extern_alias_directive : EXTERN_ALIAS error",
    "using_directives : using_directive",
    "using_directives : using_directives using_directive",
    "using_directive : using_alias_directive",
    "using_directive : using_namespace_directive",
    "using_alias_directive : USING IDENTIFIER ASSIGN namespace_or_type_name SEMICOLON",
    "using_alias_directive : USING error",
    "using_namespace_directive : USING namespace_name SEMICOLON",
    "$$2 :",
    "namespace_declaration : opt_attributes NAMESPACE qualified_identifier $$2 namespace_body opt_semicolon",
    "qualified_identifier : IDENTIFIER",
    "qualified_identifier : qualified_identifier DOT IDENTIFIER",
    "qualified_identifier : error",
    "opt_semicolon :",
    "opt_semicolon : SEMICOLON",
    "opt_comma :",
    "opt_comma : COMMA",
    "namespace_name : namespace_or_type_name",
    "$$3 :",
    "namespace_body : OPEN_BRACE $$3 namespace_body_body",
    "namespace_body_body : opt_extern_alias_directives opt_using_directives opt_namespace_member_declarations CLOSE_BRACE",
    "$$4 :",
    "namespace_body_body : error $$4 CLOSE_BRACE",
    "namespace_body_body : opt_extern_alias_directives opt_using_directives opt_namespace_member_declarations EOF",
    "opt_using_directives :",
    "opt_using_directives : using_directives",
    "opt_extern_alias_directives :",
    "opt_extern_alias_directives : extern_alias_directives",
    "opt_namespace_member_declarations :",
    "opt_namespace_member_declarations : namespace_member_declarations",
    "namespace_member_declarations : namespace_member_declaration",
    "namespace_member_declarations : namespace_member_declarations namespace_member_declaration",
    "namespace_member_declaration : type_declaration",
    "namespace_member_declaration : namespace_declaration",
    "namespace_member_declaration : field_declaration",
    "namespace_member_declaration : method_declaration",
    "type_declaration : class_declaration",
    "type_declaration : struct_declaration",
    "type_declaration : interface_declaration",
    "type_declaration : enum_declaration",
    "type_declaration : delegate_declaration",
    "global_attributes : attribute_sections",
    "opt_attributes :",
    "opt_attributes : attribute_sections",
    "attribute_sections : attribute_section",
    "attribute_sections : attribute_sections attribute_section",
    "attribute_section : OPEN_BRACKET attribute_target_specifier attribute_list opt_comma CLOSE_BRACKET",
    "attribute_section : OPEN_BRACKET attribute_list opt_comma CLOSE_BRACKET",
    "attribute_target_specifier : attribute_target COLON",
    "attribute_target : IDENTIFIER",
    "attribute_target : EVENT",
    "attribute_target : RETURN",
    "attribute_target : error",
    "attribute_list : attribute",
    "attribute_list : attribute_list COMMA attribute",
    "$$5 :",
    "attribute : attribute_name $$5 opt_attribute_arguments",
    "attribute_name : namespace_or_type_name",
    "opt_attribute_arguments :",
    "opt_attribute_arguments : OPEN_PARENS attribute_arguments CLOSE_PARENS",
    "attribute_arguments :",
    "attribute_arguments : positional_or_named_argument",
    "attribute_arguments : named_attribute_argument",
    "attribute_arguments : attribute_arguments COMMA positional_or_named_argument",
    "attribute_arguments : attribute_arguments COMMA named_attribute_argument",
    "positional_or_named_argument : expression",
    "positional_or_named_argument : named_argument",
    "named_attribute_argument : IDENTIFIER ASSIGN expression",
    "named_argument : IDENTIFIER COLON expression",
    "class_body : OPEN_BRACE opt_class_member_declarations CLOSE_BRACE",
    "opt_class_member_declarations :",
    "opt_class_member_declarations : class_member_declarations",
    "class_member_declarations : class_member_declaration",
    "class_member_declarations : class_member_declarations class_member_declaration",
    "class_member_declaration : constant_declaration",
    "class_member_declaration : field_declaration",
    "class_member_declaration : method_declaration",
    "class_member_declaration : property_declaration",
    "class_member_declaration : event_declaration",
    "class_member_declaration : indexer_declaration",
    "class_member_declaration : operator_declaration",
    "class_member_declaration : constructor_declaration",
    "class_member_declaration : destructor_declaration",
    "class_member_declaration : type_declaration",
    "class_member_declaration : error",
    "$$6 :",
    "$$7 :",
    "$$8 :",
    "$$9 :",
    "struct_declaration : opt_attributes opt_modifiers opt_partial STRUCT $$6 type_declaration_name $$7 opt_class_base opt_type_parameter_constraints_clauses $$8 struct_body $$9 opt_semicolon",
    "struct_declaration : opt_attributes opt_modifiers opt_partial STRUCT error",
    "$$10 :",
    "struct_body : OPEN_BRACE $$10 opt_struct_member_declarations CLOSE_BRACE",
    "opt_struct_member_declarations :",
    "opt_struct_member_declarations : struct_member_declarations",
    "struct_member_declarations : struct_member_declaration",
    "struct_member_declarations : struct_member_declarations struct_member_declaration",
    "struct_member_declaration : constant_declaration",
    "struct_member_declaration : field_declaration",
    "struct_member_declaration : method_declaration",
    "struct_member_declaration : property_declaration",
    "struct_member_declaration : event_declaration",
    "struct_member_declaration : indexer_declaration",
    "struct_member_declaration : operator_declaration",
    "struct_member_declaration : constructor_declaration",
    "struct_member_declaration : type_declaration",
    "struct_member_declaration : destructor_declaration",
    "constant_declaration : opt_attributes opt_modifiers CONST type constant_declarators SEMICOLON",
    "constant_declarators : constant_declarator",
    "constant_declarators : constant_declarators COMMA constant_declarator",
    "$$11 :",
    "constant_declarator : IDENTIFIER ASSIGN $$11 constant_initializer",
    "constant_declarator : IDENTIFIER",
    "constant_initializer : constant_expression",
    "constant_initializer : array_initializer",
    "field_declaration : opt_attributes opt_modifiers member_type variable_declarators SEMICOLON",
    "field_declaration : opt_attributes opt_modifiers FIXED member_type fixed_variable_declarators SEMICOLON",
    "field_declaration : opt_attributes opt_modifiers FIXED member_type error",
    "fixed_variable_declarators : fixed_variable_declarator",
    "fixed_variable_declarators : fixed_variable_declarators COMMA fixed_variable_declarator",
    "fixed_variable_declarator : IDENTIFIER OPEN_BRACKET expression CLOSE_BRACKET",
    "fixed_variable_declarator : IDENTIFIER OPEN_BRACKET CLOSE_BRACKET",
    "local_variable_declarators : local_variable_declarator",
    "local_variable_declarators : local_variable_declarators COMMA local_variable_declarator",
    "local_variable_declarator : IDENTIFIER ASSIGN local_variable_initializer",
    "local_variable_declarator : IDENTIFIER",
    "local_variable_declarator : IDENTIFIER variable_bad_array",
    "local_variable_initializer : expression",
    "local_variable_initializer : array_initializer",
    "local_variable_initializer : STACKALLOC simple_type OPEN_BRACKET expression CLOSE_BRACKET",
    "local_variable_initializer : ARGLIST",
    "local_variable_initializer : STACKALLOC simple_type",
    "variable_declarators : variable_declarator",
    "variable_declarators : variable_declarators COMMA variable_declarator",
    "$$12 :",
    "variable_declarator : member_declaration_name ASSIGN $$12 variable_initializer",
    "variable_declarator : member_declaration_name",
    "variable_declarator : member_declaration_name variable_bad_array",
    "variable_bad_array : OPEN_BRACKET opt_expression CLOSE_BRACKET",
    "variable_initializer : expression",
    "variable_initializer : array_initializer",
    "$$13 :",
    "method_declaration : method_header $$13 method_body",
    "$$14 :",
    "$$15 :",
    "method_header : opt_attributes opt_modifiers member_type method_declaration_name OPEN_PARENS $$14 opt_formal_parameter_list CLOSE_PARENS $$15 opt_type_parameter_constraints_clauses",
    "$$16 :",
    "$$17 :",
    "method_header : opt_attributes opt_modifiers PARTIAL VOID method_declaration_name OPEN_PARENS $$16 opt_formal_parameter_list CLOSE_PARENS $$17 opt_type_parameter_constraints_clauses",
    "method_header : opt_attributes opt_modifiers member_type modifiers method_declaration_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS",
    "method_body : block",
    "method_body : SEMICOLON",
    "opt_formal_parameter_list :",
    "opt_formal_parameter_list : formal_parameter_list",
    "formal_parameter_list : fixed_parameters",
    "formal_parameter_list : fixed_parameters COMMA parameter_array",
    "formal_parameter_list : fixed_parameters COMMA arglist_modifier",
    "formal_parameter_list : parameter_array COMMA error",
    "formal_parameter_list : fixed_parameters COMMA parameter_array COMMA error",
    "formal_parameter_list : arglist_modifier COMMA error",
    "formal_parameter_list : fixed_parameters COMMA ARGLIST COMMA error",
    "formal_parameter_list : parameter_array",
    "formal_parameter_list : arglist_modifier",
    "fixed_parameters : fixed_parameter",
    "fixed_parameters : fixed_parameters COMMA fixed_parameter",
    "fixed_parameter : opt_attributes opt_parameter_modifier parameter_type IDENTIFIER",
    "fixed_parameter : opt_attributes opt_parameter_modifier parameter_type IDENTIFIER OPEN_BRACKET CLOSE_BRACKET",
    "fixed_parameter : opt_attributes opt_parameter_modifier parameter_type error",
    "fixed_parameter : opt_attributes opt_parameter_modifier parameter_type IDENTIFIER ASSIGN constant_expression",
    "opt_parameter_modifier :",
    "opt_parameter_modifier : parameter_modifiers",
    "parameter_modifiers : parameter_modifier",
    "parameter_modifiers : parameter_modifiers parameter_modifier",
    "parameter_modifier : REF",
    "parameter_modifier : OUT",
    "parameter_modifier : THIS",
    "parameter_array : opt_attributes params_modifier type IDENTIFIER",
    "parameter_array : opt_attributes params_modifier type IDENTIFIER ASSIGN constant_expression",
    "parameter_array : opt_attributes params_modifier type error",
    "params_modifier : PARAMS",
    "params_modifier : PARAMS parameter_modifier",
    "params_modifier : PARAMS params_modifier",
    "arglist_modifier : ARGLIST",
    "$$18 :",
    "$$19 :",
    "$$20 :",
    "property_declaration : opt_attributes opt_modifiers member_type member_declaration_name $$18 OPEN_BRACE $$19 accessor_declarations $$20 CLOSE_BRACE",
    "accessor_declarations : get_accessor_declaration",
    "accessor_declarations : get_accessor_declaration accessor_declarations",
    "accessor_declarations : set_accessor_declaration",
    "accessor_declarations : set_accessor_declaration accessor_declarations",
    "accessor_declarations : error",
    "$$21 :",
    "get_accessor_declaration : opt_attributes opt_modifiers GET $$21 accessor_body",
    "$$22 :",
    "set_accessor_declaration : opt_attributes opt_modifiers SET $$22 accessor_body",
    "accessor_body : block",
    "accessor_body : SEMICOLON",
    "accessor_body : error",
    "$$23 :",
    "$$24 :",
    "$$25 :",
    "$$26 :",
    "interface_declaration : opt_attributes opt_modifiers opt_partial INTERFACE $$23 type_declaration_name $$24 opt_class_base opt_type_parameter_constraints_clauses $$25 interface_body $$26 opt_semicolon",
    "interface_declaration : opt_attributes opt_modifiers opt_partial INTERFACE error",
    "interface_body : OPEN_BRACE opt_interface_member_declarations CLOSE_BRACE",
    "opt_interface_member_declarations :",
    "opt_interface_member_declarations : interface_member_declarations",
    "interface_member_declarations : interface_member_declaration",
    "interface_member_declarations : interface_member_declarations interface_member_declaration",
    "interface_member_declaration : constant_declaration",
    "interface_member_declaration : field_declaration",
    "interface_member_declaration : method_declaration",
    "interface_member_declaration : property_declaration",
    "interface_member_declaration : event_declaration",
    "interface_member_declaration : indexer_declaration",
    "interface_member_declaration : operator_declaration",
    "interface_member_declaration : constructor_declaration",
    "interface_member_declaration : type_declaration",
    "$$27 :",
    "operator_declaration : opt_attributes opt_modifiers operator_declarator $$27 operator_body",
    "operator_body : block",
    "operator_body : SEMICOLON",
    "operator_type : type_expression_or_array",
    "operator_type : VOID",
    "$$28 :",
    "operator_declarator : operator_type OPERATOR overloadable_operator OPEN_PARENS $$28 opt_formal_parameter_list CLOSE_PARENS",
    "operator_declarator : conversion_operator_declarator",
    "overloadable_operator : BANG",
    "overloadable_operator : TILDE",
    "overloadable_operator : OP_INC",
    "overloadable_operator : OP_DEC",
    "overloadable_operator : TRUE",
    "overloadable_operator : FALSE",
    "overloadable_operator : PLUS",
    "overloadable_operator : MINUS",
    "overloadable_operator : STAR",
    "overloadable_operator : DIV",
    "overloadable_operator : PERCENT",
    "overloadable_operator : BITWISE_AND",
    "overloadable_operator : BITWISE_OR",
    "overloadable_operator : CARRET",
    "overloadable_operator : OP_SHIFT_LEFT",
    "overloadable_operator : OP_SHIFT_RIGHT",
    "overloadable_operator : OP_EQ",
    "overloadable_operator : OP_NE",
    "overloadable_operator : OP_GT",
    "overloadable_operator : OP_LT",
    "overloadable_operator : OP_GE",
    "overloadable_operator : OP_LE",
    "$$29 :",
    "conversion_operator_declarator : IMPLICIT OPERATOR type OPEN_PARENS $$29 opt_formal_parameter_list CLOSE_PARENS",
    "$$30 :",
    "conversion_operator_declarator : EXPLICIT OPERATOR type OPEN_PARENS $$30 opt_formal_parameter_list CLOSE_PARENS",
    "conversion_operator_declarator : IMPLICIT error",
    "conversion_operator_declarator : EXPLICIT error",
    "constructor_declaration : constructor_declarator constructor_body",
    "$$31 :",
    "$$32 :",
    "constructor_declarator : opt_attributes opt_modifiers IDENTIFIER $$31 OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS $$32 opt_constructor_initializer",
    "constructor_body : block_prepared",
    "constructor_body : SEMICOLON",
    "opt_constructor_initializer :",
    "opt_constructor_initializer : constructor_initializer",
    "$$33 :",
    "constructor_initializer : COLON BASE OPEN_PARENS $$33 opt_argument_list CLOSE_PARENS",
    "$$34 :",
    "constructor_initializer : COLON THIS OPEN_PARENS $$34 opt_argument_list CLOSE_PARENS",
    "constructor_initializer : COLON error",
    "$$35 :",
    "destructor_declaration : opt_attributes opt_modifiers TILDE $$35 IDENTIFIER OPEN_PARENS CLOSE_PARENS method_body",
    "event_declaration : opt_attributes opt_modifiers EVENT type variable_declarators SEMICOLON",
    "$$36 :",
    "$$37 :",
    "event_declaration : opt_attributes opt_modifiers EVENT type member_declaration_name OPEN_BRACE $$36 event_accessor_declarations $$37 CLOSE_BRACE",
    "event_declaration : opt_attributes opt_modifiers EVENT type member_declaration_name error",
    "event_accessor_declarations : add_accessor_declaration remove_accessor_declaration",
    "event_accessor_declarations : remove_accessor_declaration add_accessor_declaration",
    "event_accessor_declarations : add_accessor_declaration",
    "event_accessor_declarations : remove_accessor_declaration",
    "event_accessor_declarations : error",
    "event_accessor_declarations :",
    "$$38 :",
    "add_accessor_declaration : opt_attributes ADD $$38 block",
    "add_accessor_declaration : opt_attributes ADD error",
    "add_accessor_declaration : opt_attributes modifiers ADD",
    "$$39 :",
    "remove_accessor_declaration : opt_attributes REMOVE $$39 block",
    "remove_accessor_declaration : opt_attributes REMOVE error",
    "remove_accessor_declaration : opt_attributes modifiers REMOVE",
    "$$40 :",
    "$$41 :",
    "$$42 :",
    "indexer_declaration : opt_attributes opt_modifiers member_type indexer_declaration_name OPEN_BRACKET $$40 opt_formal_parameter_list CLOSE_BRACKET OPEN_BRACE $$41 accessor_declarations $$42 CLOSE_BRACE",
    "$$43 :",
    "enum_declaration : opt_attributes opt_modifiers ENUM type_declaration_name opt_enum_base $$43 enum_body opt_semicolon",
    "opt_enum_base :",
    "opt_enum_base : COLON type",
    "opt_enum_base : COLON error",
    "$$44 :",
    "$$45 :",
    "enum_body : OPEN_BRACE $$44 opt_enum_member_declarations $$45 CLOSE_BRACE",
    "opt_enum_member_declarations :",
    "opt_enum_member_declarations : enum_member_declarations opt_comma",
    "enum_member_declarations : enum_member_declaration",
    "enum_member_declarations : enum_member_declarations COMMA enum_member_declaration",
    "enum_member_declaration : opt_attributes IDENTIFIER",
    "$$46 :",
    "enum_member_declaration : opt_attributes IDENTIFIER $$46 ASSIGN constant_expression",
    "$$47 :",
    "$$48 :",
    "$$49 :",
    "delegate_declaration : opt_attributes opt_modifiers DELEGATE member_type type_declaration_name OPEN_PARENS $$47 opt_formal_parameter_list CLOSE_PARENS $$48 opt_type_parameter_constraints_clauses $$49 SEMICOLON",
    "opt_nullable :",
    "opt_nullable : INTERR_NULLABLE",
    "namespace_or_type_name : member_name",
    "namespace_or_type_name : qualified_alias_member IDENTIFIER opt_type_argument_list",
    "member_name : type_name",
    "member_name : namespace_or_type_name DOT IDENTIFIER opt_type_argument_list",
    "type_name : IDENTIFIER opt_type_argument_list",
    "opt_type_argument_list :",
    "opt_type_argument_list : OP_GENERICS_LT type_arguments OP_GENERICS_GT",
    "opt_type_argument_list : OP_GENERICS_LT error",
    "type_arguments : type",
    "type_arguments : type_arguments COMMA type",
    "$$50 :",
    "type_declaration_name : IDENTIFIER $$50 opt_type_parameter_list",
    "member_declaration_name : method_declaration_name",
    "method_declaration_name : type_declaration_name",
    "method_declaration_name : explicit_interface IDENTIFIER opt_type_parameter_list",
    "indexer_declaration_name : THIS",
    "indexer_declaration_name : explicit_interface THIS",
    "explicit_interface : IDENTIFIER opt_type_argument_list DOT",
    "explicit_interface : qualified_alias_member IDENTIFIER opt_type_argument_list DOT",
    "explicit_interface : explicit_interface IDENTIFIER opt_type_argument_list DOT",
    "opt_type_parameter_list :",
    "opt_type_parameter_list : OP_GENERICS_LT_DECL type_parameters OP_GENERICS_GT",
    "type_parameters : type_parameter",
    "type_parameters : type_parameters COMMA type_parameter",
    "type_parameter : opt_attributes opt_type_parameter_variance IDENTIFIER",
    "type_parameter : error",
    "type_and_void : type_expression_or_array",
    "type_and_void : VOID",
    "member_type : type_and_void",
    "type : type_expression_or_array",
    "type : VOID",
    "simple_type : type_expression",
    "simple_type : VOID",
    "parameter_type : type_expression_or_array",
    "parameter_type : VOID",
    "type_expression_or_array : type_expression",
    "type_expression_or_array : type_expression rank_specifiers",
    "type_expression : namespace_or_type_name opt_nullable",
    "type_expression : builtin_types opt_nullable",
    "type_expression : type_expression STAR",
    "type_expression : VOID STAR",
    "type_list : base_type_name",
    "type_list : type_list COMMA base_type_name",
    "base_type_name : type",
    "base_type_name : error",
    "builtin_types : OBJECT",
    "builtin_types : STRING",
    "builtin_types : BOOL",
    "builtin_types : DECIMAL",
    "builtin_types : FLOAT",
    "builtin_types : DOUBLE",
    "builtin_types : integral_type",
    "integral_type : SBYTE",
    "integral_type : BYTE",
    "integral_type : SHORT",
    "integral_type : USHORT",
    "integral_type : INT",
    "integral_type : UINT",
    "integral_type : LONG",
    "integral_type : ULONG",
    "integral_type : CHAR",
    "predefined_type : builtin_types",
    "predefined_type : VOID",
    "primary_expression : primary_expression_no_array_creation",
    "primary_expression : array_creation_expression",
    "primary_expression_no_array_creation : literal",
    "primary_expression_no_array_creation : IDENTIFIER opt_type_argument_list",
    "primary_expression_no_array_creation : IDENTIFIER GENERATE_COMPLETION",
    "primary_expression_no_array_creation : parenthesized_expression",
    "primary_expression_no_array_creation : default_value_expression",
    "primary_expression_no_array_creation : member_access",
    "primary_expression_no_array_creation : invocation_expression",
    "primary_expression_no_array_creation : element_access",
    "primary_expression_no_array_creation : this_access",
    "primary_expression_no_array_creation : base_access",
    "primary_expression_no_array_creation : post_increment_expression",
    "primary_expression_no_array_creation : post_decrement_expression",
    "primary_expression_no_array_creation : object_or_delegate_creation_expression",
    "primary_expression_no_array_creation : anonymous_type_expression",
    "primary_expression_no_array_creation : typeof_expression",
    "primary_expression_no_array_creation : sizeof_expression",
    "primary_expression_no_array_creation : checked_expression",
    "primary_expression_no_array_creation : unchecked_expression",
    "primary_expression_no_array_creation : pointer_member_access",
    "primary_expression_no_array_creation : anonymous_method_expression",
    "literal : boolean_literal",
    "literal : integer_literal",
    "literal : real_literal",
    "literal : LITERAL_CHARACTER",
    "literal : LITERAL_STRING",
    "literal : NULL",
    "real_literal : LITERAL_FLOAT",
    "real_literal : LITERAL_DOUBLE",
    "real_literal : LITERAL_DECIMAL",
    "integer_literal : LITERAL_INTEGER",
    "boolean_literal : TRUE",
    "boolean_literal : FALSE",
    "open_parens_any : OPEN_PARENS",
    "open_parens_any : OPEN_PARENS_CAST",
    "open_parens_any : OPEN_PARENS_LAMBDA",
    "parenthesized_expression : OPEN_PARENS expression CLOSE_PARENS",
    "parenthesized_expression : OPEN_PARENS expression COMPLETE_COMPLETION",
    "member_access : primary_expression DOT IDENTIFIER opt_type_argument_list",
    "member_access : predefined_type DOT IDENTIFIER opt_type_argument_list",
    "member_access : qualified_alias_member IDENTIFIER opt_type_argument_list",
    "member_access : primary_expression DOT GENERATE_COMPLETION",
    "member_access : primary_expression DOT IDENTIFIER GENERATE_COMPLETION",
    "member_access : predefined_type DOT GENERATE_COMPLETION",
    "member_access : predefined_type DOT IDENTIFIER GENERATE_COMPLETION",
    "invocation_expression : primary_expression open_parens_any opt_argument_list CLOSE_PARENS",
    "opt_object_or_collection_initializer :",
    "opt_object_or_collection_initializer : object_or_collection_initializer",
    "object_or_collection_initializer : OPEN_BRACE opt_member_initializer_list close_brace_or_complete_completion",
    "object_or_collection_initializer : OPEN_BRACE member_initializer_list COMMA CLOSE_BRACE",
    "opt_member_initializer_list :",
    "opt_member_initializer_list : member_initializer_list",
    "member_initializer_list : member_initializer",
    "member_initializer_list : member_initializer_list COMMA member_initializer",
    "member_initializer : IDENTIFIER ASSIGN initializer_value",
    "member_initializer : GENERATE_COMPLETION",
    "member_initializer : non_assignment_expression opt_COMPLETE_COMPLETION",
    "member_initializer : OPEN_BRACE expression_list CLOSE_BRACE",
    "member_initializer : OPEN_BRACE CLOSE_BRACE",
    "initializer_value : expression",
    "initializer_value : object_or_collection_initializer",
    "opt_argument_list :",
    "opt_argument_list : argument_list",
    "argument_list : argument_or_named_argument",
    "argument_list : argument_list COMMA argument",
    "argument_list : argument_list COMMA named_argument",
    "argument_list : argument_list COMMA",
    "argument_list : COMMA argument_or_named_argument",
    "argument : expression",
    "argument : non_simple_argument",
    "argument_or_named_argument : argument",
    "argument_or_named_argument : named_argument",
    "non_simple_argument : REF variable_reference",
    "non_simple_argument : OUT variable_reference",
    "non_simple_argument : ARGLIST open_parens_any argument_list CLOSE_PARENS",
    "non_simple_argument : ARGLIST open_parens_any CLOSE_PARENS",
    "non_simple_argument : ARGLIST",
    "variable_reference : expression",
    "element_access : primary_expression_no_array_creation OPEN_BRACKET expression_list_arguments CLOSE_BRACKET",
    "element_access : array_creation_expression OPEN_BRACKET expression_list_arguments CLOSE_BRACKET",
    "element_access : primary_expression_no_array_creation rank_specifiers",
    "expression_list : expression",
    "expression_list : expression_list COMMA expression",
    "expression_list_arguments : expression_list_argument",
    "expression_list_arguments : expression_list_arguments COMMA expression_list_argument",
    "expression_list_argument : expression",
    "expression_list_argument : named_argument",
    "this_access : THIS",
    "base_access : BASE DOT IDENTIFIER opt_type_argument_list",
    "base_access : BASE OPEN_BRACKET expression_list_arguments CLOSE_BRACKET",
    "base_access : BASE error",
    "post_increment_expression : primary_expression OP_INC",
    "post_decrement_expression : primary_expression OP_DEC",
    "object_or_delegate_creation_expression : new_expr_start open_parens_any opt_argument_list CLOSE_PARENS opt_object_or_collection_initializer",
    "object_or_delegate_creation_expression : new_expr_start object_or_collection_initializer",
    "array_creation_expression : new_expr_start OPEN_BRACKET expression_list CLOSE_BRACKET opt_rank_specifier opt_array_initializer",
    "array_creation_expression : new_expr_start rank_specifiers opt_array_initializer",
    "array_creation_expression : NEW rank_specifiers array_initializer",
    "array_creation_expression : new_expr_start error",
    "$$51 :",
    "new_expr_start : NEW $$51 simple_type",
    "anonymous_type_expression : NEW OPEN_BRACE anonymous_type_parameters_opt_comma CLOSE_BRACE",
    "anonymous_type_parameters_opt_comma : anonymous_type_parameters_opt",
    "anonymous_type_parameters_opt_comma : anonymous_type_parameters COMMA",
    "anonymous_type_parameters_opt :",
    "anonymous_type_parameters_opt : anonymous_type_parameters",
    "anonymous_type_parameters : anonymous_type_parameter",
    "anonymous_type_parameters : anonymous_type_parameters COMMA anonymous_type_parameter",
    "anonymous_type_parameter : IDENTIFIER ASSIGN variable_initializer",
    "anonymous_type_parameter : IDENTIFIER",
    "anonymous_type_parameter : BASE DOT IDENTIFIER opt_type_argument_list",
    "anonymous_type_parameter : member_access",
    "anonymous_type_parameter : error",
    "opt_rank_specifier :",
    "opt_rank_specifier : rank_specifiers",
    "opt_rank_specifier_or_nullable : opt_nullable",
    "opt_rank_specifier_or_nullable : opt_nullable rank_specifiers",
    "rank_specifiers : rank_specifier",
    "rank_specifiers : rank_specifier rank_specifiers",
    "rank_specifier : OPEN_BRACKET CLOSE_BRACKET",
    "rank_specifier : OPEN_BRACKET dim_separators CLOSE_BRACKET",
    "rank_specifier : OPEN_BRACKET error CLOSE_BRACKET",
    "dim_separators : COMMA",
    "dim_separators : dim_separators COMMA",
    "opt_array_initializer :",
    "opt_array_initializer : array_initializer",
    "array_initializer : OPEN_BRACE CLOSE_BRACE",
    "array_initializer : OPEN_BRACE variable_initializer_list opt_comma CLOSE_BRACE",
    "variable_initializer_list : variable_initializer",
    "variable_initializer_list : variable_initializer_list COMMA variable_initializer",
    "variable_initializer_list : error",
    "$$52 :",
    "typeof_expression : TYPEOF $$52 open_parens_any typeof_type_expression CLOSE_PARENS",
    "typeof_type_expression : type_and_void",
    "typeof_type_expression : unbound_type_name",
    "typeof_type_expression : error",
    "unbound_type_name : IDENTIFIER generic_dimension",
    "unbound_type_name : qualified_alias_member IDENTIFIER generic_dimension",
    "unbound_type_name : unbound_type_name DOT IDENTIFIER",
    "unbound_type_name : unbound_type_name DOT IDENTIFIER generic_dimension",
    "unbound_type_name : namespace_or_type_name DOT IDENTIFIER generic_dimension",
    "generic_dimension : GENERIC_DIMENSION",
    "qualified_alias_member : IDENTIFIER DOUBLE_COLON",
    "sizeof_expression : SIZEOF open_parens_any type CLOSE_PARENS",
    "checked_expression : CHECKED open_parens_any expression CLOSE_PARENS",
    "unchecked_expression : UNCHECKED open_parens_any expression CLOSE_PARENS",
    "pointer_member_access : primary_expression OP_PTR IDENTIFIER",
    "$$53 :",
    "anonymous_method_expression : DELEGATE opt_anonymous_method_signature $$53 block",
    "opt_anonymous_method_signature :",
    "opt_anonymous_method_signature : anonymous_method_signature",
    "$$54 :",
    "anonymous_method_signature : OPEN_PARENS $$54 opt_formal_parameter_list CLOSE_PARENS",
    "default_value_expression : DEFAULT open_parens_any type CLOSE_PARENS",
    "unary_expression : primary_expression",
    "unary_expression : BANG prefixed_unary_expression",
    "unary_expression : TILDE prefixed_unary_expression",
    "unary_expression : cast_expression",
    "cast_expression : OPEN_PARENS_CAST type CLOSE_PARENS prefixed_unary_expression",
    "cast_expression : OPEN_PARENS predefined_type CLOSE_PARENS prefixed_unary_expression",
    "prefixed_unary_expression : unary_expression",
    "prefixed_unary_expression : PLUS prefixed_unary_expression",
    "prefixed_unary_expression : MINUS prefixed_unary_expression",
    "prefixed_unary_expression : OP_INC prefixed_unary_expression",
    "prefixed_unary_expression : OP_DEC prefixed_unary_expression",
    "prefixed_unary_expression : STAR prefixed_unary_expression",
    "prefixed_unary_expression : BITWISE_AND prefixed_unary_expression",
    "multiplicative_expression : prefixed_unary_expression",
    "multiplicative_expression : multiplicative_expression STAR prefixed_unary_expression",
    "multiplicative_expression : multiplicative_expression DIV prefixed_unary_expression",
    "multiplicative_expression : multiplicative_expression PERCENT prefixed_unary_expression",
    "additive_expression : multiplicative_expression",
    "additive_expression : additive_expression PLUS multiplicative_expression",
    "additive_expression : additive_expression MINUS multiplicative_expression",
    "additive_expression : parenthesized_expression MINUS multiplicative_expression",
    "additive_expression : additive_expression AS type",
    "additive_expression : additive_expression IS type",
    "shift_expression : additive_expression",
    "shift_expression : shift_expression OP_SHIFT_LEFT additive_expression",
    "shift_expression : shift_expression OP_SHIFT_RIGHT additive_expression",
    "relational_expression : shift_expression",
    "relational_expression : relational_expression OP_LT shift_expression",
    "relational_expression : relational_expression OP_GT shift_expression",
    "relational_expression : relational_expression OP_LE shift_expression",
    "relational_expression : relational_expression OP_GE shift_expression",
    "equality_expression : relational_expression",
    "equality_expression : equality_expression OP_EQ relational_expression",
    "equality_expression : equality_expression OP_NE relational_expression",
    "and_expression : equality_expression",
    "and_expression : and_expression BITWISE_AND equality_expression",
    "exclusive_or_expression : and_expression",
    "exclusive_or_expression : exclusive_or_expression CARRET and_expression",
    "inclusive_or_expression : exclusive_or_expression",
    "inclusive_or_expression : inclusive_or_expression BITWISE_OR exclusive_or_expression",
    "conditional_and_expression : inclusive_or_expression",
    "conditional_and_expression : conditional_and_expression OP_AND inclusive_or_expression",
    "conditional_or_expression : conditional_and_expression",
    "conditional_or_expression : conditional_or_expression OP_OR conditional_and_expression",
    "null_coalescing_expression : conditional_or_expression",
    "null_coalescing_expression : conditional_or_expression OP_COALESCING null_coalescing_expression",
    "conditional_expression : null_coalescing_expression",
    "conditional_expression : null_coalescing_expression INTERR expression COLON expression",
    "assignment_expression : prefixed_unary_expression ASSIGN expression",
    "assignment_expression : prefixed_unary_expression OP_MULT_ASSIGN expression",
    "assignment_expression : prefixed_unary_expression OP_DIV_ASSIGN expression",
    "assignment_expression : prefixed_unary_expression OP_MOD_ASSIGN expression",
    "assignment_expression : prefixed_unary_expression OP_ADD_ASSIGN expression",
    "assignment_expression : prefixed_unary_expression OP_SUB_ASSIGN expression",
    "assignment_expression : prefixed_unary_expression OP_SHIFT_LEFT_ASSIGN expression",
    "assignment_expression : prefixed_unary_expression OP_SHIFT_RIGHT_ASSIGN expression",
    "assignment_expression : prefixed_unary_expression OP_AND_ASSIGN expression",
    "assignment_expression : prefixed_unary_expression OP_OR_ASSIGN expression",
    "assignment_expression : prefixed_unary_expression OP_XOR_ASSIGN expression",
    "lambda_parameter_list : lambda_parameter",
    "lambda_parameter_list : lambda_parameter_list COMMA lambda_parameter",
    "lambda_parameter : parameter_modifier parameter_type IDENTIFIER",
    "lambda_parameter : parameter_type IDENTIFIER",
    "lambda_parameter : IDENTIFIER",
    "opt_lambda_parameter_list :",
    "opt_lambda_parameter_list : lambda_parameter_list",
    "$$55 :",
    "lambda_expression_body : $$55 expression",
    "lambda_expression_body : block",
    "$$56 :",
    "lambda_expression : IDENTIFIER ARROW $$56 lambda_expression_body",
    "$$57 :",
    "$$58 :",
    "lambda_expression : OPEN_PARENS_LAMBDA $$57 opt_lambda_parameter_list CLOSE_PARENS ARROW $$58 lambda_expression_body",
    "expression : assignment_expression",
    "expression : non_assignment_expression",
    "non_assignment_expression : conditional_expression",
    "non_assignment_expression : lambda_expression",
    "non_assignment_expression : query_expression",
    "constant_expression : expression",
    "boolean_expression : expression",
    "$$59 :",
    "$$60 :",
    "$$61 :",
    "$$62 :",
    "class_declaration : opt_attributes opt_modifiers opt_partial CLASS $$59 type_declaration_name $$60 opt_class_base opt_type_parameter_constraints_clauses $$61 class_body $$62 opt_semicolon",
    "opt_partial :",
    "opt_partial : PARTIAL",
    "opt_modifiers :",
    "opt_modifiers : modifiers",
    "modifiers : modifier",
    "modifiers : modifiers modifier",
    "modifier : NEW",
    "modifier : PUBLIC",
    "modifier : PROTECTED",
    "modifier : INTERNAL",
    "modifier : PRIVATE",
    "modifier : ABSTRACT",
    "modifier : SEALED",
    "modifier : STATIC",
    "modifier : READONLY",
    "modifier : VIRTUAL",
    "modifier : OVERRIDE",
    "modifier : EXTERN",
    "modifier : VOLATILE",
    "modifier : UNSAFE",
    "opt_class_base :",
    "opt_class_base : class_base",
    "class_base : COLON type_list",
    "opt_type_parameter_constraints_clauses :",
    "opt_type_parameter_constraints_clauses : type_parameter_constraints_clauses",
    "type_parameter_constraints_clauses : type_parameter_constraints_clause",
    "type_parameter_constraints_clauses : type_parameter_constraints_clauses type_parameter_constraints_clause",
    "type_parameter_constraints_clause : WHERE IDENTIFIER COLON type_parameter_constraints",
    "type_parameter_constraints : type_parameter_constraint",
    "type_parameter_constraints : type_parameter_constraints COMMA type_parameter_constraint",
    "type_parameter_constraint : type",
    "type_parameter_constraint : NEW OPEN_PARENS CLOSE_PARENS",
    "type_parameter_constraint : CLASS",
    "type_parameter_constraint : STRUCT",
    "opt_type_parameter_variance :",
    "opt_type_parameter_variance : type_parameter_variance",
    "type_parameter_variance : OUT",
    "type_parameter_variance : IN",
    "$$63 :",
    "block : OPEN_BRACE $$63 opt_statement_list block_end",
    "block_end : CLOSE_BRACE",
    "block_end : COMPLETE_COMPLETION",
    "$$64 :",
    "block_prepared : OPEN_BRACE $$64 opt_statement_list CLOSE_BRACE",
    "opt_statement_list :",
    "opt_statement_list : statement_list",
    "statement_list : statement",
    "statement_list : statement_list statement",
    "statement : declaration_statement",
    "statement : valid_declaration_statement",
    "statement : labeled_statement",
    "interactive_statement_list : interactive_statement",
    "interactive_statement_list : interactive_statement_list interactive_statement",
    "interactive_statement : declaration_statement",
    "interactive_statement : interactive_valid_declaration_statement",
    "interactive_statement : labeled_statement",
    "valid_declaration_statement : block",
    "valid_declaration_statement : empty_statement",
    "valid_declaration_statement : expression_statement",
    "valid_declaration_statement : selection_statement",
    "valid_declaration_statement : iteration_statement",
    "valid_declaration_statement : jump_statement",
    "valid_declaration_statement : try_statement",
    "valid_declaration_statement : checked_statement",
    "valid_declaration_statement : unchecked_statement",
    "valid_declaration_statement : lock_statement",
    "valid_declaration_statement : using_statement",
    "valid_declaration_statement : unsafe_statement",
    "valid_declaration_statement : fixed_statement",
    "interactive_valid_declaration_statement : block",
    "interactive_valid_declaration_statement : empty_statement",
    "interactive_valid_declaration_statement : interactive_expression_statement",
    "interactive_valid_declaration_statement : selection_statement",
    "interactive_valid_declaration_statement : iteration_statement",
    "interactive_valid_declaration_statement : jump_statement",
    "interactive_valid_declaration_statement : try_statement",
    "interactive_valid_declaration_statement : checked_statement",
    "interactive_valid_declaration_statement : unchecked_statement",
    "interactive_valid_declaration_statement : lock_statement",
    "interactive_valid_declaration_statement : using_statement",
    "interactive_valid_declaration_statement : unsafe_statement",
    "interactive_valid_declaration_statement : fixed_statement",
    "embedded_statement : valid_declaration_statement",
    "embedded_statement : declaration_statement",
    "embedded_statement : labeled_statement",
    "empty_statement : SEMICOLON",
    "$$65 :",
    "labeled_statement : IDENTIFIER COLON $$65 statement",
    "declaration_statement : local_variable_declaration SEMICOLON",
    "declaration_statement : local_constant_declaration SEMICOLON",
    "variable_type : primary_expression_no_array_creation opt_rank_specifier_or_nullable",
    "variable_type : builtin_types opt_rank_specifier_or_nullable",
    "variable_type : VOID opt_rank_specifier",
    "local_variable_pointer_type : primary_expression_no_array_creation STAR",
    "local_variable_pointer_type : builtin_types STAR",
    "local_variable_pointer_type : VOID STAR",
    "local_variable_pointer_type : local_variable_pointer_type STAR",
    "local_variable_type : variable_type",
    "local_variable_type : local_variable_pointer_type opt_rank_specifier",
    "local_variable_declaration : local_variable_type local_variable_declarators",
    "local_constant_declaration : CONST variable_type constant_declarators",
    "expression_statement : statement_expression SEMICOLON",
    "expression_statement : statement_expression COMPLETE_COMPLETION",
    "interactive_expression_statement : interactive_statement_expression SEMICOLON",
    "interactive_expression_statement : interactive_statement_expression COMPLETE_COMPLETION",
    "statement_expression : expression",
    "statement_expression : error",
    "interactive_statement_expression : expression",
    "interactive_statement_expression : error",
    "selection_statement : if_statement",
    "selection_statement : switch_statement",
    "if_statement : IF open_parens_any boolean_expression CLOSE_PARENS embedded_statement",
    "if_statement : IF open_parens_any boolean_expression CLOSE_PARENS embedded_statement ELSE embedded_statement",
    "$$66 :",
    "switch_statement : SWITCH open_parens_any $$66 expression CLOSE_PARENS switch_block",
    "switch_block : OPEN_BRACE opt_switch_sections CLOSE_BRACE",
    "opt_switch_sections :",
    "opt_switch_sections : switch_sections",
    "switch_sections : switch_section",
    "switch_sections : switch_sections switch_section",
    "$$67 :",
    "switch_section : switch_labels $$67 statement_list",
    "switch_labels : switch_label",
    "switch_labels : switch_labels switch_label",
    "switch_label : CASE constant_expression COLON",
    "switch_label : DEFAULT_COLON",
    "iteration_statement : while_statement",
    "iteration_statement : do_statement",
    "iteration_statement : for_statement",
    "iteration_statement : foreach_statement",
    "while_statement : WHILE open_parens_any boolean_expression CLOSE_PARENS embedded_statement",
    "do_statement : DO embedded_statement WHILE open_parens_any boolean_expression CLOSE_PARENS SEMICOLON",
    "$$68 :",
    "for_statement : FOR open_parens_any opt_for_initializer SEMICOLON $$68 opt_for_condition SEMICOLON opt_for_iterator CLOSE_PARENS embedded_statement",
    "opt_for_initializer :",
    "opt_for_initializer : for_initializer",
    "for_initializer : local_variable_declaration",
    "for_initializer : statement_expression_list",
    "opt_for_condition :",
    "opt_for_condition : boolean_expression",
    "opt_for_iterator :",
    "opt_for_iterator : for_iterator",
    "for_iterator : statement_expression_list",
    "statement_expression_list : statement_expression",
    "statement_expression_list : statement_expression_list COMMA statement_expression",
    "foreach_statement : FOREACH open_parens_any type IN expression CLOSE_PARENS",
    "$$69 :",
    "foreach_statement : FOREACH open_parens_any type IDENTIFIER IN expression CLOSE_PARENS $$69 embedded_statement",
    "jump_statement : break_statement",
    "jump_statement : continue_statement",
    "jump_statement : goto_statement",
    "jump_statement : return_statement",
    "jump_statement : throw_statement",
    "jump_statement : yield_statement",
    "break_statement : BREAK SEMICOLON",
    "continue_statement : CONTINUE SEMICOLON",
    "goto_statement : GOTO IDENTIFIER SEMICOLON",
    "goto_statement : GOTO CASE constant_expression SEMICOLON",
    "goto_statement : GOTO DEFAULT SEMICOLON",
    "return_statement : RETURN opt_expression SEMICOLON",
    "throw_statement : THROW opt_expression SEMICOLON",
    "yield_statement : IDENTIFIER RETURN expression SEMICOLON",
    "yield_statement : IDENTIFIER RETURN SEMICOLON",
    "yield_statement : IDENTIFIER BREAK SEMICOLON",
    "opt_expression :",
    "opt_expression : expression",
    "try_statement : TRY block catch_clauses",
    "try_statement : TRY block FINALLY block",
    "try_statement : TRY block catch_clauses FINALLY block",
    "try_statement : TRY block error",
    "catch_clauses : catch_clause",
    "catch_clauses : catch_clauses catch_clause",
    "opt_identifier :",
    "opt_identifier : IDENTIFIER",
    "$$70 :",
    "catch_clause : CATCH opt_catch_args $$70 block",
    "opt_catch_args :",
    "opt_catch_args : catch_args",
    "catch_args : open_parens_any type opt_identifier CLOSE_PARENS",
    "catch_args : open_parens_any CLOSE_PARENS",
    "checked_statement : CHECKED block",
    "unchecked_statement : UNCHECKED block",
    "$$71 :",
    "unsafe_statement : UNSAFE $$71 block",
    "$$72 :",
    "fixed_statement : FIXED open_parens_any type_and_void fixed_pointer_declarators CLOSE_PARENS $$72 embedded_statement",
    "fixed_pointer_declarators : fixed_pointer_declarator",
    "fixed_pointer_declarators : fixed_pointer_declarators COMMA fixed_pointer_declarator",
    "fixed_pointer_declarator : IDENTIFIER ASSIGN expression",
    "fixed_pointer_declarator : IDENTIFIER",
    "$$73 :",
    "lock_statement : LOCK open_parens_any expression CLOSE_PARENS $$73 embedded_statement",
    "$$74 :",
    "using_statement : USING open_parens_any local_variable_declaration CLOSE_PARENS $$74 embedded_statement",
    "$$75 :",
    "using_statement : USING open_parens_any expression CLOSE_PARENS $$75 embedded_statement",
    "query_expression : first_from_clause query_body",
    "query_expression : nested_from_clause query_body",
    "first_from_clause : FROM_FIRST IDENTIFIER IN expression",
    "first_from_clause : FROM_FIRST type IDENTIFIER IN expression",
    "nested_from_clause : FROM IDENTIFIER IN expression",
    "nested_from_clause : FROM type IDENTIFIER IN expression",
    "$$76 :",
    "from_clause : FROM IDENTIFIER IN $$76 expression",
    "$$77 :",
    "from_clause : FROM type IDENTIFIER IN $$77 expression",
    "query_body : opt_query_body_clauses select_or_group_clause opt_query_continuation",
    "$$78 :",
    "select_or_group_clause : SELECT $$78 expression",
    "$$79 :",
    "$$80 :",
    "select_or_group_clause : GROUP $$79 expression $$80 BY expression",
    "opt_query_body_clauses :",
    "opt_query_body_clauses : query_body_clauses",
    "query_body_clauses : query_body_clause",
    "query_body_clauses : query_body_clauses query_body_clause",
    "query_body_clause : from_clause",
    "query_body_clause : let_clause",
    "query_body_clause : where_clause",
    "query_body_clause : join_clause",
    "query_body_clause : orderby_clause",
    "$$81 :",
    "let_clause : LET IDENTIFIER ASSIGN $$81 expression",
    "$$82 :",
    "where_clause : WHERE $$82 boolean_expression",
    "$$83 :",
    "$$84 :",
    "$$85 :",
    "join_clause : JOIN IDENTIFIER IN $$83 expression ON $$84 expression EQUALS $$85 expression opt_join_into",
    "$$86 :",
    "$$87 :",
    "$$88 :",
    "join_clause : JOIN type IDENTIFIER IN $$86 expression ON $$87 expression EQUALS $$88 expression opt_join_into",
    "opt_join_into :",
    "opt_join_into : INTO IDENTIFIER",
    "$$89 :",
    "orderby_clause : ORDERBY $$89 orderings",
    "orderings : order_by",
    "$$90 :",
    "orderings : order_by COMMA $$90 orderings_then_by",
    "orderings_then_by : then_by",
    "$$91 :",
    "orderings_then_by : orderings_then_by COMMA $$91 then_by",
    "order_by : expression",
    "order_by : expression ASCENDING",
    "order_by : expression DESCENDING",
    "then_by : expression",
    "then_by : expression ASCENDING",
    "then_by : expression DESCENDING",
    "opt_query_continuation :",
    "$$92 :",
    "opt_query_continuation : INTO IDENTIFIER $$92 query_body",
    "interactive_parsing : EVAL_STATEMENT_PARSER EOF",
    "interactive_parsing : EVAL_USING_DECLARATIONS_UNIT_PARSER using_directives",
    "$$93 :",
    "interactive_parsing : EVAL_STATEMENT_PARSER $$93 interactive_statement_list opt_COMPLETE_COMPLETION",
    "$$94 :",
    "interactive_parsing : EVAL_COMPILATION_UNIT_PARSER $$94 interactive_compilation_unit",
    "interactive_compilation_unit : outer_declarations",
    "interactive_compilation_unit : outer_declarations global_attributes",
    "interactive_compilation_unit : global_attributes",
    "interactive_compilation_unit :",
    "opt_COMPLETE_COMPLETION :",
    "opt_COMPLETE_COMPLETION : COMPLETE_COMPLETION",
    "close_brace_or_complete_completion : CLOSE_BRACE",
    "close_brace_or_complete_completion : COMPLETE_COMPLETION",
  };
 public static string getRule (int index) {
    return yyRule [index];
 }
}
  protected static  string [] yyNames = {    
    "end-of-file",null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,null,null,null,null,null,null,null,
    null,null,null,null,null,null,null,"EOF","NONE","ERROR",
    "FIRST_KEYWORD","ABSTRACT","AS","ADD","BASE","BOOL","BREAK","BYTE",
    "CASE","CATCH","CHAR","CHECKED","CLASS","CONST","CONTINUE","DECIMAL",
    "DEFAULT","DELEGATE","DO","DOUBLE","ELSE","ENUM","EVENT","EXPLICIT",
    "EXTERN","FALSE","FINALLY","FIXED","FLOAT","FOR","FOREACH","GOTO",
    "IF","IMPLICIT","IN","INT","INTERFACE","INTERNAL","IS","LOCK","LONG",
    "NAMESPACE","NEW","NULL","OBJECT","OPERATOR","OUT","OVERRIDE",
    "PARAMS","PRIVATE","PROTECTED","PUBLIC","READONLY","REF","RETURN",
    "REMOVE","SBYTE","SEALED","SHORT","SIZEOF","STACKALLOC","STATIC",
    "STRING","STRUCT","SWITCH","THIS","THROW","TRUE","TRY","TYPEOF",
    "UINT","ULONG","UNCHECKED","UNSAFE","USHORT","USING","VIRTUAL","VOID",
    "VOLATILE","WHERE","WHILE","ARGLIST","PARTIAL","ARROW","FROM",
    "FROM_FIRST","JOIN","ON","EQUALS","SELECT","GROUP","BY","LET",
    "ORDERBY","ASCENDING","DESCENDING","INTO","INTERR_NULLABLE",
    "EXTERN_ALIAS","OP_GENERICS_LT","OP_GENERICS_LT_DECL",
    "OP_GENERICS_GT","GET","SET","LAST_KEYWORD","OPEN_BRACE",
    "CLOSE_BRACE","OPEN_BRACKET","CLOSE_BRACKET","OPEN_PARENS",
    "CLOSE_PARENS","DOT","COMMA","COLON","SEMICOLON","TILDE","PLUS",
    "MINUS","BANG","ASSIGN","OP_LT","OP_GT","BITWISE_AND","BITWISE_OR",
    "STAR","PERCENT","DIV","CARRET","INTERR","DOUBLE_COLON","OP_INC",
    "OP_DEC","OP_SHIFT_LEFT","OP_SHIFT_RIGHT","OP_LE","OP_GE","OP_EQ",
    "OP_NE","OP_AND","OP_OR","OP_MULT_ASSIGN","OP_DIV_ASSIGN",
    "OP_MOD_ASSIGN","OP_ADD_ASSIGN","OP_SUB_ASSIGN",
    "OP_SHIFT_LEFT_ASSIGN","OP_SHIFT_RIGHT_ASSIGN","OP_AND_ASSIGN",
    "OP_XOR_ASSIGN","OP_OR_ASSIGN","OP_PTR","OP_COALESCING",
    "LITERAL_INTEGER","LITERAL_FLOAT","LITERAL_DOUBLE","LITERAL_DECIMAL",
    "LITERAL_CHARACTER","LITERAL_STRING","IDENTIFIER",
    "OPEN_PARENS_LAMBDA","OPEN_PARENS_CAST","GENERIC_DIMENSION",
    "DEFAULT_COLON","EVAL_STATEMENT_PARSER",
    "EVAL_COMPILATION_UNIT_PARSER","EVAL_USING_DECLARATIONS_UNIT_PARSER",
    "GENERATE_COMPLETION","COMPLETE_COMPLETION","UMINUS",
  };

  /** index-checked interface to yyNames[].
      @param token single character or %token value.
      @return token name or [illegal] or [unknown].
    */
  public static string yyname (int token) {
    if ((token < 0) || (token > yyNames.Length)) return "[illegal]";
    string name;
    if ((name = yyNames[token]) != null) return name;
    return "[unknown]";
  }

  int yyExpectingState;
  /** computes list of expected tokens on error by tracing the tables.
      @param state for which to compute the list.
      @return list of token names.
    */
  protected int [] yyExpectingTokens (int state){
    int token, n, len = 0;
    bool[] ok = new bool[yyNames.Length];
    if ((n = yySindex[state]) != 0)
      for (token = n < 0 ? -n : 0;
           (token < yyNames.Length) && (n+token < yyTable.Length); ++ token)
        if (yyCheck[n+token] == token && !ok[token] && yyNames[token] != null) {
          ++ len;
          ok[token] = true;
        }
    if ((n = yyRindex[state]) != 0)
      for (token = n < 0 ? -n : 0;
           (token < yyNames.Length) && (n+token < yyTable.Length); ++ token)
        if (yyCheck[n+token] == token && !ok[token] && yyNames[token] != null) {
          ++ len;
          ok[token] = true;
        }
    int [] result = new int [len];
    for (n = token = 0; n < len;  ++ token)
      if (ok[token]) result[n++] = token;
    return result;
  }
  protected string[] yyExpecting (int state) {
    int [] tokens = yyExpectingTokens (state);
    string [] result = new string[tokens.Length];
    for (int n = 0; n < tokens.Length;  n++)
      result[n++] = yyNames[tokens [n]];
    return result;
  }

  /** the generated parser, with debugging messages.
      Maintains a state and a value stack, currently with fixed maximum size.
      @param yyLex scanner.
      @param yydebug debug message writer implementing yyDebug, or null.
      @return result of the last reduction, if any.
      @throws yyException on irrecoverable parse error.
    */
  internal Object yyparse (yyParser.yyInput yyLex, Object yyd)
				 {
    this.debug = (yydebug.yyDebug)yyd;
    return yyparse(yyLex);
  }

  /** initial size and increment of the state/value stack [default 256].
      This is not final so that it can be overwritten outside of invocations
      of yyparse().
    */
  protected int yyMax;

  /** executed at the beginning of a reduce action.
      Used as $$ = yyDefault($1), prior to the user-specified action, if any.
      Can be overwritten to provide deep copy, etc.
      @param first value for $1, or null.
      @return first.
    */
  protected Object yyDefault (Object first) {
    return first;
  }

  /** the generated parser.
      Maintains a state and a value stack, currently with fixed maximum size.
      @param yyLex scanner.
      @return result of the last reduction, if any.
      @throws yyException on irrecoverable parse error.
    */
  internal Object yyparse (yyParser.yyInput yyLex)
  {
    if (yyMax <= 0) yyMax = 256;			// initial size
    int yyState = 0;                                   // state stack ptr
    int [] yyStates = new int[yyMax];	                // state stack 
    Object yyVal = null;                               // value stack ptr
    Object [] yyVals = new Object[yyMax];	        // value stack
    int yyToken = -1;					// current input
    int yyErrorFlag = 0;				// #tks to shift

    /*yyLoop:*/ for (int yyTop = 0;; ++ yyTop) {
      if (yyTop >= yyStates.Length) {			// dynamically increase
        int[] i = new int[yyStates.Length+yyMax];
        yyStates.CopyTo (i, 0);
        yyStates = i;
        Object[] o = new Object[yyVals.Length+yyMax];
        yyVals.CopyTo (o, 0);
        yyVals = o;
      }
      yyStates[yyTop] = yyState;
      yyVals[yyTop] = yyVal;
      if (debug != null) debug.push(yyState, yyVal);

      /*yyDiscarded:*/ for (;;) {	// discarding a token does not change stack
        int yyN;
        if ((yyN = yyDefRed[yyState]) == 0) {	// else [default] reduce (yyN)
          if (yyToken < 0) {
            yyToken = yyLex.advance() ? yyLex.token() : 0;
            if (debug != null)
              debug.lex(yyState, yyToken, yyname(yyToken), yyLex.value());
          }
          if ((yyN = yySindex[yyState]) != 0 && ((yyN += yyToken) >= 0)
              && (yyN < yyTable.Length) && (yyCheck[yyN] == yyToken)) {
            if (debug != null)
              debug.shift(yyState, yyTable[yyN], yyErrorFlag-1);
            yyState = yyTable[yyN];		// shift to yyN
            yyVal = yyLex.value();
            yyToken = -1;
            if (yyErrorFlag > 0) -- yyErrorFlag;
            goto continue_yyLoop;
          }
          if ((yyN = yyRindex[yyState]) != 0 && (yyN += yyToken) >= 0
              && yyN < yyTable.Length && yyCheck[yyN] == yyToken)
            yyN = yyTable[yyN];			// reduce (yyN)
          else
            switch (yyErrorFlag) {
  
            case 0:
              yyExpectingState = yyState;
              // yyerror(String.Format ("syntax error, got token `{0}'", yyname (yyToken)), yyExpecting(yyState));
              if (debug != null) debug.error("syntax error");
              if (yyToken == 0 /*eof*/ || yyToken == eof_token) throw new yyParser.yyUnexpectedEof ();
              goto case 1;
            case 1: case 2:
              yyErrorFlag = 3;
              do {
                if ((yyN = yySindex[yyStates[yyTop]]) != 0
                    && (yyN += Token.yyErrorCode) >= 0 && yyN < yyTable.Length
                    && yyCheck[yyN] == Token.yyErrorCode) {
                  if (debug != null)
                    debug.shift(yyStates[yyTop], yyTable[yyN], 3);
                  yyState = yyTable[yyN];
                  yyVal = yyLex.value();
                  goto continue_yyLoop;
                }
                if (debug != null) debug.pop(yyStates[yyTop]);
              } while (-- yyTop >= 0);
              if (debug != null) debug.reject();
              throw new yyParser.yyException("irrecoverable syntax error");
  
            case 3:
              if (yyToken == 0) {
                if (debug != null) debug.reject();
                throw new yyParser.yyException("irrecoverable syntax error at end-of-file");
              }
              if (debug != null)
                debug.discard(yyState, yyToken, yyname(yyToken),
  							yyLex.value());
              yyToken = -1;
              goto continue_yyDiscarded;		// leave stack alone
            }
        }
        int yyV = yyTop + 1-yyLen[yyN];
        if (debug != null)
          debug.reduce(yyState, yyStates[yyV-1], yyN, YYRules.getRule (yyN), yyLen[yyN]);
        yyVal = yyDefault(yyV > yyTop ? null : yyVals[yyV]);
        switch (yyN) {
case 5:
#line 389 "cs-parser.jay"
  { Lexer.CompleteOnEOF = false; }
  break;
case 7:
#line 394 "cs-parser.jay"
  {
		Lexer.check_incorrect_doc_comment ();
	  }
  break;
case 8:
#line 398 "cs-parser.jay"
  {
		Lexer.check_incorrect_doc_comment ();
	  }
  break;
case 16:
#line 421 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-2+yyTop];
		string s = lt.Value;
		if (s != "alias"){
			syntax_error (lt.Location, "`alias' expected");
		} else if (RootContext.Version == LanguageVersion.ISO_1) {
			Report.FeatureIsNotAvailable (lt.Location, "external alias");
		} else {
			lt = (LocatedToken) yyVals[-1+yyTop]; 
			current_namespace.AddUsingExternalAlias (lt.Value, lt.Location, Report);
		}
	  }
  break;
case 17:
#line 434 "cs-parser.jay"
  {
	  	syntax_error (GetLocation (yyVals[-1+yyTop]), "`alias' expected");   /* TODO: better*/
	  }
  break;
case 20:
#line 446 "cs-parser.jay"
  {
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 21:
#line 451 "cs-parser.jay"
  {
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 22:
#line 459 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-3+yyTop];
		current_namespace.AddUsingAlias (lt.Value, (MemberName) yyVals[-1+yyTop], (Location) yyVals[-4+yyTop]);
	  }
  break;
case 23:
#line 463 "cs-parser.jay"
  {
		CheckIdentifierToken (yyToken, GetLocation (yyVals[0+yyTop]));
		yyVal = null;
	  }
  break;
case 24:
#line 471 "cs-parser.jay"
  {
		current_namespace.AddUsing ((MemberName) yyVals[-1+yyTop], (Location) yyVals[-2+yyTop]);
	  }
  break;
case 25:
#line 483 "cs-parser.jay"
  {
		MemberName name = (MemberName) yyVals[0+yyTop];

		if (yyVals[-2+yyTop] != null) {
			Report.Error(1671, name.Location, "A namespace declaration cannot have modifiers or attributes");
		}

		current_namespace = new NamespaceEntry (
			current_namespace, file, name.GetName ());
		current_class = current_namespace.SlaveDeclSpace;
		current_container = current_class.PartialContainer;
	  }
  break;
case 26:
#line 496 "cs-parser.jay"
  { 
		current_namespace = current_namespace.Parent;
		current_class = current_namespace.SlaveDeclSpace;
		current_container = current_class.PartialContainer;
	  }
  break;
case 27:
#line 505 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[0+yyTop];
		yyVal = new MemberName (lt.Value, lt.Location);
	  }
  break;
case 28:
#line 510 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[0+yyTop];
		yyVal = new MemberName ((MemberName) yyVals[-2+yyTop], lt.Value, lt.Location);		
	  }
  break;
case 29:
#line 515 "cs-parser.jay"
  {
		syntax_error (lexer.Location, "`.' expected");
	  }
  break;
case 34:
#line 532 "cs-parser.jay"
  {
		MemberName name = (MemberName) yyVals[0+yyTop];

		if (name.TypeArguments != null)
			syntax_error (lexer.Location, "namespace name expected");

		yyVal = name;
	  }
  break;
case 35:
#line 544 "cs-parser.jay"
  {
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 38:
#line 557 "cs-parser.jay"
  {
		Report.Error (1518, lexer.Location, "Expected `class', `delegate', `enum', `interface', or `struct'");
	  }
  break;
case 40:
#line 565 "cs-parser.jay"
  {
		Report.Error (1513, lexer.Location, "Expected `}'");
	  }
  break;
case 49:
#line 592 "cs-parser.jay"
  {
		if (yyVals[0+yyTop] != null) {
			DeclSpace ds = (DeclSpace)yyVals[0+yyTop];

			if ((ds.ModFlags & (Modifiers.PRIVATE|Modifiers.PROTECTED)) != 0){
				Report.Error (1527, ds.Location, 
				"Namespace elements cannot be explicitly declared as private, protected or protected internal");
			}
		}
		current_namespace.DeclarationFound = true;
	  }
  break;
case 50:
#line 603 "cs-parser.jay"
  {
		current_namespace.DeclarationFound = true;
	  }
  break;
case 51:
#line 607 "cs-parser.jay"
  {
		Report.Error (116, ((MemberCore) yyVals[0+yyTop]).Location, "A namespace can only contain types and namespace declarations");
	  }
  break;
case 52:
#line 610 "cs-parser.jay"
  {
		Report.Error (116, ((MemberCore) yyVals[0+yyTop]).Location, "A namespace can only contain types and namespace declarations");
	  }
  break;
case 58:
#line 636 "cs-parser.jay"
  {
		if (yyVals[0+yyTop] != null) {
			Attributes attrs = (Attributes)yyVals[0+yyTop];
			if (global_attrs_enabled) {
				CodeGen.Assembly.AddAttributes (attrs.Attrs, current_namespace);
			} else {
				foreach (Attribute a in attrs.Attrs) {
					Report.Error (1730, a.Location, "Assembly and module attributes must precede all other elements except using clauses and extern alias declarations");
				}
			}
		}
		yyVal = yyVals[0+yyTop];
	  }
  break;
case 59:
#line 653 "cs-parser.jay"
  {
		global_attrs_enabled = false;
		yyVal = null;
      }
  break;
case 60:
#line 658 "cs-parser.jay"
  { 
		global_attrs_enabled = false;
		yyVal = yyVals[0+yyTop];
	  }
  break;
case 61:
#line 667 "cs-parser.jay"
  {
		if (current_attr_target != String.Empty) {
			ArrayList sect = (ArrayList) yyVals[0+yyTop];

			if (global_attrs_enabled) {
				if (current_attr_target == "module") {
					current_container.Module.AddAttributes (sect);
					yyVal = null;
				} else if (current_attr_target != null && current_attr_target.Length > 0) {
					CodeGen.Assembly.AddAttributes (sect, current_namespace);
					yyVal = null;
				} else {
					yyVal = new Attributes (sect);
				}
				if (yyVal == null) {
					if (RootContext.Documentation != null) {
						Lexer.check_incorrect_doc_comment ();
						Lexer.doc_state =
							XmlCommentState.Allowed;
					}
				}
			} else {
				yyVal = new Attributes (sect);
			}		
		}
		else
			yyVal = null;
		current_attr_target = null;
	  }
  break;
case 62:
#line 697 "cs-parser.jay"
  {
		if (current_attr_target != String.Empty) {
			Attributes attrs = yyVals[-1+yyTop] as Attributes;
			ArrayList sect = (ArrayList) yyVals[0+yyTop];

			if (global_attrs_enabled) {
				if (current_attr_target == "module") {
					current_container.Module.AddAttributes (sect);
					yyVal = null;
				} else if (current_attr_target == "assembly") {
					CodeGen.Assembly.AddAttributes (sect, current_namespace);
					yyVal = null;
				} else {
					if (attrs == null)
						attrs = new Attributes (sect);
					else
						attrs.AddAttributes (sect);			
				}
			} else {
				if (attrs == null)
					attrs = new Attributes (sect);
				else
					attrs.AddAttributes (sect);
			}		
			yyVal = attrs;
		}
		else
			yyVal = null;
		current_attr_target = null;
	  }
  break;
case 63:
#line 731 "cs-parser.jay"
  {
		yyVal = yyVals[-2+yyTop];
 	  }
  break;
case 64:
#line 735 "cs-parser.jay"
  {
		yyVal = yyVals[-2+yyTop];
	  }
  break;
case 65:
#line 742 "cs-parser.jay"
  {
		current_attr_target = (string)yyVals[-1+yyTop];
		yyVal = yyVals[-1+yyTop];
	  }
  break;
case 66:
#line 750 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[0+yyTop];
		yyVal = CheckAttributeTarget (lt.Value, lt.Location);
	  }
  break;
case 67:
#line 754 "cs-parser.jay"
  { yyVal = "event"; }
  break;
case 68:
#line 755 "cs-parser.jay"
  { yyVal = "return"; }
  break;
case 69:
#line 757 "cs-parser.jay"
  {
		string name = GetTokenName (yyToken);
		yyVal = CheckAttributeTarget (name, GetLocation (yyVals[0+yyTop]));
	  }
  break;
case 70:
#line 765 "cs-parser.jay"
  {
		ArrayList attrs = new ArrayList (4);
		attrs.Add (yyVals[0+yyTop]);

		yyVal = attrs;
	       
	  }
  break;
case 71:
#line 773 "cs-parser.jay"
  {
		ArrayList attrs = (ArrayList) yyVals[-2+yyTop];
		attrs.Add (yyVals[0+yyTop]);

		yyVal = attrs;
	  }
  break;
case 72:
#line 783 "cs-parser.jay"
  {
		++lexer.parsing_block;
	  }
  break;
case 73:
#line 787 "cs-parser.jay"
  {
		--lexer.parsing_block;
		MemberName mname = (MemberName) yyVals[-2+yyTop];
		if (mname.IsGeneric) {
			Report.Error (404, lexer.Location,
				      "'<' unexpected: attributes cannot be generic");
		}

		Arguments [] arguments = (Arguments []) yyVals[0+yyTop];
		ATypeNameExpression expr = mname.GetTypeExpression ();

		if (current_attr_target == String.Empty)
			yyVal = null;
		else if (global_attrs_enabled && (current_attr_target == "assembly" || current_attr_target == "module"))
			/* FIXME: supply "nameEscaped" parameter here.*/
			yyVal = new GlobalAttribute (current_namespace, current_attr_target,
						  expr, arguments, mname.Location, lexer.IsEscapedIdentifier (mname.Location));
		else
			yyVal = new Attribute (current_attr_target, expr, arguments, mname.Location, lexer.IsEscapedIdentifier (mname.Location));
	  }
  break;
case 74:
#line 810 "cs-parser.jay"
  { /* reserved attribute name or identifier: 17.4 */ }
  break;
case 75:
#line 814 "cs-parser.jay"
  { yyVal = null; }
  break;
case 76:
#line 816 "cs-parser.jay"
  {
		yyVal = yyVals[-1+yyTop];
	  }
  break;
case 77:
#line 823 "cs-parser.jay"
  { yyVal = null; }
  break;
case 78:
#line 825 "cs-parser.jay"
  {
	  	Arguments a = new Arguments (4);
		a.Add ((Argument) yyVals[0+yyTop]);
		yyVal = new Arguments [] { a, null };
	  }
  break;
case 79:
#line 831 "cs-parser.jay"
  {
	  	Arguments a = new Arguments (4);
		a.Add ((Argument) yyVals[0+yyTop]);  
		yyVal = new Arguments [] { null, a };
	  }
  break;
case 80:
#line 837 "cs-parser.jay"
  {
		Arguments[] o = (Arguments[]) yyVals[-2+yyTop];
		if (o [1] != null) {
			Report.Error (1016, ((Argument) yyVals[0+yyTop]).Expr.Location, "Named attribute arguments must appear after the positional arguments");
			o [0] = new Arguments (4);
		}
		
		Arguments args = ((Arguments) o [0]);
		if (args.Count > 0 && !(yyVals[0+yyTop] is NamedArgument) && args [args.Count - 1] is NamedArgument)
			Error_NamedArgumentExpected ((NamedArgument) args [args.Count - 1]);
		
		args.Add ((Argument) yyVals[0+yyTop]);
	  }
  break;
case 81:
#line 851 "cs-parser.jay"
  {
		Arguments[] o = (Arguments[]) yyVals[-2+yyTop];
		if (o [1] == null) {
			o [1] = new Arguments (4);
		}

		((Arguments) o [1]).Add ((Argument) yyVals[0+yyTop]);
	  }
  break;
case 82:
#line 863 "cs-parser.jay"
  {
	  	yyVal = new Argument ((Expression) yyVals[0+yyTop]);
	  }
  break;
case 84:
#line 871 "cs-parser.jay"
  {
		yyVal = new NamedArgument ((LocatedToken) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);	  
	  }
  break;
case 85:
#line 878 "cs-parser.jay"
  {
		if (RootContext.Version <= LanguageVersion.V_3)
			Report.FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "named argument");
			
		yyVal = new NamedArgument ((LocatedToken) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 101:
#line 914 "cs-parser.jay"
  {
		Report.Error (1519, lexer.Location, "Unexpected symbol `{0}' in class, struct, or interface member declaration",
			GetSymbolName (yyToken));
		yyVal = null;
		lexer.parsing_generic_declaration = false;
	  }
  break;
case 102:
#line 927 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = true;
	  }
  break;
case 103:
#line 931 "cs-parser.jay"
  { 
		MemberName name = MakeName ((MemberName) yyVals[0+yyTop]);
		push_current_class (new Struct (current_namespace, current_class, name, (int) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]), yyVals[-3+yyTop]);
	  }
  break;
case 104:
#line 937 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = false;

		current_class.SetParameterInfo ((ArrayList) yyVals[0+yyTop]);

		if (RootContext.Documentation != null)
			current_container.DocComment = Lexer.consume_doc_comment ();
	  }
  break;
case 105:
#line 946 "cs-parser.jay"
  {
		--lexer.parsing_declaration;	  
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 106:
#line 952 "cs-parser.jay"
  {
		yyVal = pop_current_class ();
	  }
  break;
case 107:
#line 955 "cs-parser.jay"
  {
		CheckIdentifierToken (yyToken, GetLocation (yyVals[0+yyTop]));
	  }
  break;
case 108:
#line 962 "cs-parser.jay"
  {
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 124:
#line 1004 "cs-parser.jay"
  {
		int modflags = (int) yyVals[-4+yyTop];
		foreach (VariableDeclaration constant in (ArrayList) yyVals[-1+yyTop]){
			Location l = constant.Location;
			if ((modflags & Modifiers.STATIC) != 0) {
				Report.Error (504, l, "The constant `{0}' cannot be marked static", current_container.GetSignatureForError () + '.' + (string) constant.identifier);
				continue;
			}

			Const c = new Const (
				current_class, (FullNamedExpression) yyVals[-2+yyTop], (string) constant.identifier, 
				(Expression) constant.expression_or_array_initializer, modflags, 
				(Attributes) yyVals[-5+yyTop], l);

			if (RootContext.Documentation != null) {
				c.DocComment = Lexer.consume_doc_comment ();
				Lexer.doc_state = XmlCommentState.Allowed;
			}
			current_container.AddConstant (c);
		}
	  }
  break;
case 125:
#line 1029 "cs-parser.jay"
  {
		ArrayList constants = new ArrayList (4);
		if (yyVals[0+yyTop] != null)
			constants.Add (yyVals[0+yyTop]);
		yyVal = constants;
	  }
  break;
case 126:
#line 1036 "cs-parser.jay"
  {
		if (yyVals[0+yyTop] != null) {
			ArrayList constants = (ArrayList) yyVals[-2+yyTop];
			constants.Add (yyVals[0+yyTop]);
		}
	  }
  break;
case 127:
#line 1046 "cs-parser.jay"
  {
	  	++lexer.parsing_block;
	  }
  break;
case 128:
#line 1050 "cs-parser.jay"
  {
	  	--lexer.parsing_block;
		yyVal = new VariableDeclaration ((LocatedToken) yyVals[-3+yyTop], yyVals[0+yyTop]);
	  }
  break;
case 129:
#line 1055 "cs-parser.jay"
  {
		/* A const field requires a value to be provided*/
		Report.Error (145, ((LocatedToken) yyVals[0+yyTop]).Location, "A const field requires a value to be provided");
		yyVal = null;
	  }
  break;
case 132:
#line 1073 "cs-parser.jay"
  { 
		FullNamedExpression type = (FullNamedExpression) yyVals[-2+yyTop];
		if (type == TypeManager.system_void_expr)
			Report.Error (670, GetLocation (yyVals[-2+yyTop]), "Fields cannot have void type");
		
		int mod = (int) yyVals[-3+yyTop];

		current_array_type = null;

		foreach (VariableMemberDeclaration var in (ArrayList) yyVals[-1+yyTop]){
			Field field = new Field (current_class, type, mod, var.MemberName, (Attributes) yyVals[-4+yyTop]);

			field.Initializer = var.expression_or_array_initializer;

			if (RootContext.Documentation != null) {
				field.DocComment = Lexer.consume_doc_comment ();
				Lexer.doc_state = XmlCommentState.Allowed;
			}
			current_container.AddField (field);
			yyVal = field; /* FIXME: might be better if it points to the top item*/
		}
	  }
  break;
case 133:
#line 1101 "cs-parser.jay"
  { 
			FullNamedExpression type = (FullNamedExpression) yyVals[-2+yyTop];
			
			int mod = (int) yyVals[-4+yyTop];

			current_array_type = null;

			foreach (VariableDeclaration var in (ArrayList) yyVals[-1+yyTop]) {
				FixedField field = new FixedField (current_class, type, mod, var.identifier,
					(Expression)var.expression_or_array_initializer, (Attributes) yyVals[-5+yyTop], var.Location);

				if (RootContext.Documentation != null) {
					field.DocComment = Lexer.consume_doc_comment ();
					Lexer.doc_state = XmlCommentState.Allowed;
				}
				current_container.AddField (field);
				yyVal = field; /* FIXME: might be better if it points to the top item*/
			}
	  }
  break;
case 134:
#line 1125 "cs-parser.jay"
  {
		Report.Error (1641, GetLocation (yyVals[-1+yyTop]), "A fixed size buffer field must have the array size specifier after the field name");
	  }
  break;
case 135:
#line 1132 "cs-parser.jay"
  {
		ArrayList decl = new ArrayList (2);
		decl.Add (yyVals[0+yyTop]);
		yyVal = decl;
  	  }
  break;
case 136:
#line 1138 "cs-parser.jay"
  {
		ArrayList decls = (ArrayList) yyVals[-2+yyTop];
		decls.Add (yyVals[0+yyTop]);
		yyVal = yyVals[-2+yyTop];
	  }
  break;
case 137:
#line 1147 "cs-parser.jay"
  {
		yyVal = new VariableDeclaration ((LocatedToken) yyVals[-3+yyTop], yyVals[-1+yyTop]);
	  }
  break;
case 138:
#line 1151 "cs-parser.jay"
  {
		Report.Error (443, lexer.Location, "Value or constant expected");
		yyVal = new VariableDeclaration ((LocatedToken) yyVals[-2+yyTop], null);
	  }
  break;
case 139:
#line 1160 "cs-parser.jay"
  {
		ArrayList decl = new ArrayList (4);
		if (yyVals[0+yyTop] != null)
			decl.Add (yyVals[0+yyTop]);
		yyVal = decl;
	  }
  break;
case 140:
#line 1167 "cs-parser.jay"
  {
		ArrayList decls = (ArrayList) yyVals[-2+yyTop];
		decls.Add (yyVals[0+yyTop]);
		yyVal = yyVals[-2+yyTop];
	  }
  break;
case 141:
#line 1176 "cs-parser.jay"
  {
		yyVal = new VariableDeclaration ((LocatedToken) yyVals[-2+yyTop], yyVals[0+yyTop]);
	  }
  break;
case 142:
#line 1180 "cs-parser.jay"
  {
		yyVal = new VariableDeclaration ((LocatedToken) yyVals[0+yyTop], null);
	  }
  break;
case 143:
#line 1184 "cs-parser.jay"
  {
		yyVal = null;
	  }
  break;
case 146:
#line 1193 "cs-parser.jay"
  {
		yyVal = new StackAlloc ((Expression) yyVals[-3+yyTop], (Expression) yyVals[-1+yyTop], (Location) yyVals[-4+yyTop]);
	  }
  break;
case 147:
#line 1197 "cs-parser.jay"
  {
		yyVal = new ArglistAccess ((Location) yyVals[0+yyTop]);
	  }
  break;
case 148:
#line 1201 "cs-parser.jay"
  {
		Report.Error (1575, (Location) yyVals[-1+yyTop], "A stackalloc expression requires [] after type");
		yyVal = new StackAlloc ((Expression) yyVals[0+yyTop], null, (Location) yyVals[-1+yyTop]);		
	  }
  break;
case 149:
#line 1209 "cs-parser.jay"
  {
		ArrayList decl = new ArrayList (4);
		if (yyVals[0+yyTop] != null)
			decl.Add (yyVals[0+yyTop]);
		yyVal = decl;
	  }
  break;
case 150:
#line 1216 "cs-parser.jay"
  {
		ArrayList decls = (ArrayList) yyVals[-2+yyTop];
		decls.Add (yyVals[0+yyTop]);
		yyVal = yyVals[-2+yyTop];
	  }
  break;
case 151:
#line 1225 "cs-parser.jay"
  {
	  	++lexer.parsing_block;
	  	lexer.parsing_generic_declaration = false;
	  }
  break;
case 152:
#line 1230 "cs-parser.jay"
  {
	  	--lexer.parsing_block;
		yyVal = new VariableMemberDeclaration ((MemberName) yyVals[-3+yyTop], yyVals[0+yyTop]);
	  }
  break;
case 153:
#line 1235 "cs-parser.jay"
  {
	  	lexer.parsing_generic_declaration = false;
		yyVal = new VariableMemberDeclaration ((MemberName) yyVals[0+yyTop], null);
	  }
  break;
case 154:
#line 1240 "cs-parser.jay"
  {
		lexer.parsing_generic_declaration = false;	  
		yyVal = null;
	  }
  break;
case 155:
#line 1248 "cs-parser.jay"
  {
		Report.Error (650, GetLocation (yyVals[-2+yyTop]), "Syntax error, bad array declarator. To declare a managed array the rank specifier precedes the variable's identifier. " +
			"To declare a fixed size buffer field, use the fixed keyword before the field type");
	  }
  break;
case 158:
#line 1260 "cs-parser.jay"
  {
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.NotAllowed;
	  }
  break;
case 159:
#line 1265 "cs-parser.jay"
  {
		Method method = (Method) yyVals[-2+yyTop];
		method.Block = (ToplevelBlock) yyVals[0+yyTop];
		current_container.AddMethod (method);
		
		if (current_container.Kind == Kind.Interface && method.Block != null) {
			Report.Error (531, method.Location, "`{0}': interface members cannot have a definition", method.GetSignatureForError ());
		}

		current_generic_method = null;
		current_local_parameters = null;

		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 160:
#line 1287 "cs-parser.jay"
  {
		valid_param_mod = ParameterModifierType.All;
	  }
  break;
case 161:
#line 1291 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = true;
	  }
  break;
case 162:
#line 1295 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = false;
		valid_param_mod = 0;
		MemberName name = (MemberName) yyVals[-6+yyTop];
		current_local_parameters = (ParametersCompiled) yyVals[-3+yyTop];

		if (yyVals[0+yyTop] != null && name.TypeArguments == null)
			Report.Error (80, lexer.Location,
				      "Constraints are not allowed on non-generic declarations");

		Method method;

		GenericMethod generic = null;
		if (name.TypeArguments != null) {
			generic = new GenericMethod (current_namespace, current_class, name,
						     (FullNamedExpression) yyVals[-7+yyTop], current_local_parameters);

			generic.SetParameterInfo ((ArrayList) yyVals[0+yyTop]);
		}

		method = new Method (current_class, generic, (FullNamedExpression) yyVals[-7+yyTop], (int) yyVals[-8+yyTop],
				     name, current_local_parameters, (Attributes) yyVals[-9+yyTop]);

		current_generic_method = generic;

		if (RootContext.Documentation != null)
			method.DocComment = Lexer.consume_doc_comment ();

		yyVal = method;
	  }
  break;
case 163:
#line 1330 "cs-parser.jay"
  {
	  	valid_param_mod = ParameterModifierType.All;
	  }
  break;
case 164:
#line 1334 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = true;
	  }
  break;
case 165:
#line 1338 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = false;
		valid_param_mod = 0;

		MemberName name = (MemberName) yyVals[-6+yyTop];
		current_local_parameters = (ParametersCompiled) yyVals[-3+yyTop];

		if (yyVals[-1+yyTop] != null && name.TypeArguments == null)
			Report.Error (80, lexer.Location,
				      "Constraints are not allowed on non-generic declarations");

		Method method;
		GenericMethod generic = null;
		if (name.TypeArguments != null) {
			generic = new GenericMethod (current_namespace, current_class, name,
						     TypeManager.system_void_expr, current_local_parameters);

			generic.SetParameterInfo ((ArrayList) yyVals[0+yyTop]);
		}

		int modifiers = (int) yyVals[-9+yyTop];


		const int invalid_partial_mod = Modifiers.Accessibility | Modifiers.ABSTRACT | Modifiers.EXTERN |
			Modifiers.NEW | Modifiers.OVERRIDE | Modifiers.SEALED | Modifiers.VIRTUAL;

		if ((modifiers & invalid_partial_mod) != 0) {
			Report.Error (750, name.Location, "A partial method cannot define access modifier or " +
       			"any of abstract, extern, new, override, sealed, or virtual modifiers");
			modifiers &= ~invalid_partial_mod;
		}

		if ((current_class.ModFlags & Modifiers.PARTIAL) == 0) {
			Report.Error (751, name.Location, "A partial method must be declared within a " +
       			"partial class or partial struct");
		}
		
		modifiers |= Modifiers.PARTIAL | Modifiers.PRIVATE;
		
		method = new Method (current_class, generic, TypeManager.system_void_expr,
				     modifiers, name, current_local_parameters, (Attributes) yyVals[-10+yyTop]);

		current_generic_method = generic;

		if (RootContext.Documentation != null)
			method.DocComment = Lexer.consume_doc_comment ();

		yyVal = method;
	  }
  break;
case 166:
#line 1391 "cs-parser.jay"
  {
		MemberName name = (MemberName) yyVals[-3+yyTop];
		Report.Error (1585, name.Location, 
			"Member modifier `{0}' must precede the member type and name", Modifiers.Name ((int) yyVals[-4+yyTop]));

		Method method = new Method (current_class, null, TypeManager.system_void_expr,
					    0, name, (ParametersCompiled) yyVals[-1+yyTop], (Attributes) yyVals[-7+yyTop]);

		current_local_parameters = (ParametersCompiled) yyVals[-1+yyTop];

		if (RootContext.Documentation != null)
			method.DocComment = Lexer.consume_doc_comment ();

		yyVal = null;
	  }
  break;
case 168:
#line 1410 "cs-parser.jay"
  { yyVal = null; }
  break;
case 169:
#line 1414 "cs-parser.jay"
  { yyVal = ParametersCompiled.EmptyReadOnlyParameters; }
  break;
case 171:
#line 1420 "cs-parser.jay"
  { 
		ArrayList pars_list = (ArrayList) yyVals[0+yyTop];

		Parameter [] pars = new Parameter [pars_list.Count];
		pars_list.CopyTo (pars);

	  	yyVal = new ParametersCompiled (pars); 
	  }
  break;
case 172:
#line 1429 "cs-parser.jay"
  {
		ArrayList pars_list = (ArrayList) yyVals[-2+yyTop];
		pars_list.Add (yyVals[0+yyTop]);

		Parameter [] pars = new Parameter [pars_list.Count];
		pars_list.CopyTo (pars);

		yyVal = new ParametersCompiled (pars); 
	  }
  break;
case 173:
#line 1439 "cs-parser.jay"
  {
		ArrayList pars_list = (ArrayList) yyVals[-2+yyTop];
		pars_list.Add (new ArglistParameter (GetLocation (yyVals[0+yyTop])));

		Parameter [] pars = new Parameter [pars_list.Count];
		pars_list.CopyTo (pars);

		yyVal = new ParametersCompiled (pars, true);
	  }
  break;
case 174:
#line 1449 "cs-parser.jay"
  {
		if (yyVals[-2+yyTop] != null)
			Report.Error (231, ((Parameter) yyVals[-2+yyTop]).Location, "A params parameter must be the last parameter in a formal parameter list");
		yyVal = null;
	  }
  break;
case 175:
#line 1455 "cs-parser.jay"
  {
		if (yyVals[-2+yyTop] != null)
			Report.Error (231, ((Parameter) yyVals[-2+yyTop]).Location, "A params parameter must be the last parameter in a formal parameter list");
		yyVal = null;
	  }
  break;
case 176:
#line 1461 "cs-parser.jay"
  {
		Report.Error (257, (Location) yyVals[-2+yyTop], "An __arglist parameter must be the last parameter in a formal parameter list");
		yyVal = null;
	  }
  break;
case 177:
#line 1466 "cs-parser.jay"
  {
		Report.Error (257, (Location) yyVals[-2+yyTop], "An __arglist parameter must be the last parameter in a formal parameter list");
		yyVal = null;
	  }
  break;
case 178:
#line 1471 "cs-parser.jay"
  {
		yyVal = new ParametersCompiled (new Parameter[] { (Parameter) yyVals[0+yyTop] } );
	  }
  break;
case 179:
#line 1475 "cs-parser.jay"
  {
		yyVal = new ParametersCompiled (new Parameter [] { new ArglistParameter ((Location) yyVals[0+yyTop]) }, true);
	  }
  break;
case 180:
#line 1482 "cs-parser.jay"
  {
		ArrayList pars = new ArrayList (4);
		Parameter p = (Parameter) yyVals[0+yyTop];
		pars.Add (p);
		
		default_parameter_used = p.HasDefaultValue;
		yyVal = pars;
	  }
  break;
case 181:
#line 1491 "cs-parser.jay"
  {
		ArrayList pars = (ArrayList) yyVals[-2+yyTop];
		Parameter p = (Parameter) yyVals[0+yyTop];
		if (p != null) {
			if (p.HasExtensionMethodModifier)
				Report.Error (1100, p.Location, "The parameter modifier `this' can only be used on the first parameter");
			else if (!p.HasDefaultValue && default_parameter_used)
				Report.Error (1737, p.Location, "Optional parameter cannot precede required parameters");

			default_parameter_used |= p.HasDefaultValue;
			pars.Add (p);
		}
		yyVal = yyVals[-2+yyTop];
	  }
  break;
case 182:
#line 1512 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[0+yyTop];
		yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Parameter.Modifier) yyVals[-2+yyTop], (Attributes) yyVals[-3+yyTop], lt.Location);
	  }
  break;
case 183:
#line 1520 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-2+yyTop];
		Report.Error (1552, lt.Location, "Array type specifier, [], must appear before parameter name");
		yyVal = null;
	  }
  break;
case 184:
#line 1529 "cs-parser.jay"
  {
	  	Location l = GetLocation (yyVals[0+yyTop]);
		CheckIdentifierToken (yyToken, l);
		yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], "NeedSomeGeneratorHere", (Parameter.Modifier) yyVals[-2+yyTop], (Attributes) yyVals[-3+yyTop], l);
	  }
  break;
case 185:
#line 1540 "cs-parser.jay"
  {
		if (RootContext.Version <= LanguageVersion.V_3) {
			Report.FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "optional parameter");
		}
		
		Parameter.Modifier mod = (Parameter.Modifier) yyVals[-4+yyTop];
		if (mod != Parameter.Modifier.NONE) {
			switch (mod) {
			case Parameter.Modifier.REF:
			case Parameter.Modifier.OUT:
				Report.Error (1741, GetLocation (yyVals[-4+yyTop]), "Cannot specify a default value for the `{0}' parameter",
					Parameter.GetModifierSignature (mod));
				break;
				
			case Parameter.Modifier.This:
				Report.Error (1743, GetLocation (yyVals[-4+yyTop]), "Cannot specify a default value for the `{0}' parameter",
					Parameter.GetModifierSignature (mod));
				break;
			default:
				throw new NotImplementedException (mod.ToString ());
			}
				
			mod = Parameter.Modifier.NONE;
		}
		
		if ((valid_param_mod & ParameterModifierType.DefaultValue) == 0)
			Report.Error (1065, GetLocation (yyVals[0+yyTop]), "Optional parameter is not valid in this context");
		
		LocatedToken lt = (LocatedToken) yyVals[-2+yyTop];
		yyVal = new Parameter ((FullNamedExpression) yyVals[-3+yyTop], lt.Value, mod, (Attributes) yyVals[-5+yyTop], lt.Location);
		if (yyVals[0+yyTop] != null)
			((Parameter) yyVal).DefaultValue = (Expression) yyVals[0+yyTop];
	  }
  break;
case 186:
#line 1576 "cs-parser.jay"
  { yyVal = Parameter.Modifier.NONE; }
  break;
case 188:
#line 1582 "cs-parser.jay"
  {
		yyVal = yyVals[0+yyTop];
	  }
  break;
case 189:
#line 1586 "cs-parser.jay"
  {
		Parameter.Modifier p2 = (Parameter.Modifier)yyVals[0+yyTop];
  		Parameter.Modifier mod = (Parameter.Modifier)yyVals[-1+yyTop] | p2;
  		if (((Parameter.Modifier)yyVals[-1+yyTop] & p2) == p2) {
  			Error_DuplicateParameterModifier (lexer.Location, p2);
  		} else {
	  		switch (mod & ~Parameter.Modifier.This) {
  				case Parameter.Modifier.REF:
					Report.Error (1101, lexer.Location, "The parameter modifiers `this' and `ref' cannot be used altogether");
  					break;
   				case Parameter.Modifier.OUT:
					Report.Error (1102, lexer.Location, "The parameter modifiers `this' and `out' cannot be used altogether");
  					break;
  				default:
 					Report.Error (1108, lexer.Location, "A parameter cannot have specified more than one modifier");
 					break;
 			}
  		}
  		yyVal = mod;
	  }
  break;
case 190:
#line 1610 "cs-parser.jay"
  {
	  	if ((valid_param_mod & ParameterModifierType.Ref) == 0)
	  		Error_ParameterModifierNotValid ("ref", (Location)yyVals[0+yyTop]);
	  		
	  	yyVal = Parameter.Modifier.REF;
	  }
  break;
case 191:
#line 1617 "cs-parser.jay"
  {
	  	if ((valid_param_mod & ParameterModifierType.Out) == 0)
	  		Error_ParameterModifierNotValid ("out", (Location)yyVals[0+yyTop]);
	  
	  	yyVal = Parameter.Modifier.OUT;
	  }
  break;
case 192:
#line 1624 "cs-parser.jay"
  {
		if ((valid_param_mod & ParameterModifierType.This) == 0)
	  		Error_ParameterModifierNotValid ("this", (Location)yyVals[0+yyTop]);

	  	if (RootContext.Version <= LanguageVersion.ISO_2)
	  		Report.FeatureIsNotAvailable (GetLocation (yyVals[0+yyTop]), "extension methods");
	  			
		yyVal = Parameter.Modifier.This;
	  }
  break;
case 193:
#line 1637 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[0+yyTop];
		yyVal = new ParamsParameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Attributes) yyVals[-3+yyTop], lt.Location);
	  }
  break;
case 194:
#line 1642 "cs-parser.jay"
  {
		Report.Error (1751, GetLocation (yyVals[-4+yyTop]), "Cannot specify a default value for a parameter array");
		
		LocatedToken lt = (LocatedToken) yyVals[-2+yyTop];
		yyVal = new ParamsParameter ((FullNamedExpression) yyVals[-3+yyTop], lt.Value, (Attributes) yyVals[-5+yyTop], lt.Location);		
	  }
  break;
case 195:
#line 1648 "cs-parser.jay"
  {
		CheckIdentifierToken (yyToken, GetLocation (yyVals[0+yyTop]));
		yyVal = null;
	  }
  break;
case 196:
#line 1656 "cs-parser.jay"
  {
		if ((valid_param_mod & ParameterModifierType.Params) == 0)
			Report.Error (1670, ((Location) yyVals[0+yyTop]), "The `params' modifier is not allowed in current context");
	  }
  break;
case 197:
#line 1661 "cs-parser.jay"
  {
		Parameter.Modifier mod = (Parameter.Modifier)yyVals[0+yyTop];
		if ((mod & Parameter.Modifier.This) != 0) {
			Report.Error (1104, (Location)yyVals[-1+yyTop], "The parameter modifiers `this' and `params' cannot be used altogether");
		} else {
			Report.Error (1611, (Location)yyVals[-1+yyTop], "The params parameter cannot be declared as ref or out");
		}	  
	  }
  break;
case 198:
#line 1670 "cs-parser.jay"
  {
		Error_DuplicateParameterModifier ((Location)yyVals[-1+yyTop], Parameter.Modifier.PARAMS);
	  }
  break;
case 199:
#line 1677 "cs-parser.jay"
  {
	  	if ((valid_param_mod & ParameterModifierType.Arglist) == 0)
	  		Report.Error (1669, (Location) yyVals[0+yyTop], "__arglist is not valid in this context");
	  }
  break;
case 200:
#line 1688 "cs-parser.jay"
  {
		if (RootContext.Documentation != null)
			tmpComment = Lexer.consume_doc_comment ();
	  }
  break;
case 201:
#line 1693 "cs-parser.jay"
  {
		implicit_value_parameter_type = (FullNamedExpression) yyVals[-3+yyTop];
		lexer.PropertyParsing = true;
	  }
  break;
case 202:
#line 1698 "cs-parser.jay"
  {
		lexer.PropertyParsing = false;
		has_get = has_set = false;
	  }
  break;
case 203:
#line 1703 "cs-parser.jay"
  { 
		Property prop;
		Accessors accessors = (Accessors) yyVals[-2+yyTop];
		Accessor get_block = accessors != null ? accessors.get_or_add : null;
		Accessor set_block = accessors != null ? accessors.set_or_remove : null;
		bool order = accessors != null ? accessors.declared_in_reverse : false;

		MemberName name = (MemberName) yyVals[-6+yyTop];
		FullNamedExpression ptype = (FullNamedExpression) yyVals[-7+yyTop];

		prop = new Property (current_class, ptype, (int) yyVals[-8+yyTop],
				     name, (Attributes) yyVals[-9+yyTop], get_block, set_block, order, current_block);

		if (ptype == TypeManager.system_void_expr)
			Report.Error (547, name.Location, "`{0}': property or indexer cannot have void type", prop.GetSignatureForError ());
			
		if (accessors == null)
			Report.Error (548, prop.Location, "`{0}': property or indexer must have at least one accessor", prop.GetSignatureForError ());

		if (current_container.Kind == Kind.Interface) {
			if (prop.Get.Block != null)
				Report.Error (531, prop.Location, "`{0}.get': interface members cannot have a definition", prop.GetSignatureForError ());

			if (prop.Set.Block != null)
				Report.Error (531, prop.Location, "`{0}.set': interface members cannot have a definition", prop.GetSignatureForError ());
		}

		current_container.AddProperty (prop);
		implicit_value_parameter_type = null;

		if (RootContext.Documentation != null)
			prop.DocComment = ConsumeStoredComment ();

	  }
  break;
case 204:
#line 1741 "cs-parser.jay"
  {
		yyVal = new Accessors ((Accessor) yyVals[0+yyTop], null);
	 }
  break;
case 205:
#line 1745 "cs-parser.jay"
  { 
		Accessors accessors = (Accessors) yyVals[0+yyTop];
		accessors.get_or_add = (Accessor) yyVals[-1+yyTop];
		yyVal = accessors;
	 }
  break;
case 206:
#line 1751 "cs-parser.jay"
  {
		yyVal = new Accessors (null, (Accessor) yyVals[0+yyTop]);
	 }
  break;
case 207:
#line 1755 "cs-parser.jay"
  { 
		Accessors accessors = (Accessors) yyVals[0+yyTop];
		accessors.set_or_remove = (Accessor) yyVals[-1+yyTop];
		accessors.declared_in_reverse = true;
		yyVal = accessors;
	 }
  break;
case 208:
#line 1762 "cs-parser.jay"
  {
	  	if (yyToken == Token.CLOSE_BRACE) {
	  		yyVal = null;
		} else {
			if (yyToken == Token.SEMICOLON)
				Report.Error (1597, lexer.Location, "Semicolon after method or accessor block is not valid");
			else
				Report.Error (1014, GetLocation (yyVals[0+yyTop]), "A get or set accessor expected");

			yyVal = new Accessors (null, null);
		}
	  }
  break;
case 209:
#line 1778 "cs-parser.jay"
  {
		/* If this is not the case, then current_local_parameters has already*/
		/* been set in indexer_declaration*/
		if (parsing_indexer == false)
			current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters;
		else 
			current_local_parameters = indexer_parameters;
		lexer.PropertyParsing = false;
	  }
  break;
case 210:
#line 1788 "cs-parser.jay"
  {
		if (has_get) {
			Report.Error (1007, GetLocation (yyVals[-2+yyTop]), "Property accessor already defined");
			break;
		}
		Accessor accessor = new Accessor ((ToplevelBlock) yyVals[0+yyTop], (int) yyVals[-3+yyTop], (Attributes) yyVals[-4+yyTop], current_local_parameters, (Location) yyVals[-2+yyTop]);
		has_get = true;
		current_local_parameters = null;
		lexer.PropertyParsing = true;

		if (RootContext.Documentation != null)
			if (Lexer.doc_state == XmlCommentState.Error)
				Lexer.doc_state = XmlCommentState.NotAllowed;

		yyVal = accessor;
	  }
  break;
case 211:
#line 1808 "cs-parser.jay"
  {
		Parameter implicit_value_parameter = new Parameter (
			implicit_value_parameter_type, "value", 
			Parameter.Modifier.NONE, null, (Location) yyVals[0+yyTop]);

		if (!parsing_indexer) {
			current_local_parameters = new ParametersCompiled (new Parameter [] { implicit_value_parameter });
		} else {
			current_local_parameters = ParametersCompiled.MergeGenerated (
				indexer_parameters, true, implicit_value_parameter, null);
		}
		
		lexer.PropertyParsing = false;
	  }
  break;
case 212:
#line 1823 "cs-parser.jay"
  {
		if (has_set) {
			Report.Error (1007, GetLocation (yyVals[-2+yyTop]), "Property accessor already defined");
			break;
		}
		Accessor accessor = new Accessor ((ToplevelBlock) yyVals[0+yyTop], (int) yyVals[-3+yyTop], (Attributes) yyVals[-4+yyTop], current_local_parameters, (Location) yyVals[-2+yyTop]);
		has_set = true;
		current_local_parameters = null;
		lexer.PropertyParsing = true;

		if (RootContext.Documentation != null
			&& Lexer.doc_state == XmlCommentState.Error)
			Lexer.doc_state = XmlCommentState.NotAllowed;

		yyVal = accessor;
	  }
  break;
case 214:
#line 1844 "cs-parser.jay"
  {
	  	yyVal = null;
	  }
  break;
case 215:
#line 1848 "cs-parser.jay"
  {
	  	Error_SyntaxError (1043, yyToken);
	  	yyVal = null;
	  }
  break;
case 216:
#line 1859 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = true;
	  }
  break;
case 217:
#line 1863 "cs-parser.jay"
  {
		MemberName name = MakeName ((MemberName) yyVals[0+yyTop]);
		push_current_class (new Interface (current_namespace, current_class, name, (int) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]), yyVals[-3+yyTop]);
	  }
  break;
case 218:
#line 1869 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = false;

		current_class.SetParameterInfo ((ArrayList) yyVals[0+yyTop]);

		if (RootContext.Documentation != null) {
			current_container.DocComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.Allowed;
		}
	  }
  break;
case 219:
#line 1880 "cs-parser.jay"
  {
		--lexer.parsing_declaration;	  
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 220:
#line 1886 "cs-parser.jay"
  {
		yyVal = pop_current_class ();
	  }
  break;
case 221:
#line 1889 "cs-parser.jay"
  {
		CheckIdentifierToken (yyToken, GetLocation (yyVals[0+yyTop]));
	  }
  break;
case 227:
#line 1912 "cs-parser.jay"
  {
		Report.Error (525, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain fields or constants");
	  }
  break;
case 228:
#line 1916 "cs-parser.jay"
  {
		Report.Error (525, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain fields or constants");
	  }
  break;
case 233:
#line 1924 "cs-parser.jay"
  {
	  	Report.Error (567, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain operators");
	  }
  break;
case 234:
#line 1928 "cs-parser.jay"
  {
	  	Report.Error (526, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain contructors");
	  }
  break;
case 235:
#line 1932 "cs-parser.jay"
  {
	  	Report.Error (524, GetLocation (yyVals[0+yyTop]), "Interfaces cannot declare classes, structs, interfaces, delegates, or enumerations");
	  }
  break;
case 236:
#line 1939 "cs-parser.jay"
  {
	  }
  break;
case 237:
#line 1942 "cs-parser.jay"
  {
		if (yyVals[-2+yyTop] == null)
			break;

		OperatorDeclaration decl = (OperatorDeclaration) yyVals[-2+yyTop];
		Operator op = new Operator (
			current_class, decl.optype, decl.ret_type, (int) yyVals[-3+yyTop], 
			current_local_parameters,
			(ToplevelBlock) yyVals[0+yyTop], (Attributes) yyVals[-4+yyTop], decl.location);

		if (RootContext.Documentation != null) {
			op.DocComment = tmpComment;
			Lexer.doc_state = XmlCommentState.Allowed;
		}

		/* Note again, checking is done in semantic analysis*/
		current_container.AddOperator (op);

		current_local_parameters = null;
	  }
  break;
case 239:
#line 1966 "cs-parser.jay"
  { yyVal = null; }
  break;
case 241:
#line 1972 "cs-parser.jay"
  {
		Report.Error (590, lexer.Location, "User-defined operators cannot return void");
		yyVal = TypeManager.system_void_expr;		
	  }
  break;
case 242:
#line 1980 "cs-parser.jay"
  {
		valid_param_mod = ParameterModifierType.DefaultValue;
	  }
  break;
case 243:
#line 1984 "cs-parser.jay"
  {
		valid_param_mod = 0;

		Location loc = (Location) yyVals[-5+yyTop];
		Operator.OpType op = (Operator.OpType) yyVals[-4+yyTop];
		current_local_parameters = (ParametersCompiled)yyVals[-1+yyTop];
		
		int p_count = current_local_parameters.Count;
		if (p_count == 1) {
			if (op == Operator.OpType.Addition)
				op = Operator.OpType.UnaryPlus;
			else if (op == Operator.OpType.Subtraction)
				op = Operator.OpType.UnaryNegation;
		}
		
		if (IsUnaryOperator (op)) {
			if (p_count == 2) {
				Report.Error (1020, loc, "Overloadable binary operator expected");
			} else if (p_count != 1) {
				Report.Error (1535, loc, "Overloaded unary operator `{0}' takes one parameter",
					Operator.GetName (op));
			}
		} else {
			if (p_count > 2) {
				Report.Error (1534, loc, "Overloaded binary operator `{0}' takes two parameters",
					Operator.GetName (op));
			} else if (p_count != 2) {
				Report.Error (1019, loc, "Overloadable unary operator expected");
			}
		}
		
		if (RootContext.Documentation != null) {
			tmpComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.NotAllowed;
		}

		yyVal = new OperatorDeclaration (op, (FullNamedExpression) yyVals[-6+yyTop], loc);
	  }
  break;
case 245:
#line 2027 "cs-parser.jay"
  { yyVal = Operator.OpType.LogicalNot; }
  break;
case 246:
#line 2028 "cs-parser.jay"
  { yyVal = Operator.OpType.OnesComplement; }
  break;
case 247:
#line 2029 "cs-parser.jay"
  { yyVal = Operator.OpType.Increment; }
  break;
case 248:
#line 2030 "cs-parser.jay"
  { yyVal = Operator.OpType.Decrement; }
  break;
case 249:
#line 2031 "cs-parser.jay"
  { yyVal = Operator.OpType.True; }
  break;
case 250:
#line 2032 "cs-parser.jay"
  { yyVal = Operator.OpType.False; }
  break;
case 251:
#line 2034 "cs-parser.jay"
  { yyVal = Operator.OpType.Addition; }
  break;
case 252:
#line 2035 "cs-parser.jay"
  { yyVal = Operator.OpType.Subtraction; }
  break;
case 253:
#line 2037 "cs-parser.jay"
  { yyVal = Operator.OpType.Multiply; }
  break;
case 254:
#line 2038 "cs-parser.jay"
  {  yyVal = Operator.OpType.Division; }
  break;
case 255:
#line 2039 "cs-parser.jay"
  { yyVal = Operator.OpType.Modulus; }
  break;
case 256:
#line 2040 "cs-parser.jay"
  { yyVal = Operator.OpType.BitwiseAnd; }
  break;
case 257:
#line 2041 "cs-parser.jay"
  { yyVal = Operator.OpType.BitwiseOr; }
  break;
case 258:
#line 2042 "cs-parser.jay"
  { yyVal = Operator.OpType.ExclusiveOr; }
  break;
case 259:
#line 2043 "cs-parser.jay"
  { yyVal = Operator.OpType.LeftShift; }
  break;
case 260:
#line 2044 "cs-parser.jay"
  { yyVal = Operator.OpType.RightShift; }
  break;
case 261:
#line 2045 "cs-parser.jay"
  { yyVal = Operator.OpType.Equality; }
  break;
case 262:
#line 2046 "cs-parser.jay"
  { yyVal = Operator.OpType.Inequality; }
  break;
case 263:
#line 2047 "cs-parser.jay"
  { yyVal = Operator.OpType.GreaterThan; }
  break;
case 264:
#line 2048 "cs-parser.jay"
  { yyVal = Operator.OpType.LessThan; }
  break;
case 265:
#line 2049 "cs-parser.jay"
  { yyVal = Operator.OpType.GreaterThanOrEqual; }
  break;
case 266:
#line 2050 "cs-parser.jay"
  { yyVal = Operator.OpType.LessThanOrEqual; }
  break;
case 267:
#line 2055 "cs-parser.jay"
  {
		valid_param_mod = ParameterModifierType.DefaultValue;
	  }
  break;
case 268:
#line 2059 "cs-parser.jay"
  {
		valid_param_mod = 0;

		Location loc = (Location) yyVals[-5+yyTop];
		current_local_parameters = (ParametersCompiled)yyVals[-1+yyTop];  
		  
		if (RootContext.Documentation != null) {
			tmpComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.NotAllowed;
		}

		yyVal = new OperatorDeclaration (Operator.OpType.Implicit, (FullNamedExpression) yyVals[-4+yyTop], loc);
	  }
  break;
case 269:
#line 2073 "cs-parser.jay"
  {
		valid_param_mod = ParameterModifierType.DefaultValue;
	  }
  break;
case 270:
#line 2077 "cs-parser.jay"
  {
		valid_param_mod = 0;
		
		Location loc = (Location) yyVals[-5+yyTop];
		current_local_parameters = (ParametersCompiled)yyVals[-1+yyTop];  
		  
		if (RootContext.Documentation != null) {
			tmpComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.NotAllowed;
		}

		yyVal = new OperatorDeclaration (Operator.OpType.Explicit, (FullNamedExpression) yyVals[-4+yyTop], loc);
	  }
  break;
case 271:
#line 2091 "cs-parser.jay"
  {
	  	Error_SyntaxError (yyToken);
		yyVal = new OperatorDeclaration (Operator.OpType.Implicit, null, GetLocation (yyVals[-1+yyTop]));
	  }
  break;
case 272:
#line 2096 "cs-parser.jay"
  {
	  	Error_SyntaxError (yyToken);
	  	yyVal = new OperatorDeclaration (Operator.OpType.Explicit, null, GetLocation (yyVals[-1+yyTop]));
	  }
  break;
case 273:
#line 2105 "cs-parser.jay"
  { 
		Constructor c = (Constructor) yyVals[-1+yyTop];
		c.Block = (ToplevelBlock) yyVals[0+yyTop];
		
		if (RootContext.Documentation != null)
			c.DocComment = ConsumeStoredComment ();

		current_container.AddConstructor (c);

		current_local_parameters = null;
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 274:
#line 2124 "cs-parser.jay"
  {
		if (RootContext.Documentation != null) {
			tmpComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.Allowed;
		}
		
		valid_param_mod = ParameterModifierType.All;
	  }
  break;
case 275:
#line 2133 "cs-parser.jay"
  {
		valid_param_mod = 0;
		current_local_parameters = (ParametersCompiled) yyVals[-1+yyTop];  
		
		/**/
		/* start block here, so possible anonymous methods inside*/
		/* constructor initializer can get correct parent block*/
		/**/
	  	start_block (lexer.Location);
	  }
  break;
case 276:
#line 2144 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-6+yyTop];
		int mods = (int) yyVals[-7+yyTop];
		ConstructorInitializer ci = (ConstructorInitializer) yyVals[0+yyTop];

		Constructor c = new Constructor (current_class, lt.Value, mods,
			(Attributes) yyVals[-8+yyTop], current_local_parameters, ci, lt.Location);
		
		if (lt.Value != current_container.MemberName.Name) {
			Report.Error (1520, c.Location, "Class, struct, or interface method must have a return type");
		} else if ((mods & Modifiers.STATIC) != 0) {
			if ((mods & Modifiers.Accessibility) != 0){
				Report.Error (515, c.Location,
					"`{0}': static constructor cannot have an access modifier",
					c.GetSignatureForError ());
			}
			if (ci != null) {
				Report.Error (514, c.Location,
					"`{0}': static constructor cannot have an explicit `this' or `base' constructor call",
					c.GetSignatureForError ());
			
			}
		}
		
		yyVal = c;
	  }
  break;
case 278:
#line 2174 "cs-parser.jay"
  { current_block = null; yyVal = null; }
  break;
case 281:
#line 2184 "cs-parser.jay"
  {
		++lexer.parsing_block;
	  }
  break;
case 282:
#line 2188 "cs-parser.jay"
  {
	  	--lexer.parsing_block;
		yyVal = new ConstructorBaseInitializer ((Arguments) yyVals[-1+yyTop], (Location) yyVals[-4+yyTop]);
	  }
  break;
case 283:
#line 2193 "cs-parser.jay"
  {
		++lexer.parsing_block;
	  }
  break;
case 284:
#line 2197 "cs-parser.jay"
  {
	  	--lexer.parsing_block;
		yyVal = new ConstructorThisInitializer ((Arguments) yyVals[-1+yyTop], (Location) yyVals[-4+yyTop]);
	  }
  break;
case 285:
#line 2201 "cs-parser.jay"
  {
		Report.Error (1018, GetLocation (yyVals[-1+yyTop]), "Keyword `this' or `base' expected");
		yyVal = null;
	  }
  break;
case 286:
#line 2209 "cs-parser.jay"
  {
		if (RootContext.Documentation != null) {
			tmpComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.NotAllowed;
		}
		
		current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters;
	  }
  break;
case 287:
#line 2218 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-3+yyTop];
		if (lt.Value != current_container.MemberName.Name){
			Report.Error (574, lt.Location, "Name of destructor must match name of class");
		} else if (current_container.Kind != Kind.Class){
			Report.Error (575, lt.Location, "Only class types can contain destructor");
		} else {
			Destructor d = new Destructor (current_class, (int) yyVals[-6+yyTop],
				ParametersCompiled.EmptyReadOnlyParameters, (Attributes) yyVals[-7+yyTop], lt.Location);
			if (RootContext.Documentation != null)
				d.DocComment = ConsumeStoredComment ();
		  
			d.Block = (ToplevelBlock) yyVals[0+yyTop];
			current_container.AddMethod (d);
		}

		current_local_parameters = null;
	  }
  break;
case 288:
#line 2242 "cs-parser.jay"
  {
		current_array_type = null;
		foreach (VariableMemberDeclaration var in (ArrayList) yyVals[-1+yyTop]) {

			EventField e = new EventField (
				current_class, (FullNamedExpression) yyVals[-2+yyTop], (int) yyVals[-4+yyTop], var.MemberName, (Attributes) yyVals[-5+yyTop]);
				
			if (var.expression_or_array_initializer != null) {
				if (current_container.Kind == Kind.Interface) {
					Report.Error (68, e.Location, "`{0}': event in interface cannot have initializer", e.GetSignatureForError ());
				}

				e.Initializer = var.expression_or_array_initializer;
			}
			
			if (var.MemberName.Left != null) {
				Report.Error (71, e.Location,
					"`{0}': An explicit interface implementation of an event must use property syntax",
					e.GetSignatureForError ());
			}

			current_container.AddEvent (e);

			if (RootContext.Documentation != null) {
				e.DocComment = Lexer.consume_doc_comment ();
				Lexer.doc_state = XmlCommentState.Allowed;
			}
		}
	  }
  break;
case 289:
#line 2275 "cs-parser.jay"
  {
		implicit_value_parameter_type = (FullNamedExpression) yyVals[-2+yyTop];  
		current_local_parameters = new ParametersCompiled (
			new Parameter (implicit_value_parameter_type, "value", 
			Parameter.Modifier.NONE, null, GetLocation (yyVals[-3+yyTop])));

		lexer.EventParsing = true;
	  }
  break;
case 290:
#line 2284 "cs-parser.jay"
  {
		lexer.EventParsing = false;  
	  }
  break;
case 291:
#line 2288 "cs-parser.jay"
  {
		MemberName name = (MemberName) yyVals[-5+yyTop];
		
		if (current_container.Kind == Kind.Interface) {
			Report.Error (69, (Location) yyVals[-7+yyTop], "Event in interface cannot have add or remove accessors");
			yyVals[-2+yyTop] = new Accessors (null, null);
		} else if (yyVals[-2+yyTop] == null) {
			Report.Error (65, (Location) yyVals[-7+yyTop], "`{0}.{1}': event property must have both add and remove accessors",
				current_container.GetSignatureForError (), name.GetSignatureForError ());
			yyVals[-2+yyTop] = new Accessors (null, null);
		}
		
		Accessors accessors = (Accessors) yyVals[-2+yyTop];

		if (accessors.get_or_add == null || accessors.set_or_remove == null)
			/* CS0073 is already reported, so no CS0065 here.*/
			yyVal = null;
		else {
			Event e = new EventProperty (
				current_class, (FullNamedExpression) yyVals[-6+yyTop], (int) yyVals[-8+yyTop], name,
				(Attributes) yyVals[-9+yyTop], accessors.get_or_add, accessors.set_or_remove);
			if (RootContext.Documentation != null) {
				e.DocComment = Lexer.consume_doc_comment ();
				Lexer.doc_state = XmlCommentState.Allowed;
			}

			current_container.AddEvent (e);
			implicit_value_parameter_type = null;
		}
		current_local_parameters = null;
	  }
  break;
case 292:
#line 2320 "cs-parser.jay"
  {
		MemberName mn = (MemberName) yyVals[-1+yyTop];
		if (mn.Left != null)
			Report.Error (71, mn.Location, "An explicit interface implementation of an event must use property syntax");

		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;

		Error_SyntaxError (yyToken);
		yyVal = null;
	  }
  break;
case 293:
#line 2335 "cs-parser.jay"
  {
		yyVal = new Accessors ((Accessor) yyVals[-1+yyTop], (Accessor) yyVals[0+yyTop]);
	  }
  break;
case 294:
#line 2339 "cs-parser.jay"
  {
		Accessors accessors = new Accessors ((Accessor) yyVals[0+yyTop], (Accessor) yyVals[-1+yyTop]);
		accessors.declared_in_reverse = true;
		yyVal = accessors;
	  }
  break;
case 295:
#line 2344 "cs-parser.jay"
  { yyVal = null; }
  break;
case 296:
#line 2345 "cs-parser.jay"
  { yyVal = null; }
  break;
case 297:
#line 2347 "cs-parser.jay"
  { 
		Report.Error (1055, GetLocation (yyVals[0+yyTop]), "An add or remove accessor expected");
		yyVal = null;
	  }
  break;
case 298:
#line 2351 "cs-parser.jay"
  { yyVal = null; }
  break;
case 299:
#line 2356 "cs-parser.jay"
  {
		lexer.EventParsing = false;
	  }
  break;
case 300:
#line 2360 "cs-parser.jay"
  {
		Accessor accessor = new Accessor ((ToplevelBlock) yyVals[0+yyTop], 0, (Attributes) yyVals[-3+yyTop], null, (Location) yyVals[-2+yyTop]);
		lexer.EventParsing = true;
		yyVal = accessor;
	  }
  break;
case 301:
#line 2365 "cs-parser.jay"
  {
		Report.Error (73, (Location) yyVals[-1+yyTop], "An add or remove accessor must have a body");
		yyVal = null;
	  }
  break;
case 302:
#line 2369 "cs-parser.jay"
  {
		Report.Error (1609, (Location) yyVals[0+yyTop], "Modifiers cannot be placed on event accessor declarations");
		yyVal = null;
	  }
  break;
case 303:
#line 2377 "cs-parser.jay"
  {
		lexer.EventParsing = false;
	  }
  break;
case 304:
#line 2381 "cs-parser.jay"
  {
		yyVal = new Accessor ((ToplevelBlock) yyVals[0+yyTop], 0, (Attributes) yyVals[-3+yyTop], null, (Location) yyVals[-2+yyTop]);
		lexer.EventParsing = true;
	  }
  break;
case 305:
#line 2385 "cs-parser.jay"
  {
		Report.Error (73, (Location) yyVals[-1+yyTop], "An add or remove accessor must have a body");
		yyVal = null;
	  }
  break;
case 306:
#line 2389 "cs-parser.jay"
  {
		Report.Error (1609, (Location) yyVals[0+yyTop], "Modifiers cannot be placed on event accessor declarations");
		yyVal = null;
	  }
  break;
case 307:
#line 2398 "cs-parser.jay"
  {
	  	valid_param_mod = ParameterModifierType.Params | ParameterModifierType.DefaultValue;
	  }
  break;
case 308:
#line 2403 "cs-parser.jay"
  {
		valid_param_mod = 0;
		implicit_value_parameter_type = (FullNamedExpression) yyVals[-6+yyTop];
		indexer_parameters = (ParametersCompiled) yyVals[-2+yyTop];
		
		if (indexer_parameters.IsEmpty) {
			Report.Error (1551, GetLocation (yyVals[-4+yyTop]), "Indexers must have at least one parameter");
		}

		if (RootContext.Documentation != null) {
			tmpComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.Allowed;
		}

		lexer.PropertyParsing = true;
		parsing_indexer  = true;
		
	  }
  break;
case 309:
#line 2422 "cs-parser.jay"
  {
		  lexer.PropertyParsing = false;
		  has_get = has_set = false;
		  parsing_indexer  = false;
	  }
  break;
case 310:
#line 2428 "cs-parser.jay"
  { 
		Accessors accessors = (Accessors) yyVals[-2+yyTop];
		Accessor get_block = accessors != null ? accessors.get_or_add : null;
		Accessor set_block = accessors != null ? accessors.set_or_remove : null;
		bool order = accessors != null ? accessors.declared_in_reverse : false;

		Indexer indexer = new Indexer (current_class, (FullNamedExpression) yyVals[-10+yyTop],
			(MemberName)yyVals[-9+yyTop], (int) yyVals[-11+yyTop], (ParametersCompiled) yyVals[-6+yyTop], (Attributes) yyVals[-12+yyTop],
			get_block, set_block, order);
				       
		if (yyVals[-10+yyTop] == TypeManager.system_void_expr)
			Report.Error (620, GetLocation (yyVals[-10+yyTop]), "`{0}': indexer return type cannot be `void'", indexer.GetSignatureForError ());
			
		if (accessors == null)
			Report.Error (548, indexer.Location, "`{0}': property or indexer must have at least one accessor", indexer.GetSignatureForError ());

		if (current_container.Kind == Kind.Interface) {
			if (indexer.Get.Block != null)
				Report.Error (531, indexer.Location, "`{0}.get': interface members cannot have a definition", indexer.GetSignatureForError ());

			if (indexer.Set.Block != null)
				Report.Error (531, indexer.Location, "`{0}.set': interface members cannot have a definition", indexer.GetSignatureForError ());
		}

		if (RootContext.Documentation != null)
			indexer.DocComment = ConsumeStoredComment ();

		current_container.AddIndexer (indexer);
		
		current_local_parameters = null;
		implicit_value_parameter_type = null;
		indexer_parameters = null;
	  }
  break;
case 311:
#line 2467 "cs-parser.jay"
  {
		if (RootContext.Documentation != null)
			enumTypeComment = Lexer.consume_doc_comment ();
	  }
  break;
case 312:
#line 2473 "cs-parser.jay"
  {
		MemberName name = (MemberName) yyVals[-4+yyTop];
		if (name.IsGeneric) {
			Report.Error (1675, name.Location, "Enums cannot have type parameters");
		}

		name = MakeName (name);
		Enum e = new Enum (current_namespace, current_class, (TypeExpr) yyVals[-3+yyTop], (int) yyVals[-6+yyTop],
				   name, (Attributes) yyVals[-7+yyTop]);
		
		if (RootContext.Documentation != null)
			e.DocComment = enumTypeComment;


		EnumMember em = null;
		foreach (VariableDeclaration ev in (ArrayList) yyVals[-1+yyTop]) {
			em = new EnumMember (
				e, em, ev.identifier, (Expression) ev.expression_or_array_initializer,
				ev.OptAttributes, ev.Location);

/*			if (RootContext.Documentation != null)*/
				em.DocComment = ev.DocComment;

			e.AddEnumMember (em);
		}
		if (RootContext.EvalMode)
			undo.AddTypeContainer (current_container, e);

		current_container.AddTypeContainer (e);

		yyVal = e;

	  }
  break;
case 313:
#line 2509 "cs-parser.jay"
  { yyVal = TypeManager.system_int32_expr; }
  break;
case 314:
#line 2511 "cs-parser.jay"
  {
		if (yyVals[0+yyTop] != TypeManager.system_int32_expr && yyVals[0+yyTop] != TypeManager.system_uint32_expr &&
			yyVals[0+yyTop] != TypeManager.system_int64_expr && yyVals[0+yyTop] != TypeManager.system_uint64_expr &&
			yyVals[0+yyTop] != TypeManager.system_int16_expr && yyVals[0+yyTop] != TypeManager.system_uint16_expr &&
			yyVals[0+yyTop] != TypeManager.system_byte_expr && yyVals[0+yyTop] != TypeManager.system_sbyte_expr)
			Enum.Error_1008 (GetLocation (yyVals[0+yyTop]), Report);
	 
		yyVal = yyVals[0+yyTop];
	 }
  break;
case 315:
#line 2521 "cs-parser.jay"
  {
	 	Error_TypeExpected (lexer.Location);
	 }
  break;
case 316:
#line 2528 "cs-parser.jay"
  {
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 317:
#line 2533 "cs-parser.jay"
  {
	  	/* here will be evaluated after CLOSE_BLACE is consumed.*/
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 318:
#line 2539 "cs-parser.jay"
  {
		yyVal = yyVals[-2+yyTop];
	  }
  break;
case 319:
#line 2545 "cs-parser.jay"
  { yyVal = new ArrayList (0); }
  break;
case 320:
#line 2546 "cs-parser.jay"
  { yyVal = yyVals[-1+yyTop]; }
  break;
case 321:
#line 2551 "cs-parser.jay"
  {
		ArrayList l = new ArrayList (4);

		l.Add (yyVals[0+yyTop]);
		yyVal = l;
	  }
  break;
case 322:
#line 2558 "cs-parser.jay"
  {
		ArrayList l = (ArrayList) yyVals[-2+yyTop];

		l.Add (yyVals[0+yyTop]);

		yyVal = l;
	  }
  break;
case 323:
#line 2569 "cs-parser.jay"
  {
		VariableDeclaration vd = new VariableDeclaration (
			(LocatedToken) yyVals[0+yyTop], null, (Attributes) yyVals[-1+yyTop]);

		if (RootContext.Documentation != null) {
			vd.DocComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.Allowed;
		}

		yyVal = vd;
	  }
  break;
case 324:
#line 2581 "cs-parser.jay"
  {
	  	++lexer.parsing_block;
		if (RootContext.Documentation != null) {
			tmpComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.NotAllowed;
		}
	  }
  break;
case 325:
#line 2589 "cs-parser.jay"
  { 
		--lexer.parsing_block;	  
		VariableDeclaration vd = new VariableDeclaration (
			(LocatedToken) yyVals[-3+yyTop], yyVals[0+yyTop], (Attributes) yyVals[-4+yyTop]);

		if (RootContext.Documentation != null)
			vd.DocComment = ConsumeStoredComment ();

		yyVal = vd;
	  }
  break;
case 326:
#line 2607 "cs-parser.jay"
  {
		valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out | ParameterModifierType.Params | ParameterModifierType.DefaultValue;
	  }
  break;
case 327:
#line 2611 "cs-parser.jay"
  {
		valid_param_mod = 0;

		MemberName name = MakeName ((MemberName) yyVals[-4+yyTop]);
		ParametersCompiled p = (ParametersCompiled) yyVals[-1+yyTop];

		Delegate del = new Delegate (current_namespace, current_class, (FullNamedExpression) yyVals[-5+yyTop],
					     (int) yyVals[-7+yyTop], name, p, (Attributes) yyVals[-8+yyTop]);

		if (RootContext.Documentation != null) {
			del.DocComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.Allowed;
		}

		current_container.AddDelegate (del);
		current_delegate = del;
		lexer.ConstraintsParsing = true;
	  }
  break;
case 328:
#line 2630 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = false;
	  }
  break;
case 329:
#line 2634 "cs-parser.jay"
  {
		current_delegate.SetParameterInfo ((ArrayList) yyVals[-2+yyTop]);
		yyVal = current_delegate;

		current_delegate = null;
	  }
  break;
case 330:
#line 2644 "cs-parser.jay"
  {
		yyVal = null;
	  }
  break;
case 331:
#line 2648 "cs-parser.jay"
  {
		if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2)	  
	  		Report.FeatureIsNotSupported (lexer.Location, "nullable types");
		else if (RootContext.Version < LanguageVersion.ISO_2)
			Report.FeatureIsNotAvailable (lexer.Location, "nullable types");
	  
	  	yyVal = this;
	  }
  break;
case 333:
#line 2661 "cs-parser.jay"
  {
		LocatedToken lt1 = (LocatedToken) yyVals[-2+yyTop];
		LocatedToken lt2 = (LocatedToken) yyVals[-1+yyTop];
		
		yyVal = new MemberName (lt1.Value, lt2.Value, (TypeArguments) yyVals[0+yyTop], lt1.Location);
	  }
  break;
case 335:
#line 2672 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		yyVal = new MemberName ((MemberName) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location);
	  }
  break;
case 336:
#line 2680 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		yyVal = new MemberName (lt.Value, (TypeArguments)yyVals[0+yyTop], lt.Location);	  
	  }
  break;
case 337:
#line 2690 "cs-parser.jay"
  { yyVal = null; }
  break;
case 338:
#line 2692 "cs-parser.jay"
  {
		if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2)	  
	  		Report.FeatureIsNotSupported (lexer.Location, "generics");
		else if (RootContext.Version < LanguageVersion.ISO_2)
			Report.FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "generics");	  
	  
		yyVal = yyVals[-1+yyTop];
	  }
  break;
case 339:
#line 2701 "cs-parser.jay"
  {
		Error_TypeExpected (lexer.Location);
		yyVal = new TypeArguments ();
	  }
  break;
case 340:
#line 2709 "cs-parser.jay"
  {
		TypeArguments type_args = new TypeArguments ();
		type_args.Add ((FullNamedExpression) yyVals[0+yyTop]);
		yyVal = type_args;
	  }
  break;
case 341:
#line 2715 "cs-parser.jay"
  {
		TypeArguments type_args = (TypeArguments) yyVals[-2+yyTop];
		type_args.Add ((FullNamedExpression) yyVals[0+yyTop]);
		yyVal = type_args;
	  }
  break;
case 342:
#line 2727 "cs-parser.jay"
  {
		lexer.parsing_generic_declaration = true;
	  }
  break;
case 343:
#line 2731 "cs-parser.jay"
  {
		lexer.parsing_generic_declaration = false;
		LocatedToken lt = (LocatedToken) yyVals[-2+yyTop];
		yyVal = new MemberName (lt.Value, (TypeArguments)yyVals[0+yyTop], lt.Location);	  
	  }
  break;
case 344:
#line 2740 "cs-parser.jay"
  {
	  	MemberName mn = (MemberName)yyVals[0+yyTop];
	  	if (mn.TypeArguments != null)
	  		syntax_error (mn.Location, string.Format ("Member `{0}' cannot declare type arguments",
	  			mn.GetSignatureForError ()));
	  }
  break;
case 346:
#line 2751 "cs-parser.jay"
  {
		lexer.parsing_generic_declaration = false;	  
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		yyVal = new MemberName ((MemberName) yyVals[-2+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location);
	  }
  break;
case 347:
#line 2760 "cs-parser.jay"
  {
		lexer.parsing_generic_declaration = false;	  
		yyVal = new MemberName (TypeContainer.DefaultIndexerName, GetLocation (yyVals[0+yyTop]));
	  }
  break;
case 348:
#line 2765 "cs-parser.jay"
  {
		lexer.parsing_generic_declaration = false;
		yyVal = new MemberName ((MemberName) yyVals[-1+yyTop], TypeContainer.DefaultIndexerName, null, GetLocation (yyVals[-1+yyTop]));
	  }
  break;
case 349:
#line 2773 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-2+yyTop];
		yyVal = new MemberName (lt.Value, (TypeArguments) yyVals[-1+yyTop], lt.Location);
	  }
  break;
case 350:
#line 2778 "cs-parser.jay"
  {
		LocatedToken lt1 = (LocatedToken) yyVals[-3+yyTop];
		LocatedToken lt2 = (LocatedToken) yyVals[-2+yyTop];
		
		yyVal = new MemberName (lt1.Value, lt2.Value, (TypeArguments) yyVals[-1+yyTop], lt1.Location);
	  }
  break;
case 351:
#line 2785 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-2+yyTop];
		yyVal = new MemberName ((MemberName) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[-1+yyTop], lt.Location);
	  }
  break;
case 352:
#line 2792 "cs-parser.jay"
  { yyVal = null; }
  break;
case 353:
#line 2794 "cs-parser.jay"
  {
		if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2)	  
	  		Report.FeatureIsNotSupported (lexer.Location, "generics");
		else if (RootContext.Version < LanguageVersion.ISO_2)
			Report.FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "generics");
	  
		yyVal = yyVals[-1+yyTop];
	  }
  break;
case 354:
#line 2806 "cs-parser.jay"
  {
		TypeArguments type_args = new TypeArguments ();
		type_args.Add ((FullNamedExpression)yyVals[0+yyTop]);
		yyVal = type_args;
	  }
  break;
case 355:
#line 2812 "cs-parser.jay"
  {
		TypeArguments type_args = (TypeArguments) yyVals[-2+yyTop];
		type_args.Add ((FullNamedExpression)yyVals[0+yyTop]);
		yyVal = type_args;
	  }
  break;
case 356:
#line 2821 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken)yyVals[0+yyTop];
		yyVal = new TypeParameterName (lt.Value, (Attributes)yyVals[-2+yyTop], (Variance) yyVals[-1+yyTop], lt.Location);
  	  }
  break;
case 357:
#line 2826 "cs-parser.jay"
  {
  	  	if (GetTokenName (yyToken) == "type")
			Report.Error (81, GetLocation (yyVals[0+yyTop]), "Type parameter declaration must be an identifier not a type");
		else
			Error_SyntaxError (yyToken);
			
  	  	yyVal = new TypeParameterName ("", null, lexer.Location);
  	  }
  break;
case 359:
#line 2842 "cs-parser.jay"
  {
		yyVal = TypeManager.system_void_expr;
	  }
  break;
case 360:
#line 2849 "cs-parser.jay"
  {
		lexer.parsing_generic_declaration = true;
	  }
  break;
case 362:
#line 2860 "cs-parser.jay"
  {
	  	Expression.Error_VoidInvalidInTheContext (lexer.Location, Report);
		yyVal = TypeManager.system_void_expr;
	  }
  break;
case 364:
#line 2869 "cs-parser.jay"
  {
	  	Expression.Error_VoidInvalidInTheContext (lexer.Location, Report);
		yyVal = TypeManager.system_void_expr;
	  }
  break;
case 366:
#line 2878 "cs-parser.jay"
  {
	  	Report.Error (1536, lexer.Location, "Invalid parameter type `void'");
		yyVal = TypeManager.system_void_expr;
	  }
  break;
case 368:
#line 2887 "cs-parser.jay"
  {
		string rank_specifiers = (string) yyVals[0+yyTop];
		yyVal = current_array_type = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], rank_specifiers);
	  }
  break;
case 369:
#line 2895 "cs-parser.jay"
  {
		MemberName name = (MemberName) yyVals[-1+yyTop];

		if (yyVals[0+yyTop] != null) {
			yyVal = new ComposedCast (name.GetTypeExpression (), "?", lexer.Location);
		} else {
			if (name.Left == null && name.Name == "var")
				yyVal = current_array_type = new VarExpr (name.Location);
			else
				yyVal = name.GetTypeExpression ();
		}
	  }
  break;
case 370:
#line 2908 "cs-parser.jay"
  {
		if (yyVals[0+yyTop] != null)
			yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], "?", lexer.Location);
	  }
  break;
case 371:
#line 2913 "cs-parser.jay"
  {
		/**/
		/* Note that here only unmanaged types are allowed but we*/
		/* can't perform checks during this phase - we do it during*/
		/* semantic analysis.*/
		/**/
		yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], "*", Lexer.Location);
	  }
  break;
case 372:
#line 2922 "cs-parser.jay"
  {
		yyVal = new ComposedCast (TypeManager.system_void_expr, "*", (Location) yyVals[-1+yyTop]);
	  }
  break;
case 373:
#line 2929 "cs-parser.jay"
  {
		ArrayList types = new ArrayList (2);
		types.Add (yyVals[0+yyTop]);
		yyVal = types;
	  }
  break;
case 374:
#line 2935 "cs-parser.jay"
  {
		ArrayList types = (ArrayList) yyVals[-2+yyTop];
		types.Add (yyVals[0+yyTop]);
		yyVal = types;
	  }
  break;
case 375:
#line 2944 "cs-parser.jay"
  {
		if (yyVals[0+yyTop] is ComposedCast)
			Report.Error (1521, GetLocation (yyVals[0+yyTop]), "Invalid base type `{0}'", ((ComposedCast)yyVals[0+yyTop]).GetSignatureForError ());
		yyVal = yyVals[0+yyTop];
	  }
  break;
case 376:
#line 2950 "cs-parser.jay"
  {
	  	Error_TypeExpected (lexer.Location);
	  }
  break;
case 377:
#line 2960 "cs-parser.jay"
  { yyVal = TypeManager.system_object_expr; }
  break;
case 378:
#line 2961 "cs-parser.jay"
  { yyVal = TypeManager.system_string_expr; }
  break;
case 379:
#line 2962 "cs-parser.jay"
  { yyVal = TypeManager.system_boolean_expr; }
  break;
case 380:
#line 2963 "cs-parser.jay"
  { yyVal = TypeManager.system_decimal_expr; }
  break;
case 381:
#line 2964 "cs-parser.jay"
  { yyVal = TypeManager.system_single_expr; }
  break;
case 382:
#line 2965 "cs-parser.jay"
  { yyVal = TypeManager.system_double_expr; }
  break;
case 384:
#line 2970 "cs-parser.jay"
  { yyVal = TypeManager.system_sbyte_expr; }
  break;
case 385:
#line 2971 "cs-parser.jay"
  { yyVal = TypeManager.system_byte_expr; }
  break;
case 386:
#line 2972 "cs-parser.jay"
  { yyVal = TypeManager.system_int16_expr; }
  break;
case 387:
#line 2973 "cs-parser.jay"
  { yyVal = TypeManager.system_uint16_expr; }
  break;
case 388:
#line 2974 "cs-parser.jay"
  { yyVal = TypeManager.system_int32_expr; }
  break;
case 389:
#line 2975 "cs-parser.jay"
  { yyVal = TypeManager.system_uint32_expr; }
  break;
case 390:
#line 2976 "cs-parser.jay"
  { yyVal = TypeManager.system_int64_expr; }
  break;
case 391:
#line 2977 "cs-parser.jay"
  { yyVal = TypeManager.system_uint64_expr; }
  break;
case 392:
#line 2978 "cs-parser.jay"
  { yyVal = TypeManager.system_char_expr; }
  break;
case 394:
#line 2984 "cs-parser.jay"
  {
		yyVal = TypeManager.system_void_expr;	
	  }
  break;
case 398:
#line 3002 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		yyVal = new SimpleName (MemberName.MakeName (lt.Value, (TypeArguments)yyVals[0+yyTop]), (TypeArguments)yyVals[0+yyTop], lt.Location);	  
	  }
  break;
case 399:
#line 3006 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
	       yyVal = new CompletionSimpleName (MemberName.MakeName (lt.Value, null), lt.Location);
	  }
  break;
case 420:
#line 3033 "cs-parser.jay"
  { yyVal = new CharLiteral ((char) lexer.Value, lexer.Location); }
  break;
case 421:
#line 3034 "cs-parser.jay"
  { yyVal = new StringLiteral ((string) lexer.Value, lexer.Location); }
  break;
case 422:
#line 3035 "cs-parser.jay"
  { yyVal = new NullLiteral (lexer.Location); }
  break;
case 423:
#line 3039 "cs-parser.jay"
  { yyVal = new FloatLiteral ((float) lexer.Value, lexer.Location); }
  break;
case 424:
#line 3040 "cs-parser.jay"
  { yyVal = new DoubleLiteral ((double) lexer.Value, lexer.Location); }
  break;
case 425:
#line 3041 "cs-parser.jay"
  { yyVal = new DecimalLiteral ((decimal) lexer.Value, lexer.Location); }
  break;
case 426:
#line 3045 "cs-parser.jay"
  { 
		object v = lexer.Value;

		if (v is int){
			yyVal = new IntLiteral ((int) v, lexer.Location);
		} else if (v is uint)
			yyVal = new UIntLiteral ((UInt32) v, lexer.Location);
		else if (v is long)
			yyVal = new LongLiteral ((Int64) v, lexer.Location);
		else if (v is ulong)
			yyVal = new ULongLiteral ((UInt64) v, lexer.Location);
		else
			Console.WriteLine ("OOPS.  Unexpected result from scanner");
	  }
  break;
case 427:
#line 3062 "cs-parser.jay"
  { yyVal = new BoolLiteral (true, lexer.Location); }
  break;
case 428:
#line 3063 "cs-parser.jay"
  { yyVal = new BoolLiteral (false, lexer.Location); }
  break;
case 432:
#line 3080 "cs-parser.jay"
  {
		yyVal = new ParenthesizedExpression ((Expression) yyVals[-1+yyTop]);
	  }
  break;
case 433:
#line 3084 "cs-parser.jay"
  {
		yyVal = new ParenthesizedExpression ((Expression) yyVals[-1+yyTop]);
	  }
  break;
case 434:
#line 3091 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location);
	  }
  break;
case 435:
#line 3096 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		/* TODO: Location is wrong as some predefined types doesn't hold a location*/
		yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location);
	  }
  break;
case 436:
#line 3102 "cs-parser.jay"
  {
		LocatedToken lt1 = (LocatedToken) yyVals[-2+yyTop];
		LocatedToken lt2 = (LocatedToken) yyVals[-1+yyTop];

		yyVal = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) yyVals[0+yyTop], lt1.Location);
	  }
  break;
case 437:
#line 3108 "cs-parser.jay"
  {
		yyVal = new CompletionMemberAccess ((Expression) yyVals[-2+yyTop], null,GetLocation (yyVals[0+yyTop]));
	  }
  break;
case 438:
#line 3111 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		yyVal = new CompletionMemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, lt.Location);
	  }
  break;
case 439:
#line 3116 "cs-parser.jay"
  {
		/* TODO: Location is wrong as some predefined types doesn't hold a location*/
		yyVal = new CompletionMemberAccess ((Expression) yyVals[-2+yyTop], null, lexer.Location);
	  }
  break;
case 440:
#line 3120 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		yyVal = new CompletionMemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, lt.Location);
 	  }
  break;
case 441:
#line 3128 "cs-parser.jay"
  {
		yyVal = new Invocation ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop]);
	  }
  break;
case 442:
#line 3134 "cs-parser.jay"
  { yyVal = null; }
  break;
case 444:
#line 3140 "cs-parser.jay"
  {
	  	if (yyVals[-1+yyTop] == null)
	  		yyVal = CollectionOrObjectInitializers.Empty;
	  	else
	  		yyVal = new CollectionOrObjectInitializers ((ArrayList) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop]));
	  }
  break;
case 445:
#line 3147 "cs-parser.jay"
  {
	  	yyVal = new CollectionOrObjectInitializers ((ArrayList) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop]));
	  }
  break;
case 446:
#line 3153 "cs-parser.jay"
  { yyVal = null; }
  break;
case 447:
#line 3155 "cs-parser.jay"
  {
		yyVal = yyVals[0+yyTop];
	}
  break;
case 448:
#line 3162 "cs-parser.jay"
  {
	  	ArrayList a = new ArrayList ();
	  	a.Add (yyVals[0+yyTop]);
	  	yyVal = a;
	  }
  break;
case 449:
#line 3168 "cs-parser.jay"
  {
	  	ArrayList a = (ArrayList)yyVals[-2+yyTop];
	  	a.Add (yyVals[0+yyTop]);
	  	yyVal = a;
	  }
  break;
case 450:
#line 3177 "cs-parser.jay"
  {
	  	LocatedToken lt = yyVals[-2+yyTop] as LocatedToken;
	  	yyVal = new ElementInitializer (lt.Value, (Expression)yyVals[0+yyTop], lt.Location);
	  }
  break;
case 451:
#line 3182 "cs-parser.jay"
  {
		yyVal = new CompletionElementInitializer (null, GetLocation (yyVals[0+yyTop]));
	  }
  break;
case 452:
#line 3185 "cs-parser.jay"
  {
		CompletionSimpleName csn = yyVals[-1+yyTop] as CompletionSimpleName;
		if (csn == null)
			yyVal = new CollectionElementInitializer ((Expression)yyVals[-1+yyTop]);
		else
			yyVal = new CompletionElementInitializer (csn.Prefix, csn.Location);
	  }
  break;
case 453:
#line 3193 "cs-parser.jay"
  {
	  	yyVal = new CollectionElementInitializer ((ArrayList)yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop]));
	  }
  break;
case 454:
#line 3197 "cs-parser.jay"
  {
	  	Report.Error (1920, GetLocation (yyVals[-1+yyTop]), "An element initializer cannot be empty");
	  }
  break;
case 457:
#line 3208 "cs-parser.jay"
  { yyVal = null; }
  break;
case 459:
#line 3214 "cs-parser.jay"
  { 
		Arguments list = new Arguments (4);
		list.Add ((Argument) yyVals[0+yyTop]);
		yyVal = list;
	  }
  break;
case 460:
#line 3220 "cs-parser.jay"
  {
		Arguments list = (Arguments) yyVals[-2+yyTop];
		if (list [list.Count - 1] is NamedArgument)
			Error_NamedArgumentExpected ((NamedArgument) list [list.Count - 1]);
		
		list.Add ((Argument) yyVals[0+yyTop]);
		yyVal = list;
	  }
  break;
case 461:
#line 3229 "cs-parser.jay"
  {
		Arguments list = (Arguments) yyVals[-2+yyTop];
		NamedArgument a = (NamedArgument) yyVals[0+yyTop];
		for (int i = 0; i < list.Count; ++i) {
			NamedArgument na = list [i] as NamedArgument;
			if (na != null && na.Name.Value == a.Name.Value)
				Report.Error (1740, na.Name.Location, "Named argument `{0}' specified multiple times",
					na.Name.Value);
		}
		
		list.Add (a);
		yyVal = list;
	  }
  break;
case 462:
#line 3243 "cs-parser.jay"
  {
	  	Report.Error (839, GetLocation (yyVals[0+yyTop]), "An argument is missing");
	  	yyVal = null;
	  }
  break;
case 463:
#line 3248 "cs-parser.jay"
  {
	  	Report.Error (839, GetLocation (yyVals[-1+yyTop]), "An argument is missing");
	  	yyVal = null;
	  }
  break;
case 464:
#line 3256 "cs-parser.jay"
  {
		yyVal = new Argument ((Expression) yyVals[0+yyTop]);
	  }
  break;
case 468:
#line 3269 "cs-parser.jay"
  { 
		yyVal = new Argument ((Expression) yyVals[0+yyTop], Argument.AType.Ref);
	  }
  break;
case 469:
#line 3273 "cs-parser.jay"
  { 
		yyVal = new Argument ((Expression) yyVals[0+yyTop], Argument.AType.Out);
	  }
  break;
case 470:
#line 3277 "cs-parser.jay"
  {
		yyVal = new Argument (new Arglist ((Arguments) yyVals[-1+yyTop], (Location) yyVals[-3+yyTop]));
	  }
  break;
case 471:
#line 3281 "cs-parser.jay"
  {
		yyVal = new Argument (new Arglist ((Location) yyVals[-2+yyTop]));
	  }
  break;
case 472:
#line 3285 "cs-parser.jay"
  {
		yyVal = new Argument (new ArglistAccess ((Location) yyVals[0+yyTop]));
	  }
  break;
case 474:
#line 3296 "cs-parser.jay"
  {
		yyVal = new ElementAccess ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop]);
	  }
  break;
case 475:
#line 3300 "cs-parser.jay"
  {
	  	/* LAMESPEC: Not allowed according to specification*/
		yyVal = new ElementAccess ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop]);
	  }
  break;
case 476:
#line 3305 "cs-parser.jay"
  {
		/* So the super-trick is that primary_expression*/
		/* can only be either a SimpleName or a MemberAccess. */
		/* The MemberAccess case arises when you have a fully qualified type-name like :*/
		/* Foo.Bar.Blah i;*/
		/* SimpleName is when you have*/
		/* Blah i;*/
		  
		Expression expr = (Expression) yyVals[-1+yyTop];  
		if (expr is ComposedCast){
			yyVal = new ComposedCast ((ComposedCast)expr, (string) yyVals[0+yyTop]);
		} else if (expr is ATypeNameExpression){
			/**/
			/* So we extract the string corresponding to the SimpleName*/
			/* or MemberAccess*/
			/* */
			yyVal = new ComposedCast ((ATypeNameExpression)expr, (string) yyVals[0+yyTop]);
		} else {
			Error_ExpectingTypeName (expr);
			yyVal = TypeManager.system_object_expr;
		}
		
		current_array_type = (FullNamedExpression)yyVal;
	  }
  break;
case 477:
#line 3333 "cs-parser.jay"
  {
		ArrayList list = new ArrayList (4);
		list.Add (yyVals[0+yyTop]);
		yyVal = list;
	  }
  break;
case 478:
#line 3339 "cs-parser.jay"
  {
		ArrayList list = (ArrayList) yyVals[-2+yyTop];
		list.Add (yyVals[0+yyTop]);
		yyVal = list;
	  }
  break;
case 479:
#line 3348 "cs-parser.jay"
  {
		Arguments args = new Arguments (4);
		args.Add ((Argument) yyVals[0+yyTop]);
		yyVal = args;
	  }
  break;
case 480:
#line 3354 "cs-parser.jay"
  {
		Arguments args = (Arguments) yyVals[-2+yyTop];
		args.Add ((Argument) yyVals[0+yyTop]);
		yyVal = args;	  
	  }
  break;
case 481:
#line 3363 "cs-parser.jay"
  {
	  	yyVal = new Argument ((Expression) yyVals[0+yyTop]);
	  }
  break;
case 483:
#line 3371 "cs-parser.jay"
  {
		yyVal = new This (current_block, (Location) yyVals[0+yyTop]);
	  }
  break;
case 484:
#line 3378 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		yyVal = new BaseAccess (lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location);
	  }
  break;
case 485:
#line 3383 "cs-parser.jay"
  {
		yyVal = new BaseIndexerAccess ((Arguments) yyVals[-1+yyTop], (Location) yyVals[-3+yyTop]);
	  }
  break;
case 486:
#line 3387 "cs-parser.jay"
  {
	  	Error_SyntaxError (yyToken);
		yyVal = new BaseAccess (null, GetLocation (yyVals[0+yyTop]));
	  }
  break;
case 487:
#line 3395 "cs-parser.jay"
  {
		yyVal = new UnaryMutator (UnaryMutator.Mode.PostIncrement, (Expression) yyVals[-1+yyTop]);
	  }
  break;
case 488:
#line 3402 "cs-parser.jay"
  {
		yyVal = new UnaryMutator (UnaryMutator.Mode.PostDecrement, (Expression) yyVals[-1+yyTop]);
	  }
  break;
case 489:
#line 3409 "cs-parser.jay"
  {
		if (yyVals[0+yyTop] != null) {
			if (RootContext.Version <= LanguageVersion.ISO_2)
				Report.FeatureIsNotAvailable (GetLocation (yyVals[-4+yyTop]), "object initializers");
				
			yyVal = new NewInitialize ((Expression) yyVals[-4+yyTop], (Arguments) yyVals[-2+yyTop], (CollectionOrObjectInitializers) yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop]));
		}
		else
			yyVal = new New ((Expression) yyVals[-4+yyTop], (Arguments) yyVals[-2+yyTop], GetLocation (yyVals[-4+yyTop]));
	  }
  break;
case 490:
#line 3420 "cs-parser.jay"
  {
		if (RootContext.Version <= LanguageVersion.ISO_2)
			Report.FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "collection initializers");
	  
		yyVal = new NewInitialize ((Expression) yyVals[-1+yyTop], null, (CollectionOrObjectInitializers) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop]));
	  }
  break;
case 491:
#line 3432 "cs-parser.jay"
  {
		yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-5+yyTop], (ArrayList) yyVals[-3+yyTop], (string) yyVals[-1+yyTop], (ArrayList) yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop]));
	  }
  break;
case 492:
#line 3436 "cs-parser.jay"
  {
	  	if (yyVals[0+yyTop] == null)
	  		Report.Error (1586, GetLocation (yyVals[-2+yyTop]), "Array creation must have array size or array initializer");

		yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-2+yyTop], (string) yyVals[-1+yyTop], (ArrayList) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop]));
	  }
  break;
case 493:
#line 3443 "cs-parser.jay"
  {
		if (RootContext.Version <= LanguageVersion.ISO_2)
			Report.FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "implicitly typed arrays");
	  
		yyVal = new ImplicitlyTypedArrayCreation ((string) yyVals[-1+yyTop], (ArrayList) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop]));
	  }
  break;
case 494:
#line 3450 "cs-parser.jay"
  {
		Report.Error (1526, GetLocation (yyVals[-1+yyTop]), "A new expression requires () or [] after type");
		yyVal = null;
	  }
  break;
case 495:
#line 3458 "cs-parser.jay"
  {
		++lexer.parsing_type;
	  }
  break;
case 496:
#line 3462 "cs-parser.jay"
  {
		--lexer.parsing_type;
		yyVal = yyVals[0+yyTop];
	  }
  break;
case 497:
#line 3470 "cs-parser.jay"
  {
		if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2)	  
	  		Report.FeatureIsNotSupported (lexer.Location, "anonymous types");
	  	else if (RootContext.Version <= LanguageVersion.ISO_2)
	  		Report.FeatureIsNotAvailable (GetLocation (yyVals[-3+yyTop]), "anonymous types");

		yyVal = new NewAnonymousType ((ArrayList) yyVals[-1+yyTop], current_container, GetLocation (yyVals[-3+yyTop]));
	  }
  break;
case 500:
#line 3486 "cs-parser.jay"
  { yyVal = null; }
  break;
case 502:
#line 3492 "cs-parser.jay"
  {
	  	ArrayList a = new ArrayList (4);
	  	a.Add (yyVals[0+yyTop]);
	  	yyVal = a;
	  }
  break;
case 503:
#line 3498 "cs-parser.jay"
  {
	  	ArrayList a = (ArrayList) yyVals[-2+yyTop];
	  	a.Add (yyVals[0+yyTop]);
	  	yyVal = a;
	  }
  break;
case 504:
#line 3507 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken)yyVals[-2+yyTop];
	  	yyVal = new AnonymousTypeParameter ((Expression)yyVals[0+yyTop], lt.Value, lt.Location);
	  }
  break;
case 505:
#line 3512 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken)yyVals[0+yyTop];
	  	yyVal = new AnonymousTypeParameter (new SimpleName (lt.Value, lt.Location),
	  		lt.Value, lt.Location);
	  }
  break;
case 506:
#line 3518 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		BaseAccess ba = new BaseAccess (lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location);
	  	yyVal = new AnonymousTypeParameter (ba, lt.Value, lt.Location);		
	  }
  break;
case 507:
#line 3524 "cs-parser.jay"
  {
	  	MemberAccess ma = (MemberAccess) yyVals[0+yyTop];
	  	yyVal = new AnonymousTypeParameter (ma, ma.Name, ma.Location);
	  }
  break;
case 508:
#line 3529 "cs-parser.jay"
  {
		Report.Error (746, lexer.Location, "Invalid anonymous type member declarator. " +
		"Anonymous type members must be a member assignment, simple name or member access expression");
	  }
  break;
case 509:
#line 3537 "cs-parser.jay"
  {
		yyVal = "";
	  }
  break;
case 510:
#line 3541 "cs-parser.jay"
  {
		yyVal = yyVals[0+yyTop];
	  }
  break;
case 511:
#line 3548 "cs-parser.jay"
  {
		if (yyVals[0+yyTop] != null)
			yyVal = "?";
		else
			yyVal = string.Empty;
	  }
  break;
case 512:
#line 3555 "cs-parser.jay"
  {
		if (yyVals[-1+yyTop] != null)
			yyVal = "?" + (string) yyVals[0+yyTop];
		else
			yyVal = yyVals[0+yyTop];
	  }
  break;
case 514:
#line 3566 "cs-parser.jay"
  {
		yyVal = (string) yyVals[0+yyTop] + (string) yyVals[-1+yyTop];
	  }
  break;
case 515:
#line 3573 "cs-parser.jay"
  {
		yyVal = "[]";
	  }
  break;
case 516:
#line 3577 "cs-parser.jay"
  {
		yyVal = "[" + (string) yyVals[-1+yyTop] + "]";
	  }
  break;
case 517:
#line 3581 "cs-parser.jay"
  {
		Report.Error (178, GetLocation (yyVals[-2+yyTop]), "Invalid rank specifier: expected `,' or `]'");
		yyVal = "[]";
	  }
  break;
case 518:
#line 3589 "cs-parser.jay"
  {
		yyVal = ",";
	  }
  break;
case 519:
#line 3593 "cs-parser.jay"
  {
		yyVal = (string) yyVals[-1+yyTop] + ",";
	  }
  break;
case 520:
#line 3600 "cs-parser.jay"
  {
		yyVal = null;
	  }
  break;
case 521:
#line 3604 "cs-parser.jay"
  {
		yyVal = yyVals[0+yyTop];
	  }
  break;
case 522:
#line 3611 "cs-parser.jay"
  {
		ArrayList list = new ArrayList (4);
		yyVal = list;
	  }
  break;
case 523:
#line 3616 "cs-parser.jay"
  {
		yyVal = (ArrayList) yyVals[-2+yyTop];
	  }
  break;
case 524:
#line 3623 "cs-parser.jay"
  {
		ArrayList list = new ArrayList (4);
		list.Add (yyVals[0+yyTop]);
		yyVal = list;
	  }
  break;
case 525:
#line 3629 "cs-parser.jay"
  {
		ArrayList list = (ArrayList) yyVals[-2+yyTop];
		list.Add (yyVals[0+yyTop]);
		yyVal = list;
	  }
  break;
case 526:
#line 3635 "cs-parser.jay"
  {
	  	Error_SyntaxError (yyToken);
	  	yyVal = new ArrayList ();
	  }
  break;
case 527:
#line 3643 "cs-parser.jay"
  {
	  	pushed_current_array_type = current_array_type;
	  	lexer.TypeOfParsing = true;
	  }
  break;
case 528:
#line 3648 "cs-parser.jay"
  {
	  	lexer.TypeOfParsing = false;
		Expression type = (Expression)yyVals[-1+yyTop];
		if (type == TypeManager.system_void_expr)
			yyVal = new TypeOfVoid ((Location) yyVals[-4+yyTop]);
		else
			yyVal = new TypeOf (type, (Location) yyVals[-4+yyTop]);
		current_array_type = pushed_current_array_type;
	  }
  break;
case 531:
#line 3663 "cs-parser.jay"
  {
	 	Error_TypeExpected (lexer.Location);
	 	yyVal = null;
	 }
  break;
case 532:
#line 3671 "cs-parser.jay"
  {  
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];

		yyVal = new SimpleName (MemberName.MakeName (lt.Value, (int)yyVals[0+yyTop]), lt.Location);
	  }
  break;
case 533:
#line 3677 "cs-parser.jay"
  {
		LocatedToken lt1 = (LocatedToken) yyVals[-2+yyTop];
		LocatedToken lt2 = (LocatedToken) yyVals[-1+yyTop];

		yyVal = new QualifiedAliasMember (lt1.Value, MemberName.MakeName (lt2.Value, (int) yyVals[0+yyTop]), lt1.Location);
	  }
  break;
case 534:
#line 3684 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[0+yyTop];
		
		yyVal = new MemberAccess ((Expression) yyVals[-2+yyTop], lt.Value, lt.Location);		
	  }
  break;
case 535:
#line 3690 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		
		yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], MemberName.MakeName (lt.Value, (int) yyVals[0+yyTop]), lt.Location);		
	  }
  break;
case 536:
#line 3696 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		MemberName name = (MemberName) yyVals[-3+yyTop];

		yyVal = new MemberAccess (name.GetTypeExpression (), MemberName.MakeName (lt.Value, (int) yyVals[0+yyTop]), lt.Location);		
	  }
  break;
case 537:
#line 3706 "cs-parser.jay"
  {
		if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2)	  
	  		Report.FeatureIsNotSupported (lexer.Location, "generics");
		else if (RootContext.Version < LanguageVersion.ISO_2)
			Report.FeatureIsNotAvailable (lexer.Location, "generics");

		yyVal = yyVals[0+yyTop];
	  }
  break;
case 538:
#line 3718 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		if (RootContext.Version == LanguageVersion.ISO_1)
			Report.FeatureIsNotAvailable (lt.Location, "namespace alias qualifier");

		yyVal = lt;		
	  }
  break;
case 539:
#line 3728 "cs-parser.jay"
  { 
		yyVal = new SizeOf ((Expression) yyVals[-1+yyTop], (Location) yyVals[-3+yyTop]);
	  }
  break;
case 540:
#line 3735 "cs-parser.jay"
  {
		yyVal = new CheckedExpr ((Expression) yyVals[-1+yyTop], (Location) yyVals[-3+yyTop]);
	  }
  break;
case 541:
#line 3742 "cs-parser.jay"
  {
		yyVal = new UnCheckedExpr ((Expression) yyVals[-1+yyTop], (Location) yyVals[-3+yyTop]);
	  }
  break;
case 542:
#line 3749 "cs-parser.jay"
  {
		Expression deref;
		LocatedToken lt = (LocatedToken) yyVals[0+yyTop];

		deref = new Indirection ((Expression) yyVals[-2+yyTop], lt.Location);
		yyVal = new MemberAccess (deref, lt.Value);
	  }
  break;
case 543:
#line 3760 "cs-parser.jay"
  {
		start_anonymous (false, (ParametersCompiled) yyVals[0+yyTop], (Location) yyVals[-1+yyTop]);
	  }
  break;
case 544:
#line 3764 "cs-parser.jay"
  {
		yyVal = end_anonymous ((ToplevelBlock) yyVals[0+yyTop]);
	}
  break;
case 545:
#line 3771 "cs-parser.jay"
  {
		yyVal = ParametersCompiled.Undefined;
	  }
  break;
case 547:
#line 3779 "cs-parser.jay"
  {
	  	valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out;
	  }
  break;
case 548:
#line 3783 "cs-parser.jay"
  {
		valid_param_mod = 0;
	  	yyVal = yyVals[-1+yyTop];
	  }
  break;
case 549:
#line 3791 "cs-parser.jay"
  {
		if (RootContext.Version < LanguageVersion.ISO_2)
			Report.FeatureIsNotAvailable (lexer.Location, "default value expression");

		yyVal = new DefaultValueExpression ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop]));
	  }
  break;
case 551:
#line 3802 "cs-parser.jay"
  {
		yyVal = new Unary (Unary.Operator.LogicalNot, (Expression) yyVals[0+yyTop]);
	  }
  break;
case 552:
#line 3806 "cs-parser.jay"
  {
		yyVal = new Unary (Unary.Operator.OnesComplement, (Expression) yyVals[0+yyTop]);
	  }
  break;
case 554:
#line 3814 "cs-parser.jay"
  {
		yyVal = new Cast ((FullNamedExpression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop]));
	  }
  break;
case 555:
#line 3818 "cs-parser.jay"
  {
		yyVal = new Cast ((FullNamedExpression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop]));
	  }
  break;
case 557:
#line 3830 "cs-parser.jay"
  { 
	  	yyVal = new Unary (Unary.Operator.UnaryPlus, (Expression) yyVals[0+yyTop]);
	  }
  break;
case 558:
#line 3834 "cs-parser.jay"
  { 
		yyVal = new Unary (Unary.Operator.UnaryNegation, (Expression) yyVals[0+yyTop]);
	  }
  break;
case 559:
#line 3838 "cs-parser.jay"
  {
		yyVal = new UnaryMutator (UnaryMutator.Mode.PreIncrement, (Expression) yyVals[0+yyTop]);
	  }
  break;
case 560:
#line 3842 "cs-parser.jay"
  {
		yyVal = new UnaryMutator (UnaryMutator.Mode.PreDecrement, (Expression) yyVals[0+yyTop]);
	  }
  break;
case 561:
#line 3846 "cs-parser.jay"
  {
		yyVal = new Indirection ((Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop]));
	  }
  break;
case 562:
#line 3850 "cs-parser.jay"
  {
		yyVal = new Unary (Unary.Operator.AddressOf, (Expression) yyVals[0+yyTop]);
	  }
  break;
case 564:
#line 3858 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.Multiply, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 565:
#line 3863 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.Division, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 566:
#line 3868 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.Modulus, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 568:
#line 3877 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.Addition, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 569:
#line 3882 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 570:
#line 3886 "cs-parser.jay"
  {
	  	/* Shift/Reduce conflict*/
		yyVal = new Binary (Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
  	  }
  break;
case 571:
#line 3891 "cs-parser.jay"
  {
		yyVal = new As ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], (Location) yyVals[-1+yyTop]);
	  }
  break;
case 572:
#line 3895 "cs-parser.jay"
  {
		yyVal = new Is ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], (Location) yyVals[-1+yyTop]);
	  }
  break;
case 574:
#line 3903 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.LeftShift, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 575:
#line 3908 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.RightShift, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 577:
#line 3917 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.LessThan, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 578:
#line 3922 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.GreaterThan, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 579:
#line 3927 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.LessThanOrEqual, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 580:
#line 3932 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.GreaterThanOrEqual, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 582:
#line 3941 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.Equality, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 583:
#line 3946 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.Inequality, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 585:
#line 3955 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.BitwiseAnd, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 587:
#line 3964 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.ExclusiveOr, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 589:
#line 3973 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.BitwiseOr, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 591:
#line 3982 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.LogicalAnd, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 593:
#line 3991 "cs-parser.jay"
  {
		yyVal = new Binary (Binary.Operator.LogicalOr, 
			         (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 595:
#line 4000 "cs-parser.jay"
  {
		if (RootContext.Version < LanguageVersion.ISO_2)
			Report.FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "null coalescing operator");
			
		yyVal = new Nullable.NullCoalescingOperator ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], lexer.Location);
	  }
  break;
case 597:
#line 4011 "cs-parser.jay"
  {
		yyVal = new Conditional ((Expression) yyVals[-4+yyTop], (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 598:
#line 4018 "cs-parser.jay"
  {
		yyVal = new SimpleAssign ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 599:
#line 4022 "cs-parser.jay"
  {
		yyVal = new CompoundAssign (
			Binary.Operator.Multiply, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 600:
#line 4027 "cs-parser.jay"
  {
		yyVal = new CompoundAssign (
			Binary.Operator.Division, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 601:
#line 4032 "cs-parser.jay"
  {
		yyVal = new CompoundAssign (
			Binary.Operator.Modulus, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 602:
#line 4037 "cs-parser.jay"
  {
		yyVal = new CompoundAssign (
			Binary.Operator.Addition, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 603:
#line 4042 "cs-parser.jay"
  {
		yyVal = new CompoundAssign (
			Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 604:
#line 4047 "cs-parser.jay"
  {
		yyVal = new CompoundAssign (
			Binary.Operator.LeftShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 605:
#line 4052 "cs-parser.jay"
  {
		yyVal = new CompoundAssign (
			Binary.Operator.RightShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 606:
#line 4057 "cs-parser.jay"
  {
		yyVal = new CompoundAssign (
			Binary.Operator.BitwiseAnd, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 607:
#line 4062 "cs-parser.jay"
  {
		yyVal = new CompoundAssign (
			Binary.Operator.BitwiseOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 608:
#line 4067 "cs-parser.jay"
  {
		yyVal = new CompoundAssign (
			Binary.Operator.ExclusiveOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
	  }
  break;
case 609:
#line 4075 "cs-parser.jay"
  {
		ArrayList pars = new ArrayList (4);
		pars.Add (yyVals[0+yyTop]);

		yyVal = pars;
	  }
  break;
case 610:
#line 4082 "cs-parser.jay"
  {
		ArrayList pars = (ArrayList) yyVals[-2+yyTop];
		Parameter p = (Parameter)yyVals[0+yyTop];
		if (pars[0].GetType () != p.GetType ()) {
			Report.Error (748, p.Location, "All lambda parameters must be typed either explicitly or implicitly");
		}
		
		pars.Add (p);
		yyVal = pars;
	  }
  break;
case 611:
#line 4096 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[0+yyTop];

		yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Parameter.Modifier) yyVals[-2+yyTop], null, lt.Location);
	  }
  break;
case 612:
#line 4102 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[0+yyTop];

		yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, Parameter.Modifier.NONE, null, lt.Location);
	  }
  break;
case 613:
#line 4108 "cs-parser.jay"
  {
	  	LocatedToken lt = (LocatedToken) yyVals[0+yyTop];
		yyVal = new ImplicitLambdaParameter (lt.Value, lt.Location);
	  }
  break;
case 614:
#line 4115 "cs-parser.jay"
  { yyVal = ParametersCompiled.EmptyReadOnlyParameters; }
  break;
case 615:
#line 4116 "cs-parser.jay"
  { 
		ArrayList pars_list = (ArrayList) yyVals[0+yyTop];
		yyVal = new ParametersCompiled ((Parameter[])pars_list.ToArray (typeof (Parameter)));
	  }
  break;
case 616:
#line 4123 "cs-parser.jay"
  {
		start_block (lexer.Location);
	  }
  break;
case 617:
#line 4127 "cs-parser.jay"
  {
		Block b = end_block (lexer.Location);
		b.AddStatement (new ContextualReturn ((Expression) yyVals[0+yyTop]));
		yyVal = b;
	  }
  break;
case 618:
#line 4132 "cs-parser.jay"
  { 
	  	yyVal = yyVals[0+yyTop]; 
	  }
  break;
case 619:
#line 4139 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location);
		start_anonymous (true, new ParametersCompiled (p), GetLocation (yyVals[-1+yyTop]));
	  }
  break;
case 620:
#line 4145 "cs-parser.jay"
  {
		yyVal = end_anonymous ((ToplevelBlock) yyVals[0+yyTop]);
	  }
  break;
case 621:
#line 4149 "cs-parser.jay"
  {
	  	valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out;
	  }
  break;
case 622:
#line 4153 "cs-parser.jay"
  {
	  	valid_param_mod = 0;
		start_anonymous (true, (ParametersCompiled) yyVals[-2+yyTop], GetLocation (yyVals[-4+yyTop]));
	  }
  break;
case 623:
#line 4158 "cs-parser.jay"
  {
		yyVal = end_anonymous ((ToplevelBlock) yyVals[0+yyTop]);
	  }
  break;
case 631:
#line 4190 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = true;
	  }
  break;
case 632:
#line 4194 "cs-parser.jay"
  {
		MemberName name = MakeName ((MemberName) yyVals[0+yyTop]);
		push_current_class (new Class (current_namespace, current_class, name, (int) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]), yyVals[-3+yyTop]);
	  }
  break;
case 633:
#line 4200 "cs-parser.jay"
  {
		lexer.ConstraintsParsing = false;

		current_class.SetParameterInfo ((ArrayList) yyVals[0+yyTop]);

		if (RootContext.Documentation != null) {
			current_container.DocComment = Lexer.consume_doc_comment ();
			Lexer.doc_state = XmlCommentState.Allowed;
		}
	  }
  break;
case 634:
#line 4211 "cs-parser.jay"
  {
		--lexer.parsing_declaration;	  
		if (RootContext.Documentation != null)
			Lexer.doc_state = XmlCommentState.Allowed;
	  }
  break;
case 635:
#line 4217 "cs-parser.jay"
  {
		yyVal = pop_current_class ();
	  }
  break;
case 636:
#line 4224 "cs-parser.jay"
  { yyVal = null; }
  break;
case 637:
#line 4226 "cs-parser.jay"
  { yyVal = yyVals[0+yyTop]; }
  break;
case 638:
#line 4230 "cs-parser.jay"
  { yyVal = (int) 0; }
  break;
case 641:
#line 4237 "cs-parser.jay"
  { 
		int m1 = (int) yyVals[-1+yyTop];
		int m2 = (int) yyVals[0+yyTop];

		if ((m1 & m2) != 0) {
			Location l = lexer.Location;
			Report.Error (1004, l, "Duplicate `{0}' modifier", Modifiers.Name (m2));
		}
		yyVal = (int) (m1 | m2);
	  }
  break;
case 642:
#line 4251 "cs-parser.jay"
  {
		yyVal = Modifiers.NEW;
		if (current_container == RootContext.ToplevelTypes)
			Report.Error (1530, lexer.Location, "Keyword `new' is not allowed on namespace elements");
	  }
  break;
case 643:
#line 4256 "cs-parser.jay"
  { yyVal = Modifiers.PUBLIC; }
  break;
case 644:
#line 4257 "cs-parser.jay"
  { yyVal = Modifiers.PROTECTED; }
  break;
case 645:
#line 4258 "cs-parser.jay"
  { yyVal = Modifiers.INTERNAL; }
  break;
case 646:
#line 4259 "cs-parser.jay"
  { yyVal = Modifiers.PRIVATE; }
  break;
case 647:
#line 4260 "cs-parser.jay"
  { yyVal = Modifiers.ABSTRACT; }
  break;
case 648:
#line 4261 "cs-parser.jay"
  { yyVal = Modifiers.SEALED; }
  break;
case 649:
#line 4262 "cs-parser.jay"
  { yyVal = Modifiers.STATIC; }
  break;
case 650:
#line 4263 "cs-parser.jay"
  { yyVal = Modifiers.READONLY; }
  break;
case 651:
#line 4264 "cs-parser.jay"
  { yyVal = Modifiers.VIRTUAL; }
  break;
case 652:
#line 4265 "cs-parser.jay"
  { yyVal = Modifiers.OVERRIDE; }
  break;
case 653:
#line 4266 "cs-parser.jay"
  { yyVal = Modifiers.EXTERN; }
  break;
case 654:
#line 4267 "cs-parser.jay"
  { yyVal = Modifiers.VOLATILE; }
  break;
case 655:
#line 4268 "cs-parser.jay"
  { yyVal = Modifiers.UNSAFE; }
  break;
case 658:
#line 4277 "cs-parser.jay"
  { current_container.AddBasesForPart (current_class, (ArrayList) yyVals[0+yyTop]); }
  break;
case 659:
#line 4281 "cs-parser.jay"
  { yyVal = null; }
  break;
case 660:
#line 4283 "cs-parser.jay"
  { yyVal = yyVals[0+yyTop]; }
  break;
case 661:
#line 4287 "cs-parser.jay"
  {
		ArrayList constraints = new ArrayList (1);
		constraints.Add (yyVals[0+yyTop]);
		yyVal = constraints;
	  }
  break;
case 662:
#line 4292 "cs-parser.jay"
  {
		ArrayList constraints = (ArrayList) yyVals[-1+yyTop];
		Constraints new_constraint = (Constraints)yyVals[0+yyTop];

		foreach (Constraints c in constraints) {
			if (new_constraint.TypeParameter == c.TypeParameter) {
				Report.Error (409, new_constraint.Location, "A constraint clause has already been specified for type parameter `{0}'",
					new_constraint.TypeParameter);
			}
		}

		constraints.Add (new_constraint);
		yyVal = constraints;
	  }
  break;
case 663:
#line 4309 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-2+yyTop];
		yyVal = new Constraints (lt.Value, (ArrayList) yyVals[0+yyTop], lt.Location);
	  }
  break;
case 664:
#line 4316 "cs-parser.jay"
  {
		ArrayList constraints = new ArrayList (1);
		constraints.Add (yyVals[0+yyTop]);
		yyVal = constraints;
	  }
  break;
case 665:
#line 4321 "cs-parser.jay"
  {
		ArrayList constraints = (ArrayList) yyVals[-2+yyTop];

		constraints.Add (yyVals[0+yyTop]);
		yyVal = constraints;
	  }
  break;
case 667:
#line 4331 "cs-parser.jay"
  {
		yyVal = SpecialConstraint.Constructor;
	  }
  break;
case 668:
#line 4334 "cs-parser.jay"
  {
		yyVal = SpecialConstraint.ReferenceType;
	  }
  break;
case 669:
#line 4337 "cs-parser.jay"
  {
		yyVal = SpecialConstraint.ValueType;
	  }
  break;
case 670:
#line 4344 "cs-parser.jay"
  {
		yyVal = Variance.None;
	  }
  break;
case 671:
#line 4348 "cs-parser.jay"
  {
		if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2)	  
	  		Report.FeatureIsNotSupported (lexer.Location, "generic type variance");
		else if (RootContext.Version <= LanguageVersion.V_3)
			Report.FeatureIsNotAvailable (lexer.Location, "generic type variance");

		yyVal = yyVals[0+yyTop];
	  }
  break;
case 672:
#line 4360 "cs-parser.jay"
  {
		yyVal = Variance.Covariant;
	  }
  break;
case 673:
#line 4364 "cs-parser.jay"
  {
		yyVal = Variance.Contravariant;
	  }
  break;
case 674:
#line 4384 "cs-parser.jay"
  {
		++lexer.parsing_block;
		start_block ((Location) yyVals[0+yyTop]);
	  }
  break;
case 675:
#line 4389 "cs-parser.jay"
  {
		yyVal = yyVals[0+yyTop];
          }
  break;
case 676:
#line 4396 "cs-parser.jay"
  {
	 	--lexer.parsing_block;
		yyVal = end_block ((Location) yyVals[0+yyTop]);
	  }
  break;
case 677:
#line 4401 "cs-parser.jay"
  {
	 	--lexer.parsing_block;
		yyVal = end_block (lexer.Location);
	  }
  break;
case 678:
#line 4410 "cs-parser.jay"
  {
		++lexer.parsing_block;
		current_block.StartLocation = GetLocation (yyVals[0+yyTop]);
	  }
  break;
case 679:
#line 4415 "cs-parser.jay"
  {
		--lexer.parsing_block;
		yyVal = end_block ((Location) yyVals[0+yyTop]);
	  }
  break;
case 684:
#line 4433 "cs-parser.jay"
  {
		if (yyVals[0+yyTop] != null && (Block) yyVals[0+yyTop] != current_block){
			current_block.AddStatement ((Statement) yyVals[0+yyTop]);
			current_block = (Block) yyVals[0+yyTop];
		}
	  }
  break;
case 685:
#line 4440 "cs-parser.jay"
  {
		current_block.AddStatement ((Statement) yyVals[0+yyTop]);
	  }
  break;
case 689:
#line 4459 "cs-parser.jay"
  {
		if (yyVals[0+yyTop] != null && (Block) yyVals[0+yyTop] != current_block){
			current_block.AddStatement ((Statement) yyVals[0+yyTop]);
			current_block = (Block) yyVals[0+yyTop];
		}
	  }
  break;
case 690:
#line 4466 "cs-parser.jay"
  {
		current_block.AddStatement ((Statement) yyVals[0+yyTop]);
	  }
  break;
case 719:
#line 4507 "cs-parser.jay"
  {
		  Report.Error (1023, GetLocation (yyVals[0+yyTop]), "An embedded statement may not be a declaration or labeled statement");
		  yyVal = null;
	  }
  break;
case 720:
#line 4512 "cs-parser.jay"
  {
		  Report.Error (1023, GetLocation (yyVals[0+yyTop]), "An embedded statement may not be a declaration or labeled statement");
		  yyVal = null;
	  }
  break;
case 721:
#line 4520 "cs-parser.jay"
  {
		  yyVal = EmptyStatement.Value;
	  }
  break;
case 722:
#line 4527 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		LabeledStatement labeled = new LabeledStatement (lt.Value, lt.Location);

		if (current_block.AddLabel (labeled))
			current_block.AddStatement (labeled);
	  }
  break;
case 724:
#line 4539 "cs-parser.jay"
  {
		current_array_type = null;
		if (yyVals[-1+yyTop] != null){
			DictionaryEntry de = (DictionaryEntry) yyVals[-1+yyTop];
			Expression e = (Expression) de.Key;

			yyVal = declare_local_variables (e, (ArrayList) de.Value, e.Location);
		}
	  }
  break;
case 725:
#line 4550 "cs-parser.jay"
  {
		current_array_type = null;
		if (yyVals[-1+yyTop] != null){
			DictionaryEntry de = (DictionaryEntry) yyVals[-1+yyTop];

			yyVal = declare_local_constants ((Expression) de.Key, (ArrayList) de.Value);
		}
	  }
  break;
case 726:
#line 4568 "cs-parser.jay"
  { 
		/* FIXME: Do something smart here regarding the composition of the type.*/

		/* Ok, the above "primary_expression" is there to get rid of*/
		/* both reduce/reduce and shift/reduces in the grammar, it should*/
		/* really just be "type_name".  If you use type_name, a reduce/reduce*/
		/* creeps up.  If you use namespace_or_type_name (which is all we need*/
		/* really) two shift/reduces appear.*/
		/* */

		/* So the super-trick is that primary_expression*/
		/* can only be either a SimpleName or a MemberAccess. */
		/* The MemberAccess case arises when you have a fully qualified type-name like :*/
		/* Foo.Bar.Blah i;*/
		/* SimpleName is when you have*/
		/* Blah i;*/
		
		Expression expr = (Expression) yyVals[-1+yyTop];
		string rank_or_nullable = (string) yyVals[0+yyTop];
		
		if (expr is ComposedCast){
			yyVal = new ComposedCast ((ComposedCast)expr, rank_or_nullable);
		} else if (expr is ATypeNameExpression){
			/**/
			/* So we extract the string corresponding to the SimpleName*/
			/* or MemberAccess*/
			/**/
			if (rank_or_nullable.Length == 0) {
				SimpleName sn = expr as SimpleName;
				if (sn != null && sn.Name == "var")
					yyVal = current_array_type = new VarExpr (sn.Location);
				else
					yyVal = yyVals[-1+yyTop];
			} else {
				yyVal = new ComposedCast ((ATypeNameExpression)expr, rank_or_nullable);
			}
		} else {
			Error_ExpectingTypeName (expr);
			yyVal = TypeManager.system_object_expr;
		}
	  }
  break;
case 727:
#line 4610 "cs-parser.jay"
  {
		if ((string) yyVals[0+yyTop] == "")
			yyVal = yyVals[-1+yyTop];
		else
			yyVal = current_array_type = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (string) yyVals[0+yyTop], lexer.Location);
	  }
  break;
case 728:
#line 4617 "cs-parser.jay"
  {
		Expression.Error_VoidInvalidInTheContext (lexer.Location, Report);
		yyVal = TypeManager.system_void_expr;
	  }
  break;
case 729:
#line 4625 "cs-parser.jay"
  {
		ATypeNameExpression expr = yyVals[-1+yyTop] as ATypeNameExpression;

		if (expr != null) {
			yyVal = new ComposedCast (expr, "*");
		} else {
			Error_ExpectingTypeName ((Expression)yyVals[-1+yyTop]);
			yyVal = expr;
		}
	  }
  break;
case 730:
#line 4636 "cs-parser.jay"
  {
		yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], "*", GetLocation (yyVals[-1+yyTop]));
	  }
  break;
case 731:
#line 4640 "cs-parser.jay"
  {
		yyVal = new ComposedCast (TypeManager.system_void_expr, "*", (Location) yyVals[-1+yyTop]);
	  }
  break;
case 732:
#line 4644 "cs-parser.jay"
  {
		yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], "*");
	  }
  break;
case 734:
#line 4652 "cs-parser.jay"
  {
		if (yyVals[-1+yyTop] != null){
			string rank = (string)yyVals[0+yyTop];

			if (rank == "")
				yyVal = yyVals[-1+yyTop];
			else
				yyVal = current_array_type = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], rank);
		} else {
			yyVal = null;
		}
	  }
  break;
case 735:
#line 4668 "cs-parser.jay"
  {
		if (yyVals[-1+yyTop] != null) {
			VarExpr ve = yyVals[-1+yyTop] as VarExpr;
			if (ve != null)
				ve.VariableInitializer = (ArrayList)yyVals[0+yyTop];
				
			yyVal = new DictionaryEntry (yyVals[-1+yyTop], yyVals[0+yyTop]);
		} else
			yyVal = null;
	  }
  break;
case 736:
#line 4682 "cs-parser.jay"
  {
		if (yyVals[-1+yyTop] != null)
			yyVal = new DictionaryEntry (yyVals[-1+yyTop], yyVals[0+yyTop]);
		else
			yyVal = null;
	  }
  break;
case 737:
#line 4691 "cs-parser.jay"
  { yyVal = yyVals[-1+yyTop]; }
  break;
case 738:
#line 4692 "cs-parser.jay"
  { yyVal = yyVals[-1+yyTop]; }
  break;
case 739:
#line 4696 "cs-parser.jay"
  { yyVal = yyVals[-1+yyTop]; }
  break;
case 740:
#line 4697 "cs-parser.jay"
  { yyVal = yyVals[-1+yyTop]; }
  break;
case 741:
#line 4706 "cs-parser.jay"
  {
		ExpressionStatement s = yyVals[0+yyTop] as ExpressionStatement;
		if (s == null) {
			Expression.Error_InvalidExpressionStatement (Report, GetLocation (yyVals[0+yyTop]));
			s = EmptyExpressionStatement.Instance;
		}

		yyVal = new StatementExpression (s);
	  }
  break;
case 742:
#line 4716 "cs-parser.jay"
  {
		Error_SyntaxError (yyToken);
		yyVal = null;
	  }
  break;
case 743:
#line 4724 "cs-parser.jay"
  {
		Expression expr = (Expression) yyVals[0+yyTop];
		ExpressionStatement s;

	        s = new OptionalAssign (new SimpleName ("$retval", lexer.Location), expr, lexer.Location);
		yyVal = new StatementExpression (s);
	  }
  break;
case 744:
#line 4732 "cs-parser.jay"
  {
		Error_SyntaxError (yyToken);
		yyVal = null;
	  }
  break;
case 747:
#line 4746 "cs-parser.jay"
  { 
		Location l = (Location) yyVals[-4+yyTop];

		yyVal = new If ((Expression) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], l);

		/* FIXME: location for warning should be loc property of $5.*/
		if (yyVals[0+yyTop] == EmptyStatement.Value)
			Report.Warning (642, 3, l, "Possible mistaken empty statement");

	  }
  break;
case 748:
#line 4758 "cs-parser.jay"
  {
		Location l = (Location) yyVals[-6+yyTop];

		yyVal = new If ((Expression) yyVals[-4+yyTop], (Statement) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], l);

		/* FIXME: location for warning should be loc property of $5 and $7.*/
		if (yyVals[-2+yyTop] == EmptyStatement.Value)
			Report.Warning (642, 3, l, "Possible mistaken empty statement");
		if (yyVals[0+yyTop] == EmptyStatement.Value)
			Report.Warning (642, 3, l, "Possible mistaken empty statement");
	  }
  break;
case 749:
#line 4773 "cs-parser.jay"
  { 
		if (switch_stack == null)
			switch_stack = new Stack (2);
		switch_stack.Push (current_block);
	  }
  break;
case 750:
#line 4780 "cs-parser.jay"
  {
		yyVal = new Switch ((Expression) yyVals[-2+yyTop], (ArrayList) yyVals[0+yyTop], (Location) yyVals[-5+yyTop]);
		current_block = (Block) switch_stack.Pop ();
	  }
  break;
case 751:
#line 4790 "cs-parser.jay"
  {
		yyVal = yyVals[-1+yyTop];
	  }
  break;
case 752:
#line 4797 "cs-parser.jay"
  {
	  	Report.Warning (1522, 1, lexer.Location, "Empty switch block"); 
		yyVal = new ArrayList ();
	  }
  break;
case 754:
#line 4806 "cs-parser.jay"
  {
		ArrayList sections = new ArrayList (4);

		sections.Add (yyVals[0+yyTop]);
		yyVal = sections;
	  }
  break;
case 755:
#line 4813 "cs-parser.jay"
  {
		ArrayList sections = (ArrayList) yyVals[-1+yyTop];

		sections.Add (yyVals[0+yyTop]);
		yyVal = sections;
	  }
  break;
case 756:
#line 4823 "cs-parser.jay"
  {
		current_block = current_block.CreateSwitchBlock (lexer.Location);
	  }
  break;
case 757:
#line 4827 "cs-parser.jay"
  {
		yyVal = new SwitchSection ((ArrayList) yyVals[-2+yyTop], current_block.Explicit);
	  }
  break;
case 758:
#line 4834 "cs-parser.jay"
  {
		ArrayList labels = new ArrayList (4);

		labels.Add (yyVals[0+yyTop]);
		yyVal = labels;
	  }
  break;
case 759:
#line 4841 "cs-parser.jay"
  {
		ArrayList labels = (ArrayList) (yyVals[-1+yyTop]);
		labels.Add (yyVals[0+yyTop]);

		yyVal = labels;
	  }
  break;
case 760:
#line 4851 "cs-parser.jay"
  {
	 	yyVal = new SwitchLabel ((Expression) yyVals[-1+yyTop], (Location) yyVals[-2+yyTop]);
	 }
  break;
case 761:
#line 4855 "cs-parser.jay"
  {
		yyVal = new SwitchLabel (null, (Location) yyVals[0+yyTop]);
	  }
  break;
case 766:
#line 4869 "cs-parser.jay"
  {
		Location l = (Location) yyVals[-4+yyTop];
		yyVal = new While ((Expression) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], l);
	  }
  break;
case 767:
#line 4878 "cs-parser.jay"
  {
		Location l = (Location) yyVals[-6+yyTop];

		yyVal = new Do ((Statement) yyVals[-5+yyTop], (Expression) yyVals[-2+yyTop], l);
	  }
  break;
case 768:
#line 4887 "cs-parser.jay"
  {
		Location l = lexer.Location;
		start_block (l);  
		Block assign_block = current_block;

		if (yyVals[-1+yyTop] is DictionaryEntry){
			DictionaryEntry de = (DictionaryEntry) yyVals[-1+yyTop];
			
			Expression type = (Expression) de.Key;
			ArrayList var_declarators = (ArrayList) de.Value;

			foreach (VariableDeclaration decl in var_declarators){

				LocalInfo vi;

				vi = current_block.AddVariable (type, decl.identifier, decl.Location);
				if (vi == null)
					continue;

				Expression expr = decl.expression_or_array_initializer;
					
				LocalVariableReference var;
				var = new LocalVariableReference (assign_block, decl.identifier, l);

				if (expr != null) {
					Assign a = new SimpleAssign (var, expr, decl.Location);
					
					assign_block.AddStatement (new StatementExpression (a));
				}
			}
			
			/* Note: the $$ below refers to the value of this code block, not of the LHS non-terminal.*/
			/* This can be referred to as $5 below.*/
			yyVal = null;
		} else {
			yyVal = yyVals[-1+yyTop];
		}
	  }
  break;
case 769:
#line 4928 "cs-parser.jay"
  {
		Location l = (Location) yyVals[-9+yyTop];

		For f = new For ((Statement) yyVals[-5+yyTop], (Expression) yyVals[-4+yyTop], (Statement) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], l);

		current_block.AddStatement (f);

		yyVal = end_block (lexer.Location);
	  }
  break;
case 770:
#line 4940 "cs-parser.jay"
  { yyVal = EmptyStatement.Value; }
  break;
case 774:
#line 4950 "cs-parser.jay"
  { yyVal = null; }
  break;
case 776:
#line 4955 "cs-parser.jay"
  { yyVal = EmptyStatement.Value; }
  break;
case 779:
#line 4965 "cs-parser.jay"
  {
		/* CHANGE: was `null'*/
		Statement s = (Statement) yyVals[0+yyTop];
		Block b = new Block (current_block, s.loc, lexer.Location);   

		b.AddStatement (s);
		yyVal = b;
	  }
  break;
case 780:
#line 4974 "cs-parser.jay"
  {
		Block b = (Block) yyVals[-2+yyTop];

		b.AddStatement ((Statement) yyVals[0+yyTop]);
		yyVal = yyVals[-2+yyTop];
	  }
  break;
case 781:
#line 4984 "cs-parser.jay"
  {
		Report.Error (230, (Location) yyVals[-5+yyTop], "Type and identifier are both required in a foreach statement");
		yyVal = null;
	  }
  break;
case 782:
#line 4990 "cs-parser.jay"
  {
		start_block (lexer.Location);
		Block foreach_block = current_block;

		LocatedToken lt = (LocatedToken) yyVals[-3+yyTop];
		Location l = lt.Location;
		LocalInfo vi = foreach_block.AddVariable ((Expression) yyVals[-4+yyTop], lt.Value, l);
		if (vi != null) {
			vi.SetReadOnlyContext (LocalInfo.ReadOnlyContext.Foreach);

			/* Get a writable reference to this read-only variable.*/
			/**/
			/* Note that the $$ here refers to the value of _this_ code block,*/
			/* not the value of the LHS non-terminal.  This can be referred to as $8 below.*/
			yyVal = new LocalVariableReference (foreach_block, lt.Value, l, vi, false);
		} else {
			yyVal = null;
		}
	  }
  break;
case 783:
#line 5010 "cs-parser.jay"
  {
		LocalVariableReference v = (LocalVariableReference) yyVals[-1+yyTop];
		Location l = (Location) yyVals[-8+yyTop];

		if (v != null) {
			Foreach f = new Foreach ((Expression) yyVals[-6+yyTop], v, (Expression) yyVals[-3+yyTop], (Statement) yyVals[0+yyTop], l);
			current_block.AddStatement (f);
		}

		yyVal = end_block (lexer.Location);
	  }
  break;
case 790:
#line 5034 "cs-parser.jay"
  {
		yyVal = new Break ((Location) yyVals[-1+yyTop]);
	  }
  break;
case 791:
#line 5041 "cs-parser.jay"
  {
		yyVal = new Continue ((Location) yyVals[-1+yyTop]);
	  }
  break;
case 792:
#line 5048 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-1+yyTop];
		yyVal = new Goto (lt.Value, lt.Location);
	  }
  break;
case 793:
#line 5053 "cs-parser.jay"
  {
		yyVal = new GotoCase ((Expression) yyVals[-1+yyTop], (Location) yyVals[-3+yyTop]);
	  }
  break;
case 794:
#line 5057 "cs-parser.jay"
  {
		yyVal = new GotoDefault ((Location) yyVals[-2+yyTop]);
	  }
  break;
case 795:
#line 5064 "cs-parser.jay"
  {
		yyVal = new Return ((Expression) yyVals[-1+yyTop], (Location) yyVals[-2+yyTop]);
	  }
  break;
case 796:
#line 5071 "cs-parser.jay"
  {
		yyVal = new Throw ((Expression) yyVals[-1+yyTop], (Location) yyVals[-2+yyTop]);
	  }
  break;
case 797:
#line 5078 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-3+yyTop];
		string s = lt.Value;
		if (s != "yield"){
			Report.Error (1003, lt.Location, "; expected");
			yyVal = null;
		}
		if (RootContext.Version == LanguageVersion.ISO_1){
			Report.FeatureIsNotAvailable (lt.Location, "yield statement");
			yyVal = null;
		}
		current_block.Toplevel.IsIterator = true;
		yyVal = new Yield ((Expression) yyVals[-1+yyTop], lt.Location); 
	  }
  break;
case 798:
#line 5093 "cs-parser.jay"
  {
		Report.Error (1627, (Location) yyVals[-1+yyTop], "Expression expected after yield return");
		yyVal = null;
	  }
  break;
case 799:
#line 5098 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-2+yyTop];
		string s = lt.Value;
		if (s != "yield"){
			Report.Error (1003, lt.Location, "; expected");
			yyVal = null;
		}
		if (RootContext.Version == LanguageVersion.ISO_1){
			Report.FeatureIsNotAvailable (lt.Location, "yield statement");
			yyVal = null;
		}
		
		current_block.Toplevel.IsIterator = true;
		yyVal = new YieldBreak (lt.Location);
	  }
  break;
case 802:
#line 5122 "cs-parser.jay"
  {
		yyVal = new TryCatch ((Block) yyVals[-1+yyTop], (ArrayList) yyVals[0+yyTop], (Location) yyVals[-2+yyTop], false);
	  }
  break;
case 803:
#line 5126 "cs-parser.jay"
  {
		yyVal = new TryFinally ((Statement) yyVals[-2+yyTop], (Block) yyVals[0+yyTop], (Location) yyVals[-3+yyTop]);
	  }
  break;
case 804:
#line 5130 "cs-parser.jay"
  {
		yyVal = new TryFinally (new TryCatch ((Block) yyVals[-3+yyTop], (ArrayList) yyVals[-2+yyTop], (Location) yyVals[-4+yyTop], true), (Block) yyVals[0+yyTop], (Location) yyVals[-4+yyTop]);
	  }
  break;
case 805:
#line 5134 "cs-parser.jay"
  {
		Report.Error (1524, (Location) yyVals[-2+yyTop], "Expected catch or finally");
		yyVal = null;
	  }
  break;
case 806:
#line 5142 "cs-parser.jay"
  {
		ArrayList l = new ArrayList (4);

		l.Add (yyVals[0+yyTop]);
		yyVal = l;
	  }
  break;
case 807:
#line 5149 "cs-parser.jay"
  {
		ArrayList l = (ArrayList) yyVals[-1+yyTop];
		
		Catch c = (Catch) yyVals[0+yyTop];
		if (((Catch) l [0]).IsGeneral) {
			Report.Error (1017, c.loc, "Try statement already has an empty catch block");
		} else {
			if (c.IsGeneral)
				l.Insert (0, yyVals[0+yyTop]);
			else
				l.Add (yyVals[0+yyTop]);
		}
		
		yyVal = l;
	  }
  break;
case 808:
#line 5167 "cs-parser.jay"
  { yyVal = null; }
  break;
case 810:
#line 5173 "cs-parser.jay"
  {
		Expression type = null;
		
		if (yyVals[0+yyTop] != null) {
			DictionaryEntry cc = (DictionaryEntry) yyVals[0+yyTop];
			type = (Expression) cc.Key;
			LocatedToken lt = (LocatedToken) cc.Value;

			if (lt != null){
				ArrayList one = new ArrayList (4);

				one.Add (new VariableDeclaration (lt, null));

				start_block (lexer.Location);
				current_block = declare_local_variables (type, one, lt.Location);
			}
		}
	  }
  break;
case 811:
#line 5190 "cs-parser.jay"
  {
		Expression type = null;
		string id = null;
		Block var_block = null;

		if (yyVals[-2+yyTop] != null){
			DictionaryEntry cc = (DictionaryEntry) yyVals[-2+yyTop];
			type = (Expression) cc.Key;
			LocatedToken lt = (LocatedToken) cc.Value;

			if (lt != null){
				id = lt.Value;
				var_block = end_block (lexer.Location);
			}
		}

		yyVal = new Catch (type, id, (Block) yyVals[0+yyTop], var_block, ((Block) yyVals[0+yyTop]).loc);
	  }
  break;
case 812:
#line 5211 "cs-parser.jay"
  { yyVal = null; }
  break;
case 814:
#line 5217 "cs-parser.jay"
  {
		yyVal = new DictionaryEntry (yyVals[-2+yyTop], yyVals[-1+yyTop]);
	  }
  break;
case 815:
#line 5221 "cs-parser.jay"
  {
		Report.Error (1015, GetLocation (yyVals[-1+yyTop]), "A type that derives from `System.Exception', `object', or `string' expected");
	  }
  break;
case 816:
#line 5228 "cs-parser.jay"
  {
		yyVal = new Checked ((Block) yyVals[0+yyTop]);
	  }
  break;
case 817:
#line 5235 "cs-parser.jay"
  {
		yyVal = new Unchecked ((Block) yyVals[0+yyTop]);
	  }
  break;
case 818:
#line 5242 "cs-parser.jay"
  {
		RootContext.CheckUnsafeOption ((Location) yyVals[0+yyTop], Report);
	  }
  break;
case 819:
#line 5244 "cs-parser.jay"
  {
		yyVal = new Unsafe ((Block) yyVals[0+yyTop]);
	  }
  break;
case 820:
#line 5253 "cs-parser.jay"
  {
		ArrayList list = (ArrayList) yyVals[-1+yyTop];
		Expression type = (Expression) yyVals[-2+yyTop];
		Location l = (Location) yyVals[-4+yyTop];
		int top = list.Count;

		start_block (lexer.Location);

		for (int i = 0; i < top; i++){
			Pair p = (Pair) list [i];
			LocalInfo v;

			v = current_block.AddVariable (type, (string) p.First, l);
			if (v == null)
				continue;

			v.SetReadOnlyContext (LocalInfo.ReadOnlyContext.Fixed);
			v.Pinned = true;
			p.First = v;
			list [i] = p;
		}
	  }
  break;
case 821:
#line 5276 "cs-parser.jay"
  {
		Location l = (Location) yyVals[-6+yyTop];

		Fixed f = new Fixed ((Expression) yyVals[-4+yyTop], (ArrayList) yyVals[-3+yyTop], (Statement) yyVals[0+yyTop], l);

		current_block.AddStatement (f);

		yyVal = end_block (lexer.Location);
	  }
  break;
case 822:
#line 5288 "cs-parser.jay"
  { 
	   	ArrayList declarators = new ArrayList (4);
	   	if (yyVals[0+yyTop] != null)
			declarators.Add (yyVals[0+yyTop]);
		yyVal = declarators;
	  }
  break;
case 823:
#line 5295 "cs-parser.jay"
  {
		ArrayList declarators = (ArrayList) yyVals[-2+yyTop];
		if (yyVals[0+yyTop] != null)
			declarators.Add (yyVals[0+yyTop]);
		yyVal = declarators;
	  }
  break;
case 824:
#line 5305 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-2+yyTop];
		/* FIXME: keep location*/
		yyVal = new Pair (lt.Value, yyVals[0+yyTop]);
	  }
  break;
case 825:
#line 5311 "cs-parser.jay"
  {
		Report.Error (210, ((LocatedToken) yyVals[0+yyTop]).Location, "You must provide an initializer in a fixed or using statement declaration");
		yyVal = null;
	  }
  break;
case 826:
#line 5319 "cs-parser.jay"
  {
		/**/
 	  }
  break;
case 827:
#line 5323 "cs-parser.jay"
  {
		yyVal = new Lock ((Expression) yyVals[-3+yyTop], (Statement) yyVals[0+yyTop], (Location) yyVals[-5+yyTop]);
	  }
  break;
case 828:
#line 5330 "cs-parser.jay"
  {
		start_block (lexer.Location);
		Block assign_block = current_block;

		DictionaryEntry de = (DictionaryEntry) yyVals[-1+yyTop];
		Location l = (Location) yyVals[-3+yyTop];

		Expression type = (Expression) de.Key;
		ArrayList var_declarators = (ArrayList) de.Value;

		Stack vars = new Stack ();

		foreach (VariableDeclaration decl in var_declarators) {
			LocalInfo vi = current_block.AddVariable (type, decl.identifier, decl.Location);
			if (vi == null)
				continue;
			vi.SetReadOnlyContext (LocalInfo.ReadOnlyContext.Using);

			Expression expr = decl.expression_or_array_initializer;
			if (expr == null) {
				Report.Error (210, l, "You must provide an initializer in a fixed or using statement declaration");
				continue;
			}
			LocalVariableReference var;

			/* Get a writable reference to this read-only variable.*/
			var = new LocalVariableReference (assign_block, decl.identifier, l, vi, false);

			/* This is so that it is not a warning on using variables*/
			vi.Used = true;

			vars.Push (new DictionaryEntry (var, expr));

			/* Assign a = new SimpleAssign (var, expr, decl.Location);*/
			/* assign_block.AddStatement (new StatementExpression (a));*/
		}

		/* Note: the $$ here refers to the value of this code block and not of the LHS non-terminal.*/
		/* It can be referred to as $5 below.*/
		yyVal = vars;
	  }
  break;
case 829:
#line 5372 "cs-parser.jay"
  {
		Statement stmt = (Statement) yyVals[0+yyTop];
		Stack vars = (Stack) yyVals[-1+yyTop];
		Location l = (Location) yyVals[-5+yyTop];

		while (vars.Count > 0) {
			  DictionaryEntry de = (DictionaryEntry) vars.Pop ();
			  stmt = new Using ((Expression) de.Key, (Expression) de.Value, stmt, l);
		}
		current_block.AddStatement (stmt);
		yyVal = end_block (lexer.Location);
	  }
  break;
case 830:
#line 5385 "cs-parser.jay"
  {
		start_block (lexer.Location);
	  }
  break;
case 831:
#line 5389 "cs-parser.jay"
  {
		current_block.AddStatement (new UsingTemporary ((Expression) yyVals[-3+yyTop], (Statement) yyVals[0+yyTop], (Location) yyVals[-5+yyTop]));
		yyVal = end_block (lexer.Location);
	  }
  break;
case 832:
#line 5400 "cs-parser.jay"
  {
		lexer.query_parsing = false;
			
		Linq.AQueryClause from = yyVals[-1+yyTop] as Linq.AQueryClause;
			
		from.Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop];
		yyVal = from;
		
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
	  }
  break;
case 833:
#line 5412 "cs-parser.jay"
  {
		Linq.AQueryClause from = yyVals[-1+yyTop] as Linq.AQueryClause;
			
		from.Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop];
		yyVal = from;
		
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
	  }
  break;
case 834:
#line 5425 "cs-parser.jay"
  {
		yyVal = new Linq.QueryExpression (current_block, new Linq.QueryStartClause ((Expression)yyVals[0+yyTop]));
		current_block = new Linq.QueryBlock (compiler, current_block, (LocatedToken) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop]));
	  }
  break;
case 835:
#line 5430 "cs-parser.jay"
  {
		yyVal = new Linq.QueryExpression (current_block, new Linq.Cast ((FullNamedExpression)yyVals[-3+yyTop], (Expression)yyVals[0+yyTop]));
		current_block = new Linq.QueryBlock (compiler, current_block, (LocatedToken) yyVals[-2+yyTop], GetLocation (yyVals[-4+yyTop]));
	  }
  break;
case 836:
#line 5438 "cs-parser.jay"
  {
		yyVal = new Linq.QueryExpression (current_block, new Linq.QueryStartClause ((Expression)yyVals[0+yyTop]));
		current_block = new Linq.QueryBlock (compiler, current_block, (LocatedToken) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop]));
	  }
  break;
case 837:
#line 5443 "cs-parser.jay"
  {
		yyVal = new Linq.QueryExpression (current_block, new Linq.Cast ((FullNamedExpression)yyVals[-3+yyTop], (Expression)yyVals[0+yyTop]));
		current_block = new Linq.QueryBlock (compiler, current_block, (LocatedToken) yyVals[-2+yyTop], GetLocation (yyVals[-4+yyTop]));
	  }
  break;
case 838:
#line 5451 "cs-parser.jay"
  {
		current_block = new Linq.QueryBlock (compiler, current_block, GetLocation (yyVals[-2+yyTop]));
	  }
  break;
case 839:
#line 5455 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-3+yyTop];
		yyVal = new Linq.SelectMany (current_block.Toplevel, lt, (Expression)yyVals[0+yyTop]);
		
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
		
		((Linq.QueryBlock)current_block).AddTransparentParameter (lt);
	  }
  break;
case 840:
#line 5465 "cs-parser.jay"
  {
		current_block = new Linq.QueryBlock (compiler, current_block, GetLocation (yyVals[-3+yyTop]));
	  }
  break;
case 841:
#line 5469 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-3+yyTop];
		FullNamedExpression type = (FullNamedExpression)yyVals[-4+yyTop];
		
		yyVal = new Linq.SelectMany (current_block.Toplevel, lt, new Linq.Cast (type, (FullNamedExpression)yyVals[0+yyTop]));
		
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
		
		((Linq.QueryBlock)current_block).AddTransparentParameter (lt);
	  }
  break;
case 842:
#line 5484 "cs-parser.jay"
  {
	  	Linq.AQueryClause head = (Linq.AQueryClause)yyVals[-1+yyTop];
		
		if (yyVals[0+yyTop] != null)
			head.Next = (Linq.AQueryClause)yyVals[0+yyTop];
				
		if (yyVals[-2+yyTop] != null) {
			Linq.AQueryClause clause = (Linq.AQueryClause)yyVals[-2+yyTop];
			clause.Tail.Next = head;
			head = clause;
		}
		
		yyVal = head;
	  }
  break;
case 843:
#line 5502 "cs-parser.jay"
  {
	  	current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);
	  }
  break;
case 844:
#line 5506 "cs-parser.jay"
  {
		yyVal = new Linq.Select (current_block.Toplevel, (Expression)yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop]));

		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
	  }
  break;
case 845:
#line 5513 "cs-parser.jay"
  {
	  	if (linq_clause_blocks == null)
	  		linq_clause_blocks = new Stack ();
	  		
	  	current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);
	  	linq_clause_blocks.Push (current_block);
	  }
  break;
case 846:
#line 5521 "cs-parser.jay"
  {
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
	  
		current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);
	  }
  break;
case 847:
#line 5528 "cs-parser.jay"
  {
		yyVal = new Linq.GroupBy (current_block.Toplevel, (Expression)yyVals[-3+yyTop], (ToplevelBlock) linq_clause_blocks.Pop (), (Expression)yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop]));
		
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
	  }
  break;
case 851:
#line 5544 "cs-parser.jay"
  {
		((Linq.AQueryClause)yyVals[-1+yyTop]).Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop];
		yyVal = yyVals[-1+yyTop];
	  }
  break;
case 857:
#line 5560 "cs-parser.jay"
  {
	  	current_block = new Linq.QueryBlock (compiler, current_block, GetLocation (yyVals[-2+yyTop]));
	  }
  break;
case 858:
#line 5564 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-3+yyTop];
	  	yyVal = new Linq.Let (current_block.Toplevel, current_container, lt, (Expression)yyVals[0+yyTop]);
	  	
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
		
		((Linq.QueryBlock)current_block).AddTransparentParameter (lt);
	  }
  break;
case 859:
#line 5577 "cs-parser.jay"
  {
	  	current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);
	  }
  break;
case 860:
#line 5581 "cs-parser.jay"
  {
		yyVal = new Linq.Where (current_block.Toplevel, (Expression)yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop]));

		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
	  }
  break;
case 861:
#line 5591 "cs-parser.jay"
  {
		if (linq_clause_blocks == null)
			linq_clause_blocks = new Stack ();
	  		
		current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);
		linq_clause_blocks.Push (current_block);
	  }
  break;
case 862:
#line 5599 "cs-parser.jay"
  {
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;

		current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);
		linq_clause_blocks.Push (current_block);
	  }
  break;
case 863:
#line 5607 "cs-parser.jay"
  {
		current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop]));
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;

		current_block = new Linq.QueryBlock (compiler, current_block, (LocatedToken) yyVals[-7+yyTop], lexer.Location);
	  }
  break;
case 864:
#line 5615 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-10+yyTop];
		
		ToplevelBlock outer_selector = (ToplevelBlock) linq_clause_blocks.Pop ();
		ToplevelBlock block = (ToplevelBlock) linq_clause_blocks.Pop ();

		if (yyVals[0+yyTop] == null) {
	  		yyVal = new Linq.Join (block, lt, (Expression)yyVals[-7+yyTop], outer_selector, current_block.Toplevel, GetLocation (yyVals[-11+yyTop]));
		} else {
			yyVal = new Linq.GroupJoin (block, lt, (Expression)yyVals[-7+yyTop], outer_selector, current_block.Toplevel,
				(LocatedToken) yyVals[0+yyTop], GetLocation (yyVals[-11+yyTop]));
		}

		current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop]));
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
			
		if (yyVals[0+yyTop] == null)
			((Linq.QueryBlock)current_block).AddTransparentParameter (lt);
		else
			((Linq.QueryBlock)current_block).AddTransparentParameter ((LocatedToken) yyVals[0+yyTop]);
	  }
  break;
case 865:
#line 5638 "cs-parser.jay"
  {
		if (linq_clause_blocks == null)
			linq_clause_blocks = new Stack ();
	  		
		current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);
		linq_clause_blocks.Push (current_block);
	  }
  break;
case 866:
#line 5646 "cs-parser.jay"
  {
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;

		current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);
		linq_clause_blocks.Push (current_block);
	  }
  break;
case 867:
#line 5654 "cs-parser.jay"
  {
		current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop]));
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;

		current_block = new Linq.QueryBlock (compiler, current_block, (LocatedToken) yyVals[-7+yyTop], lexer.Location);
	  }
  break;
case 868:
#line 5662 "cs-parser.jay"
  {
		LocatedToken lt = (LocatedToken) yyVals[-10+yyTop];
		ToplevelBlock outer_selector = (ToplevelBlock) linq_clause_blocks.Pop ();
		ToplevelBlock block = (ToplevelBlock) linq_clause_blocks.Pop ();
		
		Linq.Cast cast = new Linq.Cast ((FullNamedExpression)yyVals[-11+yyTop], (Expression)yyVals[-7+yyTop]);
		if (yyVals[0+yyTop] == null) {
	  		yyVal = new Linq.Join (block, lt, cast, outer_selector, current_block.Toplevel, GetLocation (yyVals[-12+yyTop]));
		} else {
			yyVal = new Linq.GroupJoin (block, lt, cast, outer_selector, current_block.Toplevel,
				(LocatedToken) yyVals[0+yyTop], GetLocation (yyVals[-12+yyTop]));
		}
		
		current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop]));
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
			
		if (yyVals[0+yyTop] == null)
			((Linq.QueryBlock)current_block).AddTransparentParameter (lt);
		else
			((Linq.QueryBlock)current_block).AddTransparentParameter ((LocatedToken) yyVals[0+yyTop]);
	  }
  break;
case 870:
#line 5689 "cs-parser.jay"
  {
		yyVal = yyVals[0+yyTop];
	  }
  break;
case 871:
#line 5696 "cs-parser.jay"
  {
		current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);
	  }
  break;
case 872:
#line 5700 "cs-parser.jay"
  {
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
	  
		yyVal = yyVals[0+yyTop];
	  }
  break;
case 874:
#line 5711 "cs-parser.jay"
  {
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
	  
		current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);
	  }
  break;
case 875:
#line 5718 "cs-parser.jay"
  {
		((Linq.AQueryClause)yyVals[-3+yyTop]).Next = (Linq.AQueryClause)yyVals[0+yyTop];
		yyVal = yyVals[-3+yyTop];
	  }
  break;
case 877:
#line 5727 "cs-parser.jay"
  {
		current_block.SetEndLocation (lexer.Location);
		current_block = current_block.Parent;
	  
		current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location);	 
	 }
  break;
case 878:
#line 5734 "cs-parser.jay"
  {
		((Linq.AQueryClause)yyVals[-3+yyTop]).Tail.Next = (Linq.AQueryClause)yyVals[-1+yyTop];
		yyVal = yyVals[-3+yyTop];
	 }
  break;
case 879:
#line 5742 "cs-parser.jay"
  {
		yyVal = new Linq.OrderByAscending (current_block.Toplevel, (Expression)yyVals[0+yyTop]);	
	  }
  break;
case 880:
#line 5746 "cs-parser.jay"
  {
		yyVal = new Linq.OrderByAscending (current_block.Toplevel, (Expression)yyVals[-1+yyTop]);	
	  }
  break;
case 881:
#line 5750 "cs-parser.jay"
  {
		yyVal = new Linq.OrderByDescending (current_block.Toplevel, (Expression)yyVals[-1+yyTop]);	
	  }
  break;
case 882:
#line 5757 "cs-parser.jay"
  {
		yyVal = new Linq.ThenByAscending (current_block.Toplevel, (Expression)yyVals[0+yyTop]);	
	  }
  break;
case 883:
#line 5761 "cs-parser.jay"
  {
		yyVal = new Linq.ThenByAscending (current_block.Toplevel, (Expression)yyVals[-1+yyTop]);	
	  }
  break;
case 884:
#line 5765 "cs-parser.jay"
  {
		yyVal = new Linq.ThenByDescending (current_block.Toplevel, (Expression)yyVals[-1+yyTop]);	
	  }
  break;
case 886:
#line 5774 "cs-parser.jay"
  {
		/* query continuation block is not linked with query block but with block*/
		/* before. This means each query can use same range variable names for*/
		/* different identifiers.*/

		current_block.SetEndLocation (GetLocation (yyVals[-1+yyTop]));
		current_block = current_block.Parent;
		
		current_block = new Linq.QueryBlock (compiler, current_block, (LocatedToken) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop]));
	  }
  break;
case 887:
#line 5785 "cs-parser.jay"
  {
  		yyVal = new Linq.QueryExpression (current_block, (Linq.AQueryClause)yyVals[0+yyTop]);
	  }
  break;
case 890:
#line 5806 "cs-parser.jay"
  { 
	        Evaluator.LoadAliases (current_namespace);

		push_current_class (new Class (current_namespace, current_class, new MemberName ("Class" + class_count++),
			Modifiers.PUBLIC, null), null);

		ArrayList baseclass_list = new ArrayList ();
		baseclass_list.Add (new TypeExpression (Evaluator.InteractiveBaseClass, lexer.Location));
		current_container.AddBasesForPart (current_class, baseclass_list);

		/* (ref object retval)*/
		Parameter [] mpar = new Parameter [1];
		mpar [0] = new Parameter (TypeManager.system_object_expr, "$retval", Parameter.Modifier.REF, null, Location.Null);

		ParametersCompiled pars = new ParametersCompiled (mpar);
		current_local_parameters = pars;
		Method method = new Method (
			current_class,
			null, /* generic*/
			TypeManager.system_void_expr,
			Modifiers.PUBLIC | Modifiers.STATIC,
			new MemberName ("Host"),
			pars,
			null /* attributes */);

		oob_stack.Push (method);
	        ++lexer.parsing_block;
		start_block (lexer.Location);
	  }
  break;
case 891:
#line 5836 "cs-parser.jay"
  {
		--lexer.parsing_block;
		Method method = (Method) oob_stack.Pop ();

		method.Block = (ToplevelBlock) end_block(lexer.Location);
		current_container.AddMethod (method);

		--lexer.parsing_declaration;
		InteractiveResult = pop_current_class ();
		current_local_parameters = null;
	  }
  break;
case 892:
#line 5847 "cs-parser.jay"
  {
	        Evaluator.LoadAliases (current_namespace);
	  }
  break;
#line default
        }
        yyTop -= yyLen[yyN];
        yyState = yyStates[yyTop];
        int yyM = yyLhs[yyN];
        if (yyState == 0 && yyM == 0) {
          if (debug != null) debug.shift(0, yyFinal);
          yyState = yyFinal;
          if (yyToken < 0) {
            yyToken = yyLex.advance() ? yyLex.token() : 0;
            if (debug != null)
               debug.lex(yyState, yyToken,yyname(yyToken), yyLex.value());
          }
          if (yyToken == 0) {
            if (debug != null) debug.accept(yyVal);
            return yyVal;
          }
          goto continue_yyLoop;
        }
        if (((yyN = yyGindex[yyM]) != 0) && ((yyN += yyState) >= 0)
            && (yyN < yyTable.Length) && (yyCheck[yyN] == yyState))
          yyState = yyTable[yyN];
        else
          yyState = yyDgoto[yyM];
        if (debug != null) debug.shift(yyStates[yyTop], yyState);
	 goto continue_yyLoop;
      continue_yyDiscarded: continue;	// implements the named-loop continue: 'continue yyDiscarded'
      }
    continue_yyLoop: continue;		// implements the named-loop continue: 'continue yyLoop'
    }
  }

   static  short [] yyLhs  = {              -1,
    0,    0,    0,    0,    5,    0,    2,    2,    1,    1,
    6,    6,    6,   10,   10,    7,    7,   11,   11,    8,
    8,   12,   12,   13,   20,   16,   18,   18,   18,   21,
   21,   22,   22,   15,   24,   19,   23,   28,   23,   23,
   26,   26,   25,   25,   27,   27,   29,   29,    9,    9,
    9,    9,   30,   30,   30,   30,   30,    3,   17,   17,
   38,   38,   39,   39,   40,   42,   42,   42,   42,   41,
   41,   46,   43,   44,   45,   45,   47,   47,   47,   47,
   47,   48,   48,   49,   51,   52,   53,   53,   54,   54,
   55,   55,   55,   55,   55,   55,   55,   55,   55,   55,
   55,   66,   68,   71,   72,   34,   34,   74,   70,   73,
   73,   75,   75,   76,   76,   76,   76,   76,   76,   76,
   76,   76,   76,   56,   78,   78,   81,   79,   79,   80,
   80,   31,   31,   31,   86,   86,   87,   87,   88,   88,
   89,   89,   89,   90,   90,   90,   90,   90,   85,   85,
   96,   93,   93,   93,   91,   95,   95,  100,   32,  103,
  104,   98,  105,  106,   98,   98,   99,   99,  102,  102,
  109,  109,  109,  109,  109,  109,  109,  109,  109,  110,
  110,  113,  113,  113,  113,  114,  114,  116,  116,  117,
  117,  117,  111,  111,  111,  118,  118,  118,  112,  119,
  121,  122,   57,  120,  120,  120,  120,  120,  126,  123,
  127,  124,  125,  125,  125,  128,  129,  131,  132,   35,
   35,  130,  133,  133,  134,  134,  135,  135,  135,  135,
  135,  135,  135,  135,  135,  138,   60,  137,  137,  139,
  139,  142,  136,  136,  141,  141,  141,  141,  141,  141,
  141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
  141,  141,  141,  141,  141,  141,  144,  143,  145,  143,
  143,  143,   61,  148,  150,  146,  147,  147,  149,  149,
  154,  152,  155,  152,  152,  156,   62,   58,  158,  159,
   58,   58,  157,  157,  157,  157,  157,  157,  162,  160,
  160,  160,  163,  161,  161,  161,  165,  166,  167,   59,
  170,   36,  168,  168,  168,  172,  173,  169,  171,  171,
  174,  174,  175,  176,  175,  177,  178,  179,   37,  180,
  180,   14,   14,  181,  181,  184,  183,  183,  183,  185,
  185,  187,   65,   94,  101,  101,  164,  164,  188,  188,
  188,  186,  186,  189,  189,  190,  190,  192,  192,   84,
   77,   77,   92,   92,  115,  115,  140,  140,  193,  193,
  193,  193,  196,  196,  197,  197,  195,  195,  195,  195,
  195,  195,  195,  198,  198,  198,  198,  198,  198,  198,
  198,  198,  199,  199,  200,  200,  201,  201,  201,  201,
  201,  201,  201,  201,  201,  201,  201,  201,  201,  201,
  201,  201,  201,  201,  201,  201,  203,  203,  203,  203,
  203,  203,  223,  223,  223,  222,  221,  221,  224,  224,
  224,  204,  204,  206,  206,  206,  206,  206,  206,  206,
  207,  225,  225,  226,  226,  227,  227,  229,  229,  230,
  230,  230,  230,  230,  231,  231,  153,  153,  235,  235,
  235,  235,  235,  237,  237,  236,  236,  238,  238,  238,
  238,  238,  239,  208,  208,  208,  234,  234,  240,  240,
  241,  241,  209,  210,  210,  210,  211,  212,  213,  213,
  202,  202,  202,  202,  245,  242,  214,  246,  246,  247,
  247,  248,  248,  249,  249,  249,  249,  249,  243,  243,
  250,  250,  194,  194,  251,  251,  251,  252,  252,  244,
  244,   83,   83,  253,  253,  253,  254,  215,  255,  255,
  255,  256,  256,  256,  256,  256,  257,  182,  216,  217,
  218,  219,  259,  220,  258,  258,  261,  260,  205,  262,
  262,  262,  262,  264,  264,  263,  263,  263,  263,  263,
  263,  263,  265,  265,  265,  265,  266,  266,  266,  266,
  266,  266,  267,  267,  267,  268,  268,  268,  268,  268,
  269,  269,  269,  270,  270,  271,  271,  272,  272,  273,
  273,  274,  274,  275,  275,  276,  276,  277,  277,  277,
  277,  277,  277,  277,  277,  277,  277,  277,  278,  278,
  279,  279,  279,  280,  280,  282,  281,  281,  284,  283,
  285,  286,  283,   50,   50,  232,  232,  232,   82,  288,
  289,  290,  291,  292,   33,   64,   64,   63,   63,  107,
  107,  293,  293,  293,  293,  293,  293,  293,  293,  293,
  293,  293,  293,  293,  293,   67,   67,  294,   69,   69,
  295,  295,  296,  297,  297,  298,  298,  298,  298,  191,
  191,  299,  299,  301,  108,  302,  302,  303,  151,  300,
  300,  304,  304,  305,  305,  305,  309,  309,  310,  310,
  310,  307,  307,  307,  307,  307,  307,  307,  307,  307,
  307,  307,  307,  307,  311,  311,  311,  311,  311,  311,
  311,  311,  311,  311,  311,  311,  311,  325,  325,  325,
  312,  326,  308,  306,  306,  329,  329,  329,  330,  330,
  330,  330,  331,  331,  327,  328,  313,  313,  324,  324,
  332,  332,  333,  333,  314,  314,  334,  334,  336,  335,
  337,  338,  338,  339,  339,  342,  340,  341,  341,  343,
  343,  315,  315,  315,  315,  344,  345,  350,  346,  348,
  348,  352,  352,  349,  349,  351,  351,  354,  353,  353,
  347,  355,  347,  316,  316,  316,  316,  316,  316,  356,
  357,  358,  358,  358,  359,  360,  361,  361,  361,   97,
   97,  317,  317,  317,  317,  362,  362,  364,  364,  366,
  363,  365,  365,  367,  367,  318,  319,  368,  322,  370,
  323,  369,  369,  371,  371,  372,  320,  373,  321,  374,
  321,  287,  287,  375,  375,  377,  377,  379,  378,  380,
  378,  376,  384,  382,  385,  386,  382,  381,  381,  387,
  387,  388,  388,  388,  388,  388,  393,  389,  394,  390,
  395,  396,  397,  391,  399,  400,  401,  391,  398,  398,
  403,  392,  402,  406,  402,  405,  408,  405,  404,  404,
  404,  407,  407,  407,  383,  409,  383,    4,    4,  410,
    4,  412,    4,  411,  411,  411,  411,  233,  233,  228,
  228,
  };
   static  short [] yyLen = {           2,
    2,    3,    2,    1,    0,    3,    0,    1,    1,    2,
    1,    1,    1,    1,    2,    4,    2,    1,    2,    1,
    1,    5,    2,    3,    0,    6,    1,    3,    1,    0,
    1,    0,    1,    1,    0,    3,    4,    0,    3,    4,
    0,    1,    0,    1,    0,    1,    1,    2,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    0,    1,
    1,    2,    5,    4,    2,    1,    1,    1,    1,    1,
    3,    0,    3,    1,    0,    3,    0,    1,    1,    3,
    3,    1,    1,    3,    3,    3,    0,    1,    1,    2,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    0,    0,    0,    0,   13,    5,    0,    4,    0,
    1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    6,    1,    3,    0,    4,    1,    1,
    1,    5,    6,    5,    1,    3,    4,    3,    1,    3,
    3,    1,    2,    1,    1,    5,    1,    2,    1,    3,
    0,    4,    1,    2,    3,    1,    1,    0,    3,    0,
    0,   10,    0,    0,   11,    8,    1,    1,    0,    1,
    1,    3,    3,    3,    5,    3,    5,    1,    1,    1,
    3,    4,    6,    4,    6,    0,    1,    1,    2,    1,
    1,    1,    4,    6,    4,    1,    2,    2,    1,    0,
    0,    0,   10,    1,    2,    1,    2,    1,    0,    5,
    0,    5,    1,    1,    1,    0,    0,    0,    0,   13,
    5,    3,    0,    1,    1,    2,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    0,    5,    1,    1,    1,
    1,    0,    7,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    0,    7,    0,    7,
    2,    2,    2,    0,    0,    9,    1,    1,    0,    1,
    0,    6,    0,    6,    2,    0,    8,    6,    0,    0,
   10,    6,    2,    2,    1,    1,    1,    0,    0,    4,
    3,    3,    0,    4,    3,    3,    0,    0,    0,   13,
    0,    8,    0,    2,    2,    0,    0,    5,    0,    2,
    1,    3,    2,    0,    5,    0,    0,    0,   13,    0,
    1,    1,    3,    1,    4,    2,    0,    3,    2,    1,
    3,    0,    3,    1,    1,    3,    1,    2,    3,    4,
    4,    0,    3,    1,    3,    3,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    2,    2,    2,
    2,    2,    1,    3,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    2,    2,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    3,    3,    4,    4,    3,    3,    4,    3,    4,
    4,    0,    1,    3,    4,    0,    1,    1,    3,    3,
    1,    2,    3,    2,    1,    1,    0,    1,    1,    3,
    3,    2,    2,    1,    1,    1,    1,    2,    2,    4,
    3,    1,    1,    4,    4,    2,    1,    3,    1,    3,
    1,    1,    1,    4,    4,    2,    2,    2,    5,    2,
    6,    3,    3,    2,    0,    3,    4,    1,    2,    0,
    1,    1,    3,    3,    1,    4,    1,    1,    0,    1,
    1,    2,    1,    2,    2,    3,    3,    1,    2,    0,
    1,    2,    4,    1,    3,    1,    0,    5,    1,    1,
    1,    2,    3,    3,    4,    4,    1,    2,    4,    4,
    4,    3,    0,    4,    0,    1,    0,    4,    4,    1,
    2,    2,    1,    4,    4,    1,    2,    2,    2,    2,
    2,    2,    1,    3,    3,    3,    1,    3,    3,    3,
    3,    3,    1,    3,    3,    1,    3,    3,    3,    3,
    1,    3,    3,    1,    3,    1,    3,    1,    3,    1,
    3,    1,    3,    1,    3,    1,    5,    3,    3,    3,
    3,    3,    3,    3,    3,    3,    3,    3,    1,    3,
    3,    2,    1,    0,    1,    0,    2,    1,    0,    4,
    0,    0,    7,    1,    1,    1,    1,    1,    1,    1,
    0,    0,    0,    0,   13,    0,    1,    0,    1,    1,
    2,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    0,    1,    2,    0,    1,
    1,    2,    4,    1,    3,    1,    3,    1,    1,    0,
    1,    1,    1,    0,    4,    1,    1,    0,    4,    0,
    1,    1,    2,    1,    1,    1,    1,    2,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    0,    4,    2,    2,    2,    2,    2,    2,    2,
    2,    2,    1,    2,    2,    3,    2,    2,    2,    2,
    1,    1,    1,    1,    1,    1,    5,    7,    0,    6,
    3,    0,    1,    1,    2,    0,    3,    1,    2,    3,
    1,    1,    1,    1,    1,    5,    7,    0,   10,    0,
    1,    1,    1,    0,    1,    0,    1,    1,    1,    3,
    6,    0,    9,    1,    1,    1,    1,    1,    1,    2,
    2,    3,    4,    3,    3,    3,    4,    3,    3,    0,
    1,    3,    4,    5,    3,    1,    2,    0,    1,    0,
    4,    0,    1,    4,    2,    2,    2,    0,    3,    0,
    7,    1,    3,    3,    1,    0,    6,    0,    6,    0,
    6,    2,    2,    4,    5,    4,    5,    0,    5,    0,
    6,    3,    0,    3,    0,    0,    6,    0,    1,    1,
    2,    1,    1,    1,    1,    1,    0,    5,    0,    3,
    0,    0,    0,   12,    0,    0,    0,   13,    0,    2,
    0,    3,    1,    0,    4,    1,    0,    4,    1,    2,
    2,    1,    2,    2,    0,    0,    4,    2,    2,    0,
    4,    0,    3,    1,    2,    1,    0,    0,    1,    1,
    1,
  };
   static  short [] yyDefRed = {            0,
    8,    0,    0,    0,    0,  892,    0,    0,    0,    4,
    0,    5,    9,   11,   12,   13,   20,   21,   50,    0,
   49,   51,   52,   53,   54,   55,   56,   57,    0,   61,
  158,   23,    0,    0,    0,  332,    0,  334,   17,    0,
   69,   67,   68,    0,    0,    0,    0,    0,   70,   72,
  888,    0,    0,   18,    0,    1,    0,   10,    3,    0,
  647,  653,  645,    0,  642,  652,  646,  644,  643,  650,
  648,  649,  655,  651,  654,    0,    0,  640,   62,    0,
    0,    0,  538,  336,    0,   24,    0,    0,    0,    0,
    0,    0,   65,    0,  744,    0,  379,    0,  385,  392,
    0,    0,    0,  380,    0,    0,    0,  382,  428,    0,
  381,    0,    0,    0,    0,  388,    0,  390,    0,  422,
  377,    0,  384,  386,    0,  378,    0,  483,    0,  427,
    0,  527,  389,  391,    0,  818,  387,    0,    0,    0,
    0,    0,  674,    0,  721,    0,    0,    0,    0,    0,
    0,    0,    0,  426,  423,  424,  425,  420,  421,    0,
  621,    0,  743,  705,    0,    0,  383,    0,    0,    0,
    0,  397,    0,  401,  402,  403,  404,  405,  406,  407,
  408,  409,  410,  411,  412,  413,  414,  415,  416,  417,
  418,  419,  625,    0,  556,    0,  553,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  626,  624,
  627,  628,  689,  691,    0,  687,  690,  706,  708,  709,
  710,  711,  712,  713,  714,  715,  716,  717,  707,    0,
    0,  733,    0,    0,    0,  745,  746,  762,  763,  764,
  765,  784,  785,  786,  787,  788,  789,    0,    0,    0,
  896,  893,   19,    2,    6,   29,   27,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  358,  360,    0,    0,
  641,  168,  159,  167,  339,    0,  340,  361,    0,    0,
    0,  333,   16,    0,   71,   64,    0,   73,  486,    0,
    0,  790,  429,  431,  430,  816,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  400,    0,  791,    0,  547,
  543,  546,  742,  741,  692,  719,  718,  720,  693,  694,
  695,  696,  697,  698,  699,  700,  701,  702,  703,  704,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  394,    0,  801,    0,  393,
    0,    0,  749,    0,    0,    0,  817,    0,    0,    0,
  731,  510,  728,    0,    0,    0,    0,    0,    0,    0,
    0,  552,  557,  558,  551,  562,  561,  559,  560,    0,
    0,  619,  722,  399,  398,    0,    0,    0,  331,  730,
    0,  727,    0,    0,  487,  488,    0,    0,    0,  729,
  476,  726,    0,    0,  494,    0,    0,    0,    0,  490,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  899,  891,  688,  724,  725,  732,  734,
    0,    0,  139,  739,  740,  859,    0,    0,    0,  871,
  832,  852,    0,    0,  850,  853,  854,  855,  856,  833,
  895,    0,    0,    0,  342,    0,    0,  372,    0,  369,
  631,    0,    0,    0,  345,    0,  149,    0,    0,    0,
    0,    0,  371,  368,  370,  338,    0,   22,  335,   63,
    0,    0,   78,   79,   82,   83,    0,  481,  482,    0,
  479,    0,    0,    0,    0,  125,    0,    0,    0,    0,
  737,  738,    0,  772,  779,    0,  771,    0,    0,  629,
    0,  794,  792,  630,    0,    0,  508,    0,    0,    0,
    0,  498,    0,  502,    0,  515,  518,    0,    0,  493,
    0,  496,    0,  514,  795,    0,    0,  796,  805,    0,
    0,    0,  806,    0,    0,  819,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  682,  684,  685,  686,  432,
  433,    0,  799,  798,    0,    0,    0,  191,  190,  192,
    0,    0,    0,    0,  365,    0,  609,    0,    0,  436,
  512,    0,  439,    0,  437,  542,    0,    0,    0,    0,
  464,  467,    0,    0,  459,  466,  465,    0,    0,  563,
    0,    0,    0,  451,    0,    0,  448,    0,  477,    0,
  521,  492,    0,  598,  599,  600,  601,  602,  603,  604,
  605,  606,  608,  607,  564,  566,  565,  571,  572,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  595,    0,    0,    0,  143,    0,
    0,    0,    0,    0,    0,    0,    0,  843,  845,    0,
  851,   28,   35,    0,    0,    0,    0,  311,  134,    0,
    0,  135,    0,    0,  221,    0,  107,    0,    0,    0,
  132,  151,  154,  160,    0,    0,    0,  341,    0,    0,
   76,    0,  485,    0,  484,  540,  127,    0,  549,  199,
    0,    0,    0,  170,    0,    0,    0,  180,  544,    0,
    0,    0,  822,  768,    0,    0,    0,  793,    0,  826,
    0,    0,  497,    0,  517,  516,  519,  526,  522,  156,
  157,  524,    0,  539,    0,    0,  810,  813,  803,    0,
  807,  531,    0,    0,    0,  529,    0,    0,  541,  830,
  828,    0,  836,    0,  834,    0,  676,  677,  675,  683,
  555,  797,  618,  620,    0,  723,  612,    0,    0,    0,
  554,  440,  435,  438,  434,  473,  469,  468,    0,  463,
  441,    0,  474,  475,  454,    0,    0,  900,  901,  444,
    0,  452,    0,    0,    0,    0,    0,    0,  147,  144,
  145,  141,  140,  860,  838,    0,  861,    0,  857,    0,
  872,    0,    0,    0,    0,  842,    0,   31,   26,  326,
    0,  343,  315,  314,    0,    0,    0,  133,  163,  632,
  217,  103,  349,  150,  344,    0,    0,    0,    0,    0,
  346,   85,   84,   80,   81,  480,    0,  126,    0,    0,
    0,  188,    0,  548,    0,    0,    0,    0,    0,  820,
    0,    0,  780,    0,    0,    0,    0,    0,  504,  503,
    0,    0,    0,  815,    0,    0,  804,  537,  532,    0,
    0,  528,    0,    0,    0,  766,  837,  835,  617,  611,
  610,  622,  471,    0,  461,  460,  453,  455,  456,  450,
  445,  449,    0,  478,  489,  443,  597,  155,    0,    0,
  840,    0,  865,    0,  880,  881,  874,  844,  846,  886,
   38,   14,    0,   36,    0,    0,  357,    0,    0,  354,
  316,    0,  138,    0,  136,    0,    0,    0,    0,  152,
    0,    0,  350,  351,  128,  130,  131,  197,  198,    0,
  189,    0,    0,    0,  173,  181,  174,  176,    0,  824,
    0,  823,  775,    0,  781,    0,    0,  827,    0,  525,
  523,    0,  750,  809,    0,  811,    0,  533,    0,  831,
  829,    0,  470,  491,    0,  839,    0,    0,    0,  858,
    0,    0,    0,    0,   15,    0,    0,    0,  673,  672,
    0,  671,  353,    0,    0,  312,  137,    0,    0,    0,
  657,    0,    0,  161,  166,  184,    0,  195,    0,    0,
    0,  767,  821,    0,  782,  748,    0,  761,    0,    0,
  754,    0,  758,  814,  536,  535,  623,    0,  841,  862,
    0,    0,    0,  876,    0,  887,   39,   47,    0,    0,
  327,  356,  355,    0,  317,    0,  321,  164,  376,  375,
    0,  373,    0,  633,    0,  661,  218,  104,    0,    0,
    0,    0,  177,  175,    0,    0,  777,    0,    0,  751,
  755,    0,  759,  146,    0,  866,  883,  884,  877,  847,
   40,   37,   48,    0,    0,    0,    0,  320,    0,    0,
    0,    0,  662,    0,    0,  162,  183,  185,  194,    0,
  783,  760,    0,    0,    0,    0,  328,    0,  318,  322,
  165,  374,    0,    0,  634,    0,  219,  108,  105,  769,
  863,    0,  878,    0,    0,  668,    0,  669,  666,    0,
  664,  101,    0,  100,   92,   93,    0,    0,   89,   91,
   94,   95,   96,   97,   98,   99,    0,    0,    0,  235,
  228,  229,  227,  230,  231,  232,  233,  234,    0,    0,
  225,    0,    0,    0,    0,  867,  329,  325,    0,    0,
    0,   86,   90,  678,  278,  273,  277,  635,    0,  222,
  226,  220,  122,  115,  116,  114,  117,  118,  119,  120,
  121,  123,    0,    0,  112,  106,    0,    0,  667,  665,
    0,    0,    0,    0,    0,  286,    0,    0,  236,    0,
    0,  244,    0,  109,  113,    0,  864,    0,    0,    0,
  272,    0,  271,    0,    0,    0,  347,    0,    0,    0,
    0,    0,    0,  870,  868,    0,    0,    0,    0,    0,
    0,    0,    0,  307,  348,  239,  238,  237,  250,  249,
  246,  251,  252,  245,  264,  263,  256,  257,  253,  255,
  254,  258,  247,  248,  259,  260,  266,  265,  261,  262,
    0,  679,  124,  288,  292,  289,  269,  267,    0,    0,
  201,    0,  242,    0,    0,    0,    0,  275,    0,    0,
    0,  297,    0,  290,    0,    0,    0,    0,  287,    0,
  208,    0,  202,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  293,    0,  294,  270,  268,    0,  276,  280,
    0,    0,  205,  207,  308,  243,  301,    0,  305,    0,
  302,  306,  291,    0,    0,  285,    0,    0,  209,  211,
  203,    0,  300,  304,  281,  283,    0,    0,  309,    0,
    0,  215,  214,  213,  210,  212,    0,    0,    0,  310,
  282,  284,
  };
  protected static  short [] yyDgoto  = {             8,
    9,   10,   11,   12,   60,   13,   14,   15,   16,  943,
   55,   17,   18,  264,   35,   19,  721,  258,  684,  473,
  839,   92,  944,  837,  945, 1017, 1069, 1014, 1070,   21,
   22,   23,   24,   25,   26,   27,   28,  722,   30,   46,
   47,   48,   49,   50,  288,   94,  502,  503,  504,  314,
  612, 1145, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174,
 1175, 1176,   76,  265,  485,  698, 1030,  959, 1084, 1149,
 1125, 1194, 1223, 1193, 1224, 1225, 1080,  515,  516,  965,
  867,  531,  751, 1238,  486,  691,  692,  452,  453,  822,
  703,  552,  487,  488,  752,  856,  349,   31,  273,   80,
  489,  723,  857, 1089,  956, 1119,   77,  315,  724,  725,
  726,  727,  728,  870,  593,  871,  594,  873, 1273, 1333,
 1319, 1352, 1334, 1335, 1385, 1377, 1378,  696,  958, 1147,
 1124, 1192, 1189, 1190, 1191, 1239, 1278, 1261, 1240,  278,
 1301, 1321, 1242, 1316, 1315, 1177, 1206, 1256, 1349, 1330,
 1207, 1350,  613, 1380, 1381, 1255, 1324, 1314, 1341, 1325,
 1326, 1358, 1360, 1259, 1312, 1372, 1387,  688,  952,  845,
 1075, 1025, 1116, 1076, 1077, 1138,  946, 1114, 1154,  391,
   36,  165,   84,   38,  279,  842,  686,  492,  949,  950,
 1021,  268,  269,  362,  350, 1081, 1082,  167,  168,  169,
  351,  171,  172,  173,  174,  175,  176,  177,  178,  179,
  180,  181,  182,  183,  184,  185,  186,  187,  188,  189,
  190,  191,  192,  297,  925,  410,  625,  810,  626,  627,
  920,  193,  445,  630,  614,  615,  616,  617,  797,  510,
  511,  194,  363,  632,  344,  541,  542,  543,  544,  392,
  345,  548,  753,  356,  767,  768,  899,  311,  519,  312,
  518,  195,  196,  197,  198,  199,  200,  201,  202,  203,
  204,  205,  206,  207,  208,  209,  210,  596,  597,  598,
  784,  785,  211,  586,  386, 1002,  212,  535,  694,  957,
 1122, 1178,   78, 1031, 1085, 1086, 1160, 1161, 1022,  574,
  369,  779, 1243,  575,  576,  316,  317,  318,  215,  216,
  217,  319,  320,  321,  322,  323,  324,  325,  326,  327,
  328,  329,  330,  229,  331,  587,  230,  231,  232,  233,
  234,  332,  235,  236,  237,  557,  993, 1049, 1050, 1051,
 1052, 1102, 1053,  238,  239,  240,  241,  526,  984,  882,
 1095,  527,  528, 1097, 1098,  242,  243,  244,  245,  246,
  247,  562,  563,  995,  757,  896,  758,  359,  732,  981,
  733,  887,  905,  904,  248,  461,  249,  462,  930, 1007,
  463,  680,  836,  833,  834, 1012,  464,  465,  466,  467,
  468,  469,  934,  671,  932, 1105, 1195, 1247, 1009, 1135,
 1228,  831,  677,  832, 1063, 1011, 1064, 1136, 1013,   52,
  252,   53,
  };
  protected static  short [] yySindex = {         -199,
    0, -197, -178, -162, -122,    0, -195,    0,   45,    0,
  -41,    0,    0,    0,    0,    0,    0,    0,    0,12384,
    0,    0,    0,    0,    0,    0,    0,    0,  -17,    0,
    0,    0,  276,  -54,   -4,    0,  -10,    0,    0,   17,
    0,    0,    0,  -73,  -54,   92,   99,   16,    0,    0,
    0, 4615,  146,    0, -195,    0,  -41,    0,    0,  -41,
    0,    0,    0, -140,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,10670,12538,    0,    0,  211,
  712,   92,    0,    0,  136,    0,  182,  205,  -73,   99,
   92,  238,    0,  244,    0,  -62,    0,  260,    0,    0,
  311,10163,  274,    0,  223,  284, 4780,    0,    0,  223,
    0,  223,  223, -201,  223,    0,  223,    0,  346,    0,
    0, 9221,    0,    0,  223,    0,  223,    0, 9221,    0,
  304,    0,    0,    0,  311,    0,    0,  223,   58,  223,
 7982, 8139,    0, 9221,    0,10006,10006,10006,10006,10006,
10006,10006,10006,    0,    0,    0,    0,    0,    0,  251,
    0, 8296,    0,    0,  288,  178,    0,  321,  483,  159,
  367,    0,  376,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0, -100,    0,  960,    0,  666, -115, -187,
  415,  662,  454,  386,  472,  467,  305,  502,    0,    0,
    0,    0,    0,    0, 2314,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  543,
  551,    0,   63,  517, -267,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  608,  608,  146,
    0,    0,    0,    0,    0,    0,    0,  580, 8453,  545,
 8453,  561,  694,   75,  152, 2997,    0,    0,  374,  646,
    0,    0,    0,    0,    0,  561,    0,    0, -231,  -67,
  182,    0,    0,  652,    0,    0, 9378,    0,    0, 9535,
  620,    0,    0,    0,    0,    0, 9221,  223,  223,  677,
 9221,   -3,  646,  483,  449,    0,  651,    0, 8296,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  750, -256, 8453, 5770, 8296, 9221,  674,  745, 9221, 9221,
 6414, -211,  751, 8610,  677,    0,  163,    0,  761,    0,
  783, 8296,    0,  781,  515,  223,    0, 9221,  304, 9692,
    0,    0,    0, 9221,   20,  735,   28,  747, 4780,  -39,
  695,    0,    0,    0,    0,    0,    0,    0,    0,  789,
 8436,    0,    0,    0,    0,10720,  802,  182,    0,    0,
  677,    0,  371,  442,    0,    0,  760, 7965, 5275,    0,
    0,    0, 9535,10006,    0, 6249, 5440,  751, 7965,    0,
 9221, 9221, 9221, 9221, 9221, 9221, 9221, 9221, 9221, 9221,
 9221,10006,10006,10006, 8296, 8296,10006,10006,10006,10006,
10006,10006,10006,10006,10006,10006,10006,10006,10006,10006,
10006,10006, 9221,    0,    0,    0,    0,    0,    0,    0,
  184,  803,    0,    0,    0,    0, 8767, 8924,  768,    0,
    0,    0,  744,  608,    0,    0,    0,    0,    0,    0,
    0,  772,  828,  545,    0,  830, -125,    0,  786,    0,
    0,  943,  949,  -73,    0,  431,    0,  382,  837, 2997,
  791,  795,    0,    0,    0,    0, 8296,    0,    0,    0,
  194,  509,    0,    0,    0,    0,  202,    0,    0,  400,
    0,  182,  844,  838,  835,    0,  846,  207,  304,  223,
    0,    0,  800,    0,    0,  845,    0,  848, -232,    0,
  847,    0,    0,    0,  852,  854,    0,  -22,  359,    0,
  860,    0,  856,    0,  861,    0,    0,  494, 5605,    0,
  561,    0,  851,    0,    0,  867, 9221,    0,    0,  223,
  304,  124,    0, 5952,  868,    0,  869,  870,  872, 9221,
  936, 9221,  937, -300, 4780,    0,    0,    0,    0,    0,
    0,10006,    0,    0,  871,  304, 4780,    0,    0,    0,
  561,  -73,  825, 9081,    0,  875,    0,  882,10006,    0,
    0, -272,    0, -172,    0,    0, 9221, 9221,  223, 8122,
    0,    0,  883,  885,    0,    0,    0,  523,  566,    0,
  666, 8593,  293,    0, -255,  886,    0,  827,    0,  621,
    0,    0,  889,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  666,
  666, -115, -115, -187, -187, -187, -187,  415,  415,  662,
  454,  386,  472,  467,    0,  888, 9221, 8279,    0,  517,
 9221,   81,  863,  119,  864,  876, 9221,    0,    0,  906,
    0,    0,    0,  892,  894,  909, 6109,    0,    0,  903,
  532,    0,  905,  545,    0,  545,    0,  545,  908,  786,
    0,    0,    0,    0,  919,  182,  742,    0, 9221, 9221,
    0, 9378,    0, 9535,    0,    0,    0,  651,    0,    0,
  362,  -17,  921,    0,  920,  922,  923,    0,    0, 9221,
  914,  616,    0,    0, 5935, 9221, 1003,    0, 4780,    0,
  884, 8750,    0, 6414,    0,    0,    0,    0,    0,    0,
    0,    0,  928,    0,  931, 7825,    0,    0,    0,  304,
    0,    0,  123,  138,  891,    0,  933,  940,    0,    0,
    0, 4780,    0, 9221,    0, 9221,    0,    0,    0,    0,
    0,    0,    0,    0, 9221,    0,    0,  895,10720,  961,
    0,    0,    0,    0,    0,    0,    0,    0, 7808,    0,
    0, 8122,    0,    0,    0,  -87, 8907,    0,    0,    0,
 6092,    0,  677, 9221,  942, 9221,  948, 8610,    0,    0,
    0,    0,    0,    0,    0, 1024,    0, 1028,    0,  758,
    0,  952, 9221, 9221,  907,    0, -131,    0,    0,    0,
 -176,    0,    0,    0,  965, 9064,  915,    0,    0,    0,
    0,    0,    0,    0,    0, 8750,  207,  207,  963,  969,
    0,    0,    0,    0,    0,    0, 8750,    0,  362, 9081,
  341,    0, 8296,    0,  228, 1085, 1086,  974, 9221,    0,
  800, 9221,    0,  976, 9221, 1067, 4780,  182,    0,    0,
 8750,  982,  986,    0,  935,  304,    0,    0,    0,  956,
   -7,    0,  957, 4780, 4780,    0,    0,    0,    0,    0,
    0,    0,    0,  626,    0,    0,    0,    0,    0,    0,
    0,    0,  751,    0,    0,    0,    0,    0, 1009, 9221,
    0, 9221,    0, 9221,    0,    0,    0,    0,    0,    0,
    0,    0, 1019,    0, -195,  207,    0,  463,  391,    0,
    0,  892,    0, 1010,    0,  207, 1011, 1011, 1011,    0,
 1026, 1027,    0,    0,    0,    0,    0,    0,    0, -123,
    0, -119, 1029, 1036,    0,    0,    0,    0, 1025,    0,
 4780,    0,    0, 1035,    0, 1041, 4780,    0,    0,    0,
    0, -218,    0,    0, 1042,    0,   -7,    0,  977,    0,
    0,  304,    0,    0, 9221,    0, 9221, 1066, 9221,    0,
 9221, 1069,  608, 1055,    0, -195,  -17, 1052,    0,    0,
 1005,    0,    0, -176,  -17,    0,    0, 1054, 6431, 1087,
    0, 1087, 1087,    0,    0,    0,  432,    0, 1046, 1171,
 1172,    0,    0, 5935,    0,    0, 9221,    0, 1064, -218,
    0, -218,    0,    0,    0,    0,    0, 1068,    0,    0,
 1088,  806, 1060,    0, 9221,    0,    0,    0, -151,  -17,
    0,    0,    0, 1020,    0, 1079,    0,    0,    0,    0,
 1081,    0, 1038,    0, 1087,    0,    0,    0, 1087, 1089,
 9221, 9221,    0,    0, 1084,  848,    0, 4780, 1090,    0,
    0, 4780,    0,    0, 9221,    0,    0,    0,    0,    0,
    0,    0,    0, 1087,    0, 1092,  -17,    0, 1087, 6431,
 1091, 1096,    0, 1097, 1100,    0,    0,    0,    0, 4780,
    0,    0, 4780, 1118, 9221, 9221,    0, 1093,    0,    0,
    0,    0,10774, -128,    0,  -17,    0,    0,    0,    0,
    0, 1119,    0, 1095, 9221,    0, 1101,    0,    0, 1102,
    0,    0,12538,    0,    0,    0, 1107, -128,    0,    0,
    0,    0,    0,    0,    0,    0,  264,  892,12538,    0,
    0,    0,    0,    0,    0,    0,    0,    0, 1109,  -17,
    0,  892,  -17,  892, 9221,    0,    0,    0, 1106,10774,
10472,    0,    0,    0,    0,    0,    0,    0,10504,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0, 1111,  -17,    0,    0, 1122, 9221,    0,    0,
 8296, 8296, -105,  102,  561,    0,  -73, 1279,    0, 1174,
    0,    0, 4780,    0,    0, 1065,    0, 1122,  651,  786,
    0, 8296,    0, 8296, 1070, 1113,    0,  382, 1120, -215,
  455, 2051, 1128,    0,    0,  636,  645,   55, 1117, 1126,
 1127,  207, 1133,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 1132,    0,    0,    0,    0,    0,    0,    0, 1134, 1137,
    0,  207,    0, -112,  207,  207,  211,    0, -110, 1140,
  207,    0, 5860,    0,  -17,  -17, 1139, 1141,    0, 1143,
    0,12538,    0, -110, -110, 1145, 1142, 1257, 1262,12344,
 1155,12414,    0,12446,    0,    0,    0,  247,    0,    0,
  779, 1156,    0,    0,    0,    0,    0,  304,    0,  304,
    0,    0,    0,12476,12508,    0, 1157, 1176,    0,    0,
    0, -110,    0,    0,    0,    0, -142, -142,    0, 7965,
 7965,    0,    0,    0,    0,    0, 1158, 1173, 1177,    0,
    0,    0,
  };
  protected static  short [] yyRindex = {         2073,
    0,    0,    0,    0, 4945,    0,    0,    0, 2073,    0,
 1525,    0,    0,    0,    0,    0,    0,    0,    0,10578,
    0,    0,    0,    0,    0,    0,    0,    0, 1831,    0,
    0,    0,  450, 1178,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  601,  550,    0, 1185,    0,    0,    0,
    0,    0, 1917,    0,   37,    0, 1525,    0,    0, 1525,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  227,10231,    0,    0,    0,
    0,    0,    0,    0,    0,    0, 2441,    0, 2585, 1185,
 1186,    0,    0,  637,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0, 1190,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0, 9238,    0,
    0, 1183,    0,    0,    0,    0,    0,    0, 1183,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  115,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0, 3967,
    0,    0,    0,    0,    0,  -37,    0,    0, 3908, 4035,
 3676,    0, 3329,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0, 4121,    0, 4187,10884,11082,
11412,11610,11742,11874,12006,12138,12270, 4253,    0,    0,
    0,    0,    0,    0,   41,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0, 1144,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  818,  818, 1995,
    0,    0,    0,    0,    0,    0,    0, 1196,    0,    0,
    0,  481,  360, 2729,    0,    0,    0,    0, 2873, 2729,
    0,    0,    0,    0,    0, 2995,    0,    0,    0,    0,
 2441,    0,    0,    0,    0,    0,  675,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  115,
    0, 3097,  -37,    0,  457,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0, 1191,    0,    0,    0,    0,    0,    0,
 1200,    0,    0,    0, 2156,    0, 3097,    0,    0,    0,
 3792,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  451,    0,  451,    0, -156,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0, 1201,    0, 3097,    0,    0,
 1152,    0,    0,    0,    0,    0,    0, 1203,    0,    0,
    0,    0,    0,    0,    0,  -56,    0, 3444, 1203,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  574,  641,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  821,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0, 1209,    0,    0,    0,    0,
    0, 1160, 1162,  233,    0,    0,    0,  702,  611,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 7088,    0,    0,    0,    0,    0, 7032,    0,    0,    0,
    0, 3097,    0,  703, 1208,    0,    0,10554,    0,    0,
    0,    0,    0,    0,    0,    0,    0, 1210,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  701,  738,
    0,    0, 1217,    0,    0,    0,    0,    0,    0,    0,
 -177,    0,   25,    0,    0,    0,    0,    0,    0, 1222,
    0, 1569,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  -29,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0, 9849,    0,    0,    0,    0,
 -118,  474,    0,    0,    0, 1223,    0,    0,    0,    0,
    0, 3097,    0, 3097,    0,    0,    0,    0,  708,    0,
    0,    0,    0, 1224,    0,    0,    0,    0,    0,    0,
 4289,    0, 1392,    0,    0,  -23,    0,  471,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0, 4355,
 4457,10950,11016,11148,11214,11280,11346,11478,11544,11676,
11808,11940,12072,12204,    0,    0, 1227,    0,    0,    0,
    0,  451,    0,  451,    0,    0,    0,    0,    0, 4421,
    0,    0,    0, 1733,    0,  272,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0, 1221,  324,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 9395, 7239,    0,    0,  719,  729,  730,    0,    0,    0,
  736,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0, 1231,    0,    0,    0,    0,    0,    0,
    0,    0, 1232,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  527,  345,    0,    0,    0, 1233,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  752,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0, 3560,    0, 3213,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  577,
    0,  683,    0,    0,    0,    0, 6576,    0,    0,    0,
 -141,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,10554,10554,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0, 9552,    0,
 9709,    0,    0,    0, 6485,    0,    0,    0,    0,    0,
    0, 1228,    0,    0,    0, 1115,    0, 1148,    0,    0,
 1235,    0,    0,    0, 1237,    0,    0,    0,    0,    0,
  527,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0, 3444,    0,    0,    0,    0,    0,  592,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0, 6669,    0, 6762,10554,    0, 1193,    0,    0,
    0, 1349,    0,    0,    0,10554,   62,   62,   62,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  757,  764,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0, 1332,    0,
    0, 1242,    0,    0,    0,    0,  527,    0,  811,    0,
    0, 9849,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  818,    0,    0, 6855, 6948,    0,    0,    0,
    0,    0,    0, -141, -234,    0,    0,    0,    0, 1244,
    0, 1244, 1244,    0,    0,    0,  629,    0,  634,    0,
    0,    0,    0, 1243,    0,    0,    0,    0,    0, 1252,
    0, 5110,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  787,  934,    0,    0,    0,    0,    0,    0, 7031,
    0,    0,    0,    0,    0, 1232,    0,    0,    0,    0,
  262,    0,    0,    0,  475,    0,    0,    0,  496,    0,
    0,    0,    0,    0,    0, 1250,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0, 1249,  408,    0,   73,    0,  496,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0, -221,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0, 7338,    0, 7658,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  405,
    0,    0,10330,    0,    0,    0,    0, 7412,    0,    0,
    0,    0,    0,    0,    0,    0,    0, 1349,10398,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0, 7732,
    0, 1349, 7498, 1349,    0,    0,    0,    0,    0,    0,
  227,    0,    0,    0,    0,    0,    0,    0,  227,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0, 7572,    0,    0, 1006,    0,    0,    0,
    0,    0,    0,    0,  603,    0,  939,    0,    0,    0,
 1239,    0, 1259,    0,    0,    0,    0, 1006,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  460,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  702,    0,    0,
    0,10554,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,10646,    0, 5365,10554,10554,    0,    0,10886,    0,
10554,    0,    0,    0, 5530, 5695,    0,    0,    0,  498,
    0,  826,    0,10810,10842,    0,    0, 1264, 1269,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,10886,    0,    0,    0,    0,    0,    0,    0, 1203,
 1203,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,
  };
  protected static  short [] yyGindex = {            0,
 1582,  557,   51,    0,    0,   23, -781,   -2, -888,    0,
  693,    0,    0,   26,    0,    0,    1,    0,    0,    0,
 -912,  -82,    0,    0,    0,    0,    0,    0,    0, -560,
 -458, -447,    0,    0,    0,    0,    0,   42,  -15,    0,
 1593,    0, 1549,    0,    0,    0,    0,  929,  950,  -52,
 -214,    0,    0,    0,  479, -808, -710, -705, -703, -473,
 -465,-1074,-1130,    0, -222,    0,  225,    0, -693,    0,
    0,    0,    0,    0,    0,  419,  -20,  403,  945,    0,
    0, -828, -320,  -28,  414,    0,  808,    0,  998,    0,
 1218,  855,  975, -438, -608,    0, -107,    0,  357,    0,
 -464, -734,    0,    0,    0,    0, -263,  -46,    0,    0,
  801,  813,  814,    0, -567,    0, -658,  809,    0, -713,
    0,    0,    0,    0,  299,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  491,    0,    0,    0,    0,  -63,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0, -400,    0,    0,    0,    0,    0,    0,  366,
  368,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  578,    0,    0,    0,    0, -235,
    0,   67,   -5,    0,    0,  987,    0,  464,    0,  681,
    0, -290, -324,  -55,  598,    0,  586,    0, 1564,  -81,
  -16,    0,    0,  -50,    0, -316,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0, 1039,    0,   94,    0,    0,    0,  898,
    0, -382, 1082, 1098,  912, 1103,  910,    0, 1121,  638,
 1000,    0, -217,  794,    0,    0,    0,    0,  981, -124,
    0,    0,    0,    0,    0,    0, -833,    0,    0,    0,
    0,    0,   27,    0,  281,  767,  630,  766, 1282, 1283,
 1287, 1290, 1286,    0, 1292,    0,    0,    0,  946,    0,
  734,    0,    0,    0,    0,    0,    0, -346,    0,    0,
    0,    0,  -75,    0,    0,  647,    0,  537,    0,  495,
    0,    0,    0,  642, -556,  -48, -357,  -45,    0, 1524,
    0,   -8,    0,    5,   13,   22,   29,   31,   32,   38,
   53,   57,   60,    0, -646,    0,  289,    0, 1638,    0,
    0, -317,    0,    0,    0,    0,    0,    0,    0,  696,
    0,    0,  691,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  704,    0,    0,    0,    0,    0,    0,    0,
    0,    0, 1187,    0,    0,    0,    0,    0,    0,    0,
  866,    0,    0,    0,    0, -238,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0, 1281,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  505,    0,    0,
    0,    0,    0,    0,    0,    0,  614,    0,    0,    0,
    0,    0,
  };
  protected static  short [] yyTable = {           163,
   20,  271,  490,  213,   54,  164,  214,  284,  633,   20,
  470,  578,  267,   79,  693,  450,  525,  569,  780,  553,
  304,  354,  550,  628,  540,  705,  788,   34,  480,   45,
  786,   58, 1201,  274,  495,  170,  889,  476,  966, 1026,
  898,   29,  523,  218,  545,  402,  757,  266, 1209, 1047,
   29,  306,  253,   20,  296,  942,  219,    1,   32,   57,
  277,  736,  872,  343,  220,  777,  336,  998,   37,  348,
   37,   45,  506,  221,  337,  509,  348,   39,  364,  947,
  222,  282,  223,  224,  355,  305,   81,  631,  357,  225,
  170,  370,  886,   41,   29,  306,  306,  306,  306,  306,
  306,  306,  306,  251,  226, 1111,  454,  280,  227, 1275,
  808,  228,   37, 1382,  401,  256,   45,  521, 1222,   42,
  366,  368,  961,  962,  941,  906,  778, 1162, 1068,  496,
  689,  319, 1036,  889,   51,    2, 1038,  366,  408,    2,
  497,  387,   37, 1322,  757, 1331,  425,   37,   37, 1222,
 1251,   43,   59,  792,  385,  405,  546,   37,    3,  455,
  547, 1015,  163, 1055,   59, 1056,  213,    4,  164,  214,
  522,  809,  372,  373,  374,  375,  376,  377,  378,  379,
  402, 1113,  426,   59,  509,  737,   81,  364,  509,  364,
    4,  364,  364,  289,  364,  267,  364,  267,  170, 1252,
  757, 1351,  707, 1048,  429,  430,  218,   37,   37,  680,
  968, 1018,  971,  494, 1112,    1,  338,  578, 1099,  219,
   33, 1028,  143,    5,    6,    7,    3,  220,   37,  578,
  474, 1383,  477,  289,  505,  855,  221,  508,    4,   40,
  988,  364,  364,  222,  513,  223,  224,  960,  370,  401,
   20,  685,  225,  794,    4,   44,    4, 1000, 1001,  304,
  427,  428, 1128, 1129,  406, 1208,  407,  226,  293,  267,
  680,  227,   58,  766,  228,  499,   59,  257,  917, 1212,
  363, 1226,  990,  530,  814,   81,  534,  536,  517,  554,
  306,   29,  690,  889, 1037,  401,  385,  898, 1039,  366,
  471,    1,  970,   85,  290,  565,  498,  567,  291,  446,
 1305,  534,  566,  570,  529,   83,   85,  170,  294,  295,
  577,  572,  595,  579,  824,   37, 1198,   37,  585,  330,
  580,  556,  491,  393, 1043,  601,  681, 1183, 1087, 1088,
 1046,  385,  447,  170,  290,  611,  508,  821,  741,    4,
  508,   81,  170,  306,  629,   81,  611, 1253,  634,  635,
  636,  637,  638,  639,  640,  641,  642,  643,  644,   86,
  446,  306,  306,  306,  825,   37,  306,  306,   81,    2,
  330, 1183,  600,  878, 1216,   83,   81,  581,   93,  363,
  666,  363,  560,  363,  363, 1126,  363,  681,  363,   37,
  656,   37,    3,  447,  648,  649, 1254,   87,   83,  760,
   37,    4,  827,  898,  271, 1216,   83,  883,   37, 1306,
 1137,  667,  384,  481,  342, 1141,  656,  540,  628,  342,
  620,  389,  620,  702,   88, 1184,  673,  675,   33,   81,
 1185,  361, 1186,  363,  363,   85,  449,  482,  645,  646,
  647, 1131,   37,  620,  620,  620,  620,  620,  620,  620,
  620,  620,  620,  620,  620,  620,  620,  620,  620,   83,
   91,  850,  729,  851,  483,  852,  708,   81,  699, 1184,
    2,   81, 1217, 1150, 1185,  394, 1186, 1218,  342, 1219,
   59,   37,   37,  553,  389,  385,  750,  506,  636,  509,
  267,  385, 1366,    3,  755,  382,  715,   83,  900,   89,
 1367,   83,    4, 1217,  759,  389,  380,  773, 1218,  775,
 1219,   81,  636,   37,   37,  399,  577,  352,  480,  579,
  595,  306,  509,  385,  389,  983,  382, 1310,  577,  783,
   81,  579,  400,  898,  382,  491,  967,  720,  306,  636,
  667,   83,   81,  281,  796,  796,  491,  611,  170,  817,
   81,  390,  668,   37,  381,   56,  709,   59,  973,  629,
  170, 1368,  710,    4,  709,  143,  780, 1320,  283,  352,
 1327, 1328,   83, 1164,  272, 1180, 1337,  915,  384,  764,
   83,  293,  342,  382,    4,  923,  793,  342,  795,  342,
  658,  342,  631,  337,  342,  286,  342, 1164,  781,   81,
  352,  342,  287,  254,  348,  820,  255,  385,  534,  384,
 1353, 1354,  524,  383,  830,  791,  658,  384, 1204, 1180,
  765,  637, 1213,  292,   81,  382,  352, 1205,  352,   83,
  352,  294,  295,  352,  352,  352,  588,  308,  568,  166,
  352,   81,  310,  589,   82,  637,  862,  863, 1379,  505,
   37,  508,  304, 1213,   83,  590,  844,  588,  143,  869,
  892,  807, 1187,  270,  589,  143,  384,  534,  270,  293,
 1188,   83,  637,  884,  621, 1165,  590, 1181,  352,  750,
  352,  393,  352,  306,  337,  352, 1166,  352, 1182,  303,
  859,  860,  352,  441,  166,  388,   79,  650,  651, 1165,
  341,  330,  342,  897,  330,  442, 1187,   81,  384, 1220,
 1166,  907,  170,  908, 1188,  595,  525, 1221,  330,  294,
  295, 1181,  909,  403, 1214,  895,  359,  742,  270,  270,
  342,  359, 1182,  663,  578, 1215,  611,   83,  667,  611,
 1220, 1023,  404,   37,  918,  170, 1019,  493, 1221,  270,
  702,  924, 1024,  927,  359, 1214,  491,  713, 1020,  663,
  559,  714,  438,  323, 1066,  578, 1215,  359,  663,  323,
  938,  939,  359,  560,  384,  855,  324,  359,  602,  359,
  359,  359,  359,  954,  431,  432,  603,  359, 1090, 1258,
  561,  359,  700,  750,  701,  389,  595,  337,  433,  434,
 1091, 1268,  166,  359,  530,  399,  359,  337,  359,  143,
  337,  337,   37,  337,  200,  395,  980,  395, 1276,  534,
  337,  153,  986,  153,  337,  437,  898,  620,  750,  660,
  337,  948,  898,  613,  337,  613,  395,  395,  660,  996,
  359,  293,  972,  394,  439,   37,  270,  337,  270,  604,
  659,  746,  279,  359,  440,  747,  395,  605,  337,  659,
  170,  279,  395,  396,  330,  395,  395, 1006,  711, 1008,
  712, 1010,  989,  337,   37,  578,  359,  170,  170,  443,
  803,  337,  397,  337,  714,  282,  337,  337,  359,  359,
  919,  294,  295,  847,  359,  848,  270,  241,  926,  359,
  337,  359,  359,  359,  359,  879,  447,   74,   74,  359,
  879,   74,  879,  359,  448,  879,  879,  359,  879,  879,
  270,  166,  270,  804,  451,  359,   37,  714,  359,   37,
  359,  270,   54,  142,  478,  142,  456,  142,  879,  270,
  472,  457, 1058,  458, 1059,  783, 1061,  166, 1062,  459,
  460,  148,  475,  148,  170,  148,  166,  275,  337,  337,
  170,  337,  337,   66,  490,  344,   97,  344,   99, 1388,
 1389,  100,  344,  270,  344,  880,  104,  881,  813,  344,
  108,  499,  814, 1118,  530, 1003,  182,  802,  182,  111,
  182,  193,  389,  193,   75,  193,  116,  718,   75, 1303,
  735,  118, 1110,  253,  735,  121,  700,   20, 1304,  500,
  359,  873,  270,  270,  948, 1074,  873,  123,  873,  124,
  479,  873,  873,  126,  873,  873,  618,  512,  530,  530,
  619,  133,  134,  342,   77,  137,   77,  532,  276,  422,
  423,  424, 1134,  577,  270,  270,  579,  435,  436, 1340,
  654,  655,  656,  657,  582,  393,  505,  337,  514,  337,
   20,  337,  505,  153,  129,  153,  129,  472, 1364,  472,
 1365,  170, 1152, 1062,  577,  170,  171,  579,  171,  520,
  337,  337,  678,  679,  270,   37,  178,  179,  178,  179,
   81,  841,  530,  507,  402,  825,  402,  825,  402,  507,
  337,  935,  936,  170,  747,  549,  170, 1074,  533,  337,
  337,  462, 1159,  462,  199,  882,  199,  402,  402,   89,
  882,  172,  882,  172,  555,  882,  882, 1241,  882,  882,
 1369, 1370, 1227,  309, 1163, 1241, 1179,  402,  333,  399,
  334,  335,  571,  339,  558,  340,  402,  402,  882, 1107,
 1108,  270,  583,  352,  573,  353,  848,  848, 1163,  849,
  849,  599,  166,  358,  670, 1248,  360,  606,  364, 1159,
  534,  534, 1032, 1033,  166,  676,   37,  638,  638,  682,
 1179,  270,  683, 1163,  577,  652,  653,  579,  695,  337,
  658,  659,  687,  484,  697,  704,  718,  398,  706,   37,
 1249, 1250,  707,  716, 1277,  719,  717,  731,  734,  735,
  738,  739,  337,  740, 1163,  743,  170,  744,  745,  774,
  776, 1269,  409, 1270,  493,  337,  754,  769,  770,  771,
  337,  772,  787,  337,  782,  337,  789,  337,  337,  337,
  337,  790,  801,  444,  829,  337,  802,  811,  815,  337,
  816,  835,  840,  337,  271,  838,   37,   37,  841,  846,
  274,  337,  875,  849,  337,   37,  337,  875,  853,  875,
  826,  828,  875,  875,  270,  875,  875,  858,  271,  271,
  874,  875,  879,  876,  877,  337,  885,   37,   37,  891,
  893,  888,  902,  912,  491,  337,  406,  274,  901,  337,
  903, 1373,  910, 1374, 1323,  928,  491,  931,   37, 1332,
   37,  933,  337,  937,  940, 1342, 1344,  611,  611,  951,
 1384, 1384,  690,  963, 1332, 1332,  166,  358,  411,  964,
  977,  978,  398,  979,  869,  985,  987,  991,   30,  869,
  992,  869,  994,  270,  869,  869,  337,  869,  869,  412,
  413,  414,  415,  416,  417,  418,  419,  420,  421,  166,
  747,  747, 1332,  997,  999, 1005,    3, 1027,  747,  747,
  747,  747,  747, 1029,  747,  747,  270,  747,  747,  747,
  747,  747,  747,  747,  564, 1034, 1035,  898, 1042,  747,
 1040,  747,  747,  747,  747,  747,  747, 1041, 1044,  747,
 1045, 1054, 1060,  747,  747,  270,  747,  747,  747, 1065,
 1067, 1071, 1072, 1078, 1092, 1083, 1093, 1094,  747, 1100,
  747, 1109,  747,  747, 1106, 1104,  747, 1115,  747,  747,
  747,  747,  747,  747,  747,  747,  747,  747,  747,  747,
 1117,  747, 1120, 1130,  747, 1121, 1127, 1139,  747,  747,
 1144, 1146, 1132, 1143, 1148, 1151, 1196,  270, 1197, 1199,
  270, 1155, 1202, 1200, 1210, 1229, 1244, 1246, 1262,  747,
  747, 1272, 1264,  747,  166, 1307, 1274, 1271,  747,  747,
  747,  747,  747, 1302, 1308, 1309,  747, 1311,  747,  358,
 1313,  166,  166, 1317,  747,  747, 1318, 1336, 1346, 1355,
 1347, 1356, 1357,  337,  337, 1348,  337, 1359,  337,  337,
 1363, 1371,  358, 1390,    7, 1375,  747,  747,  747,  747,
  747,  747,  747,  747,  747,  358,  747,  337,  337,   61,
  358,  747, 1391,  240, 1376,  358, 1392,  358,  358,  358,
  358,   34,   32,   33,  545,  358,  800,  337,  730,  358,
   25,  509,   62,  358,  770,  500,  337,  337,  802,  511,
  614,  358,  457,  313,  358,   63,  358,  216,  166,  102,
   65,  736,  501,  773,  166,   66,  812,   67,   68,   69,
   70,  337,  615,  458,  800,   71,  499,   32,  756,   72,
   33,  774,  530, 1257,   30,   30,  808,  752,  659,   30,
  670,   73,  776,   30,   74,   30,   75,  753,   30,  778,
   30,   30,  659,   30,  680,   30,  270,   30,  299,   30,
   30,   30,   30,  303,  250,   30,   30, 1016,   90,  285,
  864,   30, 1245,   30,   30,   30, 1203,  799,   30,   30,
   30, 1266,   30,  337,  955,   30,  358,   30,   30,   30,
   30,  865,  868, 1267,   30,   30,   30,  823,  669,   30,
   30,   30,  929, 1329,  854,  974, 1386,  969,   30,   30,
 1211,   30,   30,   30,   30,   30,   30,  975,  976,  337,
   30, 1345, 1343,  861, 1140,  166,  484,  506,  484,  166,
  484, 1260,  484,  506, 1073, 1142,   30,  371,  922,  812,
  914,  916,  800,  866,   30,   30, 1004,  270,  660,  806,
  661,  484,  484,   30,  890,  662,  664,  166,  798,  663,
  166, 1123,   30,  665,  911, 1057, 1230, 1263,  446,  307,
  270,  484, 1103, 1133,  681, 1101,  982, 1096,  761, 1153,
  484,  484, 1265,    0,    0,    0,    0,  337,  337,    0,
  337,    0,  337,  337,    0,    0,   30,  337,  337,    0,
    0,  337,  337,  337,  337,  337,  337,  337,  337,  337,
    0,  337,  337,  337,  337,  337,  337,  337,  337,  337,
  337,    0,    0,    0,    0,    0,    0,  270,  270,    0,
    0,  337,  337,    0,    0,    0,  270,    0,    0,    0,
  337,  337,    0,    0,    0,    0,    0,    0,  337,    0,
    0,    0,    0,    0,  802,  802,    0,    0,  270,  270,
   58,    0,  802,  802,  802,  802,  802,    0,  802,  802,
  166,  802,  802,  802,  802,  802,  802,  802,  802,  270,
    0,  270,    0,  802,    0,  802,  802,  802,  802,  802,
  802,    0,    0,  802,    0,    0,    0,  802,  802,    0,
  802,  802,  802,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  802,    0,  802,    0,  802,  802,    0,    0,
  802,    0,  802,  802,  802,  802,  802,  802,  802,  802,
  802,  802,  802,  802,    0,  802,    0,    0,  802,    0,
    0,    0,  802,  802,    0,    0,  897,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  802,  802,    0,    0,  802,    0,    0,
    0,    0,  802,  802,  802,  802,  802,    0,    0,    0,
  802,    0,  802,    0,    0,    0,    0,    0,  802,  802,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  802,  802,  802,  802,  802,  802,  802,  802,  802,   30,
  802,    0,    0,   30,  894,  802,    0,   30,    0,   30,
    0,    0,   30,    0,   30,    0,    0,   30,    0,   30,
    0,   30,    0,   30,    0,    0,   30,    0,    0,   30,
   30,    0,    0,    0,    0,    0,    0,   30,   30,   30,
    0,    0,   30,   30,   30,    0,   30,    0,    0,   30,
    0,   30,   30,   30,   30,    0,    0,    0,   30,   30,
   30,    0,    0,   30,   30,   30,    0,    0,    0,    0,
    0,    0,   30,   30,    0,   30,   30,   30,   30,   30,
   30,    0,    7,    0,   30,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,   58,    0,    0,
   30,   60,    0,    0,    0,   60,    0,   60,   30,   30,
   60,    0,   60,    0,    0,   60,    0,   60,    0,   60,
    0,   60,    0,    0,   60,    0,    0,   60,   60,    0,
    0,    0,    0,    0,    0,   60,   60,   60,    0,    0,
   60,   60,   60,    0,   60,    0,    0,   60,    0,   60,
   60,   60,   60,    0,    0,    0,   60,   60,   60,    0,
   30,   60,   60,   60,    0,    0,    0,    0,    0,    0,
   60,   60,    0,   60,   60,    0,   60,   60,   60,    0,
    0,    0,   60,  897,    0,    0,    0,   59,    0,    0,
    0,   59,    0,   59,    0,    0,   59,    0,   59,    0,
    0,   59,    0,   59,    0,   59,    0,   59,    0,    0,
   59,    0,    0,   59,   59,    0,    0,    0,    0,    0,
    0,   59,   59,   59,    0,    0,   59,   59,   59,    0,
   59,    0,    0,   59,    0,   59,   59,   59,   59,    0,
    0,    0,   59,   59,   59,    0,    0,   59,   59,   59,
    0,    0,    0,    0,    0,    0,   59,   59,   60,   59,
   59,  894,   59,   59,   59,   59,    0,    0,   59,   59,
    0,   59,    0,    0,   59,    0,   59,    0,    0,   59,
    0,   59,    0,   59,    0,   59,    0,    0,   59,    0,
    0,   59,   59,    0,    0,    0,    0,    0,    0,   59,
   59,   59,    0,    0,   59,   59,   59,    0,   59,    0,
    0,   59,    0,   59,   59,   59,   59,    0,    0,    0,
   59,   59,   59,    0,    0,   59,   59,   59,    0,    0,
    0,    0,    0,    0,   59,   59,    0,   59,   59,    0,
   59,   59,   59,   59,   59, 1279,   59,   59,    0,   59,
    0,    0,   59,    0,   59,    0,    0,   59,    0,   59,
    0,   59,    0,   59,    0,    0,   59,    0,    0,   59,
   59,    0,    0,    0,    0,    0,    0,   59,   59,   59,
    0,    0,   59,   59,   59,    0,   59, 1280,    0,   59,
    0,   59,   59,   59,   59,    0,    0,    0,   59,   59,
   59,    0,    0,   59,   59,   59,    0,    0,    0,    0,
    0,    0,   59,   59,    0,   59,   59,    0,   59,   59,
   59,  513,   59,    0,   59,    0,  513,  513,    0,    0,
    0,    0,    0,    0,    0, 1281, 1282, 1283, 1284,    0,
 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292,    0,  513,
 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300,    0,  513,
    0,    0,  513,  513,    0,    0,    0,  513,    0,    0,
  513,    0,  513,    0,  513,  513,  513,  513,    0,    0,
    0,    0,  513,    0,    0,    0,  513,    0,    0,    0,
  513,    0,    0,    0,    0,    0,    0,    0,  513,    0,
   59,  513,    0,  513,  513,    0,    0,    0,    0,  513,
    0,  513,  513,  513,  513,  513,  513,  513,  513,  513,
  513,  513,  513,    0,    0,    0,  513,    0,    0,    0,
  513,  513,    0,  513,  513,  513,  513,  513,  513,  513,
    0,  513,  513,    0,  513,  513,  513,  513,  513,  513,
  513,  513,  513,  513,    0,  513,  513,  513,  513,  513,
  513,  513,  513,  513,  513,  513,  513,  513,  513,  513,
  513,  513,  513,  513,  513,  513,  513,    0,    0,   95,
    0,    0,    0,  513,  513,  513,    0,   96,   97,   98,
   99,    0,  513,  100,  101,    0,  102,  103,  104,  105,
  106,  107,  108,    0,    0,    0,    0,    0,  109,    0,
  110,  111,  112,  113,  114,  115,    0,    0,  116,    0,
    0,    0,  117,  118,    0,  119,  120,  121,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  122,    0,  123,
    0,  124,  125,    0,    0,  126,    0,  127,  128,  129,
  130,  131,  132,  133,  134,  135,  136,  137,  138,    0,
  139,    0,    0,  140,    0,    0,    0,  141,  142,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  143,    0,
    0,    0,  144,    0,    0,    0,    0,  145,  146,  147,
  148,  149,    0,    0,    0,  150,  337,  151,    0,    0,
    0,  337,  337,  152,  153,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  337,  154,  155,  156,  157,  158,
  159,  160,  161,  162,  337,    0,    0,  337,  337,    0,
  444,    0,  337,    0,    0,  337,    0,  337,    0,  337,
  337,  337,  337,    0,    0,    0,    0,  337,    0,    0,
    0,  337,    0,    0,    0,  337,    0,    0,    0,    0,
    0,    0,    0,  337,    0,    0,  337,    0,  337,  337,
    0,    0,    0,    0,  337,    0,  337,  337,  337,  337,
  337,  337,  337,  337,  337,  337,  337,  337,    0,    0,
    0,  337,    0,    0,    0,  337,  337,  337,  337,  337,
  337,  337,  337,  337,  337,    0,  337,  337,    0,    0,
  337,  337,  337,  337,  337,    0,    0,  337,  337,    0,
    0,    0,  337,  337,  337,  337,  337,  337,  337,  337,
  337,    0,    0,    0,    0,  337,  337,    0,    0,    0,
    0,  337,    0,    0,    0,    0,    0,    0,  337,  337,
  337,    0,    0,    0,    0,    0,    0,  337,  337,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  337,    0,
    0,  337,  337,    0,    0,    0,  337,    0,    0,    0,
    0,  337,    0,  337,  337,  337,  337,    0,    0,    0,
    0,  337,    0,    0,    0,  337,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  337,    0,    0,
  337,    0,  337,  337,    0,    0,    0,    0,  337,    0,
  337,  337,  337,  337,  337,  337,  337,  337,  337,  337,
  337,  337,    0,    0,    0,  337,    0,    0,    0,  337,
  337,  337,  337,  337,  337,  337,  337,  337,  337,    0,
  337,  337,    0,    0,  337,  337,  337,  337,  337,    0,
    0,  337,  337,    0,    0,    0,  337,  337,  337,  337,
  337,  337,  337,  337,  330,    0,    0,    0,    0,  330,
  330,    0,    0,    0,    0,  337,    0,    0,    0,    0,
    0,    0,  337,  337,  337,    0,    0,    0,    0,    0,
    0,  337,  330,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  330,    0,    0,  330,  330,    0,    0,    0,
  330,    0,    0,  330,    0,  330,    0,  330,  330,  330,
  330,    0,    0,    0,    0,  330,    0,    0,    0,  330,
    0,    0,    0,  330,    0,    0,    0,    0,    0,    0,
    0,  330,    0,    0,  330,    0,  330,  330,    0,    0,
    0,    0,  330,    0,  330,  330,  330,  330,  330,  330,
  330,  330,  330,  330,  330,    0,    0,    0,    0,  330,
    0,    0,    0,  330,  330,  330,  330,  330,  330,    0,
  330,  330,  330,    0,  330,  330,    0,    0,  330,  330,
  330,  330,  330,    0,    0,  330,  330,    0,    0,    0,
  330,  330,  330,  330,  330,  330,  330,  330,  367,    0,
    0,    0,    0,  367,  367,    0,    0,    0,    0,  330,
    0,    0,    0,    0,    0,    0,  330,  330,  330,    0,
    0,    0,    0,    0,    0,  330,  367,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  367,    0,    0,  367,
  367,    0,    0,    0,  367,    0,    0,  367,    0,  367,
    0,  367,  367,  367,  367,    0,    0,    0,    0,  367,
    0,    0,    0,  367,    0,    0,    0,  367,    0,    0,
    0,    0,    0,    0,    0,  367,    0,    0,  367,    0,
  367,  367,    0,    0,    0,    0,  367,    0,  367,  367,
  367,  367,  367,  367,  367,  367,  367,  367,  367,    0,
    0,    0,    0,  367,    0,    0,    0,  367,  367,    0,
  367,  367,  367,    0,  367,  367,  367,    0,  367,  367,
  362,    0,  367,  367,  367,  367,  362,   61,    0,  367,
  367,    0,    0,    0,  367,  367,  367,  367,  367,  367,
  367,  367,    0,    0,    0,    0,    0,    0,    0,    0,
   62,    0,    0,  367,    0,    0,    0,    0,  362,    0,
  367,    0,  362,   63,    0,    0,    0,    0,   65,  367,
    0,    0,    0,   66,    0,   67,   68,   69,   70,    0,
    0,    0,    0,   71,    0,    0,    0,   72,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,   73,
    0,    0,   74,  362,   75,    0,    0,    0,  362,    0,
  362,  362,  362,  362,  362,  362,  362,  362,  362,  362,
  362,    0,    0,    0,    0,  362,    0,    0,  337,  362,
  362,    0,  362,  362,  362,    0,  362,  362,  362,    0,
  362,  362,    0,    0,  362,  362,  362,  362,    0,    0,
    0,  362,  362,    0,    0,    0,  362,  362,  362,  362,
  362,  362,  362,  362,  337,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  362,    0,    0,    0,    0,
    0,    0,  362,    0,  484,    0,    0,    0,    0,    0,
    0,  362,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  337,    0,    0,    0,    0,
  337,    0,  337,  337,  337,  337,  337,  337,  337,  337,
  337,  337,  337,  337,    0,    0,    0,    0,    0,    0,
    0,    0,  337,  337,  337,  337,  337,  337,  337,  337,
  337,    0,  337,  337,  442,  337,  337,  337,  337,  337,
  337,  337,  337,  337,  337,    0,  337,  337,  337,  337,
  337,  337,  337,  337,  337,  337,  337,  337,  337,  337,
  337,  337,  337,  337,  337,  337,  337,  337,    0,    0,
  442,    0,    0,    0,  337,  337,  337,    0,    0,    0,
    0,    0,    0,  337,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  442,    0,    0,    0,    0,  442,    0,  442,  442,
  442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
    0,    0,    0,    0,    0,    0,    0,    0,  442,  442,
  442,  442,  442,  442,  442,  442,  442,    0,  442,  442,
  400,  442,  442,  442,  442,  442,  442,  442,  442,  442,
  442,    0,  442,  442,  442,  442,  442,  442,  442,  442,
  442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
  442,  442,  442,  442,    0,    0,  400,    0,    0,    0,
  442,  442,  442,    0,    0,    0,    0,    0,    0,  442,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  400,    0,    0,
    0,    0,  400,    0,  400,  400,  400,  400,  400,  400,
  400,  400,  400,  400,  400,  400,    0,    0,    0,    0,
    0,    0,    0,    0,  400,  400,  400,  400,  400,  400,
  400,  400,  400,    0,  400,  520,    0,  400,  400,  400,
  400,  400,  400,  400,  400,  400,  400,    0,  400,  400,
  400,  400,  400,  400,  400,  400,  400,  400,  400,  400,
  400,  400,  400,  400,  400,  400,  400,  400,  400,  400,
    0,  520,    0,    0,    0,    0,  400,  400,  400,    0,
    0,    0,    0,    0,    0,  400,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  520,    0,    0,    0,    0,  520,    0,  520,
  520,  520,  520,  520,  520,  520,  520,  520,  520,  520,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  520,
  520,  520,  520,  520,  520,  520,  520,  520,    0,  520,
  520,  509,  520,  520,  520,  520,  520,  520,  520,  520,
  520,  520,    0,  520,  520,  520,  520,  520,  520,  520,
  520,  520,  520,  520,  520,  520,  520,  520,  520,  520,
  520,  520,  520,  520,  520,    0,    0,  509,    0,    0,
    0,    0,  520,  520,    0,    0,    0,    0,    0,    0,
  520,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  509,    0,
    0,    0,    0,  509,    0,  509,  509,  509,  509,  509,
  509,  509,  509,  509,  509,  509,    0,    0,    0,    0,
    0,    0,    0,    0,  509,  509,    0,  509,  509,  509,
  509,  509,  509,  509,    0,  509,  509,  396,  509,  509,
  509,  509,  509,  509,  509,  509,  509,  509,    0,  509,
  509,  509,  509,  509,  509,  509,  509,  509,  509,  509,
  509,  509,  509,  509,  509,  509,  509,  509,  509,  509,
  509,    0,    0,  396,    0,    0,    0,    0,  509,  509,
    0,    0,    0,    0,    0,    0,  509,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  396,    0,    0,    0,    0,  396,
    0,  396,  396,  396,  396,  396,  396,  396,  396,  396,
  396,  396,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  396,    0,  396,  396,  396,  396,  396,  396,  396,
    0,  396,  396,  395,  396,  396,  396,  396,  396,  396,
  396,  396,  396,  396,    0,  396,  396,  396,  396,  396,
  396,  396,  396,  396,  396,  396,  396,  396,  396,  396,
  396,  396,  396,  396,  396,  396,  396,    0,    0,  395,
    0,    0,    0,    0,  396,  396,    0,    0,    0,    0,
    0,    0,  396,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  395,    0,    0,    0,    0,  395,    0,  395,  395,  395,
  395,  395,  395,  395,  395,  395,  395,  395,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  395,    0,  395,
  395,  395,  395,  395,  395,  395,    0,  395,  395,  550,
  395,  395,  395,  395,  395,  395,  395,  395,  395,  395,
    0,  395,  395,  395,  395,  395,  395,  395,  395,  395,
  395,  395,  395,  395,  395,  395,  395,  395,  395,  395,
  395,  395,  395,    0,    0,  550,    0,    0,    0,    0,
  395,  395,    0,    0,    0,    0,    0,    0,  395,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  337,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  550,    0,    0,    0,
    0,  550,    0,  550,  550,  550,  550,  550,  550,  550,
  550,  550,  550,  550,  337,    0,    0,    0,    0,    0,
    0,    0,    0,  550,    0,  550,    0,  550,    0,  550,
  550,  550,    0,  550,  550,    0,  550,  550,  550,  550,
  550,  550,  550,  550,  550,  550,  395,    0,    0,  550,
  550,  550,  550,  550,  550,  550,  550,  550,  550,  550,
  550,  550,  550,  550,  550,  550,  550,    0,  550,    0,
    0,    0,    0,  337,    0,    0,    0,    0,    0,    0,
    0,    0,  395,  337,  550,  337,    0,  337,    0,    0,
  337,    0,  337,  337,    0,  337,  337,  337,  337,  337,
  337,  337,  337,  337,  337,    0,  337,  337,  337,  337,
  337,  337,  337,  337,  337,  337,  337,  337,  337,  337,
  337,  337,  337,  337,  337,  337,  337,  337,    0,    0,
    0,    0,  563,    0,  337,  337,  337,    0,    0,    0,
    0,    0,    0,  337,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  395,  395,  395,  395,    0,  395,    0,
  395,  395,    0,  395,  395,  395,  395,  395,  563,  395,
  395,  395,  395,    0,  395,  395,  395,  395,  395,  395,
  395,  395,  395,  395,  395,  395,  395,  395,  395,  395,
  395,  395,  395,  395,  395,  395,    0,    0,  567,    0,
    0,    0,  330,  395,  395,    0,    0,    0,    0,  563,
    0,  395,    0,    0,  563,    0,  563,  563,  563,  563,
  563,  563,  563,  563,  563,  563,  563,    0,    0,    0,
    0,    0,    0,    0,  567,    0,  563,    0,  563,    0,
  563,    0,  563,  563,  563,    0,  563,  563,    0,    0,
  563,  563,  563,  563,  563,  563,  563,  563,  563,    0,
    0,    0,  563,  563,  563,  563,  563,  563,  563,  563,
    0,    0,    0,    0,    0,  567,    0,    0,    0,    0,
  567,  563,  567,  567,  567,  567,  567,  567,  567,  567,
  567,  567,  567,    0,    0,    0,    0,  563,    0,    0,
  570,    0,  567,    0,  567,    0,  567,    0,  567,  567,
  567,    0,  567,  567,    0,    0,  567,  567,  567,  567,
    0,    0,    0,  567,  567,    0,    0,    0,  567,  567,
  567,  567,  567,  567,  567,  567,  570,    0,    0,    0,
    0,  596,    0,    0,    0,    0,  596,  567,  596,  596,
  596,  596,  596,  596,  596,  596,  596,  596,  596,    0,
    0,    0,    0,  567,    0,    0,  568,    0,  596,    0,
  596,    0,  596,    0,  596,  596,  596,  570,    0,    0,
    0,    0,  570,    0,  570,  570,  570,  570,  570,  570,
  570,  570,  570,  570,  570,    0,    0,    0,    0,    0,
    0,    0,  568,    0,  570,    0,  570,    0,  570,    0,
  570,  570,  570,    0,  570,  570,    0,    0,  570,  570,
  570,  570,    0,    0,    0,  570,  570,    0,    0,  596,
  570,  570,  570,  570,  570,  570,  570,  570,    0,    0,
    0,    0,    0,  568,    0,    0,    0,    0,  568,  570,
  568,  568,  568,  568,  568,  568,  568,  568,  568,  568,
  568,    0,    0,    0,    0,  570,    0,    0,  569,    0,
  568,    0,  568,    0,  568,    0,  568,  568,  568,    0,
  568,  568,    0,    0,  568,  568,  568,  568,    0,    0,
    0,  568,  568,    0,    0,    0,  568,  568,  568,  568,
  568,  568,  568,  568,  569,    0,    0,    0,    0,  885,
    0,    0,    0,    0,  885,  568,  885,  885,  885,  885,
  885,  885,  885,  885,  885,  885,    0,    0,    0,    0,
    0,  568,    0,    0,    0,    0,  885,    0,  885,    0,
  885,    0,  885,  885,  885,  569,    0,    0,    0,    0,
  569,    0,  569,  569,  569,  569,  569,  569,  569,  569,
  569,  569,  569,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  569,    0,  569,    0,  569,    0,  569,  569,
  569,    0,  569,  569,    0,    0,  569,  569,  569,  569,
    0,    0,    0,  569,  569,    0,    0,  885,  569,  569,
  569,  569,  569,  569,  569,  569,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  569,    0,    0,
   95,    0,    0,    0,    0,    0,    0,    0,   96,   97,
   98,   99,    0,  569,  100,  101,    0,  102,  103,  104,
  105,  106,  107,  108,    0,    0,    0,    0,    0,  109,
    0,  110,  111,  112,  113,  114,  115,    0,    0,  116,
    0,    0,    0,  117,  118,    0,  119,  120,  121,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  122,    0,
  123,    0,  124,  125,    0,    0,  126,    0,  127,  128,
  129,  130,  131,  132,  133,  134,  135,  136,  137,  138,
    0,  139,    0,    0,  140,    0,    0,    0,  141,  142,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  143,
    0,    0,    0,  144,    0,    0,    0,    0,  145,  146,
  147,  148,  149,    0,    0,    0,  150,    0,  151,    0,
    0,    0,    0,    0,  152,  153,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  154,  155,  156,  157,
  158,  159,  160,  161,  162,  313,    0,    0,    0,    0,
    0,    0,    0,   96,   97,   98,   99,    0,    0,  100,
  101,    0,  102,  103,  104,  105,  106,  107,  108,    0,
    0,    0,    0,    0,  109,    0,  110,  111,  112,  113,
  114,  115,    0,    0,  116,    0,    0,    0,  117,  118,
    0,  119,  120,  121,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  122,    0,  123,    0,  124,  125,    0,
    0,  126,    0,  127,  128,  129,  130,  131,  132,  133,
  134,  135,  136,  137,  138,    0,  139,    0,    0,  140,
    0,    0,    0,  141,  142,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  143,    0,    0,    0,  144,    0,
    0,    0,    0,  145,  146,  147,  148,  149,    0,    0,
    0,  150,    0,  151,    0,    0,    0,    0,    0,  152,
  153,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  154,  155,  156,  157,  158,  159,  160,  161,  162,
  890,    0,    0,    0,    0,    0,    0,    0,  890,  890,
  890,  890,    0,    0,  890,  890,    0,  890,  890,  890,
  890,  890,  890,  890,    0,    0,    0,    0,    0,  890,
    0,  890,  890,  890,  890,  890,  890,    0,    0,  890,
    0,    0,    0,  890,  890,    0,  890,  890,  890,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  890,    0,
  890,    0,  890,  890,    0,    0,  890,    0,  890,  890,
  890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
    0,  890,    0,    0,  890,    0,    0,    0,  890,  890,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  890,
    0,    0,    0,  890,    0,    0,    0,    0,  890,  890,
  890,  890,  890,    0,    0,    0,  890,    0,  890,    0,
    0,    0,    0,    0,  890,  890,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  890,  890,  890,  890,
  890,  890,  890,  890,  890,  756,    0,    0,    0,    0,
    0,    0,    0,  756,  756,  756,  756,    0,    0,  756,
  756,    0,  756,  756,  756,  756,  756,  756,  756,    0,
    0,    0,    0,    0,  756,    0,  756,  756,  756,  756,
  756,  756,    0,    0,  756,    0,    0,    0,  756,  756,
    0,  756,  756,  756,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  756,    0,  756,    0,  756,  756,    0,
    0,  756,    0,  756,  756,  756,  756,  756,  756,  756,
  756,  756,  756,  756,  756,    0,  756,    0,    0,  756,
    0,    0,    0,  756,  756,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  756,    0,    0,    0,  756,    0,
    0,    0,    0,  756,  756,  756,  756,  756,    0,    0,
    0,  756,    0,  756,    0,    0,    0,    0,    0,  756,
  756,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  756,  756,  756,  756,  756,  756,  756,  756,  756,
  545,    0,    0,    0,    0,    0,    0,    0,   96,   97,
    0,   99,    0,    0,  100,  298,    0,    0,    0,  104,
  105,  106,    0,  108,    0,    0,    0,    0,    0,  109,
    0,    0,  111,    0,    0,    0,    0,    0,    0,  116,
    0,    0,    0,    0,  118,    0,  119,  120,  121,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  123,    0,  124,  125,    0,    0,  126,    0,    0,  128,
    0,  130,    0,  132,  133,  134,  299,    0,  137,    0,
    0,  346,    0,    0,    0,    0,    0,    0,  141,  142,
    0,    0,    0,    0,    0,   59,    0,   59,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  546,  144,    0,    0,  547,    0,   59,  146,
  147,  148,  149,    0,    0,    0,  150,    0,  151,    0,
    0,   59,    0,    0,  152,  153,   59,    0,    0,    0,
    0,   59,    0,   59,   59,   59,   59,    0,    0,   59,
    0,   59,    0,    0,    0,   59,  154,  155,  156,  157,
  158,  159,  507,  161,  162,  545,    0,   59,    0,    0,
   59,    0,   59,   96,   97,    0,   99,    0,    0,  100,
  298,    0,    0,    0,  104,  105,  106,    0,  108,    0,
    0,    0,    0,    0,  109,    0,    0,  111,    0,    0,
  298,    0,    0,    0,  116,    0,    0,    0,    0,  118,
    0,  119,  120,  121,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  123,    0,  124,  125,    0,
    0,  126,    0,    0,  128,    0,  130,    0,  132,  133,
  134,  299,    0,  137,    0,    0,  346,    0,    0,    0,
    0,    0,    0,  141,  142,    0,    0,    0,    0,    0,
   59,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  546,  144,    0,
    0,  547,    0,   59,  146,  147,  148,  149,    0,    0,
    0,  150,    0,  151,    0,    0,   59,    0,    0,  152,
  153,   59,    0,    0,    0,    0,   59,    0,   59,   59,
   59,   59,    0,    0,   59,    0,   59,    0,    0,    0,
   59,  154,  155,  156,  157,  158,  159,  347,  161,  162,
  748,    0,   59,    0,    0,   59,    0,   59,   96,   97,
    0,   99,    0,    0,  100,  298,    0,    0,    0,  104,
  105,  106,    0,  108,    0,    0,    0,    0,    0,  109,
    0,    0,  111,    0,    0,  295,    0,    0,    0,  116,
    0,    0,    0,    0,  118,    0,  119,  120,  121,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  123,    0,  124,  125,    0,    0,  126,    0,    0,  128,
    0,  130,    0,  132,  133,  134,  299,    0,  137,    0,
    0,  346,    0,    0,    0,    0,    0,    0,  141,  142,
    0,    0,    0,    0,    0,   59,    0,   59,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  549,
  749,    0,    0,  144,    0,    0,    0,    0,   59,  146,
  147,  148,  149,    0,    0,    0,  150,    0,  151,    0,
    0,   59,    0,    0,  152,  153,   59,    0,    0,    0,
    0,   59,    0,   59,   59,   59,   59,    0,    0,    0,
    0,   59,    0,    0,    0,   59,  154,  155,  156,  157,
  158,  159,  347,  161,  162,  313,    0,   59,    0,    0,
   59,    0,   59,   96,   97,    0,   99,    0,    0,  100,
  298,    0,    0,    0,  104,  105,  106,    0,  108,    0,
    0,    0,    0,    0,  109,    0,    0,  111,    0,    0,
  296,    0,    0,    0,  116,    0,    0,    0,    0,  118,
    0,  119,  120,  121,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  123,    0,  124,  125,    0,
    0,  126,    0,    0,  128,    0,  130,    0,  132,  133,
  134,  299,    0,  137,    0,    0,  139,    0,    0,    0,
    0,    0,    0,  141,  142,    0,    0,    0,    0,    0,
   61,    0, 1338,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  144,    0,
    0,    0,    0,   62,  146,  147,  148,  149,    0,    0,
    0,  150,    0,  151,    0,    0,   63,    0,    0,  152,
  153,   65,    0,    0,    0,    0,   66,    0,   67,   68,
   69,   70,    0,    0, 1339,    0,   71,    0,    0,    0,
   72,  154,  155,  156,  157,  158,  159,  347,  161,  162,
  313,    0,   73,    0,    0,   74,    0,   75,   96,   97,
    0,   99,    0,    0,  100,  298,    0,  762,    0,  104,
  105,  106,    0,  108,    0,    0,   97,    0,   99,  109,
    0,  100,  111,    0,    0,    0,  104,    0,    0,  116,
  108,    0,    0,    0,  118,    0,  119,  120,  121,  111,
    0,    0,    0,    0,    0,    0,  116,    0,    0,    0,
  123,  118,  124,  125,    0,  121,  126,    0,    0,  128,
    0,  130,    0,  132,  133,  134,  299,  123,  137,  124,
    0,  346,    0,  126,    0,    0,    0,    0,  141,  142,
    0,  133,  134,    0,    0,  137,    0,    0,  262,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  144,    0,    0,    0,    0,    0,  146,
  147,  148,  149,    0,    0,    0,  150,    0,  151,    0,
    0,    0,    0,    0,  152,  153,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  154,  155,  156,  157,
  158,  159,  347,  161,  162,   96,   97,    0,   99,    0,
    0,  100,  298,    0,  843,    0,  104,  105,  106,  763,
  108,    0,    0,   97,    0,   99,  109,    0,  100,  111,
    0,    0,    0,  104,    0,    0,  116,  108,    0,    0,
    0,  118,    0,  119,  120,  121,  111,    0,    0,    0,
    0,    0,    0,  116,    0,    0,    0,  123,  118,  124,
  125,    0,  121,  126,    0,    0,  128,    0,  130,    0,
  132,  133,  134,  299,  123,  137,  124,    0,  346,    0,
  126,    0,    0,    0,    0,  141,  142,    0,  133,  134,
    0,    0,  137,    0,    0,  276,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  622,  921,    0,    0,
  144,    0,    0,    0,    0,    0,  146,  147,  148,  149,
    0,    0,    0,  150,    0,  151,    0,    0,    0,    0,
    0,  152,  153,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  154,  155,  156,  157,  158,  159,  623,
  161,  162,   96,   97,    0,   99,    0,  624,  100,  298,
    0,    0,    0,  104,  105,  106,   89,  108,    0,    0,
    0,    0,    0,  109,    0,    0,  111,    0,    0,    0,
    0,    0,    0,  116,    0,    0,    0,    0,  118,    0,
  119,  120,  121,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  123,    0,  124,  125,    0,    0,
  126,    0,    0,  128,    0,  130,    0,  132,  133,  134,
  299,    0,  137,    0,    0,  346,    0,    0,    0,    0,
    0,    0,  141,  142,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  622,    0,    0,    0,  144,    0,    0,
    0,    0,    0,  146,  147,  148,  149,    0,    0,    0,
  150,    0,  151,    0,    0,    0,    0,    0,  152,  153,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  154,  155,  156,  157,  158,  159,  623,  161,  162,  537,
    0,    0,    0,    0,  624,    0,    0,  538,   97,    0,
   99,    0,    0,  100,  298,    0, 1079,    0,  104,  105,
  106,    0,  108,    0,    0,   97,    0,   99,  109,    0,
  100,  111,    0,    0,    0,  104,    0,    0,  116,  108,
    0,    0,    0,  118,    0,  119,  120,  121,  111,    0,
    0,    0,    0,    0,    0,  116,    0,    0,    0,  123,
  118,  124,  125,    0,  121,  126,    0,    0,  128,    0,
  130,    0,  132,  133,  134,  299,  123,  137,  124,   59,
  346,   59,  126,    0,   59,    0,    0,    0,    0,   59,
  133,  134,    0,   59,  137,    0,    0,  276,    0,    0,
    0,    0,   59,    0,    0,    0,    0,    0,    0,   59,
    0,    0,  301,    0,   59,    0,    0,    0,   59,    0,
   59,    0,   59,    0,    0,    0,    0,   59,    0,    0,
   59,    0,   59,    0,    0,    0,   59,    0,    0,   59,
    0,    0,    0,    0,   59,   59,    0,    0,   59,    0,
    0,   59,    0,    0,    0,  154,  155,  156,  157,  158,
  159,  539,   43,    0,    0,    0,   43,    0,    0,    0,
   43,    0,   43,    0,    0,   43,    0,   43,   89,    0,
   43,    0,   43,    0,   43,    0,   43,    0,    0,   43,
    0,    0,   43,   43,    0,    0,    0,    0,    0,    0,
   43,   43,   43,    0,    0,   43,   43,   43,    0,   43,
    0,    0,   43,    0,   43,   43,   43,   43,    0,    0,
    0,   43,   43,   43,    0,    0,   43,   43,   43,    0,
    0,    0,   59,    0,    0,   43,   43,    0,   43,   43,
   43,   43,   43,   43,    0,    0,    0,   43,    0,    0,
    0,    0,    0,    0,    0,   44,    0,    0,    0,   44,
    0,    0,    0,   44,    0,   44,    0,    0,   44,    0,
   44,   43,   43,   44,    0,   44,    0,   44,    0,   44,
    0,    0,   44,    0,    0,   44,   44,    0,    0,    0,
    0,    0,    0,   44,   44,   44,    0,    0,   44,   44,
   44,    0,   44,    0,    0,   44,    0,   44,   44,   44,
   44,    0,    0,    0,   44,   44,   44,    0,    0,   44,
   44,   44,    0,   43,    0,    0,    0,    0,   44,   44,
    0,   44,   44,   44,   44,   44,   44,    0,    0,    0,
   44,    0,    0,    0,    0,    0,    0,    0,   41,    0,
    0,    0,   41,    0,    0,    0,   41,    0,   41,    0,
    0,   41,    0,   41,   44,   44,   41,    0,   41,    0,
   41,    0,   41,    0,    0,   41,    0,    0,   41,   41,
    0,    0,    0,    0,    0,    0,   41,   41,   41,    0,
    0,   41,   41,   41,    0,   41,    0,    0,   41,    0,
   41,   41,   41,   41,    0,    0,    0,   41,   41,   41,
    0,    0,   41,   41,   41,    0,   44,    0,    0,    0,
    0,   41,   41,    0,   41,   41,    0,   41,   41,   41,
    0,    0,    0,   41,    0,    0,    0,    0,    0,    0,
    0,   42,    0,    0,    0,   42,    0,    0,    0,   42,
    0,   42,    0,    0,   42,    0,   42,   41,   41,   42,
    0,   42,    0,   42,    0,   42,    0,    0,   42,    0,
    0,   42,   42,    0,    0,    0,    0,    0,    0,   42,
   42,   42,    0,    0,   42,   42,   42,    0,   42,    0,
    0,   42,    0,   42,   42,   42,   42,    0,    0,    0,
   42,   42,   42,    0,    0,   42,   42,   42,    0,   41,
    0,    0,    0,    0,   42,   42,    0,   42,   42,    0,
   42,   42,   42,    0,    0,    0,   42,    0,    0,    0,
    0,    0,    0,    0,   45,    0,    0,    0,   59,    0,
    0,    0,   59,    0,   59,    0,    0,   59,    0,   59,
   42,   42,   59,    0,   59,    0,   59,    0,   59,    0,
    0,   59,    0,    0,   59,   59,    0,    0,    0,    0,
    0,    0,   59,   59,   59,    0,    0,   59,   59,   59,
    0,   59,    0,    0,   59,    0,   59,   59,   59,   59,
    0,    0,    0,   59,   59,   59,    0,    0,   59,   59,
   59,    0,   42,    0,    0,    0,    0,   59,   59,    0,
   59,   59,    0,   59,   59,   59,    0,   46,    0,   59,
    0,   59,    0,  337,    0,   59,    0,   59,    0,    0,
   59,    0,   59,    0,    0,   59,    0,   59,    0,   59,
    0,   59,    0,   45,   59,    0,    0,   59,   59,    0,
    0,    0,    0,    0,    0,   59,   59,   59,    0,  337,
   59,   59,   59,    0,   59,    0,    0,   59,    0,   59,
   59,   59,   59,    0,    0,    0,   59,   59,   59,  337,
    0,   59,   59,   59,    0,    0,    0,    0,    0,    0,
   59,   59,    0,   59,   59,   59,   59,   59,   59,    0,
    0,    0,   59,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  337,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,   46,    0,  337,  337,
  337,  337,  337,  337,    0,    0,    0,  337,  337,    0,
  337,  337,  337,  337,  337,  337,  337,  337,  337,  337,
    0,  337,  337,  337,  337,  337,  337,  337,  337,  337,
  337,  337,  337,  337,  337,  337,  337,  337,  337,  337,
  337,  337,  337,    0,    0,    0,    0,    0,   59,    0,
  337,  337,    0,    0,  337,    0,  337,  337,  337,  337,
    0,    0,    0,  337,  337,    0,    0,  337,  337,  337,
  337,  337,  337,  337,  337,  337,    0,  337,  337,  337,
  337,  337,  337,  337,  337,  337,  337,  337,  337,  337,
  337,  337,  337,  337,  337,  337,  337,  337,  337,   60,
    0,   60,    0,   60,    0,   60,  337,  337,   60,    0,
   60,   60,    0,   60,    0,   60,    0,   60,    0,   60,
   60,   60,   60,    0,    0,   60,   60,    0,    0,    0,
    0,   60,   60,   60,   60,   60,    0,    0,   60,   60,
   60,    0,   60,    0,   60,   60,   60,   60,   60,   60,
   60,   60,    0,   60,   60,   60,   60,    0,    0,   60,
   60,   60,    0,   60,    0,    0,    0,    0,   60,   60,
    0,   60,   60,    0,   60,   60,   60,    0,    0,    0,
   60,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,   59,    0,
   60,   60,   59,    0,   59,    0,    0,   59,    0,   59,
   59,    0,   59,   60,   59,    0,   59,    0,   59,   59,
   59,   59,    0,    0,   59,   59,    0,    0,    0,    0,
   59,    0,   59,   59,   59,    0,    0,   59,    0,   59,
    0,   59,    0,    0,   59,    0,   59,   59,   59,   59,
    0,    0,    0,   59,   59,   59,   60,    0,   59,   59,
   59,    0,    0,    0,    0,    0,    0,   59,   59,    0,
   59,   59,   59,   59,   59,   59,   59,    0,   59,   59,
    0,   59,    0,   59,   59,    0,   59,    0,   59,    0,
   59,    0,   59,   59,   59,   59,    0,    0,   59,   59,
    0,    0,    0,   87,   59,    0,   59,   59,   59,    0,
    0,   59,   59,   59,    0,   59,    0,    0,   59,    0,
   59,   59,   59,   59,    0,    0,    0,   59,   59,   59,
    0,    0,   59,   59,   59,    0,    0,    0,    0,    0,
    0,   59,   59,    0,   59,   59,    0,   59,   59,   59,
    0,    0,    0,   59,    0,   59,    0,    0,   59,    0,
    0,    0,   59,    0,   59,    0,    0,   59,    0,   59,
   59,    0,   59,    0,   59,    0,   59,   88,   59,   59,
   59,   59,    0,    0,   59,   59,   59,    0,    0,    0,
   59,    0,   59,   59,   59,    0,    0,   59,    0,   59,
    0,   59,    0,    0,   59,    0,   59,   59,   59,   59,
    0,    0,    0,   59,   59,   59,    0,    0,   59,   59,
   59,    0,    0,    0,    0,    0,    0,   59,   59,   59,
   59,   59,   59,   59,   59,   59,   59,    0,   59,   59,
    0,   59,    0,   59,   59,    0,   59,    0,   59,    0,
   59,    0,   59,   59,   59,   59,    0,    0,   59,   59,
    0,    0,    0,  110,   59,    0,   59,   59,   59,    0,
    0,   59,   59,   59,    0,   59,    0,    0,   59,    0,
   59,   59,   59,   59,    0,    0,    0,   59,   59,   59,
    0,    0,   59,   59,   59,    0,    0,    0,    0,    0,
    0,   59,   59,    0,   59,   59,    0,   59,   59,   59,
    0,    0,    0,   59,    0,   59,    0,    0,   59,    0,
    0,    0,   59,    0,   59,    0,    0,   59,    0,   59,
   59,    0,   59,    0,   59,    0,   59,  111,   59,   59,
   59,   59,    0,    0,   59,   59,   59,    0,    0,    0,
   59,    0,   59,   59,   59,    0,    0,   59,    0,   59,
    0,   59,    0,    0,   59,    0,   59,   59,   59,   59,
    0,    0,    0,   59,   59,   59,    0,    0,   59,   59,
   59,    0,    0,    0,    0,    0,    0,   59,   59,   59,
   59,   59,   59,   59,   59,   59,   59,    0,   59,   59,
    0,   59,    0,   59,   59,    0,   59,    0,   59,    0,
   59,    0,   59,   59,   59,   59,    0,    0,   59,   59,
    0,    0,    0,  223,   59,    0,   59,   59,   59,    0,
    0,   59,    0,   59,    0,   59,    0,    0,   59,    0,
   59,   59,   59,   59,    0,    0,    0,   59,   59,   59,
    0,    0,   59,   59,   59,    0,    0,    0,    0,    0,
    0,   59,   59,    0,   59,   59,    0,   59,   59,   59,
    0,   96,   97,   59,   99,   59,    0,  100,  298,    0,
    0,    0,  104,  105,  106,    0,  108,    0,    0,   97,
    0,   99,  109,    0,  100,  111,    0,  224,    0,  104,
    0,    0,  116,  108,    0,    0,    0,  118,    0,  119,
  120,  121,  111,  607,    0,    0,    0,    0,    0,  116,
  608,    0,    0,  123,  118,  124,  125,    0,  121,  126,
    0,    0,  128,    0,  130,    0,  132,  133,  134,  299,
  123,  137,  124,    0,  346,    0,  126,    0,  609,   59,
    0,  141,  142,    0,  133,  134,    0,    0,  137,    0,
    0,  276,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  144,  913,    0,  610,
    0,    0,  146,  147,  148,  149,    0,    0,    0,  150,
    0,  151,    0,    0,  894,    0,    0,  152,  153,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  154,
  155,  156,  157,  158,  159,  507,  161,  162,   96,   97,
    0,   99,    0,    0,  100,  298,    0,    0,    0,  104,
  105,  106,   89,  108,    0,    0,   97,    0,   99,  109,
    0,  100,  111,    0,    0,    0,  104,    0,    0,  116,
  108,    0,    0,    0,  118,    0,  119,  120,  121,  111,
  607,    0,    0,    0,    0,    0,  116,  608,    0,    0,
  123,  118,  124,  125,    0,  121,  126,    0,    0,  128,
    0,  130,    0,  132,  133,  134,  299,  123,  137,  124,
    0,  346,    0,  126,    0,  609,    0,    0,  141,  142,
    0,  133,  134,    0,    0,  137,    0,    0,  276,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  144,    0,    0,  610,    0,    0,  146,
  147,  148,  149,    0,    0,    0,  150,    0,  151,    0,
    0,    0,    0,    0,  152,  153,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  154,  155,  156,  157,
  158,  159,  507,  161,  162,   96,   97,    0,   99,    0,
    0,  100,  298,    0,    0,    0,  104,  105,  106,  365,
  108,    0,    0,   97,    0,   99,  109,    0,  100,  111,
    0,    0,    0,  104,    0,    0,  116,  108,    0,    0,
    0,  118,    0,  119,  120,  121,  111,  607,    0,    0,
    0,    0,    0,  116,  608,    0,    0,  123,  118,  124,
  125,    0,  121,  126,    0,    0,  128,    0,  130,    0,
  132,  133,  134,  299,  123,  137,  124,    0,  346,    0,
  126,    0,  609,    0,    0,  141,  142,    0,  133,  134,
    0,    0,  137,    0,    0,  276,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  144,    0,    0,    0,    0,    0,  146,  147,  148,  149,
    0,    0,    0,  150,    0,  151,    0,    0,    0,    0,
    0,  152,  153,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  154,  155,  156,  157,  158,  159,  507,
  161,  162,   96,   97,    0,   99,    0,    0,  100,  298,
    0,    0,    0,  104,  105,  106,  367,  108,    0,    0,
   97,    0,   99,  109,    0,  100,  111,    0,    0,    0,
  104,    0,    0,  116,  108,    0,    0,    0,  118,    0,
  119,  120,  121,  111,    0,    0,    0,    0,    0,    0,
  116,    0,    0,    0,  123,  118,  124,  125,  818,  121,
  126,    0,    0,  128,    0,  130,    0,  132,  133,  134,
  299,  123,  137,  124,    0,  346,    0,  126,    0,  819,
    0,    0,  141,  142,    0,  133,  134,    0,    0,  137,
    0,    0,  276,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  549,    0,    0,    0,  144,    0,    0,
    0,    0,    0,  146,  147,  148,  149,    0,    0,    0,
  150,    0,  151,    0,    0,    0,    0,    0,  152,  153,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  154,  155,  156,  157,  158,  159,  347,  161,  162,   96,
   97,    0,   99,    0,    0,  100,  298,    0,    0,    0,
  104,  105,  106,   89,  108,    0,    0,   97,    0,   99,
  109,    0,  100,  111,    0,    0,    0,  104,    0,    0,
  116,  108,    0,    0,    0,  118,    0,  119,  120,  121,
  111,    0,    0,    0,    0,    0,    0,  116,    0,    0,
    0,  123,  118,  124,  125,    0,  121,  126,    0,    0,
  128,    0,  130,    0,  132,  133,  134,  299,  123,  137,
  124,    0,  346,    0,  126,    0,    0,    0,    0,  141,
  142,    0,  133,  134,    0,    0,  137,    0,    0,  262,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  144,    0,    0,    0,    0,  584,
  146,  147,  148,  149,    0,    0,    0,  150,    0,  151,
    0,    0,    0,    0,    0,  152,  153,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  154,  155,  156,
  157,  158,  159,  347,  161,  162,   96,   97,    0,   99,
    0,    0,  100,  298,    0,    0,    0,  104,  105,  106,
   89,  108,    0,    0,   97,    0,   99,  109,    0,  100,
  111,    0,    0,    0,  104,    0,    0,  116,  108,    0,
    0,    0,  118,    0,  119,  120,  121,  111,    0,    0,
    0,    0,    0,    0,  116,    0,    0,    0,  123,  118,
  124,  125,    0,  121,  126,    0,    0,  128,    0,  130,
    0,  132,  133,  134,  299,  123,  137,  124,    0,  346,
    0,  126,    0,    0,    0,    0,  141,  142,    0,  133,
  134,    0,    0,  137,    0,    0,  551,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  805,    0,
    0,  144,    0,    0,    0,    0,    0,  146,  147,  148,
  149,    0,    0,    0,  150,    0,  151,    0,    0,    0,
    0,    0,  152,  153,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  154,  155,  156,  157,  158,  159,
  347,  161,  162,   96,   97,    0,   99,    0,    0,  100,
  298,    0,    0,    0,  104,  105,  106,   89,  108,    0,
    0,   97,    0,   99,  109,    0,  100,  111,    0,    0,
    0,  104,    0,    0,  116,  108,    0,    0,    0,  118,
    0,  119,  120,  121,  111,    0,    0,    0,    0,    0,
    0,  116,    0,    0,    0,  123,  118,  124,  125,    0,
  121,  126,    0,    0,  128,    0,  130,    0,  132,  133,
  134,  299,  123,  137,  124,    0,  346,    0,  126,    0,
    0,    0,    0,  141,  142,    0,  133,  134,    0,    0,
  137,    0,    0,  276,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  549,    0,    0,    0,  144,    0,
    0,    0,    0,    0,  146,  147,  148,  149,    0,    0,
    0,  150,    0,  151,    0,    0,    0,    0,    0,  152,
  153,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  154,  155,  156,  157,  158,  159,  347,  161,  162,
   96,   97,    0,   99,    0,    0,  100,  298,    0,    0,
    0,  104,  105,  106,  672,  108,    0,    0,   97,    0,
   99,  109,    0,  100,  111,    0,    0,    0,  104,    0,
    0,  116,  108,    0,    0,    0,  118,    0,  119,  120,
  121,  111,    0,    0,    0,    0,    0,    0,  116,    0,
    0,    0,  123,  118,  124,  125,    0,  121,  126,    0,
    0,  128,    0,  130,    0,  132,  133,  134,  299,  123,
  137,  124,    0,  346,    0,  126,    0,    0,    0,    0,
  141,  142,    0,  133,  134,    0,    0,  137,    0,    0,
  276,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  406,    0,    0,    0,  144,    0,    0,    0,    0,
    0,  146,  147,  148,  149,    0,    0,    0,  150,    0,
  151,    0,    0,    0,    0,    0,  152,  153,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  154,  155,
  156,  157,  158,  159,  347,  161,  162,   96,   97,    0,
   99,    0,    0,  100,  298,    0,    0,    0,  104,  105,
  106,  674,  108,    0,    0,   97,    0,   99,  109,    0,
  100,  111,    0,    0,    0,  104,    0,    0,  116,  108,
    0,    0,    0,  118,    0,  119,  120,  121,  111,    0,
    0,    0,    0,    0,    0,  116,    0,    0,    0,  123,
  118,  124,  125,    0,  121,  126,    0,    0,  128,    0,
  130,    0,  132,  133,  134,  299,  123,  137,  124,    0,
  346,    0,  126,    0,    0,    0,    0,  141,  142,    0,
  133,  134,    0,    0,  137,    0,    0,  591,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  953,  144,    0,    0,    0,    0,    0,  146,  147,
  148,  149,    0,    0,    0,  150,    0,  151,    0,    0,
    0,    0,    0,  152,  153,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  154,  155,  156,  157,  158,
  159,  347,  161,  162,   96,   97,    0,   99,    0,    0,
  100,  298,    0,    0,    0,  104,  105,  106,   89,  108,
    0,    0,  495,    0,  495,  109,    0,  495,  111,    0,
    0,    0,  495,    0,    0,  116,  495,    0,    0,    0,
  118,    0,  119,  120,  121,  495,    0,    0,    0,    0,
    0,    0,  495,    0,    0,    0,  123,  495,  124,  125,
    0,  495,  126,    0,    0,  128,    0,  130,    0,  132,
  133,  134,  299,  495,  137,  495,    0,  346,    0,  495,
    0,    0,    0,    0,  141,  142,    0,  495,  495,    0,
    0,  495,    0,    0,  495,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  144,
    0,    0,    0,    0,    0,  146,  147,  148,  149,    0,
    0,    0,  150,    0,  151,    0,    0,    0,    0,    0,
  152,  153,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  154,  155,  156,  157,  158,  159,  347,  161,
  162,   96,   97,    0,   99,    0,    0,  100,  298,    0,
    0,    0,  104,  105,  106,  495,  108,    0,    0,  186,
    0,  186,  109,    0,  186,  111,    0,    0,    0,  186,
    0,    0,  116,  186,    0,    0,    0,  118,    0,  119,
  120,  121,  186,    0,    0,    0,    0,    0,    0,  186,
    0,    0,    0,  123,  186,  124,  125,    0,  186,  126,
    0,    0,  128,    0,  130,    0,  132,  133,  134,  299,
  186,  137,  186,    0,  346,    0,  186,    0,    0,    0,
    0,  141,  142,    0,  186,  186,    0,    0,  186,    0,
    0,  186,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  144,    0,    0,    0,
    0,    0,  146,  147,  148,  149,    0,    0,    0,  150,
    0,  151,    0,    0,    0,    0,    0,  152,  153,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  154,
  155,  156,  157,  158,  159,  501,  161,  162,   96,   97,
    0,   99,    0,    0,  100,  298,    0,    0,    0,  104,
  105,  106,  186,  108,    0,    0,  196,    0,  196,  109,
    0,  196,  111,    0,    0,    0,  196,    0,    0,  116,
  196,    0,    0,    0,  118,    0,  119,  120,  121,  196,
    0,    0,    0,    0,    0,    0,  196,    0,    0,    0,
  123,  196,  124,  125,    0,  196,  126,    0,    0,  128,
    0,  130,    0,  132,  133,  134,  299,  196,  137,  196,
    0,  346,    0,  196,    0,    0,    0,    0,  141,  142,
    0,  196,  196,    0,    0,  196,    0,    0,  196,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  144,    0,    0,    0,    0,    0,  146,
  147,  148,  149,    0,    0,    0,  150,    0,  151,    0,
    0,    0,    0,    0,  152,  153,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  154,  155,  156,  157,
  158,  159,  507,  161,  162,   96,   97,    0,   99,    0,
    0,  100,  298,    0,    0,    0,  104,  105,  106,  196,
  108,    0,    0,  187,    0,  187,  109,    0,  187,  111,
    0,    0,    0,  187,    0,    0,  116,  187,    0,    0,
    0,  118,    0,  119,  120,  121,  187,    0,    0,    0,
    0,    0,    0,  187,    0,    0,    0,  123,  187,  124,
  125,    0,  187,  126,    0,    0,  128,    0,  130,    0,
  132,  133,  134,  299,  187,  137,  187,    0,  139,    0,
  187,    0,    0,    0,    0,  141,  142,    0,  187,  187,
    0,    0,  187,    0,    0,  187,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  144,    0,    0,    0,    0,    0,  146,  147,  148,  149,
    0,    0,    0,  150,    0,  151,    0,    0,    0,    0,
    0,  152,  153,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  154,  155,  156,  157,  158,  159,  347,
  161,  162,  616,  616,    0,  616,    0,    0,  616,  616,
    0,    0,    0,  616,  616,  616,  187,  616,    0,    0,
    0,    0,    0,  616,    0,    0,  616,    0,    0,    0,
    0,    0,    0,  616,    0,    0,    0,    0,  616,    0,
  616,  616,  616,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  616,    0,  616,  616,    0,    0,
  616,    0,    0,  616,    0,  616,    0,  616,  616,  616,
  616,    0,  616,    0,    0,  616,    0,    0,    0,    0,
    0,    0,  616,  616,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  616,    0,    0,
    0,    0,    0,  616,  616,  616,  616,    0,    0,    0,
  616,    0,  616,    0,    0,    0,    0,    0,  616,  616,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  616,  616,  616,  616,  616,  616,  616,  616,  616,   96,
   97,    0,   99,    0,    0,  100,  298,    0,    0,    0,
  104,  105,  106,    0,  108,    0,    0,    0,    0,    0,
  109,    0,    0,  111,    0,    0,    0,    0,    0,    0,
  116,    0,    0,    0,    0,  118,    0,  119,  120,  121,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  123,    0,  124,  125,    0,    0,  126,    0,    0,
  128,    0,  130,    0,  132,  133,  134,  299,    0,  137,
    0,    0,  346,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,  144,    0,    0,    0,    0,    0,
  146,  147,  148,  149,    0,    0,    0,  150,    0,  151,
    0,    0,    0,    0,    0,  152,  153,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  154,  155,  156,
  157,  158,  159,  302,    0,  162,   96,   97,    0,   99,
    0,    0,  100,  298,    0,    0,    0,  104,  105,  106,
    0,  108,    0,    0,    0,    0,    0,  109,    0,    0,
  111,    0,    0,    0,    0,    0,    0,  116,    0,    0,
    0,    0,  118,    0,  119,  120,  121,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,  123,    0,
  124,  125,    0,    0,  126,    0,    0,  128,    0,  130,
    0,  132,  133,  134,  299,  639,  137,  639,    0,  300,
  639,    0,  639,  639,    0,  639,    0,  639,    0,  639,
    0,  639,  639,  639,    0,    0,    0,  639,  639,    0,
    0,    0,    0,  639,    0,  639,  639,    0,    0,    0,
  639,  301,    0,    0,  639,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  639,    0,  639,    0,
    0,    0,  639,  639,    0,    0,    0,    0,    0,    0,
  639,  639,    0,    0,  639,    0,    0,  639,    0,    0,
    0,    0,  639,    0,  154,  155,  156,  157,  158,  159,
  302,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  639,  639,  638,    0,  638,    0,    0,  638,
    0,  638,  638,    0,  638,  639,  638,    0,  638,    0,
  638,  638,  638,    0,    0,    0,  638,  638,    0,    0,
    0,    0,  638,    0,  638,  638,    0,    0,    0,  638,
    0,    0,    0,  638,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  638,    0,  638,  639,    0,
    0,  638,  638,    0,    0,    0,    0,    0,    0,  638,
  638,    0,  638,  638,  638,    0,  638,  638,    0,  638,
  638,  638,  638,    0,  638,    0,  638,    0,  638,  638,
  638,    0,    0,    0,  638,  638,    0,    0,    0,    0,
  638,    0,  638,  638,    0,    0,    0,  638,    0,    0,
    0,  638,    0,    0,  638,    0,    0,    0,    0,    0,
    0,    0,    0,  638,    0,  638,    0,    0,    0,  638,
  638,    0,    0,    0,    0,    0,    0,  638,  638,    0,
    0,  638,    0,    0,  638,    0,   97,    0,   99,  638,
    0,  100,    0,    0, 1231,    0,  104,  638,  259,    0,
  108,    0,  260, 1232, 1233,    0,    0,    0,  261,  111,
    0,    0,    0,    0, 1234,    0,  116,    0,   97,    0,
   99,  118,    0,  100,    0,  121, 1231,    0,  104,    0,
  259,    0,  108,    0,  260, 1232, 1233,  123,    0,  124,
  261,  111,    0,  126,    0,    0, 1234,    0,  116,    0,
    0,  133,  134,  118,    0,  137,    0,  121, 1235,    0,
    0,    0,    0,  263,    0,  638,    0,    0,   59,  123,
   59,  124,    0,   59,    0,  126,    0,    0,   59,    0,
    0,    0,   59,  133,  134,    0,    0,  137,    0,    0,
 1235,   59,  638,    0,  638,  263, 1236,  638,   59,  638,
    0,    0,  638,   59,  638,    0,  638,   59,  638,   59,
    0,   59,    0,    0,  638,  638,   59,    0,    0,   59,
    0,   59,  638,  638,    0,   59,    0,  638,   59,    0,
    0,  638,    0,   59,   59,    0,    0,   59,    0, 1237,
   59,    0,    0,  638,    0,  638,    0,    0,    0,  638,
  638,    0,    0,    0,    0,    0,    0,  638,  638,    0,
   59,  638,   59,    0,  638,   59,    0,    0,    0,  638,
   59, 1237,    0,  169,   59,    0,    0,    0,    0,    0,
    0,    0,    0,   59,   97,    0,   99,    0,    0,  100,
   59,    0,    0,    0,  104,   59,  259,    0,  108,   59,
  260,   59,    0,   59,    0,    0,  261,  111,   59,    0,
    0,   59,    0,   59,  116,    0,    0,   59,    0,  118,
   59,   59,    0,  121,    0,   59,   59,    0,    0,   59,
    0,    0,   59,    0,   97,  123,   99,  124,    0,  100,
    0,  126,    0,    0,  104,  638,    0,    0,  108,  133,
  134,    0,    0,  137,    0,    0,  262,  111,    0,    0,
    0,  263,    0,  169,  116,    0,    0,    0,    0,  118,
    0,    0,    0,  121,    0,  588,    0,    0,    0,    0,
    0,    0,  589,    0,    0,  123,    0,  124,   97,    0,
   99,  126,    0,  100,  590, 1156,    0,    0,  104,  133,
  134,    0,  108,  137,    0,    0,  591,    0,    0,    0,
    0,  111,    0,   59,    0,    0,    0,    0,  116,    0,
   59,    0,    0,  118,    0, 1157,    0,  121,    0,    0,
    0,    0,    0,    0,    0,    0,    0,   89,    0,  123,
    0,  124,    0,   59,    0,  126, 1158,    0,    0,    0,
    0,    0,   59,  133,  134,    0,   59,  137,    0,    0,
  276,   59,    0,    0,    0,    0,   59,    0,   59,   59,
   59,   59,    0,    0,    0,   59,   59,    0,    0,    0,
   59,    0,    0,    0,    0,    0,    0,  592,   59,    0,
    0,    0,   59,   59,    0,   59,   59,   59,   59,    0,
   59,   59,   59,   59,    0,    0,    0,    0,   59,    0,
    0,    0,   59,    0,    0,    0,    0,    0,    0,   59,
    0,   59,   59,    0,   59,  204,    0,   59,    0,   59,
    0,    0,   59,    0,    0,    0,    0,   59,    0,    0,
    0,   89,   59,    0,   59,   59,   59,   59,    0,    0,
    0,    0,   59,   59,   59,    0,   59,  206,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,   59,    0,
    0,   59,  573,   59,    0,    0,    0,  573,    0,  573,
  573,  573,  573,  573,  573,  573,  573,  573,  573,  573,
    0,    0,    0,    0,    0,    0,    0,   59,   59,  573,
    0,  573,    0,  573,    0,  573,  573,  573,    0,    0,
    0,    0,    0,  573,  573,  573,  573,    0,    0,    0,
  573,  573,    0,    0,    0,  573,  573,  573,  573,  573,
  573,  573,  573,    0,    0,    0,    0,    0,  574,    0,
    0,    0,    0,  574,  573,  574,  574,  574,  574,  574,
  574,  574,  574,  574,  574,  574,    0,    0,    0,    0,
  573,    0,    0,    0,    0,  574,    0,  574,    0,  574,
    0,  574,  574,  574,    0,    0,    0,    0,    0,  574,
  574,  574,  574,    0,    0,    0,  574,  574,    0,    0,
    0,  574,  574,  574,  574,  574,  574,  574,  574,    0,
    0,    0,    0,    0,  575,    0,    0,    0,    0,  575,
  574,  575,  575,  575,  575,  575,  575,  575,  575,  575,
  575,  575,    0,    0,    0,    0,  574,    0,    0,    0,
    0,  575,    0,  575,    0,  575,    0,  575,  575,  575,
    0,    0,    0,    0,    0,  575,  575,  575,  575,    0,
    0,    0,  575,  575,    0,    0,    0,  575,  575,  575,
  575,  575,  575,  575,  575,    0,    0,    0,    0,    0,
  576,    0,    0,    0,    0,  576,  575,  576,  576,  576,
  576,  576,  576,  576,  576,  576,  576,  576,    0,    0,
    0,    0,  575,    0,    0,    0,    0,  576,    0,  576,
    0,  576,    0,  576,  576,  576,    0,    0,    0,    0,
    0,  576,  576,  576,  576,    0,    0,    0,  576,  576,
    0,    0,    0,    0,    0,  576,  576,  576,  576,  576,
  576,    0,    0,    0,    0,    0,  577,    0,    0,    0,
    0,  577,  576,  577,  577,  577,  577,  577,  577,  577,
  577,  577,  577,  577,    0,    0,    0,    0,  576,    0,
    0,    0,    0,  577,    0,  577,    0,  577,    0,  577,
  577,  577,    0,    0,    0,    0,    0,  577,  577,  577,
  577,    0,    0,    0,  577,  577,    0,    0,    0,    0,
    0,  577,  577,  577,  577,  577,  577,    0,    0,    0,
    0,    0,  578,    0,    0,    0,    0,  578,  577,  578,
  578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
    0,    0,    0,    0,  577,    0,    0,    0,    0,  578,
    0,  578,    0,  578,    0,  578,  578,  578,    0,    0,
    0,    0,    0,  578,  578,  578,  578,    0,    0,    0,
  578,  578,    0,    0,    0,    0,    0,  578,  578,  578,
  578,  578,  578,    0,    0,    0,    0,    0,  579,    0,
    0,    0,    0,  579,  578,  579,  579,  579,  579,  579,
  579,  579,  579,  579,  579,  579,    0,    0,    0,    0,
  578,    0,    0,    0,    0,  579,    0,  579,    0,  579,
    0,  579,  579,  579,    0,    0,    0,    0,    0,  579,
  579,  579,  579,    0,    0,    0,  579,  579,    0,    0,
    0,    0,    0,  579,  579,  579,  579,  579,  579,    0,
    0,    0,    0,    0,  580,    0,    0,    0,    0,  580,
  579,  580,  580,  580,  580,  580,  580,  580,  580,  580,
  580,  580,    0,    0,    0,    0,  579,    0,    0,    0,
    0,  580,    0,  580,    0,  580,    0,  580,  580,  580,
    0,    0,    0,    0,    0,  580,  580,  580,  580,    0,
    0,    0,  580,  580,    0,    0,    0,    0,    0,  580,
  580,  580,  580,  580,  580,    0,    0,    0,    0,    0,
  581,    0,    0,    0,    0,  581,  580,  581,  581,  581,
  581,  581,  581,  581,  581,  581,  581,  581,    0,    0,
    0,    0,  580,    0,    0,    0,    0,  581,    0,  581,
    0,  581,    0,  581,  581,  581,    0,    0,    0,    0,
    0,    0,    0,  581,  581,    0,    0,    0,  581,  581,
    0,    0,    0,    0,    0,    0,    0,  581,  581,  581,
  581,    0,    0,    0,    0,    0,  582,    0,    0,    0,
    0,  582,  581,  582,  582,  582,  582,  582,  582,  582,
  582,  582,  582,  582,    0,    0,    0,    0,  581,    0,
    0,    0,    0,  582,    0,  582,    0,  582,    0,  582,
  582,  582,    0,    0,    0,    0,    0,    0,    0,  582,
  582,    0,    0,    0,  582,  582,    0,    0,    0,    0,
    0,    0,    0,  582,  582,  582,  582,    0,    0,    0,
    0,    0,  583,    0,    0,    0,    0,  583,  582,  583,
  583,  583,  583,  583,  583,  583,  583,  583,  583,  583,
    0,    0,    0,    0,  582,    0,    0,    0,    0,  583,
    0,  583,    0,  583,    0,  583,  583,  583,    0,    0,
    0,    0,    0,    0,    0,  583,  583,    0,    0,    0,
  583,  583,    0,    0,    0,    0,    0,    0,    0,  583,
  583,  583,  583,    0,    0,    0,    0,    0,  584,    0,
    0,    0,    0,  584,  583,  584,  584,  584,  584,  584,
  584,  584,  584,  584,  584,  584,    0,    0,    0,    0,
  583,    0,    0,    0,    0,  584,    0,  584,    0,  584,
    0,  584,  584,  584,    0,    0,    0,    0,    0,    0,
    0,  584,  584,    0,    0,    0,  584,  584,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  584,  584,    0,
    0,    0,    0,    0,  585,    0,    0,    0,    0,  585,
  584,  585,  585,  585,  585,  585,  585,  585,  585,  585,
  585,  585,    0,    0,    0,    0,  584,    0,    0,    0,
    0,  585,    0,  585,    0,  585,    0,  585,  585,  585,
    0,    0,    0,    0,    0,    0,    0,  585,  585,    0,
    0,    0,  585,  585,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  585,  585,    0,    0,    0,    0,    0,
  586,    0,    0,    0,    0,  586,  585,  586,  586,  586,
  586,  586,  586,  586,  586,  586,  586,  586,    0,    0,
    0,    0,  585,    0,    0,    0,    0,  586,    0,  586,
    0,  586,    0,  586,  586,  586,    0,    0,    0,    0,
    0,    0,    0,    0,  586,    0,    0,    0,  586,  586,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  586,
  586,    0,    0,    0,    0,    0,  587,    0,    0,    0,
    0,  587,  586,  587,  587,  587,  587,  587,  587,  587,
  587,  587,  587,  587,    0,    0,    0,    0,  586,    0,
    0,    0,    0,  587,    0,  587,    0,  587,    0,  587,
  587,  587,    0,    0,    0,    0,    0,    0,    0,    0,
  587,    0,    0,    0,  587,  587,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  587,  587,    0,    0,    0,
    0,    0,  588,    0,    0,    0,    0,  588,  587,  588,
  588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
    0,    0,    0,    0,  587,    0,    0,    0,    0,  588,
    0,  588,    0,  588,    0,  588,  588,  588,    0,    0,
    0,    0,    0,    0,    0,    0,  588,    0,    0,    0,
    0,  588,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  588,  588,    0,    0,    0,    0,    0,  589,    0,
    0,    0,    0,  589,  588,  589,  589,  589,  589,  589,
  589,  589,  589,  589,  589,  589,    0,    0,    0,    0,
  588,    0,    0,    0,    0,  589,    0,  589,    0,  589,
    0,  589,  589,  589,    0,    0,    0,    0,    0,    0,
    0,    0,  589,    0,    0,    0,    0,  589,    0,    0,
    0,    0,    0,    0,    0,    0,    0,  589,  589,    0,
    0,    0,    0,    0,  590,    0,    0,    0,    0,  590,
  589,  590,  590,  590,  590,  590,  590,  590,  590,  590,
  590,  590,    0,    0,    0,    0,  589,    0,    0,    0,
    0,  590,    0,  590,    0,  590,    0,  590,  590,  590,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  590,    0,    0,    0,    0,    0,    0,
    0,    0,    0,  590,  590,    0,    0,    0,    0,    0,
  591,    0,    0,    0,    0,  591,  590,  591,  591,  591,
  591,  591,  591,  591,  591,  591,  591,  591,    0,    0,
    0,    0,  590,    0,    0,    0,    0,  591,    0,  591,
    0,  591,    0,  591,  591,  591,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  591,
    0,    0,    0,    0,    0,    0,    0,    0,    0,  591,
  591,    0,    0,    0,    0,    0,  592,    0,    0,    0,
    0,  592,  591,  592,  592,  592,  592,  592,  592,  592,
  592,  592,  592,  592,    0,    0,    0,    0,  591,    0,
    0,    0,    0,  592,    0,  592,    0,  592,    0,  592,
  592,  592,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,  592,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,  592,    0,    0,    0,
    0,    0,  593,    0,    0,    0,    0,  593,  592,  593,
  593,  593,  593,  593,  593,  593,  593,  593,  593,  593,
    0,    0,    0,    0,  592,    0,    0,    0,    0,  593,
    0,  593,    0,  593,    0,  593,  593,  593,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,  593,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,  593,    0,   61,    0, 1361,    0,  594,    0,
    0,    0,    0,  594,  593,  594,  594,  594,  594,  594,
  594,  594,  594,  594,  594,  594,    0,   62,    0,    0,
  593,    0,    0,    0,    0,  594,    0,  594,    0,  594,
   63,  594,  594,  594,   61,   65,    0,    0,    0,    0,
   66,    0,   67,   68,   69,   70,    0,  594, 1362,    0,
   71,    0,    0,    0,   72,    0,    0,   62,    0,    0,
    0,    0,    0,    0,   61,    0,   73,    0,    0,   74,
   63,   75,    0,    0,   64,   65,    0,    0,    0,    0,
   66,    0,   67,   68,   69,   70,  594,   62,    0,    0,
   71,    0,    0,    0,   72,    0,   61,    0, 1338,    0,
   63,    0,    0,    0,    0,   65,   73,    0,    0,   74,
   66,   75,   67,   68,   69,   70,    0,    0, 1339,   62,
   71,    0,    0,    0,   72,    0,   61,    0,    0,    0,
    0,    0,   63,    0,    0,    0,   73,   65,    0,   74,
    0,   75,   66,    0,   67,   68,   69,   70,    0,   62,
    0,    0,   71,    0,    0,    0,   72,    0,   61,    0,
 1361,    0,   63,    0,    0,    0,    0,   65,   73,    0,
    0,   74,   66,   75,   67,   68,   69,   70,    0,    0,
 1362,   62,   71,    0,    0,    0,   72,    0,   61,    0,
    0,    0,    0,    0,   63,    0,    0,    0,   73,   65,
    0,   74,    0,   75,   66,    0,   67,   68,   69,   70,
    0,   62,    0,    0,   71,    0,    0,    0,   72,    0,
    0,    0,    0,    0,   63,    0,    0,    0,    0,   65,
   73,    0,    0,   74,   66,   75,   67,   68,   69,   70,
    0,    0,    0,    0,   71,    0,    0,    0,   72,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
   73,    0,    0,   74,    0,   75,
  };
  protected static  short [] yyCheck = {            52,
    0,   77,  266,   52,    7,   52,   52,   90,  409,    9,
  249,  369,   76,   29,  479,  233,  334,  364,  575,  344,
  102,  129,  343,  406,  341,  490,  594,    2,  264,    4,
  587,    9, 1163,   80,  270,   52,    0,  260,  867,  952,
    0,    0,  333,   52,  256,  170,  268,   76, 1179,  268,
    9,  102,   55,   53,  101,  837,   52,  257,  256,    9,
   81,  294,  721,  119,   52,  366,  268,  901,    2,  122,
    4,   46,  287,   52,  276,  290,  129,  256,  256,  256,
   52,   87,   52,   52,  131,  102,  359,  408,  135,   52,
  107,  144,  739,  256,   53,  146,  147,  148,  149,  150,
  151,  152,  153,   53,   52,  257,  374,   82,   52,  325,
  366,   52,   46,  256,  170,  256,   91,  374, 1193,  282,
  141,  142,  857,  858,  256,  772,  427,  256, 1017,  361,
  256,  366,  256,  742,  257,  335,  256,  256,  194,  335,
  372,  162,   76,  256,  366,  256,  262,   81,   82, 1224,
  256,  314,  294,  426,  160,  256,  368,   91,  358,  427,
  372,  943,  215,  997,  306,  999,  215,  367,  215,  215,
  427,  427,  146,  147,  148,  149,  150,  151,  152,  153,
  305, 1070,  298,  418,  399,  418,  359,  365,  403,  367,
  367,  369,  370,  256,  372,  259,  374,  261,  215,  305,
  422, 1332,  418,  422,  392,  393,  215,  141,  142,  366,
  869,  946,  871,  269,  366,  257,  418,  575, 1047,  215,
  418,  956,  365,  423,  424,  425,  358,  215,  162,  587,
  259,  374,  261,  256,  287,  700,  215,  290,  367,  418,
  887,  419,  420,  215,  297,  215,  215,  856,  301,  305,
  250,  474,  215,  426,  367,  418,  367,  904,  905,  341,
  376,  377, 1091, 1092,  365, 1178,  367,  215,  369,  333,
  427,  215,  250,  564,  215,  281,  418,  418,  366, 1192,
  256, 1194,  891,  336,  372,  359,  339,  340,  309,  345,
  341,  250,  418,  257,  418,  351,  302,  257,  418,  418,
  250,  257,  870,  371,  367,  358,  374,  360,  371,  366,
  256,  364,  359,  294,  335,  389,  371,  334,  419,  420,
  369,  294,  386,  369,  671,  259, 1155,  261,  381,  367,
  370,  352,  266,  371,  981,  391,  366, 1146, 1032, 1033,
  987,  347,  366,  360,  367,  398,  399,  668,  371,  367,
  403,  359,  369,  404,  407,  359,  409,  256,  411,  412,
  413,  414,  415,  416,  417,  418,  419,  420,  421,  374,
  427,  422,  423,  424,  294,  309,  427,  428,  359,  335,
  418, 1190,  388,  730, 1193,  389,  359,  427,  373,  365,
  443,  367,  269,  369,  370, 1089,  372,  427,  374,  333,
  339,  335,  358,  427,  425,  426,  305,  418,  389,  286,
  344,  367,  294,  421,  490, 1224,  389,  735,  352,  365,
 1114,  367,  426,  272,  367, 1119,  365,  744,  811,  367,
  404,  357,  406,  379,  418, 1146,  457,  458,  366,  359,
 1146,  384, 1146,  419,  420,  371,  384,  296,  422,  423,
  424, 1098,  386,  427,  428,  429,  430,  431,  432,  433,
  434,  435,  436,  437,  438,  439,  440,  441,  442,  389,
  372,  694,  519,  696,  323,  698,  497,  359,  484, 1190,
  335,  359, 1193, 1130, 1190,  371, 1190, 1193,  256, 1193,
  418,  425,  426,  818,  357,  501,  549,  712,  272,  714,
  564,  507,  256,  358,  557,  343,  512,  389,  371,  418,
  264,  389,  367, 1224,  561,  357,  266,  570, 1224,  572,
 1224,  359,  296,  457,  458,  367,  575,  256,  764,  575,
  594,  582,  418,  539,  357,  882,  343, 1272,  587,  586,
  359,  587,  384,  421,  343,  479,  867,  341,  599,  323,
  367,  389,  359,  418,  607,  608,  490,  610,  575,  667,
  359,  384,  379,  497,  314,    9,  373,   11,  341,  622,
  587,  325,  379,  367,  373,  365, 1133, 1312,  374,  256,
 1315, 1316,  389, 1144,  374, 1146, 1321,  802,  426,  564,
  389,  369,  360,  343,  367,  813,  602,  365,  604,  367,
  339,  369,  923,  371,  372,  368,  374, 1168,  582,  359,
  339,  379,  369,   57,  667,  668,   60,  623,  671,  426,
 1334, 1335,  334,  373,  677,  599,  365,  426,  365, 1190,
  564,  272, 1193,  374,  359,  343,  365,  374,  367,  389,
  369,  419,  420,  372,  373,  374,  306,  374,  360,   52,
  379,  359,  369,  313,  379,  296,  709,  710, 1372,  712,
  594,  714,  744, 1224,  389,  325,  687,  306,  365,  308,
  753,  379, 1146,   76,  313,  365,  426,  730,   81,  369,
 1146,  389,  323,  736,  404, 1144,  325, 1146,  365,  742,
  367,  371,  369,  744,  371,  372, 1144,  374, 1146,  102,
  706,  707,  379,  399,  107,  418,  722,  427,  428, 1168,
  365,  367,  367,  760,  370,  411, 1190,  359,  426, 1193,
 1168,  774,  739,  776, 1190,  789, 1044, 1193,  384,  419,
  420, 1190,  785,  367, 1193,  756,  256,  379,  141,  142,
  367,  261, 1190,  339, 1102, 1193,  799,  389,  367,  802,
 1224,  361,  377,  687,  807,  772,  294,  384, 1224,  162,
  379,  814,  372,  816,  284, 1224,  700,  368,  306,  365,
  256,  372,  387,  366, 1013, 1133, 1224,  297,  374,  372,
  833,  834,  302,  269,  426, 1250,  379,  307,  418,  309,
  310,  311,  312,  846,  380,  381,  426,  317,  367, 1238,
  286,  321,  372,  856,  374,  357,  870,  357,  394,  395,
  379, 1250,  215,  333,  867,  367,  336,  367,  338,  365,
  371,  371,  756,  374,  365,  369,  879,  371,  374,  882,
  357,  372,  885,  374,  384,  382,  366,  811,  891,  365,
  367,  841,  372,  370,  371,  372,  390,  391,  374,  896,
  370,  369,  873,  371,  383,  789,  259,  384,  261,  418,
  365,  368,  365,  261,  398,  372,  410,  426,  418,  374,
  887,  374,  390,  391,  418,  419,  420,  930,  370,  932,
  372,  934,  888,  357,  818, 1243,  284,  904,  905,  388,
  368,  418,  410,  367,  372,  901,  370,  371,  418,  297,
  807,  419,  420,  372,  302,  374,  309,  305,  815,  307,
  384,  309,  310,  311,  312,  339,  374,  368,  369,  317,
  344,  372,  346,  321,  374,  349,  350,  325,  352,  353,
  333,  334,  335,  368,  418,  333,  870,  372,  336,  873,
  338,  344,  945,  370,  384,  372,  339,  374,  372,  352,
  371,  344, 1005,  346, 1007, 1002, 1009,  360, 1011,  352,
  353,  370,  418,  372,  981,  374,  369,  256,  368,  369,
  987,  371,  372,  373, 1238,  365,  265,  367,  267, 1380,
 1381,  270,  372,  386,  374,  370,  275,  372,  368,  379,
  279,  997,  372, 1076, 1047,  370,  368,  372,  370,  288,
  372,  368,  357,  370,  368,  372,  295,  372,  372,  374,
  370,  300, 1065, 1016,  374,  304,  372, 1017,  374,  368,
  418,  339,  425,  426, 1024, 1025,  344,  316,  346,  318,
  337,  349,  350,  322,  352,  353,  399,  418, 1091, 1092,
  403,  330,  331,  367,  370,  334,  372,  374,  337,  384,
  385,  386, 1105, 1102,  457,  458, 1102,  396,  397, 1323,
  431,  432,  433,  434,  370,  371,  366,  367,  418,  369,
 1070,  371,  372,  372,  372,  374,  374,  370, 1342,  372,
 1344, 1098, 1135, 1136, 1133, 1102,  368, 1133,  370,  340,
  390,  391,  349,  350,  497, 1029,  368,  368,  370,  370,
  359,  360, 1155,  366,  367,  370,  369,  372,  371,  372,
  410,  354,  355, 1130,    0,  365, 1133, 1117,  374,  419,
  420,  370, 1143,  372,  368,  339,  370,  390,  391,  418,
  344,  368,  346,  370,  374,  349,  350, 1201,  352,  353,
  362,  363, 1195,  105, 1144, 1209, 1146,  410,  110,  367,
  112,  113,  418,  115,  374,  117,  419,  420,  372,  354,
  355,  564,  374,  125,  418,  127,  349,  350, 1168,  349,
  350,  370,  575,  135,  372, 1228,  138,  418,  140, 1200,
  370,  371,  958,  959,  587,  418, 1120,  362,  363,  418,
 1190,  594,  365, 1193, 1243,  429,  430, 1243,  256,  261,
  435,  436,  373,  418,  256,  369,  372,  169,  418, 1143,
 1231, 1232,  418,  370, 1261,  370,  379,  418,  374,  372,
  374,  370,  284,  370, 1224,  366, 1243,  372,  368,  294,
  294, 1252,  194, 1254,  384,  297,  370,  370,  370,  370,
  302,  370,  418,  305,  374,  307,  372,  309,  310,  311,
  312,  370,  370,  427,  379,  317,  372,  372,  370,  321,
  373,  356,  369,  325, 1340,  374, 1200, 1201,  360,  367,
 1317,  333,  339,  369,  336, 1209,  338,  344,  371,  346,
  418,  418,  349,  350,  687,  352,  353,  369, 1364, 1365,
  370,  372,  379,  372,  372,  357,  294, 1231, 1232,  372,
  370,  418,  370,  343, 1238,  367,  365,  369,  418,  371,
  371, 1358,  418, 1360, 1314,  368, 1250,  294, 1252, 1319,
 1254,  294,  384,  372,  418, 1325, 1326, 1380, 1381,  365,
 1377, 1378,  418,  371, 1334, 1335,  739,  299,  379,  371,
  256,  256,  304,  370,  339,  370,  280,  366,    0,  344,
  365,  346,  418,  756,  349,  350,  418,  352,  353,  400,
  401,  402,  403,  404,  405,  406,  407,  408,  409,  772,
  256,  257, 1372,  418,  418,  367,  358,  368,  264,  265,
  266,  267,  268,  373,  270,  271,  789,  273,  274,  275,
  276,  277,  278,  279,  356,  370,  370,  421,  374,  285,
  372,  287,  288,  289,  290,  291,  292,  372,  374,  295,
  370,  370,  347,  299,  300,  818,  302,  303,  304,  351,
  366,  370,  418,  370,  379,  339,  256,  256,  314,  366,
  316,  372,  318,  319,  347,  368,  322,  418,  324,  325,
  326,  327,  328,  329,  330,  331,  332,  333,  334,  335,
  372,  337,  372,  370,  340,  418,  368,  366,  344,  345,
  365,  365,  373,  373,  365,  348,  348,  870,  374,  369,
  873,  379,  366,  372,  366,  370,  366,  356,  305,  365,
  366,  369,  418,  369,  887,  369,  367,  418,  374,  375,
  376,  377,  378,  366,  369,  369,  382,  365,  384,  261,
  369,  904,  905,  370,  390,  391,  370,  368,  370,  365,
  370,  370,  256,  366,  367,  373,  369,  256,  371,  372,
  366,  366,  284,  366,    0,  369,  412,  413,  414,  415,
  416,  417,  418,  419,  420,  297,  422,  390,  391,  261,
  302,  427,  370,  305,  369,  307,  370,  309,  310,  311,
  312,  374,  368,  368,  365,  317,  374,  410,  520,  321,
  365,  418,  284,  325,  374,  366,  419,  420,    0,  418,
  370,  333,  370,  365,  336,  297,  338,  418,  981,  418,
  302,  374,  366,  374,  987,  307,  365,  309,  310,  311,
  312,  371,  370,  370,  368,  317,  366,  366,  560,  321,
  366,  374,  370,  325,  256,  257,  370,  366,  365,  261,
  418,  333,  370,  265,  336,  267,  338,  366,  270,  370,
  272,  273,  374,  275,  366,  277, 1029,  279,  365,  281,
  282,  283,  284,  365,   53,  287,  288,  945,   46,   91,
  712,  293, 1224,  295,  296,  297, 1168,  609,  300,  301,
  302, 1249,  304,  262,  847,  307,  418,  309,  310,  311,
  312,  712,  718, 1250,  316,  317,  318,  670,  451,  321,
  322,  323,  818, 1317,  700,  875, 1378,  869,  330,  331,
 1190,  333,  334,  335,  336,  337,  338,  875,  875,  298,
  342, 1326, 1325,  707, 1117, 1098,  418,  366,  367, 1102,
  369, 1238,  371,  372, 1024, 1120,  358,  144,  811,  628,
  799,  802,  610,  714,  366,  367,  923, 1120,  437,  622,
  438,  390,  391,  375,  744,  439,  441, 1130,  608,  440,
 1133, 1085,    0,  442,  789, 1002, 1200, 1243,  215,  102,
 1143,  410, 1052, 1102,  464, 1050,  881, 1044,  562, 1136,
  419,  420, 1248,   -1,   -1,   -1,   -1,  366,  367,   -1,
  369,   -1,  371,  372,   -1,   -1,  418,  376,  377,   -1,
   -1,  380,  381,  382,  383,  384,  385,  386,  387,  388,
   -1,  390,  391,  392,  393,  394,  395,  396,  397,  398,
  399,   -1,   -1,   -1,   -1,   -1,   -1, 1200, 1201,   -1,
   -1,  410,  411,   -1,   -1,   -1, 1209,   -1,   -1,   -1,
  419,  420,   -1,   -1,   -1,   -1,   -1,   -1,  427,   -1,
   -1,   -1,   -1,   -1,  256,  257,   -1,   -1, 1231, 1232,
    0,   -1,  264,  265,  266,  267,  268,   -1,  270,  271,
 1243,  273,  274,  275,  276,  277,  278,  279,  280, 1252,
   -1, 1254,   -1,  285,   -1,  287,  288,  289,  290,  291,
  292,   -1,   -1,  295,   -1,   -1,   -1,  299,  300,   -1,
  302,  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  314,   -1,  316,   -1,  318,  319,   -1,   -1,
  322,   -1,  324,  325,  326,  327,  328,  329,  330,  331,
  332,  333,  334,  335,   -1,  337,   -1,   -1,  340,   -1,
   -1,   -1,  344,  345,   -1,   -1,    0,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  365,  366,   -1,   -1,  369,   -1,   -1,
   -1,   -1,  374,  375,  376,  377,  378,   -1,   -1,   -1,
  382,   -1,  384,   -1,   -1,   -1,   -1,   -1,  390,  391,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  412,  413,  414,  415,  416,  417,  418,  419,  420,  257,
  422,   -1,   -1,  261,    0,  427,   -1,  265,   -1,  267,
   -1,   -1,  270,   -1,  272,   -1,   -1,  275,   -1,  277,
   -1,  279,   -1,  281,   -1,   -1,  284,   -1,   -1,  287,
  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,  296,  297,
   -1,   -1,  300,  301,  302,   -1,  304,   -1,   -1,  307,
   -1,  309,  310,  311,  312,   -1,   -1,   -1,  316,  317,
  318,   -1,   -1,  321,  322,  323,   -1,   -1,   -1,   -1,
   -1,   -1,  330,  331,   -1,  333,  334,  335,  336,  337,
  338,   -1,    0,   -1,  342,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,   -1,   -1,
  358,  261,   -1,   -1,   -1,  265,   -1,  267,  366,  367,
  270,   -1,  272,   -1,   -1,  275,   -1,  277,   -1,  279,
   -1,  281,   -1,   -1,  284,   -1,   -1,  287,  288,   -1,
   -1,   -1,   -1,   -1,   -1,  295,  296,  297,   -1,   -1,
  300,  301,  302,   -1,  304,   -1,   -1,  307,   -1,  309,
  310,  311,  312,   -1,   -1,   -1,  316,  317,  318,   -1,
  418,  321,  322,  323,   -1,   -1,   -1,   -1,   -1,   -1,
  330,  331,   -1,  333,  334,   -1,  336,  337,  338,   -1,
   -1,   -1,  342,  257,   -1,   -1,   -1,  261,   -1,   -1,
   -1,  265,   -1,  267,   -1,   -1,  270,   -1,  272,   -1,
   -1,  275,   -1,  277,   -1,  279,   -1,  281,   -1,   -1,
  284,   -1,   -1,  287,  288,   -1,   -1,   -1,   -1,   -1,
   -1,  295,  296,  297,   -1,   -1,  300,  301,  302,   -1,
  304,   -1,   -1,  307,   -1,  309,  310,  311,  312,   -1,
   -1,   -1,  316,  317,  318,   -1,   -1,  321,  322,  323,
   -1,   -1,   -1,   -1,   -1,   -1,  330,  331,  418,  333,
  334,  257,  336,  337,  338,  261,   -1,   -1,  342,  265,
   -1,  267,   -1,   -1,  270,   -1,  272,   -1,   -1,  275,
   -1,  277,   -1,  279,   -1,  281,   -1,   -1,  284,   -1,
   -1,  287,  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,
  296,  297,   -1,   -1,  300,  301,  302,   -1,  304,   -1,
   -1,  307,   -1,  309,  310,  311,  312,   -1,   -1,   -1,
  316,  317,  318,   -1,   -1,  321,  322,  323,   -1,   -1,
   -1,   -1,   -1,   -1,  330,  331,   -1,  333,  334,   -1,
  336,  337,  338,  261,  418,  285,  342,  265,   -1,  267,
   -1,   -1,  270,   -1,  272,   -1,   -1,  275,   -1,  277,
   -1,  279,   -1,  281,   -1,   -1,  284,   -1,   -1,  287,
  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,  296,  297,
   -1,   -1,  300,  301,  302,   -1,  304,  327,   -1,  307,
   -1,  309,  310,  311,  312,   -1,   -1,   -1,  316,  317,
  318,   -1,   -1,  321,  322,  323,   -1,   -1,   -1,   -1,
   -1,   -1,  330,  331,   -1,  333,  334,   -1,  336,  337,
  338,  256,  418,   -1,  342,   -1,  261,  262,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  375,  376,  377,  378,   -1,
  380,  381,  382,  383,  384,  385,  386,  387,   -1,  284,
  390,  391,  392,  393,  394,  395,  396,  397,   -1,  294,
   -1,   -1,  297,  298,   -1,   -1,   -1,  302,   -1,   -1,
  305,   -1,  307,   -1,  309,  310,  311,  312,   -1,   -1,
   -1,   -1,  317,   -1,   -1,   -1,  321,   -1,   -1,   -1,
  325,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  333,   -1,
  418,  336,   -1,  338,  339,   -1,   -1,   -1,   -1,  344,
   -1,  346,  347,  348,  349,  350,  351,  352,  353,  354,
  355,  356,  357,   -1,   -1,   -1,  361,   -1,   -1,   -1,
  365,  366,   -1,  368,  369,  370,  371,  372,  373,  374,
   -1,  376,  377,   -1,  379,  380,  381,  382,  383,  384,
  385,  386,  387,  388,   -1,  390,  391,  392,  393,  394,
  395,  396,  397,  398,  399,  400,  401,  402,  403,  404,
  405,  406,  407,  408,  409,  410,  411,   -1,   -1,  256,
   -1,   -1,   -1,  418,  419,  420,   -1,  264,  265,  266,
  267,   -1,  427,  270,  271,   -1,  273,  274,  275,  276,
  277,  278,  279,   -1,   -1,   -1,   -1,   -1,  285,   -1,
  287,  288,  289,  290,  291,  292,   -1,   -1,  295,   -1,
   -1,   -1,  299,  300,   -1,  302,  303,  304,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  314,   -1,  316,
   -1,  318,  319,   -1,   -1,  322,   -1,  324,  325,  326,
  327,  328,  329,  330,  331,  332,  333,  334,  335,   -1,
  337,   -1,   -1,  340,   -1,   -1,   -1,  344,  345,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  365,   -1,
   -1,   -1,  369,   -1,   -1,   -1,   -1,  374,  375,  376,
  377,  378,   -1,   -1,   -1,  382,  256,  384,   -1,   -1,
   -1,  261,  262,  390,  391,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  284,  412,  413,  414,  415,  416,
  417,  418,  419,  420,  294,   -1,   -1,  297,  298,   -1,
  427,   -1,  302,   -1,   -1,  305,   -1,  307,   -1,  309,
  310,  311,  312,   -1,   -1,   -1,   -1,  317,   -1,   -1,
   -1,  321,   -1,   -1,   -1,  325,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  333,   -1,   -1,  336,   -1,  338,  339,
   -1,   -1,   -1,   -1,  344,   -1,  346,  347,  348,  349,
  350,  351,  352,  353,  354,  355,  356,  357,   -1,   -1,
   -1,  361,   -1,   -1,   -1,  365,  366,  367,  368,  369,
  370,  371,  372,  373,  374,   -1,  376,  377,   -1,   -1,
  380,  381,  382,  383,  384,   -1,   -1,  387,  388,   -1,
   -1,   -1,  392,  393,  394,  395,  396,  397,  398,  399,
  256,   -1,   -1,   -1,   -1,  261,  262,   -1,   -1,   -1,
   -1,  411,   -1,   -1,   -1,   -1,   -1,   -1,  418,  419,
  420,   -1,   -1,   -1,   -1,   -1,   -1,  427,  284,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  294,   -1,
   -1,  297,  298,   -1,   -1,   -1,  302,   -1,   -1,   -1,
   -1,  307,   -1,  309,  310,  311,  312,   -1,   -1,   -1,
   -1,  317,   -1,   -1,   -1,  321,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  333,   -1,   -1,
  336,   -1,  338,  339,   -1,   -1,   -1,   -1,  344,   -1,
  346,  347,  348,  349,  350,  351,  352,  353,  354,  355,
  356,  357,   -1,   -1,   -1,  361,   -1,   -1,   -1,  365,
  366,  367,  368,  369,  370,  371,  372,  373,  374,   -1,
  376,  377,   -1,   -1,  380,  381,  382,  383,  384,   -1,
   -1,  387,  388,   -1,   -1,   -1,  392,  393,  394,  395,
  396,  397,  398,  399,  256,   -1,   -1,   -1,   -1,  261,
  262,   -1,   -1,   -1,   -1,  411,   -1,   -1,   -1,   -1,
   -1,   -1,  418,  419,  420,   -1,   -1,   -1,   -1,   -1,
   -1,  427,  284,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  294,   -1,   -1,  297,  298,   -1,   -1,   -1,
  302,   -1,   -1,  305,   -1,  307,   -1,  309,  310,  311,
  312,   -1,   -1,   -1,   -1,  317,   -1,   -1,   -1,  321,
   -1,   -1,   -1,  325,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  333,   -1,   -1,  336,   -1,  338,  339,   -1,   -1,
   -1,   -1,  344,   -1,  346,  347,  348,  349,  350,  351,
  352,  353,  354,  355,  356,   -1,   -1,   -1,   -1,  361,
   -1,   -1,   -1,  365,  366,  367,  368,  369,  370,   -1,
  372,  373,  374,   -1,  376,  377,   -1,   -1,  380,  381,
  382,  383,  384,   -1,   -1,  387,  388,   -1,   -1,   -1,
  392,  393,  394,  395,  396,  397,  398,  399,  256,   -1,
   -1,   -1,   -1,  261,  262,   -1,   -1,   -1,   -1,  411,
   -1,   -1,   -1,   -1,   -1,   -1,  418,  419,  420,   -1,
   -1,   -1,   -1,   -1,   -1,  427,  284,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  294,   -1,   -1,  297,
  298,   -1,   -1,   -1,  302,   -1,   -1,  305,   -1,  307,
   -1,  309,  310,  311,  312,   -1,   -1,   -1,   -1,  317,
   -1,   -1,   -1,  321,   -1,   -1,   -1,  325,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  333,   -1,   -1,  336,   -1,
  338,  339,   -1,   -1,   -1,   -1,  344,   -1,  346,  347,
  348,  349,  350,  351,  352,  353,  354,  355,  356,   -1,
   -1,   -1,   -1,  361,   -1,   -1,   -1,  365,  366,   -1,
  368,  369,  370,   -1,  372,  373,  374,   -1,  376,  377,
  256,   -1,  380,  381,  382,  383,  262,  261,   -1,  387,
  388,   -1,   -1,   -1,  392,  393,  394,  395,  396,  397,
  398,  399,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  284,   -1,   -1,  411,   -1,   -1,   -1,   -1,  294,   -1,
  418,   -1,  298,  297,   -1,   -1,   -1,   -1,  302,  427,
   -1,   -1,   -1,  307,   -1,  309,  310,  311,  312,   -1,
   -1,   -1,   -1,  317,   -1,   -1,   -1,  321,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  333,
   -1,   -1,  336,  339,  338,   -1,   -1,   -1,  344,   -1,
  346,  347,  348,  349,  350,  351,  352,  353,  354,  355,
  356,   -1,   -1,   -1,   -1,  361,   -1,   -1,  262,  365,
  366,   -1,  368,  369,  370,   -1,  372,  373,  374,   -1,
  376,  377,   -1,   -1,  380,  381,  382,  383,   -1,   -1,
   -1,  387,  388,   -1,   -1,   -1,  392,  393,  394,  395,
  396,  397,  398,  399,  298,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  411,   -1,   -1,   -1,   -1,
   -1,   -1,  418,   -1,  418,   -1,   -1,   -1,   -1,   -1,
   -1,  427,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,   -1,
  344,   -1,  346,  347,  348,  349,  350,  351,  352,  353,
  354,  355,  356,  357,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  366,  367,  368,  369,  370,  371,  372,  373,
  374,   -1,  376,  377,  262,  379,  380,  381,  382,  383,
  384,  385,  386,  387,  388,   -1,  390,  391,  392,  393,
  394,  395,  396,  397,  398,  399,  400,  401,  402,  403,
  404,  405,  406,  407,  408,  409,  410,  411,   -1,   -1,
  298,   -1,   -1,   -1,  418,  419,  420,   -1,   -1,   -1,
   -1,   -1,   -1,  427,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  339,   -1,   -1,   -1,   -1,  344,   -1,  346,  347,
  348,  349,  350,  351,  352,  353,  354,  355,  356,  357,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  366,  367,
  368,  369,  370,  371,  372,  373,  374,   -1,  376,  377,
  262,  379,  380,  381,  382,  383,  384,  385,  386,  387,
  388,   -1,  390,  391,  392,  393,  394,  395,  396,  397,
  398,  399,  400,  401,  402,  403,  404,  405,  406,  407,
  408,  409,  410,  411,   -1,   -1,  298,   -1,   -1,   -1,
  418,  419,  420,   -1,   -1,   -1,   -1,   -1,   -1,  427,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  339,   -1,   -1,
   -1,   -1,  344,   -1,  346,  347,  348,  349,  350,  351,
  352,  353,  354,  355,  356,  357,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  366,  367,  368,  369,  370,  371,
  372,  373,  374,   -1,  376,  262,   -1,  379,  380,  381,
  382,  383,  384,  385,  386,  387,  388,   -1,  390,  391,
  392,  393,  394,  395,  396,  397,  398,  399,  400,  401,
  402,  403,  404,  405,  406,  407,  408,  409,  410,  411,
   -1,  298,   -1,   -1,   -1,   -1,  418,  419,  420,   -1,
   -1,   -1,   -1,   -1,   -1,  427,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,   -1,  346,
  347,  348,  349,  350,  351,  352,  353,  354,  355,  356,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  366,
  367,  368,  369,  370,  371,  372,  373,  374,   -1,  376,
  377,  262,  379,  380,  381,  382,  383,  384,  385,  386,
  387,  388,   -1,  390,  391,  392,  393,  394,  395,  396,
  397,  398,  399,  400,  401,  402,  403,  404,  405,  406,
  407,  408,  409,  410,  411,   -1,   -1,  298,   -1,   -1,
   -1,   -1,  419,  420,   -1,   -1,   -1,   -1,   -1,   -1,
  427,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  339,   -1,
   -1,   -1,   -1,  344,   -1,  346,  347,  348,  349,  350,
  351,  352,  353,  354,  355,  356,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  365,  366,   -1,  368,  369,  370,
  371,  372,  373,  374,   -1,  376,  377,  262,  379,  380,
  381,  382,  383,  384,  385,  386,  387,  388,   -1,  390,
  391,  392,  393,  394,  395,  396,  397,  398,  399,  400,
  401,  402,  403,  404,  405,  406,  407,  408,  409,  410,
  411,   -1,   -1,  298,   -1,   -1,   -1,   -1,  419,  420,
   -1,   -1,   -1,   -1,   -1,   -1,  427,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,
   -1,  346,  347,  348,  349,  350,  351,  352,  353,  354,
  355,  356,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  366,   -1,  368,  369,  370,  371,  372,  373,  374,
   -1,  376,  377,  262,  379,  380,  381,  382,  383,  384,
  385,  386,  387,  388,   -1,  390,  391,  392,  393,  394,
  395,  396,  397,  398,  399,  400,  401,  402,  403,  404,
  405,  406,  407,  408,  409,  410,  411,   -1,   -1,  298,
   -1,   -1,   -1,   -1,  419,  420,   -1,   -1,   -1,   -1,
   -1,   -1,  427,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  339,   -1,   -1,   -1,   -1,  344,   -1,  346,  347,  348,
  349,  350,  351,  352,  353,  354,  355,  356,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  366,   -1,  368,
  369,  370,  371,  372,  373,  374,   -1,  376,  377,  262,
  379,  380,  381,  382,  383,  384,  385,  386,  387,  388,
   -1,  390,  391,  392,  393,  394,  395,  396,  397,  398,
  399,  400,  401,  402,  403,  404,  405,  406,  407,  408,
  409,  410,  411,   -1,   -1,  298,   -1,   -1,   -1,   -1,
  419,  420,   -1,   -1,   -1,   -1,   -1,   -1,  427,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  262,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,
   -1,  344,   -1,  346,  347,  348,  349,  350,  351,  352,
  353,  354,  355,  356,  298,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  366,   -1,  368,   -1,  370,   -1,  372,
  373,  374,   -1,  376,  377,   -1,  379,  380,  381,  382,
  383,  384,  385,  386,  387,  388,  262,   -1,   -1,  392,
  393,  394,  395,  396,  397,  398,  399,  400,  401,  402,
  403,  404,  405,  406,  407,  408,  409,   -1,  411,   -1,
   -1,   -1,   -1,  357,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  298,  367,  427,  369,   -1,  371,   -1,   -1,
  374,   -1,  376,  377,   -1,  379,  380,  381,  382,  383,
  384,  385,  386,  387,  388,   -1,  390,  391,  392,  393,
  394,  395,  396,  397,  398,  399,  400,  401,  402,  403,
  404,  405,  406,  407,  408,  409,  410,  411,   -1,   -1,
   -1,   -1,  262,   -1,  418,  419,  420,   -1,   -1,   -1,
   -1,   -1,   -1,  427,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  369,  370,  371,  372,   -1,  374,   -1,
  376,  377,   -1,  379,  380,  381,  382,  383,  298,  385,
  386,  387,  388,   -1,  390,  391,  392,  393,  394,  395,
  396,  397,  398,  399,  400,  401,  402,  403,  404,  405,
  406,  407,  408,  409,  410,  411,   -1,   -1,  262,   -1,
   -1,   -1,  418,  419,  420,   -1,   -1,   -1,   -1,  339,
   -1,  427,   -1,   -1,  344,   -1,  346,  347,  348,  349,
  350,  351,  352,  353,  354,  355,  356,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  298,   -1,  366,   -1,  368,   -1,
  370,   -1,  372,  373,  374,   -1,  376,  377,   -1,   -1,
  380,  381,  382,  383,  384,  385,  386,  387,  388,   -1,
   -1,   -1,  392,  393,  394,  395,  396,  397,  398,  399,
   -1,   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,   -1,
  344,  411,  346,  347,  348,  349,  350,  351,  352,  353,
  354,  355,  356,   -1,   -1,   -1,   -1,  427,   -1,   -1,
  262,   -1,  366,   -1,  368,   -1,  370,   -1,  372,  373,
  374,   -1,  376,  377,   -1,   -1,  380,  381,  382,  383,
   -1,   -1,   -1,  387,  388,   -1,   -1,   -1,  392,  393,
  394,  395,  396,  397,  398,  399,  298,   -1,   -1,   -1,
   -1,  339,   -1,   -1,   -1,   -1,  344,  411,  346,  347,
  348,  349,  350,  351,  352,  353,  354,  355,  356,   -1,
   -1,   -1,   -1,  427,   -1,   -1,  262,   -1,  366,   -1,
  368,   -1,  370,   -1,  372,  373,  374,  339,   -1,   -1,
   -1,   -1,  344,   -1,  346,  347,  348,  349,  350,  351,
  352,  353,  354,  355,  356,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  298,   -1,  366,   -1,  368,   -1,  370,   -1,
  372,  373,  374,   -1,  376,  377,   -1,   -1,  380,  381,
  382,  383,   -1,   -1,   -1,  387,  388,   -1,   -1,  427,
  392,  393,  394,  395,  396,  397,  398,  399,   -1,   -1,
   -1,   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,  411,
  346,  347,  348,  349,  350,  351,  352,  353,  354,  355,
  356,   -1,   -1,   -1,   -1,  427,   -1,   -1,  262,   -1,
  366,   -1,  368,   -1,  370,   -1,  372,  373,  374,   -1,
  376,  377,   -1,   -1,  380,  381,  382,  383,   -1,   -1,
   -1,  387,  388,   -1,   -1,   -1,  392,  393,  394,  395,
  396,  397,  398,  399,  298,   -1,   -1,   -1,   -1,  339,
   -1,   -1,   -1,   -1,  344,  411,  346,  347,  348,  349,
  350,  351,  352,  353,  354,  355,   -1,   -1,   -1,   -1,
   -1,  427,   -1,   -1,   -1,   -1,  366,   -1,  368,   -1,
  370,   -1,  372,  373,  374,  339,   -1,   -1,   -1,   -1,
  344,   -1,  346,  347,  348,  349,  350,  351,  352,  353,
  354,  355,  356,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  366,   -1,  368,   -1,  370,   -1,  372,  373,
  374,   -1,  376,  377,   -1,   -1,  380,  381,  382,  383,
   -1,   -1,   -1,  387,  388,   -1,   -1,  427,  392,  393,
  394,  395,  396,  397,  398,  399,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  411,   -1,   -1,
  256,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  264,  265,
  266,  267,   -1,  427,  270,  271,   -1,  273,  274,  275,
  276,  277,  278,  279,   -1,   -1,   -1,   -1,   -1,  285,
   -1,  287,  288,  289,  290,  291,  292,   -1,   -1,  295,
   -1,   -1,   -1,  299,  300,   -1,  302,  303,  304,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  314,   -1,
  316,   -1,  318,  319,   -1,   -1,  322,   -1,  324,  325,
  326,  327,  328,  329,  330,  331,  332,  333,  334,  335,
   -1,  337,   -1,   -1,  340,   -1,   -1,   -1,  344,  345,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  365,
   -1,   -1,   -1,  369,   -1,   -1,   -1,   -1,  374,  375,
  376,  377,  378,   -1,   -1,   -1,  382,   -1,  384,   -1,
   -1,   -1,   -1,   -1,  390,  391,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  412,  413,  414,  415,
  416,  417,  418,  419,  420,  256,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  264,  265,  266,  267,   -1,   -1,  270,
  271,   -1,  273,  274,  275,  276,  277,  278,  279,   -1,
   -1,   -1,   -1,   -1,  285,   -1,  287,  288,  289,  290,
  291,  292,   -1,   -1,  295,   -1,   -1,   -1,  299,  300,
   -1,  302,  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  314,   -1,  316,   -1,  318,  319,   -1,
   -1,  322,   -1,  324,  325,  326,  327,  328,  329,  330,
  331,  332,  333,  334,  335,   -1,  337,   -1,   -1,  340,
   -1,   -1,   -1,  344,  345,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  365,   -1,   -1,   -1,  369,   -1,
   -1,   -1,   -1,  374,  375,  376,  377,  378,   -1,   -1,
   -1,  382,   -1,  384,   -1,   -1,   -1,   -1,   -1,  390,
  391,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  412,  413,  414,  415,  416,  417,  418,  419,  420,
  256,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  264,  265,
  266,  267,   -1,   -1,  270,  271,   -1,  273,  274,  275,
  276,  277,  278,  279,   -1,   -1,   -1,   -1,   -1,  285,
   -1,  287,  288,  289,  290,  291,  292,   -1,   -1,  295,
   -1,   -1,   -1,  299,  300,   -1,  302,  303,  304,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  314,   -1,
  316,   -1,  318,  319,   -1,   -1,  322,   -1,  324,  325,
  326,  327,  328,  329,  330,  331,  332,  333,  334,  335,
   -1,  337,   -1,   -1,  340,   -1,   -1,   -1,  344,  345,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  365,
   -1,   -1,   -1,  369,   -1,   -1,   -1,   -1,  374,  375,
  376,  377,  378,   -1,   -1,   -1,  382,   -1,  384,   -1,
   -1,   -1,   -1,   -1,  390,  391,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  412,  413,  414,  415,
  416,  417,  418,  419,  420,  256,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  264,  265,  266,  267,   -1,   -1,  270,
  271,   -1,  273,  274,  275,  276,  277,  278,  279,   -1,
   -1,   -1,   -1,   -1,  285,   -1,  287,  288,  289,  290,
  291,  292,   -1,   -1,  295,   -1,   -1,   -1,  299,  300,
   -1,  302,  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  314,   -1,  316,   -1,  318,  319,   -1,
   -1,  322,   -1,  324,  325,  326,  327,  328,  329,  330,
  331,  332,  333,  334,  335,   -1,  337,   -1,   -1,  340,
   -1,   -1,   -1,  344,  345,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  365,   -1,   -1,   -1,  369,   -1,
   -1,   -1,   -1,  374,  375,  376,  377,  378,   -1,   -1,
   -1,  382,   -1,  384,   -1,   -1,   -1,   -1,   -1,  390,
  391,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  412,  413,  414,  415,  416,  417,  418,  419,  420,
  256,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  264,  265,
   -1,  267,   -1,   -1,  270,  271,   -1,   -1,   -1,  275,
  276,  277,   -1,  279,   -1,   -1,   -1,   -1,   -1,  285,
   -1,   -1,  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,
   -1,   -1,   -1,   -1,  300,   -1,  302,  303,  304,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  316,   -1,  318,  319,   -1,   -1,  322,   -1,   -1,  325,
   -1,  327,   -1,  329,  330,  331,  332,   -1,  334,   -1,
   -1,  337,   -1,   -1,   -1,   -1,   -1,   -1,  344,  345,
   -1,   -1,   -1,   -1,   -1,  261,   -1,  263,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  368,  369,   -1,   -1,  372,   -1,  284,  375,
  376,  377,  378,   -1,   -1,   -1,  382,   -1,  384,   -1,
   -1,  297,   -1,   -1,  390,  391,  302,   -1,   -1,   -1,
   -1,  307,   -1,  309,  310,  311,  312,   -1,   -1,  315,
   -1,  317,   -1,   -1,   -1,  321,  412,  413,  414,  415,
  416,  417,  418,  419,  420,  256,   -1,  333,   -1,   -1,
  336,   -1,  338,  264,  265,   -1,  267,   -1,   -1,  270,
  271,   -1,   -1,   -1,  275,  276,  277,   -1,  279,   -1,
   -1,   -1,   -1,   -1,  285,   -1,   -1,  288,   -1,   -1,
  366,   -1,   -1,   -1,  295,   -1,   -1,   -1,   -1,  300,
   -1,  302,  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  316,   -1,  318,  319,   -1,
   -1,  322,   -1,   -1,  325,   -1,  327,   -1,  329,  330,
  331,  332,   -1,  334,   -1,   -1,  337,   -1,   -1,   -1,
   -1,   -1,   -1,  344,  345,   -1,   -1,   -1,   -1,   -1,
  261,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  368,  369,   -1,
   -1,  372,   -1,  284,  375,  376,  377,  378,   -1,   -1,
   -1,  382,   -1,  384,   -1,   -1,  297,   -1,   -1,  390,
  391,  302,   -1,   -1,   -1,   -1,  307,   -1,  309,  310,
  311,  312,   -1,   -1,  315,   -1,  317,   -1,   -1,   -1,
  321,  412,  413,  414,  415,  416,  417,  418,  419,  420,
  256,   -1,  333,   -1,   -1,  336,   -1,  338,  264,  265,
   -1,  267,   -1,   -1,  270,  271,   -1,   -1,   -1,  275,
  276,  277,   -1,  279,   -1,   -1,   -1,   -1,   -1,  285,
   -1,   -1,  288,   -1,   -1,  366,   -1,   -1,   -1,  295,
   -1,   -1,   -1,   -1,  300,   -1,  302,  303,  304,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  316,   -1,  318,  319,   -1,   -1,  322,   -1,   -1,  325,
   -1,  327,   -1,  329,  330,  331,  332,   -1,  334,   -1,
   -1,  337,   -1,   -1,   -1,   -1,   -1,   -1,  344,  345,
   -1,   -1,   -1,   -1,   -1,  261,   -1,  263,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  365,
  366,   -1,   -1,  369,   -1,   -1,   -1,   -1,  284,  375,
  376,  377,  378,   -1,   -1,   -1,  382,   -1,  384,   -1,
   -1,  297,   -1,   -1,  390,  391,  302,   -1,   -1,   -1,
   -1,  307,   -1,  309,  310,  311,  312,   -1,   -1,   -1,
   -1,  317,   -1,   -1,   -1,  321,  412,  413,  414,  415,
  416,  417,  418,  419,  420,  256,   -1,  333,   -1,   -1,
  336,   -1,  338,  264,  265,   -1,  267,   -1,   -1,  270,
  271,   -1,   -1,   -1,  275,  276,  277,   -1,  279,   -1,
   -1,   -1,   -1,   -1,  285,   -1,   -1,  288,   -1,   -1,
  366,   -1,   -1,   -1,  295,   -1,   -1,   -1,   -1,  300,
   -1,  302,  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  316,   -1,  318,  319,   -1,
   -1,  322,   -1,   -1,  325,   -1,  327,   -1,  329,  330,
  331,  332,   -1,  334,   -1,   -1,  337,   -1,   -1,   -1,
   -1,   -1,   -1,  344,  345,   -1,   -1,   -1,   -1,   -1,
  261,   -1,  263,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  369,   -1,
   -1,   -1,   -1,  284,  375,  376,  377,  378,   -1,   -1,
   -1,  382,   -1,  384,   -1,   -1,  297,   -1,   -1,  390,
  391,  302,   -1,   -1,   -1,   -1,  307,   -1,  309,  310,
  311,  312,   -1,   -1,  315,   -1,  317,   -1,   -1,   -1,
  321,  412,  413,  414,  415,  416,  417,  418,  419,  420,
  256,   -1,  333,   -1,   -1,  336,   -1,  338,  264,  265,
   -1,  267,   -1,   -1,  270,  271,   -1,  256,   -1,  275,
  276,  277,   -1,  279,   -1,   -1,  265,   -1,  267,  285,
   -1,  270,  288,   -1,   -1,   -1,  275,   -1,   -1,  295,
  279,   -1,   -1,   -1,  300,   -1,  302,  303,  304,  288,
   -1,   -1,   -1,   -1,   -1,   -1,  295,   -1,   -1,   -1,
  316,  300,  318,  319,   -1,  304,  322,   -1,   -1,  325,
   -1,  327,   -1,  329,  330,  331,  332,  316,  334,  318,
   -1,  337,   -1,  322,   -1,   -1,   -1,   -1,  344,  345,
   -1,  330,  331,   -1,   -1,  334,   -1,   -1,  337,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  369,   -1,   -1,   -1,   -1,   -1,  375,
  376,  377,  378,   -1,   -1,   -1,  382,   -1,  384,   -1,
   -1,   -1,   -1,   -1,  390,  391,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  412,  413,  414,  415,
  416,  417,  418,  419,  420,  264,  265,   -1,  267,   -1,
   -1,  270,  271,   -1,  256,   -1,  275,  276,  277,  418,
  279,   -1,   -1,  265,   -1,  267,  285,   -1,  270,  288,
   -1,   -1,   -1,  275,   -1,   -1,  295,  279,   -1,   -1,
   -1,  300,   -1,  302,  303,  304,  288,   -1,   -1,   -1,
   -1,   -1,   -1,  295,   -1,   -1,   -1,  316,  300,  318,
  319,   -1,  304,  322,   -1,   -1,  325,   -1,  327,   -1,
  329,  330,  331,  332,  316,  334,  318,   -1,  337,   -1,
  322,   -1,   -1,   -1,   -1,  344,  345,   -1,  330,  331,
   -1,   -1,  334,   -1,   -1,  337,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  365,  366,   -1,   -1,
  369,   -1,   -1,   -1,   -1,   -1,  375,  376,  377,  378,
   -1,   -1,   -1,  382,   -1,  384,   -1,   -1,   -1,   -1,
   -1,  390,  391,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  412,  413,  414,  415,  416,  417,  418,
  419,  420,  264,  265,   -1,  267,   -1,  426,  270,  271,
   -1,   -1,   -1,  275,  276,  277,  418,  279,   -1,   -1,
   -1,   -1,   -1,  285,   -1,   -1,  288,   -1,   -1,   -1,
   -1,   -1,   -1,  295,   -1,   -1,   -1,   -1,  300,   -1,
  302,  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  316,   -1,  318,  319,   -1,   -1,
  322,   -1,   -1,  325,   -1,  327,   -1,  329,  330,  331,
  332,   -1,  334,   -1,   -1,  337,   -1,   -1,   -1,   -1,
   -1,   -1,  344,  345,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  365,   -1,   -1,   -1,  369,   -1,   -1,
   -1,   -1,   -1,  375,  376,  377,  378,   -1,   -1,   -1,
  382,   -1,  384,   -1,   -1,   -1,   -1,   -1,  390,  391,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  412,  413,  414,  415,  416,  417,  418,  419,  420,  256,
   -1,   -1,   -1,   -1,  426,   -1,   -1,  264,  265,   -1,
  267,   -1,   -1,  270,  271,   -1,  256,   -1,  275,  276,
  277,   -1,  279,   -1,   -1,  265,   -1,  267,  285,   -1,
  270,  288,   -1,   -1,   -1,  275,   -1,   -1,  295,  279,
   -1,   -1,   -1,  300,   -1,  302,  303,  304,  288,   -1,
   -1,   -1,   -1,   -1,   -1,  295,   -1,   -1,   -1,  316,
  300,  318,  319,   -1,  304,  322,   -1,   -1,  325,   -1,
  327,   -1,  329,  330,  331,  332,  316,  334,  318,  265,
  337,  267,  322,   -1,  270,   -1,   -1,   -1,   -1,  275,
  330,  331,   -1,  279,  334,   -1,   -1,  337,   -1,   -1,
   -1,   -1,  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,
   -1,   -1,  369,   -1,  300,   -1,   -1,   -1,  304,   -1,
  306,   -1,  308,   -1,   -1,   -1,   -1,  313,   -1,   -1,
  316,   -1,  318,   -1,   -1,   -1,  322,   -1,   -1,  325,
   -1,   -1,   -1,   -1,  330,  331,   -1,   -1,  334,   -1,
   -1,  337,   -1,   -1,   -1,  412,  413,  414,  415,  416,
  417,  418,  257,   -1,   -1,   -1,  261,   -1,   -1,   -1,
  265,   -1,  267,   -1,   -1,  270,   -1,  272,  418,   -1,
  275,   -1,  277,   -1,  279,   -1,  281,   -1,   -1,  284,
   -1,   -1,  287,  288,   -1,   -1,   -1,   -1,   -1,   -1,
  295,  296,  297,   -1,   -1,  300,  301,  302,   -1,  304,
   -1,   -1,  307,   -1,  309,  310,  311,  312,   -1,   -1,
   -1,  316,  317,  318,   -1,   -1,  321,  322,  323,   -1,
   -1,   -1,  418,   -1,   -1,  330,  331,   -1,  333,  334,
  335,  336,  337,  338,   -1,   -1,   -1,  342,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  257,   -1,   -1,   -1,  261,
   -1,   -1,   -1,  265,   -1,  267,   -1,   -1,  270,   -1,
  272,  366,  367,  275,   -1,  277,   -1,  279,   -1,  281,
   -1,   -1,  284,   -1,   -1,  287,  288,   -1,   -1,   -1,
   -1,   -1,   -1,  295,  296,  297,   -1,   -1,  300,  301,
  302,   -1,  304,   -1,   -1,  307,   -1,  309,  310,  311,
  312,   -1,   -1,   -1,  316,  317,  318,   -1,   -1,  321,
  322,  323,   -1,  418,   -1,   -1,   -1,   -1,  330,  331,
   -1,  333,  334,  335,  336,  337,  338,   -1,   -1,   -1,
  342,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,   -1,
   -1,   -1,  261,   -1,   -1,   -1,  265,   -1,  267,   -1,
   -1,  270,   -1,  272,  366,  367,  275,   -1,  277,   -1,
  279,   -1,  281,   -1,   -1,  284,   -1,   -1,  287,  288,
   -1,   -1,   -1,   -1,   -1,   -1,  295,  296,  297,   -1,
   -1,  300,  301,  302,   -1,  304,   -1,   -1,  307,   -1,
  309,  310,  311,  312,   -1,   -1,   -1,  316,  317,  318,
   -1,   -1,  321,  322,  323,   -1,  418,   -1,   -1,   -1,
   -1,  330,  331,   -1,  333,  334,   -1,  336,  337,  338,
   -1,   -1,   -1,  342,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  257,   -1,   -1,   -1,  261,   -1,   -1,   -1,  265,
   -1,  267,   -1,   -1,  270,   -1,  272,  366,  367,  275,
   -1,  277,   -1,  279,   -1,  281,   -1,   -1,  284,   -1,
   -1,  287,  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,
  296,  297,   -1,   -1,  300,  301,  302,   -1,  304,   -1,
   -1,  307,   -1,  309,  310,  311,  312,   -1,   -1,   -1,
  316,  317,  318,   -1,   -1,  321,  322,  323,   -1,  418,
   -1,   -1,   -1,   -1,  330,  331,   -1,  333,  334,   -1,
  336,  337,  338,   -1,   -1,   -1,  342,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  257,   -1,   -1,   -1,  261,   -1,
   -1,   -1,  265,   -1,  267,   -1,   -1,  270,   -1,  272,
  366,  367,  275,   -1,  277,   -1,  279,   -1,  281,   -1,
   -1,  284,   -1,   -1,  287,  288,   -1,   -1,   -1,   -1,
   -1,   -1,  295,  296,  297,   -1,   -1,  300,  301,  302,
   -1,  304,   -1,   -1,  307,   -1,  309,  310,  311,  312,
   -1,   -1,   -1,  316,  317,  318,   -1,   -1,  321,  322,
  323,   -1,  418,   -1,   -1,   -1,   -1,  330,  331,   -1,
  333,  334,   -1,  336,  337,  338,   -1,  257,   -1,  342,
   -1,  261,   -1,  262,   -1,  265,   -1,  267,   -1,   -1,
  270,   -1,  272,   -1,   -1,  275,   -1,  277,   -1,  279,
   -1,  281,   -1,  366,  284,   -1,   -1,  287,  288,   -1,
   -1,   -1,   -1,   -1,   -1,  295,  296,  297,   -1,  298,
  300,  301,  302,   -1,  304,   -1,   -1,  307,   -1,  309,
  310,  311,  312,   -1,   -1,   -1,  316,  317,  318,  262,
   -1,  321,  322,  323,   -1,   -1,   -1,   -1,   -1,   -1,
  330,  331,   -1,  333,  334,  418,  336,  337,  338,   -1,
   -1,   -1,  342,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  298,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  366,   -1,  367,  368,
  369,  370,  371,  372,   -1,   -1,   -1,  376,  377,   -1,
  379,  380,  381,  382,  383,  384,  385,  386,  387,  388,
   -1,  390,  391,  392,  393,  394,  395,  396,  397,  398,
  399,  400,  401,  402,  403,  404,  405,  406,  407,  408,
  409,  410,  411,   -1,   -1,   -1,   -1,   -1,  418,   -1,
  419,  420,   -1,   -1,  367,   -1,  369,  370,  371,  372,
   -1,   -1,   -1,  376,  377,   -1,   -1,  380,  381,  382,
  383,  384,  385,  386,  387,  388,   -1,  390,  391,  392,
  393,  394,  395,  396,  397,  398,  399,  400,  401,  402,
  403,  404,  405,  406,  407,  408,  409,  410,  411,  261,
   -1,  263,   -1,  265,   -1,  267,  419,  420,  270,   -1,
  272,  273,   -1,  275,   -1,  277,   -1,  279,   -1,  281,
  282,  283,  284,   -1,   -1,  287,  288,   -1,   -1,   -1,
   -1,  293,  294,  295,  296,  297,   -1,   -1,  300,  301,
  302,   -1,  304,   -1,  306,  307,  308,  309,  310,  311,
  312,  313,   -1,  315,  316,  317,  318,   -1,   -1,  321,
  322,  323,   -1,  325,   -1,   -1,   -1,   -1,  330,  331,
   -1,  333,  334,   -1,  336,  337,  338,   -1,   -1,   -1,
  342,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  261,   -1,
  362,  363,  265,   -1,  267,   -1,   -1,  270,   -1,  272,
  273,   -1,  275,  375,  277,   -1,  279,   -1,  281,  282,
  283,  284,   -1,   -1,  287,  288,   -1,   -1,   -1,   -1,
  293,   -1,  295,  296,  297,   -1,   -1,  300,   -1,  302,
   -1,  304,   -1,   -1,  307,   -1,  309,  310,  311,  312,
   -1,   -1,   -1,  316,  317,  318,  418,   -1,  321,  322,
  323,   -1,   -1,   -1,   -1,   -1,   -1,  330,  331,   -1,
  333,  334,  261,  336,  337,  338,  265,   -1,  267,  342,
   -1,  270,   -1,  272,  273,   -1,  275,   -1,  277,   -1,
  279,   -1,  281,  282,  283,  284,   -1,   -1,  287,  288,
   -1,   -1,   -1,  366,  293,   -1,  295,  296,  297,   -1,
   -1,  300,  375,  302,   -1,  304,   -1,   -1,  307,   -1,
  309,  310,  311,  312,   -1,   -1,   -1,  316,  317,  318,
   -1,   -1,  321,  322,  323,   -1,   -1,   -1,   -1,   -1,
   -1,  330,  331,   -1,  333,  334,   -1,  336,  337,  338,
   -1,   -1,   -1,  342,   -1,  418,   -1,   -1,  261,   -1,
   -1,   -1,  265,   -1,  267,   -1,   -1,  270,   -1,  272,
  273,   -1,  275,   -1,  277,   -1,  279,  366,  281,  282,
  283,  284,   -1,   -1,  287,  288,  375,   -1,   -1,   -1,
  293,   -1,  295,  296,  297,   -1,   -1,  300,   -1,  302,
   -1,  304,   -1,   -1,  307,   -1,  309,  310,  311,  312,
   -1,   -1,   -1,  316,  317,  318,   -1,   -1,  321,  322,
  323,   -1,   -1,   -1,   -1,   -1,   -1,  330,  331,  418,
  333,  334,  261,  336,  337,  338,  265,   -1,  267,  342,
   -1,  270,   -1,  272,  273,   -1,  275,   -1,  277,   -1,
  279,   -1,  281,  282,  283,  284,   -1,   -1,  287,  288,
   -1,   -1,   -1,  366,  293,   -1,  295,  296,  297,   -1,
   -1,  300,  375,  302,   -1,  304,   -1,   -1,  307,   -1,
  309,  310,  311,  312,   -1,   -1,   -1,  316,  317,  318,
   -1,   -1,  321,  322,  323,   -1,   -1,   -1,   -1,   -1,
   -1,  330,  331,   -1,  333,  334,   -1,  336,  337,  338,
   -1,   -1,   -1,  342,   -1,  418,   -1,   -1,  261,   -1,
   -1,   -1,  265,   -1,  267,   -1,   -1,  270,   -1,  272,
  273,   -1,  275,   -1,  277,   -1,  279,  366,  281,  282,
  283,  284,   -1,   -1,  287,  288,  375,   -1,   -1,   -1,
  293,   -1,  295,  296,  297,   -1,   -1,  300,   -1,  302,
   -1,  304,   -1,   -1,  307,   -1,  309,  310,  311,  312,
   -1,   -1,   -1,  316,  317,  318,   -1,   -1,  321,  322,
  323,   -1,   -1,   -1,   -1,   -1,   -1,  330,  331,  418,
  333,  334,  261,  336,  337,  338,  265,   -1,  267,  342,
   -1,  270,   -1,  272,  273,   -1,  275,   -1,  277,   -1,
  279,   -1,  281,  282,  283,  284,   -1,   -1,  287,  288,
   -1,   -1,   -1,  366,  293,   -1,  295,  296,  297,   -1,
   -1,  300,   -1,  302,   -1,  304,   -1,   -1,  307,   -1,
  309,  310,  311,  312,   -1,   -1,   -1,  316,  317,  318,
   -1,   -1,  321,  322,  323,   -1,   -1,   -1,   -1,   -1,
   -1,  330,  331,   -1,  333,  334,   -1,  336,  337,  338,
   -1,  264,  265,  342,  267,  418,   -1,  270,  271,   -1,
   -1,   -1,  275,  276,  277,   -1,  279,   -1,   -1,  265,
   -1,  267,  285,   -1,  270,  288,   -1,  366,   -1,  275,
   -1,   -1,  295,  279,   -1,   -1,   -1,  300,   -1,  302,
  303,  304,  288,  306,   -1,   -1,   -1,   -1,   -1,  295,
  313,   -1,   -1,  316,  300,  318,  319,   -1,  304,  322,
   -1,   -1,  325,   -1,  327,   -1,  329,  330,  331,  332,
  316,  334,  318,   -1,  337,   -1,  322,   -1,  341,  418,
   -1,  344,  345,   -1,  330,  331,   -1,   -1,  334,   -1,
   -1,  337,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  369,  370,   -1,  372,
   -1,   -1,  375,  376,  377,  378,   -1,   -1,   -1,  382,
   -1,  384,   -1,   -1,  370,   -1,   -1,  390,  391,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  412,
  413,  414,  415,  416,  417,  418,  419,  420,  264,  265,
   -1,  267,   -1,   -1,  270,  271,   -1,   -1,   -1,  275,
  276,  277,  418,  279,   -1,   -1,  265,   -1,  267,  285,
   -1,  270,  288,   -1,   -1,   -1,  275,   -1,   -1,  295,
  279,   -1,   -1,   -1,  300,   -1,  302,  303,  304,  288,
  306,   -1,   -1,   -1,   -1,   -1,  295,  313,   -1,   -1,
  316,  300,  318,  319,   -1,  304,  322,   -1,   -1,  325,
   -1,  327,   -1,  329,  330,  331,  332,  316,  334,  318,
   -1,  337,   -1,  322,   -1,  341,   -1,   -1,  344,  345,
   -1,  330,  331,   -1,   -1,  334,   -1,   -1,  337,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  369,   -1,   -1,  372,   -1,   -1,  375,
  376,  377,  378,   -1,   -1,   -1,  382,   -1,  384,   -1,
   -1,   -1,   -1,   -1,  390,  391,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  412,  413,  414,  415,
  416,  417,  418,  419,  420,  264,  265,   -1,  267,   -1,
   -1,  270,  271,   -1,   -1,   -1,  275,  276,  277,  418,
  279,   -1,   -1,  265,   -1,  267,  285,   -1,  270,  288,
   -1,   -1,   -1,  275,   -1,   -1,  295,  279,   -1,   -1,
   -1,  300,   -1,  302,  303,  304,  288,  306,   -1,   -1,
   -1,   -1,   -1,  295,  313,   -1,   -1,  316,  300,  318,
  319,   -1,  304,  322,   -1,   -1,  325,   -1,  327,   -1,
  329,  330,  331,  332,  316,  334,  318,   -1,  337,   -1,
  322,   -1,  341,   -1,   -1,  344,  345,   -1,  330,  331,
   -1,   -1,  334,   -1,   -1,  337,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  369,   -1,   -1,   -1,   -1,   -1,  375,  376,  377,  378,
   -1,   -1,   -1,  382,   -1,  384,   -1,   -1,   -1,   -1,
   -1,  390,  391,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  412,  413,  414,  415,  416,  417,  418,
  419,  420,  264,  265,   -1,  267,   -1,   -1,  270,  271,
   -1,   -1,   -1,  275,  276,  277,  418,  279,   -1,   -1,
  265,   -1,  267,  285,   -1,  270,  288,   -1,   -1,   -1,
  275,   -1,   -1,  295,  279,   -1,   -1,   -1,  300,   -1,
  302,  303,  304,  288,   -1,   -1,   -1,   -1,   -1,   -1,
  295,   -1,   -1,   -1,  316,  300,  318,  319,  320,  304,
  322,   -1,   -1,  325,   -1,  327,   -1,  329,  330,  331,
  332,  316,  334,  318,   -1,  337,   -1,  322,   -1,  341,
   -1,   -1,  344,  345,   -1,  330,  331,   -1,   -1,  334,
   -1,   -1,  337,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  365,   -1,   -1,   -1,  369,   -1,   -1,
   -1,   -1,   -1,  375,  376,  377,  378,   -1,   -1,   -1,
  382,   -1,  384,   -1,   -1,   -1,   -1,   -1,  390,  391,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  412,  413,  414,  415,  416,  417,  418,  419,  420,  264,
  265,   -1,  267,   -1,   -1,  270,  271,   -1,   -1,   -1,
  275,  276,  277,  418,  279,   -1,   -1,  265,   -1,  267,
  285,   -1,  270,  288,   -1,   -1,   -1,  275,   -1,   -1,
  295,  279,   -1,   -1,   -1,  300,   -1,  302,  303,  304,
  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,   -1,   -1,
   -1,  316,  300,  318,  319,   -1,  304,  322,   -1,   -1,
  325,   -1,  327,   -1,  329,  330,  331,  332,  316,  334,
  318,   -1,  337,   -1,  322,   -1,   -1,   -1,   -1,  344,
  345,   -1,  330,  331,   -1,   -1,  334,   -1,   -1,  337,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  369,   -1,   -1,   -1,   -1,  374,
  375,  376,  377,  378,   -1,   -1,   -1,  382,   -1,  384,
   -1,   -1,   -1,   -1,   -1,  390,  391,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  412,  413,  414,
  415,  416,  417,  418,  419,  420,  264,  265,   -1,  267,
   -1,   -1,  270,  271,   -1,   -1,   -1,  275,  276,  277,
  418,  279,   -1,   -1,  265,   -1,  267,  285,   -1,  270,
  288,   -1,   -1,   -1,  275,   -1,   -1,  295,  279,   -1,
   -1,   -1,  300,   -1,  302,  303,  304,  288,   -1,   -1,
   -1,   -1,   -1,   -1,  295,   -1,   -1,   -1,  316,  300,
  318,  319,   -1,  304,  322,   -1,   -1,  325,   -1,  327,
   -1,  329,  330,  331,  332,  316,  334,  318,   -1,  337,
   -1,  322,   -1,   -1,   -1,   -1,  344,  345,   -1,  330,
  331,   -1,   -1,  334,   -1,   -1,  337,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  366,   -1,
   -1,  369,   -1,   -1,   -1,   -1,   -1,  375,  376,  377,
  378,   -1,   -1,   -1,  382,   -1,  384,   -1,   -1,   -1,
   -1,   -1,  390,  391,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  412,  413,  414,  415,  416,  417,
  418,  419,  420,  264,  265,   -1,  267,   -1,   -1,  270,
  271,   -1,   -1,   -1,  275,  276,  277,  418,  279,   -1,
   -1,  265,   -1,  267,  285,   -1,  270,  288,   -1,   -1,
   -1,  275,   -1,   -1,  295,  279,   -1,   -1,   -1,  300,
   -1,  302,  303,  304,  288,   -1,   -1,   -1,   -1,   -1,
   -1,  295,   -1,   -1,   -1,  316,  300,  318,  319,   -1,
  304,  322,   -1,   -1,  325,   -1,  327,   -1,  329,  330,
  331,  332,  316,  334,  318,   -1,  337,   -1,  322,   -1,
   -1,   -1,   -1,  344,  345,   -1,  330,  331,   -1,   -1,
  334,   -1,   -1,  337,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  365,   -1,   -1,   -1,  369,   -1,
   -1,   -1,   -1,   -1,  375,  376,  377,  378,   -1,   -1,
   -1,  382,   -1,  384,   -1,   -1,   -1,   -1,   -1,  390,
  391,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  412,  413,  414,  415,  416,  417,  418,  419,  420,
  264,  265,   -1,  267,   -1,   -1,  270,  271,   -1,   -1,
   -1,  275,  276,  277,  418,  279,   -1,   -1,  265,   -1,
  267,  285,   -1,  270,  288,   -1,   -1,   -1,  275,   -1,
   -1,  295,  279,   -1,   -1,   -1,  300,   -1,  302,  303,
  304,  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,   -1,
   -1,   -1,  316,  300,  318,  319,   -1,  304,  322,   -1,
   -1,  325,   -1,  327,   -1,  329,  330,  331,  332,  316,
  334,  318,   -1,  337,   -1,  322,   -1,   -1,   -1,   -1,
  344,  345,   -1,  330,  331,   -1,   -1,  334,   -1,   -1,
  337,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  365,   -1,   -1,   -1,  369,   -1,   -1,   -1,   -1,
   -1,  375,  376,  377,  378,   -1,   -1,   -1,  382,   -1,
  384,   -1,   -1,   -1,   -1,   -1,  390,  391,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  412,  413,
  414,  415,  416,  417,  418,  419,  420,  264,  265,   -1,
  267,   -1,   -1,  270,  271,   -1,   -1,   -1,  275,  276,
  277,  418,  279,   -1,   -1,  265,   -1,  267,  285,   -1,
  270,  288,   -1,   -1,   -1,  275,   -1,   -1,  295,  279,
   -1,   -1,   -1,  300,   -1,  302,  303,  304,  288,   -1,
   -1,   -1,   -1,   -1,   -1,  295,   -1,   -1,   -1,  316,
  300,  318,  319,   -1,  304,  322,   -1,   -1,  325,   -1,
  327,   -1,  329,  330,  331,  332,  316,  334,  318,   -1,
  337,   -1,  322,   -1,   -1,   -1,   -1,  344,  345,   -1,
  330,  331,   -1,   -1,  334,   -1,   -1,  337,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  368,  369,   -1,   -1,   -1,   -1,   -1,  375,  376,
  377,  378,   -1,   -1,   -1,  382,   -1,  384,   -1,   -1,
   -1,   -1,   -1,  390,  391,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  412,  413,  414,  415,  416,
  417,  418,  419,  420,  264,  265,   -1,  267,   -1,   -1,
  270,  271,   -1,   -1,   -1,  275,  276,  277,  418,  279,
   -1,   -1,  265,   -1,  267,  285,   -1,  270,  288,   -1,
   -1,   -1,  275,   -1,   -1,  295,  279,   -1,   -1,   -1,
  300,   -1,  302,  303,  304,  288,   -1,   -1,   -1,   -1,
   -1,   -1,  295,   -1,   -1,   -1,  316,  300,  318,  319,
   -1,  304,  322,   -1,   -1,  325,   -1,  327,   -1,  329,
  330,  331,  332,  316,  334,  318,   -1,  337,   -1,  322,
   -1,   -1,   -1,   -1,  344,  345,   -1,  330,  331,   -1,
   -1,  334,   -1,   -1,  337,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  369,
   -1,   -1,   -1,   -1,   -1,  375,  376,  377,  378,   -1,
   -1,   -1,  382,   -1,  384,   -1,   -1,   -1,   -1,   -1,
  390,  391,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  412,  413,  414,  415,  416,  417,  418,  419,
  420,  264,  265,   -1,  267,   -1,   -1,  270,  271,   -1,
   -1,   -1,  275,  276,  277,  418,  279,   -1,   -1,  265,
   -1,  267,  285,   -1,  270,  288,   -1,   -1,   -1,  275,
   -1,   -1,  295,  279,   -1,   -1,   -1,  300,   -1,  302,
  303,  304,  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,
   -1,   -1,   -1,  316,  300,  318,  319,   -1,  304,  322,
   -1,   -1,  325,   -1,  327,   -1,  329,  330,  331,  332,
  316,  334,  318,   -1,  337,   -1,  322,   -1,   -1,   -1,
   -1,  344,  345,   -1,  330,  331,   -1,   -1,  334,   -1,
   -1,  337,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  369,   -1,   -1,   -1,
   -1,   -1,  375,  376,  377,  378,   -1,   -1,   -1,  382,
   -1,  384,   -1,   -1,   -1,   -1,   -1,  390,  391,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  412,
  413,  414,  415,  416,  417,  418,  419,  420,  264,  265,
   -1,  267,   -1,   -1,  270,  271,   -1,   -1,   -1,  275,
  276,  277,  418,  279,   -1,   -1,  265,   -1,  267,  285,
   -1,  270,  288,   -1,   -1,   -1,  275,   -1,   -1,  295,
  279,   -1,   -1,   -1,  300,   -1,  302,  303,  304,  288,
   -1,   -1,   -1,   -1,   -1,   -1,  295,   -1,   -1,   -1,
  316,  300,  318,  319,   -1,  304,  322,   -1,   -1,  325,
   -1,  327,   -1,  329,  330,  331,  332,  316,  334,  318,
   -1,  337,   -1,  322,   -1,   -1,   -1,   -1,  344,  345,
   -1,  330,  331,   -1,   -1,  334,   -1,   -1,  337,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  369,   -1,   -1,   -1,   -1,   -1,  375,
  376,  377,  378,   -1,   -1,   -1,  382,   -1,  384,   -1,
   -1,   -1,   -1,   -1,  390,  391,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  412,  413,  414,  415,
  416,  417,  418,  419,  420,  264,  265,   -1,  267,   -1,
   -1,  270,  271,   -1,   -1,   -1,  275,  276,  277,  418,
  279,   -1,   -1,  265,   -1,  267,  285,   -1,  270,  288,
   -1,   -1,   -1,  275,   -1,   -1,  295,  279,   -1,   -1,
   -1,  300,   -1,  302,  303,  304,  288,   -1,   -1,   -1,
   -1,   -1,   -1,  295,   -1,   -1,   -1,  316,  300,  318,
  319,   -1,  304,  322,   -1,   -1,  325,   -1,  327,   -1,
  329,  330,  331,  332,  316,  334,  318,   -1,  337,   -1,
  322,   -1,   -1,   -1,   -1,  344,  345,   -1,  330,  331,
   -1,   -1,  334,   -1,   -1,  337,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  369,   -1,   -1,   -1,   -1,   -1,  375,  376,  377,  378,
   -1,   -1,   -1,  382,   -1,  384,   -1,   -1,   -1,   -1,
   -1,  390,  391,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  412,  413,  414,  415,  416,  417,  418,
  419,  420,  264,  265,   -1,  267,   -1,   -1,  270,  271,
   -1,   -1,   -1,  275,  276,  277,  418,  279,   -1,   -1,
   -1,   -1,   -1,  285,   -1,   -1,  288,   -1,   -1,   -1,
   -1,   -1,   -1,  295,   -1,   -1,   -1,   -1,  300,   -1,
  302,  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  316,   -1,  318,  319,   -1,   -1,
  322,   -1,   -1,  325,   -1,  327,   -1,  329,  330,  331,
  332,   -1,  334,   -1,   -1,  337,   -1,   -1,   -1,   -1,
   -1,   -1,  344,  345,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  369,   -1,   -1,
   -1,   -1,   -1,  375,  376,  377,  378,   -1,   -1,   -1,
  382,   -1,  384,   -1,   -1,   -1,   -1,   -1,  390,  391,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  412,  413,  414,  415,  416,  417,  418,  419,  420,  264,
  265,   -1,  267,   -1,   -1,  270,  271,   -1,   -1,   -1,
  275,  276,  277,   -1,  279,   -1,   -1,   -1,   -1,   -1,
  285,   -1,   -1,  288,   -1,   -1,   -1,   -1,   -1,   -1,
  295,   -1,   -1,   -1,   -1,  300,   -1,  302,  303,  304,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  316,   -1,  318,  319,   -1,   -1,  322,   -1,   -1,
  325,   -1,  327,   -1,  329,  330,  331,  332,   -1,  334,
   -1,   -1,  337,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  369,   -1,   -1,   -1,   -1,   -1,
  375,  376,  377,  378,   -1,   -1,   -1,  382,   -1,  384,
   -1,   -1,   -1,   -1,   -1,  390,  391,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  412,  413,  414,
  415,  416,  417,  418,   -1,  420,  264,  265,   -1,  267,
   -1,   -1,  270,  271,   -1,   -1,   -1,  275,  276,  277,
   -1,  279,   -1,   -1,   -1,   -1,   -1,  285,   -1,   -1,
  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,   -1,   -1,
   -1,   -1,  300,   -1,  302,  303,  304,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  316,   -1,
  318,  319,   -1,   -1,  322,   -1,   -1,  325,   -1,  327,
   -1,  329,  330,  331,  332,  265,  334,  267,   -1,  337,
  270,   -1,  272,  273,   -1,  275,   -1,  277,   -1,  279,
   -1,  281,  282,  283,   -1,   -1,   -1,  287,  288,   -1,
   -1,   -1,   -1,  293,   -1,  295,  296,   -1,   -1,   -1,
  300,  369,   -1,   -1,  304,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  316,   -1,  318,   -1,
   -1,   -1,  322,  323,   -1,   -1,   -1,   -1,   -1,   -1,
  330,  331,   -1,   -1,  334,   -1,   -1,  337,   -1,   -1,
   -1,   -1,  342,   -1,  412,  413,  414,  415,  416,  417,
  418,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  362,  363,  265,   -1,  267,   -1,   -1,  270,
   -1,  272,  273,   -1,  275,  375,  277,   -1,  279,   -1,
  281,  282,  283,   -1,   -1,   -1,  287,  288,   -1,   -1,
   -1,   -1,  293,   -1,  295,  296,   -1,   -1,   -1,  300,
   -1,   -1,   -1,  304,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  316,   -1,  318,  418,   -1,
   -1,  322,  323,   -1,   -1,   -1,   -1,   -1,   -1,  330,
  331,   -1,  265,  334,  267,   -1,  337,  270,   -1,  272,
  273,  342,  275,   -1,  277,   -1,  279,   -1,  281,  282,
  283,   -1,   -1,   -1,  287,  288,   -1,   -1,   -1,   -1,
  293,   -1,  295,  296,   -1,   -1,   -1,  300,   -1,   -1,
   -1,  304,   -1,   -1,  375,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  316,   -1,  318,   -1,   -1,   -1,  322,
  323,   -1,   -1,   -1,   -1,   -1,   -1,  330,  331,   -1,
   -1,  334,   -1,   -1,  337,   -1,  265,   -1,  267,  342,
   -1,  270,   -1,   -1,  273,   -1,  275,  418,  277,   -1,
  279,   -1,  281,  282,  283,   -1,   -1,   -1,  287,  288,
   -1,   -1,   -1,   -1,  293,   -1,  295,   -1,  265,   -1,
  267,  300,   -1,  270,   -1,  304,  273,   -1,  275,   -1,
  277,   -1,  279,   -1,  281,  282,  283,  316,   -1,  318,
  287,  288,   -1,  322,   -1,   -1,  293,   -1,  295,   -1,
   -1,  330,  331,  300,   -1,  334,   -1,  304,  337,   -1,
   -1,   -1,   -1,  342,   -1,  418,   -1,   -1,  265,  316,
  267,  318,   -1,  270,   -1,  322,   -1,   -1,  275,   -1,
   -1,   -1,  279,  330,  331,   -1,   -1,  334,   -1,   -1,
  337,  288,  265,   -1,  267,  342,  375,  270,  295,  272,
   -1,   -1,  275,  300,  277,   -1,  279,  304,  281,  306,
   -1,  308,   -1,   -1,  287,  288,  313,   -1,   -1,  316,
   -1,  318,  295,  296,   -1,  322,   -1,  300,  325,   -1,
   -1,  304,   -1,  330,  331,   -1,   -1,  334,   -1,  418,
  337,   -1,   -1,  316,   -1,  318,   -1,   -1,   -1,  322,
  323,   -1,   -1,   -1,   -1,   -1,   -1,  330,  331,   -1,
  265,  334,  267,   -1,  337,  270,   -1,   -1,   -1,  342,
  275,  418,   -1,  370,  279,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  288,  265,   -1,  267,   -1,   -1,  270,
  295,   -1,   -1,   -1,  275,  300,  277,   -1,  279,  304,
  281,  306,   -1,  308,   -1,   -1,  287,  288,  313,   -1,
   -1,  316,   -1,  318,  295,   -1,   -1,  322,   -1,  300,
  325,  418,   -1,  304,   -1,  330,  331,   -1,   -1,  334,
   -1,   -1,  337,   -1,  265,  316,  267,  318,   -1,  270,
   -1,  322,   -1,   -1,  275,  418,   -1,   -1,  279,  330,
  331,   -1,   -1,  334,   -1,   -1,  337,  288,   -1,   -1,
   -1,  342,   -1,  368,  295,   -1,   -1,   -1,   -1,  300,
   -1,   -1,   -1,  304,   -1,  306,   -1,   -1,   -1,   -1,
   -1,   -1,  313,   -1,   -1,  316,   -1,  318,  265,   -1,
  267,  322,   -1,  270,  325,  272,   -1,   -1,  275,  330,
  331,   -1,  279,  334,   -1,   -1,  337,   -1,   -1,   -1,
   -1,  288,   -1,  418,   -1,   -1,   -1,   -1,  295,   -1,
  261,   -1,   -1,  300,   -1,  302,   -1,  304,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  418,   -1,  316,
   -1,  318,   -1,  284,   -1,  322,  323,   -1,   -1,   -1,
   -1,   -1,  261,  330,  331,   -1,  297,  334,   -1,   -1,
  337,  302,   -1,   -1,   -1,   -1,  307,   -1,  309,  310,
  311,  312,   -1,   -1,   -1,  284,  317,   -1,   -1,   -1,
  321,   -1,   -1,   -1,   -1,   -1,   -1,  418,  297,   -1,
   -1,   -1,  333,  302,   -1,  336,  261,  338,  307,   -1,
  309,  310,  311,  312,   -1,   -1,   -1,   -1,  317,   -1,
   -1,   -1,  321,   -1,   -1,   -1,   -1,   -1,   -1,  284,
   -1,  362,  363,   -1,  333,  366,   -1,  336,   -1,  338,
   -1,   -1,  297,   -1,   -1,   -1,   -1,  302,   -1,   -1,
   -1,  418,  307,   -1,  309,  310,  311,  312,   -1,   -1,
   -1,   -1,  317,  362,  363,   -1,  321,  366,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  333,   -1,
   -1,  336,  339,  338,   -1,   -1,   -1,  344,   -1,  346,
  347,  348,  349,  350,  351,  352,  353,  354,  355,  356,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  362,  363,  366,
   -1,  368,   -1,  370,   -1,  372,  373,  374,   -1,   -1,
   -1,   -1,   -1,  380,  381,  382,  383,   -1,   -1,   -1,
  387,  388,   -1,   -1,   -1,  392,  393,  394,  395,  396,
  397,  398,  399,   -1,   -1,   -1,   -1,   -1,  339,   -1,
   -1,   -1,   -1,  344,  411,  346,  347,  348,  349,  350,
  351,  352,  353,  354,  355,  356,   -1,   -1,   -1,   -1,
  427,   -1,   -1,   -1,   -1,  366,   -1,  368,   -1,  370,
   -1,  372,  373,  374,   -1,   -1,   -1,   -1,   -1,  380,
  381,  382,  383,   -1,   -1,   -1,  387,  388,   -1,   -1,
   -1,  392,  393,  394,  395,  396,  397,  398,  399,   -1,
   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,
  411,  346,  347,  348,  349,  350,  351,  352,  353,  354,
  355,  356,   -1,   -1,   -1,   -1,  427,   -1,   -1,   -1,
   -1,  366,   -1,  368,   -1,  370,   -1,  372,  373,  374,
   -1,   -1,   -1,   -1,   -1,  380,  381,  382,  383,   -1,
   -1,   -1,  387,  388,   -1,   -1,   -1,  392,  393,  394,
  395,  396,  397,  398,  399,   -1,   -1,   -1,   -1,   -1,
  339,   -1,   -1,   -1,   -1,  344,  411,  346,  347,  348,
  349,  350,  351,  352,  353,  354,  355,  356,   -1,   -1,
   -1,   -1,  427,   -1,   -1,   -1,   -1,  366,   -1,  368,
   -1,  370,   -1,  372,  373,  374,   -1,   -1,   -1,   -1,
   -1,  380,  381,  382,  383,   -1,   -1,   -1,  387,  388,
   -1,   -1,   -1,   -1,   -1,  394,  395,  396,  397,  398,
  399,   -1,   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,
   -1,  344,  411,  346,  347,  348,  349,  350,  351,  352,
  353,  354,  355,  356,   -1,   -1,   -1,   -1,  427,   -1,
   -1,   -1,   -1,  366,   -1,  368,   -1,  370,   -1,  372,
  373,  374,   -1,   -1,   -1,   -1,   -1,  380,  381,  382,
  383,   -1,   -1,   -1,  387,  388,   -1,   -1,   -1,   -1,
   -1,  394,  395,  396,  397,  398,  399,   -1,   -1,   -1,
   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,  411,  346,
  347,  348,  349,  350,  351,  352,  353,  354,  355,  356,
   -1,   -1,   -1,   -1,  427,   -1,   -1,   -1,   -1,  366,
   -1,  368,   -1,  370,   -1,  372,  373,  374,   -1,   -1,
   -1,   -1,   -1,  380,  381,  382,  383,   -1,   -1,   -1,
  387,  388,   -1,   -1,   -1,   -1,   -1,  394,  395,  396,
  397,  398,  399,   -1,   -1,   -1,   -1,   -1,  339,   -1,
   -1,   -1,   -1,  344,  411,  346,  347,  348,  349,  350,
  351,  352,  353,  354,  355,  356,   -1,   -1,   -1,   -1,
  427,   -1,   -1,   -1,   -1,  366,   -1,  368,   -1,  370,
   -1,  372,  373,  374,   -1,   -1,   -1,   -1,   -1,  380,
  381,  382,  383,   -1,   -1,   -1,  387,  388,   -1,   -1,
   -1,   -1,   -1,  394,  395,  396,  397,  398,  399,   -1,
   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,
  411,  346,  347,  348,  349,  350,  351,  352,  353,  354,
  355,  356,   -1,   -1,   -1,   -1,  427,   -1,   -1,   -1,
   -1,  366,   -1,  368,   -1,  370,   -1,  372,  373,  374,
   -1,   -1,   -1,   -1,   -1,  380,  381,  382,  383,   -1,
   -1,   -1,  387,  388,   -1,   -1,   -1,   -1,   -1,  394,
  395,  396,  397,  398,  399,   -1,   -1,   -1,   -1,   -1,
  339,   -1,   -1,   -1,   -1,  344,  411,  346,  347,  348,
  349,  350,  351,  352,  353,  354,  355,  356,   -1,   -1,
   -1,   -1,  427,   -1,   -1,   -1,   -1,  366,   -1,  368,
   -1,  370,   -1,  372,  373,  374,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  382,  383,   -1,   -1,   -1,  387,  388,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  396,  397,  398,
  399,   -1,   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,
   -1,  344,  411,  346,  347,  348,  349,  350,  351,  352,
  353,  354,  355,  356,   -1,   -1,   -1,   -1,  427,   -1,
   -1,   -1,   -1,  366,   -1,  368,   -1,  370,   -1,  372,
  373,  374,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  382,
  383,   -1,   -1,   -1,  387,  388,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  396,  397,  398,  399,   -1,   -1,   -1,
   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,  411,  346,
  347,  348,  349,  350,  351,  352,  353,  354,  355,  356,
   -1,   -1,   -1,   -1,  427,   -1,   -1,   -1,   -1,  366,
   -1,  368,   -1,  370,   -1,  372,  373,  374,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  382,  383,   -1,   -1,   -1,
  387,  388,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  396,
  397,  398,  399,   -1,   -1,   -1,   -1,   -1,  339,   -1,
   -1,   -1,   -1,  344,  411,  346,  347,  348,  349,  350,
  351,  352,  353,  354,  355,  356,   -1,   -1,   -1,   -1,
  427,   -1,   -1,   -1,   -1,  366,   -1,  368,   -1,  370,
   -1,  372,  373,  374,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  382,  383,   -1,   -1,   -1,  387,  388,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  398,  399,   -1,
   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,
  411,  346,  347,  348,  349,  350,  351,  352,  353,  354,
  355,  356,   -1,   -1,   -1,   -1,  427,   -1,   -1,   -1,
   -1,  366,   -1,  368,   -1,  370,   -1,  372,  373,  374,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  382,  383,   -1,
   -1,   -1,  387,  388,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  398,  399,   -1,   -1,   -1,   -1,   -1,
  339,   -1,   -1,   -1,   -1,  344,  411,  346,  347,  348,
  349,  350,  351,  352,  353,  354,  355,  356,   -1,   -1,
   -1,   -1,  427,   -1,   -1,   -1,   -1,  366,   -1,  368,
   -1,  370,   -1,  372,  373,  374,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,  383,   -1,   -1,   -1,  387,  388,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  398,
  399,   -1,   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,
   -1,  344,  411,  346,  347,  348,  349,  350,  351,  352,
  353,  354,  355,  356,   -1,   -1,   -1,   -1,  427,   -1,
   -1,   -1,   -1,  366,   -1,  368,   -1,  370,   -1,  372,
  373,  374,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  383,   -1,   -1,   -1,  387,  388,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  398,  399,   -1,   -1,   -1,
   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,  411,  346,
  347,  348,  349,  350,  351,  352,  353,  354,  355,  356,
   -1,   -1,   -1,   -1,  427,   -1,   -1,   -1,   -1,  366,
   -1,  368,   -1,  370,   -1,  372,  373,  374,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  383,   -1,   -1,   -1,
   -1,  388,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  398,  399,   -1,   -1,   -1,   -1,   -1,  339,   -1,
   -1,   -1,   -1,  344,  411,  346,  347,  348,  349,  350,
  351,  352,  353,  354,  355,  356,   -1,   -1,   -1,   -1,
  427,   -1,   -1,   -1,   -1,  366,   -1,  368,   -1,  370,
   -1,  372,  373,  374,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  383,   -1,   -1,   -1,   -1,  388,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,  398,  399,   -1,
   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,
  411,  346,  347,  348,  349,  350,  351,  352,  353,  354,
  355,  356,   -1,   -1,   -1,   -1,  427,   -1,   -1,   -1,
   -1,  366,   -1,  368,   -1,  370,   -1,  372,  373,  374,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  388,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,  398,  399,   -1,   -1,   -1,   -1,   -1,
  339,   -1,   -1,   -1,   -1,  344,  411,  346,  347,  348,
  349,  350,  351,  352,  353,  354,  355,  356,   -1,   -1,
   -1,   -1,  427,   -1,   -1,   -1,   -1,  366,   -1,  368,
   -1,  370,   -1,  372,  373,  374,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  388,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  398,
  399,   -1,   -1,   -1,   -1,   -1,  339,   -1,   -1,   -1,
   -1,  344,  411,  346,  347,  348,  349,  350,  351,  352,
  353,  354,  355,  356,   -1,   -1,   -1,   -1,  427,   -1,
   -1,   -1,   -1,  366,   -1,  368,   -1,  370,   -1,  372,
  373,  374,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,  388,   -1,   -1,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,  399,   -1,   -1,   -1,
   -1,   -1,  339,   -1,   -1,   -1,   -1,  344,  411,  346,
  347,  348,  349,  350,  351,  352,  353,  354,  355,  356,
   -1,   -1,   -1,   -1,  427,   -1,   -1,   -1,   -1,  366,
   -1,  368,   -1,  370,   -1,  372,  373,  374,   -1,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,  388,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
   -1,   -1,  399,   -1,  261,   -1,  263,   -1,  339,   -1,
   -1,   -1,   -1,  344,  411,  346,  347,  348,  349,  350,
  351,  352,  353,  354,  355,  356,   -1,  284,   -1,   -1,
  427,   -1,   -1,   -1,   -1,  366,   -1,  368,   -1,  370,
  297,  372,  373,  374,  261,  302,   -1,   -1,   -1,   -1,
  307,   -1,  309,  310,  311,  312,   -1,  388,  315,   -1,
  317,   -1,   -1,   -1,  321,   -1,   -1,  284,   -1,   -1,
   -1,   -1,   -1,   -1,  261,   -1,  333,   -1,   -1,  336,
  297,  338,   -1,   -1,  301,  302,   -1,   -1,   -1,   -1,
  307,   -1,  309,  310,  311,  312,  427,  284,   -1,   -1,
  317,   -1,   -1,   -1,  321,   -1,  261,   -1,  263,   -1,
  297,   -1,   -1,   -1,   -1,  302,  333,   -1,   -1,  336,
  307,  338,  309,  310,  311,  312,   -1,   -1,  315,  284,
  317,   -1,   -1,   -1,  321,   -1,  261,   -1,   -1,   -1,
   -1,   -1,  297,   -1,   -1,   -1,  333,  302,   -1,  336,
   -1,  338,  307,   -1,  309,  310,  311,  312,   -1,  284,
   -1,   -1,  317,   -1,   -1,   -1,  321,   -1,  261,   -1,
  263,   -1,  297,   -1,   -1,   -1,   -1,  302,  333,   -1,
   -1,  336,  307,  338,  309,  310,  311,  312,   -1,   -1,
  315,  284,  317,   -1,   -1,   -1,  321,   -1,  261,   -1,
   -1,   -1,   -1,   -1,  297,   -1,   -1,   -1,  333,  302,
   -1,  336,   -1,  338,  307,   -1,  309,  310,  311,  312,
   -1,  284,   -1,   -1,  317,   -1,   -1,   -1,  321,   -1,
   -1,   -1,   -1,   -1,  297,   -1,   -1,   -1,   -1,  302,
  333,   -1,   -1,  336,  307,  338,  309,  310,  311,  312,
   -1,   -1,   -1,   -1,  317,   -1,   -1,   -1,  321,   -1,
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  333,   -1,   -1,  336,   -1,  338,
  };

#line 5870 "cs-parser.jay"

// <summary>
//   A class used to pass around variable declarations and constants
// </summary>
public class VariableDeclaration {
	public string identifier;
	public Expression expression_or_array_initializer;
	public Location Location;
	public Attributes OptAttributes;
	public string DocComment;

	public VariableDeclaration (LocatedToken lt, object eoai, Attributes opt_attrs)
	{
		this.identifier = lt.Value;
		if (eoai is ArrayList) {
			this.expression_or_array_initializer = new ArrayCreation (CSharpParser.current_array_type, "", (ArrayList)eoai, lt.Location);
		} else {
			this.expression_or_array_initializer = (Expression)eoai;
		}
		this.Location = lt.Location;
		this.OptAttributes = opt_attrs;
	}

	public VariableDeclaration (LocatedToken lt, object eoai) : this (lt, eoai, null)
	{
	}
}

class VariableMemberDeclaration
{
	public readonly MemberName MemberName;
	public Expression expression_or_array_initializer;
	
	public VariableMemberDeclaration (MemberName mn, object initializer)
	{
		MemberName = mn;
		
		if (initializer is ArrayList) {
			this.expression_or_array_initializer = new ArrayCreation (CSharpParser.current_array_type, "", (ArrayList)initializer, mn.Location);
		} else {
			this.expression_or_array_initializer = (Expression)initializer;
		}
	}
}


// <summary>
//  A class used to hold info about an operator declarator
// </summary>
struct OperatorDeclaration {
	public readonly Operator.OpType optype;
	public readonly FullNamedExpression ret_type;
	public readonly Location location;

	public OperatorDeclaration (Operator.OpType op, FullNamedExpression ret_type, Location location)
	{
		optype = op;
		this.ret_type = ret_type;
		this.location = location;
	}
}

void Error_ExpectingTypeName (Expression expr)
{
	if (expr is Invocation){
		Report.Error (1002, expr.Location, "Expecting `;'");
	} else {
		Expression.Error_InvalidExpressionStatement (Report, expr.Location);
	}
}

void Error_ParameterModifierNotValid (string modifier, Location loc)
{
	Report.Error (631, loc, "The parameter modifier `{0}' is not valid in this context",
			              modifier);
}

void Error_DuplicateParameterModifier (Location loc, Parameter.Modifier mod)
{
	Report.Error (1107, loc, "Duplicate parameter modifier `{0}'",
  		Parameter.GetModifierSignature (mod));
}

void Error_TypeExpected (Location loc)
{
	Report.Error (1031, loc, "Type expected");
}

void Error_NamedArgumentExpected (NamedArgument a)
{
	Report.Error (1738, a.Name.Location, "Named arguments must appear after the positional arguments");
}

void push_current_class (TypeContainer tc, object partial_token)
{
	if (RootContext.EvalMode){
		tc.ModFlags = (tc.ModFlags & ~(Modifiers.PRIVATE|Modifiers.INTERNAL)) | Modifiers.PUBLIC;
		undo.AddTypeContainer (current_container, tc);
	}

	if (partial_token != null)
		current_container = current_container.AddPartial (tc);
	else
		current_container = current_container.AddTypeContainer (tc);

	++lexer.parsing_declaration;
	current_class = tc;
}

DeclSpace pop_current_class ()
{
	DeclSpace retval = current_class;

	current_class = current_class.Parent;
	current_container = current_class.PartialContainer;

	return retval;
}

// <summary>
//   Given the @class_name name, it creates a fully qualified name
//   based on the containing declaration space
// </summary>
MemberName
MakeName (MemberName class_name)
{
	Namespace ns = current_namespace.NS;

	if (current_container == RootContext.ToplevelTypes) {
		if (ns.Name.Length != 0)
			return new MemberName (ns.MemberName, class_name);
		else
			return class_name;
	} else {
		return new MemberName (current_container.MemberName, class_name);
	}
}

Block declare_local_variables (Expression type, ArrayList variable_declarators, Location loc)
{
	Block implicit_block;
	ArrayList inits = null;

	//
	// If we are doing interactive editing, we want variable declarations
	// that are in the top block to be added instead to the class as 
	// static variables
	//
	if (RootContext.StatementMode){
		bool hoist = true;

		for (Block b = current_block; b != null; b = b.Parent){
			if (b is ExplicitBlock && !(b is ToplevelBlock)){
				// There has been an explicit block, we cant add to the class
				hoist = false;
				break;
			}
		}		
		if (hoist){
			//
			// We can use "current_block" since we know there are no explicit blocks
			//
			foreach (VariableDeclaration decl in variable_declarators){
				// We can not use the super-handy f.Initializer, because
				// multiple lines would force code to be executed out of sync
				if (decl.expression_or_array_initializer != null){
				        string id = "$" + decl.identifier;
					LocalInfo vi = current_block.AddVariable (type, id, decl.Location);					

					// Avoid warning about this variable not being used.
					vi.Used = true;

					LocalVariableReference var;
					var = new LocalVariableReferenceWithClassSideEffect (current_container, decl.identifier, current_block, id, vi, decl.Location);
					Assign assign = new SimpleAssign (var, decl.expression_or_array_initializer, decl.Location);
					current_block.AddStatement (new StatementExpression (assign));
					assign = new SimpleAssign (new SimpleName (decl.identifier, decl.Location), var);
					current_block.AddStatement (new StatementExpression (assign));
				} else {
					Field f = new Field (current_container, (FullNamedExpression) type, Modifiers.PUBLIC | Modifiers.STATIC,
						new MemberName (decl.identifier, loc), null);
					current_container.AddField (f);

					// Register the field to be visible later as a global variable
					Evaluator.QueueField (f);
				}
			}

			return current_block;
		}
	}

	//
	// We use the `Used' property to check whether statements
	// have been added to the current block.  If so, we need
	// to create another block to contain the new declaration
	// otherwise, as an optimization, we use the same block to
	// add the declaration.
	//
	// FIXME: A further optimization is to check if the statements
	// that were added were added as part of the initialization
	// below.  In which case, no other statements have been executed
	// and we might be able to reduce the number of blocks for
	// situations like this:
	//
	// int j = 1;  int k = j + 1;
	//
	if (current_block.Used)
		implicit_block = new Block (current_block, loc, lexer.Location);
	else
		implicit_block = current_block;

	foreach (VariableDeclaration decl in variable_declarators){

		if (implicit_block.AddVariable (type, decl.identifier, decl.Location) != null) {
			if (decl.expression_or_array_initializer != null){
				if (inits == null)
					inits = new ArrayList (4);
				inits.Add (decl);
			}
		}
	}

	if (inits == null)
		return implicit_block;

	foreach (VariableDeclaration decl in inits){
		Assign assign;
		Expression expr = decl.expression_or_array_initializer;
		
		LocalVariableReference var;
		var = new LocalVariableReference (implicit_block, decl.identifier, loc);

		assign = new SimpleAssign (var, expr, decl.Location);

		implicit_block.AddStatement (new StatementExpression (assign));
	}
	
	return implicit_block;
}

Block declare_local_constants (Expression type, ArrayList declarators)
{
	Block implicit_block;

	if (current_block.Used)
		implicit_block = new Block (current_block);
	else
		implicit_block = current_block;

	foreach (VariableDeclaration decl in declarators){
		implicit_block.AddConstant (type, decl.identifier, (Expression) decl.expression_or_array_initializer, decl.Location);
	}
	
	return implicit_block;
}

string CheckAttributeTarget (string a, Location l)
{
	switch (a) {
	case "assembly" : case "module" : case "field" : case "method" : case "param" : case "property" : case "type" :
			return a;
	}

	Report.Warning (658, 1, l,
		 "`{0}' is invalid attribute target. All attributes in this attribute section will be ignored", a);
	return string.Empty;
}

static bool IsUnaryOperator (Operator.OpType op)
{
	switch (op) {
		
	case Operator.OpType.LogicalNot: 
	case Operator.OpType.OnesComplement: 
	case Operator.OpType.Increment:
	case Operator.OpType.Decrement:
	case Operator.OpType.True: 
	case Operator.OpType.False: 
	case Operator.OpType.UnaryPlus: 
	case Operator.OpType.UnaryNegation:
		return true;
	}
	return false;
}

void syntax_error (Location l, string msg)
{
	Report.Error (1003, l, "Syntax error, " + msg);
}

Tokenizer lexer;

public Tokenizer Lexer {
	get {
		return lexer;
	}
}		   

static CSharpParser ()
{
	oob_stack = new Stack ();
}

public CSharpParser (SeekableStreamReader reader, CompilationUnit file, CompilerContext ctx)
{
	if (RootContext.EvalMode)
		undo = new Undo ();

	this.file = file;
	this.compiler = ctx;
	current_namespace = new NamespaceEntry (null, file, null);
	current_class = current_namespace.SlaveDeclSpace;
	current_container = current_class.PartialContainer; // == RootContest.ToplevelTypes
	oob_stack.Clear ();
	lexer = new Tokenizer (reader, file, ctx);
}

public void parse ()
{
	eof_token = Token.EOF;

	try {
		if (yacc_verbose_flag > 1)
			yyparse (lexer, new yydebug.yyDebugSimple ());
		else
			yyparse (lexer);
	} catch (Exception e){
	  	if (e is yyParser.yyUnexpectedEof)
			UnexpectedEOF = true;
		else if (yacc_verbose_flag > 0)
		        Console.WriteLine (e);
		if (e is yyParser.yyException)
			Report.Error (-25, lexer.Location, "Parsing error");
		else 
		        Report.Error (-32, lexer.Location, "Internal compiler error during parsing, Run with -v for details");
	}
	Tokenizer tokenizer = lexer as Tokenizer;
	tokenizer.cleanup ();

	if (RootContext.ToplevelTypes.NamespaceEntry != null)
		throw new InternalErrorException ("who set it?");
}

void CheckToken (int error, int yyToken, string msg, Location loc)
{
	if (yyToken >= Token.FIRST_KEYWORD && yyToken <= Token.LAST_KEYWORD)
		Report.Error (error, loc, "{0}: `{1}' is a keyword", msg, GetTokenName (yyToken));
	else
		Report.Error (error, loc, msg);
}

void CheckIdentifierToken (int yyToken, Location loc)
{
	CheckToken (1041, yyToken, "Identifier expected", loc);
}

string ConsumeStoredComment ()
{
	string s = tmpComment;
	tmpComment = null;
	Lexer.doc_state = XmlCommentState.Allowed;
	return s;
}

Location GetLocation (object obj)
{
	if (obj is MemberCore)
		return ((MemberCore) obj).Location;
	if (obj is MemberName)
		return ((MemberName) obj).Location;
	if (obj is LocatedToken)
		return ((LocatedToken) obj).Location;
	if (obj is Location)
		return (Location) obj;
	return lexer.Location;
}

Report Report {
	get { return compiler.Report; }
}

void start_block (Location loc)
{
	if (current_block == null || parsing_anonymous_method) {
		current_block = new ToplevelBlock (compiler, current_block, current_local_parameters, current_generic_method, loc);
		parsing_anonymous_method = false;
	} else {
		current_block = new ExplicitBlock (current_block, loc, Location.Null);
	}
}

Block
end_block (Location loc)
{
	Block retval = current_block.Explicit;
	retval.SetEndLocation (loc);
	current_block = retval.Parent;
	return retval;
}

void
start_anonymous (bool lambda, ParametersCompiled parameters, Location loc)
{
	if (RootContext.Version == LanguageVersion.ISO_1){
		Report.FeatureIsNotAvailable (loc, "anonymous methods");
	}

	oob_stack.Push (current_anonymous_method);
	oob_stack.Push (current_local_parameters);

	current_local_parameters = parameters;

	current_anonymous_method = lambda 
		? new LambdaExpression (loc) 
		: new AnonymousMethodExpression (loc);

	// Force the next block to be created as a ToplevelBlock
	parsing_anonymous_method = true;
}

/*
 * Completes the anonymous method processing, if lambda_expr is null, this
 * means that we have a Statement instead of an Expression embedded 
 */
AnonymousMethodExpression end_anonymous (ToplevelBlock anon_block)
{
	AnonymousMethodExpression retval;

	current_anonymous_method.Block = anon_block;
	retval = current_anonymous_method;

	current_local_parameters = (ParametersCompiled) oob_stack.Pop ();
	current_anonymous_method = (AnonymousMethodExpression) oob_stack.Pop ();

	return retval;
}

public NamespaceEntry CurrentNamespace {
       get { 
       	   return current_namespace;
       }
}


void Error_SyntaxError (int token)
{
	Error_SyntaxError (0, token);
}

void Error_SyntaxError (int error_code, int token)
{
	string symbol = GetSymbolName (token);
	string expecting = GetExpecting ();
	
	if (error_code == 0) {
		if (expecting == "`)'")
			error_code = 1026;
		else
			error_code = 1525;
	}
	
	if (expecting != null)
		Report.Error (error_code, lexer.Location, "Unexpected symbol `{0}', expecting {1}", 
			symbol, expecting);	  
	else
		Report.Error (error_code, lexer.Location, "Unexpected symbol `{0}'", symbol);
}

string GetExpecting ()
{
	int [] tokens = yyExpectingTokens (yyExpectingState);
	ArrayList names = new ArrayList (tokens.Length);
	bool has_type = false;
	bool has_identifier = false;
	for (int i = 0; i < tokens.Length; i++){
		int token = tokens [i];
		has_identifier |= token == Token.IDENTIFIER;
		
		string name = GetTokenName (token);
		if (name == "<internal>")
			continue;
			
		has_type |= name == "type";
		if (names.Contains (name))
			continue;
		
		names.Add (name);
	}

	//
	// Too many tokens to enumerate
	//
	if (names.Count > 8)
		return null;

	if (has_type && has_identifier)
		names.Remove ("identifier");

	if (names.Count == 1)
		return "`" + GetTokenName (tokens [0]) + "'";
	
	StringBuilder sb = new StringBuilder ();
	names.Sort ();
	int count = names.Count;
	for (int i = 0; i < count; i++){
		bool last = i + 1 == count;
		if (last)
			sb.Append ("or ");
		sb.Append ('`');
		sb.Append (names [i]);
		sb.Append (last ? "'" : "', ");
	}
	return sb.ToString ();
}


string GetSymbolName (int token)
{
	switch (token){
	case Token.LITERAL_FLOAT:
	case Token.LITERAL_INTEGER:
	case Token.LITERAL_DOUBLE:
	case Token.LITERAL_DECIMAL:
	case Token.LITERAL_CHARACTER:
	case Token.LITERAL_STRING:
		return lexer.Value.ToString ();
	case Token.IDENTIFIER:
		return ((LocatedToken)lexer.Value).Value;

	case Token.BOOL:
		return "bool";
	case Token.BYTE:
		return "byte";
	case Token.CHAR:
		return "char";
	case Token.VOID:
		return "void";
	case Token.DECIMAL:
		return "decimal";
	case Token.DOUBLE:
		return "double";
	case Token.FLOAT:
		return "float";
	case Token.INT:
		return "int";
	case Token.LONG:
		return "long";
	case Token.SBYTE:
		return "sbyte";
	case Token.SHORT:
		return "short";
	case Token.STRING:
		return "string";
	case Token.UINT:
		return "uint";
	case Token.ULONG:
		return "ulong";
	case Token.USHORT:
		return "ushort";
	case Token.OBJECT:
		return "object";
		
	case Token.PLUS:
		return "+";
	case Token.UMINUS:
	case Token.MINUS:
		return "-";
	case Token.BANG:
		return "!";
	case Token.BITWISE_AND:
		return "&";
	case Token.BITWISE_OR:
		return "|";
	case Token.STAR:
		return "*";
	case Token.PERCENT:
		return "%";
	case Token.DIV:
		return "/";
	case Token.CARRET:
		return "^";
	case Token.OP_INC:
		return "++";
	case Token.OP_DEC:
		return "--";
	case Token.OP_SHIFT_LEFT:
		return "<<";
	case Token.OP_SHIFT_RIGHT:
		return ">>";
	case Token.OP_LT:
		return "<";
	case Token.OP_GT:
		return ">";
	case Token.OP_LE:
		return "<=";
	case Token.OP_GE:
		return ">=";
	case Token.OP_EQ:
		return "==";
	case Token.OP_NE:
		return "!=";
	case Token.OP_AND:
		return "&&";
	case Token.OP_OR:
		return "||";
	case Token.OP_PTR:
		return "->";
	case Token.OP_COALESCING:	
		return "??";
	case Token.OP_MULT_ASSIGN:
		return "*=";
	case Token.OP_DIV_ASSIGN:
		return "/=";
	case Token.OP_MOD_ASSIGN:
		return "%=";
	case Token.OP_ADD_ASSIGN:
		return "+=";
	case Token.OP_SUB_ASSIGN:
		return "-=";
	case Token.OP_SHIFT_LEFT_ASSIGN:
		return "<<=";
	case Token.OP_SHIFT_RIGHT_ASSIGN:
		return ">>=";
	case Token.OP_AND_ASSIGN:
		return "&=";
	case Token.OP_XOR_ASSIGN:
		return "^=";
	case Token.OP_OR_ASSIGN:
		return "|=";
	}

	return GetTokenName (token);
}

static string GetTokenName (int token)
{
	switch (token){
	case Token.ABSTRACT:
		return "abstract";
	case Token.AS:
		return "as";
	case Token.ADD:
		return "add";
	case Token.BASE:
		return "base";
	case Token.BREAK:
		return "break";
	case Token.CASE:
		return "case";
	case Token.CATCH:
		return "catch";
	case Token.CHECKED:
		return "checked";
	case Token.CLASS:
		return "class";
	case Token.CONST:
		return "const";
	case Token.CONTINUE:
		return "continue";
	case Token.DEFAULT:
		return "default";
	case Token.DELEGATE:
		return "delegate";
	case Token.DO:
		return "do";
	case Token.ELSE:
		return "else";
	case Token.ENUM:
		return "enum";
	case Token.EVENT:
		return "event";
	case Token.EXPLICIT:
		return "explicit";
	case Token.EXTERN:
		return "extern";
	case Token.FALSE:
		return "false";
	case Token.FINALLY:
		return "finally";
	case Token.FIXED:
		return "fixed";
	case Token.FOR:
		return "for";
	case Token.FOREACH:
		return "foreach";
	case Token.GOTO:
		return "goto";
	case Token.IF:
		return "if";
	case Token.IMPLICIT:
		return "implicit";
	case Token.IN:
		return "in";
	case Token.INTERFACE:
		return "interface";
	case Token.INTERNAL:
		return "internal";
	case Token.IS:
		return "is";
	case Token.LOCK:
		return "lock";
	case Token.NAMESPACE:
		return "namespace";
	case Token.NEW:
		return "new";
	case Token.NULL:
		return "null";
	case Token.OPERATOR:
		return "operator";
	case Token.OUT:
		return "out";
	case Token.OVERRIDE:
		return "override";
	case Token.PARAMS:
		return "params";
	case Token.PRIVATE:
		return "private";
	case Token.PROTECTED:
		return "protected";
	case Token.PUBLIC:
		return "public";
	case Token.READONLY:
		return "readonly";
	case Token.REF:
		return "ref";
	case Token.RETURN:
		return "return";
	case Token.REMOVE:
		return "remove";
	case Token.SEALED:
		return "sealed";
	case Token.SIZEOF:
		return "sizeof";
	case Token.STACKALLOC:
		return "stackalloc";
	case Token.STATIC:
		return "static";
	case Token.STRUCT:
		return "struct";
	case Token.SWITCH:
		return "switch";
	case Token.THIS:
		return "this";
	case Token.THROW:
		return "throw";
	case Token.TRUE:
		return "true";
	case Token.TRY:
		return "try";
	case Token.TYPEOF:
		return "typeof";
	case Token.UNCHECKED:
		return "unchecked";
	case Token.UNSAFE:
		return "unsafe";
	case Token.USING:
		return "using";
	case Token.VIRTUAL:
		return "virtual";
	case Token.VOLATILE:
		return "volatile";
	case Token.WHERE:
		return "where";
	case Token.WHILE:
		return "while";
	case Token.ARGLIST:
		return "__arglist";
	case Token.PARTIAL:
		return "partial";
	case Token.ARROW:
		return "=>";
	case Token.FROM:
	case Token.FROM_FIRST:
		return "from";
	case Token.JOIN:
		return "join";
	case Token.ON:
		return "on";
	case Token.EQUALS:
		return "equals";
	case Token.SELECT:
		return "select";
	case Token.GROUP:
		return "group";
	case Token.BY:
		return "by";
	case Token.LET:
		return "let";
	case Token.ORDERBY:
		return "orderby";
	case Token.ASCENDING:
		return "ascending";
	case Token.DESCENDING:
		return "descending";
	case Token.INTO:
		return "into";
	case Token.GET:
		return "get";
	case Token.SET:
		return "set";
	case Token.OPEN_BRACE:
		return "{";
	case Token.CLOSE_BRACE:
		return "}";
	case Token.OPEN_BRACKET:
		return "[";
	case Token.CLOSE_BRACKET:
		return "]";
	case Token.OPEN_PARENS_CAST:
	case Token.OPEN_PARENS_LAMBDA:
	case Token.OPEN_PARENS:
		return "(";
	case Token.CLOSE_PARENS:
		return ")";
	case Token.DOT:
		return ".";
	case Token.COMMA:
		return ",";
	case Token.DEFAULT_COLON:
		return "default:";
	case Token.COLON:
		return ":";
	case Token.SEMICOLON:
		return ";";
	case Token.TILDE:
		return "~";
		
	case Token.PLUS:
	case Token.UMINUS:
	case Token.MINUS:
	case Token.BANG:
	case Token.OP_LT:
	case Token.OP_GT:
	case Token.BITWISE_AND:
	case Token.BITWISE_OR:
	case Token.STAR:
	case Token.PERCENT:
	case Token.DIV:
	case Token.CARRET:
	case Token.OP_INC:
	case Token.OP_DEC:
	case Token.OP_SHIFT_LEFT:
	case Token.OP_SHIFT_RIGHT:
	case Token.OP_LE:
	case Token.OP_GE:
	case Token.OP_EQ:
	case Token.OP_NE:
	case Token.OP_AND:
	case Token.OP_OR:
	case Token.OP_PTR:
	case Token.OP_COALESCING:	
	case Token.OP_MULT_ASSIGN:
	case Token.OP_DIV_ASSIGN:
	case Token.OP_MOD_ASSIGN:
	case Token.OP_ADD_ASSIGN:
	case Token.OP_SUB_ASSIGN:
	case Token.OP_SHIFT_LEFT_ASSIGN:
	case Token.OP_SHIFT_RIGHT_ASSIGN:
	case Token.OP_AND_ASSIGN:
	case Token.OP_XOR_ASSIGN:
	case Token.OP_OR_ASSIGN:
		return "<operator>";

	case Token.BOOL:
	case Token.BYTE:
	case Token.CHAR:
	case Token.VOID:
	case Token.DECIMAL:
	case Token.DOUBLE:
	case Token.FLOAT:
	case Token.INT:
	case Token.LONG:
	case Token.SBYTE:
	case Token.SHORT:
	case Token.STRING:
	case Token.UINT:
	case Token.ULONG:
	case Token.USHORT:
	case Token.OBJECT:
		return "type";
	
	case Token.ASSIGN:
		return "=";
	case Token.OP_GENERICS_LT:
	case Token.GENERIC_DIMENSION:
		return "<";
	case Token.OP_GENERICS_GT:
		return ">";
	case Token.INTERR:
	case Token.INTERR_NULLABLE:
		return "?";
	case Token.DOUBLE_COLON:
		return "::";
	case Token.LITERAL_FLOAT:
	case Token.LITERAL_INTEGER:
	case Token.LITERAL_DOUBLE:
	case Token.LITERAL_DECIMAL:
	case Token.LITERAL_CHARACTER:
	case Token.LITERAL_STRING:
		return "value";
	case Token.IDENTIFIER:
		return "identifier";

		// All of these are internal.
	case Token.NONE:
	case Token.ERROR:
	case Token.FIRST_KEYWORD:
	case Token.EOF:
	case Token.EVAL_COMPILATION_UNIT_PARSER:
	case Token.EVAL_USING_DECLARATIONS_UNIT_PARSER:
	case Token.EVAL_STATEMENT_PARSER:
	case Token.LAST_KEYWORD:
	case Token.GENERATE_COMPLETION:
	case Token.COMPLETE_COMPLETION:
		return "<internal>";

		// A bit more robust.
	default:
		return yyNames [token];
        }
}

/* end end end */
}
#line default
namespace yydebug {
        using System;
	 internal interface yyDebug {
		 void push (int state, Object value);
		 void lex (int state, int token, string name, Object value);
		 void shift (int from, int to, int errorFlag);
		 void pop (int state);
		 void discard (int state, int token, string name, Object value);
		 void reduce (int from, int to, int rule, string text, int len);
		 void shift (int from, int to);
		 void accept (Object value);
		 void error (string message);
		 void reject ();
	 }
	 
	 class yyDebugSimple : yyDebug {
		 void println (string s){
			 Console.Error.WriteLine (s);
		 }
		 
		 public void push (int state, Object value) {
			 println ("push\tstate "+state+"\tvalue "+value);
		 }
		 
		 public void lex (int state, int token, string name, Object value) {
			 println("lex\tstate "+state+"\treading "+name+"\tvalue "+value);
		 }
		 
		 public void shift (int from, int to, int errorFlag) {
			 switch (errorFlag) {
			 default:				// normally
				 println("shift\tfrom state "+from+" to "+to);
				 break;
			 case 0: case 1: case 2:		// in error recovery
				 println("shift\tfrom state "+from+" to "+to
					     +"\t"+errorFlag+" left to recover");
				 break;
			 case 3:				// normally
				 println("shift\tfrom state "+from+" to "+to+"\ton error");
				 break;
			 }
		 }
		 
		 public void pop (int state) {
			 println("pop\tstate "+state+"\ton error");
		 }
		 
		 public void discard (int state, int token, string name, Object value) {
			 println("discard\tstate "+state+"\ttoken "+name+"\tvalue "+value);
		 }
		 
		 public void reduce (int from, int to, int rule, string text, int len) {
			 println("reduce\tstate "+from+"\tuncover "+to
				     +"\trule ("+rule+") "+text);
		 }
		 
		 public void shift (int from, int to) {
			 println("goto\tfrom state "+from+" to "+to);
		 }
		 
		 public void accept (Object value) {
			 println("accept\tvalue "+value);
		 }
		 
		 public void error (string message) {
			 println("error\t"+message);
		 }
		 
		 public void reject () {
			 println("reject");
		 }
		 
	 }
}
// %token constants
 class Token {
  public const int EOF = 257;
  public const int NONE = 258;
  public const int ERROR = 259;
  public const int FIRST_KEYWORD = 260;
  public const int ABSTRACT = 261;
  public const int AS = 262;
  public const int ADD = 263;
  public const int BASE = 264;
  public const int BOOL = 265;
  public const int BREAK = 266;
  public const int BYTE = 267;
  public const int CASE = 268;
  public const int CATCH = 269;
  public const int CHAR = 270;
  public const int CHECKED = 271;
  public const int CLASS = 272;
  public const int CONST = 273;
  public const int CONTINUE = 274;
  public const int DECIMAL = 275;
  public const int DEFAULT = 276;
  public const int DELEGATE = 277;
  public const int DO = 278;
  public const int DOUBLE = 279;
  public const int ELSE = 280;
  public const int ENUM = 281;
  public const int EVENT = 282;
  public const int EXPLICIT = 283;
  public const int EXTERN = 284;
  public const int FALSE = 285;
  public const int FINALLY = 286;
  public const int FIXED = 287;
  public const int FLOAT = 288;
  public const int FOR = 289;
  public const int FOREACH = 290;
  public const int GOTO = 291;
  public const int IF = 292;
  public const int IMPLICIT = 293;
  public const int IN = 294;
  public const int INT = 295;
  public const int INTERFACE = 296;
  public const int INTERNAL = 297;
  public const int IS = 298;
  public const int LOCK = 299;
  public const int LONG = 300;
  public const int NAMESPACE = 301;
  public const int NEW = 302;
  public const int NULL = 303;
  public const int OBJECT = 304;
  public const int OPERATOR = 305;
  public const int OUT = 306;
  public const int OVERRIDE = 307;
  public const int PARAMS = 308;
  public const int PRIVATE = 309;
  public const int PROTECTED = 310;
  public const int PUBLIC = 311;
  public const int READONLY = 312;
  public const int REF = 313;
  public const int RETURN = 314;
  public const int REMOVE = 315;
  public const int SBYTE = 316;
  public const int SEALED = 317;
  public const int SHORT = 318;
  public const int SIZEOF = 319;
  public const int STACKALLOC = 320;
  public const int STATIC = 321;
  public const int STRING = 322;
  public const int STRUCT = 323;
  public const int SWITCH = 324;
  public const int THIS = 325;
  public const int THROW = 326;
  public const int TRUE = 327;
  public const int TRY = 328;
  public const int TYPEOF = 329;
  public const int UINT = 330;
  public const int ULONG = 331;
  public const int UNCHECKED = 332;
  public const int UNSAFE = 333;
  public const int USHORT = 334;
  public const int USING = 335;
  public const int VIRTUAL = 336;
  public const int VOID = 337;
  public const int VOLATILE = 338;
  public const int WHERE = 339;
  public const int WHILE = 340;
  public const int ARGLIST = 341;
  public const int PARTIAL = 342;
  public const int ARROW = 343;
  public const int FROM = 344;
  public const int FROM_FIRST = 345;
  public const int JOIN = 346;
  public const int ON = 347;
  public const int EQUALS = 348;
  public const int SELECT = 349;
  public const int GROUP = 350;
  public const int BY = 351;
  public const int LET = 352;
  public const int ORDERBY = 353;
  public const int ASCENDING = 354;
  public const int DESCENDING = 355;
  public const int INTO = 356;
  public const int INTERR_NULLABLE = 357;
  public const int EXTERN_ALIAS = 358;
  public const int OP_GENERICS_LT = 359;
  public const int OP_GENERICS_LT_DECL = 360;
  public const int OP_GENERICS_GT = 361;
  public const int GET = 362;
  public const int SET = 363;
  public const int LAST_KEYWORD = 364;
  public const int OPEN_BRACE = 365;
  public const int CLOSE_BRACE = 366;
  public const int OPEN_BRACKET = 367;
  public const int CLOSE_BRACKET = 368;
  public const int OPEN_PARENS = 369;
  public const int CLOSE_PARENS = 370;
  public const int DOT = 371;
  public const int COMMA = 372;
  public const int COLON = 373;
  public const int SEMICOLON = 374;
  public const int TILDE = 375;
  public const int PLUS = 376;
  public const int MINUS = 377;
  public const int BANG = 378;
  public const int ASSIGN = 379;
  public const int OP_LT = 380;
  public const int OP_GT = 381;
  public const int BITWISE_AND = 382;
  public const int BITWISE_OR = 383;
  public const int STAR = 384;
  public const int PERCENT = 385;
  public const int DIV = 386;
  public const int CARRET = 387;
  public const int INTERR = 388;
  public const int DOUBLE_COLON = 389;
  public const int OP_INC = 390;
  public const int OP_DEC = 391;
  public const int OP_SHIFT_LEFT = 392;
  public const int OP_SHIFT_RIGHT = 393;
  public const int OP_LE = 394;
  public const int OP_GE = 395;
  public const int OP_EQ = 396;
  public const int OP_NE = 397;
  public const int OP_AND = 398;
  public const int OP_OR = 399;
  public const int OP_MULT_ASSIGN = 400;
  public const int OP_DIV_ASSIGN = 401;
  public const int OP_MOD_ASSIGN = 402;
  public const int OP_ADD_ASSIGN = 403;
  public const int OP_SUB_ASSIGN = 404;
  public const int OP_SHIFT_LEFT_ASSIGN = 405;
  public const int OP_SHIFT_RIGHT_ASSIGN = 406;
  public const int OP_AND_ASSIGN = 407;
  public const int OP_XOR_ASSIGN = 408;
  public const int OP_OR_ASSIGN = 409;
  public const int OP_PTR = 410;
  public const int OP_COALESCING = 411;
  public const int LITERAL_INTEGER = 412;
  public const int LITERAL_FLOAT = 413;
  public const int LITERAL_DOUBLE = 414;
  public const int LITERAL_DECIMAL = 415;
  public const int LITERAL_CHARACTER = 416;
  public const int LITERAL_STRING = 417;
  public const int IDENTIFIER = 418;
  public const int OPEN_PARENS_LAMBDA = 419;
  public const int OPEN_PARENS_CAST = 420;
  public const int GENERIC_DIMENSION = 421;
  public const int DEFAULT_COLON = 422;
  public const int EVAL_STATEMENT_PARSER = 423;
  public const int EVAL_COMPILATION_UNIT_PARSER = 424;
  public const int EVAL_USING_DECLARATIONS_UNIT_PARSER = 425;
  public const int GENERATE_COMPLETION = 426;
  public const int COMPLETE_COMPLETION = 427;
  public const int UMINUS = 428;
  public const int yyErrorCode = 256;
 }
 namespace yyParser {
  using System;
  /** thrown for irrecoverable syntax errors and stack overflow.
    */
  internal class yyException : System.Exception {
    public yyException (string message) : base (message) {
    }
  }
  internal class yyUnexpectedEof : yyException {
    public yyUnexpectedEof (string message) : base (message) {
    }
    public yyUnexpectedEof () : base ("") {
    }
  }

  /** must be implemented by a scanner object to supply input to the parser.
    */
  internal interface yyInput {
    /** move on to next token.
        @return false if positioned beyond tokens.
        @throws IOException on input error.
      */
    bool advance (); // throws java.io.IOException;
    /** classifies current token.
        Should not be called if advance() returned false.
        @return current %token or single character.
      */
    int token ();
    /** associated with current token.
        Should not be called if advance() returned false.
        @return value for token().
      */
    Object value ();
  }
 }
} // close outermost namespace, that MUST HAVE BEEN opened in the prolog

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Australia Australia

Comments and Discussions