From 7f3514a985384267aebfd2d587f470cb5ddec517 Mon Sep 17 00:00:00 2001 From: "Deployment Bot (from Travis CI)" Date: Fri, 22 Mar 2019 19:08:06 +0000 Subject: [PATCH] Deploy RustPython/website to github.com/RustPython/website.git:master --- COPYRIGHT.txt | 18 +- SourceSerifPro-Bold.ttf.woff | Bin 0 -> 93380 bytes SourceSerifPro-It.ttf.woff | Bin 0 -> 36332 bytes SourceSerifPro-Regular.ttf.woff | Bin 0 -> 88724 bytes aliases.js | 5 + dark.css | 13 +- down-arrow.svg | 1 + implementors/core/clone/trait.Clone.js | 6 +- implementors/core/cmp/trait.PartialEq.js | 4 +- implementors/core/convert/trait.From.js | 5 +- implementors/core/default/trait.Default.js | 4 +- implementors/core/fmt/trait.Debug.js | 5 +- implementors/core/fmt/trait.Display.js | 2 +- .../core/iter/iterator/trait.Iterator.js | 1 + .../core/iter/traits/trait.IntoIterator.js | 10 + implementors/core/marker/trait.Copy.js | 3 +- implementors/core/marker/trait.Send.js | 6 +- implementors/core/marker/trait.Sync.js | 6 +- implementors/core/ops/deref/trait.Deref.js | 1 + .../rustpython_vm/frame/trait.NameProtocol.js | 10 + .../rustpython_vm/function/trait.FromArgs.js | 10 + .../function/trait.IntoPyNativeFunc.js | 10 + .../pyobject/trait.IntoPyObject.js | 10 + .../pyobject/trait.PyObjectPayload.js | 10 + .../rustpython_vm/pyobject/trait.PyValue.js | 11 + .../pyobject/trait.TryFromObject.js | 10 + .../pyobject/trait.TryIntoRef.js | 10 + .../vm_class/trait.HeldRcInner.js | 10 + light.css | 13 +- main.js | 14 +- noscript.css | 1 + rustdoc.css | 13 +- rustpython/all.html | 4 +- rustpython/index.html | 2 +- rustpython_derive/FromArgs.m.html | 10 + rustpython_derive/all.html | 3 + rustpython_derive/derive.FromArgs.html | 1 + rustpython_derive/index.html | 2 + rustpython_derive/sidebar-items.js | 1 + rustpython_parser/all.html | 4 +- rustpython_parser/ast/ConversionFlag.t.html | 10 + rustpython_parser/ast/Parameter.t.html | 10 + rustpython_parser/ast/Varargs.t.html | 10 + .../ast/enum.BooleanOperator.html | 32 +- rustpython_parser/ast/enum.Comparison.html | 32 +- .../ast/enum.ComprehensionKind.html | 30 +- .../ast/enum.ConversionFlag.html | 30 + rustpython_parser/ast/enum.Expression.html | 33 +- rustpython_parser/ast/enum.Number.html | 30 +- rustpython_parser/ast/enum.Operator.html | 32 +- rustpython_parser/ast/enum.Statement.html | 31 +- rustpython_parser/ast/enum.StringGroup.html | 31 +- rustpython_parser/ast/enum.Top.html | 30 +- rustpython_parser/ast/enum.UnaryOperator.html | 32 +- rustpython_parser/ast/enum.Varargs.html | 22 + rustpython_parser/ast/index.html | 11 +- rustpython_parser/ast/sidebar-items.js | 2 +- .../ast/struct.Comprehension.html | 42 +- .../ast/struct.ExceptHandler.html | 42 +- rustpython_parser/ast/struct.Keyword.html | 38 +- rustpython_parser/ast/struct.Located.html | 38 +- rustpython_parser/ast/struct.Parameter.html | 19 + rustpython_parser/ast/struct.Parameters.html | 64 +- rustpython_parser/ast/struct.Program.html | 34 +- .../ast/struct.SingleImport.html | 42 +- rustpython_parser/ast/struct.WithItem.html | 38 +- .../ast/type.LocatedStatement.html | 2 +- rustpython_parser/error/enum.ParseError.html | 54 +- rustpython_parser/error/index.html | 4 +- rustpython_parser/index.html | 4 +- .../lexer/enum.LexicalError.html | 29 +- rustpython_parser/lexer/fn.get_keywords.html | 2 +- .../lexer/fn.make_tokenizer.html | 2 +- rustpython_parser/lexer/index.html | 4 +- rustpython_parser/lexer/struct.Lexer.html | 146 +- .../lexer/struct.LineContinationHandler.html | 146 +- rustpython_parser/lexer/struct.Location.html | 39 +- .../lexer/struct.NewlineHandler.html | 146 +- rustpython_parser/lexer/type.Spanned.html | 2 +- .../parser/fn.parse_expression.html | 4 +- .../parser/fn.parse_program.html | 2 +- .../parser/fn.parse_statement.html | 2 +- rustpython_parser/parser/index.html | 5 +- rustpython_parser/parser/sidebar-items.js | 2 +- rustpython_parser/token/enum.Tok.html | 30 +- rustpython_parser/token/index.html | 4 +- rustpython_vm/all.html | 4 +- rustpython_vm/bytecode/Varargs.t.html | 10 + .../bytecode/enum.BinaryOperator.html | 41 +- rustpython_vm/bytecode/enum.CallType.html | 39 +- .../bytecode/enum.ComparisonOperator.html | 41 +- rustpython_vm/bytecode/enum.Constant.html | 46 +- rustpython_vm/bytecode/enum.Instruction.html | 41 +- .../bytecode/enum.UnaryOperator.html | 41 +- rustpython_vm/bytecode/enum.Varargs.html | 27 + rustpython_vm/bytecode/index.html | 6 +- rustpython_vm/bytecode/sidebar-items.js | 2 +- rustpython_vm/bytecode/struct.CodeObject.html | 91 +- .../bytecode/struct.FunctionOpArg.html | 129 +- rustpython_vm/bytecode/type.Label.html | 2 +- rustpython_vm/compile/enum.Mode.html | 24 +- rustpython_vm/compile/fn.compile.html | 4 +- rustpython_vm/compile/index.html | 4 +- rustpython_vm/error/enum.CompileError.html | 52 +- rustpython_vm/error/index.html | 4 +- rustpython_vm/eval/fn.eval.html | 2 +- rustpython_vm/eval/index.html | 4 +- rustpython_vm/extend_class.m.html | 10 + rustpython_vm/fn.print_exception.html | 2 +- rustpython_vm/format/enum.FormatAlign.html | 41 +- rustpython_vm/format/enum.FormatGrouping.html | 32 +- .../format/enum.FormatParseError.html | 32 +- rustpython_vm/format/enum.FormatPart.html | 30 +- rustpython_vm/format/enum.FormatSign.html | 41 +- rustpython_vm/format/enum.FormatType.html | 32 +- rustpython_vm/format/index.html | 4 +- rustpython_vm/format/struct.FormatSpec.html | 33 +- rustpython_vm/format/struct.FormatString.html | 39 +- rustpython_vm/frame/ExecutionResult.t.html | 10 + rustpython_vm/frame/Frame.t.html | 10 + rustpython_vm/frame/FrameResult.t.html | 10 + rustpython_vm/frame/NameProtocol.t.html | 10 + rustpython_vm/frame/Scope.t.html | 10 + rustpython_vm/frame/enum.ExecutionResult.html | 16 + rustpython_vm/frame/index.html | 5 + rustpython_vm/frame/sidebar-items.js | 1 + rustpython_vm/frame/struct.Frame.html | 18 + rustpython_vm/frame/struct.Scope.html | 21 + rustpython_vm/frame/trait.NameProtocol.html | 10 + rustpython_vm/frame/type.FrameResult.html | 1 + rustpython_vm/function/Args.t.html | 10 + rustpython_vm/function/ArgumentError.t.html | 10 + rustpython_vm/function/FromArgs.t.html | 10 + .../function/IntoPyNativeFunc.t.html | 10 + rustpython_vm/function/KwArgs.t.html | 10 + rustpython_vm/function/OptionalArg.t.html | 10 + rustpython_vm/function/PyFuncArgs.t.html | 10 + rustpython_vm/function/PyNativeFunc.t.html | 10 + .../function/enum.ArgumentError.html | 26 + rustpython_vm/function/enum.OptionalArg.html | 22 + rustpython_vm/function/index.html | 17 + rustpython_vm/function/sidebar-items.js | 1 + rustpython_vm/function/struct.Args.html | 41 + rustpython_vm/function/struct.KwArgs.html | 25 + rustpython_vm/function/struct.PyFuncArgs.html | 28 + rustpython_vm/function/trait.FromArgs.html | 16 + .../function/trait.IntoPyNativeFunc.html | 19 + rustpython_vm/function/type.PyNativeFunc.html | 2 + rustpython_vm/import/fn.import_module.html | 2 +- rustpython_vm/import/index.html | 4 +- rustpython_vm/import/sidebar-items.js | 2 +- rustpython_vm/index.html | 8 +- rustpython_vm/macro.arg_check.html | 4 +- rustpython_vm/macro.count_tts.html | 4 +- rustpython_vm/macro.extend_class!.html | 10 + rustpython_vm/macro.extend_class.html | 5 + rustpython_vm/macro.no_kwargs.html | 4 +- rustpython_vm/macro.py_class!.html | 10 + rustpython_vm/macro.py_class.html | 5 + rustpython_vm/macro.py_module!.html | 10 + rustpython_vm/macro.py_module.html | 5 + rustpython_vm/macro.replace_expr.html | 4 +- rustpython_vm/macro.type_check.html | 4 +- rustpython_vm/macros/index.html | 2 +- rustpython_vm/obj/index.html | 14 +- rustpython_vm/obj/objbool/fn.boolval.html | 2 +- rustpython_vm/obj/objbool/fn.get_value.html | 2 +- rustpython_vm/obj/objbool/fn.init.html | 2 +- rustpython_vm/obj/objbool/fn.not.html | 2 +- rustpython_vm/obj/objbool/index.html | 4 +- .../objbuiltinfunc/PyBuiltinFunction.t.html | 10 + rustpython_vm/obj/objbuiltinfunc/index.html | 2 + .../obj/objbuiltinfunc/sidebar-items.js | 1 + .../struct.PyBuiltinFunction.html | 15 + .../obj/objbytearray/PyByteArray.t.html | 10 + .../obj/objbytearray/fn.get_mut_value.html | 1 + .../obj/objbytearray/fn.get_value.html | 1 + rustpython_vm/obj/objbytearray/fn.init.html | 4 +- .../obj/objbytearray/get_mut_value.v.html | 10 + .../obj/objbytearray/get_value.v.html | 10 + rustpython_vm/obj/objbytearray/index.html | 9 +- .../obj/objbytearray/sidebar-items.js | 2 +- .../obj/objbytearray/struct.PyByteArray.html | 15 + rustpython_vm/obj/objbytes/PyBytes.t.html | 10 + rustpython_vm/obj/objbytes/fn.get_value.html | 2 +- rustpython_vm/obj/objbytes/fn.init.html | 2 +- rustpython_vm/obj/objbytes/index.html | 5 +- rustpython_vm/obj/objbytes/sidebar-items.js | 2 +- .../obj/objbytes/struct.PyBytes.html | 14 + .../obj/objclassmethod/PyClassMethod.t.html | 10 + .../objclassmethod/PyClassMethodRef.t.html | 10 + rustpython_vm/obj/objclassmethod/fn.init.html | 1 + rustpython_vm/obj/objclassmethod/index.html | 4 + rustpython_vm/obj/objclassmethod/init.v.html | 10 + .../obj/objclassmethod/sidebar-items.js | 1 + .../objclassmethod/struct.PyClassMethod.html | 20 + .../objclassmethod/type.PyClassMethodRef.html | 1 + rustpython_vm/obj/objcode/PyCode.t.html | 10 + rustpython_vm/obj/objcode/fn.get_value.html | 2 +- rustpython_vm/obj/objcode/fn.init.html | 2 +- rustpython_vm/obj/objcode/index.html | 7 +- rustpython_vm/obj/objcode/sidebar-items.js | 2 +- rustpython_vm/obj/objcode/struct.PyCode.html | 12 + rustpython_vm/obj/objcomplex/PyComplex.t.html | 10 + .../obj/objcomplex/fn.get_value.html | 2 +- rustpython_vm/obj/objcomplex/fn.init.html | 2 +- rustpython_vm/obj/objcomplex/index.html | 5 +- rustpython_vm/obj/objcomplex/sidebar-items.js | 2 +- .../obj/objcomplex/struct.PyComplex.html | 20 + rustpython_vm/obj/objdict/PyDict.t.html | 10 + rustpython_vm/obj/objdict/PyDictRef.t.html | 10 + .../obj/objdict/fn.attributes_to_py_dict.html | 2 +- .../obj/objdict/fn.contains_key_str.html | 2 +- .../objdict/fn.content_contains_key_str.html | 2 +- .../obj/objdict/fn.content_get_key_str.html | 4 +- .../obj/objdict/fn.get_elements.html | 2 +- rustpython_vm/obj/objdict/fn.get_item.html | 2 +- rustpython_vm/obj/objdict/fn.get_key_str.html | 2 +- .../obj/objdict/fn.get_key_value_pairs.html | 2 +- .../fn.get_key_value_pairs_from_content.html | 2 +- .../obj/objdict/fn.get_mut_elements.html | 1 + rustpython_vm/obj/objdict/fn.init.html | 2 +- .../obj/objdict/fn.py_dict_to_attributes.html | 4 +- rustpython_vm/obj/objdict/fn.set_item.html | 2 +- .../obj/objdict/fn.set_item_in_content.html | 2 +- .../obj/objdict/get_mut_elements.v.html | 10 + rustpython_vm/obj/objdict/index.html | 7 +- rustpython_vm/obj/objdict/sidebar-items.js | 2 +- rustpython_vm/obj/objdict/struct.PyDict.html | 16 + .../obj/objdict/type.DictContentType.html | 2 +- rustpython_vm/obj/objdict/type.PyDictRef.html | 1 + rustpython_vm/obj/objellipsis/fn.init.html | 1 + rustpython_vm/obj/objellipsis/index.html | 2 + rustpython_vm/obj/objellipsis/init.v.html | 10 + .../obj/objellipsis/sidebar-items.js | 1 + .../obj/objenumerate/PyEnumerate.t.html | 10 + rustpython_vm/obj/objenumerate/fn.init.html | 2 +- rustpython_vm/obj/objenumerate/index.html | 5 +- .../obj/objenumerate/sidebar-items.js | 2 +- .../obj/objenumerate/struct.PyEnumerate.html | 12 + rustpython_vm/obj/objfilter/PyFilter.t.html | 10 + rustpython_vm/obj/objfilter/fn.init.html | 2 +- rustpython_vm/obj/objfilter/index.html | 5 +- rustpython_vm/obj/objfilter/sidebar-items.js | 2 +- .../obj/objfilter/struct.PyFilter.html | 12 + rustpython_vm/obj/objfloat/PyFloat.t.html | 10 + rustpython_vm/obj/objfloat/PyFloatRef.t.html | 10 + rustpython_vm/obj/objfloat/fn.get_value.html | 2 +- rustpython_vm/obj/objfloat/fn.init.html | 2 +- rustpython_vm/obj/objfloat/fn.make_float.html | 2 +- rustpython_vm/obj/objfloat/index.html | 6 +- rustpython_vm/obj/objfloat/sidebar-items.js | 2 +- .../obj/objfloat/struct.PyFloat.html | 20 + .../obj/objfloat/type.PyFloatRef.html | 1 + rustpython_vm/obj/objframe/fn.get_value.html | 2 +- rustpython_vm/obj/objframe/fn.init.html | 2 +- rustpython_vm/obj/objframe/index.html | 4 +- .../obj/objfunction/PyFunction.t.html | 10 + rustpython_vm/obj/objfunction/PyMethod.t.html | 10 + rustpython_vm/obj/objfunction/fn.init.html | 2 +- rustpython_vm/obj/objfunction/index.html | 5 +- .../obj/objfunction/sidebar-items.js | 2 +- .../obj/objfunction/struct.PyFunction.html | 17 + .../obj/objfunction/struct.PyMethod.html | 16 + .../obj/objgenerator/PyGenerator.t.html | 10 + rustpython_vm/obj/objgenerator/fn.init.html | 2 +- .../obj/objgenerator/fn.new_generator.html | 2 +- rustpython_vm/obj/objgenerator/index.html | 5 +- .../obj/objgenerator/sidebar-items.js | 2 +- .../obj/objgenerator/struct.PyGenerator.html | 12 + rustpython_vm/obj/objint/PyInt.t.html | 10 + rustpython_vm/obj/objint/PyIntRef.t.html | 10 + rustpython_vm/obj/objint/fn.get_value.html | 2 +- rustpython_vm/obj/objint/fn.init.html | 2 +- rustpython_vm/obj/objint/fn.to_int.html | 2 +- rustpython_vm/obj/objint/index.html | 6 +- rustpython_vm/obj/objint/sidebar-items.js | 2 +- rustpython_vm/obj/objint/struct.PyInt.html | 15 + rustpython_vm/obj/objint/type.PyIntRef.html | 1 + rustpython_vm/obj/objiter/fn.call_next.html | 2 +- rustpython_vm/obj/objiter/fn.get_all.html | 2 +- rustpython_vm/obj/objiter/fn.get_iter.html | 2 +- .../obj/objiter/fn.get_next_object.html | 2 +- rustpython_vm/obj/objiter/fn.init.html | 2 +- .../obj/objiter/fn.iter_type_init.html | 4 +- .../obj/objiter/fn.new_stop_iteration.html | 2 +- rustpython_vm/obj/objiter/index.html | 4 +- rustpython_vm/obj/objlist/PyList.t.html | 10 + rustpython_vm/obj/objlist/PyListRef.t.html | 10 + rustpython_vm/obj/objlist/fn.init.html | 2 +- rustpython_vm/obj/objlist/index.html | 6 +- rustpython_vm/obj/objlist/sidebar-items.js | 2 +- rustpython_vm/obj/objlist/struct.PyList.html | 17 + rustpython_vm/obj/objlist/type.PyListRef.html | 1 + rustpython_vm/obj/objmap/PyMap.t.html | 10 + rustpython_vm/obj/objmap/fn.init.html | 2 +- rustpython_vm/obj/objmap/index.html | 5 +- rustpython_vm/obj/objmap/sidebar-items.js | 2 +- rustpython_vm/obj/objmap/struct.PyMap.html | 12 + .../obj/objmemory/PyMemoryView.t.html | 10 + rustpython_vm/obj/objmemory/fn.init.html | 2 +- .../obj/objmemory/fn.new_memory_view.html | 2 +- rustpython_vm/obj/objmemory/index.html | 5 +- rustpython_vm/obj/objmemory/sidebar-items.js | 2 +- .../obj/objmemory/struct.PyMemoryView.html | 12 + rustpython_vm/obj/objmodule/PyModule.t.html | 10 + .../obj/objmodule/PyModuleRef.t.html | 10 + rustpython_vm/obj/objmodule/fn.init.html | 1 + rustpython_vm/obj/objmodule/index.html | 4 + rustpython_vm/obj/objmodule/init.v.html | 10 + rustpython_vm/obj/objmodule/sidebar-items.js | 1 + .../obj/objmodule/struct.PyModule.html | 21 + .../obj/objmodule/type.PyModuleRef.html | 1 + rustpython_vm/obj/objnone/PyNone.t.html | 10 + rustpython_vm/obj/objnone/PyNoneRef.t.html | 10 + rustpython_vm/obj/objnone/fn.init.html | 2 +- rustpython_vm/obj/objnone/index.html | 6 +- rustpython_vm/obj/objnone/sidebar-items.js | 2 +- rustpython_vm/obj/objnone/struct.PyNone.html | 17 + rustpython_vm/obj/objnone/type.PyNoneRef.html | 1 + rustpython_vm/obj/objobject/PyInstance.t.html | 10 + .../obj/objobject/PyInstanceRef.t.html | 10 + .../obj/objobject/fn.get_attributes.html | 1 + rustpython_vm/obj/objobject/fn.init.html | 2 +- .../obj/objobject/fn.new_instance.html | 2 +- .../obj/objobject/fn.object_dir.html | 1 + .../obj/objobject/get_attributes.v.html | 10 + rustpython_vm/obj/objobject/index.html | 6 +- rustpython_vm/obj/objobject/object_dir.v.html | 10 + rustpython_vm/obj/objobject/sidebar-items.js | 2 +- .../obj/objobject/struct.PyInstance.html | 17 + .../obj/objobject/type.PyInstanceRef.html | 1 + .../obj/objproperty/PropertyBuilder.t.html | 10 + .../obj/objproperty/PyProperty.t.html | 10 + .../obj/objproperty/PyPropertyRef.t.html | 10 + .../obj/objproperty/PyReadOnlyProperty.t.html | 10 + .../objproperty/PyReadOnlyPropertyRef.t.html | 10 + rustpython_vm/obj/objproperty/fn.init.html | 2 +- rustpython_vm/obj/objproperty/index.html | 10 +- .../obj/objproperty/sidebar-items.js | 2 +- .../objproperty/struct.PropertyBuilder.html | 11 + .../obj/objproperty/struct.PyProperty.html | 13 + .../struct.PyReadOnlyProperty.html | 13 + .../obj/objproperty/type.PyPropertyRef.html | 1 + .../type.PyReadOnlyPropertyRef.html | 1 + rustpython_vm/obj/objrange/PyRange.t.html | 10 + rustpython_vm/obj/objrange/fn.get_value.html | 2 +- rustpython_vm/obj/objrange/fn.init.html | 2 +- rustpython_vm/obj/objrange/index.html | 6 +- rustpython_vm/obj/objrange/sidebar-items.js | 2 +- .../obj/objrange/struct.PyRange.html | 22 + .../obj/objsequence/fn.get_elements.html | 2 +- .../obj/objsequence/fn.get_elements_cell.html | 1 + .../obj/objsequence/fn.get_item.html | 2 +- .../obj/objsequence/fn.get_mut_elements.html | 2 +- .../obj/objsequence/fn.seq_equal.html | 2 +- rustpython_vm/obj/objsequence/fn.seq_ge.html | 2 +- rustpython_vm/obj/objsequence/fn.seq_gt.html | 2 +- rustpython_vm/obj/objsequence/fn.seq_le.html | 2 +- rustpython_vm/obj/objsequence/fn.seq_lt.html | 2 +- rustpython_vm/obj/objsequence/fn.seq_mul.html | 2 +- .../obj/objsequence/get_elements_cell.v.html | 10 + rustpython_vm/obj/objsequence/index.html | 4 +- .../obj/objsequence/sidebar-items.js | 2 +- .../trait.PySliceableSequence.html | 24 +- rustpython_vm/obj/objset/PySet.t.html | 10 + rustpython_vm/obj/objset/PySetRef.t.html | 10 + rustpython_vm/obj/objset/fn.get_elements.html | 2 +- rustpython_vm/obj/objset/fn.init.html | 2 +- rustpython_vm/obj/objset/fn.set_contains.html | 2 +- rustpython_vm/obj/objset/index.html | 6 +- rustpython_vm/obj/objset/sidebar-items.js | 2 +- rustpython_vm/obj/objset/struct.PySet.html | 13 + rustpython_vm/obj/objset/type.PySetRef.html | 1 + rustpython_vm/obj/objslice/PySlice.t.html | 10 + rustpython_vm/obj/objslice/fn.init.html | 2 +- rustpython_vm/obj/objslice/index.html | 5 +- rustpython_vm/obj/objslice/sidebar-items.js | 2 +- .../obj/objslice/struct.PySlice.html | 17 + .../obj/objstaticmethod/PyStaticMethod.t.html | 10 + .../objstaticmethod/PyStaticMethodRef.t.html | 10 + .../obj/objstaticmethod/fn.init.html | 1 + rustpython_vm/obj/objstaticmethod/index.html | 4 + rustpython_vm/obj/objstaticmethod/init.v.html | 10 + .../obj/objstaticmethod/sidebar-items.js | 1 + .../struct.PyStaticMethod.html | 20 + .../type.PyStaticMethodRef.html | 1 + rustpython_vm/obj/objstr/PyString.t.html | 10 + rustpython_vm/obj/objstr/PyStringRef.t.html | 10 + rustpython_vm/obj/objstr/fn.borrow_value.html | 2 +- rustpython_vm/obj/objstr/fn.get_value.html | 2 +- rustpython_vm/obj/objstr/fn.init.html | 2 +- rustpython_vm/obj/objstr/fn.subscript.html | 2 +- rustpython_vm/obj/objstr/index.html | 6 +- rustpython_vm/obj/objstr/sidebar-items.js | 2 +- rustpython_vm/obj/objstr/struct.PyString.html | 22 + .../obj/objstr/type.PyStringRef.html | 1 + rustpython_vm/obj/objsuper/PySuper.t.html | 10 + rustpython_vm/obj/objsuper/fn.init.html | 2 +- rustpython_vm/obj/objsuper/index.html | 7 +- rustpython_vm/obj/objsuper/sidebar-items.js | 2 +- .../obj/objsuper/struct.PySuper.html | 12 + rustpython_vm/obj/objtuple/PyTuple.t.html | 10 + rustpython_vm/obj/objtuple/PyTupleRef.t.html | 10 + rustpython_vm/obj/objtuple/fn.init.html | 2 +- rustpython_vm/obj/objtuple/index.html | 6 +- rustpython_vm/obj/objtuple/sidebar-items.js | 2 +- .../obj/objtuple/struct.PyTuple.html | 17 + .../obj/objtuple/type.PyTupleRef.html | 1 + rustpython_vm/obj/objtype/PyClass.t.html | 10 + rustpython_vm/obj/objtype/PyClassRef.t.html | 10 + .../obj/objtype/fn.get_attributes.html | 2 +- .../obj/objtype/fn.get_type_name.html | 2 +- rustpython_vm/obj/objtype/fn.init.html | 2 +- rustpython_vm/obj/objtype/fn.isinstance.html | 4 +- rustpython_vm/obj/objtype/fn.issubclass.html | 5 +- rustpython_vm/obj/objtype/fn.new.html | 2 +- rustpython_vm/obj/objtype/fn.type_call.html | 2 +- .../obj/objtype/fn.type_getattribute.html | 2 +- rustpython_vm/obj/objtype/fn.type_new.html | 2 +- .../obj/objtype/fn.type_new_class.html | 1 + rustpython_vm/obj/objtype/index.html | 11 +- rustpython_vm/obj/objtype/sidebar-items.js | 2 +- rustpython_vm/obj/objtype/struct.PyClass.html | 23 + .../obj/objtype/type.PyClassRef.html | 1 + .../obj/objtype/type_new_class.v.html | 10 + rustpython_vm/obj/objweakref/PyWeak.t.html | 10 + rustpython_vm/obj/objweakref/PyWeakRef.t.html | 10 + rustpython_vm/obj/objweakref/fn.init.html | 1 + rustpython_vm/obj/objweakref/index.html | 4 + rustpython_vm/obj/objweakref/init.v.html | 10 + rustpython_vm/obj/objweakref/sidebar-items.js | 1 + .../obj/objweakref/struct.PyWeak.html | 12 + .../obj/objweakref/type.PyWeakRef.html | 1 + rustpython_vm/obj/objzip/PyZip.t.html | 10 + rustpython_vm/obj/objzip/fn.init.html | 2 +- rustpython_vm/obj/objzip/index.html | 5 +- rustpython_vm/obj/objzip/sidebar-items.js | 2 +- rustpython_vm/obj/objzip/struct.PyZip.html | 12 + rustpython_vm/obj/sidebar-items.js | 2 +- rustpython_vm/py_class.m.html | 10 + rustpython_vm/py_module.m.html | 10 + rustpython_vm/pyobject/IntoPyObject.t.html | 10 + rustpython_vm/pyobject/PyEllipsis.t.html | 10 + rustpython_vm/pyobject/PyIterable.t.html | 10 + rustpython_vm/pyobject/PyIterator.t.html | 10 + rustpython_vm/pyobject/PyIteratorValue.t.html | 10 + .../pyobject/PyNotImplemented.t.html | 10 + rustpython_vm/pyobject/PyValue.t.html | 10 + rustpython_vm/pyobject/TryFromObject.t.html | 10 + rustpython_vm/pyobject/TryIntoRef.t.html | 10 + rustpython_vm/pyobject/fn.create_type.html | 2 +- rustpython_vm/pyobject/index.html | 25 +- rustpython_vm/pyobject/sidebar-items.js | 2 +- rustpython_vm/pyobject/struct.PyContext.html | 188 +- rustpython_vm/pyobject/struct.PyEllipsis.html | 12 + rustpython_vm/pyobject/struct.PyIterable.html | 22 + rustpython_vm/pyobject/struct.PyIterator.html | 72 + .../pyobject/struct.PyIteratorValue.html | 16 + .../pyobject/struct.PyNotImplemented.html | 12 + rustpython_vm/pyobject/struct.PyObject.html | 43 +- rustpython_vm/pyobject/struct.PyRef.html | 31 + .../pyobject/trait.AttributeProtocol.html | 11 +- .../pyobject/trait.BufferProtocol.html | 11 +- .../pyobject/trait.DictProtocol.html | 13 +- .../pyobject/trait.FromPyObjectRef.html | 15 +- rustpython_vm/pyobject/trait.IdProtocol.html | 16 +- .../pyobject/trait.IntoPyObject.html | 12 + .../pyobject/trait.PyObjectPayload.html | 7 + rustpython_vm/pyobject/trait.PyValue.html | 12 + .../pyobject/trait.TryFromObject.html | 12 + rustpython_vm/pyobject/trait.TryIntoRef.html | 10 + .../pyobject/trait.TypeProtocol.html | 17 +- rustpython_vm/pyobject/type.PyAttributes.html | 4 +- rustpython_vm/pyobject/type.PyObjectRef.html | 5 +- rustpython_vm/pyobject/type.PyResult.html | 4 +- rustpython_vm/sidebar-items.js | 2 +- rustpython_vm/stdlib/fn.get_module_inits.html | 2 +- rustpython_vm/stdlib/index.html | 6 +- rustpython_vm/stdlib/io/fn.io_open.html | 2 +- rustpython_vm/stdlib/io/fn.make_module.html | 1 + rustpython_vm/stdlib/io/index.html | 4 +- rustpython_vm/stdlib/io/make_module.v.html | 10 + rustpython_vm/stdlib/io/sidebar-items.js | 2 +- rustpython_vm/stdlib/sidebar-items.js | 2 +- rustpython_vm/stdlib/socket/Socket.t.html | 10 + .../stdlib/socket/fn.make_module.html | 1 + rustpython_vm/stdlib/socket/index.html | 3 + .../stdlib/socket/make_module.v.html | 10 + rustpython_vm/stdlib/socket/sidebar-items.js | 1 + .../stdlib/socket/struct.Socket.html | 12 + rustpython_vm/stdlib/type.StdlibInitFunc.html | 2 +- rustpython_vm/struct.VirtualMachine.html | 70 +- rustpython_vm/util/fn.read_file.html | 4 +- rustpython_vm/util/index.html | 4 +- rustpython_wasm/all.html | 4 +- .../browser_module/PyPromise.t.html | 10 + .../browser_module/fn.get_promise_value.html | 1 + .../fn.import_promise_type.html | 1 + .../browser_module/fn.make_module.html | 1 + .../fn.setup_browser_module.html | 1 + .../browser_module/get_promise_value.v.html | 10 + .../browser_module/import_promise_type.v.html | 10 + rustpython_wasm/browser_module/index.html | 3 + .../browser_module/make_module.v.html | 10 + .../setup_browser_module.v.html | 10 + .../browser_module/sidebar-items.js | 1 + .../browser_module/struct.PyPromise.html | 12 + .../convert/fn.js_py_typeerror.html | 2 +- rustpython_wasm/convert/fn.js_to_py.html | 2 +- .../convert/fn.object_entries.html | 2 +- .../convert/fn.py_err_to_js_err.html | 1 + rustpython_wasm/convert/fn.py_to_js.html | 2 +- .../convert/fn.pyresult_to_jsresult.html | 2 +- rustpython_wasm/convert/index.html | 4 +- .../convert/py_err_to_js_err.v.html | 10 + rustpython_wasm/convert/sidebar-items.js | 2 +- rustpython_wasm/fn.eval_py.html | 4 +- rustpython_wasm/fn.setup_console_error.html | 2 +- rustpython_wasm/index.html | 6 +- rustpython_wasm/sidebar-items.js | 2 +- rustpython_wasm/vm_class/HeldRcInner.t.html | 10 + rustpython_wasm/vm_class/index.html | 5 +- rustpython_wasm/vm_class/sidebar-items.js | 2 +- rustpython_wasm/vm_class/struct.VMStore.html | 55 +- .../vm_class/struct.WASMVirtualMachine.html | 66 +- .../vm_class/trait.HeldRcInner.html | 4 + .../fn.builtin_print_console.html | 2 +- .../wasm_builtins/fn.format_print_args.html | 2 +- rustpython_wasm/wasm_builtins/index.html | 7 +- .../wasm_builtins/sidebar-items.js | 2 +- search-index.js | 9 +- settings.css | 11 - settings.html | 2 +- settings.js | 12 +- source-files.js | 5 + source-script.js | 12 +- src/rustpython/main.rs.html | 94 +- src/rustpython_derive/lib.rs.html | 99 + src/rustpython_parser/ast.rs.html | 104 +- src/rustpython_parser/error.rs.html | 4 +- src/rustpython_parser/fstring.rs.html | 471 + src/rustpython_parser/lexer.rs.html | 132 +- src/rustpython_parser/lib.rs.html | 6 +- src/rustpython_parser/parser.rs.html | 462 +- src/rustpython_parser/python.rs.html | 15008 +++++++++++----- src/rustpython_parser/token.rs.html | 4 +- src/rustpython_vm/builtins.rs.html | 416 +- src/rustpython_vm/bytecode.rs.html | 82 +- src/rustpython_vm/compile.rs.html | 758 +- src/rustpython_vm/error.rs.html | 16 +- src/rustpython_vm/eval.rs.html | 20 +- src/rustpython_vm/exceptions.rs.html | 128 +- src/rustpython_vm/format.rs.html | 4 +- src/rustpython_vm/frame.rs.html | 628 +- src/rustpython_vm/function.rs.html | 869 + src/rustpython_vm/import.rs.html | 252 +- src/rustpython_vm/lib.rs.html | 26 +- src/rustpython_vm/macros.rs.html | 62 +- src/rustpython_vm/obj/mod.rs.html | 16 +- src/rustpython_vm/obj/objbool.rs.html | 290 +- src/rustpython_vm/obj/objbuiltinfunc.rs.html | 59 + src/rustpython_vm/obj/objbytearray.rs.html | 176 +- src/rustpython_vm/obj/objbytes.rs.html | 164 +- src/rustpython_vm/obj/objclassmethod.rs.html | 87 + src/rustpython_vm/obj/objcode.rs.html | 84 +- src/rustpython_vm/obj/objcomplex.rs.html | 106 +- src/rustpython_vm/obj/objdict.rs.html | 380 +- src/rustpython_vm/obj/objellipsis.rs.html | 49 + src/rustpython_vm/obj/objenumerate.rs.html | 98 +- src/rustpython_vm/obj/objfilter.rs.html | 64 +- src/rustpython_vm/obj/objfloat.rs.html | 834 +- src/rustpython_vm/obj/objframe.rs.html | 48 +- src/rustpython_vm/obj/objfunction.rs.html | 418 +- src/rustpython_vm/obj/objgenerator.rs.html | 60 +- src/rustpython_vm/obj/objint.rs.html | 1118 +- src/rustpython_vm/obj/objiter.rs.html | 116 +- src/rustpython_vm/obj/objlist.rs.html | 866 +- src/rustpython_vm/obj/objmap.rs.html | 80 +- src/rustpython_vm/obj/objmemory.rs.html | 34 +- src/rustpython_vm/obj/objmodule.rs.html | 81 + src/rustpython_vm/obj/objnone.rs.html | 248 +- src/rustpython_vm/obj/objobject.rs.html | 300 +- src/rustpython_vm/obj/objproperty.rs.html | 636 +- src/rustpython_vm/obj/objrange.rs.html | 184 +- src/rustpython_vm/obj/objsequence.rs.html | 146 +- src/rustpython_vm/obj/objset.rs.html | 374 +- src/rustpython_vm/obj/objslice.rs.html | 254 +- src/rustpython_vm/obj/objstaticmethod.rs.html | 83 + src/rustpython_vm/obj/objstr.rs.html | 3754 ++-- src/rustpython_vm/obj/objsuper.rs.html | 360 +- src/rustpython_vm/obj/objtuple.rs.html | 556 +- src/rustpython_vm/obj/objtype.rs.html | 390 +- src/rustpython_vm/obj/objweakref.rs.html | 101 + src/rustpython_vm/obj/objzip.rs.html | 50 +- src/rustpython_vm/pyobject.rs.html | 1290 +- src/rustpython_vm/stdlib/ast.rs.html | 88 +- src/rustpython_vm/stdlib/dis.rs.html | 36 +- src/rustpython_vm/stdlib/io.rs.html | 304 +- src/rustpython_vm/stdlib/json.rs.html | 96 +- src/rustpython_vm/stdlib/keyword.rs.html | 28 +- src/rustpython_vm/stdlib/math.rs.html | 46 +- src/rustpython_vm/stdlib/mod.rs.html | 48 +- src/rustpython_vm/stdlib/os.rs.html | 48 +- src/rustpython_vm/stdlib/platform.rs.html | 59 + src/rustpython_vm/stdlib/pystruct.rs.html | 168 +- src/rustpython_vm/stdlib/random.rs.html | 22 +- src/rustpython_vm/stdlib/re.rs.html | 482 +- src/rustpython_vm/stdlib/socket.rs.html | 891 + src/rustpython_vm/stdlib/string.rs.html | 32 +- src/rustpython_vm/stdlib/time_module.rs.html | 28 +- src/rustpython_vm/stdlib/tokenize.rs.html | 28 +- src/rustpython_vm/stdlib/types.rs.html | 58 +- src/rustpython_vm/stdlib/weakref.rs.html | 94 +- src/rustpython_vm/sysmodule.rs.html | 76 +- src/rustpython_vm/traceback.rs.html | 4 +- src/rustpython_vm/util.rs.html | 4 +- src/rustpython_vm/vm.rs.html | 622 +- src/rustpython_wasm/browser_module.rs.html | 685 + src/rustpython_wasm/convert.rs.html | 184 +- src/rustpython_wasm/lib.rs.html | 218 +- src/rustpython_wasm/vm_class.rs.html | 340 +- src/rustpython_wasm/wasm_builtins.rs.html | 238 +- storage.js | 12 +- 624 files changed, 28018 insertions(+), 16335 deletions(-) create mode 100644 SourceSerifPro-Bold.ttf.woff create mode 100644 SourceSerifPro-It.ttf.woff create mode 100644 SourceSerifPro-Regular.ttf.woff create mode 100644 down-arrow.svg create mode 100644 implementors/core/iter/traits/trait.IntoIterator.js create mode 100644 implementors/rustpython_vm/frame/trait.NameProtocol.js create mode 100644 implementors/rustpython_vm/function/trait.FromArgs.js create mode 100644 implementors/rustpython_vm/function/trait.IntoPyNativeFunc.js create mode 100644 implementors/rustpython_vm/pyobject/trait.IntoPyObject.js create mode 100644 implementors/rustpython_vm/pyobject/trait.PyObjectPayload.js create mode 100644 implementors/rustpython_vm/pyobject/trait.PyValue.js create mode 100644 implementors/rustpython_vm/pyobject/trait.TryFromObject.js create mode 100644 implementors/rustpython_vm/pyobject/trait.TryIntoRef.js create mode 100644 implementors/rustpython_wasm/vm_class/trait.HeldRcInner.js create mode 100644 noscript.css create mode 100644 rustpython_derive/FromArgs.m.html create mode 100644 rustpython_derive/all.html create mode 100644 rustpython_derive/derive.FromArgs.html create mode 100644 rustpython_derive/index.html create mode 100644 rustpython_derive/sidebar-items.js create mode 100644 rustpython_parser/ast/ConversionFlag.t.html create mode 100644 rustpython_parser/ast/Parameter.t.html create mode 100644 rustpython_parser/ast/Varargs.t.html create mode 100644 rustpython_parser/ast/enum.ConversionFlag.html create mode 100644 rustpython_parser/ast/enum.Varargs.html create mode 100644 rustpython_parser/ast/struct.Parameter.html create mode 100644 rustpython_vm/bytecode/Varargs.t.html create mode 100644 rustpython_vm/bytecode/enum.Varargs.html create mode 100644 rustpython_vm/extend_class.m.html create mode 100644 rustpython_vm/frame/ExecutionResult.t.html create mode 100644 rustpython_vm/frame/Frame.t.html create mode 100644 rustpython_vm/frame/FrameResult.t.html create mode 100644 rustpython_vm/frame/NameProtocol.t.html create mode 100644 rustpython_vm/frame/Scope.t.html create mode 100644 rustpython_vm/frame/enum.ExecutionResult.html create mode 100644 rustpython_vm/frame/index.html create mode 100644 rustpython_vm/frame/sidebar-items.js create mode 100644 rustpython_vm/frame/struct.Frame.html create mode 100644 rustpython_vm/frame/struct.Scope.html create mode 100644 rustpython_vm/frame/trait.NameProtocol.html create mode 100644 rustpython_vm/frame/type.FrameResult.html create mode 100644 rustpython_vm/function/Args.t.html create mode 100644 rustpython_vm/function/ArgumentError.t.html create mode 100644 rustpython_vm/function/FromArgs.t.html create mode 100644 rustpython_vm/function/IntoPyNativeFunc.t.html create mode 100644 rustpython_vm/function/KwArgs.t.html create mode 100644 rustpython_vm/function/OptionalArg.t.html create mode 100644 rustpython_vm/function/PyFuncArgs.t.html create mode 100644 rustpython_vm/function/PyNativeFunc.t.html create mode 100644 rustpython_vm/function/enum.ArgumentError.html create mode 100644 rustpython_vm/function/enum.OptionalArg.html create mode 100644 rustpython_vm/function/index.html create mode 100644 rustpython_vm/function/sidebar-items.js create mode 100644 rustpython_vm/function/struct.Args.html create mode 100644 rustpython_vm/function/struct.KwArgs.html create mode 100644 rustpython_vm/function/struct.PyFuncArgs.html create mode 100644 rustpython_vm/function/trait.FromArgs.html create mode 100644 rustpython_vm/function/trait.IntoPyNativeFunc.html create mode 100644 rustpython_vm/function/type.PyNativeFunc.html create mode 100644 rustpython_vm/macro.extend_class!.html create mode 100644 rustpython_vm/macro.extend_class.html create mode 100644 rustpython_vm/macro.py_class!.html create mode 100644 rustpython_vm/macro.py_class.html create mode 100644 rustpython_vm/macro.py_module!.html create mode 100644 rustpython_vm/macro.py_module.html create mode 100644 rustpython_vm/obj/objbuiltinfunc/PyBuiltinFunction.t.html create mode 100644 rustpython_vm/obj/objbuiltinfunc/index.html create mode 100644 rustpython_vm/obj/objbuiltinfunc/sidebar-items.js create mode 100644 rustpython_vm/obj/objbuiltinfunc/struct.PyBuiltinFunction.html create mode 100644 rustpython_vm/obj/objbytearray/PyByteArray.t.html create mode 100644 rustpython_vm/obj/objbytearray/fn.get_mut_value.html create mode 100644 rustpython_vm/obj/objbytearray/fn.get_value.html create mode 100644 rustpython_vm/obj/objbytearray/get_mut_value.v.html create mode 100644 rustpython_vm/obj/objbytearray/get_value.v.html create mode 100644 rustpython_vm/obj/objbytearray/struct.PyByteArray.html create mode 100644 rustpython_vm/obj/objbytes/PyBytes.t.html create mode 100644 rustpython_vm/obj/objbytes/struct.PyBytes.html create mode 100644 rustpython_vm/obj/objclassmethod/PyClassMethod.t.html create mode 100644 rustpython_vm/obj/objclassmethod/PyClassMethodRef.t.html create mode 100644 rustpython_vm/obj/objclassmethod/fn.init.html create mode 100644 rustpython_vm/obj/objclassmethod/index.html create mode 100644 rustpython_vm/obj/objclassmethod/init.v.html create mode 100644 rustpython_vm/obj/objclassmethod/sidebar-items.js create mode 100644 rustpython_vm/obj/objclassmethod/struct.PyClassMethod.html create mode 100644 rustpython_vm/obj/objclassmethod/type.PyClassMethodRef.html create mode 100644 rustpython_vm/obj/objcode/PyCode.t.html create mode 100644 rustpython_vm/obj/objcode/struct.PyCode.html create mode 100644 rustpython_vm/obj/objcomplex/PyComplex.t.html create mode 100644 rustpython_vm/obj/objcomplex/struct.PyComplex.html create mode 100644 rustpython_vm/obj/objdict/PyDict.t.html create mode 100644 rustpython_vm/obj/objdict/PyDictRef.t.html create mode 100644 rustpython_vm/obj/objdict/fn.get_mut_elements.html create mode 100644 rustpython_vm/obj/objdict/get_mut_elements.v.html create mode 100644 rustpython_vm/obj/objdict/struct.PyDict.html create mode 100644 rustpython_vm/obj/objdict/type.PyDictRef.html create mode 100644 rustpython_vm/obj/objellipsis/fn.init.html create mode 100644 rustpython_vm/obj/objellipsis/index.html create mode 100644 rustpython_vm/obj/objellipsis/init.v.html create mode 100644 rustpython_vm/obj/objellipsis/sidebar-items.js create mode 100644 rustpython_vm/obj/objenumerate/PyEnumerate.t.html create mode 100644 rustpython_vm/obj/objenumerate/struct.PyEnumerate.html create mode 100644 rustpython_vm/obj/objfilter/PyFilter.t.html create mode 100644 rustpython_vm/obj/objfilter/struct.PyFilter.html create mode 100644 rustpython_vm/obj/objfloat/PyFloat.t.html create mode 100644 rustpython_vm/obj/objfloat/PyFloatRef.t.html create mode 100644 rustpython_vm/obj/objfloat/struct.PyFloat.html create mode 100644 rustpython_vm/obj/objfloat/type.PyFloatRef.html create mode 100644 rustpython_vm/obj/objfunction/PyFunction.t.html create mode 100644 rustpython_vm/obj/objfunction/PyMethod.t.html create mode 100644 rustpython_vm/obj/objfunction/struct.PyFunction.html create mode 100644 rustpython_vm/obj/objfunction/struct.PyMethod.html create mode 100644 rustpython_vm/obj/objgenerator/PyGenerator.t.html create mode 100644 rustpython_vm/obj/objgenerator/struct.PyGenerator.html create mode 100644 rustpython_vm/obj/objint/PyInt.t.html create mode 100644 rustpython_vm/obj/objint/PyIntRef.t.html create mode 100644 rustpython_vm/obj/objint/struct.PyInt.html create mode 100644 rustpython_vm/obj/objint/type.PyIntRef.html create mode 100644 rustpython_vm/obj/objlist/PyList.t.html create mode 100644 rustpython_vm/obj/objlist/PyListRef.t.html create mode 100644 rustpython_vm/obj/objlist/struct.PyList.html create mode 100644 rustpython_vm/obj/objlist/type.PyListRef.html create mode 100644 rustpython_vm/obj/objmap/PyMap.t.html create mode 100644 rustpython_vm/obj/objmap/struct.PyMap.html create mode 100644 rustpython_vm/obj/objmemory/PyMemoryView.t.html create mode 100644 rustpython_vm/obj/objmemory/struct.PyMemoryView.html create mode 100644 rustpython_vm/obj/objmodule/PyModule.t.html create mode 100644 rustpython_vm/obj/objmodule/PyModuleRef.t.html create mode 100644 rustpython_vm/obj/objmodule/fn.init.html create mode 100644 rustpython_vm/obj/objmodule/index.html create mode 100644 rustpython_vm/obj/objmodule/init.v.html create mode 100644 rustpython_vm/obj/objmodule/sidebar-items.js create mode 100644 rustpython_vm/obj/objmodule/struct.PyModule.html create mode 100644 rustpython_vm/obj/objmodule/type.PyModuleRef.html create mode 100644 rustpython_vm/obj/objnone/PyNone.t.html create mode 100644 rustpython_vm/obj/objnone/PyNoneRef.t.html create mode 100644 rustpython_vm/obj/objnone/struct.PyNone.html create mode 100644 rustpython_vm/obj/objnone/type.PyNoneRef.html create mode 100644 rustpython_vm/obj/objobject/PyInstance.t.html create mode 100644 rustpython_vm/obj/objobject/PyInstanceRef.t.html create mode 100644 rustpython_vm/obj/objobject/fn.get_attributes.html create mode 100644 rustpython_vm/obj/objobject/fn.object_dir.html create mode 100644 rustpython_vm/obj/objobject/get_attributes.v.html create mode 100644 rustpython_vm/obj/objobject/object_dir.v.html create mode 100644 rustpython_vm/obj/objobject/struct.PyInstance.html create mode 100644 rustpython_vm/obj/objobject/type.PyInstanceRef.html create mode 100644 rustpython_vm/obj/objproperty/PropertyBuilder.t.html create mode 100644 rustpython_vm/obj/objproperty/PyProperty.t.html create mode 100644 rustpython_vm/obj/objproperty/PyPropertyRef.t.html create mode 100644 rustpython_vm/obj/objproperty/PyReadOnlyProperty.t.html create mode 100644 rustpython_vm/obj/objproperty/PyReadOnlyPropertyRef.t.html create mode 100644 rustpython_vm/obj/objproperty/struct.PropertyBuilder.html create mode 100644 rustpython_vm/obj/objproperty/struct.PyProperty.html create mode 100644 rustpython_vm/obj/objproperty/struct.PyReadOnlyProperty.html create mode 100644 rustpython_vm/obj/objproperty/type.PyPropertyRef.html create mode 100644 rustpython_vm/obj/objproperty/type.PyReadOnlyPropertyRef.html create mode 100644 rustpython_vm/obj/objrange/PyRange.t.html create mode 100644 rustpython_vm/obj/objrange/struct.PyRange.html create mode 100644 rustpython_vm/obj/objsequence/fn.get_elements_cell.html create mode 100644 rustpython_vm/obj/objsequence/get_elements_cell.v.html create mode 100644 rustpython_vm/obj/objset/PySet.t.html create mode 100644 rustpython_vm/obj/objset/PySetRef.t.html create mode 100644 rustpython_vm/obj/objset/struct.PySet.html create mode 100644 rustpython_vm/obj/objset/type.PySetRef.html create mode 100644 rustpython_vm/obj/objslice/PySlice.t.html create mode 100644 rustpython_vm/obj/objslice/struct.PySlice.html create mode 100644 rustpython_vm/obj/objstaticmethod/PyStaticMethod.t.html create mode 100644 rustpython_vm/obj/objstaticmethod/PyStaticMethodRef.t.html create mode 100644 rustpython_vm/obj/objstaticmethod/fn.init.html create mode 100644 rustpython_vm/obj/objstaticmethod/index.html create mode 100644 rustpython_vm/obj/objstaticmethod/init.v.html create mode 100644 rustpython_vm/obj/objstaticmethod/sidebar-items.js create mode 100644 rustpython_vm/obj/objstaticmethod/struct.PyStaticMethod.html create mode 100644 rustpython_vm/obj/objstaticmethod/type.PyStaticMethodRef.html create mode 100644 rustpython_vm/obj/objstr/PyString.t.html create mode 100644 rustpython_vm/obj/objstr/PyStringRef.t.html create mode 100644 rustpython_vm/obj/objstr/struct.PyString.html create mode 100644 rustpython_vm/obj/objstr/type.PyStringRef.html create mode 100644 rustpython_vm/obj/objsuper/PySuper.t.html create mode 100644 rustpython_vm/obj/objsuper/struct.PySuper.html create mode 100644 rustpython_vm/obj/objtuple/PyTuple.t.html create mode 100644 rustpython_vm/obj/objtuple/PyTupleRef.t.html create mode 100644 rustpython_vm/obj/objtuple/struct.PyTuple.html create mode 100644 rustpython_vm/obj/objtuple/type.PyTupleRef.html create mode 100644 rustpython_vm/obj/objtype/PyClass.t.html create mode 100644 rustpython_vm/obj/objtype/PyClassRef.t.html create mode 100644 rustpython_vm/obj/objtype/fn.type_new_class.html create mode 100644 rustpython_vm/obj/objtype/struct.PyClass.html create mode 100644 rustpython_vm/obj/objtype/type.PyClassRef.html create mode 100644 rustpython_vm/obj/objtype/type_new_class.v.html create mode 100644 rustpython_vm/obj/objweakref/PyWeak.t.html create mode 100644 rustpython_vm/obj/objweakref/PyWeakRef.t.html create mode 100644 rustpython_vm/obj/objweakref/fn.init.html create mode 100644 rustpython_vm/obj/objweakref/index.html create mode 100644 rustpython_vm/obj/objweakref/init.v.html create mode 100644 rustpython_vm/obj/objweakref/sidebar-items.js create mode 100644 rustpython_vm/obj/objweakref/struct.PyWeak.html create mode 100644 rustpython_vm/obj/objweakref/type.PyWeakRef.html create mode 100644 rustpython_vm/obj/objzip/PyZip.t.html create mode 100644 rustpython_vm/obj/objzip/struct.PyZip.html create mode 100644 rustpython_vm/py_class.m.html create mode 100644 rustpython_vm/py_module.m.html create mode 100644 rustpython_vm/pyobject/IntoPyObject.t.html create mode 100644 rustpython_vm/pyobject/PyEllipsis.t.html create mode 100644 rustpython_vm/pyobject/PyIterable.t.html create mode 100644 rustpython_vm/pyobject/PyIterator.t.html create mode 100644 rustpython_vm/pyobject/PyIteratorValue.t.html create mode 100644 rustpython_vm/pyobject/PyNotImplemented.t.html create mode 100644 rustpython_vm/pyobject/PyValue.t.html create mode 100644 rustpython_vm/pyobject/TryFromObject.t.html create mode 100644 rustpython_vm/pyobject/TryIntoRef.t.html create mode 100644 rustpython_vm/pyobject/struct.PyEllipsis.html create mode 100644 rustpython_vm/pyobject/struct.PyIterable.html create mode 100644 rustpython_vm/pyobject/struct.PyIterator.html create mode 100644 rustpython_vm/pyobject/struct.PyIteratorValue.html create mode 100644 rustpython_vm/pyobject/struct.PyNotImplemented.html create mode 100644 rustpython_vm/pyobject/struct.PyRef.html create mode 100644 rustpython_vm/pyobject/trait.IntoPyObject.html create mode 100644 rustpython_vm/pyobject/trait.PyObjectPayload.html create mode 100644 rustpython_vm/pyobject/trait.PyValue.html create mode 100644 rustpython_vm/pyobject/trait.TryFromObject.html create mode 100644 rustpython_vm/pyobject/trait.TryIntoRef.html create mode 100644 rustpython_vm/stdlib/io/fn.make_module.html create mode 100644 rustpython_vm/stdlib/io/make_module.v.html create mode 100644 rustpython_vm/stdlib/socket/Socket.t.html create mode 100644 rustpython_vm/stdlib/socket/fn.make_module.html create mode 100644 rustpython_vm/stdlib/socket/index.html create mode 100644 rustpython_vm/stdlib/socket/make_module.v.html create mode 100644 rustpython_vm/stdlib/socket/sidebar-items.js create mode 100644 rustpython_vm/stdlib/socket/struct.Socket.html create mode 100644 rustpython_wasm/browser_module/PyPromise.t.html create mode 100644 rustpython_wasm/browser_module/fn.get_promise_value.html create mode 100644 rustpython_wasm/browser_module/fn.import_promise_type.html create mode 100644 rustpython_wasm/browser_module/fn.make_module.html create mode 100644 rustpython_wasm/browser_module/fn.setup_browser_module.html create mode 100644 rustpython_wasm/browser_module/get_promise_value.v.html create mode 100644 rustpython_wasm/browser_module/import_promise_type.v.html create mode 100644 rustpython_wasm/browser_module/index.html create mode 100644 rustpython_wasm/browser_module/make_module.v.html create mode 100644 rustpython_wasm/browser_module/setup_browser_module.v.html create mode 100644 rustpython_wasm/browser_module/sidebar-items.js create mode 100644 rustpython_wasm/browser_module/struct.PyPromise.html create mode 100644 rustpython_wasm/convert/fn.py_err_to_js_err.html create mode 100644 rustpython_wasm/convert/py_err_to_js_err.v.html create mode 100644 rustpython_wasm/vm_class/HeldRcInner.t.html create mode 100644 rustpython_wasm/vm_class/trait.HeldRcInner.html create mode 100644 src/rustpython_derive/lib.rs.html create mode 100644 src/rustpython_parser/fstring.rs.html create mode 100644 src/rustpython_vm/function.rs.html create mode 100644 src/rustpython_vm/obj/objbuiltinfunc.rs.html create mode 100644 src/rustpython_vm/obj/objclassmethod.rs.html create mode 100644 src/rustpython_vm/obj/objellipsis.rs.html create mode 100644 src/rustpython_vm/obj/objmodule.rs.html create mode 100644 src/rustpython_vm/obj/objstaticmethod.rs.html create mode 100644 src/rustpython_vm/obj/objweakref.rs.html create mode 100644 src/rustpython_vm/stdlib/platform.rs.html create mode 100644 src/rustpython_vm/stdlib/socket.rs.html create mode 100644 src/rustpython_wasm/browser_module.rs.html diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index c69861a..af77776 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -12,21 +12,6 @@ included, and carry their own copyright notices and license terms: Licensed under the SIL Open Font License, Version 1.1. See FiraSans-LICENSE.txt. -* Heuristica (Heuristica-Italic.woff): - - Copyright 1989, 1991 Adobe Systems Incorporated. All rights reserved. - Utopia is either a registered trademark or trademark of Adobe Systems - Incorporated in the United States and/or other countries. Used under - license. - - Copyright 2006 Han The Thanh, Vntopia font family, http://vntex.sf.net - - Copyright (c) 2008-2012, Andrey V. Panov (panov@canopus.iacp.dvo.ru), - with Reserved Font Name Heuristica. - - Licensed under the SIL Open Font License, Version 1.1. - See Heuristica-LICENSE.txt. - * rustdoc.css, main.js, and playpen.js: Copyright 2015 The Rust Developers. @@ -47,7 +32,8 @@ included, and carry their own copyright notices and license terms: Licensed under the SIL Open Font License, Version 1.1. See SourceCodePro-LICENSE.txt. -* Source Serif Pro (SourceSerifPro-Regular.woff, SourceSerifPro-Bold.woff): +* Source Serif Pro (SourceSerifPro-Regular.ttf.woff, + SourceSerifPro-Bold.ttf.woff, SourceSerifPro-It.ttf.woff): Copyright 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of diff --git a/SourceSerifPro-Bold.ttf.woff b/SourceSerifPro-Bold.ttf.woff new file mode 100644 index 0000000000000000000000000000000000000000..e283dae58de6b38fd88280bc95fbb8ec99bab9a8 GIT binary patch literal 93380 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 z z96%^=zA`oisE4yI8LG#tWe{CvN^LNDPBdVI_CQ&?n%(PyT28vvr5S$V*Md$W%Mz=U{&u_peSTo?GzaHVVYe=oRPEtxdqPttq2Yj-@r0l$E|>EB@3y=+qGhL(t2yM3;{F&MqD zWlO-eVDeD*10?tQGDiOrUPVy#4*Dd#Ef9a^VQFcx(Us{j^mXz|v(@@f7+sl(ocmj= zQ>#&)CW(%8)A^43i^b|&t3}wRh@jdI1FO>FRqT_J&F%x6X;vr;8mL*sb&{FH67t>1%oulfvpFE#t>3UNMXoYWD(7{WNi`NLz4 z!DCRGCF>c>C9+FW<~;6Oz#b8l#G+F|Nkoni~kBPL9~= z`bpWR_F!ZtccR$X-DWn3ye`Bn|#uV>g+0><@;y|QgmY773eFFu}Hsp}4SZ#z`v&2n9}xp(wJecaa=?c&O$ zL9ff{@6&0krtBK$CmhcI-Wrwn4A*zfEou4{Zv?&0O4TV?Iys>fyR3E_Z!$2nRiZ>{ zD{yKzdTfuP6rZAc4wr?TK~Nnevc1| z7t#i3G_)6v8)hc*JNmsbdj)~SY1rnJk(T4;P($jP=6Ny;?d4^V%NvHar-l8BIAx;T zOD?UPp-Lrpx(e>EqgN`IG3SX=G@SgZYOkx$HKotV{Gign=y zm(Osi#rrU;RcDB0h9kGEI;pLt6Uq4JfBklmJTte#@I~%22(!K3TfQ3`@Xi+hH`6N$ zUrXF)&;NB!7j;SEI4iEJqaIvxPy1d4L-7N~0$)3h;g_lYQ+O0+C577%zE+@K&gb_( z4h!uC;RX(GL69StS7-CjYe8|D-H!K*qUYPr1Qf2Z9QlAZr6LZ1V@ku&&YaKue zA(Y_plPH=dux3FCO7U!UgfNfxmm}X z%bgQnep=K1Br;_G5t+TQ#r(uV$SD&o3OsU##Hn007M7t`#`8$}O|}E-`_ZHsI$yIA zkW8!fni?AuNwYTNlNJQai?mfX`^er;36{!W`Ep|036&S+9QD=Ld0)JytK)T- zqxhzcj4O7Vra~+;=oQf?FTV>w zpL?>IgT7-UNLw|R54o43A;l)IY39j><36%3fM@7&To67QH;r?ybNHR!+fi`gi~56I zz^gXoHv7fxz_Ey9hZlyM1TMj*09(~kcxF)bHvWAKuQ!o`O|0ZKJQnd8R82KkCS6v3 z4kj|TcrAr`U47HEwqvP&W8sXIh0kQ5rOfbQ%@7`gxAMpwY8rVfqYidwRbpKW2ODOL zeJN(+pG62QPpuDwH0RGQn}+FX8TOsqCQ%eDF)J9=yC)MnUg#2=O{D1SI8UvwyEH8R>!KQ6)pKWV!x=Kaa-{i{jx-!KsF|X zjkQj;3MjD1q2jIQG;iH{^nC)v&J zB-jzbByTSAf0Z!%&7EUSk&GwW(yn-uLC4DfN#IPnrMM0Na)<`02cPCH%j{|79 zS2Wx!QSu2P=yT|HlOIQSlX=0iaAZizBXOz2U!haX-X zc4O%u7#{A?FKTxV-`Uf;ZO2z?F`+Gb-t8Ke6Vm%-nopkxonMA`Plm9MHYLA^?tmhx zuzJN*uR>{|0}OfnY6D%&E##SnabUUNR`LhfCD|g)q1(wx=HH@zne+;JfE;H&Pklr> zj_&5;2Q>vorLWWZv@%cfZUxWqNsZLm*+>YimNfkRC^><@pBH{#CC}r$^RgG~)8sie zk2k1qmd>C%bthod!#nzR`xj>fBcT=++j_+(Lve8)(9uJHB?8~2BPfJa>SX{i&QZ>7 z)w6$o*-f*5yIP0FoedpIvNvRF02gfdT@3tveaV)gXf8nmfAl|Yn>BY#)AX&tO19s- z`F?-eSa0ppvi@q9XyTX<4Tg*DAc zwX$=i3y&2)r}eZedYrsOo!3hmdK9FEbJtX_l9y}FzSGa==R|f9oH=wmnG^ghx)0qvzDnq|iU3P?{yqKH z%CK+pMSuCho@sWHN;*+edPXbCC6oVn*=20%L}F>;N2DJv%81CH87+nx z{xzT2vp8fd{V*O14Jl*)=$n6jao$+d==Kyny)5NO5C25`17Ti$$K-MHy6)Orbbi;! zd(Z>qx5+(q#!<<)2w^@BR|%daXPC2`GyCNB@~c>(u3Mq6=F%Lx9ZG_~f*ydf;K$M3 zqRSri5DW+&K##x>G4j}obRoQ z#(N!H)UCHbR&W=38ajpTo~`$#*u+0H1%N=8}dU1)Jb!(f_Nq_kfeEC?3bB`%TU{ z=bUrc+1;7VIq%->?e68AkAu5|%fKBuC&>yb22jBq02LL)98uuwR|ORnzk*~FH~X*G z^XBc_+dDu%|KGvx&a3HHU0q#WU0qe(twFpxeBMQ8(6ew4?-gESH>4c&xQCZmv_r=f zWKvv0B_r9fa)v!S^5#8#J?B)_PKDgAy~cLPSoBzv%LDJXUOc$G??5?_h=v34sH*AQ z<)gdHLXj(L=q#1BZgpN6vJ93g?Vs4PO_Po0!_y0`>Wz7gmw_ z!i)A0=@#!A(lB8R##RH@ug7VzWjYp6g97c^j=EUtR@nS@jloWQ z3nM{kihO~t!XB?wC>Obww=mmuc{Ft(U!Ml*THk43aNX3=EHQ%KeYfyu^DFSS?O+)> z%)0(k_b|HS9d-|2du?~^&s;l+vzwUkkrD!>gJG#}3S@FGyeeJLB*5LO#9?ryr4+0Nn-<=2VI%58-E>6DNpsM}h-P-1@cba?#Sio7+xRk`isxE-rcG&4RHj&b#27T2 zgC-OG+qkT{tE+2QwYsaLV;5@KdoYhQR>A7kDzMFb_ZrZp1rXE_i4ZyGe z!56bTy*YzLBiis!B_HjtopTs%z=I{}b+tcvI=%K(%I@j%paBVO8KvRpX2cT8|3>h z3+v_oih1PuD?(aA)PPS3Jd#39w6cZ)E~+ys1WhTiykd&fU*^ zFfL2acrt+&y#Y9wnen6pEm{N3Mnh2Zzhfofq|UGT-;p9PGZJfY_6N7L14pB=X85?N z4cJO7AVM|RlU};#oVea|N$m3~@##JHRhizdHhFdMN29juWy9?|+v)#z!T+drdUwSX zKXl%T-7O|#>+aV(Za8%4#*U5~4;{LpgYG{I{5phBoVov;Z$SU8s@=ODt;R!i|GnVt z^XXG5gRj?%2F3LIA^7!IpfpHp7Z@j1%*~DnhN`$>qX9tVF~odb&UBl*loBe03Q-*5 z2ol`BtvawWp4~B}kDJicthdvZ9v@3Ix1+wi$EYg}1(Tzh^xT@V(y2MZt9w7tOHgMX zXa>e`DuPT!-#M#ln?G~eWtXi)@2{O-gLasq9k1c@X)8CdgjV+G zmyph5@Q7$Qdad_@;dQ$NV!s~N(qf5LR_bXlTM`z#0qv=MPm;>+yX3L%)ydgmlQEd; zrtn~U&wx;%N9iNSC7WrDV6BfX(1$_p=`uu_F(i8+jq}8;kg%?938=y(NJJytlBGAs(soGYd?jan05Ug=zyzaF?C0gWVv`eZyay_%-CPKlhD)kusEIJ-t#hHezr6~b-kMuCCR z3E3G>GT5xugJQ_dx|6}OMo()8jZ67tQ`HO#LJgnFtwcuzV@=N9;FbuWJWRa6l`pcZ8&w>{DRcmPoCV~yR%Z+Dbf2)MxO!JXePfN8?U_bsw*ppSFJo; zsl7bAJ`h+xJG;*BUq_GZW-^;-i8czHW_pPRkyuTk!?krM&_47`v+UXjJY8N}DrNI_ zd7f5)ZU++4TiA$&=t&a~o+I-YqqoWPcT{99nZE&3SP9SHMf9@+zW+NG!t?h8@Jz3GZ{OQ@#-oB@& z`<#xBb2Rm7w>|}9W6R++s}Hxd9A3TVa7*o_*>wRw&7(ko@W=-2l&e z=mAW6;Pd3!4Bx*-IQ#|jY-MNvFA~3rA9~;qSNEx#_dF+;YoGbboCJlJM9$^Tz*n&J-&})xOR)bC5e{KH0l2&CZ#lU4z2{p&qp! zxk|FVF=y8By+EaxnKS7c^m=y6WM)ie!bC<-bXp(L<&mmwN87$DtNZR*FMQQ)?Fp@1 z9T=RrS)&JezIy-12R3AGxnk_<-QD7B>yNFL-RvxR% zcklSbUVT1z{sy%sF?^rf*&eFOyn9m2{N0ko*ip4-6PfjqI zFY;c7vU=cbgO(6ytIEr5YtzbXht}t^WP=93Rw8Wb-qE9qT6@DQ$vh7;EZrz%lwp1Ew1*~mIf&PL; z=sBQb^z?dk%)Ct_){);O5+(%TgN=G(1)YV|lf!p6Dmt}1lWbI!%mCItzXRV|CWQ-y&*fTTW);R|xh5DHwi*RD76U`^6@4+bY3PTA zcCA9B)Z6`ex6LWlh;%x+$|w%lO9n~2eGuB(JU@yKV+3ub&(K)S!vJ{|APiNA(^iU5 zLK;h$OUzyqX}Bm!Awz?#d~?jKMoY=U_ciFM<=&Ytkhn0qn)f(r~@qg!sorjDJCpfcrhX##q0R3i=0IOvGYWB7T3L%(DoJjUQK zY8V{*mf!&TfDQy+HK6a0guXvAry~GvbSoXTLw_RhKQ-X<+jx)h?!h7&e(Gy=2)dO( zUZf%PEX8x85c(B;l16|88BB=(m%sS#ywmx$j<5M2exyEgI#Iq}Mn~sjmqLT22>KOW z=8=c#x&RMG=vP1k+1CNT>mxA)a3z7iMBp#caJrv(KSePVqjLpIpmD>9`sv&p1Am*9x<=r=1)AakEFzjhKu($dDvF@*(6eC4%ke!4 zKjLroj~0ug{?@O0D&b0hKm794eIOr&cmWS^Ku$vK7qk~_^Pw`aDd>|rtN+unY%5TbZhLdtmg?20`%>2CW_!1U zDztTmI;tK=7;1My?U8!z$RKRg=%X7!C}Ah#0%=c{p~Q$HZBe^z>-gg8$G6(-QIw(U z_f!|^Z?>lT)SBLut-Mfw#p?(YS?@z3%*R5I@(7XfK9ncVFOg^X9wYMna^rifB+q{% z&tb$zF|-DrU*YAL=hw;etBq&MMV?eU3c8O`e_b93juAz?X$*2Si@;}2_VzO~@j{LbN9l${Y@S3ZME(*}l+1chTP<>l z#2(73wa)G?k1gf58(dzUTxJMbjkb8i>h9}sYYbVhU81+(=iDYWs9CMuXtBCY7#aLg zlg8CrbUG_}x7w0$8j!_fwb;yBSGU#V1{!_yx1m?@kI0&tOCw7gb7r}ZOghC9Ln=!m z{SissVXe%PHYQC0_-9I((ngb5Zq$S|Cb`&XOg6rtKS*^E{3D;woHL}&GHux9io&bO zu9CyQ_L^rU zO%jPopMsA}TT(RrZdXJnHE~;5FZZr(Hit_QqcK{Hm}MHk64px1DPzv$_xb#$ydhjxgs;U2&(*A` z_0Y<-=a=a7*sHgX-aRsW*BH7T#;Ox`w|<|weV}9M%3eet1j4z4K#*mwTUmOy2h_i6 zeK8a@~MTxa%lLc5gVM(9I}@+j z#UT=WSrqY@w)T{udXvPA{EHP~{ z8n^hvCYRMn@mGn(1~uko`a_}qOtvo=?8~;TOs7}2RcVgP^%yI49$OdI>+v1fU^6Kl z0=`-AytB)o@X%u{jJD(75Gkaye{-f1h#*6v$j6?&DJXdizEFd9p9rl!G|+yb(|NCZ z(lLRe2ji5d_I-q`NnzOcac@|NZ~W*--PG?Wx0|~E2Ty)b=ynT#OEt~RG`&EBULZbW zKUxcUSa(9r9q&-Hh~~>XoZrf3aH8O${*L2>B>NoXZnIRR7X5_N27QSAi(o1B?PWOhoR%9G$O^Y=t);g@sk(*CUU%5UvblL3quqwWxwEO+bs^{OoQzLHP$ zldIKNUuj;oOTBWJdBS`({LE}uuh?pyG+$*#@*TCS?%BO#_r35B{@ioVJ;YOvZbnm7 z?7ev+FH@S8Dzj2)R>6mSxHlH-4TpQ9(O$f!XV7LJ=;+XgR>t?cWai^b-8`&P#2 zd9?%Gjk=)@De*)ySG$M??w1VIPL1|b{E(>jaSbfpkXb_8%20Y3N;{x*;dH<6f^m~G z#FobsJ||zu7xNt|yAsWIbykK(!{0@BmnWlLF@F$6y#`w$-xg0yMJ_Y;In& zdpCNs<@G=I&(8MW#8AJC@{l_MPMdCXb$=hMHECHOP_!&Dl5X$C0<%JIq6BhQR(QcNcqKO?G$dKDf2*0E2%h8<^;+ZMgd<+`i3P_ zU)Iz0d|PjEnrueodN9%*8Jz1qKE)rNmbwbX4)mEwIvzJocW;ijI%h`PcJ&C|+UbI` z3T;V4+sB|SBEYZn5g+2z7oI_`Ti2owp~!Tm_DMSG9RWJVsTeu!K2GG5<3cQP^BFn)&eW(k|+^X7?%1z^kGT&gz6mlAR#t+|dM<11R zpL)}+MCA6DGGx>~goQlW;+q5ZTfANi{GgjXCNtQnCJ$|IBOfVCd_1RlJ59!iBCSq| zBP=)QH6Dx2AVZHuJ0cRhGH8^`>`IGIYojHV)JJyVnHJY5T3S2%gLiw(X0O+5_WTb^ z4$zatcHUEXnn#iL8Im8xu&k}a(Xs~IV@RSP{RQ&|)^or4Bl(7$+7(Ar;8_!42Y8O| z07%Dt0d*6IlYxW*GE5*Y0-@iEpa}wTGY}h;nc+PO5D%x!GTy@g@iGt(Kvwde0Emx) zq~WbGQpV3fB2Z?WU=A=42SBC?B*;LTYCi@~_3Ho$H7Eqga|9A*AhWgqg&ih;0!XA$ z1|Z)ckSGHw&&PQW&EEr%7z6Ru9%UeLwiSOzQ|S6Se`=eUsAxBVI2lM7Aj1UWA`tqm zH_!xuxEY8I%FLk4Y5s7^EJK&l{9zy-fUHC}5dIJd$>td&W&8{z0%gVt<^Th60A!j# zf()c-{!Z|TeU0#kp%5U?5lEPU%+7y|_bU1<;SW;=Am1R6C<7_a|DE>`ZwJjE2I8B) zoPop}t>C?crtqb8{>;x2{=9{{3B<`j!T=d25EldS^8SJ*2*k}mY*1zfAEWuhDYFb8 zq4~o=JOEjVFQfUxK+^Em7%AgtAQ31tPA~@;hyx(g1QKK*O%U6B1%ICKhoKN4&k;zN zfy~0b(^v7w34fR}0Qm-iL>WjK_DDU1*3tZ7AU@tP1`=l=MsyR}1ioD%K33l=4bR)i z^VRiJykUNMn5yzrM7uDTb^4ggIzzdTq1`r2}GZ}cH=oTwN&l?xyh*+9wJzd0TvTbN=}Z| zFh`@4<08pl)LRnNK9tFz2|-DIZl4&uPyNTRWH*gS;NR1KW9EwVy*vije!vCvAPxf3 zPXsNh$PWyPgF(qa>u&(xasmDcynS8qE}@S>#_;Ydz&m$cYl{qAU(3QRZ{!4@SHA1( znBH>y=w45koyzItW_f9Jq$E-Z@vz@7xH)iO$L0%E%FW9J{F$}u<`BA$q4JMZmAw-| z!z{p9I_Wxd1!VehI{oA1RjHq((?3aFMOgu1?I8gWde>coI=KM3{`xvb-pf>#%#jNi zHP)vxnWwUx7tsV%IsbhW=lz|opDBIjODjY6U*%M4{ZQN%ks+r+V^_(gLW~Kvr@QCe zp#<1YcAZ|O%mh-OILWl@2aR^YB5zT9N}5(K3qxmUDVnW*su4Y?u zGkP3aBBJMP9Yc3uL0`Hs>wO8bjr^s}oC(xk{pIMgY)2t1QshlmQ#2!#3+zrq?x_rA zzCGm}!v3a=t3@WtCp(2cA>{~nyWO|fMUTkZ^=LV?I0CgUzGdd@P734w{(#-#DOG0& z2Xlf}1q_R@%i(P;t)BFbIQSKX%7wn@F2j|elDI5phf3=z=kk4O?YeP+ z5bD-I@7+OW7+BR3703vdPo$yHNnDf9LgNw`@N!C4PNkqkY8DU6JJGDm)s$c%whC!^q zKC^aD{MqEdNc@`g_O0<};_Y2DX8tW-qx<*RalX&TzxT6rW6#-3Qww-MKt?lzmvL0F z2n|470a;}ciVTtD$+piy}DT}+?tq^j(ljO-mT!+8Pf`{_-Zg0S|< zpIic6=Bj;Y@&YGXLrXVfYw#i@Yg^xN95q}_XFE<##5pz&CDamyM(($_D9m9`D4QFW zIn-tkUnbyVyEY)CMtiHJhplRvUL(_q3h0+6rQBl3nr-p0J7?sJ_{O*!c^p=EIMdW| zp2aMeZ>2<(fu>H5ZbTPRdwF_t+qE|&3Ki%%pQAb2+^lga`#?#~Jd=Fph(b*|JUxdHj($QQo=+u+Jp+aFOTnxEwE)OC% zJwOc?LR+LfcOy5aKvvlyK)m>jH5hEiqA)H^7I*ZdFjOv$M!N#mpgMhpEP$I@i@I;< zO3#O)Q_qy> zHzLuP$YHRQ?6$ZNnGJ5MP=MW3e;<0-=@kDdD9ASJOgg<;V~&ailz%Sv2ii9xM*@xa%MzhCLeJ~WiL`E4M zp#JS9qoZ~oAbUz^jS6d!{DJ4cz?^hxW!N*vJIF)_z`$9`pRC}?l(`wY()CRL!FT{MqFpuHS<-i|v-CMd~iTM_6 zH2Gz+b5eI#+SkS}9JBi$3?->a5bs~@5;`2B*3U?scUV?3%pn*FU-q*8R~AR$A?D2$ zoYJ%{whZJdyQF_$Cf6^1W*!<>>47PVewa-KKjGIJ)h;#iJrL3u)LxbMlcB^hnIKc{ z)!Fm-xu%v+h@rlFLv|INEJ`}`-hfl3_>QR23E8Grua%(&T@TcpRa%(Ji%1sF1wIwj z7(rU<)!Fh~aj|odyDU81STRBmTiDUVxplRnaK7e&e{T3cHIiIAG`uD`g1^?$-P7LQ z(+y6;!TiX|Rl~WVa9tA%(1ipe?V)8jL?aaujyJf}xDeNXi~*O*DmUAmq2aGYlE-Ai zXt^*FZVzU?xD1L{@>N6WS*KHicF4qi$dO4 z1nWgvBRh=sg+nLEoRG*^g#~X|qjaTJ6D)nE?Pjtp}zGL{Q?|H2{ z<<|ukm8kZT$SG=SDYSn~U{mnW{M+buv<^Q->^H^=V=S8AUL4tzIuv*$-dV+8f{|VO zGct=D4#}q;;?>{78hCHPdJBozSD8QPmSd4EiOG?~4&OtOrfT$q!ImZl)sKIStOAEa z@W2D~@B2Sa=c7QMZw8EHrFnMC?e_*ts$WmVoX|*Lw_>(RfuQP$c43E zbhX=zYL!GKv}aL*=EIl1(vZ{?U|(|Up9LvDwq2Klwti}pE{mVC)aFNbSrG20cvRg6 zpspe39mU{H5k~~y#Ul8vvBj%5sx($TbynMel4(;`yF#V42CqGNpH;vcA8^I#n0(gfOuSZ3BZZ;>GIXEpRb#arI;5Rpc zDH!}@YdF%}90|9M>eX&%%&Il})tXdWHKkSiOCxzP8jmw()0%u5O{P-GXw-hQ z2EK8t^{6}D+?-A|H>cc9Mor@lzaPq5b#!@SliOV~E&0Z;hHvOz%gtYl{smer#VgWz z5~c#@tOMFQ4H7y*rs0WAmkAki^@bTrpzsW2qm2pH2CuK&grshr!y}T*EK1SLnk}oV z!>a{+uhx&>jfR>3=N#qDVkX!9B;`4 zG6kx3k{__UG8HkB_pR2Tb5(13h@7GP3cd{fk{vz7XIjW{mJX*S7J*h4>P7U{l4L4} z&{T)QQQ6$Qe5*j@Hrm4y8DB)@nl-}vKZ1~W01d3RPejEEVcAj5HjjlTAoh!<3;2f+Pb6b z@s@)JuDa?fgyw1wu0&Ti_m=-D%;&{_{Jkunm%m=_ZPo-#l0rdZ3TViUr?+Ddv^Pt% z-WiS|5R$n4(la!xxKui4v)F5O^!bXNQslB2J#w{Ls*noyoF^80e2!jUsY3>ElSc+{ znM@>*ps8}-oWpC4d2N1!Go~=wM%&AK_8bp-Em5!C2Oy=v)H>IGoa`mO7VF6=6s^2& zkY6VIlb#BTS(*s=ut;>NY>A~_B=SM|5Rng^P^g1~^b+c$s^QtTJ-zazOdu6VG-6p& zUhYAZTVn`_gp>ex>(ml)1hf=|*N!NXa)nKyXg2DK$;^bzs_0hQ75fgm@7S^Wx|OQ+ zD-lAgHYvNJ7K1&VK9(F89;_BNSvAzghzm?J+Rc>rSE$aVRn-QXtZg^(`< zKPLFO7W;jxUz{9 zM`}=O^kR4Xq|i~a^{&iLCe2C9cfQm6Ejcchl9J|T`?61`Mr zk~WWS&J0xSCRaXz(2IC_N6Jb8vfx4BYOO^pFNsc83=Tf|Li?MF(_3_NX-D+ z&MO_|@%XIFCSioP@p?H@YXnx*c_QSBZw1q`+qg=FNU(uW19A-d7^sH7AjoTW87oPI zP^!(iYr}#tPfeoxeQCwkgXn_u5je%rHXBHEC0iCLL}InLoM~T>>wu!Ha;VA*tD^RM zx4rdNh$yKYO0oJDh}AXGF)GlwkULFI&mz+J$&-GXS&|s~vB46q`UX0jNn?4a?8{`b zR5b`m812J-J-Il5Y$;1Hfzw$B5A!O(Ek1B7Smzhf->2JCV5nq^b!tsCryAypckA)i zZ5`FVSuAjB%wdT{q!3F~B8fO`j41HRz8jN)aBSaJ<-K=qzH(H$W{w&xo6XKl8fKZN z5Q6&Cr2)Yv^tr<)^w^|3OlRcGzlMGRau*>vWA%B(2Rxxi9x+n50S+d@(NyYa5q{+> z%I%%#?h^(xe_}$^($zPAMgb z8jKEp&ry{`G(H*cj8DcoW7Sn5aiJi#w>a86+b7#P+nx*tBPxs3?=Y!)&gjc-r*w-&U3!aR3nm#h-$2AkEKHSl`W(3WnSs3lfHK`0pC_T<&)3I!7P4ehV=g5gG z-O$>FtC%PtjG+s0Hv$!M0L{{W*l-*91FL7D*XM&jZv%0ve5IwNr2od#wHLcF?*2d} zERgZ5gB3?_b=#!9r>!bA$yHU9?mg7pQ|f3%>dL-ETRvAh^;k~Qa;Rdj9IA+O+qZAu zs~jyko8ofCbhEEJuQ;|J?b`>I=h*ynsDf{%HKr(pOea$4>nXPz-|U{BZ+wS^_%l4- z(q~?A{yC}u&msI7w4dG!iXA-t{2Wh&9q4zpP4yD|JD@}m!`^oqPW2La72Y&4Z(c#( zbk3h5Z+g(zNr?=U$TB6)VM@G0O1RJ;Nr~?HXDKhfhLpH^{-037&GRxizDG(V0Y`BW zeUP_KO1RMrq(lNr^fD!`Bqdxt0aM~lmW~)xV(%h40_azyL>fv|m=a*f5jvDiiI*C5 zuq6(Y5?-EsQHePy5nxIzBPIO2C{yAWwN3QCEM7mRaGA~nsGEcJ1km3-{`jgVp6LJa z%=f-G^J5-e4w*28&Y}C0-foSlnhm{xOf&VphO@91jng;+A$qG}$wW3KKK#G~ZRG#< z2OgNEe>0CD*-&pM)Z0yR=4|jD*SpR6Y=XLw+7*kr+|j6;`TKLa?#{5&8HqTZVYEL| z{}j1rroLjN-ai52R0wwgX+L{}m_T>Qj zz|0IPeQV;DTgJb+@Jo9ycR2l^*^nD$E|#z9oSf0la!B?|kTD!rXQg8Z!kM~lx(KM98M zP?NI-U2NBeOX7|(uftA0Z5Vfu+^hrWpEv~n{Rp(fF`f|q(kB4ec{gB$ZsQ3^-lN7> zu%j1NqPCgZKOX|_cz8$fn^;2RE5rI+2`K@frf~p*NzXY>e9>v*Yg*I37H_CO5=fz! zysh5QKscDH98OF%_ihe{mS;OxB$k!?Hid)JnXVP6DW0)=OO<#({W}?sr`NQsDRpJ5 zr7bh`hg@5U?5GRDY^ukX@Z{|2nP5~jwhJ_z_)%V<~GU{vT(u#Y$Z(oN_PS+mAzoyIT=P$)^d?PL8rh<;D=XdES54Z*NPyH10#ADXqeDGD& zY#kRLS&rOjOXlH=YcJFuz4%S~Z5O=#G`t<7wc6tQ)E65Gi(xzQApY_If`0?GCwejd zA^owp_V^%vOAbpu&+r7+%`_-fE_f(HpE63aDKO*ua^l^b$OwWNGkyw;1uEaVb zXzb}jjP1*gmEVX&y&0!jWj87IX4VBYex0@3=IT4QZDhs%t;UXEpz5%ii~VR@q|dST zqfHGB(CLp(s9EHs)K zj-=tHdfhpY0q(vkgU3sA<@4yvLTPkQwS8}t5{M(`ws)T&&1Y_&9=LdYskHv$fx(N` zmri|?FF>QhFUzIzY$3sy3qLRXU9woowf5&%9q#Qtyed!s74yF=l#o^1{O|GQc$S_i zkVzB()et?-&FElPE;5 zz)Lt*djN^|4efhDk+UYzzjN{z_6_etVt{@k!6W;npU0QtRpdQUhz=lu-a|QjssCT* z9p--l_I70RzgWBP!yiVgUi2fnu5PHSqh43QM^VsK0a}maP)_jzR7J2qkgUM+>>p6s z3-X*bvA9)&P)PuC4S$dU^>MJbJN*B)>@fe^SNmfJkJJ=`n*8;7HxPg+Q%5W2?F2Q` zs7`1Te6IZyEw4={7qy8*QE3MSRWc!;ifK~qg?8li{khJ{Kl^H5=Mnye@OZr@r~zIR z2?Q{c?XEYe_75}-$kBZ56G#Nl&?Z|F-YS8*x&zP9^L{*PFL4AHLb5!H#9YEc&eI7x3#4+)#mtc2FftMo7T5h)-^S)tF*2sJIZqN4^lVd ze*i5Kpx&eLP@0lQBf1=KIQ4;LpTJ)@2u+#BKRtA6^~ZP!=+xqAtf1$S63QWwM~1XP zq|=@HRR;ZU&F=z?oHF7@DMT$4M7ocn!Fp-5zxG?2OTF`d!reGYW+!AoAzdDl zleL!vwO2IQ$HSa5;zlVHUQi4Xo z+BL|@7Dn2Sp%HkaH2*97B0g5%L0%#~;n7@=@u}Jj{%j2XK8QbbY7K3*k&@IUIEcxa z6Zmhui+C%5uIl_h@fIpUB9kS0^R5;m16U*q2CFNB?bgU8%ZJw7oE;C%qN!@@k+%C$ z{|5t))Q)^dH2qn4+sx=<7t~JjQ8YQg!E8xk_6CRQ_b!`P4Mre4I+bZE`J7(8)2{RA zR!(Pz#|k|%>`nFsA}eyqm0^86;>(%THg)Ys>(5D$%*^>ma4-I8UD^;u>1d9l9D4er zANv?G)J_F!HH3qx2Ptc>)!snz+WF`zbPdh(9J++}GyE)x8tMRPK$gEa*HVab5IE9# zf*zB|AVb%pqD&TW+g7z`vNqsU4xL1wq)$A-uhE=>-~R(p#53Xu?@mfdut8f5#JvoE zg2tXUm)GlR>w)8GD!Gu^6vV?RDOz^Iyk8$~j2)x zVh=hGzX}iu?>ht%#09hi&jZB5KrFZg9l_54M8^9bfl#;&U5kGT5FK3xsEXhrv=!gi z*!>bgRXj91TgO)fe9uE!6@zb#P@x2ffr0ek5IRoj0Ak{Oo?(3(160@)_W~_F9Z%#dfaa+=DiMw)fhH<{3`n0k3zk-l6sfCJ7;gQnLQe_%jgS@ z2JvrfMT<$}(kp#xtye?8JB>ZO2k@(8?L@Emawa&d(|=X_RoJt2tLGt-8_{^iU4x6xh#+`{_|euifuG>}Gfaw8a1%1>gtKJ#w7sS;#glttFoyjGQ zLKVh{TIJRoT~hp$&H=z`bT_cNZ8X;Pc!+mTUD7C!w0jsygKyTt82%uYZG7`V)QO+1 zf3pS`c^|^h6CRhii=yC%GU{S1UQ%W#Pj_><$Af>S3gq&BmA5~e?T0s4;&1Uj0&Q6O z=0}p6=6JkWlN5!zbGhyiHK+xsSL?3?gB5u56S$eT94LbMUc;Gtec7xJesD8H&Jzir zH^C!ipWrR0Hl3~P6A7O$9{2g6ES_({ZLq)Vr%QLac{raBI#Vg9E19glN`G)C61Xko z^@g}VG_Gd+UEa5;sX8w1dOyece9WFm*q!nCub991y8*X5!2JPCm%|7+L@Dc-G~B!a z4km}w>9D(8_H18Y7Jl$5TCdd=VW9w?uu>~vx&wcex0O1{VB)+T;$V%nw#MimI)@H^ z@K+1TL@}RA7Lrbr$>A`WoPg;@9O8YC(h;v6k7|r8k*Kur@tlMrU;>peyFH`y8%$>3 zN?f@v;xe18@e3^1h8-5YGkSpL)KM6vk5U%{ETajwa?ztObQNxNuFW#-WoQ&-Lp=QjJ34 zH{1PUrGsdlc^B^pk59KoM2C3UtaxTc9#H0mg;ZC!IiQg#tqPlEc6CXba0YWCVUo`` zXkvilV!*MVC!swRbQVYMv@38gY%fNf){t9ck*iF7!9w#zscxe>&fZ}Q7@mMuw9J2< zj95@!Ey5kb+Uq~~0r(=<%xicbntznc8oalE1&|ilN%+M4*8rje$V&kE1k}HrKr{e( z0q{MH-`KOTi(nM}#wBwrUw!W(}BFW|lST%MkNgXKFhp5=mgUafIk6eg*dN{^x=F@e{r zve=8Hiklpb_N2-nUVj>8EXr1s^h@F z-9Y_iN596YHraG8wl+%1XoJZQA-oC}cF7gH2uQ7|6S{Y$4BR5g)(Zz`WC?w;MH1O~1q60I@B*MeS7R z+#3CCsM2T|EtNRNdxE}w38eC`Jkp!II{{v&;^zPdIRUs5et(cHzn>{Dq^y91Db2@h zX)FA`mWN^Pb|MuO=aGHU6g|I-Lfr0wS-cx2^SgXjO;D@z*c{mDyZv_GaMYua#0_BH!SzL?D~jW@9=o=L;l;qHc$r>L5tm_4*>DF_6Bx>9Rc2Df`!9LQ61w` zcDqNX32Cf8T*rq$tqy9eHfN;h-%Y5ZvHXU%MhGn$)@BKWSY&tJNrax&>|NKr4d!3RUs70j5<=!C!wC-zqfks zazH(fyUt$EC;i8c`FoEPS`>6W%3`ZRB&gT35~slKIT!368<~ZJp#|%Qs~>VbK@l;8 zTGUBVuzQo!7PV--{(K6j0u?`)Cjr_b3f$P;6}4N9sYrx}8Jp@9;I^It_t{Wy>2?P6 z9<6m3{#LN!XKk&!_oQuFwMRF~TTJy5dyPBzKf=MAhkDM>`yt0J3bKm7z|tJ3v_?`! zt3BG)ZGSha*_2TeOLen`#*Y2FtXi)w;5?0LC$*4pT^PZ_EY!|3<%UWU;RgLZxw zfzvhqlfZZLgftxJ7=zNEq1FQ(;iYt(O%hJy_PLQNz+FW{F|+PdI)2@viRin)eAfF z`SYt1+J$^RthSF;pbkIaTY+z?ds}h^@ZA{#9?Jjn*5B0hsCdg1Zaejjsom(-1})8m z7GdLdZ|ow^HkQ_3lV@lJ(CdYBw(e%KZBumA&L{HGDPZ*3OYd^x7P?ckO_a^TuiT!d zPN%c8snq3kc9p8<&F1rS=T)lb&gJv7=e-z>J{gNW`OV>zQ&T5~hfhpRog8kCtvE3= zePTsCHhpr%3iw;63~eNoNm)uiN1o+`s{(kw9=M={hn$YElG%-m99w_dT>I*ZtFE1R zW&q!G>H%RfD?|6y)+)0_dHsGlYAwN}B$(~)Td_Uj#1jJ;6$2nCOi&`w2ud99a@B(pu8xZu zK?#Ph%Sh`rjXPMe5vZw05lc*f#Uz5(Vr5P7%`c;8#bdVrx#KaUv5qf$5qWaoxZ)o# zoM2>Y3&CU{e5I$eJ>=O+_?nzQh5rvS+I+k;$@8I`sTUgRXY}cfY{~?aQUfifptX6@ z_<~R<(CeAqv+C3O55Z&#>rUIwi9GFg#Z5-7nqA$SW^kWi_iuneszG-|w z0*y{YaWm33BNR;-ghI){c$3~@ijm;sixyxn$v0skRipK>;Roa+Rw?E z@tB}Wq0X)~29+YaU4|q2k0G>6-rOwTh0r7VDbcByK~oQ*n&|Y(d-j+2w~RhL+Hoif@2~F)wX)O4p$lMpM-3Mt>u8hu?*6!`bM29GKNPgb*#b`=Sg0Xmj=n@|2(6>RV)gVjxGf;EdS#dgMj%q|R7gKf0Ud`qz zc6%k4t=g|)=BX+(Z=Fu#3Yf1Na~BdfCalH;#_)-95k5uEAai7o5ho>$VsiXX6E*9P z2X3QtNv6?9n}B8K?K_>0M~X#x?T5pg5)x2zk-2s>C4>*B{>^G$!mVeBg*Hzpy00#A z)aexcCt3ju_=L)Uf~FF^?>#Ar(@Fo{d(|13zCj%Kq1Sl|=7croAjKtDdzMVJQLvpI++)a~Ww(%TRI z4qbA?4YNam!4{Qt!*ugpHj#PF#X}(XRrD6{BV6AZL2O&%Yb(;>E7KyUTb&e>=n;pt zXwX}2Duq&44!biEz1yk_s5OdcKyQ%?sO)e^di|$w-~Ik_F~avbf(RKpy0+XEUX^Vw znPNq`Ty4=eU4C81=UhyWpi{sHKQB#UXKan^&T;nSUBUtS*gN*zJ7;1npYPo^Gq7KS zeBMZ)Cmb4YtBwcDJBEgLm2Y)qoPkJlYxiGEtGiYH-e^-P6}R|(oycIZw1z{&D_gtw z^>m!Ow_|%{U}*GkG{{5bHl^>O*BNREG2DHitP9Yn;1B2e~$&U8zJ38kSKD*Iv zs_1RmvO+78>Lis+CK>4r_ySwUORJmCkGIJc{ju^$$Y*n@U>W7Mx)TU(z#fOyZ?i{Q zO0E{#b_&jC(3kMjv`u9SRq?{+(UPDbFp*(qV*2GH;+|obD?T_daM=~L8rmc6-P;k* zrQ3?FhkiUN(A!mdi&UeTY@K@Q2GymK;bnJSl8K}ga&>Piv8+JXB?Wm@L%Y2YaRqyW zmIIwA#O!_cg*XXIMw3p2wiyLDWKYEfw`%lilRzy{>WYC>No1K!d8-j5y6rQ+d$SrU z)*eu3e!I)(L|&&mT`1+8qy0696O;zw^IxFf6+9!)4Rv}ssVYK>)*-oIkjg@S|Nv z+?CreY@+iYpq?`N8}TDU2T~=PZ_IM;o6Sv>YWQAfxk z^mQ_O6+Gw-UXjOZ!}YxI5Fyh*Vp)toMznC=Onp`$H**5K+k|w4J)xm&$v5C~mz{ch zYoSYFl~*SNDx*{(az$-gUnuF68fBP|FQdMDG0m^GO5eKDT8qsl;CtM`5MQ9MD>sev z`A&1%rOj_$uJP#-t9=SOUJ4X0$IsAG5(rVDkd7V2beHMqYswlf0<=4M@kgXJk-RD1 z8g{7%lldOYAyqI2%32|Ggst{;=;lXiAD76{8^);Jo=UZJ4cD%VC)6URIpwnT@(|Hm z{U9eH(r0A5B6w(Ygs%(>>O5{-nv0$ZWhKG>gu{A`)?vP0%@^>IGH5g>G_vc}z}>V@7oIqnFXg+7;$M>N*o(cc-36sfifvA-z;3Qdzpa?m}Fxf|Wu@tyM+c78__RcdqJ`^j+9KQK7Im==Loitn6$G zugPb7tnsu=p|a{@TlVbALhXJSk>7{dR32)FN;xC4zR^Kc5Y#X3D`m3_D#FC5udhfZ z*16&uL*)nxw=ivLJyynbkBxq9lCzx&4V6IUPaT+{0C zT7K+m@NW+Egqr7I`3Gh|sIFeA#)e+n6d)YD>!WW9zmYAr?)h*_G8Q#NT*;iO<($#O zC;5W&wXW5L%8pKC+;C`JZ+yB}qgYnwB>E|E(!y{u2b^4dvov8`%S`uAMGqnmuuZ8d zrJ9C?atZLs;#uHRORu|ouARqdCj^{Hk=Y99V+TG^ZD5Gb7Z#5Qq6&u8dV^f4RJR86 zRZVj$*B;2loO-KFqwuv&rr|uVkEVxX0SETlea$_Qb+OL2p$Umbl%4cPqcUlJYun_m zR*Qd}oCBZ7KgWl8LeS-IprgK5Qb2E{D;7~H$i2*nwjVxQ9hCJCp=M7{z9w9x$A1h5A?RdjMOZZs}tT_ugkFB$!^(jztru_xh!50A5rI?q)tBaDdC2x zY!}1-mj1}vc)nMHTTgvkHa6P6%AQCW6pozf{x9h7bMg?8-RID2G(}9N8?j#(3?=5V z@w8x03Wa|zu4=meu(-F?5jWag5_Cw-m$@9tO#7hl;+u+VTAK${s$o@md+!xjNTTK) zlkLNvbT+=BNhfXI9gXK#kB;xQM1_}K)3v?Q+S^khIk6e^d0InrtQMjjm)KDap`eZXPyYof7Kb3WakYduU`FgB&uA=SupbA6*1bopHYk3pAGukP;d zhRLHR0Y=RHeBHXI6gWt&B~hm9(Gc+*5u1*{H!^T5ffJjDz&A7SGJzADfxx%c;k*ZE z`27C>d=vgD3)k`PA?1ngCFOTBc-#a|Mkj%v$H1Kna2gK-*C7py=Q&dTe5U*@q~157 z-peQ}Tkj3L&vEcuSv)r&FY&p_=I!_zuvyya9w?Q#R*POQT4J|wPlsnb+N=TdF%8#% zLB7F;1=9)p|EfE}W`m;X!IP_xRb$Remv>*3^>wtlWhNOCAf<*iWb`>}X|0uO%Ba>a z6FKj>v-`lHWU4Ej!s)&1wSHZAqlakXDw)aTv?dO4r!Ld!Db2{yn80>ksZ}iBO{TSV zBXM>H`>{)VpYp=JWNO=d!bI%*40;Za^P)?nvwjbmiT1FG7K!HvY4LQ&n$m;O^17yF z5xYcLQEI}~T(!3tukNVkS`RT2YL}_x*_oc1Z8@QY@3TfE&4a^siZ95dKCSc_Sc$pRKP&2ttASFBsiUiY(O7E`=52+I$e%G~U{49wbYh7&ENA|MD?k z!EvwevRR#9dtlf2XxDkWdi(bUa>DVezP4}X#@&7%If=Q*`zQJb^uzy3=;v0{#(M?5 z&fJhSN+7@Hy@GFKAb$l2lVym7BwrB0tbGLTNc#!7LyO`bANO;e#;x}Ry+)Bi_GImQ z3rUA`O?P4oN>F-CkGgO0M6{ISFuDt*oR)i%i#Pu)*79~iBwD@H`w*hUSfaP-On$RX zWR_#UC8e%b4Q3a(!WAJs9joueVcyRvD~X|n$o#P=DXnytj3a(gCLLosGY|(<3`POnj-Uzys{$#ksK@ zsF0bb7rcjbe*eND{w~a;#!VkbC={97le2W}o2&h02xIUjI@pjHGIRNge{#%XZ9W7OT9W* zKqNL9`-ZxDBK8}Ho56TlB@XQB8`{}%h;?6XaCx!G}(F_>?sdI#FNn$Pd*piaC` zZ-|d(-K}YbYOWD=`ah7A1U#I<#ayC9jgMT|y9y>BtDvwX}Wv3jT1No6IKlI!*5o%c~Cqfi&vXyVWwC$Z8eN zp?M~t_ZX16Ut~1fN19^!DU(Ys(M39N#@l z?D1#y*kg_m_Z|a~bcf^5EJPUaw@LJo6X`fDl+X@zwt-6XlO0iuH#^af$%!*>;+G*V8R9kZ1{mxRV&v@U=BO`X&JYbn<(SZ9BOqP^dw>l( z_~7Ar)H;C_*I!;ax>|uIYLAa2#j2x~%dS@-N+3wX*8Zj+3Nt0Mxs(yo!AdcBjE-*T z+}Z+>Nl86+*}S!L<58teS!)dp1oHlYKzb}08_V7j7!2gbqRG)rV8FjLQVAoc2fwg% zY!jV-#$L`bF!VmuL?m#%bi{b-eln~}oiyN^BqM>N`f1^-2HK8RNdH185}+W8@P}Sg zDCt-qP>?*cc43UyLWtot3#CQ-D+v%tK zF>XiUHu~eo@eU0#(WDxm800 zYcBzj2el}VkhwD0)hCn*(bEqX#koy!gi5pd;6SUd&fT^P+fUrve!Q)3ps$bY=;cwg z?sf1Ab4bgkMX_pU~ zOqqn2Bqnx9Y0+JEUjCp%A2m0R$MHRMB>V$Ze6*Af*+=-1jg^hJPtV=4wzAfB*9oaO zd0^Ybuf{g*iK|cEX|fO9dH$h02W)hk=U<|pCU^NYo#`GwFbB^%(=S|whCh{RvRa!` z$+Fd2PL5tW#lL`_H@`>j-1 z;K4fwNfy^z_$ug?DD5}SFor5o{7a>WCR`*UJ~~8C3&exm7t`ijRu3LOg!-6h_v8II z8D>L-O)q@#*+<(XsPz%t8p2IDjg_CSH z7qu7k{4|e!CUM?5qWATXd;aaZ*434ktWMZarB}50nqZ$u&&S==l;$Wxp%A@5Y27v| zFI3w5L@E)&kp7QX>0m5=VqalrmTKG58XW6M@Y9Mly|XjO3^z=Yt0u{?WY;7>Wstgs zcsayqIj#9Sy63N306aR7nX77sGEVKa@sdjR}zf=LQBlNvyEKV*26OhX->BH@kRVopIU17sa%@5 zb8_bDc`Ivg3^vTaay*MlFk)}$>#O~nYX_cjcpq;greLzJS*S;Was{u4p`2B{)LE(Z zoo#xgB^#eWNYU0;>ETNSFQMufG{&Qu-IcYp!*X`Mi#7o}Yu{yUhHqm+_&{$@4-(Vl zZcZUoSdk^<(&=bwb?1fE)6DGL)_iVjj>t05uUsO_#T;|aGAqg~#av-t4#Ip0A$!@r zXGi`SjFN3CrxKy@+Cw1AyX&%C+?vFA&ECsJ#r#}xa0q#bmR=BLkQTB6A(DI-BgyaM zu`3n=zk|SqXa|848ehfJwN`98aH1Z3D4}wmrkBX&yZU! zcjFz$ zjvqhPJaES$m~sa1Jb3Vq!BZzMz2b^X$vUEjzXi3JKnqcXt948FBiOupF)d>{0orPjr1udmHbS76| zzgLn8`WrM~sGWi(1|d7{BV?C5gbJ~c$Pw-C8D%|v?FU(^Y0dvIhiWwJ$_fxtxb=0y z_lRhZ55wuV@QvgQp?A#L1eW?v&)VFzBu{fAHDY?1lc`xeYig$Cl}Ap?%_LD07wtXa zm4J&2ceHs!OSVx4Lrm8G;)~mi=r%*tU?1j(w|5BT0(YXL#U9m26(G4@tzq2QMRiHNM)QZD7P>o(7xn2v%yc2d)N@s=$Ywl2*D zM~!Em6X;#!U@7D%?xDw24jZqi=Rw|d@%!qTkUc*hxcQR56vl(JlO!-+Y(|-S>Z6QK ziTnj%7eU|LOIB4p9S506M|TG2(0EFQ%B>r>Rew5k;}_Raqo#iioO7h@7o+#xPfx3& z2R;eG8sT%b@6sF>fBl;RfW3)4w08sWKMwfmgo`Cz{a*bWo9GJP&BH;eKD nJH*H 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 literal 0 HcmV?d00001 diff --git a/SourceSerifPro-It.ttf.woff b/SourceSerifPro-It.ttf.woff new file mode 100644 index 0000000000000000000000000000000000000000..4bd621c9bd0bac971eced0ff78504c196e7b6c14 GIT binary patch literal 36332 zcmZ6xbCjpQ&oKNM@7T6&+r|!dY}>YN+uX739ox2T^PTVSe*SuMt~94f(>7_ZwC6Og zzs1A=K!6{Jz5u}g5Fmz;pE|^Uoc})v2`Y&K05)Mie6jz~m{_|@L`hQoNB7{T{_FoC zkhqBGkKAVFr*8a%QE+h)+4gdgM830gv8jKC%6IW6e0sund004+T008_E zJCV`nZzX!BpGo|utNw#}T9A$zhSvIa008)pE@I5QsD~dO?GMUJ7dmQK>%0Ao3)J|dhxLO5z$`$JHu}~-HW_{Z03hf;y1-bk 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 literal 0 HcmV?d00001 diff --git a/SourceSerifPro-Regular.ttf.woff b/SourceSerifPro-Regular.ttf.woff new file mode 100644 index 0000000000000000000000000000000000000000..96b36a0ed2366b57ebaffa15c5546e5ec3bd0f65 GIT binary patch literal 88724 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�zB{Hl}NQ!3@RN26))!B%XaN?Z}$N|lrPG!%Cn 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 JKV+v<{{ or the MIT license - * , at your - * option. This file may not be copied, modified, or distributed - * except according to those terms. - */ -body{background-color:#353535;color:#ddd;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){color:#ddd;}h1.fqn{border-bottom-color:#d2d2d2;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){border-bottom-color:#d2d2d2;}.in-band{background-color:#353535;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#2A2A2A;}pre{background-color:#2A2A2A;}.sidebar{background-color:#505050;}.sidebar .current{background-color:#333;}.source .sidebar{background-color:#353535;}.sidebar .location{border-color:#fff;background:#575757;color:#DDD;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#444;}.line-numbers span{color:#3B91E2;}.line-numbers .line-highlighted{background-color:#0a042f !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#DDD;}.docblock table{border-color:#ddd;}.docblock table td{border-top-color:#ddd;border-bottom-color:#ddd;}.docblock table th{border-top-color:#ddd;border-bottom-color:#ddd;}:target{background:#494a3d;}:target>.in-band{background:#494a3d;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#ddd;}.content .highlighted{color:#eee !important;background-color:#616161;}.content .highlighted a,.content .highlighted span{color:#eee !important;}.content .highlighted.trait{background-color:#013191;}.content .highlighted.mod,.content .highlighted.externcrate{background-color:#afc6e4;}.content .highlighted.mod{background-color:#803a1b;}.content .highlighted.externcrate{background-color:#396bac;}.content .highlighted.enum{background-color:#5b4e68;}.content .highlighted.struct{background-color:#194e9f;}.content .highlighted.union{background-color:#b7bd49;}.content .highlighted.fn,.content .highlighted.method,.content .highlighted.tymethod{background-color:#4950ed;}.content .highlighted.type{background-color:#38902c;}.content .highlighted.foreigntype{background-color:#b200d6;}.content .highlighted.attr,.content .highlighted.derive,.content .highlighted.macro{background-color:#217d1c;}.content .highlighted.constant,.content .highlighted.static{background-color:#0063cc;}.content .highlighted.primitive{background-color:#00708a;}.content .highlighted.keyword{background-color:#884719;}.content span.enum,.content a.enum,.block a.current.enum{color:#82b089;}.content span.struct,.content a.struct,.block a.current.struct{color:#2dbfb8;}.content span.type,.content a.type,.block a.current.type{color:#ff7f00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#dd7de8;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#09bd00;}.content span.union,.content a.union,.block a.current.union{color:#a6ae37;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#82a5c9;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#43aec7;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#bda000;}.content span.trait,.content a.trait,.block a.current.trait{color:#b78cf2;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#2BAB63;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}pre.rust .comment{color:#8d8d8b;}pre.rust .doccomment{color:#8ca375;}nav{border-bottom-color:#4e4e4e;}nav.main .current{border-top-color:#eee;border-bottom-color:#eee;}nav.main .separator{border-color:#eee;}a{color:#ddd;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.stability a{color:#D2991D;}a.test-arrow{color:#dedede;}.collapse-toggle{color:#999;}.search-input{color:#111;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;background-color:#f0f0f0;}.search-input:focus{border-color:#008dfd;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;color:#404040;}.stab.deprecated{background:#F3DFFF;border-color:#7F0087;color:#404040;}.stab.portability{background:#C4ECFF;border-color:#7BA5DB;color:#404040;}.module-item .stab{color:#ddd;}#help>div{background:#4d4d4d;border-color:#bfbfbf;}#help dt{border-color:#bfbfbf;background:rgba(0,0,0,0);color:black;}.since{color:grey;}tr.result span.primitive::after,tr.result span.keyword::after{color:#ddd;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#ab8ac1;}pre.rust .kw-2,pre.rust .prelude-ty{color:#769acb;}pre.rust .number,pre.rust .string{color:#83a300;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#ee6868;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#d97f26;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#4a4949;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label{color:#999;}:target>code{background-color:#494a3d;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.6);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.6);}.information>.compile_fail:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:rgba(255,142,0,1);}.search-failed>a{color:#0089ff;}.tooltip .tooltiptext{background-color:black;color:#fff;}.tooltip .tooltiptext::after{border-color:transparent black transparent transparent;}.important-traits .tooltip .tooltiptext{background-color:white;color:black;border-color:black;}#titles>div:not(.selected){background-color:#252525;border-top-color:#252525;}#titles>div:hover,#titles>div.selected{border-top-color:#0089ff;}#titles>div>div.count{color:#888;}.modal{background-color:rgba(0,0,0,0.3);}.modal-content{background-color:#272727;border-color:#999;}.modal-content>.close{background-color:#272727;border-color:#999;}.modal-content>.close:hover{background-color:#ff1f1f;color:white;}.modal-content>.whiter{background-color:#272727;}.modal-content>.close:hover+.whiter{background-color:#ff1f1f;}@media (max-width:700px){.sidebar-menu{background-color:#505050;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#505050;border-right-color:#000;}#sidebar-filler{background-color:#505050;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu{border-color:#e0e0e0;background:#f0f0f0;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus{border-color:#ffb900;}#theme-choices{border-color:#e0e0e0;background-color:#353535;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#4e4e4e;}@media (max-width:700px){#theme-picker{background:#f0f0f0;}}#all-types{background-color:#505050;}#all-types:hover{background-color:#606060;}.search-results td span.alias{color:#fff;}.search-results td span.grey{color:#ccc;}.impl-items code{background-color:rgba(0,0,0,0);}#sidebar-toggle{background-color:#565656;}#sidebar-toggle:hover{background-color:#676767;}#source-sidebar{background-color:#565656;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#444;}div.files>.selected{background-color:#333;} \ No newline at end of file +body{background-color:#353535;color:#ddd;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){color:#ddd;}h1.fqn{border-bottom-color:#d2d2d2;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){border-bottom-color:#d2d2d2;}.in-band{background-color:#353535;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#2A2A2A;}pre{background-color:#2A2A2A;}.sidebar{background-color:#505050;}.sidebar .current{background-color:#333;}.source .sidebar{background-color:#353535;}.sidebar .location{border-color:#fff;background:#575757;color:#DDD;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#444;}.line-numbers span{color:#3B91E2;}.line-numbers .line-highlighted{background-color:#0a042f !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#DDD;}.docblock table{border-color:#ddd;}.docblock table td{border-top-color:#ddd;border-bottom-color:#ddd;}.docblock table th{border-top-color:#ddd;border-bottom-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#ddd;}.content .highlighted{color:#eee !important;background-color:#616161;}.content .highlighted a,.content .highlighted span{color:#eee !important;}.content .highlighted.trait{background-color:#013191;}.content .highlighted.mod,.content .highlighted.externcrate{background-color:#afc6e4;}.content .highlighted.mod{background-color:#803a1b;}.content .highlighted.externcrate{background-color:#396bac;}.content .highlighted.enum{background-color:#5b4e68;}.content .highlighted.struct{background-color:#194e9f;}.content .highlighted.union{background-color:#b7bd49;}.content .highlighted.fn,.content .highlighted.method,.content .highlighted.tymethod{background-color:#4950ed;}.content .highlighted.type{background-color:#38902c;}.content .highlighted.foreigntype{background-color:#b200d6;}.content .highlighted.attr,.content .highlighted.derive,.content .highlighted.macro{background-color:#217d1c;}.content .highlighted.constant,.content .highlighted.static{background-color:#0063cc;}.content .highlighted.primitive{background-color:#00708a;}.content .highlighted.keyword{background-color:#884719;}.content span.enum,.content a.enum,.block a.current.enum{color:#82b089;}.content span.struct,.content a.struct,.block a.current.struct{color:#2dbfb8;}.content span.type,.content a.type,.block a.current.type{color:#ff7f00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#dd7de8;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#09bd00;}.content span.union,.content a.union,.block a.current.union{color:#a6ae37;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#82a5c9;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#43aec7;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#bda000;}.content span.trait,.content a.trait,.block a.current.trait{color:#b78cf2;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#2BAB63;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}pre.rust .comment{color:#8d8d8b;}pre.rust .doccomment{color:#8ca375;}nav{border-bottom-color:#4e4e4e;}nav.main .current{border-top-color:#eee;border-bottom-color:#eee;}nav.main .separator{border-color:#eee;}a{color:#ddd;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.stability a{color:#D2991D;}.stab.internal a{color:#304FFE;}a.test-arrow{color:#dedede;}.collapse-toggle{color:#999;}#crate-search{color:#111;background-color:#f0f0f0;border-color:#000;}.search-input{color:#111;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;background-color:#f0f0f0;}.search-input:focus{border-color:#008dfd;}#crate-search+.search-input{box-shadow:1px 0 0 1px #000,0 0 0 2px transparent;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;color:#404040;}.stab.internal{background:#FFB9B3;border-color:#B71C1C;color:#404040;}.stab.deprecated{background:#F3DFFF;border-color:#7F0087;color:#404040;}.stab.portability{background:#C4ECFF;border-color:#7BA5DB;color:#404040;}.module-item .stab{color:#ddd;}#help>div{background:#4d4d4d;border-color:#bfbfbf;}#help dt{border-color:#bfbfbf;background:rgba(0,0,0,0);color:black;}.since{color:grey;}tr.result span.primitive::after,tr.result span.keyword::after{color:#ddd;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#ab8ac1;}pre.rust .kw-2,pre.rust .prelude-ty{color:#769acb;}pre.rust .number,pre.rust .string{color:#83a300;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#ee6868;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#d97f26;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#4a4949;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label{color:#999;}:target>code,:target>.in-band{background-color:#494a3d;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.6);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.6);}.information>.compile_fail:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:rgba(255,142,0,1);}.search-failed a{color:#0089ff;}.tooltip .tooltiptext{background-color:black;color:#fff;}.tooltip .tooltiptext::after{border-color:transparent black transparent transparent;}.important-traits .tooltip .tooltiptext{background-color:white;color:black;border-color:black;}#titles>div:not(.selected){background-color:#252525;border-top-color:#252525;}#titles>div:hover,#titles>div.selected{border-top-color:#0089ff;}#titles>div>div.count{color:#888;}.modal{background-color:rgba(0,0,0,0.3);}.modal-content{background-color:#272727;border-color:#999;}.modal-content>.close{background-color:#272727;border-color:#999;}.modal-content>.close:hover{background-color:#ff1f1f;color:white;}.modal-content>.whiter{background-color:#272727;}.modal-content>.close:hover+.whiter{background-color:#ff1f1f;}@media (max-width:700px){.sidebar-menu{background-color:#505050;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#505050;border-right-color:#000;}#sidebar-filler{background-color:#505050;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu{border-color:#e0e0e0;background:#f0f0f0;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus{border-color:#ffb900;}#theme-choices{border-color:#e0e0e0;background-color:#353535;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#4e4e4e;}@media (max-width:700px){#theme-picker{background:#f0f0f0;}}#all-types{background-color:#505050;}#all-types:hover{background-color:#606060;}.search-results td span.alias{color:#fff;}.search-results td span.grey{color:#ccc;}#sidebar-toggle{background-color:#565656;}#sidebar-toggle:hover{background-color:#676767;}#source-sidebar{background-color:#565656;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#444;}div.files>.selected{background-color:#333;} \ No newline at end of file diff --git a/down-arrow.svg b/down-arrow.svg new file mode 100644 index 0000000..c0f59f0 --- /dev/null +++ b/down-arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/implementors/core/clone/trait.Clone.js b/implementors/core/clone/trait.Clone.js index c77dbb5..7a0c410 100644 --- a/implementors/core/clone/trait.Clone.js +++ b/implementors/core/clone/trait.Clone.js @@ -1,7 +1,7 @@ (function() {var implementors = {}; -implementors["rustpython_parser"] = [{text:"impl Clone for Location",synthetic:false,types:["rustpython_parser::lexer::Location"]},]; -implementors["rustpython_vm"] = [{text:"impl Clone for CodeObject",synthetic:false,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl Clone for FunctionOpArg",synthetic:false,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl Clone for Instruction",synthetic:false,types:["rustpython_vm::bytecode::Instruction"]},{text:"impl Clone for CallType",synthetic:false,types:["rustpython_vm::bytecode::CallType"]},{text:"impl Clone for Constant",synthetic:false,types:["rustpython_vm::bytecode::Constant"]},{text:"impl Clone for ComparisonOperator",synthetic:false,types:["rustpython_vm::bytecode::ComparisonOperator"]},{text:"impl Clone for BinaryOperator",synthetic:false,types:["rustpython_vm::bytecode::BinaryOperator"]},{text:"impl Clone for UnaryOperator",synthetic:false,types:["rustpython_vm::bytecode::UnaryOperator"]},{text:"impl Clone for FormatAlign",synthetic:false,types:["rustpython_vm::format::FormatAlign"]},{text:"impl Clone for FormatSign",synthetic:false,types:["rustpython_vm::format::FormatSign"]},{text:"impl Clone for RangeType",synthetic:false,types:["rustpython_vm::obj::objrange::RangeType"]},{text:"impl Clone for PyFuncArgs",synthetic:false,types:["rustpython_vm::pyobject::PyFuncArgs"]},]; -implementors["rustpython_wasm"] = [{text:"impl Clone for AccessibleVM",synthetic:false,types:["rustpython_wasm::vm_class::AccessibleVM"]},{text:"impl Clone for WASMVirtualMachine",synthetic:false,types:["rustpython_wasm::vm_class::WASMVirtualMachine"]},]; +implementors["rustpython_parser"] = [{text:"impl Clone for ConversionFlag",synthetic:false,types:["rustpython_parser::ast::ConversionFlag"]},{text:"impl Clone for Location",synthetic:false,types:["rustpython_parser::lexer::Location"]},]; +implementors["rustpython_vm"] = [{text:"impl Clone for CodeObject",synthetic:false,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl Clone for FunctionOpArg",synthetic:false,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl Clone for Instruction",synthetic:false,types:["rustpython_vm::bytecode::Instruction"]},{text:"impl Clone for CallType",synthetic:false,types:["rustpython_vm::bytecode::CallType"]},{text:"impl Clone for Constant",synthetic:false,types:["rustpython_vm::bytecode::Constant"]},{text:"impl Clone for ComparisonOperator",synthetic:false,types:["rustpython_vm::bytecode::ComparisonOperator"]},{text:"impl Clone for BinaryOperator",synthetic:false,types:["rustpython_vm::bytecode::BinaryOperator"]},{text:"impl Clone for UnaryOperator",synthetic:false,types:["rustpython_vm::bytecode::UnaryOperator"]},{text:"impl Clone for Varargs",synthetic:false,types:["rustpython_vm::bytecode::Varargs"]},{text:"impl Clone for FormatAlign",synthetic:false,types:["rustpython_vm::format::FormatAlign"]},{text:"impl Clone for FormatSign",synthetic:false,types:["rustpython_vm::format::FormatSign"]},{text:"impl Clone for Scope",synthetic:false,types:["rustpython_vm::frame::Scope"]},{text:"impl Clone for PyFuncArgs",synthetic:false,types:["rustpython_vm::function::PyFuncArgs"]},{text:"impl Clone for PyClassMethod",synthetic:false,types:["rustpython_vm::obj::objclassmethod::PyClassMethod"]},{text:"impl Clone for PyComplex",synthetic:false,types:["rustpython_vm::obj::objcomplex::PyComplex"]},{text:"impl Clone for PyFloat",synthetic:false,types:["rustpython_vm::obj::objfloat::PyFloat"]},{text:"impl Clone for PyModule",synthetic:false,types:["rustpython_vm::obj::objmodule::PyModule"]},{text:"impl Clone for PyNone",synthetic:false,types:["rustpython_vm::obj::objnone::PyNone"]},{text:"impl Clone for PyInstance",synthetic:false,types:["rustpython_vm::obj::objobject::PyInstance"]},{text:"impl Clone for PyRange",synthetic:false,types:["rustpython_vm::obj::objrange::PyRange"]},{text:"impl Clone for PyStaticMethod",synthetic:false,types:["rustpython_vm::obj::objstaticmethod::PyStaticMethod"]},{text:"impl Clone for PyString",synthetic:false,types:["rustpython_vm::obj::objstr::PyString"]},{text:"impl Clone for PyClass",synthetic:false,types:["rustpython_vm::obj::objtype::PyClass"]},{text:"impl<T: Clone> Clone for PyRef<T>",synthetic:false,types:["rustpython_vm::pyobject::PyRef"]},]; +implementors["rustpython_wasm"] = [{text:"impl Clone for WASMVirtualMachine",synthetic:false,types:["rustpython_wasm::vm_class::WASMVirtualMachine"]},]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/implementors/core/cmp/trait.PartialEq.js b/implementors/core/cmp/trait.PartialEq.js index 1b74718..ad94939 100644 --- a/implementors/core/cmp/trait.PartialEq.js +++ b/implementors/core/cmp/trait.PartialEq.js @@ -1,6 +1,6 @@ (function() {var implementors = {}; -implementors["rustpython_parser"] = [{text:"impl PartialEq<Top> for Top",synthetic:false,types:["rustpython_parser::ast::Top"]},{text:"impl PartialEq<Program> for Program",synthetic:false,types:["rustpython_parser::ast::Program"]},{text:"impl PartialEq<SingleImport> for SingleImport",synthetic:false,types:["rustpython_parser::ast::SingleImport"]},{text:"impl<T: PartialEq> PartialEq<Located<T>> for Located<T>",synthetic:false,types:["rustpython_parser::ast::Located"]},{text:"impl PartialEq<Statement> for Statement",synthetic:false,types:["rustpython_parser::ast::Statement"]},{text:"impl PartialEq<WithItem> for WithItem",synthetic:false,types:["rustpython_parser::ast::WithItem"]},{text:"impl PartialEq<Expression> for Expression",synthetic:false,types:["rustpython_parser::ast::Expression"]},{text:"impl PartialEq<Parameters> for Parameters",synthetic:false,types:["rustpython_parser::ast::Parameters"]},{text:"impl PartialEq<ComprehensionKind> for ComprehensionKind",synthetic:false,types:["rustpython_parser::ast::ComprehensionKind"]},{text:"impl PartialEq<Comprehension> for Comprehension",synthetic:false,types:["rustpython_parser::ast::Comprehension"]},{text:"impl PartialEq<Keyword> for Keyword",synthetic:false,types:["rustpython_parser::ast::Keyword"]},{text:"impl PartialEq<ExceptHandler> for ExceptHandler",synthetic:false,types:["rustpython_parser::ast::ExceptHandler"]},{text:"impl PartialEq<Operator> for Operator",synthetic:false,types:["rustpython_parser::ast::Operator"]},{text:"impl PartialEq<BooleanOperator> for BooleanOperator",synthetic:false,types:["rustpython_parser::ast::BooleanOperator"]},{text:"impl PartialEq<UnaryOperator> for UnaryOperator",synthetic:false,types:["rustpython_parser::ast::UnaryOperator"]},{text:"impl PartialEq<Comparison> for Comparison",synthetic:false,types:["rustpython_parser::ast::Comparison"]},{text:"impl PartialEq<Number> for Number",synthetic:false,types:["rustpython_parser::ast::Number"]},{text:"impl PartialEq<StringGroup> for StringGroup",synthetic:false,types:["rustpython_parser::ast::StringGroup"]},{text:"impl PartialEq<ParseError> for ParseError",synthetic:false,types:["rustpython_parser::error::ParseError"]},{text:"impl PartialEq<Location> for Location",synthetic:false,types:["rustpython_parser::lexer::Location"]},{text:"impl PartialEq<FStringError> for FStringError",synthetic:false,types:["rustpython_parser::parser::FStringError"]},{text:"impl PartialEq<Tok> for Tok",synthetic:false,types:["rustpython_parser::token::Tok"]},]; -implementors["rustpython_vm"] = [{text:"impl PartialEq<CodeObject> for CodeObject",synthetic:false,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl PartialEq<FunctionOpArg> for FunctionOpArg",synthetic:false,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl PartialEq<Instruction> for Instruction",synthetic:false,types:["rustpython_vm::bytecode::Instruction"]},{text:"impl PartialEq<CallType> for CallType",synthetic:false,types:["rustpython_vm::bytecode::CallType"]},{text:"impl PartialEq<Constant> for Constant",synthetic:false,types:["rustpython_vm::bytecode::Constant"]},{text:"impl PartialEq<ComparisonOperator> for ComparisonOperator",synthetic:false,types:["rustpython_vm::bytecode::ComparisonOperator"]},{text:"impl PartialEq<BinaryOperator> for BinaryOperator",synthetic:false,types:["rustpython_vm::bytecode::BinaryOperator"]},{text:"impl PartialEq<UnaryOperator> for UnaryOperator",synthetic:false,types:["rustpython_vm::bytecode::UnaryOperator"]},{text:"impl PartialEq<FormatAlign> for FormatAlign",synthetic:false,types:["rustpython_vm::format::FormatAlign"]},{text:"impl PartialEq<FormatSign> for FormatSign",synthetic:false,types:["rustpython_vm::format::FormatSign"]},{text:"impl PartialEq<FormatGrouping> for FormatGrouping",synthetic:false,types:["rustpython_vm::format::FormatGrouping"]},{text:"impl PartialEq<FormatType> for FormatType",synthetic:false,types:["rustpython_vm::format::FormatType"]},{text:"impl PartialEq<FormatSpec> for FormatSpec",synthetic:false,types:["rustpython_vm::format::FormatSpec"]},{text:"impl PartialEq<FormatParseError> for FormatParseError",synthetic:false,types:["rustpython_vm::format::FormatParseError"]},{text:"impl PartialEq<FormatPart> for FormatPart",synthetic:false,types:["rustpython_vm::format::FormatPart"]},{text:"impl PartialEq<FormatString> for FormatString",synthetic:false,types:["rustpython_vm::format::FormatString"]},]; +implementors["rustpython_parser"] = [{text:"impl PartialEq<Top> for Top",synthetic:false,types:["rustpython_parser::ast::Top"]},{text:"impl PartialEq<Program> for Program",synthetic:false,types:["rustpython_parser::ast::Program"]},{text:"impl PartialEq<SingleImport> for SingleImport",synthetic:false,types:["rustpython_parser::ast::SingleImport"]},{text:"impl<T: PartialEq> PartialEq<Located<T>> for Located<T>",synthetic:false,types:["rustpython_parser::ast::Located"]},{text:"impl PartialEq<Statement> for Statement",synthetic:false,types:["rustpython_parser::ast::Statement"]},{text:"impl PartialEq<WithItem> for WithItem",synthetic:false,types:["rustpython_parser::ast::WithItem"]},{text:"impl PartialEq<Expression> for Expression",synthetic:false,types:["rustpython_parser::ast::Expression"]},{text:"impl PartialEq<Parameters> for Parameters",synthetic:false,types:["rustpython_parser::ast::Parameters"]},{text:"impl PartialEq<Parameter> for Parameter",synthetic:false,types:["rustpython_parser::ast::Parameter"]},{text:"impl PartialEq<ComprehensionKind> for ComprehensionKind",synthetic:false,types:["rustpython_parser::ast::ComprehensionKind"]},{text:"impl PartialEq<Comprehension> for Comprehension",synthetic:false,types:["rustpython_parser::ast::Comprehension"]},{text:"impl PartialEq<Keyword> for Keyword",synthetic:false,types:["rustpython_parser::ast::Keyword"]},{text:"impl PartialEq<ExceptHandler> for ExceptHandler",synthetic:false,types:["rustpython_parser::ast::ExceptHandler"]},{text:"impl PartialEq<Operator> for Operator",synthetic:false,types:["rustpython_parser::ast::Operator"]},{text:"impl PartialEq<BooleanOperator> for BooleanOperator",synthetic:false,types:["rustpython_parser::ast::BooleanOperator"]},{text:"impl PartialEq<UnaryOperator> for UnaryOperator",synthetic:false,types:["rustpython_parser::ast::UnaryOperator"]},{text:"impl PartialEq<Comparison> for Comparison",synthetic:false,types:["rustpython_parser::ast::Comparison"]},{text:"impl PartialEq<Number> for Number",synthetic:false,types:["rustpython_parser::ast::Number"]},{text:"impl PartialEq<ConversionFlag> for ConversionFlag",synthetic:false,types:["rustpython_parser::ast::ConversionFlag"]},{text:"impl PartialEq<StringGroup> for StringGroup",synthetic:false,types:["rustpython_parser::ast::StringGroup"]},{text:"impl PartialEq<Varargs> for Varargs",synthetic:false,types:["rustpython_parser::ast::Varargs"]},{text:"impl PartialEq<ParseError> for ParseError",synthetic:false,types:["rustpython_parser::error::ParseError"]},{text:"impl PartialEq<Location> for Location",synthetic:false,types:["rustpython_parser::lexer::Location"]},{text:"impl PartialEq<Tok> for Tok",synthetic:false,types:["rustpython_parser::token::Tok"]},]; +implementors["rustpython_vm"] = [{text:"impl PartialEq<CodeObject> for CodeObject",synthetic:false,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl PartialEq<FunctionOpArg> for FunctionOpArg",synthetic:false,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl PartialEq<Instruction> for Instruction",synthetic:false,types:["rustpython_vm::bytecode::Instruction"]},{text:"impl PartialEq<CallType> for CallType",synthetic:false,types:["rustpython_vm::bytecode::CallType"]},{text:"impl PartialEq<Constant> for Constant",synthetic:false,types:["rustpython_vm::bytecode::Constant"]},{text:"impl PartialEq<ComparisonOperator> for ComparisonOperator",synthetic:false,types:["rustpython_vm::bytecode::ComparisonOperator"]},{text:"impl PartialEq<BinaryOperator> for BinaryOperator",synthetic:false,types:["rustpython_vm::bytecode::BinaryOperator"]},{text:"impl PartialEq<UnaryOperator> for UnaryOperator",synthetic:false,types:["rustpython_vm::bytecode::UnaryOperator"]},{text:"impl PartialEq<Varargs> for Varargs",synthetic:false,types:["rustpython_vm::bytecode::Varargs"]},{text:"impl PartialEq<FormatAlign> for FormatAlign",synthetic:false,types:["rustpython_vm::format::FormatAlign"]},{text:"impl PartialEq<FormatSign> for FormatSign",synthetic:false,types:["rustpython_vm::format::FormatSign"]},{text:"impl PartialEq<FormatGrouping> for FormatGrouping",synthetic:false,types:["rustpython_vm::format::FormatGrouping"]},{text:"impl PartialEq<FormatType> for FormatType",synthetic:false,types:["rustpython_vm::format::FormatType"]},{text:"impl PartialEq<FormatSpec> for FormatSpec",synthetic:false,types:["rustpython_vm::format::FormatSpec"]},{text:"impl PartialEq<FormatParseError> for FormatParseError",synthetic:false,types:["rustpython_vm::format::FormatParseError"]},{text:"impl PartialEq<FormatPart> for FormatPart",synthetic:false,types:["rustpython_vm::format::FormatPart"]},{text:"impl PartialEq<FormatString> for FormatString",synthetic:false,types:["rustpython_vm::format::FormatString"]},{text:"impl PartialEq<PyComplex> for PyComplex",synthetic:false,types:["rustpython_vm::obj::objcomplex::PyComplex"]},{text:"impl PartialEq<PyFloat> for PyFloat",synthetic:false,types:["rustpython_vm::obj::objfloat::PyFloat"]},]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/implementors/core/convert/trait.From.js b/implementors/core/convert/trait.From.js index 5786740..feebf85 100644 --- a/implementors/core/convert/trait.From.js +++ b/implementors/core/convert/trait.From.js @@ -1,6 +1,7 @@ (function() {var implementors = {}; -implementors["rustpython_parser"] = [{text:"impl From<ParseError<Location, Tok, LexicalError>> for ParseError",synthetic:false,types:["rustpython_parser::error::ParseError"]},{text:"impl From<FStringError> for ParseError<Location, Tok, LexicalError>",synthetic:false,types:["lalrpop_util::ParseError"]},]; -implementors["rustpython_wasm"] = [{text:"impl From<VMStore> for JsValue",synthetic:false,types:["wasm_bindgen::JsValue"]},{text:"impl From<WASMVirtualMachine> for AccessibleVM",synthetic:false,types:["rustpython_wasm::vm_class::AccessibleVM"]},{text:"impl<'_> From<&'_ WASMVirtualMachine> for AccessibleVM",synthetic:false,types:["rustpython_wasm::vm_class::AccessibleVM"]},{text:"impl From<WASMVirtualMachine> for JsValue",synthetic:false,types:["wasm_bindgen::JsValue"]},]; +implementors["rustpython_parser"] = [{text:"impl From<Option<Option<Parameter>>> for Varargs",synthetic:false,types:["rustpython_parser::ast::Varargs"]},{text:"impl From<ParseError<Location, Tok, LexicalError>> for ParseError",synthetic:false,types:["rustpython_parser::error::ParseError"]},]; +implementors["rustpython_vm"] = [{text:"impl From<Varargs> for Varargs",synthetic:false,types:["rustpython_vm::bytecode::Varargs"]},{text:"impl<'a> From<&'a Varargs> for Varargs",synthetic:false,types:["rustpython_vm::bytecode::Varargs"]},{text:"impl From<Vec<Rc<PyObject>>> for PyFuncArgs",synthetic:false,types:["rustpython_vm::function::PyFuncArgs"]},{text:"impl From<Rc<PyObject>> for PyFuncArgs",synthetic:false,types:["rustpython_vm::function::PyFuncArgs"]},{text:"impl From<Rc<PyObject>> for ArgumentError",synthetic:false,types:["rustpython_vm::function::ArgumentError"]},{text:"impl From<Complex<f64>> for PyComplex",synthetic:false,types:["rustpython_vm::obj::objcomplex::PyComplex"]},{text:"impl From<f64> for PyFloat",synthetic:false,types:["rustpython_vm::obj::objfloat::PyFloat"]},{text:"impl From<Vec<Rc<PyObject>>> for PyList",synthetic:false,types:["rustpython_vm::obj::objlist::PyList"]},{text:"impl From<Vec<Rc<PyObject>>> for PyTuple",synthetic:false,types:["rustpython_vm::obj::objtuple::PyTuple"]},]; +implementors["rustpython_wasm"] = [{text:"impl From<VMStore> for JsValue",synthetic:false,types:["wasm_bindgen::JsValue"]},{text:"impl From<WASMVirtualMachine> for JsValue",synthetic:false,types:["wasm_bindgen::JsValue"]},]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/implementors/core/default/trait.Default.js b/implementors/core/default/trait.Default.js index bf38f96..76d11f0 100644 --- a/implementors/core/default/trait.Default.js +++ b/implementors/core/default/trait.Default.js @@ -1,6 +1,6 @@ (function() {var implementors = {}; -implementors["rustpython_parser"] = [{text:"impl Default for Parameters",synthetic:false,types:["rustpython_parser::ast::Parameters"]},{text:"impl Default for Location",synthetic:false,types:["rustpython_parser::lexer::Location"]},]; -implementors["rustpython_vm"] = [{text:"impl Default for PyFuncArgs",synthetic:false,types:["rustpython_vm::pyobject::PyFuncArgs"]},]; +implementors["rustpython_parser"] = [{text:"impl Default for Parameters",synthetic:false,types:["rustpython_parser::ast::Parameters"]},{text:"impl Default for Parameter",synthetic:false,types:["rustpython_parser::ast::Parameter"]},{text:"impl Default for Varargs",synthetic:false,types:["rustpython_parser::ast::Varargs"]},{text:"impl Default for Location",synthetic:false,types:["rustpython_parser::lexer::Location"]},]; +implementors["rustpython_vm"] = [{text:"impl Default for PyFuncArgs",synthetic:false,types:["rustpython_vm::function::PyFuncArgs"]},{text:"impl Default for PyDict",synthetic:false,types:["rustpython_vm::obj::objdict::PyDict"]},{text:"impl Default for PyList",synthetic:false,types:["rustpython_vm::obj::objlist::PyList"]},{text:"impl Default for PySet",synthetic:false,types:["rustpython_vm::obj::objset::PySet"]},{text:"impl Default for PyTuple",synthetic:false,types:["rustpython_vm::obj::objtuple::PyTuple"]},{text:"impl Default for PyContext",synthetic:false,types:["rustpython_vm::pyobject::PyContext"]},{text:"impl Default for VirtualMachine",synthetic:false,types:["rustpython_vm::vm::VirtualMachine"]},]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/implementors/core/fmt/trait.Debug.js b/implementors/core/fmt/trait.Debug.js index 74e15e3..3510ffa 100644 --- a/implementors/core/fmt/trait.Debug.js +++ b/implementors/core/fmt/trait.Debug.js @@ -1,6 +1,7 @@ (function() {var implementors = {}; -implementors["rustpython_parser"] = [{text:"impl Debug for Top",synthetic:false,types:["rustpython_parser::ast::Top"]},{text:"impl Debug for Program",synthetic:false,types:["rustpython_parser::ast::Program"]},{text:"impl Debug for SingleImport",synthetic:false,types:["rustpython_parser::ast::SingleImport"]},{text:"impl<T: Debug> Debug for Located<T>",synthetic:false,types:["rustpython_parser::ast::Located"]},{text:"impl Debug for Statement",synthetic:false,types:["rustpython_parser::ast::Statement"]},{text:"impl Debug for WithItem",synthetic:false,types:["rustpython_parser::ast::WithItem"]},{text:"impl Debug for Expression",synthetic:false,types:["rustpython_parser::ast::Expression"]},{text:"impl Debug for Parameters",synthetic:false,types:["rustpython_parser::ast::Parameters"]},{text:"impl Debug for ComprehensionKind",synthetic:false,types:["rustpython_parser::ast::ComprehensionKind"]},{text:"impl Debug for Comprehension",synthetic:false,types:["rustpython_parser::ast::Comprehension"]},{text:"impl Debug for Keyword",synthetic:false,types:["rustpython_parser::ast::Keyword"]},{text:"impl Debug for ExceptHandler",synthetic:false,types:["rustpython_parser::ast::ExceptHandler"]},{text:"impl Debug for Operator",synthetic:false,types:["rustpython_parser::ast::Operator"]},{text:"impl Debug for BooleanOperator",synthetic:false,types:["rustpython_parser::ast::BooleanOperator"]},{text:"impl Debug for UnaryOperator",synthetic:false,types:["rustpython_parser::ast::UnaryOperator"]},{text:"impl Debug for Comparison",synthetic:false,types:["rustpython_parser::ast::Comparison"]},{text:"impl Debug for Number",synthetic:false,types:["rustpython_parser::ast::Number"]},{text:"impl Debug for StringGroup",synthetic:false,types:["rustpython_parser::ast::StringGroup"]},{text:"impl Debug for ParseError",synthetic:false,types:["rustpython_parser::error::ParseError"]},{text:"impl Debug for LexicalError",synthetic:false,types:["rustpython_parser::lexer::LexicalError"]},{text:"impl Debug for Location",synthetic:false,types:["rustpython_parser::lexer::Location"]},{text:"impl Debug for FStringError",synthetic:false,types:["rustpython_parser::parser::FStringError"]},{text:"impl Debug for Tok",synthetic:false,types:["rustpython_parser::token::Tok"]},]; -implementors["rustpython_vm"] = [{text:"impl Debug for FunctionOpArg",synthetic:false,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl Debug for Instruction",synthetic:false,types:["rustpython_vm::bytecode::Instruction"]},{text:"impl Debug for CallType",synthetic:false,types:["rustpython_vm::bytecode::CallType"]},{text:"impl Debug for Constant",synthetic:false,types:["rustpython_vm::bytecode::Constant"]},{text:"impl Debug for ComparisonOperator",synthetic:false,types:["rustpython_vm::bytecode::ComparisonOperator"]},{text:"impl Debug for BinaryOperator",synthetic:false,types:["rustpython_vm::bytecode::BinaryOperator"]},{text:"impl Debug for UnaryOperator",synthetic:false,types:["rustpython_vm::bytecode::UnaryOperator"]},{text:"impl Debug for CodeObject",synthetic:false,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl Debug for CompileError",synthetic:false,types:["rustpython_vm::error::CompileError"]},{text:"impl Debug for FormatAlign",synthetic:false,types:["rustpython_vm::format::FormatAlign"]},{text:"impl Debug for FormatSign",synthetic:false,types:["rustpython_vm::format::FormatSign"]},{text:"impl Debug for FormatGrouping",synthetic:false,types:["rustpython_vm::format::FormatGrouping"]},{text:"impl Debug for FormatType",synthetic:false,types:["rustpython_vm::format::FormatType"]},{text:"impl Debug for FormatSpec",synthetic:false,types:["rustpython_vm::format::FormatSpec"]},{text:"impl Debug for FormatParseError",synthetic:false,types:["rustpython_vm::format::FormatParseError"]},{text:"impl Debug for FormatPart",synthetic:false,types:["rustpython_vm::format::FormatPart"]},{text:"impl Debug for FormatString",synthetic:false,types:["rustpython_vm::format::FormatString"]},{text:"impl Debug for RangeType",synthetic:false,types:["rustpython_vm::obj::objrange::RangeType"]},{text:"impl Debug for PyContext",synthetic:false,types:["rustpython_vm::pyobject::PyContext"]},{text:"impl Debug for Scope",synthetic:false,types:["rustpython_vm::pyobject::Scope"]},{text:"impl Debug for PyObject",synthetic:false,types:["rustpython_vm::pyobject::PyObject"]},{text:"impl Debug for PyFuncArgs",synthetic:false,types:["rustpython_vm::pyobject::PyFuncArgs"]},{text:"impl Debug for PyObjectPayload",synthetic:false,types:["rustpython_vm::pyobject::PyObjectPayload"]},]; +implementors["rustpython_parser"] = [{text:"impl Debug for Top",synthetic:false,types:["rustpython_parser::ast::Top"]},{text:"impl Debug for Program",synthetic:false,types:["rustpython_parser::ast::Program"]},{text:"impl Debug for SingleImport",synthetic:false,types:["rustpython_parser::ast::SingleImport"]},{text:"impl<T: Debug> Debug for Located<T>",synthetic:false,types:["rustpython_parser::ast::Located"]},{text:"impl Debug for Statement",synthetic:false,types:["rustpython_parser::ast::Statement"]},{text:"impl Debug for WithItem",synthetic:false,types:["rustpython_parser::ast::WithItem"]},{text:"impl Debug for Expression",synthetic:false,types:["rustpython_parser::ast::Expression"]},{text:"impl Debug for Parameters",synthetic:false,types:["rustpython_parser::ast::Parameters"]},{text:"impl Debug for Parameter",synthetic:false,types:["rustpython_parser::ast::Parameter"]},{text:"impl Debug for ComprehensionKind",synthetic:false,types:["rustpython_parser::ast::ComprehensionKind"]},{text:"impl Debug for Comprehension",synthetic:false,types:["rustpython_parser::ast::Comprehension"]},{text:"impl Debug for Keyword",synthetic:false,types:["rustpython_parser::ast::Keyword"]},{text:"impl Debug for ExceptHandler",synthetic:false,types:["rustpython_parser::ast::ExceptHandler"]},{text:"impl Debug for Operator",synthetic:false,types:["rustpython_parser::ast::Operator"]},{text:"impl Debug for BooleanOperator",synthetic:false,types:["rustpython_parser::ast::BooleanOperator"]},{text:"impl Debug for UnaryOperator",synthetic:false,types:["rustpython_parser::ast::UnaryOperator"]},{text:"impl Debug for Comparison",synthetic:false,types:["rustpython_parser::ast::Comparison"]},{text:"impl Debug for Number",synthetic:false,types:["rustpython_parser::ast::Number"]},{text:"impl Debug for ConversionFlag",synthetic:false,types:["rustpython_parser::ast::ConversionFlag"]},{text:"impl Debug for StringGroup",synthetic:false,types:["rustpython_parser::ast::StringGroup"]},{text:"impl Debug for Varargs",synthetic:false,types:["rustpython_parser::ast::Varargs"]},{text:"impl Debug for ParseError",synthetic:false,types:["rustpython_parser::error::ParseError"]},{text:"impl Debug for LexicalError",synthetic:false,types:["rustpython_parser::lexer::LexicalError"]},{text:"impl Debug for Location",synthetic:false,types:["rustpython_parser::lexer::Location"]},{text:"impl Debug for Tok",synthetic:false,types:["rustpython_parser::token::Tok"]},]; +implementors["rustpython_vm"] = [{text:"impl Debug for FunctionOpArg",synthetic:false,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl Debug for Instruction",synthetic:false,types:["rustpython_vm::bytecode::Instruction"]},{text:"impl Debug for CallType",synthetic:false,types:["rustpython_vm::bytecode::CallType"]},{text:"impl Debug for Constant",synthetic:false,types:["rustpython_vm::bytecode::Constant"]},{text:"impl Debug for ComparisonOperator",synthetic:false,types:["rustpython_vm::bytecode::ComparisonOperator"]},{text:"impl Debug for BinaryOperator",synthetic:false,types:["rustpython_vm::bytecode::BinaryOperator"]},{text:"impl Debug for UnaryOperator",synthetic:false,types:["rustpython_vm::bytecode::UnaryOperator"]},{text:"impl Debug for Varargs",synthetic:false,types:["rustpython_vm::bytecode::Varargs"]},{text:"impl Debug for CodeObject",synthetic:false,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl Debug for CompileError",synthetic:false,types:["rustpython_vm::error::CompileError"]},{text:"impl Debug for FormatAlign",synthetic:false,types:["rustpython_vm::format::FormatAlign"]},{text:"impl Debug for FormatSign",synthetic:false,types:["rustpython_vm::format::FormatSign"]},{text:"impl Debug for FormatGrouping",synthetic:false,types:["rustpython_vm::format::FormatGrouping"]},{text:"impl Debug for FormatType",synthetic:false,types:["rustpython_vm::format::FormatType"]},{text:"impl Debug for FormatSpec",synthetic:false,types:["rustpython_vm::format::FormatSpec"]},{text:"impl Debug for FormatParseError",synthetic:false,types:["rustpython_vm::format::FormatParseError"]},{text:"impl Debug for FormatPart",synthetic:false,types:["rustpython_vm::format::FormatPart"]},{text:"impl Debug for FormatString",synthetic:false,types:["rustpython_vm::format::FormatString"]},{text:"impl Debug for Scope",synthetic:false,types:["rustpython_vm::frame::Scope"]},{text:"impl Debug for Frame",synthetic:false,types:["rustpython_vm::frame::Frame"]},{text:"impl Debug for PyFuncArgs",synthetic:false,types:["rustpython_vm::function::PyFuncArgs"]},{text:"impl Debug for PyBuiltinFunction",synthetic:false,types:["rustpython_vm::obj::objbuiltinfunc::PyBuiltinFunction"]},{text:"impl Debug for PyByteArray",synthetic:false,types:["rustpython_vm::obj::objbytearray::PyByteArray"]},{text:"impl Debug for PyBytes",synthetic:false,types:["rustpython_vm::obj::objbytes::PyBytes"]},{text:"impl Debug for PyClassMethod",synthetic:false,types:["rustpython_vm::obj::objclassmethod::PyClassMethod"]},{text:"impl Debug for PyCode",synthetic:false,types:["rustpython_vm::obj::objcode::PyCode"]},{text:"impl Debug for PyComplex",synthetic:false,types:["rustpython_vm::obj::objcomplex::PyComplex"]},{text:"impl Debug for PyDict",synthetic:false,types:["rustpython_vm::obj::objdict::PyDict"]},{text:"impl Debug for PyEnumerate",synthetic:false,types:["rustpython_vm::obj::objenumerate::PyEnumerate"]},{text:"impl Debug for PyFilter",synthetic:false,types:["rustpython_vm::obj::objfilter::PyFilter"]},{text:"impl Debug for PyFloat",synthetic:false,types:["rustpython_vm::obj::objfloat::PyFloat"]},{text:"impl Debug for PyFunction",synthetic:false,types:["rustpython_vm::obj::objfunction::PyFunction"]},{text:"impl Debug for PyMethod",synthetic:false,types:["rustpython_vm::obj::objfunction::PyMethod"]},{text:"impl Debug for PyGenerator",synthetic:false,types:["rustpython_vm::obj::objgenerator::PyGenerator"]},{text:"impl Debug for PyInt",synthetic:false,types:["rustpython_vm::obj::objint::PyInt"]},{text:"impl Debug for PyList",synthetic:false,types:["rustpython_vm::obj::objlist::PyList"]},{text:"impl Debug for PyMap",synthetic:false,types:["rustpython_vm::obj::objmap::PyMap"]},{text:"impl Debug for PyMemoryView",synthetic:false,types:["rustpython_vm::obj::objmemory::PyMemoryView"]},{text:"impl Debug for PyModule",synthetic:false,types:["rustpython_vm::obj::objmodule::PyModule"]},{text:"impl Debug for PyNone",synthetic:false,types:["rustpython_vm::obj::objnone::PyNone"]},{text:"impl Debug for PyInstance",synthetic:false,types:["rustpython_vm::obj::objobject::PyInstance"]},{text:"impl Debug for PyReadOnlyProperty",synthetic:false,types:["rustpython_vm::obj::objproperty::PyReadOnlyProperty"]},{text:"impl Debug for PyProperty",synthetic:false,types:["rustpython_vm::obj::objproperty::PyProperty"]},{text:"impl Debug for PyRange",synthetic:false,types:["rustpython_vm::obj::objrange::PyRange"]},{text:"impl Debug for PySet",synthetic:false,types:["rustpython_vm::obj::objset::PySet"]},{text:"impl Debug for PySlice",synthetic:false,types:["rustpython_vm::obj::objslice::PySlice"]},{text:"impl Debug for PyStaticMethod",synthetic:false,types:["rustpython_vm::obj::objstaticmethod::PyStaticMethod"]},{text:"impl Debug for PyString",synthetic:false,types:["rustpython_vm::obj::objstr::PyString"]},{text:"impl Debug for PySuper",synthetic:false,types:["rustpython_vm::obj::objsuper::PySuper"]},{text:"impl Debug for PyTuple",synthetic:false,types:["rustpython_vm::obj::objtuple::PyTuple"]},{text:"impl Debug for PyClass",synthetic:false,types:["rustpython_vm::obj::objtype::PyClass"]},{text:"impl Debug for PyWeak",synthetic:false,types:["rustpython_vm::obj::objweakref::PyWeak"]},{text:"impl Debug for PyZip",synthetic:false,types:["rustpython_vm::obj::objzip::PyZip"]},{text:"impl Debug for PyContext",synthetic:false,types:["rustpython_vm::pyobject::PyContext"]},{text:"impl Debug for PyNotImplemented",synthetic:false,types:["rustpython_vm::pyobject::PyNotImplemented"]},{text:"impl Debug for PyEllipsis",synthetic:false,types:["rustpython_vm::pyobject::PyEllipsis"]},{text:"impl<T: Debug> Debug for PyRef<T>",synthetic:false,types:["rustpython_vm::pyobject::PyRef"]},{text:"impl Debug for PyObject",synthetic:false,types:["rustpython_vm::pyobject::PyObject"]},{text:"impl Debug for PyIteratorValue",synthetic:false,types:["rustpython_vm::pyobject::PyIteratorValue"]},{text:"impl Debug for Socket",synthetic:false,types:["rustpython_vm::stdlib::socket::Socket"]},]; +implementors["rustpython_wasm"] = [{text:"impl Debug for PyPromise",synthetic:false,types:["rustpython_wasm::browser_module::PyPromise"]},]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/implementors/core/fmt/trait.Display.js b/implementors/core/fmt/trait.Display.js index 878be06..edad5bd 100644 --- a/implementors/core/fmt/trait.Display.js +++ b/implementors/core/fmt/trait.Display.js @@ -1,6 +1,6 @@ (function() {var implementors = {}; implementors["rustpython_parser"] = [{text:"impl Display for ParseError",synthetic:false,types:["rustpython_parser::error::ParseError"]},]; -implementors["rustpython_vm"] = [{text:"impl Display for CodeObject",synthetic:false,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl Display for Constant",synthetic:false,types:["rustpython_vm::bytecode::Constant"]},{text:"impl Display for CompileError",synthetic:false,types:["rustpython_vm::error::CompileError"]},{text:"impl Display for PyObject",synthetic:false,types:["rustpython_vm::pyobject::PyObject"]},]; +implementors["rustpython_vm"] = [{text:"impl Display for CodeObject",synthetic:false,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl Display for Constant",synthetic:false,types:["rustpython_vm::bytecode::Constant"]},{text:"impl Display for CompileError",synthetic:false,types:["rustpython_vm::error::CompileError"]},{text:"impl Display for PyString",synthetic:false,types:["rustpython_vm::obj::objstr::PyString"]},{text:"impl Display for PyClass",synthetic:false,types:["rustpython_vm::obj::objtype::PyClass"]},{text:"impl Display for PyObject",synthetic:false,types:["rustpython_vm::pyobject::PyObject"]},{text:"impl<T: Display> Display for PyRef<T> where
    T: PyValue + Display
",synthetic:false,types:["rustpython_vm::pyobject::PyRef"]},]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/implementors/core/iter/iterator/trait.Iterator.js b/implementors/core/iter/iterator/trait.Iterator.js index 460300e..971dc72 100644 --- a/implementors/core/iter/iterator/trait.Iterator.js +++ b/implementors/core/iter/iterator/trait.Iterator.js @@ -1,5 +1,6 @@ (function() {var implementors = {}; implementors["rustpython_parser"] = [{text:"impl<T> Iterator for NewlineHandler<T> where
    T: Iterator<Item = char>, 
",synthetic:false,types:["rustpython_parser::lexer::NewlineHandler"]},{text:"impl<T> Iterator for LineContinationHandler<T> where
    T: Iterator<Item = char>, 
",synthetic:false,types:["rustpython_parser::lexer::LineContinationHandler"]},{text:"impl<T> Iterator for Lexer<T> where
    T: Iterator<Item = char>, 
",synthetic:false,types:["rustpython_parser::lexer::Lexer"]},]; +implementors["rustpython_vm"] = [{text:"impl<'a, T> Iterator for PyIterator<'a, T> where
    T: TryFromObject
",synthetic:false,types:["rustpython_vm::pyobject::PyIterator"]},]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/implementors/core/iter/traits/trait.IntoIterator.js b/implementors/core/iter/traits/trait.IntoIterator.js new file mode 100644 index 0000000..50cfa97 --- /dev/null +++ b/implementors/core/iter/traits/trait.IntoIterator.js @@ -0,0 +1,10 @@ +(function() {var implementors = {}; +implementors["rustpython_vm"] = [{text:"impl<T> IntoIterator for Args<T>",synthetic:false,types:["rustpython_vm::function::Args"]},]; + + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } + +})() diff --git a/implementors/core/marker/trait.Copy.js b/implementors/core/marker/trait.Copy.js index 6310e3c..b6750b5 100644 --- a/implementors/core/marker/trait.Copy.js +++ b/implementors/core/marker/trait.Copy.js @@ -1,5 +1,6 @@ (function() {var implementors = {}; -implementors["rustpython_vm"] = [{text:"impl Copy for FunctionOpArg",synthetic:false,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl Copy for FormatAlign",synthetic:false,types:["rustpython_vm::format::FormatAlign"]},{text:"impl Copy for FormatSign",synthetic:false,types:["rustpython_vm::format::FormatSign"]},]; +implementors["rustpython_parser"] = [{text:"impl Copy for ConversionFlag",synthetic:false,types:["rustpython_parser::ast::ConversionFlag"]},]; +implementors["rustpython_vm"] = [{text:"impl Copy for FunctionOpArg",synthetic:false,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl Copy for FormatAlign",synthetic:false,types:["rustpython_vm::format::FormatAlign"]},{text:"impl Copy for FormatSign",synthetic:false,types:["rustpython_vm::format::FormatSign"]},{text:"impl Copy for PyComplex",synthetic:false,types:["rustpython_vm::obj::objcomplex::PyComplex"]},{text:"impl Copy for PyFloat",synthetic:false,types:["rustpython_vm::obj::objfloat::PyFloat"]},]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/implementors/core/marker/trait.Send.js b/implementors/core/marker/trait.Send.js index 50cdfe6..32dd775 100644 --- a/implementors/core/marker/trait.Send.js +++ b/implementors/core/marker/trait.Send.js @@ -1,7 +1,7 @@ (function() {var implementors = {}; -implementors["rustpython_parser"] = [{text:"impl Send for Program",synthetic:true,types:["rustpython_parser::ast::Program"]},{text:"impl Send for SingleImport",synthetic:true,types:["rustpython_parser::ast::SingleImport"]},{text:"impl<T> Send for Located<T> where
    T: Send
",synthetic:true,types:["rustpython_parser::ast::Located"]},{text:"impl Send for WithItem",synthetic:true,types:["rustpython_parser::ast::WithItem"]},{text:"impl Send for Parameters",synthetic:true,types:["rustpython_parser::ast::Parameters"]},{text:"impl Send for Comprehension",synthetic:true,types:["rustpython_parser::ast::Comprehension"]},{text:"impl Send for Keyword",synthetic:true,types:["rustpython_parser::ast::Keyword"]},{text:"impl Send for ExceptHandler",synthetic:true,types:["rustpython_parser::ast::ExceptHandler"]},{text:"impl Send for Top",synthetic:true,types:["rustpython_parser::ast::Top"]},{text:"impl Send for Statement",synthetic:true,types:["rustpython_parser::ast::Statement"]},{text:"impl Send for Expression",synthetic:true,types:["rustpython_parser::ast::Expression"]},{text:"impl Send for ComprehensionKind",synthetic:true,types:["rustpython_parser::ast::ComprehensionKind"]},{text:"impl Send for Operator",synthetic:true,types:["rustpython_parser::ast::Operator"]},{text:"impl Send for BooleanOperator",synthetic:true,types:["rustpython_parser::ast::BooleanOperator"]},{text:"impl Send for UnaryOperator",synthetic:true,types:["rustpython_parser::ast::UnaryOperator"]},{text:"impl Send for Comparison",synthetic:true,types:["rustpython_parser::ast::Comparison"]},{text:"impl Send for Number",synthetic:true,types:["rustpython_parser::ast::Number"]},{text:"impl Send for StringGroup",synthetic:true,types:["rustpython_parser::ast::StringGroup"]},{text:"impl Send for ParseError",synthetic:true,types:["rustpython_parser::error::ParseError"]},{text:"impl<T> Send for Lexer<T> where
    T: Send
",synthetic:true,types:["rustpython_parser::lexer::Lexer"]},{text:"impl Send for Location",synthetic:true,types:["rustpython_parser::lexer::Location"]},{text:"impl<T> Send for NewlineHandler<T> where
    T: Send
",synthetic:true,types:["rustpython_parser::lexer::NewlineHandler"]},{text:"impl<T> Send for LineContinationHandler<T> where
    T: Send
",synthetic:true,types:["rustpython_parser::lexer::LineContinationHandler"]},{text:"impl Send for LexicalError",synthetic:true,types:["rustpython_parser::lexer::LexicalError"]},{text:"impl Send for FStringError",synthetic:true,types:["rustpython_parser::parser::FStringError"]},{text:"impl Send for Tok",synthetic:true,types:["rustpython_parser::token::Tok"]},]; -implementors["rustpython_vm"] = [{text:"impl !Send for VirtualMachine",synthetic:true,types:["rustpython_vm::vm::VirtualMachine"]},{text:"impl Send for CodeObject",synthetic:true,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl Send for FunctionOpArg",synthetic:true,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl Send for Instruction",synthetic:true,types:["rustpython_vm::bytecode::Instruction"]},{text:"impl Send for CallType",synthetic:true,types:["rustpython_vm::bytecode::CallType"]},{text:"impl Send for Constant",synthetic:true,types:["rustpython_vm::bytecode::Constant"]},{text:"impl Send for ComparisonOperator",synthetic:true,types:["rustpython_vm::bytecode::ComparisonOperator"]},{text:"impl Send for BinaryOperator",synthetic:true,types:["rustpython_vm::bytecode::BinaryOperator"]},{text:"impl Send for UnaryOperator",synthetic:true,types:["rustpython_vm::bytecode::UnaryOperator"]},{text:"impl Send for Mode",synthetic:true,types:["rustpython_vm::compile::Mode"]},{text:"impl Send for CompileError",synthetic:true,types:["rustpython_vm::error::CompileError"]},{text:"impl Send for FormatSpec",synthetic:true,types:["rustpython_vm::format::FormatSpec"]},{text:"impl Send for FormatString",synthetic:true,types:["rustpython_vm::format::FormatString"]},{text:"impl Send for FormatAlign",synthetic:true,types:["rustpython_vm::format::FormatAlign"]},{text:"impl Send for FormatSign",synthetic:true,types:["rustpython_vm::format::FormatSign"]},{text:"impl Send for FormatGrouping",synthetic:true,types:["rustpython_vm::format::FormatGrouping"]},{text:"impl Send for FormatType",synthetic:true,types:["rustpython_vm::format::FormatType"]},{text:"impl Send for FormatParseError",synthetic:true,types:["rustpython_vm::format::FormatParseError"]},{text:"impl Send for FormatPart",synthetic:true,types:["rustpython_vm::format::FormatPart"]},{text:"impl Send for RangeType",synthetic:true,types:["rustpython_vm::obj::objrange::RangeType"]},{text:"impl !Send for PyContext",synthetic:true,types:["rustpython_vm::pyobject::PyContext"]},{text:"impl !Send for Scope",synthetic:true,types:["rustpython_vm::pyobject::Scope"]},{text:"impl !Send for PyObject",synthetic:true,types:["rustpython_vm::pyobject::PyObject"]},{text:"impl !Send for PyFuncArgs",synthetic:true,types:["rustpython_vm::pyobject::PyFuncArgs"]},{text:"impl !Send for PyObjectPayload",synthetic:true,types:["rustpython_vm::pyobject::PyObjectPayload"]},]; -implementors["rustpython_wasm"] = [{text:"impl Send for VMStore",synthetic:true,types:["rustpython_wasm::vm_class::VMStore"]},{text:"impl !Send for AccessibleVM",synthetic:true,types:["rustpython_wasm::vm_class::AccessibleVM"]},{text:"impl<'a> !Send for AccessibleVMPtr<'a>",synthetic:true,types:["rustpython_wasm::vm_class::AccessibleVMPtr"]},{text:"impl Send for WASMVirtualMachine",synthetic:true,types:["rustpython_wasm::vm_class::WASMVirtualMachine"]},]; +implementors["rustpython_parser"] = [{text:"impl Send for Program",synthetic:true,types:["rustpython_parser::ast::Program"]},{text:"impl Send for SingleImport",synthetic:true,types:["rustpython_parser::ast::SingleImport"]},{text:"impl<T> Send for Located<T> where
    T: Send
",synthetic:true,types:["rustpython_parser::ast::Located"]},{text:"impl Send for WithItem",synthetic:true,types:["rustpython_parser::ast::WithItem"]},{text:"impl Send for Parameters",synthetic:true,types:["rustpython_parser::ast::Parameters"]},{text:"impl Send for Parameter",synthetic:true,types:["rustpython_parser::ast::Parameter"]},{text:"impl Send for Comprehension",synthetic:true,types:["rustpython_parser::ast::Comprehension"]},{text:"impl Send for Keyword",synthetic:true,types:["rustpython_parser::ast::Keyword"]},{text:"impl Send for ExceptHandler",synthetic:true,types:["rustpython_parser::ast::ExceptHandler"]},{text:"impl Send for Top",synthetic:true,types:["rustpython_parser::ast::Top"]},{text:"impl Send for Statement",synthetic:true,types:["rustpython_parser::ast::Statement"]},{text:"impl Send for Expression",synthetic:true,types:["rustpython_parser::ast::Expression"]},{text:"impl Send for ComprehensionKind",synthetic:true,types:["rustpython_parser::ast::ComprehensionKind"]},{text:"impl Send for Operator",synthetic:true,types:["rustpython_parser::ast::Operator"]},{text:"impl Send for BooleanOperator",synthetic:true,types:["rustpython_parser::ast::BooleanOperator"]},{text:"impl Send for UnaryOperator",synthetic:true,types:["rustpython_parser::ast::UnaryOperator"]},{text:"impl Send for Comparison",synthetic:true,types:["rustpython_parser::ast::Comparison"]},{text:"impl Send for Number",synthetic:true,types:["rustpython_parser::ast::Number"]},{text:"impl Send for ConversionFlag",synthetic:true,types:["rustpython_parser::ast::ConversionFlag"]},{text:"impl Send for StringGroup",synthetic:true,types:["rustpython_parser::ast::StringGroup"]},{text:"impl Send for Varargs",synthetic:true,types:["rustpython_parser::ast::Varargs"]},{text:"impl Send for ParseError",synthetic:true,types:["rustpython_parser::error::ParseError"]},{text:"impl<T> Send for Lexer<T> where
    T: Send
",synthetic:true,types:["rustpython_parser::lexer::Lexer"]},{text:"impl Send for Location",synthetic:true,types:["rustpython_parser::lexer::Location"]},{text:"impl<T> Send for NewlineHandler<T> where
    T: Send
",synthetic:true,types:["rustpython_parser::lexer::NewlineHandler"]},{text:"impl<T> Send for LineContinationHandler<T> where
    T: Send
",synthetic:true,types:["rustpython_parser::lexer::LineContinationHandler"]},{text:"impl Send for LexicalError",synthetic:true,types:["rustpython_parser::lexer::LexicalError"]},{text:"impl Send for Tok",synthetic:true,types:["rustpython_parser::token::Tok"]},]; +implementors["rustpython_vm"] = [{text:"impl !Send for VirtualMachine",synthetic:true,types:["rustpython_vm::vm::VirtualMachine"]},{text:"impl Send for CodeObject",synthetic:true,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl Send for FunctionOpArg",synthetic:true,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl Send for Instruction",synthetic:true,types:["rustpython_vm::bytecode::Instruction"]},{text:"impl Send for CallType",synthetic:true,types:["rustpython_vm::bytecode::CallType"]},{text:"impl Send for Constant",synthetic:true,types:["rustpython_vm::bytecode::Constant"]},{text:"impl Send for ComparisonOperator",synthetic:true,types:["rustpython_vm::bytecode::ComparisonOperator"]},{text:"impl Send for BinaryOperator",synthetic:true,types:["rustpython_vm::bytecode::BinaryOperator"]},{text:"impl Send for UnaryOperator",synthetic:true,types:["rustpython_vm::bytecode::UnaryOperator"]},{text:"impl Send for Varargs",synthetic:true,types:["rustpython_vm::bytecode::Varargs"]},{text:"impl Send for Mode",synthetic:true,types:["rustpython_vm::compile::Mode"]},{text:"impl Send for CompileError",synthetic:true,types:["rustpython_vm::error::CompileError"]},{text:"impl Send for FormatSpec",synthetic:true,types:["rustpython_vm::format::FormatSpec"]},{text:"impl Send for FormatString",synthetic:true,types:["rustpython_vm::format::FormatString"]},{text:"impl Send for FormatAlign",synthetic:true,types:["rustpython_vm::format::FormatAlign"]},{text:"impl Send for FormatSign",synthetic:true,types:["rustpython_vm::format::FormatSign"]},{text:"impl Send for FormatGrouping",synthetic:true,types:["rustpython_vm::format::FormatGrouping"]},{text:"impl Send for FormatType",synthetic:true,types:["rustpython_vm::format::FormatType"]},{text:"impl Send for FormatParseError",synthetic:true,types:["rustpython_vm::format::FormatParseError"]},{text:"impl Send for FormatPart",synthetic:true,types:["rustpython_vm::format::FormatPart"]},{text:"impl !Send for Scope",synthetic:true,types:["rustpython_vm::frame::Scope"]},{text:"impl !Send for Frame",synthetic:true,types:["rustpython_vm::frame::Frame"]},{text:"impl !Send for ExecutionResult",synthetic:true,types:["rustpython_vm::frame::ExecutionResult"]},{text:"impl !Send for PyFuncArgs",synthetic:true,types:["rustpython_vm::function::PyFuncArgs"]},{text:"impl<T> Send for KwArgs<T> where
    T: Send
",synthetic:true,types:["rustpython_vm::function::KwArgs"]},{text:"impl<T> Send for Args<T> where
    T: Send
",synthetic:true,types:["rustpython_vm::function::Args"]},{text:"impl !Send for ArgumentError",synthetic:true,types:["rustpython_vm::function::ArgumentError"]},{text:"impl<T> Send for OptionalArg<T> where
    T: Send
",synthetic:true,types:["rustpython_vm::function::OptionalArg"]},{text:"impl !Send for PyBuiltinFunction",synthetic:true,types:["rustpython_vm::obj::objbuiltinfunc::PyBuiltinFunction"]},{text:"impl Send for PyByteArray",synthetic:true,types:["rustpython_vm::obj::objbytearray::PyByteArray"]},{text:"impl Send for PyBytes",synthetic:true,types:["rustpython_vm::obj::objbytes::PyBytes"]},{text:"impl !Send for PyClassMethod",synthetic:true,types:["rustpython_vm::obj::objclassmethod::PyClassMethod"]},{text:"impl Send for PyCode",synthetic:true,types:["rustpython_vm::obj::objcode::PyCode"]},{text:"impl Send for PyComplex",synthetic:true,types:["rustpython_vm::obj::objcomplex::PyComplex"]},{text:"impl !Send for PyDict",synthetic:true,types:["rustpython_vm::obj::objdict::PyDict"]},{text:"impl !Send for PyEnumerate",synthetic:true,types:["rustpython_vm::obj::objenumerate::PyEnumerate"]},{text:"impl !Send for PyFilter",synthetic:true,types:["rustpython_vm::obj::objfilter::PyFilter"]},{text:"impl Send for PyFloat",synthetic:true,types:["rustpython_vm::obj::objfloat::PyFloat"]},{text:"impl !Send for PyFunction",synthetic:true,types:["rustpython_vm::obj::objfunction::PyFunction"]},{text:"impl !Send for PyMethod",synthetic:true,types:["rustpython_vm::obj::objfunction::PyMethod"]},{text:"impl !Send for PyGenerator",synthetic:true,types:["rustpython_vm::obj::objgenerator::PyGenerator"]},{text:"impl Send for PyInt",synthetic:true,types:["rustpython_vm::obj::objint::PyInt"]},{text:"impl !Send for PyList",synthetic:true,types:["rustpython_vm::obj::objlist::PyList"]},{text:"impl !Send for PyMap",synthetic:true,types:["rustpython_vm::obj::objmap::PyMap"]},{text:"impl !Send for PyMemoryView",synthetic:true,types:["rustpython_vm::obj::objmemory::PyMemoryView"]},{text:"impl !Send for PyModule",synthetic:true,types:["rustpython_vm::obj::objmodule::PyModule"]},{text:"impl Send for PyNone",synthetic:true,types:["rustpython_vm::obj::objnone::PyNone"]},{text:"impl Send for PyInstance",synthetic:true,types:["rustpython_vm::obj::objobject::PyInstance"]},{text:"impl !Send for PyReadOnlyProperty",synthetic:true,types:["rustpython_vm::obj::objproperty::PyReadOnlyProperty"]},{text:"impl !Send for PyProperty",synthetic:true,types:["rustpython_vm::obj::objproperty::PyProperty"]},{text:"impl<'a> !Send for PropertyBuilder<'a>",synthetic:true,types:["rustpython_vm::obj::objproperty::PropertyBuilder"]},{text:"impl Send for PyRange",synthetic:true,types:["rustpython_vm::obj::objrange::PyRange"]},{text:"impl !Send for PySet",synthetic:true,types:["rustpython_vm::obj::objset::PySet"]},{text:"impl Send for PySlice",synthetic:true,types:["rustpython_vm::obj::objslice::PySlice"]},{text:"impl !Send for PyStaticMethod",synthetic:true,types:["rustpython_vm::obj::objstaticmethod::PyStaticMethod"]},{text:"impl Send for PyString",synthetic:true,types:["rustpython_vm::obj::objstr::PyString"]},{text:"impl !Send for PySuper",synthetic:true,types:["rustpython_vm::obj::objsuper::PySuper"]},{text:"impl !Send for PyTuple",synthetic:true,types:["rustpython_vm::obj::objtuple::PyTuple"]},{text:"impl !Send for PyClass",synthetic:true,types:["rustpython_vm::obj::objtype::PyClass"]},{text:"impl !Send for PyWeak",synthetic:true,types:["rustpython_vm::obj::objweakref::PyWeak"]},{text:"impl !Send for PyZip",synthetic:true,types:["rustpython_vm::obj::objzip::PyZip"]},{text:"impl !Send for PyContext",synthetic:true,types:["rustpython_vm::pyobject::PyContext"]},{text:"impl Send for PyNotImplemented",synthetic:true,types:["rustpython_vm::pyobject::PyNotImplemented"]},{text:"impl Send for PyEllipsis",synthetic:true,types:["rustpython_vm::pyobject::PyEllipsis"]},{text:"impl !Send for PyObject",synthetic:true,types:["rustpython_vm::pyobject::PyObject"]},{text:"impl<T> !Send for PyRef<T>",synthetic:true,types:["rustpython_vm::pyobject::PyRef"]},{text:"impl<T = Rc<PyObject>> !Send for PyIterable<T>",synthetic:true,types:["rustpython_vm::pyobject::PyIterable"]},{text:"impl<'a, T> !Send for PyIterator<'a, T>",synthetic:true,types:["rustpython_vm::pyobject::PyIterator"]},{text:"impl !Send for PyIteratorValue",synthetic:true,types:["rustpython_vm::pyobject::PyIteratorValue"]},{text:"impl Send for Socket",synthetic:true,types:["rustpython_vm::stdlib::socket::Socket"]},]; +implementors["rustpython_wasm"] = [{text:"impl !Send for PyPromise",synthetic:true,types:["rustpython_wasm::browser_module::PyPromise"]},{text:"impl Send for VMStore",synthetic:true,types:["rustpython_wasm::vm_class::VMStore"]},{text:"impl Send for WASMVirtualMachine",synthetic:true,types:["rustpython_wasm::vm_class::WASMVirtualMachine"]},]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/implementors/core/marker/trait.Sync.js b/implementors/core/marker/trait.Sync.js index 4c8175e..a742cf9 100644 --- a/implementors/core/marker/trait.Sync.js +++ b/implementors/core/marker/trait.Sync.js @@ -1,7 +1,7 @@ (function() {var implementors = {}; -implementors["rustpython_parser"] = [{text:"impl Sync for Program",synthetic:true,types:["rustpython_parser::ast::Program"]},{text:"impl Sync for SingleImport",synthetic:true,types:["rustpython_parser::ast::SingleImport"]},{text:"impl<T> Sync for Located<T> where
    T: Sync
",synthetic:true,types:["rustpython_parser::ast::Located"]},{text:"impl Sync for WithItem",synthetic:true,types:["rustpython_parser::ast::WithItem"]},{text:"impl Sync for Parameters",synthetic:true,types:["rustpython_parser::ast::Parameters"]},{text:"impl Sync for Comprehension",synthetic:true,types:["rustpython_parser::ast::Comprehension"]},{text:"impl Sync for Keyword",synthetic:true,types:["rustpython_parser::ast::Keyword"]},{text:"impl Sync for ExceptHandler",synthetic:true,types:["rustpython_parser::ast::ExceptHandler"]},{text:"impl Sync for Top",synthetic:true,types:["rustpython_parser::ast::Top"]},{text:"impl Sync for Statement",synthetic:true,types:["rustpython_parser::ast::Statement"]},{text:"impl Sync for Expression",synthetic:true,types:["rustpython_parser::ast::Expression"]},{text:"impl Sync for ComprehensionKind",synthetic:true,types:["rustpython_parser::ast::ComprehensionKind"]},{text:"impl Sync for Operator",synthetic:true,types:["rustpython_parser::ast::Operator"]},{text:"impl Sync for BooleanOperator",synthetic:true,types:["rustpython_parser::ast::BooleanOperator"]},{text:"impl Sync for UnaryOperator",synthetic:true,types:["rustpython_parser::ast::UnaryOperator"]},{text:"impl Sync for Comparison",synthetic:true,types:["rustpython_parser::ast::Comparison"]},{text:"impl Sync for Number",synthetic:true,types:["rustpython_parser::ast::Number"]},{text:"impl Sync for StringGroup",synthetic:true,types:["rustpython_parser::ast::StringGroup"]},{text:"impl Sync for ParseError",synthetic:true,types:["rustpython_parser::error::ParseError"]},{text:"impl<T> Sync for Lexer<T> where
    T: Sync
",synthetic:true,types:["rustpython_parser::lexer::Lexer"]},{text:"impl Sync for Location",synthetic:true,types:["rustpython_parser::lexer::Location"]},{text:"impl<T> Sync for NewlineHandler<T> where
    T: Sync
",synthetic:true,types:["rustpython_parser::lexer::NewlineHandler"]},{text:"impl<T> Sync for LineContinationHandler<T> where
    T: Sync
",synthetic:true,types:["rustpython_parser::lexer::LineContinationHandler"]},{text:"impl Sync for LexicalError",synthetic:true,types:["rustpython_parser::lexer::LexicalError"]},{text:"impl Sync for FStringError",synthetic:true,types:["rustpython_parser::parser::FStringError"]},{text:"impl Sync for Tok",synthetic:true,types:["rustpython_parser::token::Tok"]},]; -implementors["rustpython_vm"] = [{text:"impl !Sync for VirtualMachine",synthetic:true,types:["rustpython_vm::vm::VirtualMachine"]},{text:"impl Sync for CodeObject",synthetic:true,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl Sync for FunctionOpArg",synthetic:true,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl Sync for Instruction",synthetic:true,types:["rustpython_vm::bytecode::Instruction"]},{text:"impl Sync for CallType",synthetic:true,types:["rustpython_vm::bytecode::CallType"]},{text:"impl Sync for Constant",synthetic:true,types:["rustpython_vm::bytecode::Constant"]},{text:"impl Sync for ComparisonOperator",synthetic:true,types:["rustpython_vm::bytecode::ComparisonOperator"]},{text:"impl Sync for BinaryOperator",synthetic:true,types:["rustpython_vm::bytecode::BinaryOperator"]},{text:"impl Sync for UnaryOperator",synthetic:true,types:["rustpython_vm::bytecode::UnaryOperator"]},{text:"impl Sync for Mode",synthetic:true,types:["rustpython_vm::compile::Mode"]},{text:"impl Sync for CompileError",synthetic:true,types:["rustpython_vm::error::CompileError"]},{text:"impl Sync for FormatSpec",synthetic:true,types:["rustpython_vm::format::FormatSpec"]},{text:"impl Sync for FormatString",synthetic:true,types:["rustpython_vm::format::FormatString"]},{text:"impl Sync for FormatAlign",synthetic:true,types:["rustpython_vm::format::FormatAlign"]},{text:"impl Sync for FormatSign",synthetic:true,types:["rustpython_vm::format::FormatSign"]},{text:"impl Sync for FormatGrouping",synthetic:true,types:["rustpython_vm::format::FormatGrouping"]},{text:"impl Sync for FormatType",synthetic:true,types:["rustpython_vm::format::FormatType"]},{text:"impl Sync for FormatParseError",synthetic:true,types:["rustpython_vm::format::FormatParseError"]},{text:"impl Sync for FormatPart",synthetic:true,types:["rustpython_vm::format::FormatPart"]},{text:"impl Sync for RangeType",synthetic:true,types:["rustpython_vm::obj::objrange::RangeType"]},{text:"impl !Sync for PyContext",synthetic:true,types:["rustpython_vm::pyobject::PyContext"]},{text:"impl !Sync for Scope",synthetic:true,types:["rustpython_vm::pyobject::Scope"]},{text:"impl !Sync for PyObject",synthetic:true,types:["rustpython_vm::pyobject::PyObject"]},{text:"impl !Sync for PyFuncArgs",synthetic:true,types:["rustpython_vm::pyobject::PyFuncArgs"]},{text:"impl !Sync for PyObjectPayload",synthetic:true,types:["rustpython_vm::pyobject::PyObjectPayload"]},]; -implementors["rustpython_wasm"] = [{text:"impl Sync for VMStore",synthetic:true,types:["rustpython_wasm::vm_class::VMStore"]},{text:"impl !Sync for AccessibleVM",synthetic:true,types:["rustpython_wasm::vm_class::AccessibleVM"]},{text:"impl<'a> !Sync for AccessibleVMPtr<'a>",synthetic:true,types:["rustpython_wasm::vm_class::AccessibleVMPtr"]},{text:"impl Sync for WASMVirtualMachine",synthetic:true,types:["rustpython_wasm::vm_class::WASMVirtualMachine"]},]; +implementors["rustpython_parser"] = [{text:"impl Sync for Program",synthetic:true,types:["rustpython_parser::ast::Program"]},{text:"impl Sync for SingleImport",synthetic:true,types:["rustpython_parser::ast::SingleImport"]},{text:"impl<T> Sync for Located<T> where
    T: Sync
",synthetic:true,types:["rustpython_parser::ast::Located"]},{text:"impl Sync for WithItem",synthetic:true,types:["rustpython_parser::ast::WithItem"]},{text:"impl Sync for Parameters",synthetic:true,types:["rustpython_parser::ast::Parameters"]},{text:"impl Sync for Parameter",synthetic:true,types:["rustpython_parser::ast::Parameter"]},{text:"impl Sync for Comprehension",synthetic:true,types:["rustpython_parser::ast::Comprehension"]},{text:"impl Sync for Keyword",synthetic:true,types:["rustpython_parser::ast::Keyword"]},{text:"impl Sync for ExceptHandler",synthetic:true,types:["rustpython_parser::ast::ExceptHandler"]},{text:"impl Sync for Top",synthetic:true,types:["rustpython_parser::ast::Top"]},{text:"impl Sync for Statement",synthetic:true,types:["rustpython_parser::ast::Statement"]},{text:"impl Sync for Expression",synthetic:true,types:["rustpython_parser::ast::Expression"]},{text:"impl Sync for ComprehensionKind",synthetic:true,types:["rustpython_parser::ast::ComprehensionKind"]},{text:"impl Sync for Operator",synthetic:true,types:["rustpython_parser::ast::Operator"]},{text:"impl Sync for BooleanOperator",synthetic:true,types:["rustpython_parser::ast::BooleanOperator"]},{text:"impl Sync for UnaryOperator",synthetic:true,types:["rustpython_parser::ast::UnaryOperator"]},{text:"impl Sync for Comparison",synthetic:true,types:["rustpython_parser::ast::Comparison"]},{text:"impl Sync for Number",synthetic:true,types:["rustpython_parser::ast::Number"]},{text:"impl Sync for ConversionFlag",synthetic:true,types:["rustpython_parser::ast::ConversionFlag"]},{text:"impl Sync for StringGroup",synthetic:true,types:["rustpython_parser::ast::StringGroup"]},{text:"impl Sync for Varargs",synthetic:true,types:["rustpython_parser::ast::Varargs"]},{text:"impl Sync for ParseError",synthetic:true,types:["rustpython_parser::error::ParseError"]},{text:"impl<T> Sync for Lexer<T> where
    T: Sync
",synthetic:true,types:["rustpython_parser::lexer::Lexer"]},{text:"impl Sync for Location",synthetic:true,types:["rustpython_parser::lexer::Location"]},{text:"impl<T> Sync for NewlineHandler<T> where
    T: Sync
",synthetic:true,types:["rustpython_parser::lexer::NewlineHandler"]},{text:"impl<T> Sync for LineContinationHandler<T> where
    T: Sync
",synthetic:true,types:["rustpython_parser::lexer::LineContinationHandler"]},{text:"impl Sync for LexicalError",synthetic:true,types:["rustpython_parser::lexer::LexicalError"]},{text:"impl Sync for Tok",synthetic:true,types:["rustpython_parser::token::Tok"]},]; +implementors["rustpython_vm"] = [{text:"impl !Sync for VirtualMachine",synthetic:true,types:["rustpython_vm::vm::VirtualMachine"]},{text:"impl Sync for CodeObject",synthetic:true,types:["rustpython_vm::bytecode::CodeObject"]},{text:"impl Sync for FunctionOpArg",synthetic:true,types:["rustpython_vm::bytecode::FunctionOpArg"]},{text:"impl Sync for Instruction",synthetic:true,types:["rustpython_vm::bytecode::Instruction"]},{text:"impl Sync for CallType",synthetic:true,types:["rustpython_vm::bytecode::CallType"]},{text:"impl Sync for Constant",synthetic:true,types:["rustpython_vm::bytecode::Constant"]},{text:"impl Sync for ComparisonOperator",synthetic:true,types:["rustpython_vm::bytecode::ComparisonOperator"]},{text:"impl Sync for BinaryOperator",synthetic:true,types:["rustpython_vm::bytecode::BinaryOperator"]},{text:"impl Sync for UnaryOperator",synthetic:true,types:["rustpython_vm::bytecode::UnaryOperator"]},{text:"impl Sync for Varargs",synthetic:true,types:["rustpython_vm::bytecode::Varargs"]},{text:"impl Sync for Mode",synthetic:true,types:["rustpython_vm::compile::Mode"]},{text:"impl Sync for CompileError",synthetic:true,types:["rustpython_vm::error::CompileError"]},{text:"impl Sync for FormatSpec",synthetic:true,types:["rustpython_vm::format::FormatSpec"]},{text:"impl Sync for FormatString",synthetic:true,types:["rustpython_vm::format::FormatString"]},{text:"impl Sync for FormatAlign",synthetic:true,types:["rustpython_vm::format::FormatAlign"]},{text:"impl Sync for FormatSign",synthetic:true,types:["rustpython_vm::format::FormatSign"]},{text:"impl Sync for FormatGrouping",synthetic:true,types:["rustpython_vm::format::FormatGrouping"]},{text:"impl Sync for FormatType",synthetic:true,types:["rustpython_vm::format::FormatType"]},{text:"impl Sync for FormatParseError",synthetic:true,types:["rustpython_vm::format::FormatParseError"]},{text:"impl Sync for FormatPart",synthetic:true,types:["rustpython_vm::format::FormatPart"]},{text:"impl !Sync for Scope",synthetic:true,types:["rustpython_vm::frame::Scope"]},{text:"impl !Sync for Frame",synthetic:true,types:["rustpython_vm::frame::Frame"]},{text:"impl !Sync for ExecutionResult",synthetic:true,types:["rustpython_vm::frame::ExecutionResult"]},{text:"impl !Sync for PyFuncArgs",synthetic:true,types:["rustpython_vm::function::PyFuncArgs"]},{text:"impl<T> Sync for KwArgs<T> where
    T: Sync
",synthetic:true,types:["rustpython_vm::function::KwArgs"]},{text:"impl<T> Sync for Args<T> where
    T: Sync
",synthetic:true,types:["rustpython_vm::function::Args"]},{text:"impl !Sync for ArgumentError",synthetic:true,types:["rustpython_vm::function::ArgumentError"]},{text:"impl<T> Sync for OptionalArg<T> where
    T: Sync
",synthetic:true,types:["rustpython_vm::function::OptionalArg"]},{text:"impl !Sync for PyBuiltinFunction",synthetic:true,types:["rustpython_vm::obj::objbuiltinfunc::PyBuiltinFunction"]},{text:"impl !Sync for PyByteArray",synthetic:true,types:["rustpython_vm::obj::objbytearray::PyByteArray"]},{text:"impl Sync for PyBytes",synthetic:true,types:["rustpython_vm::obj::objbytes::PyBytes"]},{text:"impl !Sync for PyClassMethod",synthetic:true,types:["rustpython_vm::obj::objclassmethod::PyClassMethod"]},{text:"impl Sync for PyCode",synthetic:true,types:["rustpython_vm::obj::objcode::PyCode"]},{text:"impl Sync for PyComplex",synthetic:true,types:["rustpython_vm::obj::objcomplex::PyComplex"]},{text:"impl !Sync for PyDict",synthetic:true,types:["rustpython_vm::obj::objdict::PyDict"]},{text:"impl !Sync for PyEnumerate",synthetic:true,types:["rustpython_vm::obj::objenumerate::PyEnumerate"]},{text:"impl !Sync for PyFilter",synthetic:true,types:["rustpython_vm::obj::objfilter::PyFilter"]},{text:"impl Sync for PyFloat",synthetic:true,types:["rustpython_vm::obj::objfloat::PyFloat"]},{text:"impl !Sync for PyFunction",synthetic:true,types:["rustpython_vm::obj::objfunction::PyFunction"]},{text:"impl !Sync for PyMethod",synthetic:true,types:["rustpython_vm::obj::objfunction::PyMethod"]},{text:"impl !Sync for PyGenerator",synthetic:true,types:["rustpython_vm::obj::objgenerator::PyGenerator"]},{text:"impl Sync for PyInt",synthetic:true,types:["rustpython_vm::obj::objint::PyInt"]},{text:"impl !Sync for PyList",synthetic:true,types:["rustpython_vm::obj::objlist::PyList"]},{text:"impl !Sync for PyMap",synthetic:true,types:["rustpython_vm::obj::objmap::PyMap"]},{text:"impl !Sync for PyMemoryView",synthetic:true,types:["rustpython_vm::obj::objmemory::PyMemoryView"]},{text:"impl !Sync for PyModule",synthetic:true,types:["rustpython_vm::obj::objmodule::PyModule"]},{text:"impl Sync for PyNone",synthetic:true,types:["rustpython_vm::obj::objnone::PyNone"]},{text:"impl Sync for PyInstance",synthetic:true,types:["rustpython_vm::obj::objobject::PyInstance"]},{text:"impl !Sync for PyReadOnlyProperty",synthetic:true,types:["rustpython_vm::obj::objproperty::PyReadOnlyProperty"]},{text:"impl !Sync for PyProperty",synthetic:true,types:["rustpython_vm::obj::objproperty::PyProperty"]},{text:"impl<'a> !Sync for PropertyBuilder<'a>",synthetic:true,types:["rustpython_vm::obj::objproperty::PropertyBuilder"]},{text:"impl Sync for PyRange",synthetic:true,types:["rustpython_vm::obj::objrange::PyRange"]},{text:"impl !Sync for PySet",synthetic:true,types:["rustpython_vm::obj::objset::PySet"]},{text:"impl Sync for PySlice",synthetic:true,types:["rustpython_vm::obj::objslice::PySlice"]},{text:"impl !Sync for PyStaticMethod",synthetic:true,types:["rustpython_vm::obj::objstaticmethod::PyStaticMethod"]},{text:"impl Sync for PyString",synthetic:true,types:["rustpython_vm::obj::objstr::PyString"]},{text:"impl !Sync for PySuper",synthetic:true,types:["rustpython_vm::obj::objsuper::PySuper"]},{text:"impl !Sync for PyTuple",synthetic:true,types:["rustpython_vm::obj::objtuple::PyTuple"]},{text:"impl !Sync for PyClass",synthetic:true,types:["rustpython_vm::obj::objtype::PyClass"]},{text:"impl !Sync for PyWeak",synthetic:true,types:["rustpython_vm::obj::objweakref::PyWeak"]},{text:"impl !Sync for PyZip",synthetic:true,types:["rustpython_vm::obj::objzip::PyZip"]},{text:"impl !Sync for PyContext",synthetic:true,types:["rustpython_vm::pyobject::PyContext"]},{text:"impl Sync for PyNotImplemented",synthetic:true,types:["rustpython_vm::pyobject::PyNotImplemented"]},{text:"impl Sync for PyEllipsis",synthetic:true,types:["rustpython_vm::pyobject::PyEllipsis"]},{text:"impl !Sync for PyObject",synthetic:true,types:["rustpython_vm::pyobject::PyObject"]},{text:"impl<T> !Sync for PyRef<T>",synthetic:true,types:["rustpython_vm::pyobject::PyRef"]},{text:"impl<T = Rc<PyObject>> !Sync for PyIterable<T>",synthetic:true,types:["rustpython_vm::pyobject::PyIterable"]},{text:"impl<'a, T> !Sync for PyIterator<'a, T>",synthetic:true,types:["rustpython_vm::pyobject::PyIterator"]},{text:"impl !Sync for PyIteratorValue",synthetic:true,types:["rustpython_vm::pyobject::PyIteratorValue"]},{text:"impl !Sync for Socket",synthetic:true,types:["rustpython_vm::stdlib::socket::Socket"]},]; +implementors["rustpython_wasm"] = [{text:"impl !Sync for PyPromise",synthetic:true,types:["rustpython_wasm::browser_module::PyPromise"]},{text:"impl Sync for VMStore",synthetic:true,types:["rustpython_wasm::vm_class::VMStore"]},{text:"impl Sync for WASMVirtualMachine",synthetic:true,types:["rustpython_wasm::vm_class::WASMVirtualMachine"]},]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/implementors/core/ops/deref/trait.Deref.js b/implementors/core/ops/deref/trait.Deref.js index d8940d8..be74e67 100644 --- a/implementors/core/ops/deref/trait.Deref.js +++ b/implementors/core/ops/deref/trait.Deref.js @@ -1,4 +1,5 @@ (function() {var implementors = {}; +implementors["rustpython_vm"] = [{text:"impl Deref for PyBytes",synthetic:false,types:["rustpython_vm::obj::objbytes::PyBytes"]},{text:"impl<T> Deref for PyRef<T> where
    T: PyValue
",synthetic:false,types:["rustpython_vm::pyobject::PyRef"]},]; implementors["rustpython_wasm"] = [{text:"impl<'_> Deref for AccessibleVMPtr<'_>",synthetic:false,types:["rustpython_wasm::vm_class::AccessibleVMPtr"]},]; if (window.register_implementors) { diff --git a/implementors/rustpython_vm/frame/trait.NameProtocol.js b/implementors/rustpython_vm/frame/trait.NameProtocol.js new file mode 100644 index 0000000..8841490 --- /dev/null +++ b/implementors/rustpython_vm/frame/trait.NameProtocol.js @@ -0,0 +1,10 @@ +(function() {var implementors = {}; +implementors["rustpython_vm"] = []; + + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } + +})() diff --git a/implementors/rustpython_vm/function/trait.FromArgs.js b/implementors/rustpython_vm/function/trait.FromArgs.js new file mode 100644 index 0000000..8841490 --- /dev/null +++ b/implementors/rustpython_vm/function/trait.FromArgs.js @@ -0,0 +1,10 @@ +(function() {var implementors = {}; +implementors["rustpython_vm"] = []; + + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } + +})() diff --git a/implementors/rustpython_vm/function/trait.IntoPyNativeFunc.js b/implementors/rustpython_vm/function/trait.IntoPyNativeFunc.js new file mode 100644 index 0000000..8841490 --- /dev/null +++ b/implementors/rustpython_vm/function/trait.IntoPyNativeFunc.js @@ -0,0 +1,10 @@ +(function() {var implementors = {}; +implementors["rustpython_vm"] = []; + + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } + +})() diff --git a/implementors/rustpython_vm/pyobject/trait.IntoPyObject.js b/implementors/rustpython_vm/pyobject/trait.IntoPyObject.js new file mode 100644 index 0000000..8841490 --- /dev/null +++ b/implementors/rustpython_vm/pyobject/trait.IntoPyObject.js @@ -0,0 +1,10 @@ +(function() {var implementors = {}; +implementors["rustpython_vm"] = []; + + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } + +})() diff --git a/implementors/rustpython_vm/pyobject/trait.PyObjectPayload.js b/implementors/rustpython_vm/pyobject/trait.PyObjectPayload.js new file mode 100644 index 0000000..8841490 --- /dev/null +++ b/implementors/rustpython_vm/pyobject/trait.PyObjectPayload.js @@ -0,0 +1,10 @@ +(function() {var implementors = {}; +implementors["rustpython_vm"] = []; + + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } + +})() diff --git a/implementors/rustpython_vm/pyobject/trait.PyValue.js b/implementors/rustpython_vm/pyobject/trait.PyValue.js new file mode 100644 index 0000000..aea1125 --- /dev/null +++ b/implementors/rustpython_vm/pyobject/trait.PyValue.js @@ -0,0 +1,11 @@ +(function() {var implementors = {}; +implementors["rustpython_vm"] = []; +implementors["rustpython_wasm"] = [{text:"impl PyValue for PyPromise",synthetic:false,types:["rustpython_wasm::browser_module::PyPromise"]},]; + + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } + +})() diff --git a/implementors/rustpython_vm/pyobject/trait.TryFromObject.js b/implementors/rustpython_vm/pyobject/trait.TryFromObject.js new file mode 100644 index 0000000..8841490 --- /dev/null +++ b/implementors/rustpython_vm/pyobject/trait.TryFromObject.js @@ -0,0 +1,10 @@ +(function() {var implementors = {}; +implementors["rustpython_vm"] = []; + + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } + +})() diff --git a/implementors/rustpython_vm/pyobject/trait.TryIntoRef.js b/implementors/rustpython_vm/pyobject/trait.TryIntoRef.js new file mode 100644 index 0000000..8841490 --- /dev/null +++ b/implementors/rustpython_vm/pyobject/trait.TryIntoRef.js @@ -0,0 +1,10 @@ +(function() {var implementors = {}; +implementors["rustpython_vm"] = []; + + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } + +})() diff --git a/implementors/rustpython_wasm/vm_class/trait.HeldRcInner.js b/implementors/rustpython_wasm/vm_class/trait.HeldRcInner.js new file mode 100644 index 0000000..b3c2ad1 --- /dev/null +++ b/implementors/rustpython_wasm/vm_class/trait.HeldRcInner.js @@ -0,0 +1,10 @@ +(function() {var implementors = {}; +implementors["rustpython_wasm"] = []; + + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } + +})() diff --git a/light.css b/light.css index e24fb6a..989cb41 100644 --- a/light.css +++ b/light.css @@ -1,12 +1 @@ -/*! - * Copyright 2015 The Rust Project Developers. See the COPYRIGHT - * file at the top-level directory of this distribution and at - * http://rust-lang.org/COPYRIGHT. - * - * Licensed under the Apache License, Version 2.0 or the MIT license - * , at your - * option. This file may not be copied, modified, or distributed - * except according to those terms. - */ -body{background-color:white;color:black;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){color:black;}h1.fqn{border-bottom-color:#D5D5D5;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){border-bottom-color:#DDDDDD;}.in-band{background-color:white;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#F5F5F5;}pre{background-color:#F5F5F5;}.sidebar{background-color:#F1F1F1;}.sidebar .current{background-color:#fff;}.source .sidebar{background-color:#fff;}.sidebar .location{border-color:#000;background-color:#fff;color:#333;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#F5F5F5;}.line-numbers span{color:#c67e2d;}.line-numbers .line-highlighted{background-color:#f6fdb0 !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#DDD;}.docblock table{border-color:#ddd;}.docblock table td{border-top-color:#ddd;border-bottom-color:#ddd;}.docblock table th{border-top-color:#ddd;border-bottom-color:#ddd;}:target{background:#FDFFD3;}:target>.in-band{background:#FDFFD3;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#4E4C4C;}.content .highlighted{color:#000 !important;background-color:#ccc;}.content .highlighted a,.content .highlighted span{color:#000 !important;}.content .highlighted.trait{background-color:#c7b6ff;}.content .highlighted.mod,.content .highlighted.externcrate{background-color:#afc6e4;}.content .highlighted.enum{background-color:#b4d1b9;}.content .highlighted.struct{background-color:#e7b1a0;}.content .highlighted.union{background-color:#b7bd49;}.content .highlighted.fn,.content .highlighted.method,.content .highlighted.tymethod{background-color:#c6afb3;}.content .highlighted.type{background-color:#ffc891;}.content .highlighted.foreigntype{background-color:#f5c4ff;}.content .highlighted.attr,.content .highlighted.derive,.content .highlighted.macro{background-color:#8ce488;}.content .highlighted.constant,.content .highlighted.static{background-color:#c3e0ff;}.content .highlighted.primitive{background-color:#9aecff;}.content .highlighted.keyword{background-color:#f99650;}.content span.enum,.content a.enum,.block a.current.enum{color:#508157;}.content span.struct,.content a.struct,.block a.current.struct{color:#ad448e;}.content span.type,.content a.type,.block a.current.type{color:#ba5d00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#cd00e2;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#068000;}.content span.union,.content a.union,.block a.current.union{color:#767b27;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#546e8a;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#2c8093;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#4d76ae;}.content span.trait,.content a.trait,.block a.current.trait{color:#7c5af3;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#9a6e31;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}pre.rust .comment{color:#8E908C;}pre.rust .doccomment{color:#4D4D4C;}nav{border-bottom-color:#e0e0e0;}nav.main .current{border-top-color:#000;border-bottom-color:#000;}nav.main .separator{border:1px solid #000;}a{color:#000;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.stability a{color:#3873AD;}a.test-arrow{color:#f5f5f5;}.collapse-toggle{color:#999;}.search-input{color:#555;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;background-color:white;}.search-input:focus{border-color:#66afe9;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;}.stab.deprecated{background:#F3DFFF;border-color:#7F0087;}.stab.portability{background:#C4ECFF;border-color:#7BA5DB;}.module-item .stab{color:#000;}#help>div{background:#e9e9e9;border-color:#bfbfbf;}.since{color:grey;}tr.result span.primitive::after,tr.result span.keyword::after{color:black;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#8959A8;}pre.rust .kw-2,pre.rust .prelude-ty{color:#4271AE;}pre.rust .number,pre.rust .string{color:#718C00;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#C82829;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#B76514;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#c7c7c7;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label{color:#999;}:target>code{background:#FDFFD3;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.4);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.4);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.3);}.information>.compile_fail:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.3);}.information>.ignore:hover{color:rgba(255,142,0,1);}.search-failed>a{color:#0089ff;}.tooltip .tooltiptext{background-color:black;color:#fff;}.tooltip .tooltiptext::after{border-color:transparent black transparent transparent;}.important-traits .tooltip .tooltiptext{background-color:white;color:black;border-color:black;}#titles>div:not(.selected){background-color:#e6e6e6;border-top-color:#e6e6e6;}#titles>div:hover,#titles>div.selected{border-top-color:#0089ff;}#titles>div>div.count{color:#888;}.modal{background-color:rgba(0,0,0,0.3);}.modal-content{background-color:#eee;border-color:#999;}.modal-content>.close{background-color:#eee;border-color:#999;}.modal-content>.close:hover{background-color:#ff1f1f;color:white;}.modal-content>.whiter{background-color:#eee;}.modal-content>.close:hover+.whiter{background-color:#ff1f1f;}@media (max-width:700px){.sidebar-menu{background-color:#F1F1F1;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#F1F1F1;border-right-color:#000;}#sidebar-filler{background-color:#F1F1F1;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu{border-color:#e0e0e0;background-color:#fff;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus{border-color:#717171;}#theme-choices{border-color:#ccc;background-color:#fff;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#eee;}@media (max-width:700px){#theme-picker{background:#fff;}}#all-types{background-color:#fff;}#all-types:hover{background-color:#f9f9f9;}.search-results td span.alias{color:#000;}.search-results td span.grey{color:#999;}.impl-items code{background-color:rgba(0,0,0,0);}#sidebar-toggle{background-color:#F1F1F1;}#sidebar-toggle:hover{background-color:#E0E0E0;}#source-sidebar{background-color:#F1F1F1;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#E0E0E0;}div.files>.selected{background-color:#fff;} \ No newline at end of file + body{background-color:white;color:black;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){color:black;}h1.fqn{border-bottom-color:#D5D5D5;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){border-bottom-color:#DDDDDD;}.in-band{background-color:white;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#F5F5F5;}pre{background-color:#F5F5F5;}.sidebar{background-color:#F1F1F1;}.sidebar .current{background-color:#fff;}.source .sidebar{background-color:#fff;}.sidebar .location{border-color:#000;background-color:#fff;color:#333;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#F5F5F5;}.line-numbers span{color:#c67e2d;}.line-numbers .line-highlighted{background-color:#f6fdb0 !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#DDD;}.docblock table{border-color:#ddd;}.docblock table td{border-top-color:#ddd;border-bottom-color:#ddd;}.docblock table th{border-top-color:#ddd;border-bottom-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#4E4C4C;}.content .highlighted{color:#000 !important;background-color:#ccc;}.content .highlighted a,.content .highlighted span{color:#000 !important;}.content .highlighted.trait{background-color:#c7b6ff;}.content .highlighted.mod,.content .highlighted.externcrate{background-color:#afc6e4;}.content .highlighted.enum{background-color:#b4d1b9;}.content .highlighted.struct{background-color:#e7b1a0;}.content .highlighted.union{background-color:#b7bd49;}.content .highlighted.fn,.content .highlighted.method,.content .highlighted.tymethod{background-color:#c6afb3;}.content .highlighted.type{background-color:#ffc891;}.content .highlighted.foreigntype{background-color:#f5c4ff;}.content .highlighted.attr,.content .highlighted.derive,.content .highlighted.macro{background-color:#8ce488;}.content .highlighted.constant,.content .highlighted.static{background-color:#c3e0ff;}.content .highlighted.primitive{background-color:#9aecff;}.content .highlighted.keyword{background-color:#f99650;}.content span.enum,.content a.enum,.block a.current.enum{color:#508157;}.content span.struct,.content a.struct,.block a.current.struct{color:#ad448e;}.content span.type,.content a.type,.block a.current.type{color:#ba5d00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#cd00e2;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#068000;}.content span.union,.content a.union,.block a.current.union{color:#767b27;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#546e8a;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#2c8093;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#4d76ae;}.content span.trait,.content a.trait,.block a.current.trait{color:#7c5af3;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#9a6e31;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}pre.rust .comment{color:#8E908C;}pre.rust .doccomment{color:#4D4D4C;}nav{border-bottom-color:#e0e0e0;}nav.main .current{border-top-color:#000;border-bottom-color:#000;}nav.main .separator{border:1px solid #000;}a{color:#000;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.stability a{color:#3873AD;}.stab.internal a{color:#304FFE;}a.test-arrow{color:#f5f5f5;}.collapse-toggle{color:#999;}#crate-search{color:#555;background-color:white;border-color:#e0e0e0;box-shadow:0px 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input{color:#555;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;background-color:white;}.search-input:focus{border-color:#66afe9;}#crate-search+.search-input{box-shadow:1px 0 0 1px #e0e0e0,0 0 0 2px transparent;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;}.stab.internal{background:#FFB9B3;border-color:#B71C1C;}.stab.deprecated{background:#F3DFFF;border-color:#7F0087;}.stab.portability{background:#C4ECFF;border-color:#7BA5DB;}.module-item .stab{color:#000;}#help>div{background:#e9e9e9;border-color:#bfbfbf;}.since{color:grey;}tr.result span.primitive::after,tr.result span.keyword::after{color:black;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#8959A8;}pre.rust .kw-2,pre.rust .prelude-ty{color:#4271AE;}pre.rust .number,pre.rust .string{color:#718C00;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#C82829;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#B76514;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#c7c7c7;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label{color:#999;}:target>code,:target>.in-band{background:#FDFFD3;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.4);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.4);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.3);}.information>.compile_fail:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.3);}.information>.ignore:hover{color:rgba(255,142,0,1);}.search-failed a{color:#0089ff;}.tooltip .tooltiptext{background-color:black;color:#fff;}.tooltip .tooltiptext::after{border-color:transparent black transparent transparent;}.important-traits .tooltip .tooltiptext{background-color:white;color:black;border-color:black;}#titles>div:not(.selected){background-color:#e6e6e6;border-top-color:#e6e6e6;}#titles>div:hover,#titles>div.selected{border-top-color:#0089ff;}#titles>div>div.count{color:#888;}.modal{background-color:rgba(0,0,0,0.3);}.modal-content{background-color:#eee;border-color:#999;}.modal-content>.close{background-color:#eee;border-color:#999;}.modal-content>.close:hover{background-color:#ff1f1f;color:white;}.modal-content>.whiter{background-color:#eee;}.modal-content>.close:hover+.whiter{background-color:#ff1f1f;}@media (max-width:700px){.sidebar-menu{background-color:#F1F1F1;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#F1F1F1;border-right-color:#000;}#sidebar-filler{background-color:#F1F1F1;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu{border-color:#e0e0e0;background-color:#fff;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus{border-color:#717171;}#theme-choices{border-color:#ccc;background-color:#fff;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#eee;}@media (max-width:700px){#theme-picker{background:#fff;}}#all-types{background-color:#fff;}#all-types:hover{background-color:#f9f9f9;}.search-results td span.alias{color:#000;}.search-results td span.grey{color:#999;}#sidebar-toggle{background-color:#F1F1F1;}#sidebar-toggle:hover{background-color:#E0E0E0;}#source-sidebar{background-color:#F1F1F1;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#E0E0E0;}div.files>.selected{background-color:#fff;} \ No newline at end of file diff --git a/main.js b/main.js index a00e7cd..882ba38 100644 --- a/main.js +++ b/main.js @@ -1,13 +1 @@ -/*! - * Copyright 2014 The Rust Project Developers. See the COPYRIGHT - * file at the top-level directory of this distribution and at - * http://rust-lang.org/COPYRIGHT. - * - * Licensed under the Apache License, Version 2.0 or the MIT license - * , at your - * option. This file may not be copied, modified, or distributed - * except according to those terms. - */if(!String.prototype.startsWith){String.prototype.startsWith=function(searchString,position){position=position||0;return this.indexOf(searchString,position)===position;};}if(!String.prototype.endsWith){String.prototype.endsWith=function(suffix,length){var l=length||this.length;return this.indexOf(suffix,l-suffix.length)!==-1;};}(function(){"use strict";var itemTypes=["mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","primitive","associatedtype","constant","associatedconstant","union","foreigntype","keyword","existential","attr","derive"];var search_input=document.getElementsByClassName('search-input')[0];var currentTab=0;var themesWidth=null;var titleBeforeSearch=document.title;function getPageId(){var id=document.location.href.split('#')[1];if(id){return id.split('?')[0].split('&')[0];}return null;}function showSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){addClass(elems,"show-it");}var sidebar=document.getElementsByClassName('sidebar')[0];if(sidebar){addClass(sidebar,'mobile');var filler=document.getElementById("sidebar-filler");if(!filler){var div=document.createElement("div");div.id="sidebar-filler";sidebar.appendChild(div);}}var themePicker=document.getElementsByClassName("theme-picker");if(themePicker&&themePicker.length>0){themePicker[0].style.display="none";}}function hideSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){removeClass(elems,"show-it");}var sidebar=document.getElementsByClassName('sidebar')[0];removeClass(sidebar,'mobile');var filler=document.getElementById("sidebar-filler");if(filler){filler.remove();}document.getElementsByTagName("body")[0].style.marginTop='';var themePicker=document.getElementsByClassName("theme-picker");if(themePicker&&themePicker.length>0){themePicker[0].style.display=null;}}var TY_PRIMITIVE=itemTypes.indexOf("primitive");var TY_KEYWORD=itemTypes.indexOf("keyword");onEach(document.getElementsByClassName('js-only'),function(e){removeClass(e,'js-only');});function getQueryStringParams(){var params={};window.location.search.substring(1).split("&").map(function(s){var pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1]);});return params;}function browserSupportsHistoryApi(){return document.location.protocol!="file:"&&window.history&&typeof window.history.pushState==="function";}function highlightSourceLines(ev){hideSidebar();var search=document.getElementById("search");var i,from,to,match=window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/);if(match){from=parseInt(match[1],10);to=Math.min(50000,parseInt(match[2]||match[1],10));from=Math.min(from,to);var elem=document.getElementById(from);if(!elem){return;}if(ev===null){var x=document.getElementById(from);if(x){x.scrollIntoView();}}onEach(document.getElementsByClassName('line-numbers'),function(e){onEach(e.getElementsByTagName('span'),function(i_e){removeClass(i_e,'line-highlighted');});});for(i=from;i<=to;++i){addClass(document.getElementById(i),'line-highlighted');}}else if(ev!==null&&search&&!hasClass(search,"hidden")&&ev.newURL){addClass(search,"hidden");removeClass(document.getElementById("main"),"hidden");var hash=ev.newURL.slice(ev.newURL.indexOf('#')+1);if(browserSupportsHistoryApi()){history.replaceState(hash,"","?search=#"+hash);}var elem=document.getElementById(hash);if(elem){elem.scrollIntoView();}}}function expandSection(id){var elem=document.getElementById(id);if(elem&&isHidden(elem)){var h3=elem.parentNode.previousSibling;if(h3&&h3.tagName!=='H3'){h3=h3.previousSibling;}if(h3){var collapses=h3.getElementsByClassName("collapse-toggle");if(collapses.length>0){collapseDocs(collapses[0],"show");}}}}highlightSourceLines(null);window.onhashchange=highlightSourceLines;function getVirtualKey(ev){if("key"in ev&&typeof ev.key!="undefined")return ev.key;var c=ev.charCode||ev.keyCode;if(c==27)return"Escape";return String.fromCharCode(c);}function displayHelp(display,ev){if(display===true){if(hasClass(help,"hidden")){ev.preventDefault();removeClass(help,"hidden");addClass(document.body,"blur");}}else if(!hasClass(help,"hidden")){ev.preventDefault();addClass(help,"hidden");removeClass(document.body,"blur");}}function handleEscape(ev,help){hideModal();var search=document.getElementById("search");if(!hasClass(help,"hidden")){displayHelp(false,ev);}else if(!hasClass(search,"hidden")){ev.preventDefault();addClass(search,"hidden");removeClass(document.getElementById("main"),"hidden");document.title=titleBeforeSearch;}defocusSearchBar();}function handleShortcut(ev){if(ev.ctrlKey||ev.altKey||ev.metaKey){return;}var help=document.getElementById("help");if(document.activeElement.tagName==="INPUT"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev,help);break;}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev,help);break;case"s":case"S":displayHelp(false,ev);hideModal();ev.preventDefault();focusSearchBar();break;case"+":case"-":ev.preventDefault();toggleAllDocs();break;case"?":if(ev.shiftKey){hideModal();displayHelp(true,ev);}break;}}}function findParentElement(elem,tagName){do{if(elem&&elem.tagName===tagName){return elem;}}while(elem=elem.parentNode);return null;}document.onkeypress=handleShortcut;document.onkeydown=handleShortcut;document.onclick=function(ev){if(hasClass(ev.target,'collapse-toggle')){collapseDocs(ev.target,"toggle");}else if(hasClass(ev.target.parentNode,'collapse-toggle')){collapseDocs(ev.target.parentNode,"toggle");}else if(ev.target.tagName==='SPAN'&&hasClass(ev.target.parentNode,'line-numbers')){var prev_id=0;var set_fragment=function(name){if(browserSupportsHistoryApi()){history.replaceState(null,null,'#'+name);window.hashchange();}else{location.replace('#'+name);}};var cur_id=parseInt(ev.target.id,10);if(ev.shiftKey&&prev_id){if(prev_id>cur_id){var tmp=prev_id;prev_id=cur_id;cur_id=tmp;}set_fragment(prev_id+'-'+cur_id);}else{prev_id=cur_id;set_fragment(cur_id);}}else if(!hasClass(document.getElementById("help"),"hidden")){addClass(document.getElementById("help"),"hidden");removeClass(document.body,"blur");}else{var a=findParentElement(ev.target,'A');if(a&&a.hash){expandSection(a.hash.replace(/^#/,''));}}};var x=document.getElementsByClassName('version-selector');if(x.length>0){x[0].onchange=function(){var i,match,url=document.location.href,stripped='',len=rootPath.match(/\.\.\//g).length+1;for(i=0;i-1){var obj=searchIndex[results[i].id];obj.lev=results[i].lev;if(isType!==true||obj.type){var res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=obj.displayPath+obj.name;obj.fullPath+='|'+obj.ty;obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break;}}}}return out;}function sortResults(results,isType){var ar=[];for(var entry in results){if(results.hasOwnProperty(entry)){ar.push(results[entry]);}}results=ar;var nresults=results.length;for(var i=0;ib?+1:-1);}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b;}a=aaa.index;b=bbb.index;if(a!==b){return a-b;}if((aaa.item.ty===TY_PRIMITIVE&&bbb.item.ty!==TY_KEYWORD)||(aaa.item.ty===TY_KEYWORD&&bbb.item.ty!==TY_PRIMITIVE)){return-1;}if((bbb.item.ty===TY_PRIMITIVE&&aaa.item.ty!==TY_PRIMITIVE)||(bbb.item.ty===TY_KEYWORD&&aaa.item.ty!==TY_KEYWORD)){return 1;}a=(aaa.item.desc==='');b=(bbb.item.desc==='');if(a!==b){return a-b;}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b;}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1);}return 0;});for(var i=0;i'));return{name:val.substring(0,val.indexOf('<')),generics:values.split(/\s*,\s*/),};}return{name:val,generics:[],};}function checkGenerics(obj,val){var lev_distance=MAX_LEV_DISTANCE+1;if(val.generics.length>0){if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>=val.generics.length){var elems=obj[GENERICS_DATA].slice(0);var total=0;var done=0;for(var y=0;yGENERICS_DATA&&obj[GENERICS_DATA].length>=val.generics.length){var elems=obj[GENERICS_DATA].slice(0);var allFound=true;var x;for(var y=0;allFound===true&&yGENERICS_DATA&&obj[GENERICS_DATA].length!==0){var tmp_lev=checkGenerics(obj,val);if(tmp_lev<=MAX_LEV_DISTANCE){return tmp_lev;}}else{return 0;}}if(literalSearch===true){if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>0){for(var x=0;xGENERICS_DATA&&obj[GENERICS_DATA].length>0){for(var x=0;x0){for(var i=0;iOUTPUT_DATA){var tmp=checkType(obj.type[OUTPUT_DATA],val,literalSearch);if(literalSearch===true&&tmp===true){return true;}lev_distance=Math.min(tmp,lev_distance);if(lev_distance===0){return 0;}}return literalSearch===true?false:lev_distance;}function checkPath(contains,lastElem,ty){if(contains.length===0){return 0;}var ret_lev=MAX_LEV_DISTANCE+1;var path=ty.path.split("::");if(ty.parent&&ty.parent.name){path.push(ty.parent.name.toLowerCase());}if(contains.length>path.length){return MAX_LEV_DISTANCE+1;}for(var i=0;ipath.length){break;}var lev_total=0;var aborted=false;for(var x=0;xMAX_LEV_DISTANCE){aborted=true;break;}lev_total+=lev;}if(aborted===false){ret_lev=Math.min(ret_lev,Math.round(lev_total/contains.length));}}return ret_lev;}function typePassesFilter(filter,type){if(filter<0)return true;if(filter===type)return true;var name=itemTypes[type];switch(itemTypes[filter]){case"constant":return(name=="associatedconstant");case"fn":return(name=="method"||name=="tymethod");case"type":return(name=="primitive"||name=="keyword");}return false;}function generateId(ty){if(ty.parent&&ty.parent.name){return itemTypes[ty.ty]+ty.path+ty.parent.name+ty.name;}return itemTypes[ty.ty]+ty.path+ty.name;}var nSearchWords=searchWords.length;if((val.charAt(0)==="\""||val.charAt(0)==="'")&&val.charAt(val.length-1)===val.charAt(0)){val=extractGenerics(val.substr(1,val.length-2));for(var i=0;i")>-1){var trimmer=function(s){return s.trim();};var parts=val.split("->").map(trimmer);var input=parts[0];var inputs=input.split(",").map(trimmer).sort();for(var i=0;iOUTPUT_DATA?type[OUTPUT_DATA].name:"";var returned=checkReturned(ty,output,true);if(output.name==="*"||returned===true){var in_args=false;var module=false;if(input==="*"){module=true;}else{var allFound=true;for(var it=0;allFound===true&&it1?paths.length-1:1);for(j=0;j1){var lev=checkPath(contains,paths[paths.length-1],ty);if(lev>MAX_LEV_DISTANCE){continue;}else if(lev>0){lev_add=1;}}var returned=MAX_LEV_DISTANCE+1;var in_args=MAX_LEV_DISTANCE+1;var index=-1;var lev=MAX_LEV_DISTANCE+1;var fullId=generateId(ty);if(searchWords[j].indexOf(split[i])>-1||searchWords[j].indexOf(val)>-1||searchWords[j].replace(/_/g,"").indexOf(val)>-1){if(typePassesFilter(typeFilter,ty.ty)&&results[fullId]===undefined){index=searchWords[j].replace(/_/g,"").indexOf(val);}}if((lev=levenshtein(searchWords[j],val))<=MAX_LEV_DISTANCE){if(typePassesFilter(typeFilter,ty.ty)===false){lev=MAX_LEV_DISTANCE+1;}else{lev+=1;}}if((in_args=findArg(ty,valGenerics))<=MAX_LEV_DISTANCE){if(typePassesFilter(typeFilter,ty.ty)===false){in_args=MAX_LEV_DISTANCE+1;}}if((returned=checkReturned(ty,valGenerics))<=MAX_LEV_DISTANCE){if(typePassesFilter(typeFilter,ty.ty)===false){returned=MAX_LEV_DISTANCE+1;}}lev+=lev_add;if(lev>0&&val.length>3&&searchWords[j].indexOf(val)>-1){if(val.length<6){lev-=1;}else{lev=0;}}if(in_args<=MAX_LEV_DISTANCE){if(results_in_args[fullId]===undefined){results_in_args[fullId]={id:j,index:index,lev:in_args,};}results_in_args[fullId].lev=Math.min(results_in_args[fullId].lev,in_args);}if(returned<=MAX_LEV_DISTANCE){if(results_returned[fullId]===undefined){results_returned[fullId]={id:j,index:index,lev:returned,};}results_returned[fullId].lev=Math.min(results_returned[fullId].lev,returned);}if(index!==-1||lev<=MAX_LEV_DISTANCE){if(index!==-1&&paths.length<2){lev=0;}if(results[fullId]===undefined){results[fullId]={id:j,index:index,lev:lev,};}results[fullId].lev=Math.min(results[fullId].lev,lev);}}}var ret={'in_args':sortResults(results_in_args,true),'returned':sortResults(results_returned,true),'others':sortResults(results),};if(ALIASES&&ALIASES[window.currentCrate]&&ALIASES[window.currentCrate][query.raw]){var aliases=ALIASES[window.currentCrate][query.raw];for(var i=0;iMAX_RESULTS){ret['others'].pop();}}}return ret;}function validateResult(name,path,keys,parent){for(var i=0;i-1||path.indexOf(keys[i])>-1||(parent!==undefined&&parent.name.toLowerCase().indexOf(keys[i])>-1)||levenshtein(name,keys[i])<=MAX_LEV_DISTANCE)){return false;}}return true;}function getQuery(raw){var matches,type,query;query=raw;matches=query.match(/^(fn|mod|struct|enum|trait|type|const|macro)\s*:\s*/i);if(matches){type=matches[1].replace(/^const$/,'constant');query=query.substring(matches[0].length);}return{raw:raw,query:query,type:type,id:query+type};}function initSearchNav(){var hoverTimeout;var click_func=function(e){var el=e.target;while(el.tagName!=='TR'){el=el.parentNode;}var dst=e.target.getElementsByTagName('a');if(dst.length<1){return;}dst=dst[0];if(window.location.pathname===dst.pathname){addClass(document.getElementById('search'),'hidden');removeClass(document.getElementById('main'),'hidden');document.location.href=dst.href;}};var mouseover_func=function(e){var el=e.target;while(el.tagName!=='TR'){el=el.parentNode;}clearTimeout(hoverTimeout);hoverTimeout=setTimeout(function(){onEach(document.getElementsByClassName('search-results'),function(e){onEach(e.getElementsByClassName('result'),function(i_e){removeClass(i_e,'highlighted');});});addClass(el,'highlighted');},20);};onEach(document.getElementsByClassName('search-results'),function(e){onEach(e.getElementsByClassName('result'),function(i_e){i_e.onclick=click_func;i_e.onmouseover=mouseover_func;});});search_input.onkeydown=function(e){var actives=[[],[],[]];var current=0;onEach(document.getElementsByClassName('search-results'),function(e){onEach(e.getElementsByClassName('highlighted'),function(e){actives[current].push(e);});current+=1;});if(e.which===38){if(!actives[currentTab].length||!actives[currentTab][0].previousElementSibling){return;}addClass(actives[currentTab][0].previousElementSibling,'highlighted');removeClass(actives[currentTab][0],'highlighted');}else if(e.which===40){if(!actives[currentTab].length){var results=document.getElementsByClassName('search-results');if(results.length>0){var res=results[currentTab].getElementsByClassName('result');if(res.length>0){addClass(res[0],'highlighted');}}}else if(actives[currentTab][0].nextElementSibling){addClass(actives[currentTab][0].nextElementSibling,'highlighted');removeClass(actives[currentTab][0],'highlighted');}}else if(e.which===13){if(actives[currentTab].length){document.location.href=actives[currentTab][0].getElementsByTagName('a')[0].href;}}else if(e.which===9){if(e.shiftKey){printTab(currentTab>0?currentTab-1:2);}else{printTab(currentTab>1?0:currentTab+1);}e.preventDefault();}else if(e.which===16){}else if(e.which===27){removeClass(actives[currentTab][0],'highlighted');search_input.value='';defocusSearchBar();}else if(actives[currentTab].length>0){removeClass(actives[currentTab][0],'highlighted');}};}function buildHrefAndPath(item){var displayPath;var href;var type=itemTypes[item.ty];var name=item.name;if(type==='mod'){displayPath=item.path+'::';href=rootPath+item.path.replace(/::/g,'/')+'/'+name+'/index.html';}else if(type==="primitive"||type==="keyword"){displayPath="";href=rootPath+item.path.replace(/::/g,'/')+'/'+type+'.'+name+'.html';}else if(type==="externcrate"){displayPath="";href=rootPath+name+'/index.html';}else if(item.parent!==undefined){var myparent=item.parent;var anchor='#'+type+'.'+name;var parentType=itemTypes[myparent.ty];if(parentType==="primitive"){displayPath=myparent.name+'::';}else{displayPath=item.path+'::'+myparent.name+'::';}href=rootPath+item.path.replace(/::/g,'/')+'/'+parentType+'.'+myparent.name+'.html'+anchor;}else{displayPath=item.path+'::';href=rootPath+item.path.replace(/::/g,'/')+'/'+type+'.'+name+'.html';}return[displayPath,href];}function escape(content){var h1=document.createElement('h1');h1.textContent=content;return h1.innerHTML;}function pathSplitter(path){var tmp=''+path.replace(/::/g,'::');if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6);}return tmp;}function addTab(array,query,display){var extraStyle='';if(display===false){extraStyle=' style="display: none;"';}var output='';var duplicates={};var length=0;if(array.length>0){output='';array.forEach(function(item){var name,type;name=item.name;type=itemTypes[item.ty];if(item.is_alias!==true){if(duplicates[item.fullPath]){return;}duplicates[item.fullPath]=true;}length+=1;output+='';});output+='
'+''+(item.is_alias===true?(''+item.alias+'  - see '):'')+item.displayPath+''+name+''+''+''+escape(item.desc)+' 
';}else{output='
No results :(
'+'Try on DuckDuckGo?
';}return[output,length];}function makeTabHeader(tabNb,text,nbElems){if(currentTab===tabNb){return'
'+text+'
('+nbElems+')
';}return'
'+text+'
('+nbElems+')
';}function showResults(results){if(results['others'].length===1&&getCurrentValue('rustdoc-go-to-only-result')==="true"){var elem=document.createElement('a');elem.href=results['others'][0].href;elem.style.display='none';document.body.appendChild(elem);elem.click();}var query=getQuery(search_input.value);currentResults=query.id;var ret_others=addTab(results['others'],query);var ret_in_args=addTab(results['in_args'],query,false);var ret_returned=addTab(results['returned'],query,false);var output='

Results for '+escape(query.query)+(query.type?' (type: '+escape(query.type)+')':'')+'

'+'
'+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+'
'+ret_others[0]+ret_in_args[0]+ret_returned[0]+'
';addClass(document.getElementById('main'),'hidden');var search=document.getElementById('search');removeClass(search,'hidden');search.innerHTML=output;var tds=search.getElementsByTagName('td');var td_width=0;if(tds.length>0){td_width=tds[0].offsetWidth;}var width=search.offsetWidth-40-td_width;onEach(search.getElementsByClassName('desc'),function(e){e.style.width=width+'px';});initSearchNav();var elems=document.getElementById('titles').childNodes;elems[0].onclick=function(){printTab(0);};elems[1].onclick=function(){printTab(1);};elems[2].onclick=function(){printTab(2);};printTab(currentTab);}function execSearch(query,searchWords){var queries=query.raw.split(",");var results={'in_args':[],'returned':[],'others':[],};for(var i=0;i1){function getSmallest(arrays,positions,notDuplicates){var start=null;for(var it=0;itpositions[it]&&(start===null||start>arrays[it][positions[it]].lev)&&!notDuplicates[arrays[it][positions[it]].fullPath]){start=arrays[it][positions[it]].lev;}}return start;}function mergeArrays(arrays){var ret=[];var positions=[];var notDuplicates={};for(var x=0;xpositions[x]&&arrays[x][positions[x]].lev===smallest&&!notDuplicates[arrays[x][positions[x]].fullPath]){ret.push(arrays[x][positions[x]]);notDuplicates[arrays[x][positions[x]].fullPath]=true;positions[x]+=1;}}}return ret;}return{'in_args':mergeArrays(results['in_args']),'returned':mergeArrays(results['returned']),'others':mergeArrays(results['others']),};}else{return{'in_args':results['in_args'][0],'returned':results['returned'][0],'others':results['others'][0],};}}function search(e){var params=getQueryStringParams();var query=getQuery(search_input.value.trim());if(e){e.preventDefault();}if(query.query.length===0||query.id===currentResults){if(query.query.length>0){putBackSearch(search_input);}return;}document.title="Results for "+query.query+" - Rust";if(browserSupportsHistoryApi()){if(!history.state&&!params.search){history.pushState(query,"","?search="+encodeURIComponent(query.raw));}else{history.replaceState(query,"","?search="+encodeURIComponent(query.raw));}}showResults(execSearch(query,index));}function buildIndex(rawSearchIndex){searchIndex=[];var searchWords=[];for(var crate in rawSearchIndex){if(!rawSearchIndex.hasOwnProperty(crate)){continue;}searchWords.push(crate);searchIndex.push({crate:crate,ty:1,name:crate,path:"",desc:rawSearchIndex[crate].doc,type:null,});var items=rawSearchIndex[crate].items;var paths=rawSearchIndex[crate].paths;var len=paths.length;for(var i=0;i\ -
'+code.outerHTML+'
\ -
';list.appendChild(display);}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors);}function labelForToggleButton(sectionIsCollapsed){if(sectionIsCollapsed){return"+";}return"\u2212";}function onEveryMatchingChild(elem,className,func){if(elem&&className&&func){for(var i=0;i0){onEach(implItems,function(elem){onEach(elem.getElementsByClassName("collapse-toggle"),collapser);});}}}var x=document.getElementById('toggle-all-docs');if(x){x.onclick=toggleAllDocs;}function insertAfter(newNode,referenceNode){referenceNode.parentNode.insertBefore(newNode,referenceNode.nextSibling);}function checkIfThereAreMethods(elems){var areThereMethods=false;onEach(elems,function(e){if(hasClass(e,"method")){areThereMethods=true;return true;}});return areThereMethods;}var toggle=document.createElement('a');toggle.href='javascript:void(0)';toggle.className='collapse-toggle';toggle.innerHTML="["+labelForToggleButton(false)+"]";var func=function(e){var next=e.nextElementSibling;if(hasClass(e,'impl')&&next&&hasClass(next,'docblock')){next=next.nextElementSibling;}if(!next){return;}if((hasClass(e,'method')||hasClass(e,'associatedconstant')||checkIfThereAreMethods(next.childNodes))&&(hasClass(next,'docblock')||hasClass(e,'impl')||(hasClass(next,'stability')&&hasClass(next.nextElementSibling,'docblock')))){insertAfter(toggle.cloneNode(true),e.childNodes[e.childNodes.length-1]);}};onEach(document.getElementsByClassName('method'),func);onEach(document.getElementsByClassName('associatedconstant'),func);onEach(document.getElementsByClassName('impl'),func);onEach(document.getElementsByClassName('impl-items'),function(e){onEach(e.getElementsByClassName('associatedconstant'),func);var hiddenElems=e.getElementsByClassName('hidden');var needToggle=false;for(var i=0;i"+"] Show hidden undocumented items";newToggle.onclick=function(){if(hasClass(this,"collapsed")){removeClass(this,"collapsed");onEach(this.parentNode.getElementsByClassName("hidden"),function(x){if(hasClass(x,"content")===false){removeClass(x,"hidden");addClass(x,"x");}},true);this.innerHTML="["+labelForToggleButton(false)+"] Hide undocumented items"}else{addClass(this,"collapsed");onEach(this.parentNode.getElementsByClassName("x"),function(x){if(hasClass(x,"content")===false){addClass(x,"hidden");removeClass(x,"x");}},true);this.innerHTML="["+labelForToggleButton(true)+"] Show hidden undocumented items";}};e.insertBefore(newToggle,e.firstChild);}});function createToggle(otherMessage,fontSize,extraClass,show){var span=document.createElement('span');span.className='toggle-label';if(show){span.style.display='none';}if(!otherMessage){span.innerHTML=' Expand description';}else{span.innerHTML=otherMessage;}if(fontSize){span.style.fontSize=fontSize;}var mainToggle=toggle.cloneNode(true);mainToggle.appendChild(span);var wrapper=document.createElement('div');wrapper.className='toggle-wrapper';if(!show){addClass(wrapper,'collapsed');var inner=mainToggle.getElementsByClassName('inner');if(inner&&inner.length>0){inner[0].innerHTML='+';}}if(extraClass){addClass(wrapper,extraClass);}wrapper.appendChild(mainToggle);return wrapper;}var showItemDeclarations=getCurrentValue('rustdoc-item-declarations')==="false";function buildToggleWrapper(e){if(hasClass(e,'autohide')){var wrap=e.previousElementSibling;if(wrap&&hasClass(wrap,'toggle-wrapper')){var toggle=wrap.childNodes[0];var extra=e.childNodes[0].tagName==='H3';e.style.display='none';addClass(wrap,'collapsed');onEach(toggle.getElementsByClassName('inner'),function(e){e.innerHTML=labelForToggleButton(true);});onEach(toggle.getElementsByClassName('toggle-label'),function(e){e.style.display='inline-block';if(extra===true){i_e.innerHTML=" Show "+e.childNodes[0].innerHTML;}});}}if(e.parentNode.id==="main"){var otherMessage='';var fontSize;var extraClass;if(hasClass(e,"type-decl")){fontSize="20px";otherMessage=' Show declaration';if(showItemDeclarations===false){extraClass='collapsed';}}else if(hasClass(e,"sub-variant")){otherMessage=' Show fields';}else if(hasClass(e,"non-exhaustive")){otherMessage=' This ';if(hasClass(e,"non-exhaustive-struct")){otherMessage+='struct';}else if(hasClass(e,"non-exhaustive-enum")){otherMessage+='enum';}else if(hasClass(e,"non-exhaustive-type")){otherMessage+='type';}otherMessage+=' is marked as non-exhaustive';}else if(hasClass(e.childNodes[0],"impl-items")){extraClass="marg-left";}e.parentNode.insertBefore(createToggle(otherMessage,fontSize,extraClass,hasClass(e,"type-decl")===false||showItemDeclarations===true),e);if(hasClass(e,"type-decl")===true&&showItemDeclarations===true){collapseDocs(e.previousSibling.childNodes[0],"toggle");}}}onEach(document.getElementsByClassName('docblock'),buildToggleWrapper);onEach(document.getElementsByClassName('sub-variant'),buildToggleWrapper);function createToggleWrapper(tog){var span=document.createElement('span');span.className='toggle-label';span.style.display='none';span.innerHTML=' Expand attributes';tog.appendChild(span);var wrapper=document.createElement('div');wrapper.className='toggle-wrapper toggle-attributes';wrapper.appendChild(tog);return wrapper;}function printTab(nb){if(nb===0||nb===1||nb===2){currentTab=nb;}var nb_copy=nb;onEach(document.getElementById('titles').childNodes,function(elem){if(nb_copy===0){addClass(elem,'selected');}else{removeClass(elem,'selected');}nb_copy-=1;});onEach(document.getElementById('results').childNodes,function(elem){if(nb===0){elem.style.display='';}else{elem.style.display='none';}nb-=1;});}var itemAttributesFunc=function(){};if(getCurrentValue("rustdoc-item-attributes")!=="false"){itemAttributesFunc=function(x){collapseDocs(x.previousSibling.childNodes[0],"toggle");};}onEach(document.getElementById('main').getElementsByClassName('attributes'),function(i_e){i_e.parentNode.insertBefore(createToggleWrapper(toggle.cloneNode(true)),i_e);itemAttributesFunc(i_e);});var lineNumbersFunc=function(){};if(getCurrentValue("rustdoc-line-numbers")==="true"){lineNumbersFunc=function(x){var count=x.textContent.split('\n').length;var elems=[];for(var i=0;i'+'
'+content+'';document.getElementsByTagName('body')[0].appendChild(modal);document.getElementById('modal-close').onclick=hideModal;modal.onclick=hideModal;}function hideModal(){var modal=document.getElementById("important");if(modal){modal.parentNode.removeChild(modal);}}onEach(document.getElementsByClassName('important-traits'),function(e){e.onclick=function(){showModal(e.lastElementChild.innerHTML);};});function putBackSearch(search_input){if(search_input.value!==""){addClass(document.getElementById("main"),"hidden");removeClass(document.getElementById("search"),"hidden");if(browserSupportsHistoryApi()){history.replaceState(search_input.value,"","?search="+encodeURIComponent(search_input.value));}}}if(search_input){search_input.onfocus=function(){putBackSearch(this);};}var params=getQueryStringParams();if(params&¶ms.search){addClass(document.getElementById("main"),"hidden");var search=document.getElementById("search");removeClass(search,"hidden");search.innerHTML='

Loading search results...

';}var sidebar_menu=document.getElementsByClassName("sidebar-menu")[0];if(sidebar_menu){sidebar_menu.onclick=function(){var sidebar=document.getElementsByClassName('sidebar')[0];if(hasClass(sidebar,"mobile")===true){hideSidebar();}else{showSidebar();}};}window.onresize=function(){hideSidebar();};autoCollapse(getPageId(),getCurrentValue("rustdoc-collapse")==="true");if(window.location.hash&&window.location.hash.length>0){expandSection(window.location.hash.replace(/^#/,''));}}());function focusSearchBar(){document.getElementsByClassName('search-input')[0].focus();}function defocusSearchBar(){document.getElementsByClassName('search-input')[0].blur();} \ No newline at end of file +if(!String.prototype.startsWith){String.prototype.startsWith=function(searchString,position){position=position||0;return this.indexOf(searchString,position)===position;};}if(!String.prototype.endsWith){String.prototype.endsWith=function(suffix,length){var l=length||this.length;return this.indexOf(suffix,l-suffix.length)!==-1;};}if(!DOMTokenList.prototype.add){DOMTokenList.prototype.add=function(className){if(className&&!hasClass(this,className)){if(this.className&&this.className.length>0){this.className+=" "+className;}else{this.className=className;}}};}if(!DOMTokenList.prototype.remove){DOMTokenList.prototype.remove=function(className){if(className&&this.className){this.className=(" "+this.className+" ").replace(" "+className+" "," ").trim();}};}(function(){"use strict";var itemTypes=["mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","primitive","associatedtype","constant","associatedconstant","union","foreigntype","keyword","existential","attr","derive"];var search_input=document.getElementsByClassName("search-input")[0];var currentTab=0;var themesWidth=null;var titleBeforeSearch=document.title;function getPageId(){var id=document.location.href.split("#")[1];if(id){return id.split("?")[0].split("&")[0];}return null;}function showSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){addClass(elems,"show-it");}var sidebar=document.getElementsByClassName("sidebar")[0];if(sidebar){addClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(!filler){var div=document.createElement("div");div.id="sidebar-filler";sidebar.appendChild(div);}}var themePicker=document.getElementsByClassName("theme-picker");if(themePicker&&themePicker.length>0){themePicker[0].style.display="none";}}function hideSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){removeClass(elems,"show-it");}var sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(filler){filler.remove();}document.getElementsByTagName("body")[0].style.marginTop="";var themePicker=document.getElementsByClassName("theme-picker");if(themePicker&&themePicker.length>0){themePicker[0].style.display=null;}}var TY_PRIMITIVE=itemTypes.indexOf("primitive");var TY_KEYWORD=itemTypes.indexOf("keyword");onEachLazy(document.getElementsByClassName("js-only"),function(e){removeClass(e,"js-only");});function getQueryStringParams(){var params={};window.location.search.substring(1).split("&").map(function(s){var pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1]);});return params;}function browserSupportsHistoryApi(){return document.location.protocol!="file:"&&window.history&&typeof window.history.pushState==="function";}var main=document.getElementById("main");function highlightSourceLines(ev){hideSidebar();var elem;var search=document.getElementById("search");var i,from,to,match=window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/);if(match){from=parseInt(match[1],10);to=Math.min(50000,parseInt(match[2]||match[1],10));from=Math.min(from,to);elem=document.getElementById(from);if(!elem){return;}if(ev===null){var x=document.getElementById(from);if(x){x.scrollIntoView();}}onEachLazy(document.getElementsByClassName("line-numbers"),function(e){onEachLazy(e.getElementsByTagName("span"),function(i_e){removeClass(i_e,"line-highlighted");});});for(i=from;i<=to;++i){addClass(document.getElementById(i),"line-highlighted");}}else if(ev!==null&&search&&!hasClass(search,"hidden")&&ev.newURL){addClass(search,"hidden");removeClass(main,"hidden");var hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(browserSupportsHistoryApi()){history.replaceState(hash,"","?search=#"+hash);}elem=document.getElementById(hash);if(elem){elem.scrollIntoView();}}}function expandSection(id){var elem=document.getElementById(id);if(elem&&isHidden(elem)){var h3=elem.parentNode.previousElementSibling;if(h3&&h3.tagName!=="H3"){h3=h3.previousElementSibling;}if(h3){var collapses=h3.getElementsByClassName("collapse-toggle");if(collapses.length>0){collapseDocs(collapses[0],"show");}}}}highlightSourceLines(null);window.onhashchange=highlightSourceLines;function getVirtualKey(ev){if("key"in ev&&typeof ev.key!="undefined"){return ev.key;}var c=ev.charCode||ev.keyCode;if(c==27){return"Escape";}return String.fromCharCode(c);}function displayHelp(display,ev){if(display===true){if(hasClass(help,"hidden")){ev.preventDefault();removeClass(help,"hidden");addClass(document.body,"blur");}}else if(hasClass(help,"hidden")===false){ev.preventDefault();addClass(help,"hidden");removeClass(document.body,"blur");}}function handleEscape(ev,help){hideModal();var search=document.getElementById("search");if(hasClass(help,"hidden")===false){displayHelp(false,ev);}else if(hasClass(search,"hidden")===false){ev.preventDefault();addClass(search,"hidden");removeClass(main,"hidden");document.title=titleBeforeSearch;}defocusSearchBar();}function handleShortcut(ev){if(ev.ctrlKey||ev.altKey||ev.metaKey){return;}var help=document.getElementById("help");if(document.activeElement.tagName==="INPUT"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev,help);break;}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev,help);break;case"s":case"S":displayHelp(false,ev);hideModal();ev.preventDefault();focusSearchBar();break;case"+":case"-":ev.preventDefault();toggleAllDocs();break;case"?":if(ev.shiftKey){hideModal();displayHelp(true,ev);}break;}}}function findParentElement(elem,tagName){do{if(elem&&elem.tagName===tagName){return elem;}elem=elem.parentNode;}while(elem);return null;}document.onkeypress=handleShortcut;document.onkeydown=handleShortcut;document.onclick=function(ev){if(hasClass(ev.target,"collapse-toggle")){collapseDocs(ev.target,"toggle");}else if(hasClass(ev.target.parentNode,"collapse-toggle")){collapseDocs(ev.target.parentNode,"toggle");}else if(ev.target.tagName==="SPAN"&&hasClass(ev.target.parentNode,"line-numbers")){var prev_id=0;var set_fragment=function(name){if(browserSupportsHistoryApi()){history.replaceState(null,null,"#"+name);window.hashchange();}else{location.replace("#"+name);}};var cur_id=parseInt(ev.target.id,10);if(ev.shiftKey&&prev_id){if(prev_id>cur_id){var tmp=prev_id;prev_id=cur_id;cur_id=tmp;}set_fragment(prev_id+"-"+cur_id);}else{prev_id=cur_id;set_fragment(cur_id);}}else if(hasClass(document.getElementById("help"),"hidden")===false){addClass(document.getElementById("help"),"hidden");removeClass(document.body,"blur");}else{var a=findParentElement(ev.target,"A");if(a&&a.hash){expandSection(a.hash.replace(/^#/,""));}}};var x=document.getElementsByClassName("version-selector");if(x.length>0){x[0].onchange=function(){var i,match,url=document.location.href,stripped="",len=rootPath.match(/\.\.\//g).length+1;for(i=0;i-1){var obj=searchIndex[results[i].id];obj.lev=results[i].lev;if(isType!==true||obj.type){var res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=obj.displayPath+obj.name;obj.fullPath+="|"+obj.ty;obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break;}}}}return out;}function sortResults(results,isType){var ar=[];for(var entry in results){if(results.hasOwnProperty(entry)){ar.push(results[entry]);}}results=ar;var i;var nresults=results.length;for(i=0;ib?+1:-1);}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b;}a=aaa.index;b=bbb.index;if(a!==b){return a-b;}if((aaa.item.ty===TY_PRIMITIVE&&bbb.item.ty!==TY_KEYWORD)||(aaa.item.ty===TY_KEYWORD&&bbb.item.ty!==TY_PRIMITIVE)){return-1;}if((bbb.item.ty===TY_PRIMITIVE&&aaa.item.ty!==TY_PRIMITIVE)||(bbb.item.ty===TY_KEYWORD&&aaa.item.ty!==TY_KEYWORD)){return 1;}a=(aaa.item.desc==="");b=(bbb.item.desc==="");if(a!==b){return a-b;}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b;}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1);}return 0;});var length=results.length;for(i=0;i"));return{name:val.substring(0,val.indexOf("<")),generics:values.split(/\s*,\s*/),};}return{name:val,generics:[],};}function checkGenerics(obj,val){var lev_distance=MAX_LEV_DISTANCE+1;if(val.generics.length>0){if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>=val.generics.length){var elems=obj[GENERICS_DATA].slice(0);var total=0;var done=0;var vlength=val.generics.length;for(var y=0;yGENERICS_DATA&&obj[GENERICS_DATA].length>=val.generics.length){var elems=obj[GENERICS_DATA].slice(0);var allFound=true;for(var y=0;allFound===true&&yGENERICS_DATA&&obj[GENERICS_DATA].length!==0){var tmp_lev=checkGenerics(obj,val);if(tmp_lev<=MAX_LEV_DISTANCE){return tmp_lev;}}else{return 0;}}if(literalSearch===true){if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>0){var length=obj[GENERICS_DATA].length;for(x=0;xGENERICS_DATA&&obj[GENERICS_DATA].length>0){var olength=obj[GENERICS_DATA].length;for(x=0;x0){var length=obj.type[INPUTS_DATA].length;for(var i=0;iOUTPUT_DATA){var tmp=checkType(obj.type[OUTPUT_DATA],val,literalSearch);if(literalSearch===true&&tmp===true){return true;}lev_distance=Math.min(tmp,lev_distance);if(lev_distance===0){return 0;}}return literalSearch===true?false:lev_distance;}function checkPath(contains,lastElem,ty){if(contains.length===0){return 0;}var ret_lev=MAX_LEV_DISTANCE+1;var path=ty.path.split("::");if(ty.parent&&ty.parent.name){path.push(ty.parent.name.toLowerCase());}var length=path.length;var clength=contains.length;if(clength>length){return MAX_LEV_DISTANCE+1;}for(var i=0;ilength){break;}var lev_total=0;var aborted=false;for(var x=0;xMAX_LEV_DISTANCE){aborted=true;break;}lev_total+=lev;}if(aborted===false){ret_lev=Math.min(ret_lev,Math.round(lev_total/clength));}}return ret_lev;}function typePassesFilter(filter,type){if(filter<0)return true;if(filter===type)return true;var name=itemTypes[type];switch(itemTypes[filter]){case"constant":return(name=="associatedconstant");case"fn":return(name=="method"||name=="tymethod");case"type":return(name=="primitive"||name=="keyword");}return false;}function generateId(ty){if(ty.parent&&ty.parent.name){return itemTypes[ty.ty]+ty.path+ty.parent.name+ty.name;}return itemTypes[ty.ty]+ty.path+ty.name;}var nSearchWords=searchWords.length;var i;var ty;var fullId;var returned;var in_args;if((val.charAt(0)==="\""||val.charAt(0)==="'")&&val.charAt(val.length-1)===val.charAt(0)){val=extractGenerics(val.substr(1,val.length-2));for(i=0;i")>-1){var trimmer=function(s){return s.trim();};var parts=val.split("->").map(trimmer);var input=parts[0];var inputs=input.split(",").map(trimmer).sort();for(i=0;iOUTPUT_DATA?type[OUTPUT_DATA].name:"";returned=checkReturned(ty,output,true);if(output.name==="*"||returned===true){in_args=false;var module=false;if(input==="*"){module=true;}else{var allFound=true;for(var it=0;allFound===true&&it1?paths.length-1:1);for(j=0;j1){lev=checkPath(contains,paths[paths.length-1],ty);if(lev>MAX_LEV_DISTANCE){continue;}else if(lev>0){lev_add=1;}}returned=MAX_LEV_DISTANCE+1;in_args=MAX_LEV_DISTANCE+1;var index=-1;lev=MAX_LEV_DISTANCE+1;fullId=generateId(ty);if(searchWords[j].indexOf(split[i])>-1||searchWords[j].indexOf(val)>-1||searchWords[j].replace(/_/g,"").indexOf(val)>-1){if(typePassesFilter(typeFilter,ty.ty)&&results[fullId]===undefined){index=searchWords[j].replace(/_/g,"").indexOf(val);}}if((lev=levenshtein(searchWords[j],val))<=MAX_LEV_DISTANCE){if(typePassesFilter(typeFilter,ty.ty)===false){lev=MAX_LEV_DISTANCE+1;}else{lev+=1;}}if((in_args=findArg(ty,valGenerics))<=MAX_LEV_DISTANCE){if(typePassesFilter(typeFilter,ty.ty)===false){in_args=MAX_LEV_DISTANCE+1;}}if((returned=checkReturned(ty,valGenerics))<=MAX_LEV_DISTANCE){if(typePassesFilter(typeFilter,ty.ty)===false){returned=MAX_LEV_DISTANCE+1;}}lev+=lev_add;if(lev>0&&val.length>3&&searchWords[j].indexOf(val)>-1){if(val.length<6){lev-=1;}else{lev=0;}}if(in_args<=MAX_LEV_DISTANCE){if(results_in_args[fullId]===undefined){results_in_args[fullId]={id:j,index:index,lev:in_args,};}results_in_args[fullId].lev=Math.min(results_in_args[fullId].lev,in_args);}if(returned<=MAX_LEV_DISTANCE){if(results_returned[fullId]===undefined){results_returned[fullId]={id:j,index:index,lev:returned,};}results_returned[fullId].lev=Math.min(results_returned[fullId].lev,returned);}if(index!==-1||lev<=MAX_LEV_DISTANCE){if(index!==-1&&paths.length<2){lev=0;}if(results[fullId]===undefined){results[fullId]={id:j,index:index,lev:lev,};}results[fullId].lev=Math.min(results[fullId].lev,lev);}}}var ret={"in_args":sortResults(results_in_args,true),"returned":sortResults(results_returned,true),"others":sortResults(results),};if(ALIASES&&ALIASES[window.currentCrate]&&ALIASES[window.currentCrate][query.raw]){var aliases=ALIASES[window.currentCrate][query.raw];for(i=0;iMAX_RESULTS){ret.others.pop();}}}return ret;}function validateResult(name,path,keys,parent){for(var i=0;i-1||path.indexOf(keys[i])>-1||(parent!==undefined&&parent.name.toLowerCase().indexOf(keys[i])>-1)||levenshtein(name,keys[i])<=MAX_LEV_DISTANCE)){return false;}}return true;}function getQuery(raw){var matches,type,query;query=raw;matches=query.match(/^(fn|mod|struct|enum|trait|type|const|macro)\s*:\s*/i);if(matches){type=matches[1].replace(/^const$/,"constant");query=query.substring(matches[0].length);}return{raw:raw,query:query,type:type,id:query+type};}function initSearchNav(){var hoverTimeout;var click_func=function(e){var el=e.target;while(el.tagName!=="TR"){el=el.parentNode;}var dst=e.target.getElementsByTagName("a");if(dst.length<1){return;}dst=dst[0];if(window.location.pathname===dst.pathname){addClass(document.getElementById("search"),"hidden");removeClass(main,"hidden");document.location.href=dst.href;}};var mouseover_func=function(e){var el=e.target;while(el.tagName!=="TR"){el=el.parentNode;}clearTimeout(hoverTimeout);hoverTimeout=setTimeout(function(){onEachLazy(document.getElementsByClassName("search-results"),function(e){onEachLazy(e.getElementsByClassName("result"),function(i_e){removeClass(i_e,"highlighted");});});addClass(el,"highlighted");},20);};onEachLazy(document.getElementsByClassName("search-results"),function(e){onEachLazy(e.getElementsByClassName("result"),function(i_e){i_e.onclick=click_func;i_e.onmouseover=mouseover_func;});});search_input.onkeydown=function(e){var actives=[[],[],[]];var current=0;onEachLazy(document.getElementsByClassName("search-results"),function(e){onEachLazy(e.getElementsByClassName("highlighted"),function(e){actives[current].push(e);});current+=1;});if(e.which===38){if(!actives[currentTab].length||!actives[currentTab][0].previousElementSibling){return;}addClass(actives[currentTab][0].previousElementSibling,"highlighted");removeClass(actives[currentTab][0],"highlighted");}else if(e.which===40){if(!actives[currentTab].length){var results=document.getElementsByClassName("search-results");if(results.length>0){var res=results[currentTab].getElementsByClassName("result");if(res.length>0){addClass(res[0],"highlighted");}}}else if(actives[currentTab][0].nextElementSibling){addClass(actives[currentTab][0].nextElementSibling,"highlighted");removeClass(actives[currentTab][0],"highlighted");}}else if(e.which===13){if(actives[currentTab].length){document.location.href=actives[currentTab][0].getElementsByTagName("a")[0].href;}}else if(e.which===9){if(e.shiftKey){printTab(currentTab>0?currentTab-1:2);}else{printTab(currentTab>1?0:currentTab+1);}e.preventDefault();}else if(e.which===16){}else if(e.which===27){removeClass(actives[currentTab][0],"highlighted");search_input.value="";defocusSearchBar();}else if(actives[currentTab].length>0){removeClass(actives[currentTab][0],"highlighted");}};}function buildHrefAndPath(item){var displayPath;var href;var type=itemTypes[item.ty];var name=item.name;if(type==="mod"){displayPath=item.path+"::";href=rootPath+item.path.replace(/::/g,"/")+"/"+name+"/index.html";}else if(type==="primitive"||type==="keyword"){displayPath="";href=rootPath+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html";}else if(type==="externcrate"){displayPath="";href=rootPath+name+"/index.html";}else if(item.parent!==undefined){var myparent=item.parent;var anchor="#"+type+"."+name;var parentType=itemTypes[myparent.ty];if(parentType==="primitive"){displayPath=myparent.name+"::";}else{displayPath=item.path+"::"+myparent.name+"::";}href=rootPath+item.path.replace(/::/g,"/")+"/"+parentType+"."+myparent.name+".html"+anchor;}else{displayPath=item.path+"::";href=rootPath+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html";}return[displayPath,href];}function escape(content){var h1=document.createElement("h1");h1.textContent=content;return h1.innerHTML;}function pathSplitter(path){var tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6);}return tmp;}function addTab(array,query,display){var extraStyle="";if(display===false){extraStyle=" style=\"display: none;\"";}var output="";var duplicates={};var length=0;if(array.length>0){output="";array.forEach(function(item){var name,type;name=item.name;type=itemTypes[item.ty];if(item.is_alias!==true){if(duplicates[item.fullPath]){return;}duplicates[item.fullPath]=true;}length+=1;output+="";});output+="
"+""+(item.is_alias===true?(""+item.alias+"  - see "):"")+item.displayPath+""+name+""+""+""+escape(item.desc)+" 
";}else{output="
No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:
";}return[output,length];}function makeTabHeader(tabNb,text,nbElems){if(currentTab===tabNb){return"
"+text+"
("+nbElems+")
";}return"
"+text+"
("+nbElems+")
";}function showResults(results){if(results.others.length===1&&getCurrentValue("rustdoc-go-to-only-result")==="true"){var elem=document.createElement("a");elem.href=results.others[0].href;elem.style.display="none";document.body.appendChild(elem);elem.click();}var query=getQuery(search_input.value);currentResults=query.id;var ret_others=addTab(results.others,query);var ret_in_args=addTab(results.in_args,query,false);var ret_returned=addTab(results.returned,query,false);var output="

Results for "+escape(query.query)+(query.type?" (type: "+escape(query.type)+")":"")+"

"+"
"+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+"
"+ret_others[0]+ret_in_args[0]+ret_returned[0]+"
";addClass(main,"hidden");var search=document.getElementById("search");removeClass(search,"hidden");search.innerHTML=output;var tds=search.getElementsByTagName("td");var td_width=0;if(tds.length>0){td_width=tds[0].offsetWidth;}var width=search.offsetWidth-40-td_width;onEachLazy(search.getElementsByClassName("desc"),function(e){e.style.width=width+"px";});initSearchNav();var elems=document.getElementById("titles").childNodes;elems[0].onclick=function(){printTab(0);};elems[1].onclick=function(){printTab(1);};elems[2].onclick=function(){printTab(2);};printTab(currentTab);}function execSearch(query,searchWords,filterCrates){function getSmallest(arrays,positions,notDuplicates){var start=null;for(var it=0;itpositions[it]&&(start===null||start>arrays[it][positions[it]].lev)&&!notDuplicates[arrays[it][positions[it]].fullPath]){start=arrays[it][positions[it]].lev;}}return start;}function mergeArrays(arrays){var ret=[];var positions=[];var notDuplicates={};for(var x=0;xpositions[x]&&arrays[x][positions[x]].lev===smallest&&!notDuplicates[arrays[x][positions[x]].fullPath]){ret.push(arrays[x][positions[x]]);notDuplicates[arrays[x][positions[x]].fullPath]=true;positions[x]+=1;}}}return ret;}var queries=query.raw.split(",");var results={"in_args":[],"returned":[],"others":[],};for(var i=0;i1){return{"in_args":mergeArrays(results.in_args),"returned":mergeArrays(results.returned),"others":mergeArrays(results.others),};}else{return{"in_args":results.in_args[0],"returned":results.returned[0],"others":results.others[0],};}}function getFilterCrates(){var elem=document.getElementById("crate-search");if(elem&&elem.value!=="All crates"&&rawSearchIndex.hasOwnProperty(elem.value)){return elem.value;}return undefined;}function search(e,forced){var params=getQueryStringParams();var query=getQuery(search_input.value.trim());if(e){e.preventDefault();}if(query.query.length===0){return;}if(forced!==true&&query.id===currentResults){if(query.query.length>0){putBackSearch(search_input);}return;}document.title="Results for "+query.query+" - Rust";if(browserSupportsHistoryApi()){if(!history.state&&!params.search){history.pushState(query,"","?search="+encodeURIComponent(query.raw));}else{history.replaceState(query,"","?search="+encodeURIComponent(query.raw));}}var filterCrates=getFilterCrates();showResults(execSearch(query,index,filterCrates),filterCrates);}function buildIndex(rawSearchIndex){searchIndex=[];var searchWords=[];var i;for(var crate in rawSearchIndex){if(!rawSearchIndex.hasOwnProperty(crate)){continue;}searchWords.push(crate);searchIndex.push({crate:crate,ty:1,name:crate,path:"",desc:rawSearchIndex[crate].doc,type:null,});var items=rawSearchIndex[crate].items;var paths=rawSearchIndex[crate].paths;var len=paths.length;for(i=0;i"+""+"
"+code.outerHTML+"
";list.appendChild(display);}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors);}function labelForToggleButton(sectionIsCollapsed){if(sectionIsCollapsed){return"+";}return"\u2212";}function onEveryMatchingChild(elem,className,func){if(elem&&className&&func){var length=elem.childNodes.length;var nodes=elem.childNodes;for(var i=0;i"+labelForToggleButton(sectionIsCollapsed)+"
]";return toggle;}var toggle=createSimpleToggle(false);var func=function(e){var next=e.nextElementSibling;if(!next){return;}if(hasClass(next,"docblock")||(hasClass(next,"stability")&&hasClass(next.nextElementSibling,"docblock"))){insertAfter(toggle.cloneNode(true),e.childNodes[e.childNodes.length-1]);}};var funcImpl=function(e){var next=e.nextElementSibling;if(next&&hasClass(next,"docblock")){next=next.nextElementSibling;}if(!next){return;}if(next.getElementsByClassName("method").length>0&&hasClass(e,"impl")){insertAfter(toggle.cloneNode(true),e.childNodes[e.childNodes.length-1]);}};onEachLazy(document.getElementsByClassName("method"),func);onEachLazy(document.getElementsByClassName("associatedconstant"),func);onEachLazy(document.getElementsByClassName("impl"),funcImpl);var impl_call=function(){};if(getCurrentValue("rustdoc-method-docs")!=="false"){impl_call=function(e,newToggle,pageId){if(e.id.match(/^impl(?:-\d+)?$/)===null){if(hasClass(e,"impl")){collapseDocs(newToggle,"hide",pageId);}}};}var pageId=getPageId();var newToggle=document.createElement("a");newToggle.href="javascript:void(0)";newToggle.className="collapse-toggle hidden-default collapsed";newToggle.innerHTML="["+labelForToggleButton(true)+"] Show hidden undocumented items";function toggleClicked(){if(hasClass(this,"collapsed")){removeClass(this,"collapsed");onEachLazy(this.parentNode.getElementsByClassName("hidden"),function(x){if(hasClass(x,"content")===false){removeClass(x,"hidden");addClass(x,"x");}},true);this.innerHTML="["+labelForToggleButton(false)+"] Hide undocumented items";}else{addClass(this,"collapsed");onEachLazy(this.parentNode.getElementsByClassName("x"),function(x){if(hasClass(x,"content")===false){addClass(x,"hidden");removeClass(x,"x");}},true);this.innerHTML="["+labelForToggleButton(true)+"] Show hidden undocumented items";}}onEachLazy(document.getElementsByClassName("impl-items"),function(e){onEachLazy(e.getElementsByClassName("associatedconstant"),func);var hiddenElems=e.getElementsByClassName("hidden");var needToggle=false;var hlength=hiddenElems.length;for(var i=0;i0){inner[0].innerHTML="+";}}if(extraClass){addClass(wrapper,extraClass);}wrapper.appendChild(mainToggle);return wrapper;}var showItemDeclarations=getCurrentValue("rustdoc-item-declarations")==="false";function buildToggleWrapper(e){if(hasClass(e,"autohide")){var wrap=e.previousElementSibling;if(wrap&&hasClass(wrap,"toggle-wrapper")){var inner_toggle=wrap.childNodes[0];var extra=e.childNodes[0].tagName==="H3";e.style.display="none";addClass(wrap,"collapsed");onEachLazy(inner_toggle.getElementsByClassName("inner"),function(e){e.innerHTML=labelForToggleButton(true);});onEachLazy(inner_toggle.getElementsByClassName("toggle-label"),function(e){e.style.display="inline-block";if(extra===true){i_e.innerHTML=" Show "+e.childNodes[0].innerHTML;}});}}if(e.parentNode.id==="main"){var otherMessage="";var fontSize;var extraClass;if(hasClass(e,"type-decl")){fontSize="20px";otherMessage=" Show declaration";if(showItemDeclarations===false){extraClass="collapsed";}}else if(hasClass(e,"sub-variant")){otherMessage=" Show fields";}else if(hasClass(e,"non-exhaustive")){otherMessage=" This ";if(hasClass(e,"non-exhaustive-struct")){otherMessage+="struct";}else if(hasClass(e,"non-exhaustive-enum")){otherMessage+="enum";}else if(hasClass(e,"non-exhaustive-type")){otherMessage+="type";}otherMessage+=" is marked as non-exhaustive";}else if(hasClass(e.childNodes[0],"impl-items")){extraClass="marg-left";}e.parentNode.insertBefore(createToggle(otherMessage,fontSize,extraClass,hasClass(e,"type-decl")===false||showItemDeclarations===true),e);if(hasClass(e,"type-decl")===true&&showItemDeclarations===true){collapseDocs(e.previousSibling.childNodes[0],"toggle");}}}onEachLazy(document.getElementsByClassName("docblock"),buildToggleWrapper);onEachLazy(document.getElementsByClassName("sub-variant"),buildToggleWrapper);function printTab(nb){if(nb===0||nb===1||nb===2){currentTab=nb;}var nb_copy=nb;onEachLazy(document.getElementById("titles").childNodes,function(elem){if(nb_copy===0){addClass(elem,"selected");}else{removeClass(elem,"selected");}nb_copy-=1;});onEachLazy(document.getElementById("results").childNodes,function(elem){if(nb===0){elem.style.display="";}else{elem.style.display="none";}nb-=1;});}function createToggleWrapper(tog){var span=document.createElement("span");span.className="toggle-label";span.style.display="none";span.innerHTML=" Expand attributes";tog.appendChild(span);var wrapper=document.createElement("div");wrapper.className="toggle-wrapper toggle-attributes";wrapper.appendChild(tog);return wrapper;}var itemAttributesFunc=function(){};if(getCurrentValue("rustdoc-item-attributes")!=="false"){itemAttributesFunc=function(x){collapseDocs(x.previousSibling.childNodes[0],"toggle");};}var attributesToggle=createToggleWrapper(createSimpleToggle(false));onEachLazy(main.getElementsByClassName("attributes"),function(i_e){i_e.parentNode.insertBefore(attributesToggle.cloneNode(true),i_e);itemAttributesFunc(i_e);});var lineNumbersFunc=function(){};if(getCurrentValue("rustdoc-line-numbers")==="true"){lineNumbersFunc=function(x){var count=x.textContent.split("\n").length;var elems=[];for(var i=0;i
✕"+"
"+content+"";document.getElementsByTagName("body")[0].appendChild(modal);document.getElementById("modal-close").onclick=hideModal;modal.onclick=hideModal;}function hideModal(){var modal=document.getElementById("important");if(modal){modal.parentNode.removeChild(modal);}}onEachLazy(document.getElementsByClassName("important-traits"),function(e){e.onclick=function(){showModal(e.lastElementChild.innerHTML);};});function putBackSearch(search_input){if(search_input.value!==""){addClass(main,"hidden");removeClass(document.getElementById("search"),"hidden");if(browserSupportsHistoryApi()){history.replaceState(search_input.value,"","?search="+encodeURIComponent(search_input.value));}}}if(search_input){search_input.onfocus=function(){putBackSearch(this);};}var params=getQueryStringParams();if(params&¶ms.search){addClass(main,"hidden");var search=document.getElementById("search");removeClass(search,"hidden");search.innerHTML="

Loading search results...

";}var sidebar_menu=document.getElementsByClassName("sidebar-menu")[0];if(sidebar_menu){sidebar_menu.onclick=function(){var sidebar=document.getElementsByClassName("sidebar")[0];if(hasClass(sidebar,"mobile")===true){hideSidebar();}else{showSidebar();}};}window.onresize=function(){hideSidebar();};autoCollapse(getPageId(),getCurrentValue("rustdoc-collapse")==="true");if(window.location.hash&&window.location.hash.length>0){expandSection(window.location.hash.replace(/^#/,""));}if(main){onEachLazy(main.getElementsByClassName("loading-content"),function(e){e.remove();});onEachLazy(main.childNodes,function(e){if(e.tagName==="H2"||e.tagName==="H3"){let nextTagName=e.nextElementSibling.tagName;if(nextTagName=="H2"||nextTagName=="H3"){e.nextElementSibling.style.display="flex";}else{e.nextElementSibling.style.display="block";}}});}function addSearchOptions(crates){var elem=document.getElementById('crate-search');if(!elem){return;}var crates_text=[];if(Object.keys(crates).length>1){for(var crate in crates){if(crates.hasOwnProperty(crate)){crates_text.push(crate);}}}crates_text.sort(function(a,b){var lower_a=a.toLowerCase();var lower_b=b.toLowerCase();if(lower_alower_b){return 1;}return 0;});for(var i=0;ih2+div,#main>h2+h3,#main>h3+div{display:block;}.loading-content{display:none;} \ No newline at end of file diff --git a/rustdoc.css b/rustdoc.css index 31545fd..2efe746 100644 --- a/rustdoc.css +++ b/rustdoc.css @@ -1,12 +1 @@ -/*! - * Copyright 2013 The Rust Project Developers. See the COPYRIGHT - * file at the top-level directory of this distribution and at - * http://rust-lang.org/COPYRIGHT. - * - * Licensed under the Apache License, Version 2.0 or the MIT license - * , at your - * option. This file may not be copied, modified, or distributed - * except according to those terms. - */ -@font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular.woff") format('woff');}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium.woff") format('woff');}@font-face {font-family:'Source Serif Pro';font-style:normal;font-weight:400;src:local('Source Serif Pro'),url("SourceSerifPro-Regular.woff") format('woff');}@font-face {font-family:'Source Serif Pro';font-style:italic;font-weight:400;src:url("Heuristica-Italic.woff") format('woff');}@font-face {font-family:'Source Serif Pro';font-style:normal;font-weight:700;src:local('Source Serif Pro Bold'),url("SourceSerifPro-Bold.woff") format('woff');}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular.woff") format('woff');}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold.woff") format('woff');}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}body{font:16px/1.4 "Source Serif Pro",serif;margin:0;position:relative;padding:10px 15px 20px 15px;-webkit-font-feature-settings:"kern","liga";-moz-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";}h1{font-size:1.5em;}h2{font-size:1.4em;}h3{font-size:1.3em;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod):not(.important),h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant){font-weight:500;margin:20px 0 15px 0;padding-bottom:6px;}h1.fqn{border-bottom:1px dashed;margin-top:0;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant){border-bottom:1px solid;}h3.impl,h3.method,h4.method,h3.type,h4.type,h4.associatedconstant{font-weight:600;margin-top:10px;margin-bottom:10px;position:relative;}h3.impl,h3.method,h3.type{padding-left:15px;}h1,h2,h3,h4,.sidebar,a.source,.search-input,.content table :not(code)>a,.collapse-toggle,div.item-list .out-of-band,#source-sidebar,#sidebar-toggle{font-family:"Fira Sans",sans-serif;}ol,ul{padding-left:25px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.6em;}p{margin:0 0 .6em 0;}summary{outline:none;}code,pre{font-family:"Source Code Pro",monospace;white-space:pre-wrap;}.docblock code,.docblock-short code{border-radius:3px;padding:0 0.1em;}.docblock pre code,.docblock-short pre code,.docblock code.spotlight{padding:0;}.docblock code.spotlight :last-child{padding-bottom:0.6em;}pre{padding:14px;}.source .content pre{padding:20px;}img{max-width:100%;}.source .content{margin-top:50px;max-width:none;overflow:visible;margin-left:0px;min-width:70em;}nav.sub{font-size:16px;text-transform:uppercase;}.sidebar{width:200px;position:fixed;left:0;top:0;height:100vh;overflow:auto;}.sidebar .block>ul>li{margin-right:-10px;}.content,nav{max-width:960px;}.js-only,.hidden{display:none !important;}.sidebar img{margin:20px auto;display:block;margin-top:10px;}.sidebar .location{border:1px solid;font-size:17px;margin:30px 10px 20px 10px;text-align:center;word-wrap:break-word;}.sidebar .version{font-size:15px;text-align:center;border-bottom:1px solid;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;}.location:empty{border:none;}.location a:first-child{font-weight:500;}.block{padding:0;margin-bottom:14px;}.block h2,.block h3{margin-top:0;margin-bottom:8px;text-align:center;}.block ul,.block li{margin:0 10px;padding:0;list-style:none;}.block a{display:block;text-overflow:ellipsis;overflow:hidden;line-height:15px;padding:7px 5px;font-size:14px;font-weight:300;transition:border 500ms ease-out;}.sidebar-title{border-top:1px solid;border-bottom:1px solid;text-align:center;font-size:17px;margin-bottom:5px;}.sidebar-links{margin-bottom:15px;}.sidebar-links>a{padding-left:10px;width:100%;}.sidebar-menu{display:none;}.content{padding:15px 0;}.source .content pre.rust{white-space:pre;overflow:auto;padding-left:0;}.rustdoc:not(.source) .example-wrap{display:inline-flex;margin-bottom:10px;}.example-wrap{width:100%;}.example-wrap>pre.line-number{overflow:initial;border:1px solid;border-top-left-radius:5px;border-bottom-left-radius:5px;padding:13px 8px;text-align:right;}.rustdoc:not(.source) .example-wrap>pre.rust{width:100%;}.rustdoc:not(.source) .example-wrap>pre{margin:0;}#search{margin-left:230px;position:relative;}#results{position:absolute;right:0;left:0;overflow:auto;}#results>table{width:100%;table-layout:fixed;}.content pre.line-numbers{float:left;border:none;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers span{cursor:pointer;}.docblock-short p{display:inline;}.docblock-short.nowrap{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.docblock-short p{overflow:hidden;text-overflow:ellipsis;margin:0;}.docblock-short code{white-space:nowrap;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom:1px solid;}#main>.docblock h1{font-size:1.3em;}#main>.docblock h2{font-size:1.15em;}#main>.docblock h3,#main>.docblock h4,#main>.docblock h5{font-size:1em;}.docblock h1{font-size:1em;}.docblock h2{font-size:0.95em;}.docblock h3,.docblock h4,.docblock h5{font-size:0.9em;}.docblock{margin-left:24px;position:relative;}.content .out-of-band{float:right;font-size:23px;margin:0px;padding:0px;font-weight:normal;}h3.impl>.out-of-band{font-size:21px;}h4.method>.out-of-band{font-size:19px;}h4>code,h3>code,.invisible>code{max-width:calc(100% - 41px);display:block;}.in-band,code{z-index:5;}.invisible{width:100%;display:inline-block;}.content .in-band{margin:0px;padding:0px;}.in-band>code{display:inline-block;}#main{position:relative;}#main>.since{top:inherit;font-family:"Fira Sans",sans-serif;}.content table:not(.table-display){border-spacing:0 5px;}.content td{vertical-align:top;}.content td:first-child{padding-right:20px;}.content td p:first-child{margin-top:0;}.content td h1,.content td h2{margin-left:0;font-size:1.1em;}.content tr:first-child td{border-top:0;}.docblock table{margin:.5em 0;width:100%;}.docblock table td{padding:.5em;border:1px dashed;}.docblock table th{padding:.5em;text-align:left;border:1px solid;}.fields+table{margin-bottom:1em;}.content .item-list{list-style-type:none;padding:0;}.content .multi-column{-moz-column-count:5;-moz-column-gap:2.5em;-webkit-column-count:5;-webkit-column-gap:2.5em;column-count:5;column-gap:2.5em;}.content .multi-column li{width:100%;display:inline-block;}.content .method{font-size:1em;position:relative;}.content .method .where,.content .fn .where,.content .where.fmt-newline{display:block;font-size:0.8em;}.content .methods>div:not(.important-traits){margin-left:40px;margin-bottom:15px;}.content .docblock>.impl-items{margin-left:20px;margin-top:-34px;}.content .docblock>.impl-items>h4{border-bottom:0;}.content .docblock>.impl-items .table-display{margin:0;}.content .docblock>.impl-items table td{padding:0;}.toggle-wrapper.marg-left>.collapse-toggle{left:-24px;}.content .docblock>.impl-items .table-display,.impl-items table td{border:none;}.content .stability code{font-size:90%;}.content .stability{position:relative;margin-left:33px;margin-top:-13px;}.sub-variant>div>.stability{margin-top:initial;}.content .stability::before{content:'˪';font-size:30px;position:absolute;top:-9px;left:-13px;}.content .impl-items .method,.content .impl-items>.type,.impl-items>.associatedconstant{margin-left:20px;}.content .impl-items .docblock,.content .impl-items .stability{margin-bottom:.6em;}.content .impl-items>.stability{margin-left:40px;}.methods>.stability,.content .impl-items>.stability{margin-top:-8px;}#main>.stability{margin-top:0;}nav{border-bottom:1px solid;padding-bottom:10px;margin-bottom:10px;}nav.main{padding:20px 0;text-align:center;}nav.main .current{border-top:1px solid;border-bottom:1px solid;}nav.main .separator{border:1px solid;display:inline-block;height:23px;margin:0 20px;}nav.sum{text-align:right;}nav.sub form{display:inline;}nav.sub,.content{margin-left:230px;}a{text-decoration:none;background:transparent;}.small-section-header:hover>.anchor{display:initial;}.in-band:hover>.anchor{display:inline-block;position:absolute;}.anchor{display:none;position:absolute;left:-7px;}.anchor.field{left:-5px;}.small-section-header>.anchor{left:-28px;padding-right:10px;}.anchor:before{content:'\2002\00a7\2002';}.docblock a:not(.srclink):not(.test-arrow):hover,.docblock-short a:not(.srclink):not(.test-arrow):hover,.stability a{text-decoration:underline;}.invisible>.srclink{position:absolute;top:0;right:0;font-size:17px;font-weight:normal;}.block a.current.crate{font-weight:500;}.search-container{position:relative;}.search-container>.top-button{position:absolute;right:0;top:10px;}.search-input{width:calc(100% - 34px);-moz-box-sizing:border-box !important;box-sizing:border-box !important;outline:none;border:none;border-radius:1px;margin-top:5px;padding:10px 16px;font-size:17px;transition:border-color 300ms ease;transition:border-radius 300ms ease-in-out;transition:box-shadow 300ms ease-in-out;}.search-input:focus{border-radius:2px;border:0;outline:0;box-shadow:0 0 8px #078dd8;}.search-results .desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;}.search-results a{display:block;}.content .search-results td:first-child{padding-right:0;width:50%;}.content .search-results td:first-child a{padding-right:10px;}.content .search-results td:first-child a:after{clear:both;content:"";display:block;}.content .search-results td:first-child a span{float:left;}tr.result span.primitive::after{content:' (primitive type)';font-style:italic;}tr.result span.keyword::after{content:' (keyword)';font-style:italic;}body.blur>:not(#help){filter:blur(8px);-webkit-filter:blur(8px);opacity:.7;}#help{width:100%;height:100vh;position:fixed;top:0;left:0;display:flex;justify-content:center;align-items:center;}#help>div{flex:0 0 auto;box-shadow:0 0 6px rgba(0,0,0,.2);width:550px;height:auto;border:1px solid;}#help dt{float:left;clear:left;display:block;}#help dd{margin:5px 35px;}#help .infos{padding-left:0;}#help h1,#help h2{margin-top:0;}#help>div div{width:50%;float:left;padding:20px;padding-left:17px;}.stab{display:table;border-width:1px;border-style:solid;padding:3px;margin-bottom:5px;font-size:90%;}.stab p{display:inline;}.stab summary{display:list-item;}.stab .microscope{font-size:1.5em;}.module-item .stab{display:inline;border-width:0;padding:0;margin:0;background:inherit !important;}.module-item.unstable{opacity:0.65;}.since{font-weight:normal;font-size:initial;position:absolute;right:0;top:0;}.variants_table{width:100%;}.variants_table tbody tr td:first-child{width:1%;}td.summary-column{width:100%;}.summary{padding-right:0px;}pre.rust .question-mark{font-weight:bold;}a.test-arrow{display:inline-block;position:absolute;padding:5px 10px 5px 10px;border-radius:5px;font-size:130%;top:5px;right:5px;}a.test-arrow:hover{text-decoration:none;}.section-header:hover a:before{position:absolute;left:-25px;padding-right:10px;content:'\2002\00a7\2002';}.section-header:hover a{text-decoration:none;}.section-header a{color:inherit;}.collapse-toggle{font-weight:300;position:absolute;left:-23px;top:0;}h3>.collapse-toggle,h4>.collapse-toggle{font-size:0.8em;top:5px;}.toggle-wrapper>.collapse-toggle{left:-24px;margin-top:0px;}.toggle-wrapper{position:relative;margin-top:0;}.toggle-wrapper.collapsed{height:25px;transition:height .2s;margin-bottom:.6em;}.collapse-toggle>.inner{display:inline-block;width:1.2ch;text-align:center;}.collapse-toggle.hidden-default{position:relative;margin-left:20px;}.ghost{display:none;}.ghost+.since{position:initial;display:table-cell;}.since+.srclink{display:table-cell;padding-left:10px;}.item-spacer{width:100%;height:12px;}span.since{position:initial;font-size:20px;margin-right:5px;}.toggle-wrapper>.collapse-toggle{left:0;}.variant+.toggle-wrapper+.docblock>p{margin-top:5px;}.sub-variant,.sub-variant>h3{margin-top:1px !important;}#main>.sub-variant>h3{font-size:15px;margin-left:25px;margin-bottom:5px;}.sub-variant>div{margin-left:20px;margin-bottom:10px;}.sub-variant>div>span{display:block;position:relative;}.toggle-label{display:inline-block;margin-left:4px;margin-top:3px;}.enum>.toggle-wrapper+.docblock,.struct>.toggle-wrapper+.docblock{margin-left:30px;margin-bottom:20px;margin-top:5px;}.docblock>.section-header:first-child{margin-left:15px;margin-top:0;}.docblock>.section-header:first-child:hover>a:before{left:-10px;}.enum>.collapsed,.struct>.collapsed{margin-bottom:25px;}#main>.variant,#main>.structfield{display:block;}.attributes{display:block;margin-top:0px !important;margin-right:0px;margin-bottom:0px !important;margin-left:30px;}.toggle-attributes.collapsed{margin-bottom:0;}.impl-items>.toggle-attributes{margin-left:20px;}.impl-items .attributes{font-weight:500;}:target>code{opacity:1;}@media (max-width:700px){body{padding-top:0px;}.rustdoc>.sidebar{height:45px;min-height:40px;margin:0;margin-left:-15px;padding:0 15px;position:static;z-index:1;}.sidebar>.location{float:right;margin:0px;margin-top:2px;padding:3px 10px 1px 10px;min-height:39px;background:inherit;text-align:left;font-size:24px;}.sidebar .location:empty{padding:0;}.sidebar img{width:35px;margin-top:5px;margin-bottom:5px;float:left;margin-left:50px;}.sidebar-menu{position:fixed;z-index:10;font-size:2rem;cursor:pointer;width:45px;left:0;text-align:center;display:block;border-bottom:1px solid;border-right:1px solid;height:45px;}.sidebar-elems{position:fixed;z-index:1;left:0;top:45px;bottom:0;overflow-y:auto;border-right:1px solid;display:none;}.sidebar>.block.version{border-bottom:none;margin-top:12px;}nav.sub{width:calc(100% - 32px);float:right;}.content{margin-left:0px;}#main{margin-top:45px;padding:0;}.content .in-band{width:100%;}.content h4>.out-of-band{position:inherit;}.toggle-wrapper>.collapse-toggle{left:0px;}.toggle-wrapper{height:1.5em;}#search{margin-left:0;}.content .impl-items .method,.content .impl-items>.type,.impl-items>.associatedconstant{display:flex;}.anchor{display:none !important;}h1.fqn{overflow:initial;}}@media print{nav.sub,.content .out-of-band,.collapse-toggle{display:none;}}.information{position:absolute;left:-20px;margin-top:7px;z-index:1;}.tooltip{position:relative;display:inline-block;cursor:pointer;}.tooltip .tooltiptext{width:120px;display:none;text-align:center;padding:5px 3px;border-radius:6px;margin-left:5px;top:-5px;left:105%;z-index:1;}.tooltip:hover .tooltiptext{display:inline;}.tooltip .tooltiptext::after{content:" ";position:absolute;top:50%;left:11px;margin-top:-5px;border-width:5px;border-style:solid;}.important-traits .tooltip .tooltiptext{border:1px solid;}pre.rust{position:relative;tab-width:4;-moz-tab-width:4;}.search-failed{text-align:center;margin-top:20px;}#titles{height:35px;}#titles>div{float:left;width:33.3%;text-align:center;font-size:18px;cursor:pointer;border-top:2px solid;}#titles>div:not(:last-child):not(.selected){margin-right:1px;width:calc(33.3% - 1px);}#titles>div>div.count{display:inline-block;font-size:16px;}.important-traits{cursor:pointer;z-index:2;}h4>.important-traits{position:absolute;left:-44px;top:2px;}#all-types{text-align:center;border:1px solid;margin:0 10px;margin-bottom:10px;display:block;border-radius:7px;}#all-types>p{margin:5px 0;}@media (max-width:700px){h4>.important-traits{position:absolute;left:-22px;top:24px;}#titles>div>div.count{float:left;width:100%;}#titles{height:50px;}.sidebar.mobile{position:fixed;width:100%;margin-left:0;background-color:rgba(0,0,0,0);height:100%;}.sidebar{width:calc(100% + 30px);}.show-it{display:block;width:246px;}.show-it>.block.items{margin:8px 0;}.show-it>.block.items>ul{margin:0;}.show-it>.block.items>ul>li{text-align:center;margin:2px 0;}.show-it>.block.items>ul>li>a{font-size:21px;}#sidebar-filler{position:fixed;left:45px;width:calc(100% - 45px);top:0;height:45px;z-index:-1;border-bottom:1px solid;}.collapse-toggle{left:-20px;}.impl>.collapse-toggle{left:-10px;}#all-types{margin:10px;}}@media (max-width:416px){#titles{height:73px;}#titles>div{height:73px;}}.modal{position:fixed;width:100vw;height:100vh;z-index:10000;top:0;left:0;}.modal-content{display:block;max-width:60%;min-width:200px;padding:8px;top:40%;position:absolute;left:50%;transform:translate(-50%,-40%);border:1px solid;border-radius:4px;border-top-right-radius:0;}.modal-content>.docblock{margin:0;}h3.important{margin:0;margin-bottom:13px;font-size:19px;}.modal-content>.docblock>code.content{margin:0;padding:0;font-size:20px;}.modal-content>.close{position:absolute;font-weight:900;right:-25px;top:-1px;font-size:18px;width:25px;padding-right:2px;border-top-right-radius:5px;border-bottom-right-radius:5px;text-align:center;border:1px solid;border-right:0;cursor:pointer;}.modal-content>.whiter{height:25px;position:absolute;width:3px;right:-2px;top:0px;}#main>div.important-traits{position:absolute;left:-24px;margin-top:16px;}.content>.methods>div.important-traits{position:absolute;left:-42px;margin-top:2px;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px;border-radius:3px;box-shadow:inset 0 -1px 0;cursor:default;}.theme-picker{position:absolute;left:211px;top:19px;}.theme-picker button{outline:none;}#settings-menu{position:absolute;right:0;top:10px;outline:none;}#theme-picker,#settings-menu{padding:4px;width:27px;height:29px;border:1px solid;border-radius:3px;cursor:pointer;}#theme-choices{display:none;position:absolute;left:0;top:28px;border:1px solid;border-radius:3px;z-index:1;cursor:pointer;}#theme-choices>button{border:none;width:100%;padding:4px;text-align:center;background:rgba(0,0,0,0);}#theme-choices>button:not(:first-child){border-top:1px solid;}@media (max-width:700px){.theme-picker{left:10px;top:54px;z-index:1;}}.hidden-by-impl-hider,.hidden-by-usual-hider{display:none !important;}#implementations-list>h3>span.in-band{width:100%;}.table-display{width:100%;border:0;border-collapse:collapse;border-spacing:0;font-size:16px;}.table-display tr td:first-child{padding-right:0;}.table-display tr td:last-child{float:right;}.table-display .out-of-band{position:relative;font-size:19px;display:block;}#implementors-list>.impl-items .table-display .out-of-band{font-size:17px;}.table-display td:hover .anchor{display:block;top:2px;left:-5px;}#main>ul{padding-left:10px;}#main>ul>li{list-style:none;}.non-exhaustive{margin-bottom:1em;}#sidebar-toggle{position:fixed;top:30px;left:300px;z-index:10;padding:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;cursor:pointer;font-weight:bold;transition:left .5s;font-size:1.2em;border:1px solid;border-left:0;}#source-sidebar{position:fixed;top:0;bottom:0;left:0;width:300px;z-index:1;overflow:auto;transition:left .5s;border-right:1px solid;}#source-sidebar>.title{font-size:1.5em;text-align:center;border-bottom:1px solid;margin-bottom:6px;}div.children{padding-left:27px;display:none;}div.name{cursor:pointer;position:relative;margin-left:16px;}div.files>a{display:block;padding:0 3px;}div.files>a:hover,div.name:hover{background-color:#a14b4b;}div.name.expand+.children{display:block;}div.name::before{content:"\25B6";padding-left:4px;font-size:0.7em;position:absolute;left:-16px;top:4px;}div.name.expand::before{transform:rotate(90deg);left:-14px;} \ No newline at end of file + @font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular.woff") format('woff');}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium.woff") format('woff');}@font-face {font-family:'Source Serif Pro';font-style:normal;font-weight:400;src:local('Source Serif Pro'),url("SourceSerifPro-Regular.ttf.woff") format('woff');}@font-face {font-family:'Source Serif Pro';font-style:italic;font-weight:400;src:local('Source Serif Pro Italic'),url("SourceSerifPro-It.ttf.woff") format('woff');}@font-face {font-family:'Source Serif Pro';font-style:normal;font-weight:700;src:local('Source Serif Pro Bold'),url("SourceSerifPro-Bold.ttf.woff") format('woff');}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular.woff") format('woff');}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold.woff") format('woff');}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}body{font:16px/1.4 "Source Serif Pro",serif;margin:0;position:relative;padding:10px 15px 20px 15px;-webkit-font-feature-settings:"kern","liga";-moz-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";}h1{font-size:1.5em;}h2{font-size:1.4em;}h3{font-size:1.3em;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod):not(.important),h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant){font-weight:500;margin:20px 0 15px 0;padding-bottom:6px;}h1.fqn{border-bottom:1px dashed;margin-top:0;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant){border-bottom:1px solid;}h3.impl,h3.method,h4.method,h3.type,h4.type,h4.associatedconstant{flex-basis:100%;font-weight:600;margin-top:16px;margin-bottom:10px;position:relative;}h3.impl,h3.method,h3.type{padding-left:15px;}h1,h2,h3,h4,.sidebar,a.source,.search-input,.content table :not(code)>a,.collapse-toggle,div.item-list .out-of-band,#source-sidebar,#sidebar-toggle{font-family:"Fira Sans",sans-serif;}ol,ul{padding-left:25px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.6em;}p{margin:0 0 .6em 0;}summary{outline:none;}code,pre{font-family:"Source Code Pro",monospace;}.docblock code,.docblock-short code{border-radius:3px;padding:0 0.1em;}.docblock pre code,.docblock-short pre code,.docblock code.spotlight{padding:0;}.docblock code.spotlight :last-child{padding-bottom:0.6em;}pre{padding:14px;}.source .content pre{padding:20px;}img{max-width:100%;}.source .content{margin-top:50px;max-width:none;overflow:visible;margin-left:0px;min-width:70em;}nav.sub{font-size:16px;text-transform:uppercase;}.sidebar{width:200px;position:fixed;left:0;top:0;height:100vh;overflow:auto;}.sidebar .block>ul>li{margin-right:-10px;}.content,nav{max-width:960px;}.js-only,.hidden{display:none !important;}.sidebar img{margin:20px auto;display:block;margin-top:10px;}.sidebar .location{border:1px solid;font-size:17px;margin:30px 10px 20px 10px;text-align:center;word-wrap:break-word;}.sidebar .version{font-size:15px;text-align:center;border-bottom:1px solid;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;}.location:empty{border:none;}.location a:first-child{font-weight:500;}.block{padding:0;margin-bottom:14px;}.block h2,.block h3{margin-top:0;margin-bottom:8px;text-align:center;}.block ul,.block li{margin:0 10px;padding:0;list-style:none;}.block a{display:block;text-overflow:ellipsis;overflow:hidden;line-height:15px;padding:7px 5px;font-size:14px;font-weight:300;transition:border 500ms ease-out;}.sidebar-title{border-top:1px solid;border-bottom:1px solid;text-align:center;font-size:17px;margin-bottom:5px;}.sidebar-links{margin-bottom:15px;}.sidebar-links>a{padding-left:10px;width:100%;}.sidebar-menu{display:none;}.content{padding:15px 0;}.source .content pre.rust{white-space:pre;overflow:auto;padding-left:0;}.rustdoc:not(.source) .example-wrap{display:inline-flex;margin-bottom:10px;}.example-wrap{width:100%;}.example-wrap>pre.line-number{overflow:initial;border:1px solid;border-top-left-radius:5px;border-bottom-left-radius:5px;padding:13px 8px;text-align:right;}.rustdoc:not(.source) .example-wrap>pre.rust{width:100%;overflow-x:auto;}.rustdoc:not(.source) .example-wrap>pre{margin:0;}#search{margin-left:230px;position:relative;}#results{position:absolute;right:0;left:0;overflow:auto;}#results>table{width:100%;table-layout:fixed;}.content pre.line-numbers{float:left;border:none;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers span{cursor:pointer;}.docblock-short p{display:inline;}.docblock-short.nowrap{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.docblock-short p{overflow:hidden;text-overflow:ellipsis;margin:0;}.docblock-short code{white-space:nowrap;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom:1px solid;}#main>.docblock h1{font-size:1.3em;}#main>.docblock h2{font-size:1.15em;}#main>.docblock h3,#main>.docblock h4,#main>.docblock h5{font-size:1em;}#main>h2+div,#main>h2+h3,#main>h3+div{display:none;flex-wrap:wrap;}.docblock h1{font-size:1em;}.docblock h2{font-size:0.95em;}.docblock h3,.docblock h4,.docblock h5{font-size:0.9em;}.docblock{margin-left:24px;position:relative;}.content .out-of-band{float:right;font-size:23px;margin:0px;padding:0px;font-weight:normal;}h3.impl>.out-of-band{font-size:21px;}h4.method>.out-of-band{font-size:19px;}h4>code,h3>code,.invisible>code{max-width:calc(100% - 41px);display:block;}.invisible{width:100%;display:inline-block;}.content .in-band{margin:0px;padding:0px;}.in-band>code{display:inline-block;}#main{position:relative;}#main>.since{top:inherit;font-family:"Fira Sans",sans-serif;}.content table:not(.table-display){border-spacing:0 5px;}.content td{vertical-align:top;}.content td:first-child{padding-right:20px;}.content td p:first-child{margin-top:0;}.content td h1,.content td h2{margin-left:0;font-size:1.1em;}.content tr:first-child td{border-top:0;}.docblock table{margin:.5em 0;width:100%;}.docblock table td{padding:.5em;border:1px dashed;}.docblock table th{padding:.5em;text-align:left;border:1px solid;}.fields+table{margin-bottom:1em;}.content .item-list{list-style-type:none;padding:0;}.content .multi-column{-moz-column-count:5;-moz-column-gap:2.5em;-webkit-column-count:5;-webkit-column-gap:2.5em;column-count:5;column-gap:2.5em;}.content .multi-column li{width:100%;display:inline-block;}.content .method{font-size:1em;position:relative;}.content .method .where,.content .fn .where,.content .where.fmt-newline{display:block;font-size:0.8em;}.content .methods>div:not(.important-traits){margin-left:40px;margin-bottom:15px;}.content .docblock>.impl-items{margin-left:20px;margin-top:-34px;}.content .docblock>.impl-items>h4{border-bottom:0;}.content .docblock>.impl-items .table-display{margin:0;}.content .docblock>.impl-items table td{padding:0;}.toggle-wrapper.marg-left>.collapse-toggle{left:-24px;}.content .docblock>.impl-items .table-display,.impl-items table td{border:none;}.content .stability code{font-size:90%;}.content .stability{position:relative;margin-left:33px;margin-top:-13px;}.sub-variant>div>.stability{margin-top:initial;}.content .stability::before{content:'˪';font-size:30px;position:absolute;top:-9px;left:-13px;}.content .impl-items .method,.content .impl-items>.type,.impl-items>.associatedconstant{margin-left:20px;}.content .impl-items .docblock,.content .impl-items .stability{margin-bottom:.6em;}.content .impl-items>.stability{margin-left:40px;}.methods>.stability,.content .impl-items>.stability{margin-top:-8px;}.impl-items{flex-basis:100%;}#main>.stability{margin-top:0;}nav{border-bottom:1px solid;padding-bottom:10px;margin-bottom:10px;}nav.main{padding:20px 0;text-align:center;}nav.main .current{border-top:1px solid;border-bottom:1px solid;}nav.main .separator{border:1px solid;display:inline-block;height:23px;margin:0 20px;}nav.sum{text-align:right;}nav.sub form{display:inline;}nav.sub,.content{margin-left:230px;}a{text-decoration:none;background:transparent;}.small-section-header:hover>.anchor{display:initial;}.in-band:hover>.anchor{display:inline-block;position:absolute;}.anchor{display:none;position:absolute;left:-7px;}.anchor.field{left:-5px;}.small-section-header>.anchor{left:-28px;padding-right:10px;}.anchor:before{content:'\2002\00a7\2002';}.docblock a:not(.srclink):not(.test-arrow):hover,.docblock-short a:not(.srclink):not(.test-arrow):hover,.stability a{text-decoration:underline;}.invisible>.srclink,h4>code+.srclink{position:absolute;top:0;right:0;font-size:17px;font-weight:normal;}.block a.current.crate{font-weight:500;}.search-container{position:relative;}.search-container>div{display:inline-flex;width:calc(100% - 34px);}#crate-search{margin-top:5px;padding:6px;padding-right:19px;border:0;border-right:0;border-radius:4px 0 0 4px;outline:none;cursor:pointer;border-right:1px solid;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;text-overflow:"";background-repeat:no-repeat;background-color:transparent;background-size:20px;background-position:calc(100% - 1px) 56%;}.search-container>.top-button{position:absolute;right:0;top:10px;}.search-input{-moz-box-sizing:border-box !important;box-sizing:border-box !important;outline:none;border:none;border-radius:1px;margin-top:5px;padding:10px 16px;font-size:17px;transition:border-color 300ms ease;transition:border-radius 300ms ease-in-out;transition:box-shadow 300ms ease-in-out;width:100%;}#crate-search+.search-input{border-radius:0 1px 1px 0;}.search-input:focus{border-radius:2px;border:0;outline:0;box-shadow:0 0 8px #078dd8;}.search-results .desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;}.search-results a{display:block;}.content .search-results td:first-child{padding-right:0;width:50%;}.content .search-results td:first-child a{padding-right:10px;}.content .search-results td:first-child a:after{clear:both;content:"";display:block;}.content .search-results td:first-child a span{float:left;}tr.result span.primitive::after{content:' (primitive type)';font-style:italic;}tr.result span.keyword::after{content:' (keyword)';font-style:italic;}body.blur>:not(#help){filter:blur(8px);-webkit-filter:blur(8px);opacity:.7;}#help{width:100%;height:100vh;position:fixed;top:0;left:0;display:flex;justify-content:center;align-items:center;}#help>div{flex:0 0 auto;box-shadow:0 0 6px rgba(0,0,0,.2);width:550px;height:auto;border:1px solid;}#help dt{float:left;clear:left;display:block;}#help dd{margin:5px 35px;}#help .infos{padding-left:0;}#help h1,#help h2{margin-top:0;}#help>div div{width:50%;float:left;padding:20px;padding-left:17px;}.stab{display:table;border-width:1px;border-style:solid;padding:3px;margin-bottom:5px;font-size:90%;}.stab p{display:inline;}.stab summary{display:list-item;}.stab .emoji{font-size:1.5em;}.module-item .stab{display:inline;border-width:0;padding:0;margin:0;background:inherit !important;}.module-item.unstable{opacity:0.65;}.since{font-weight:normal;font-size:initial;position:absolute;right:0;top:0;}.impl-items .since,.impl .since{flex-grow:0;padding-left:12px;padding-right:2px;position:initial;}.impl-items .srclink,.impl .srclink{flex-grow:0;font-size:17px;font-weight:normal;}.impl-items code,.impl code{flex-grow:1;}.impl-items h4,h4.impl,h3.impl{display:flex;flex-basis:100%;font-size:16px;margin-bottom:12px;justify-content:space-between;}.variants_table{width:100%;}.variants_table tbody tr td:first-child{width:1%;}td.summary-column{width:100%;}.summary{padding-right:0px;}pre.rust .question-mark{font-weight:bold;}a.test-arrow{display:inline-block;position:absolute;padding:5px 10px 5px 10px;border-radius:5px;font-size:130%;top:5px;right:5px;}a.test-arrow:hover{text-decoration:none;}.section-header:hover a:before{position:absolute;left:-25px;padding-right:10px;content:'\2002\00a7\2002';}.section-header:hover a{text-decoration:none;}.section-header a{color:inherit;}.collapse-toggle{font-weight:300;position:absolute;left:-23px;top:0;}h3>.collapse-toggle,h4>.collapse-toggle{font-size:0.8em;top:5px;}.toggle-wrapper>.collapse-toggle{left:-24px;margin-top:0px;}.toggle-wrapper{position:relative;margin-top:0;}.toggle-wrapper.collapsed{height:25px;transition:height .2s;margin-bottom:.6em;}.collapse-toggle>.inner{display:inline-block;width:1.2ch;text-align:center;}.collapse-toggle.hidden-default{position:relative;margin-left:20px;}.since+.srclink{display:table-cell;padding-left:10px;}.item-spacer{width:100%;height:12px;}span.since{position:initial;font-size:20px;margin-right:5px;}.toggle-wrapper>.collapse-toggle{left:0;}.variant+.toggle-wrapper+.docblock>p{margin-top:5px;}.sub-variant,.sub-variant>h3{margin-top:1px !important;}#main>.sub-variant>h3{font-size:15px;margin-left:25px;margin-bottom:5px;}.sub-variant>div{margin-left:20px;margin-bottom:10px;}.sub-variant>div>span{display:block;position:relative;}.toggle-label{display:inline-block;margin-left:4px;margin-top:3px;}.enum>.toggle-wrapper+.docblock,.struct>.toggle-wrapper+.docblock{margin-left:30px;margin-bottom:20px;margin-top:5px;}.docblock>.section-header:first-child{margin-left:15px;margin-top:0;}.docblock>.section-header:first-child:hover>a:before{left:-10px;}.enum>.collapsed,.struct>.collapsed{margin-bottom:25px;}#main>.variant,#main>.structfield{display:block;}.attributes{display:block;margin-top:0px !important;margin-right:0px;margin-bottom:0px !important;margin-left:30px;}.toggle-attributes.collapsed{margin-bottom:0;}.impl-items>.toggle-attributes{margin-left:20px;}.impl-items .attributes{font-weight:500;}:target>code{opacity:1;}@media (max-width:700px){body{padding-top:0px;}.rustdoc>.sidebar{height:45px;min-height:40px;margin:0;margin-left:-15px;padding:0 15px;position:static;z-index:11;}.sidebar>.location{float:right;margin:0px;margin-top:2px;padding:3px 10px 1px 10px;min-height:39px;background:inherit;text-align:left;font-size:24px;}.sidebar .location:empty{padding:0;}.sidebar img{width:35px;margin-top:5px;margin-bottom:5px;float:left;margin-left:50px;}.sidebar-menu{position:fixed;z-index:10;font-size:2rem;cursor:pointer;width:45px;left:0;text-align:center;display:block;border-bottom:1px solid;border-right:1px solid;height:45px;}.sidebar-elems{position:fixed;z-index:1;left:0;top:45px;bottom:0;overflow-y:auto;border-right:1px solid;display:none;}.sidebar>.block.version{border-bottom:none;margin-top:12px;}nav.sub{width:calc(100% - 32px);float:right;}.content{margin-left:0px;}#main{margin-top:45px;padding:0;}.content .in-band{width:100%;}.content h4>.out-of-band{position:inherit;}.toggle-wrapper>.collapse-toggle{left:0px;}.toggle-wrapper{height:1.5em;}#search{margin-left:0;}.content .impl-items .method,.content .impl-items>.type,.impl-items>.associatedconstant{display:flex;}.anchor{display:none !important;}h1.fqn{overflow:initial;}}@media print{nav.sub,.content .out-of-band,.collapse-toggle{display:none;}}.information{position:absolute;left:-20px;margin-top:7px;z-index:1;}.tooltip{position:relative;display:inline-block;cursor:pointer;}.tooltip .tooltiptext{width:120px;display:none;text-align:center;padding:5px 3px;border-radius:6px;margin-left:5px;top:-5px;left:105%;z-index:10;}.tooltip:hover .tooltiptext{display:inline;}.tooltip .tooltiptext::after{content:" ";position:absolute;top:50%;left:11px;margin-top:-5px;border-width:5px;border-style:solid;}.important-traits .tooltip .tooltiptext{border:1px solid;}pre.rust{position:relative;tab-width:4;-moz-tab-width:4;}.search-failed{text-align:center;margin-top:20px;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#titles{height:35px;}#titles>div{float:left;width:33.3%;text-align:center;font-size:18px;cursor:pointer;border-top:2px solid;}#titles>div:not(:last-child):not(.selected){margin-right:1px;width:calc(33.3% - 1px);}#titles>div>div.count{display:inline-block;font-size:16px;}.important-traits{cursor:pointer;z-index:2;}h4>.important-traits{position:absolute;left:-44px;top:2px;}#all-types{text-align:center;border:1px solid;margin:0 10px;margin-bottom:10px;display:block;border-radius:7px;}#all-types>p{margin:5px 0;}@media (max-width:700px){h4>.important-traits{position:absolute;left:-22px;top:24px;}#titles>div>div.count{float:left;width:100%;}#titles{height:50px;}.sidebar.mobile{position:fixed;width:100%;margin-left:0;background-color:rgba(0,0,0,0);height:100%;}.sidebar{width:calc(100% + 30px);}.show-it{display:block;width:246px;}.show-it>.block.items{margin:8px 0;}.show-it>.block.items>ul{margin:0;}.show-it>.block.items>ul>li{text-align:center;margin:2px 0;}.show-it>.block.items>ul>li>a{font-size:21px;}#sidebar-filler{position:fixed;left:45px;width:calc(100% - 45px);top:0;height:45px;z-index:-1;border-bottom:1px solid;}.collapse-toggle{left:-20px;}.impl>.collapse-toggle{left:-10px;}#all-types{margin:10px;}}@media (max-width:416px){#titles{height:73px;}#titles>div{height:73px;}}.modal{position:fixed;width:100vw;height:100vh;z-index:10000;top:0;left:0;}.modal-content{display:block;max-width:60%;min-width:200px;padding:8px;top:40%;position:absolute;left:50%;transform:translate(-50%,-40%);border:1px solid;border-radius:4px;border-top-right-radius:0;}.modal-content>.docblock{margin:0;}h3.important{margin:0;margin-bottom:13px;font-size:19px;}.modal-content>.docblock>code.content{margin:0;padding:0;font-size:20px;}.modal-content>.close{position:absolute;font-weight:900;right:-25px;top:-1px;font-size:18px;width:25px;padding-right:2px;border-top-right-radius:5px;border-bottom-right-radius:5px;text-align:center;border:1px solid;border-right:0;cursor:pointer;}.modal-content>.whiter{height:25px;position:absolute;width:3px;right:-2px;top:0px;}#main>div.important-traits{position:absolute;left:-24px;margin-top:16px;}.content>.methods>.method>div.important-traits{position:absolute;font-weight:400;left:-42px;margin-top:2px;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px;border-radius:3px;box-shadow:inset 0 -1px 0;cursor:default;}.theme-picker{position:absolute;left:211px;top:19px;}.theme-picker button{outline:none;}#settings-menu{position:absolute;right:0;top:10px;outline:none;}#theme-picker,#settings-menu{padding:4px;width:27px;height:29px;border:1px solid;border-radius:3px;cursor:pointer;}#theme-choices{display:none;position:absolute;left:0;top:28px;border:1px solid;border-radius:3px;z-index:1;cursor:pointer;}#theme-choices>button{border:none;width:100%;padding:4px;text-align:center;background:rgba(0,0,0,0);}#theme-choices>button:not(:first-child){border-top:1px solid;}@media (max-width:700px){.theme-picker{left:10px;top:54px;z-index:1;}}.hidden-by-impl-hider,.hidden-by-usual-hider{display:none !important;}#implementations-list>h3>span.in-band{width:100%;}.table-display{width:100%;border:0;border-collapse:collapse;border-spacing:0;font-size:16px;}.table-display tr td:first-child{padding-right:0;}.table-display tr td:last-child{float:right;}.table-display .out-of-band{position:relative;font-size:19px;display:block;}#implementors-list>.impl-items .table-display .out-of-band{font-size:17px;}.table-display td:hover .anchor{display:block;top:2px;left:-5px;}#main>ul{padding-left:10px;}#main>ul>li{list-style:none;}.non-exhaustive{margin-bottom:1em;}#sidebar-toggle{position:fixed;top:30px;left:300px;z-index:10;padding:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;cursor:pointer;font-weight:bold;transition:left .5s;font-size:1.2em;border:1px solid;border-left:0;}#source-sidebar{position:fixed;top:0;bottom:0;left:0;width:300px;z-index:1;overflow:auto;transition:left .5s;border-right:1px solid;}#source-sidebar>.title{font-size:1.5em;text-align:center;border-bottom:1px solid;margin-bottom:6px;}div.children{padding-left:27px;display:none;}div.name{cursor:pointer;position:relative;margin-left:16px;}div.files>a{display:block;padding:0 3px;}div.files>a:hover,div.name:hover{background-color:#a14b4b;}div.name.expand+.children{display:block;}div.name::before{content:"\25B6";padding-left:4px;font-size:0.7em;position:absolute;left:-16px;top:4px;}div.name.expand::before{transform:rotate(90deg);left:-14px;} \ No newline at end of file diff --git a/rustpython/all.html b/rustpython/all.html index 700d7a1..5903b04 100644 --- a/rustpython/all.html +++ b/rustpython/all.html @@ -1,3 +1,3 @@ -List of all items in this crate

[] +List of all items in this crate

[] - List of all items

\ No newline at end of file + List of all items

\ No newline at end of file diff --git a/rustpython/index.html b/rustpython/index.html index 59c17fd..66b3801 100644 --- a/rustpython/index.html +++ b/rustpython/index.html @@ -1 +1 @@ -rustpython - Rust

[][src]Crate rustpython

\ No newline at end of file +rustpython - Rust

[][src]Crate rustpython

\ No newline at end of file diff --git a/rustpython_derive/FromArgs.m.html b/rustpython_derive/FromArgs.m.html new file mode 100644 index 0000000..99ec894 --- /dev/null +++ b/rustpython_derive/FromArgs.m.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to derive.FromArgs.html...

+ + + \ No newline at end of file diff --git a/rustpython_derive/all.html b/rustpython_derive/all.html new file mode 100644 index 0000000..5a4f425 --- /dev/null +++ b/rustpython_derive/all.html @@ -0,0 +1,3 @@ +List of all items in this crate

[] + + List of all items

Derive Macros

\ No newline at end of file diff --git a/rustpython_derive/derive.FromArgs.html b/rustpython_derive/derive.FromArgs.html new file mode 100644 index 0000000..b42efea --- /dev/null +++ b/rustpython_derive/derive.FromArgs.html @@ -0,0 +1 @@ +rustpython_derive::FromArgs - Rust

[][src]Derive Macro rustpython_derive::FromArgs

#[derive(FromArgs)]
\ No newline at end of file diff --git a/rustpython_derive/index.html b/rustpython_derive/index.html new file mode 100644 index 0000000..b6ed6b9 --- /dev/null +++ b/rustpython_derive/index.html @@ -0,0 +1,2 @@ +rustpython_derive - Rust

[][src]Crate rustpython_derive

Derive Macros

+
FromArgs
\ No newline at end of file diff --git a/rustpython_derive/sidebar-items.js b/rustpython_derive/sidebar-items.js new file mode 100644 index 0000000..19c8200 --- /dev/null +++ b/rustpython_derive/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"derive":[["FromArgs",""]]}); \ No newline at end of file diff --git a/rustpython_parser/all.html b/rustpython_parser/all.html index e3f3e99..dc6717e 100644 --- a/rustpython_parser/all.html +++ b/rustpython_parser/all.html @@ -1,3 +1,3 @@ -List of all items in this crate

[] +List of all items in this crate

[] - List of all items

Structs

Enums

Functions

Typedefs

\ No newline at end of file + List of all items

Structs

Enums

Functions

Typedefs

\ No newline at end of file diff --git a/rustpython_parser/ast/ConversionFlag.t.html b/rustpython_parser/ast/ConversionFlag.t.html new file mode 100644 index 0000000..fff20fc --- /dev/null +++ b/rustpython_parser/ast/ConversionFlag.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to enum.ConversionFlag.html...

+ + + \ No newline at end of file diff --git a/rustpython_parser/ast/Parameter.t.html b/rustpython_parser/ast/Parameter.t.html new file mode 100644 index 0000000..e0473a8 --- /dev/null +++ b/rustpython_parser/ast/Parameter.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.Parameter.html...

+ + + \ No newline at end of file diff --git a/rustpython_parser/ast/Varargs.t.html b/rustpython_parser/ast/Varargs.t.html new file mode 100644 index 0000000..cbab1fb --- /dev/null +++ b/rustpython_parser/ast/Varargs.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to enum.Varargs.html...

+ + + \ No newline at end of file diff --git a/rustpython_parser/ast/enum.BooleanOperator.html b/rustpython_parser/ast/enum.BooleanOperator.html index 34daf7b..c0f18bb 100644 --- a/rustpython_parser/ast/enum.BooleanOperator.html +++ b/rustpython_parser/ast/enum.BooleanOperator.html @@ -1,22 +1,20 @@ -rustpython_parser::ast::BooleanOperator - Rust

[][src]Enum rustpython_parser::ast::BooleanOperator

pub enum BooleanOperator {
+rustpython_parser::ast::BooleanOperator - Rust

[][src]Enum rustpython_parser::ast::BooleanOperator

pub enum BooleanOperator {
     And,
     Or,
 }

Variants

-

Trait Implementations

impl PartialEq<BooleanOperator> for BooleanOperator
[src]

This method tests for !=.

-

impl Debug for BooleanOperator
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/enum.Comparison.html b/rustpython_parser/ast/enum.Comparison.html index a72c490..b15cbbf 100644 --- a/rustpython_parser/ast/enum.Comparison.html +++ b/rustpython_parser/ast/enum.Comparison.html @@ -1,4 +1,4 @@ -rustpython_parser::ast::Comparison - Rust

[][src]Enum rustpython_parser::ast::Comparison

pub enum Comparison {
+rustpython_parser::ast::Comparison - Rust

[][src]Enum rustpython_parser::ast::Comparison

pub enum Comparison {
     Equal,
     NotEqual,
     Less,
@@ -11,20 +11,18 @@
     IsNot,
 }

Variants

-

Trait Implementations

impl PartialEq<Comparison> for Comparison
[src]

This method tests for !=.

-

impl Debug for Comparison
[src]

Auto Trait Implementations

impl Send for Comparison

impl Sync for Comparison

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/enum.ComprehensionKind.html b/rustpython_parser/ast/enum.ComprehensionKind.html index 83b4f9f..73cdc37 100644 --- a/rustpython_parser/ast/enum.ComprehensionKind.html +++ b/rustpython_parser/ast/enum.ComprehensionKind.html @@ -1,4 +1,4 @@ -rustpython_parser::ast::ComprehensionKind - Rust

[][src]Enum rustpython_parser::ast::ComprehensionKind

pub enum ComprehensionKind {
+rustpython_parser::ast::ComprehensionKind - Rust

[][src]Enum rustpython_parser::ast::ComprehensionKind

pub enum ComprehensionKind {
     GeneratorExpression {
         element: Expression,
     },
@@ -14,19 +14,17 @@
     },
 }

Variants

-

Fields of GeneratorExpression

Fields of List

Fields of Set

Fields of Dict

Trait Implementations

impl PartialEq<ComprehensionKind> for ComprehensionKind
[src]

impl Debug for ComprehensionKind
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/enum.ConversionFlag.html b/rustpython_parser/ast/enum.ConversionFlag.html new file mode 100644 index 0000000..62c5d94 --- /dev/null +++ b/rustpython_parser/ast/enum.ConversionFlag.html @@ -0,0 +1,30 @@ +rustpython_parser::ast::ConversionFlag - Rust

[][src]Enum rustpython_parser::ast::ConversionFlag

pub enum ConversionFlag {
+    Str,
+    Ascii,
+    Repr,
+}

Transforms a value prior to formatting it.

+

+ Variants

+Str

Converts by calling str(<value>).

+
Ascii

Converts by calling ascii(<value>).

+
Repr

Converts by calling repr(<value>).

+

Trait Implementations

impl PartialEq<ConversionFlag> for ConversionFlag[src]

#[must_use] +
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

+

impl Clone for ConversionFlag[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Copy for ConversionFlag[src]

impl Debug for ConversionFlag[src]

Auto Trait Implementations

Blanket Implementations

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_parser/ast/enum.Expression.html b/rustpython_parser/ast/enum.Expression.html index d418a67..4a4a446 100644 --- a/rustpython_parser/ast/enum.Expression.html +++ b/rustpython_parser/ast/enum.Expression.html @@ -1,4 +1,4 @@ -rustpython_parser::ast::Expression - Rust

[][src]Enum rustpython_parser::ast::Expression

pub enum Expression {
+rustpython_parser::ast::Expression - Rust

[][src]Enum rustpython_parser::ast::Expression

pub enum Expression {
     BoolOp {
         a: Box<Expression>,
         op: BooleanOperator,
@@ -83,22 +83,21 @@
     True,
     False,
     None,
+    Ellipsis,
 }

Variants

-

Fields of BoolOp

Fields of Binop

Fields of Subscript

Fields of Unop

Fields of Yield

Fields of YieldFrom

Fields of Compare

Fields of Attribute

Fields of Call

Fields of Number

Fields of List

Fields of Tuple

Fields of Dict

Fields of Set

Fields of Comprehension

Fields of Starred

Fields of Slice

Fields of String

Fields of Bytes

Fields of Identifier

Fields of Lambda

Fields of IfExpression

Methods

impl Expression
[src]

Returns a short name for the node suitable for use in error messages.

-

Trait Implementations

impl PartialEq<Expression> for Expression
[src]

impl Debug for Expression
[src]

Auto Trait Implementations

impl Send for Expression

impl Sync for Expression

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/enum.Number.html b/rustpython_parser/ast/enum.Number.html index e390883..06f5e6d 100644 --- a/rustpython_parser/ast/enum.Number.html +++ b/rustpython_parser/ast/enum.Number.html @@ -1,4 +1,4 @@ -rustpython_parser::ast::Number - Rust

[][src]Enum rustpython_parser::ast::Number

pub enum Number {
+rustpython_parser::ast::Number - Rust

[][src]Enum rustpython_parser::ast::Number

pub enum Number {
     Integer {
         value: BigInt,
     },
@@ -11,19 +11,17 @@
     },
 }

Variants

-

Fields of Integer

Fields of Float

Fields of Complex

Trait Implementations

impl PartialEq<Number> for Number
[src]

impl Debug for Number
[src]

Auto Trait Implementations

impl Send for Number

impl Sync for Number

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/enum.Operator.html b/rustpython_parser/ast/enum.Operator.html index 849c17f..622bb70 100644 --- a/rustpython_parser/ast/enum.Operator.html +++ b/rustpython_parser/ast/enum.Operator.html @@ -1,4 +1,4 @@ -rustpython_parser::ast::Operator - Rust

[][src]Enum rustpython_parser::ast::Operator

pub enum Operator {
+rustpython_parser::ast::Operator - Rust

[][src]Enum rustpython_parser::ast::Operator

pub enum Operator {
     Add,
     Sub,
     Mult,
@@ -14,20 +14,18 @@
     FloorDiv,
 }

Variants

-

Trait Implementations

impl PartialEq<Operator> for Operator
[src]

This method tests for !=.

-

impl Debug for Operator
[src]

Auto Trait Implementations

impl Send for Operator

impl Sync for Operator

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/enum.Statement.html b/rustpython_parser/ast/enum.Statement.html index 46c21ee..73ddae5 100644 --- a/rustpython_parser/ast/enum.Statement.html +++ b/rustpython_parser/ast/enum.Statement.html @@ -1,4 +1,4 @@ -rustpython_parser::ast::Statement - Rust

[][src]Enum rustpython_parser::ast::Statement

pub enum Statement {
+rustpython_parser::ast::Statement - Rust

[][src]Enum rustpython_parser::ast::Statement

pub enum Statement {
     Break,
     Continue,
     Return {
@@ -75,23 +75,22 @@
         args: Parameters,
         body: Vec<LocatedStatement>,
         decorator_list: Vec<Expression>,
+        returns: Option<Expression>,
     },
 }

Abstract syntax tree nodes for python statements.

Variants

-

Fields of Return

Fields of Import

Fields of Assert

Fields of Delete

Fields of Assign

Fields of AugAssign

Fields of Expression

Fields of Global

Fields of Nonlocal

Fields of If

Fields of While

Fields of With

Fields of For

Fields of Raise

Fields of Try

Fields of ClassDef

Fields of FunctionDef

Trait Implementations

impl PartialEq<Statement> for Statement
[src]

impl Debug for Statement
[src]

Auto Trait Implementations

impl Send for Statement

impl Sync for Statement

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/enum.StringGroup.html b/rustpython_parser/ast/enum.StringGroup.html index 68130dd..3c99a5b 100644 --- a/rustpython_parser/ast/enum.StringGroup.html +++ b/rustpython_parser/ast/enum.StringGroup.html @@ -1,9 +1,10 @@ -rustpython_parser::ast::StringGroup - Rust

[][src]Enum rustpython_parser::ast::StringGroup

pub enum StringGroup {
+rustpython_parser::ast::StringGroup - Rust

[][src]Enum rustpython_parser::ast::StringGroup

pub enum StringGroup {
     Constant {
         value: String,
     },
     FormattedValue {
         value: Box<Expression>,
+        conversion: Option<ConversionFlag>,
         spec: String,
     },
     Joined {
@@ -11,19 +12,17 @@
     },
 }

Variants

-

Fields of Constant

Fields of FormattedValue

Fields of Joined

Trait Implementations

impl PartialEq<StringGroup> for StringGroup
[src]

impl Debug for StringGroup
[src]

Auto Trait Implementations

impl Send for StringGroup

impl Sync for StringGroup

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/enum.Top.html b/rustpython_parser/ast/enum.Top.html index d3b5ba5..8be918c 100644 --- a/rustpython_parser/ast/enum.Top.html +++ b/rustpython_parser/ast/enum.Top.html @@ -1,22 +1,20 @@ -rustpython_parser::ast::Top - Rust

[][src]Enum rustpython_parser::ast::Top

pub enum Top {
+rustpython_parser::ast::Top - Rust

[][src]Enum rustpython_parser::ast::Top

pub enum Top {
     Program(Program),
     Statement(LocatedStatement),
     Expression(Expression),
 }

Variants

-

Trait Implementations

impl PartialEq<Top> for Top
[src]

impl Debug for Top
[src]

Auto Trait Implementations

impl Send for Top

impl Sync for Top

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/enum.UnaryOperator.html b/rustpython_parser/ast/enum.UnaryOperator.html index 14ab69c..fb7f984 100644 --- a/rustpython_parser/ast/enum.UnaryOperator.html +++ b/rustpython_parser/ast/enum.UnaryOperator.html @@ -1,24 +1,22 @@ -rustpython_parser::ast::UnaryOperator - Rust

[][src]Enum rustpython_parser::ast::UnaryOperator

pub enum UnaryOperator {
+rustpython_parser::ast::UnaryOperator - Rust

[][src]Enum rustpython_parser::ast::UnaryOperator

pub enum UnaryOperator {
     Pos,
     Neg,
     Not,
     Inv,
 }

Variants

-

Trait Implementations

impl PartialEq<UnaryOperator> for UnaryOperator
[src]

This method tests for !=.

-

impl Debug for UnaryOperator
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/enum.Varargs.html b/rustpython_parser/ast/enum.Varargs.html new file mode 100644 index 0000000..f5b538a --- /dev/null +++ b/rustpython_parser/ast/enum.Varargs.html @@ -0,0 +1,22 @@ +rustpython_parser::ast::Varargs - Rust

[][src]Enum rustpython_parser::ast::Varargs

pub enum Varargs {
+    None,
+    Unnamed,
+    Named(Parameter),
+}

+ Variants

+NoneUnnamedNamed(Parameter)

Trait Implementations

impl PartialEq<Varargs> for Varargs[src]

impl Default for Varargs[src]

impl From<Option<Option<Parameter>>> for Varargs[src]

impl Debug for Varargs[src]

Auto Trait Implementations

impl Send for Varargs

impl Sync for Varargs

Blanket Implementations

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_parser/ast/index.html b/rustpython_parser/ast/index.html index 4ddb6a4..a30d2f1 100644 --- a/rustpython_parser/ast/index.html +++ b/rustpython_parser/ast/index.html @@ -1,8 +1,9 @@ -rustpython_parser::ast - Rust

[][src]Module rustpython_parser::ast

Implement abstract syntax tree nodes for the python language.

+rustpython_parser::ast - Rust

[][src]Module rustpython_parser::ast

Implement abstract syntax tree nodes for the python language.

Roughly equivalent to this: https://docs.python.org/3/library/ast.html

Re-exports

pub use super::lexer::Location;

Structs

-
Comprehension
ExceptHandler
Keyword
Located
Parameters
Program
SingleImport
WithItem

Enums

-
BooleanOperator
Comparison
ComprehensionKind
Expression
Number
Operator
Statement

Abstract syntax tree nodes for python statements.

-
StringGroup
Top
UnaryOperator

Type Definitions

-
LocatedStatement
\ No newline at end of file +
Comprehension
ExceptHandler
Keyword
Located
Parameter
Parameters
Program
SingleImport
WithItem

Enums

+
BooleanOperator
Comparison
ComprehensionKind
ConversionFlag

Transforms a value prior to formatting it.

+
Expression
Number
Operator
Statement

Abstract syntax tree nodes for python statements.

+
StringGroup
Top
UnaryOperator
Varargs

Type Definitions

+
LocatedStatement
\ No newline at end of file diff --git a/rustpython_parser/ast/sidebar-items.js b/rustpython_parser/ast/sidebar-items.js index 3f5c932..6e55420 100644 --- a/rustpython_parser/ast/sidebar-items.js +++ b/rustpython_parser/ast/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"enum":[["BooleanOperator",""],["Comparison",""],["ComprehensionKind",""],["Expression",""],["Number",""],["Operator",""],["Statement","Abstract syntax tree nodes for python statements."],["StringGroup",""],["Top",""],["UnaryOperator",""]],"struct":[["Comprehension",""],["ExceptHandler",""],["Keyword",""],["Located",""],["Parameters",""],["Program",""],["SingleImport",""],["WithItem",""]],"type":[["LocatedStatement",""]]}); \ No newline at end of file +initSidebarItems({"enum":[["BooleanOperator",""],["Comparison",""],["ComprehensionKind",""],["ConversionFlag","Transforms a value prior to formatting it."],["Expression",""],["Number",""],["Operator",""],["Statement","Abstract syntax tree nodes for python statements."],["StringGroup",""],["Top",""],["UnaryOperator",""],["Varargs",""]],"struct":[["Comprehension",""],["ExceptHandler",""],["Keyword",""],["Located",""],["Parameter",""],["Parameters",""],["Program",""],["SingleImport",""],["WithItem",""]],"type":[["LocatedStatement",""]]}); \ No newline at end of file diff --git a/rustpython_parser/ast/struct.Comprehension.html b/rustpython_parser/ast/struct.Comprehension.html index 04fc9d6..667c41f 100644 --- a/rustpython_parser/ast/struct.Comprehension.html +++ b/rustpython_parser/ast/struct.Comprehension.html @@ -1,33 +1,19 @@ -rustpython_parser::ast::Comprehension - Rust

[][src]Struct rustpython_parser::ast::Comprehension

pub struct Comprehension {
+rustpython_parser::ast::Comprehension - Rust

[][src]Struct rustpython_parser::ast::Comprehension

pub struct Comprehension {
     pub target: Expression,
     pub iter: Expression,
     pub ifs: Vec<Expression>,
 }

- Fields

- - - - - -

Trait Implementations

impl PartialEq<Comprehension> for Comprehension
[src]

impl Debug for Comprehension
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/struct.ExceptHandler.html b/rustpython_parser/ast/struct.ExceptHandler.html index 7d009df..61ce4e6 100644 --- a/rustpython_parser/ast/struct.ExceptHandler.html +++ b/rustpython_parser/ast/struct.ExceptHandler.html @@ -1,33 +1,19 @@ -rustpython_parser::ast::ExceptHandler - Rust

[][src]Struct rustpython_parser::ast::ExceptHandler

pub struct ExceptHandler {
+rustpython_parser::ast::ExceptHandler - Rust

[][src]Struct rustpython_parser::ast::ExceptHandler

pub struct ExceptHandler {
     pub typ: Option<Expression>,
     pub name: Option<String>,
     pub body: Vec<LocatedStatement>,
 }

- Fields

- - - - - -

Trait Implementations

impl PartialEq<ExceptHandler> for ExceptHandler
[src]

impl Debug for ExceptHandler
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/struct.Keyword.html b/rustpython_parser/ast/struct.Keyword.html index 758b5ef..2269c80 100644 --- a/rustpython_parser/ast/struct.Keyword.html +++ b/rustpython_parser/ast/struct.Keyword.html @@ -1,28 +1,18 @@ -rustpython_parser::ast::Keyword - Rust

[][src]Struct rustpython_parser::ast::Keyword

pub struct Keyword {
+rustpython_parser::ast::Keyword - Rust

[][src]Struct rustpython_parser::ast::Keyword

pub struct Keyword {
     pub name: Option<String>,
     pub value: Expression,
 }

- Fields

- - - -

Trait Implementations

impl PartialEq<Keyword> for Keyword
[src]

impl Debug for Keyword
[src]

Auto Trait Implementations

impl Send for Keyword

impl Sync for Keyword

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/struct.Located.html b/rustpython_parser/ast/struct.Located.html index b093674..8ae9d14 100644 --- a/rustpython_parser/ast/struct.Located.html +++ b/rustpython_parser/ast/struct.Located.html @@ -1,28 +1,18 @@ -rustpython_parser::ast::Located - Rust

[][src]Struct rustpython_parser::ast::Located

pub struct Located<T> {
+rustpython_parser::ast::Located - Rust

[][src]Struct rustpython_parser::ast::Located

pub struct Located<T> {
     pub location: Location,
     pub node: T,
 }

- Fields

- - - -

Trait Implementations

impl<T: PartialEq> PartialEq<Located<T>> for Located<T>
[src]

impl<T: Debug> Debug for Located<T>
[src]

Auto Trait Implementations

impl<T> Send for Located<T> where
    T: Send

impl<T> Sync for Located<T> where
    T: Sync

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/struct.Parameter.html b/rustpython_parser/ast/struct.Parameter.html new file mode 100644 index 0000000..a06f5b9 --- /dev/null +++ b/rustpython_parser/ast/struct.Parameter.html @@ -0,0 +1,19 @@ +rustpython_parser::ast::Parameter - Rust

[][src]Struct rustpython_parser::ast::Parameter

pub struct Parameter {
+    pub arg: String,
+    pub annotation: Option<Box<Expression>>,
+}

+ Fields

arg: Stringannotation: Option<Box<Expression>>

Trait Implementations

impl PartialEq<Parameter> for Parameter[src]

impl Default for Parameter[src]

impl Debug for Parameter[src]

Auto Trait Implementations

impl Send for Parameter

impl Sync for Parameter

Blanket Implementations

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_parser/ast/struct.Parameters.html b/rustpython_parser/ast/struct.Parameters.html index 3671bfd..f7f77ef 100644 --- a/rustpython_parser/ast/struct.Parameters.html +++ b/rustpython_parser/ast/struct.Parameters.html @@ -1,49 +1,23 @@ -rustpython_parser::ast::Parameters - Rust

[][src]Struct rustpython_parser::ast::Parameters

pub struct Parameters {
-    pub args: Vec<String>,
-    pub kwonlyargs: Vec<String>,
-    pub vararg: Option<Option<String>>,
-    pub kwarg: Option<Option<String>>,
+rustpython_parser::ast::Parameters - Rust

[][src]Struct rustpython_parser::ast::Parameters

pub struct Parameters {
+    pub args: Vec<Parameter>,
+    pub kwonlyargs: Vec<Parameter>,
+    pub vararg: Varargs,
+    pub kwarg: Varargs,
     pub defaults: Vec<Expression>,
     pub kw_defaults: Vec<Option<Expression>>,
 }

- Fields

- - - - - - - - - - - -

Trait Implementations

impl Default for Parameters
[src]

impl PartialEq<Parameters> for Parameters
[src]

impl Debug for Parameters
[src]

Auto Trait Implementations

impl Send for Parameters

impl Sync for Parameters

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/struct.Program.html b/rustpython_parser/ast/struct.Program.html index a4a070d..36bf9c2 100644 --- a/rustpython_parser/ast/struct.Program.html +++ b/rustpython_parser/ast/struct.Program.html @@ -1,23 +1,17 @@ -rustpython_parser::ast::Program - Rust

[][src]Struct rustpython_parser::ast::Program

pub struct Program {
+rustpython_parser::ast::Program - Rust

[][src]Struct rustpython_parser::ast::Program

pub struct Program {
     pub statements: Vec<LocatedStatement>,
 }

- Fields

- -

Trait Implementations

impl PartialEq<Program> for Program
[src]

impl Debug for Program
[src]

Auto Trait Implementations

impl Send for Program

impl Sync for Program

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/struct.SingleImport.html b/rustpython_parser/ast/struct.SingleImport.html index b5caaf5..31da8fa 100644 --- a/rustpython_parser/ast/struct.SingleImport.html +++ b/rustpython_parser/ast/struct.SingleImport.html @@ -1,33 +1,19 @@ -rustpython_parser::ast::SingleImport - Rust

[][src]Struct rustpython_parser::ast::SingleImport

pub struct SingleImport {
+rustpython_parser::ast::SingleImport - Rust

[][src]Struct rustpython_parser::ast::SingleImport

pub struct SingleImport {
     pub module: String,
     pub symbol: Option<String>,
     pub alias: Option<String>,
 }

- Fields

- - - - - -

Trait Implementations

impl PartialEq<SingleImport> for SingleImport
[src]

impl Debug for SingleImport
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/struct.WithItem.html b/rustpython_parser/ast/struct.WithItem.html index a35a28a..a40b07e 100644 --- a/rustpython_parser/ast/struct.WithItem.html +++ b/rustpython_parser/ast/struct.WithItem.html @@ -1,28 +1,18 @@ -rustpython_parser::ast::WithItem - Rust

[][src]Struct rustpython_parser::ast::WithItem

pub struct WithItem {
+rustpython_parser::ast::WithItem - Rust

[][src]Struct rustpython_parser::ast::WithItem

pub struct WithItem {
     pub context_expr: Expression,
     pub optional_vars: Option<Expression>,
 }

- Fields

- - - -

Trait Implementations

impl PartialEq<WithItem> for WithItem
[src]

impl Debug for WithItem
[src]

Auto Trait Implementations

impl Send for WithItem

impl Sync for WithItem

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/ast/type.LocatedStatement.html b/rustpython_parser/ast/type.LocatedStatement.html index aace6a3..6aee8a5 100644 --- a/rustpython_parser/ast/type.LocatedStatement.html +++ b/rustpython_parser/ast/type.LocatedStatement.html @@ -1 +1 @@ -rustpython_parser::ast::LocatedStatement - Rust

[][src]Type Definition rustpython_parser::ast::LocatedStatement

type LocatedStatement = Located<Statement>;
\ No newline at end of file +rustpython_parser::ast::LocatedStatement - Rust

[][src]Type Definition rustpython_parser::ast::LocatedStatement

type LocatedStatement = Located<Statement>;
\ No newline at end of file diff --git a/rustpython_parser/error/enum.ParseError.html b/rustpython_parser/error/enum.ParseError.html index 205deb1..707d7f9 100644 --- a/rustpython_parser/error/enum.ParseError.html +++ b/rustpython_parser/error/enum.ParseError.html @@ -1,4 +1,4 @@ -rustpython_parser::error::ParseError - Rust

[][src]Enum rustpython_parser::error::ParseError

pub enum ParseError {
+rustpython_parser::error::ParseError - Rust

[][src]Enum rustpython_parser::error::ParseError

pub enum ParseError {
     EOF(Option<Location>),
     ExtraToken((Location, Tok, Location)),
     InvalidToken(Location),
@@ -7,32 +7,30 @@
 }

Represents an error during parsing

Variants

-

Parser encountered an unexpected end of input

-

Parser encountered an extra token

-

Parser encountered an invalid token

-

Parser encountered an unexpected token

-

Maps to User type from lalrpop-util

-

Trait Implementations

impl PartialEq<ParseError> for ParseError
[src]

impl From<ParseError<Location, Tok, LexicalError>> for ParseError
[src]

Convert lalrpop_util::ParseError to our internal type

-

impl Display for ParseError
[src]

impl Debug for ParseError
[src]

impl Error for ParseError
[src]

This method is soft-deprecated. Read more

-

Deprecating in 1.33.0

: replaced by Error::source, which can support downcasting

+EOF(Option<Location>)

Parser encountered an unexpected end of input

+
ExtraToken((Location, Tok, Location))

Parser encountered an extra token

+
InvalidToken(Location)

Parser encountered an invalid token

+
UnrecognizedToken((Location, Tok, Location)Vec<String>)

Parser encountered an unexpected token

+
Other

Maps to User type from lalrpop-util

+

Trait Implementations

impl PartialEq<ParseError> for ParseError[src]

impl From<ParseError<Location, Tok, LexicalError>> for ParseError[src]

Convert lalrpop_util::ParseError to our internal type

+

impl Debug for ParseError[src]

impl Display for ParseError[src]

impl Error for ParseError[src]

fn description(&self) -> &str
1.0.0
[src]

This method is soft-deprecated. Read more

+

fn cause(&self) -> Option<&dyn Error>
1.0.0
[src]

Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

The lower-level cause of this error, if any. Read more

-

Auto Trait Implementations

impl Send for ParseError

impl Sync for ParseError

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

Auto Trait Implementations

impl Send for ParseError

impl Sync for ParseError

Blanket Implementations

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> BorrowMut for T where
    T: ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/error/index.html b/rustpython_parser/error/index.html index 7b4e0d5..1bffbcf 100644 --- a/rustpython_parser/error/index.html +++ b/rustpython_parser/error/index.html @@ -1,5 +1,5 @@ -rustpython_parser::error - Rust

[][src]Module rustpython_parser::error

Define internal parse error types +rustpython_parser::error - Rust

[][src]Module rustpython_parser::error

Define internal parse error types The goal is to provide a matching and a safe error API, maksing errors from LALR

Enums

ParseError

Represents an error during parsing

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/index.html b/rustpython_parser/index.html index 307da25..3d708a5 100644 --- a/rustpython_parser/index.html +++ b/rustpython_parser/index.html @@ -1,4 +1,4 @@ -rustpython_parser - Rust

[][src]Crate rustpython_parser

Modules

+rustpython_parser - Rust

[][src]Crate rustpython_parser

Modules

ast

Implement abstract syntax tree nodes for the python language.

error

Define internal parse error types The goal is to provide a matching and a safe error API, maksing errors from LALR

@@ -6,4 +6,4 @@ code is translated into separate tokens.

parser
token

Different token definitions. Loosely based on token.h from CPython source:

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/lexer/enum.LexicalError.html b/rustpython_parser/lexer/enum.LexicalError.html index 8a82637..25e5cf3 100644 --- a/rustpython_parser/lexer/enum.LexicalError.html +++ b/rustpython_parser/lexer/enum.LexicalError.html @@ -1,19 +1,20 @@ -rustpython_parser::lexer::LexicalError - Rust

[][src]Enum rustpython_parser::lexer::LexicalError

pub enum LexicalError {
+rustpython_parser::lexer::LexicalError - Rust

[][src]Enum rustpython_parser::lexer::LexicalError

pub enum LexicalError {
     StringError,
     NestingError,
+    UnrecognizedToken {
+        tok: char,
+    },
 }

Variants

-

Trait Implementations

impl Debug for LexicalError
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/lexer/fn.get_keywords.html b/rustpython_parser/lexer/fn.get_keywords.html index 4a47828..e79a259 100644 --- a/rustpython_parser/lexer/fn.get_keywords.html +++ b/rustpython_parser/lexer/fn.get_keywords.html @@ -1 +1 @@ -rustpython_parser::lexer::get_keywords - Rust

[][src]Function rustpython_parser::lexer::get_keywords

pub fn get_keywords() -> HashMap<String, Tok>
\ No newline at end of file +rustpython_parser::lexer::get_keywords - Rust

[][src]Function rustpython_parser::lexer::get_keywords

pub fn get_keywords() -> HashMap<String, Tok>
\ No newline at end of file diff --git a/rustpython_parser/lexer/fn.make_tokenizer.html b/rustpython_parser/lexer/fn.make_tokenizer.html index a8d9b64..1b9f77b 100644 --- a/rustpython_parser/lexer/fn.make_tokenizer.html +++ b/rustpython_parser/lexer/fn.make_tokenizer.html @@ -1 +1 @@ -rustpython_parser::lexer::make_tokenizer - Rust

[][src]Function rustpython_parser::lexer::make_tokenizer

pub fn make_tokenizer<'a>(
    source: &'a str
) -> impl Iterator<Item = Spanned<Tok>> + 'a
\ No newline at end of file +rustpython_parser::lexer::make_tokenizer - Rust

[][src]Function rustpython_parser::lexer::make_tokenizer

pub fn make_tokenizer<'a>(
    source: &'a str
) -> impl Iterator<Item = Spanned<Tok>> + 'a
\ No newline at end of file diff --git a/rustpython_parser/lexer/index.html b/rustpython_parser/lexer/index.html index 2296aa2..590c77e 100644 --- a/rustpython_parser/lexer/index.html +++ b/rustpython_parser/lexer/index.html @@ -1,8 +1,8 @@ -rustpython_parser::lexer - Rust

[][src]Module rustpython_parser::lexer

This module takes care of lexing python source text. This means source +rustpython_parser::lexer - Rust

[][src]Module rustpython_parser::lexer

This module takes care of lexing python source text. This means source code is translated into separate tokens.

Re-exports

pub use super::token::Tok;

Structs

Lexer
LineContinationHandler
Location
NewlineHandler

Enums

LexicalError

Functions

get_keywords
make_tokenizer

Type Definitions

-
Spanned
\ No newline at end of file +
Spanned
\ No newline at end of file diff --git a/rustpython_parser/lexer/struct.Lexer.html b/rustpython_parser/lexer/struct.Lexer.html index 0342488..57f6c9f 100644 --- a/rustpython_parser/lexer/struct.Lexer.html +++ b/rustpython_parser/lexer/struct.Lexer.html @@ -1,76 +1,72 @@ -rustpython_parser::lexer::Lexer - Rust

[][src]Struct rustpython_parser::lexer::Lexer

pub struct Lexer<T: Iterator<Item = char>> { /* fields omitted */ }

Methods

impl<T> Lexer<T> where
    T: Iterator<Item = char>, 
[src]

Trait Implementations

impl<T> Iterator for Lexer<T> where
    T: Iterator<Item = char>, 
[src]

-

The type of the elements being iterated over.

-

Returns the bounds on the remaining length of the iterator. Read more

-

Consumes the iterator, counting the number of iterations and returning it. Read more

-

Consumes the iterator, returning the last element. Read more

-

Returns the nth element of the iterator. Read more

-

Creates an iterator starting at the same point, but stepping by the given amount at each iteration. Read more

-

Takes two iterators and creates a new iterator over both in sequence. Read more

-

'Zips up' two iterators into a single iterator of pairs. Read more

-

Takes a closure and creates an iterator which calls that closure on each element. Read more

-

Calls a closure on each element of an iterator. Read more

-

Creates an iterator which uses a closure to determine if an element should be yielded. Read more

-

Creates an iterator that both filters and maps. Read more

-

Creates an iterator which gives the current iteration count as well as the next value. Read more

-

Creates an iterator which can use peek to look at the next element of the iterator without consuming it. Read more

-

Creates an iterator that [skip]s elements based on a predicate. Read more

-

Creates an iterator that yields elements based on a predicate. Read more

-

Creates an iterator that skips the first n elements. Read more

-

Creates an iterator that yields its first n elements. Read more

-

An iterator adaptor similar to [fold] that holds internal state and produces a new iterator. Read more

-

Creates an iterator that works like map, but flattens nested structure. Read more

-

Creates an iterator that flattens nested structure. Read more

-

Creates an iterator which ends after the first [None]. Read more

-

Do something with each element of an iterator, passing the value on. Read more

-

Borrows an iterator, rather than consuming it. Read more

-

Transforms an iterator into a collection. Read more

-

Consumes an iterator, creating two collections from it. Read more

-

An iterator method that applies a function as long as it returns successfully, producing a single, final value. Read more

-

An iterator method that applies a fallible function to each item in the iterator, stopping at the first error and returning that error. Read more

-

An iterator method that applies a function, producing a single, final value. Read more

-

Tests if every element of the iterator matches a predicate. Read more

-

Tests if any element of the iterator matches a predicate. Read more

-

Searches for an element of an iterator that satisfies a predicate. Read more

-

Applies function to the elements of iterator and returns the first non-none result. Read more

-

Searches for an element in an iterator, returning its index. Read more

-

Searches for an element in an iterator from the right, returning its index. Read more

-

Returns the maximum element of an iterator. Read more

-

Returns the minimum element of an iterator. Read more

-

Returns the element that gives the maximum value from the specified function. Read more

-

Returns the element that gives the maximum value with respect to the specified comparison function. Read more

-

Returns the element that gives the minimum value from the specified function. Read more

-

Returns the element that gives the minimum value with respect to the specified comparison function. Read more

-

Reverses an iterator's direction. Read more

-

Converts an iterator of pairs into a pair of containers. Read more

-

Creates an iterator which [clone]s all of its elements. Read more

-

Repeats an iterator endlessly. Read more

-

Sums the elements of an iterator. Read more

-

Iterates over the entire iterator, multiplying all the elements Read more

-

Lexicographically compares the elements of this Iterator with those of another. Read more

-

Lexicographically compares the elements of this Iterator with those of another. Read more

-

Determines if the elements of this Iterator are equal to those of another. Read more

-

Determines if the elements of this Iterator are unequal to those of another. Read more

-

Determines if the elements of this Iterator are lexicographically less than those of another. Read more

-

Determines if the elements of this Iterator are lexicographically less or equal to those of another. Read more

-

Determines if the elements of this Iterator are lexicographically greater than those of another. Read more

-

Determines if the elements of this Iterator are lexicographically greater than or equal to those of another. Read more

-

Auto Trait Implementations

impl<T> Send for Lexer<T> where
    T: Send

impl<T> Sync for Lexer<T> where
    T: Sync

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<I> IntoIterator for I where
    I: Iterator
[src]

-

The type of the elements being iterated over.

-

-

Which kind of iterator are we turning this into?

-

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_parser/lexer/struct.LineContinationHandler.html b/rustpython_parser/lexer/struct.LineContinationHandler.html index 077c3bb..15ccf52 100644 --- a/rustpython_parser/lexer/struct.LineContinationHandler.html +++ b/rustpython_parser/lexer/struct.LineContinationHandler.html @@ -1,76 +1,72 @@ -rustpython_parser::lexer::LineContinationHandler - Rust

[][src]Struct rustpython_parser::lexer::LineContinationHandler

pub struct LineContinationHandler<T: Iterator<Item = char>> { /* fields omitted */ }

Methods

impl<T> LineContinationHandler<T> where
    T: Iterator<Item = char>, 
[src]

Trait Implementations

impl<T> Iterator for LineContinationHandler<T> where
    T: Iterator<Item = char>, 
[src]

-

The type of the elements being iterated over.

-

Returns the bounds on the remaining length of the iterator. Read more

-

Consumes the iterator, counting the number of iterations and returning it. Read more

-

Consumes the iterator, returning the last element. Read more

-

Returns the nth element of the iterator. Read more

-

Creates an iterator starting at the same point, but stepping by the given amount at each iteration. Read more

-

Takes two iterators and creates a new iterator over both in sequence. Read more

-

'Zips up' two iterators into a single iterator of pairs. Read more

-

Takes a closure and creates an iterator which calls that closure on each element. Read more

-

Calls a closure on each element of an iterator. Read more

-

Creates an iterator which uses a closure to determine if an element should be yielded. Read more

-

Creates an iterator that both filters and maps. Read more

-

Creates an iterator which gives the current iteration count as well as the next value. Read more

-

Creates an iterator which can use peek to look at the next element of the iterator without consuming it. Read more

-

Creates an iterator that [skip]s elements based on a predicate. Read more

-

Creates an iterator that yields elements based on a predicate. Read more

-

Creates an iterator that skips the first n elements. Read more

-

Creates an iterator that yields its first n elements. Read more

-

An iterator adaptor similar to [fold] that holds internal state and produces a new iterator. Read more

-

Creates an iterator that works like map, but flattens nested structure. Read more

-

Creates an iterator that flattens nested structure. Read more

-

Creates an iterator which ends after the first [None]. Read more

-

Do something with each element of an iterator, passing the value on. Read more

-

Borrows an iterator, rather than consuming it. Read more

-

Transforms an iterator into a collection. Read more

-

Consumes an iterator, creating two collections from it. Read more

-

An iterator method that applies a function as long as it returns successfully, producing a single, final value. Read more

-

An iterator method that applies a fallible function to each item in the iterator, stopping at the first error and returning that error. Read more

-

An iterator method that applies a function, producing a single, final value. Read more

-

Tests if every element of the iterator matches a predicate. Read more

-

Tests if any element of the iterator matches a predicate. Read more

-

Searches for an element of an iterator that satisfies a predicate. Read more

-

Applies function to the elements of iterator and returns the first non-none result. Read more

-

Searches for an element in an iterator, returning its index. Read more

-

Searches for an element in an iterator from the right, returning its index. Read more

-

Returns the maximum element of an iterator. Read more

-

Returns the minimum element of an iterator. Read more

-

Returns the element that gives the maximum value from the specified function. Read more

-

Returns the element that gives the maximum value with respect to the specified comparison function. Read more

-

Returns the element that gives the minimum value from the specified function. Read more

-

Returns the element that gives the minimum value with respect to the specified comparison function. Read more

-

Reverses an iterator's direction. Read more

-

Converts an iterator of pairs into a pair of containers. Read more

-

Creates an iterator which [clone]s all of its elements. Read more

-

Repeats an iterator endlessly. Read more

-

Sums the elements of an iterator. Read more

-

Iterates over the entire iterator, multiplying all the elements Read more

-

Lexicographically compares the elements of this Iterator with those of another. Read more

-

Lexicographically compares the elements of this Iterator with those of another. Read more

-

Determines if the elements of this Iterator are equal to those of another. Read more

-

Determines if the elements of this Iterator are unequal to those of another. Read more

-

Determines if the elements of this Iterator are lexicographically less than those of another. Read more

-

Determines if the elements of this Iterator are lexicographically less or equal to those of another. Read more

-

Determines if the elements of this Iterator are lexicographically greater than those of another. Read more

-

Determines if the elements of this Iterator are lexicographically greater than or equal to those of another. Read more

-

Auto Trait Implementations

impl<T> Send for LineContinationHandler<T> where
    T: Send

impl<T> Sync for LineContinationHandler<T> where
    T: Sync

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<I> IntoIterator for I where
    I: Iterator
[src]

-

The type of the elements being iterated over.

-

-

Which kind of iterator are we turning this into?

-

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_parser/lexer/struct.Location.html b/rustpython_parser/lexer/struct.Location.html index 1c694a9..1f57776 100644 --- a/rustpython_parser/lexer/struct.Location.html +++ b/rustpython_parser/lexer/struct.Location.html @@ -1,23 +1,20 @@ -rustpython_parser::lexer::Location - Rust

[][src]Struct rustpython_parser::lexer::Location

pub struct Location { /* fields omitted */ }

Methods

impl Location
[src]

Trait Implementations

impl Default for Location
[src]

impl PartialEq<Location> for Location
[src]

impl Clone for Location
[src]

Performs copy-assignment from source. Read more

-

impl Debug for Location
[src]

Auto Trait Implementations

impl Send for Location

impl Sync for Location

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-
\ No newline at end of file diff --git a/rustpython_parser/lexer/struct.NewlineHandler.html b/rustpython_parser/lexer/struct.NewlineHandler.html index bc66e75..aafa7fc 100644 --- a/rustpython_parser/lexer/struct.NewlineHandler.html +++ b/rustpython_parser/lexer/struct.NewlineHandler.html @@ -1,76 +1,72 @@ -rustpython_parser::lexer::NewlineHandler - Rust

[][src]Struct rustpython_parser::lexer::NewlineHandler

pub struct NewlineHandler<T: Iterator<Item = char>> { /* fields omitted */ }

Methods

impl<T> NewlineHandler<T> where
    T: Iterator<Item = char>, 
[src]

Trait Implementations

impl<T> Iterator for NewlineHandler<T> where
    T: Iterator<Item = char>, 
[src]

-

The type of the elements being iterated over.

-

Returns the bounds on the remaining length of the iterator. Read more

-

Consumes the iterator, counting the number of iterations and returning it. Read more

-

Consumes the iterator, returning the last element. Read more

-

Returns the nth element of the iterator. Read more

-

Creates an iterator starting at the same point, but stepping by the given amount at each iteration. Read more

-

Takes two iterators and creates a new iterator over both in sequence. Read more

-

'Zips up' two iterators into a single iterator of pairs. Read more

-

Takes a closure and creates an iterator which calls that closure on each element. Read more

-

Calls a closure on each element of an iterator. Read more

-

Creates an iterator which uses a closure to determine if an element should be yielded. Read more

-

Creates an iterator that both filters and maps. Read more

-

Creates an iterator which gives the current iteration count as well as the next value. Read more

-

Creates an iterator which can use peek to look at the next element of the iterator without consuming it. Read more

-

Creates an iterator that [skip]s elements based on a predicate. Read more

-

Creates an iterator that yields elements based on a predicate. Read more

-

Creates an iterator that skips the first n elements. Read more

-

Creates an iterator that yields its first n elements. Read more

-

An iterator adaptor similar to [fold] that holds internal state and produces a new iterator. Read more

-

Creates an iterator that works like map, but flattens nested structure. Read more

-

Creates an iterator that flattens nested structure. Read more

-

Creates an iterator which ends after the first [None]. Read more

-

Do something with each element of an iterator, passing the value on. Read more

-

Borrows an iterator, rather than consuming it. Read more

-

Transforms an iterator into a collection. Read more

-

Consumes an iterator, creating two collections from it. Read more

-

An iterator method that applies a function as long as it returns successfully, producing a single, final value. Read more

-

An iterator method that applies a fallible function to each item in the iterator, stopping at the first error and returning that error. Read more

-

An iterator method that applies a function, producing a single, final value. Read more

-

Tests if every element of the iterator matches a predicate. Read more

-

Tests if any element of the iterator matches a predicate. Read more

-

Searches for an element of an iterator that satisfies a predicate. Read more

-

Applies function to the elements of iterator and returns the first non-none result. Read more

-

Searches for an element in an iterator, returning its index. Read more

-

Searches for an element in an iterator from the right, returning its index. Read more

-

Returns the maximum element of an iterator. Read more

-

Returns the minimum element of an iterator. Read more

-

Returns the element that gives the maximum value from the specified function. Read more

-

Returns the element that gives the maximum value with respect to the specified comparison function. Read more

-

Returns the element that gives the minimum value from the specified function. Read more

-

Returns the element that gives the minimum value with respect to the specified comparison function. Read more

-

Reverses an iterator's direction. Read more

-

Converts an iterator of pairs into a pair of containers. Read more

-

Creates an iterator which [clone]s all of its elements. Read more

-

Repeats an iterator endlessly. Read more

-

Sums the elements of an iterator. Read more

-

Iterates over the entire iterator, multiplying all the elements Read more

-

Lexicographically compares the elements of this Iterator with those of another. Read more

-

Lexicographically compares the elements of this Iterator with those of another. Read more

-

Determines if the elements of this Iterator are equal to those of another. Read more

-

Determines if the elements of this Iterator are unequal to those of another. Read more

-

Determines if the elements of this Iterator are lexicographically less than those of another. Read more

-

Determines if the elements of this Iterator are lexicographically less or equal to those of another. Read more

-

Determines if the elements of this Iterator are lexicographically greater than those of another. Read more

-

Determines if the elements of this Iterator are lexicographically greater than or equal to those of another. Read more

-

Auto Trait Implementations

impl<T> Send for NewlineHandler<T> where
    T: Send

impl<T> Sync for NewlineHandler<T> where
    T: Sync

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<I> IntoIterator for I where
    I: Iterator
[src]

-

The type of the elements being iterated over.

-

-

Which kind of iterator are we turning this into?

-

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_parser/lexer/type.Spanned.html b/rustpython_parser/lexer/type.Spanned.html index 2e92e60..8951867 100644 --- a/rustpython_parser/lexer/type.Spanned.html +++ b/rustpython_parser/lexer/type.Spanned.html @@ -1 +1 @@ -rustpython_parser::lexer::Spanned - Rust

[][src]Type Definition rustpython_parser::lexer::Spanned

type Spanned<Tok> = Result<(Location, Tok, Location), LexicalError>;
\ No newline at end of file +rustpython_parser::lexer::Spanned - Rust

[][src]Type Definition rustpython_parser::lexer::Spanned

type Spanned<Tok> = Result<(Location, Tok, Location), LexicalError>;
\ No newline at end of file diff --git a/rustpython_parser/parser/fn.parse_expression.html b/rustpython_parser/parser/fn.parse_expression.html index cd0e6ca..92efb66 100644 --- a/rustpython_parser/parser/fn.parse_expression.html +++ b/rustpython_parser/parser/fn.parse_expression.html @@ -1,4 +1,4 @@ -rustpython_parser::parser::parse_expression - Rust

[][src]Function rustpython_parser::parser::parse_expression

pub fn parse_expression(source: &str) -> Result<Expression, ParseError>

Parses a python expression

+rustpython_parser::parser::parse_expression - Rust

[][src]Function rustpython_parser::parser::parse_expression

pub fn parse_expression(source: &str) -> Result<Expression, ParseError>

Parses a python expression

Example

 extern crate num_bigint;
@@ -18,4 +18,4 @@ 

Example

}, expr);
-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/parser/fn.parse_program.html b/rustpython_parser/parser/fn.parse_program.html index ab350cd..55fcc5c 100644 --- a/rustpython_parser/parser/fn.parse_program.html +++ b/rustpython_parser/parser/fn.parse_program.html @@ -1 +1 @@ -rustpython_parser::parser::parse_program - Rust

[][src]Function rustpython_parser::parser::parse_program

pub fn parse_program(source: &str) -> Result<Program, ParseError>
\ No newline at end of file +rustpython_parser::parser::parse_program - Rust

[][src]Function rustpython_parser::parser::parse_program

pub fn parse_program(source: &str) -> Result<Program, ParseError>
\ No newline at end of file diff --git a/rustpython_parser/parser/fn.parse_statement.html b/rustpython_parser/parser/fn.parse_statement.html index 260eecf..d4df4f7 100644 --- a/rustpython_parser/parser/fn.parse_statement.html +++ b/rustpython_parser/parser/fn.parse_statement.html @@ -1 +1 @@ -rustpython_parser::parser::parse_statement - Rust

[][src]Function rustpython_parser::parser::parse_statement

pub fn parse_statement(source: &str) -> Result<LocatedStatement, ParseError>
\ No newline at end of file +rustpython_parser::parser::parse_statement - Rust

[][src]Function rustpython_parser::parser::parse_statement

pub fn parse_statement(source: &str) -> Result<LocatedStatement, ParseError>
\ No newline at end of file diff --git a/rustpython_parser/parser/index.html b/rustpython_parser/parser/index.html index 68e38d4..44e6d2c 100644 --- a/rustpython_parser/parser/index.html +++ b/rustpython_parser/parser/index.html @@ -1,4 +1,3 @@ -rustpython_parser::parser - Rust

[][src]Module rustpython_parser::parser

Enums

-
FStringError

Functions

+rustpython_parser::parser - Rust

[][src]Module rustpython_parser::parser

Functions

parse_expression

Parses a python expression

-
parse_fstring
parse_program
parse_statement
\ No newline at end of file +parse_programparse_statement
\ No newline at end of file diff --git a/rustpython_parser/parser/sidebar-items.js b/rustpython_parser/parser/sidebar-items.js index abea0a6..37acb4e 100644 --- a/rustpython_parser/parser/sidebar-items.js +++ b/rustpython_parser/parser/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"enum":[["FStringError",""]],"fn":[["parse_expression","Parses a python expression"],["parse_fstring",""],["parse_program",""],["parse_statement",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["parse_expression","Parses a python expression"],["parse_program",""],["parse_statement",""]]}); \ No newline at end of file diff --git a/rustpython_parser/token/enum.Tok.html b/rustpython_parser/token/enum.Tok.html index be240dd..e4265f7 100644 --- a/rustpython_parser/token/enum.Tok.html +++ b/rustpython_parser/token/enum.Tok.html @@ -1,4 +1,4 @@ -rustpython_parser::token::Tok - Rust

[][src]Enum rustpython_parser::token::Tok

pub enum Tok {
+rustpython_parser::token::Tok - Rust

[][src]Enum rustpython_parser::token::Tok

pub enum Tok {
     Name {
         name: String,
     },
@@ -107,19 +107,17 @@
 }

Python source code can be tokenized in a sequence of these tokens.

Variants

-

Fields of Name

Fields of Int

Fields of Float

Fields of Complex

Fields of String

Fields of Bytes

Trait Implementations

impl PartialEq<Tok> for Tok
[src]

impl Debug for Tok
[src]

Auto Trait Implementations

impl Send for Tok

impl Sync for Tok

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_parser/token/index.html b/rustpython_parser/token/index.html index 5b10d14..8dd136c 100644 --- a/rustpython_parser/token/index.html +++ b/rustpython_parser/token/index.html @@ -1,5 +1,5 @@ -rustpython_parser::token - Rust

[][src]Module rustpython_parser::token

Different token definitions. +rustpython_parser::token - Rust

[][src]Module rustpython_parser::token

Different token definitions. Loosely based on token.h from CPython source:

Enums

Tok

Python source code can be tokenized in a sequence of these tokens.

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/all.html b/rustpython_vm/all.html index 09cff58..61c4a11 100644 --- a/rustpython_vm/all.html +++ b/rustpython_vm/all.html @@ -1,3 +1,3 @@ -List of all items in this crate

[] +List of all items in this crate

[] - List of all items

Structs

Enums

Traits

Macros

Functions

Typedefs

\ No newline at end of file + List of all items

Structs

Enums

Traits

Macros

Functions

Typedefs

\ No newline at end of file diff --git a/rustpython_vm/bytecode/Varargs.t.html b/rustpython_vm/bytecode/Varargs.t.html new file mode 100644 index 0000000..cbab1fb --- /dev/null +++ b/rustpython_vm/bytecode/Varargs.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to enum.Varargs.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/bytecode/enum.BinaryOperator.html b/rustpython_vm/bytecode/enum.BinaryOperator.html index 6379a5d..32e5b47 100644 --- a/rustpython_vm/bytecode/enum.BinaryOperator.html +++ b/rustpython_vm/bytecode/enum.BinaryOperator.html @@ -1,4 +1,4 @@ -rustpython_vm::bytecode::BinaryOperator - Rust

[][src]Enum rustpython_vm::bytecode::BinaryOperator

pub enum BinaryOperator {
+rustpython_vm::bytecode::BinaryOperator - Rust

[][src]Enum rustpython_vm::bytecode::BinaryOperator

pub enum BinaryOperator {
     Power,
     Multiply,
     MatrixMultiply,
@@ -15,26 +15,23 @@
     Or,
 }

Variants

-

Trait Implementations

impl PartialEq<BinaryOperator> for BinaryOperator
[src]

This method tests for !=.

-

impl Clone for BinaryOperator
[src]

Performs copy-assignment from source. Read more

-

impl Debug for BinaryOperator
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/bytecode/enum.CallType.html b/rustpython_vm/bytecode/enum.CallType.html index 7930ca5..6742b44 100644 --- a/rustpython_vm/bytecode/enum.CallType.html +++ b/rustpython_vm/bytecode/enum.CallType.html @@ -1,28 +1,25 @@ -rustpython_vm::bytecode::CallType - Rust

[][src]Enum rustpython_vm::bytecode::CallType

pub enum CallType {
+rustpython_vm::bytecode::CallType - Rust

[][src]Enum rustpython_vm::bytecode::CallType

pub enum CallType {
     Positional(usize),
     Keyword(usize),
     Ex(bool),
 }

Variants

-

Trait Implementations

impl PartialEq<CallType> for CallType
[src]

impl Clone for CallType
[src]

Performs copy-assignment from source. Read more

-

impl Debug for CallType
[src]

Auto Trait Implementations

impl Send for CallType

impl Sync for CallType

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/bytecode/enum.ComparisonOperator.html b/rustpython_vm/bytecode/enum.ComparisonOperator.html index 3f2742e..37dcc18 100644 --- a/rustpython_vm/bytecode/enum.ComparisonOperator.html +++ b/rustpython_vm/bytecode/enum.ComparisonOperator.html @@ -1,4 +1,4 @@ -rustpython_vm::bytecode::ComparisonOperator - Rust

[][src]Enum rustpython_vm::bytecode::ComparisonOperator

pub enum ComparisonOperator {
+rustpython_vm::bytecode::ComparisonOperator - Rust

[][src]Enum rustpython_vm::bytecode::ComparisonOperator

pub enum ComparisonOperator {
     Greater,
     GreaterOrEqual,
     Less,
@@ -11,26 +11,23 @@
     IsNot,
 }

Variants

-

Trait Implementations

impl PartialEq<ComparisonOperator> for ComparisonOperator
[src]

This method tests for !=.

-

impl Clone for ComparisonOperator
[src]

Performs copy-assignment from source. Read more

-

impl Debug for ComparisonOperator
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/bytecode/enum.Constant.html b/rustpython_vm/bytecode/enum.Constant.html index 50ef204..d8ba670 100644 --- a/rustpython_vm/bytecode/enum.Constant.html +++ b/rustpython_vm/bytecode/enum.Constant.html @@ -1,4 +1,4 @@ -rustpython_vm::bytecode::Constant - Rust

[][src]Enum rustpython_vm::bytecode::Constant

pub enum Constant {
+rustpython_vm::bytecode::Constant - Rust

[][src]Enum rustpython_vm::bytecode::Constant

pub enum Constant {
     Integer {
         value: BigInt,
     },
@@ -18,35 +18,33 @@
         value: Vec<u8>,
     },
     Code {
-        code: CodeObject,
+        code: Box<CodeObject>,
     },
     Tuple {
         elements: Vec<Constant>,
     },
     None,
+    Ellipsis,
 }

Variants

-

Fields of Integer

Fields of Float

Fields of Complex

Fields of Boolean

Fields of String

Fields of Bytes

Fields of Code

Fields of Tuple

Trait Implementations

impl PartialEq<Constant> for Constant
[src]

impl Clone for Constant
[src]

Performs copy-assignment from source. Read more

-

impl Display for Constant
[src]

impl Debug for Constant
[src]

Auto Trait Implementations

impl Send for Constant

impl Sync for Constant

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/bytecode/enum.Instruction.html b/rustpython_vm/bytecode/enum.Instruction.html index a377b93..84cb931 100644 --- a/rustpython_vm/bytecode/enum.Instruction.html +++ b/rustpython_vm/bytecode/enum.Instruction.html @@ -1,4 +1,4 @@ -rustpython_vm::bytecode::Instruction - Rust

[][src]Enum rustpython_vm::bytecode::Instruction

pub enum Instruction {
+rustpython_vm::bytecode::Instruction - Rust

[][src]Enum rustpython_vm::bytecode::Instruction

pub enum Instruction {
     Import {
         name: String,
         symbol: Option<String>,
@@ -119,7 +119,6 @@
     },
     PrintExpr,
     LoadBuildClass,
-    StoreLocals,
     UnpackSequence {
         size: usize,
     },
@@ -129,30 +128,28 @@
     },
     Unpack,
     FormatValue {
+        conversion: Option<ConversionFlag>,
         spec: String,
     },
 }

A Single bytecode instruction.

Variants

-

Fields of Import

Fields of ImportStar

Fields of LoadName

Fields of StoreName

Fields of DeleteName

Fields of StoreAttr

Fields of DeleteAttr

Fields of LoadConst

Fields of UnaryOperation

Fields of BinaryOperation

Fields of LoadAttr

Fields of CompareOperation

Fields of Rotate

Fields of Jump

Fields of JumpIf

Fields of JumpIfFalse

Fields of MakeFunction

Fields of CallFunction

Fields of ForIter

Fields of SetupLoop

Fields of SetupExcept

Fields of SetupWith

Fields of CleanupWith

Fields of Raise

Fields of BuildString

Fields of BuildTuple

Fields of BuildList

Fields of BuildSet

Fields of BuildMap

Fields of BuildSlice

Fields of ListAppend

Fields of SetAdd

Fields of MapAdd

Fields of UnpackSequence

Fields of UnpackEx

Fields of FormatValue

Trait Implementations

impl PartialEq<Instruction> for Instruction
[src]

impl Clone for Instruction
[src]

Performs copy-assignment from source. Read more

-

impl Debug for Instruction
[src]

Auto Trait Implementations

impl Send for Instruction

impl Sync for Instruction

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/bytecode/enum.UnaryOperator.html b/rustpython_vm/bytecode/enum.UnaryOperator.html index 9a00b75..6897864 100644 --- a/rustpython_vm/bytecode/enum.UnaryOperator.html +++ b/rustpython_vm/bytecode/enum.UnaryOperator.html @@ -1,30 +1,27 @@ -rustpython_vm::bytecode::UnaryOperator - Rust

[][src]Enum rustpython_vm::bytecode::UnaryOperator

pub enum UnaryOperator {
+rustpython_vm::bytecode::UnaryOperator - Rust

[][src]Enum rustpython_vm::bytecode::UnaryOperator

pub enum UnaryOperator {
     Not,
     Invert,
     Minus,
     Plus,
 }

Variants

-

Trait Implementations

impl PartialEq<UnaryOperator> for UnaryOperator
[src]

This method tests for !=.

-

impl Clone for UnaryOperator
[src]

Performs copy-assignment from source. Read more

-

impl Debug for UnaryOperator
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/bytecode/enum.Varargs.html b/rustpython_vm/bytecode/enum.Varargs.html new file mode 100644 index 0000000..2b5c5a9 --- /dev/null +++ b/rustpython_vm/bytecode/enum.Varargs.html @@ -0,0 +1,27 @@ +rustpython_vm::bytecode::Varargs - Rust

[][src]Enum rustpython_vm::bytecode::Varargs

pub enum Varargs {
+    None,
+    Unnamed,
+    Named(String),
+}

+ Variants

+NoneUnnamedNamed(String)

Trait Implementations

impl PartialEq<Varargs> for Varargs[src]

impl Clone for Varargs[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl From<Varargs> for Varargs[src]

impl<'a> From<&'a Varargs> for Varargs[src]

impl Debug for Varargs[src]

Auto Trait Implementations

impl Send for Varargs

impl Sync for Varargs

Blanket Implementations

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/bytecode/index.html b/rustpython_vm/bytecode/index.html index 737527a..bd3e443 100644 --- a/rustpython_vm/bytecode/index.html +++ b/rustpython_vm/bytecode/index.html @@ -1,9 +1,9 @@ -rustpython_vm::bytecode - Rust

[][src]Module rustpython_vm::bytecode

Implement python as a virtual machine with bytecodes. This module +rustpython_vm::bytecode - Rust

[][src]Module rustpython_vm::bytecode

Implement python as a virtual machine with bytecodes. This module implements bytecode structure.

Structs

CodeObject

Primary container of a single code object. Each python function has a codeobject. Also a module has a codeobject.

FunctionOpArg

Enums

BinaryOperator
CallType
ComparisonOperator
Constant
Instruction

A Single bytecode instruction.

-
UnaryOperator

Type Definitions

-
Label
\ No newline at end of file +UnaryOperatorVarargs

Type Definitions

+
Label
\ No newline at end of file diff --git a/rustpython_vm/bytecode/sidebar-items.js b/rustpython_vm/bytecode/sidebar-items.js index 3d6ce9a..a9dce01 100644 --- a/rustpython_vm/bytecode/sidebar-items.js +++ b/rustpython_vm/bytecode/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"enum":[["BinaryOperator",""],["CallType",""],["ComparisonOperator",""],["Constant",""],["Instruction","A Single bytecode instruction."],["UnaryOperator",""]],"struct":[["CodeObject","Primary container of a single code object. Each python function has a codeobject. Also a module has a codeobject."],["FunctionOpArg",""]],"type":[["Label",""]]}); \ No newline at end of file +initSidebarItems({"enum":[["BinaryOperator",""],["CallType",""],["ComparisonOperator",""],["Constant",""],["Instruction","A Single bytecode instruction."],["UnaryOperator",""],["Varargs",""]],"struct":[["CodeObject","Primary container of a single code object. Each python function has a codeobject. Also a module has a codeobject."],["FunctionOpArg",""]],"type":[["Label",""]]}); \ No newline at end of file diff --git a/rustpython_vm/bytecode/struct.CodeObject.html b/rustpython_vm/bytecode/struct.CodeObject.html index ee578d8..d5d3397 100644 --- a/rustpython_vm/bytecode/struct.CodeObject.html +++ b/rustpython_vm/bytecode/struct.CodeObject.html @@ -1,11 +1,11 @@ -rustpython_vm::bytecode::CodeObject - Rust

[][src]Struct rustpython_vm::bytecode::CodeObject

pub struct CodeObject {
+rustpython_vm::bytecode::CodeObject - Rust

[][src]Struct rustpython_vm::bytecode::CodeObject

pub struct CodeObject {
     pub instructions: Vec<Instruction>,
     pub label_map: HashMap<Label, usize>,
     pub locations: Vec<Location>,
     pub arg_names: Vec<String>,
-    pub varargs: Option<Option<String>>,
+    pub varargs: Varargs,
     pub kwonlyarg_names: Vec<String>,
-    pub varkeywords: Option<Option<String>>,
+    pub varkeywords: Varargs,
     pub source_path: String,
     pub first_line_number: usize,
     pub obj_name: String,
@@ -13,71 +13,24 @@
 }

Primary container of a single code object. Each python function has a codeobject. Also a module has a codeobject.

- Fields

- - - - - - - - - - - - - - - - - - - - - -

Methods

impl CodeObject
[src]

Trait Implementations

impl PartialEq<CodeObject> for CodeObject
[src]

impl Clone for CodeObject
[src]

Performs copy-assignment from source. Read more

-

impl Display for CodeObject
[src]

impl Debug for CodeObject
[src]

Auto Trait Implementations

impl Send for CodeObject

impl Sync for CodeObject

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/bytecode/struct.FunctionOpArg.html b/rustpython_vm/bytecode/struct.FunctionOpArg.html index 5b16252..8e35245 100644 --- a/rustpython_vm/bytecode/struct.FunctionOpArg.html +++ b/rustpython_vm/bytecode/struct.FunctionOpArg.html @@ -1,73 +1,64 @@ -rustpython_vm::bytecode::FunctionOpArg - Rust

[]Struct rustpython_vm::bytecode::FunctionOpArg

pub struct FunctionOpArg { /* fields omitted */ }

Methods

impl FunctionOpArg

-

Returns an empty set of flags.

-

Returns the set containing all flags.

-

Returns the raw value of the flags currently stored.

-

Convert from underlying bit representation, unless that +rustpython_vm::bytecode::FunctionOpArg - Rust

[]Struct rustpython_vm::bytecode::FunctionOpArg

pub struct FunctionOpArg { /* fields omitted */ }

Methods

impl FunctionOpArg

pub const HAS_DEFAULTS: FunctionOpArg

pub const HAS_ANNOTATIONS: FunctionOpArg

pub fn empty() -> FunctionOpArg

Returns an empty set of flags.

+

pub fn all() -> FunctionOpArg

Returns the set containing all flags.

+

pub fn bits(&self) -> u8

Returns the raw value of the flags currently stored.

+

pub fn from_bits(bits: u8) -> Option<FunctionOpArg>

Convert from underlying bit representation, unless that representation contains bits that do not correspond to a flag.

-

Convert from underlying bit representation, dropping any bits +

pub fn from_bits_truncate(bits: u8) -> FunctionOpArg

Convert from underlying bit representation, dropping any bits that do not correspond to flags.

-

Returns true if no flags are currently stored.

-

Returns true if all flags are currently set.

-

Returns true if there are flags common to both self and other.

-

Returns true all of the flags in other are contained within self.

-

Inserts the specified flags in-place.

-

Removes the specified flags in-place.

-

Toggles the specified flags in-place.

-

Inserts or removes the specified flags depending on the passed value.

-

Trait Implementations

impl PartialOrd<FunctionOpArg> for FunctionOpArg

impl Ord for FunctionOpArg

Compares and returns the maximum of two values. Read more

-

Compares and returns the minimum of two values. Read more

-

impl PartialEq<FunctionOpArg> for FunctionOpArg

impl Clone for FunctionOpArg

Performs copy-assignment from source. Read more

-

impl Extend<FunctionOpArg> for FunctionOpArg

impl Copy for FunctionOpArg

impl Eq for FunctionOpArg

impl Octal for FunctionOpArg

impl Binary for FunctionOpArg

impl Debug for FunctionOpArg

impl UpperHex for FunctionOpArg

impl LowerHex for FunctionOpArg

impl Hash for FunctionOpArg

Feeds a slice of this type into the given [Hasher]. Read more

-

impl Sub<FunctionOpArg> for FunctionOpArg

-

The resulting type after applying the - operator.

-

Returns the set difference of the two sets of flags.

-

impl SubAssign<FunctionOpArg> for FunctionOpArg

Disables all flags enabled in the set.

-

impl Not for FunctionOpArg

-

The resulting type after applying the ! operator.

-

Returns the complement of this set of flags.

-

impl BitAnd<FunctionOpArg> for FunctionOpArg

-

The resulting type after applying the & operator.

-

Returns the intersection between the two sets of flags.

-

impl BitOr<FunctionOpArg> for FunctionOpArg

-

The resulting type after applying the | operator.

-

Returns the union of the two sets of flags.

-

impl BitXor<FunctionOpArg> for FunctionOpArg

-

The resulting type after applying the ^ operator.

-

Returns the left flags, but with all the right flags toggled.

-

impl BitAndAssign<FunctionOpArg> for FunctionOpArg

Disables all flags disabled in the set.

-

impl BitOrAssign<FunctionOpArg> for FunctionOpArg

Adds the set of flags.

-

impl BitXorAssign<FunctionOpArg> for FunctionOpArg

Toggles the set of flags.

-

impl FromIterator<FunctionOpArg> for FunctionOpArg

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-

Trait Implementations

impl PartialEq<FunctionOpArg> for FunctionOpArg

impl Ord for FunctionOpArg

fn max(self, other: Self) -> Self
1.21.0
[src]

Compares and returns the maximum of two values. Read more

+

fn min(self, other: Self) -> Self
1.21.0
[src]

Compares and returns the minimum of two values. Read more

+

impl Clone for FunctionOpArg

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Extend<FunctionOpArg> for FunctionOpArg

impl Eq for FunctionOpArg

impl Copy for FunctionOpArg

impl PartialOrd<FunctionOpArg> for FunctionOpArg

impl Binary for FunctionOpArg

impl Debug for FunctionOpArg

impl UpperHex for FunctionOpArg

impl LowerHex for FunctionOpArg

impl Octal for FunctionOpArg

impl Hash for FunctionOpArg

fn hash_slice<H>(data: &[Self], state: &mut H) where
    H: Hasher
1.3.0
[src]

Feeds a slice of this type into the given [Hasher]. Read more

+

impl Sub<FunctionOpArg> for FunctionOpArg

type Output = FunctionOpArg

The resulting type after applying the - operator.

+

fn sub(self, other: FunctionOpArg) -> FunctionOpArg

Returns the set difference of the two sets of flags.

+

impl SubAssign<FunctionOpArg> for FunctionOpArg

fn sub_assign(&mut self, other: FunctionOpArg)

Disables all flags enabled in the set.

+

impl Not for FunctionOpArg

type Output = FunctionOpArg

The resulting type after applying the ! operator.

+

fn not(self) -> FunctionOpArg

Returns the complement of this set of flags.

+

impl BitAnd<FunctionOpArg> for FunctionOpArg

type Output = FunctionOpArg

The resulting type after applying the & operator.

+

fn bitand(self, other: FunctionOpArg) -> FunctionOpArg

Returns the intersection between the two sets of flags.

+

impl BitOr<FunctionOpArg> for FunctionOpArg

type Output = FunctionOpArg

The resulting type after applying the | operator.

+

fn bitor(self, other: FunctionOpArg) -> FunctionOpArg

Returns the union of the two sets of flags.

+

impl BitXor<FunctionOpArg> for FunctionOpArg

type Output = FunctionOpArg

The resulting type after applying the ^ operator.

+

fn bitxor(self, other: FunctionOpArg) -> FunctionOpArg

Returns the left flags, but with all the right flags toggled.

+

impl BitAndAssign<FunctionOpArg> for FunctionOpArg

fn bitand_assign(&mut self, other: FunctionOpArg)

Disables all flags disabled in the set.

+

impl BitOrAssign<FunctionOpArg> for FunctionOpArg

fn bitor_assign(&mut self, other: FunctionOpArg)

Adds the set of flags.

+

impl BitXorAssign<FunctionOpArg> for FunctionOpArg

fn bitxor_assign(&mut self, other: FunctionOpArg)

Toggles the set of flags.

+

impl FromIterator<FunctionOpArg> for FunctionOpArg

Auto Trait Implementations

Blanket Implementations

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> BorrowMut for T where
    T: ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/bytecode/type.Label.html b/rustpython_vm/bytecode/type.Label.html index eaaf6c5..ca951bf 100644 --- a/rustpython_vm/bytecode/type.Label.html +++ b/rustpython_vm/bytecode/type.Label.html @@ -1 +1 @@ -rustpython_vm::bytecode::Label - Rust

[][src]Type Definition rustpython_vm::bytecode::Label

type Label = usize;
\ No newline at end of file +rustpython_vm::bytecode::Label - Rust

[][src]Type Definition rustpython_vm::bytecode::Label

type Label = usize;
\ No newline at end of file diff --git a/rustpython_vm/compile/enum.Mode.html b/rustpython_vm/compile/enum.Mode.html index f36f01e..337b2a2 100644 --- a/rustpython_vm/compile/enum.Mode.html +++ b/rustpython_vm/compile/enum.Mode.html @@ -1,19 +1,17 @@ -rustpython_vm::compile::Mode - Rust

[][src]Enum rustpython_vm::compile::Mode

pub enum Mode {
+rustpython_vm::compile::Mode - Rust

[][src]Enum rustpython_vm::compile::Mode

pub enum Mode {
     Exec,
     Eval,
     Single,
 }

Variants

-

Auto Trait Implementations

impl Send for Mode

impl Sync for Mode

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/compile/fn.compile.html b/rustpython_vm/compile/fn.compile.html index 07f804a..bc140f9 100644 --- a/rustpython_vm/compile/fn.compile.html +++ b/rustpython_vm/compile/fn.compile.html @@ -1,2 +1,2 @@ -rustpython_vm::compile::compile - Rust

[][src]Function rustpython_vm::compile::compile

pub fn compile(
    source: &str,
    mode: &Mode,
    source_path: String,
    code_type: PyObjectRef
) -> Result<PyObjectRef, CompileError>

Compile a given sourcecode into a bytecode object.

-
\ No newline at end of file +rustpython_vm::compile::compile - Rust

[][src]Function rustpython_vm::compile::compile

pub fn compile(
    source: &str,
    mode: &Mode,
    source_path: String,
    code_type: PyObjectRef
) -> Result<PyObjectRef, CompileError>

Compile a given sourcecode into a bytecode object.

+
\ No newline at end of file diff --git a/rustpython_vm/compile/index.html b/rustpython_vm/compile/index.html index 75c2cb4..1b32179 100644 --- a/rustpython_vm/compile/index.html +++ b/rustpython_vm/compile/index.html @@ -1,8 +1,8 @@ -rustpython_vm::compile - Rust

[][src]Module rustpython_vm::compile

Take an AST and transform it into bytecode

+rustpython_vm::compile - Rust

[][src]Module rustpython_vm::compile

Take an AST and transform it into bytecode

Inspirational code: https://github.com/python/cpython/blob/master/Python/compile.c https://github.com/micropython/micropython/blob/master/py/compile.c

Enums

Mode

Functions

compile

Compile a given sourcecode into a bytecode object.

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/error/enum.CompileError.html b/rustpython_vm/error/enum.CompileError.html index c04a9ed..a4213cd 100644 --- a/rustpython_vm/error/enum.CompileError.html +++ b/rustpython_vm/error/enum.CompileError.html @@ -1,4 +1,4 @@ -rustpython_vm::error::CompileError - Rust

[][src]Enum rustpython_vm::error::CompileError

pub enum CompileError {
+rustpython_vm::error::CompileError - Rust

[][src]Enum rustpython_vm::error::CompileError

pub enum CompileError {
     Assign(&'static str),
     Delete(&'static str),
     ExpectExpr,
@@ -6,32 +6,32 @@
     StarArgs,
     InvalidBreak,
     InvalidContinue,
+    InvalidReturn,
+    InvalidYield,
 }

Variants

-

Invalid assignment, cannot store value in target.

-

Invalid delete

-

Expected an expression got a statement

-

Parser error

-

Multiple * detected

-

Break statement outside of loop.

-

Continue statement outside of loop.

-

Trait Implementations

impl Display for CompileError
[src]

impl Debug for CompileError
[src]

impl Error for CompileError
[src]

This method is soft-deprecated. Read more

-

Deprecating in 1.33.0

: replaced by Error::source, which can support downcasting

+Assign(&'static str)

Invalid assignment, cannot store value in target.

+
Delete(&'static str)

Invalid delete

+
ExpectExpr

Expected an expression got a statement

+
Parse(ParseError)

Parser error

+
StarArgs

Multiple * detected

+
InvalidBreak

Break statement outside of loop.

+
InvalidContinue

Continue statement outside of loop.

+
InvalidReturnInvalidYield

Trait Implementations

impl Debug for CompileError[src]

impl Display for CompileError[src]

impl Error for CompileError[src]

fn description(&self) -> &str
1.0.0
[src]

This method is soft-deprecated. Read more

+

fn cause(&self) -> Option<&dyn Error>
1.0.0
[src]

Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

The lower-level cause of this error, if any. Read more

-

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

Auto Trait Implementations

Blanket Implementations

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> BorrowMut for T where
    T: ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/error/index.html b/rustpython_vm/error/index.html index 26893be..4b6e2a4 100644 --- a/rustpython_vm/error/index.html +++ b/rustpython_vm/error/index.html @@ -1,2 +1,2 @@ -rustpython_vm::error - Rust

[][src]Module rustpython_vm::error

Enums

-
CompileError
\ No newline at end of file +rustpython_vm::error - Rust

[][src]Module rustpython_vm::error

Enums

+
CompileError
\ No newline at end of file diff --git a/rustpython_vm/eval/fn.eval.html b/rustpython_vm/eval/fn.eval.html index 4197454..3ab8e14 100644 --- a/rustpython_vm/eval/fn.eval.html +++ b/rustpython_vm/eval/fn.eval.html @@ -1 +1 @@ -rustpython_vm::eval::eval - Rust

[][src]Function rustpython_vm::eval::eval

pub fn eval(
    vm: &mut VirtualMachine,
    source: &str,
    scope: PyObjectRef,
    source_path: &str
) -> PyResult
\ No newline at end of file +rustpython_vm::eval::eval - Rust

[][src]Function rustpython_vm::eval::eval

pub fn eval(
    vm: &VirtualMachine,
    source: &str,
    scope: Scope,
    source_path: &str
) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/eval/index.html b/rustpython_vm/eval/index.html index e535000..9db4447 100644 --- a/rustpython_vm/eval/index.html +++ b/rustpython_vm/eval/index.html @@ -1,2 +1,2 @@ -rustpython_vm::eval - Rust

[][src]Module rustpython_vm::eval

Functions

-
eval
\ No newline at end of file +rustpython_vm::eval - Rust

[][src]Module rustpython_vm::eval

Functions

+
eval
\ No newline at end of file diff --git a/rustpython_vm/extend_class.m.html b/rustpython_vm/extend_class.m.html new file mode 100644 index 0000000..45c47b8 --- /dev/null +++ b/rustpython_vm/extend_class.m.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to macro.extend_class.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/fn.print_exception.html b/rustpython_vm/fn.print_exception.html index 1df02bc..8123b68 100644 --- a/rustpython_vm/fn.print_exception.html +++ b/rustpython_vm/fn.print_exception.html @@ -1 +1 @@ -rustpython_vm::print_exception - Rust

[][src]Function rustpython_vm::print_exception

pub fn print_exception(vm: &mut VirtualMachine, exc: &PyObjectRef)
\ No newline at end of file +rustpython_vm::print_exception - Rust

[][src]Function rustpython_vm::print_exception

pub fn print_exception(vm: &VirtualMachine, exc: &PyObjectRef)
\ No newline at end of file diff --git a/rustpython_vm/format/enum.FormatAlign.html b/rustpython_vm/format/enum.FormatAlign.html index 2be93bd..bb2d5da 100644 --- a/rustpython_vm/format/enum.FormatAlign.html +++ b/rustpython_vm/format/enum.FormatAlign.html @@ -1,30 +1,27 @@ -rustpython_vm::format::FormatAlign - Rust

[][src]Enum rustpython_vm::format::FormatAlign

pub enum FormatAlign {
+rustpython_vm::format::FormatAlign - Rust

[][src]Enum rustpython_vm::format::FormatAlign

pub enum FormatAlign {
     Left,
     Right,
     AfterSign,
     Center,
 }

Variants

-

Trait Implementations

impl PartialEq<FormatAlign> for FormatAlign
[src]

This method tests for !=.

-

impl Clone for FormatAlign
[src]

Performs copy-assignment from source. Read more

-

impl Copy for FormatAlign
[src]

impl Debug for FormatAlign
[src]

Auto Trait Implementations

impl Send for FormatAlign

impl Sync for FormatAlign

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/format/enum.FormatGrouping.html b/rustpython_vm/format/enum.FormatGrouping.html index 6e016dc..826b986 100644 --- a/rustpython_vm/format/enum.FormatGrouping.html +++ b/rustpython_vm/format/enum.FormatGrouping.html @@ -1,22 +1,20 @@ -rustpython_vm::format::FormatGrouping - Rust

[][src]Enum rustpython_vm::format::FormatGrouping

pub enum FormatGrouping {
+rustpython_vm::format::FormatGrouping - Rust

[][src]Enum rustpython_vm::format::FormatGrouping

pub enum FormatGrouping {
     Comma,
     Underscore,
 }

Variants

-

Trait Implementations

impl PartialEq<FormatGrouping> for FormatGrouping
[src]

This method tests for !=.

-

impl Debug for FormatGrouping
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/format/enum.FormatParseError.html b/rustpython_vm/format/enum.FormatParseError.html index 53ccd57..2ef2fa2 100644 --- a/rustpython_vm/format/enum.FormatParseError.html +++ b/rustpython_vm/format/enum.FormatParseError.html @@ -1,23 +1,21 @@ -rustpython_vm::format::FormatParseError - Rust

[][src]Enum rustpython_vm::format::FormatParseError

pub enum FormatParseError {
+rustpython_vm::format::FormatParseError - Rust

[][src]Enum rustpython_vm::format::FormatParseError

pub enum FormatParseError {
     UnmatchedBracket,
     MissingStartBracket,
     UnescapedStartBracketInLiteral,
 }

Variants

-

Trait Implementations

impl PartialEq<FormatParseError> for FormatParseError
[src]

This method tests for !=.

-

impl Debug for FormatParseError
[src]

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/format/enum.FormatPart.html b/rustpython_vm/format/enum.FormatPart.html index 64fdc6d..f2b05dc 100644 --- a/rustpython_vm/format/enum.FormatPart.html +++ b/rustpython_vm/format/enum.FormatPart.html @@ -1,23 +1,21 @@ -rustpython_vm::format::FormatPart - Rust

[][src]Enum rustpython_vm::format::FormatPart

pub enum FormatPart {
+rustpython_vm::format::FormatPart - Rust

[][src]Enum rustpython_vm::format::FormatPart

pub enum FormatPart {
     AutoSpec(String),
     IndexSpec(usizeString),
     KeywordSpec(StringString),
     Literal(String),
 }

Variants

-

Methods

impl FormatPart
[src]

Trait Implementations

impl PartialEq<FormatPart> for FormatPart
[src]

impl Debug for FormatPart
[src]

Auto Trait Implementations

impl Send for FormatPart

impl Sync for FormatPart

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/format/enum.FormatSign.html b/rustpython_vm/format/enum.FormatSign.html index 137b8d0..39d04d8 100644 --- a/rustpython_vm/format/enum.FormatSign.html +++ b/rustpython_vm/format/enum.FormatSign.html @@ -1,29 +1,26 @@ -rustpython_vm::format::FormatSign - Rust

[][src]Enum rustpython_vm::format::FormatSign

pub enum FormatSign {
+rustpython_vm::format::FormatSign - Rust

[][src]Enum rustpython_vm::format::FormatSign

pub enum FormatSign {
     Plus,
     Minus,
     MinusOrSpace,
 }

Variants

-

Trait Implementations

impl PartialEq<FormatSign> for FormatSign
[src]

This method tests for !=.

-

impl Clone for FormatSign
[src]

Performs copy-assignment from source. Read more

-

impl Copy for FormatSign
[src]

impl Debug for FormatSign
[src]

Auto Trait Implementations

impl Send for FormatSign

impl Sync for FormatSign

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/format/enum.FormatType.html b/rustpython_vm/format/enum.FormatType.html index 316ec86..03aa9a4 100644 --- a/rustpython_vm/format/enum.FormatType.html +++ b/rustpython_vm/format/enum.FormatType.html @@ -1,4 +1,4 @@ -rustpython_vm::format::FormatType - Rust

[][src]Enum rustpython_vm::format::FormatType

pub enum FormatType {
+rustpython_vm::format::FormatType - Rust

[][src]Enum rustpython_vm::format::FormatType

pub enum FormatType {
     String,
     Binary,
     Character,
@@ -15,20 +15,18 @@
     FixedPointUpper,
 }

Variants

-

Trait Implementations

impl PartialEq<FormatType> for FormatType
[src]

This method tests for !=.

-

impl Debug for FormatType
[src]

Auto Trait Implementations

impl Send for FormatType

impl Sync for FormatType

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/format/index.html b/rustpython_vm/format/index.html index 3709f57..f841572 100644 --- a/rustpython_vm/format/index.html +++ b/rustpython_vm/format/index.html @@ -1,3 +1,3 @@ -rustpython_vm::format - Rust

[][src]Module rustpython_vm::format

Structs

+rustpython_vm::format - Rust

[][src]Module rustpython_vm::format

Structs

FormatSpec
FormatString

Enums

-
FormatAlign
FormatGrouping
FormatParseError
FormatPart
FormatSign
FormatType
\ No newline at end of file +
FormatAlign
FormatGrouping
FormatParseError
FormatPart
FormatSign
FormatType
\ No newline at end of file diff --git a/rustpython_vm/format/struct.FormatSpec.html b/rustpython_vm/format/struct.FormatSpec.html index 1b77bb1..d6285c4 100644 --- a/rustpython_vm/format/struct.FormatSpec.html +++ b/rustpython_vm/format/struct.FormatSpec.html @@ -1,19 +1,16 @@ -rustpython_vm::format::FormatSpec - Rust

[][src]Struct rustpython_vm::format::FormatSpec

pub struct FormatSpec { /* fields omitted */ }

Methods

impl FormatSpec
[src]

Trait Implementations

impl PartialEq<FormatSpec> for FormatSpec
[src]

impl Debug for FormatSpec
[src]

impl FromStr for FormatSpec
[src]

-

The associated error which can be returned from parsing.

-

Auto Trait Implementations

impl Send for FormatSpec

impl Sync for FormatSpec

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/format/struct.FormatString.html b/rustpython_vm/format/struct.FormatString.html index c9d95c1..da62717 100644 --- a/rustpython_vm/format/struct.FormatString.html +++ b/rustpython_vm/format/struct.FormatString.html @@ -1,26 +1,19 @@ -rustpython_vm::format::FormatString - Rust

[][src]Struct rustpython_vm::format::FormatString

pub struct FormatString {
+rustpython_vm::format::FormatString - Rust

[][src]Struct rustpython_vm::format::FormatString

pub struct FormatString {
     pub format_parts: Vec<FormatPart>,
 }

- Fields

- -

Trait Implementations

impl PartialEq<FormatString> for FormatString
[src]

impl Debug for FormatString
[src]

impl FromStr for FormatString
[src]

-

The associated error which can be returned from parsing.

-

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/frame/ExecutionResult.t.html b/rustpython_vm/frame/ExecutionResult.t.html new file mode 100644 index 0000000..d322046 --- /dev/null +++ b/rustpython_vm/frame/ExecutionResult.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to enum.ExecutionResult.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/frame/Frame.t.html b/rustpython_vm/frame/Frame.t.html new file mode 100644 index 0000000..7d6e43c --- /dev/null +++ b/rustpython_vm/frame/Frame.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.Frame.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/frame/FrameResult.t.html b/rustpython_vm/frame/FrameResult.t.html new file mode 100644 index 0000000..bf2c74f --- /dev/null +++ b/rustpython_vm/frame/FrameResult.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.FrameResult.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/frame/NameProtocol.t.html b/rustpython_vm/frame/NameProtocol.t.html new file mode 100644 index 0000000..498756b --- /dev/null +++ b/rustpython_vm/frame/NameProtocol.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to trait.NameProtocol.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/frame/Scope.t.html b/rustpython_vm/frame/Scope.t.html new file mode 100644 index 0000000..e6ad4f5 --- /dev/null +++ b/rustpython_vm/frame/Scope.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.Scope.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/frame/enum.ExecutionResult.html b/rustpython_vm/frame/enum.ExecutionResult.html new file mode 100644 index 0000000..019ca05 --- /dev/null +++ b/rustpython_vm/frame/enum.ExecutionResult.html @@ -0,0 +1,16 @@ +rustpython_vm::frame::ExecutionResult - Rust

[][src]Enum rustpython_vm::frame::ExecutionResult

pub enum ExecutionResult {
+    Return(PyObjectRef),
+    Yield(PyObjectRef),
+}

+ Variants

+Return(PyObjectRef)Yield(PyObjectRef)

Auto Trait Implementations

Blanket Implementations

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/frame/index.html b/rustpython_vm/frame/index.html new file mode 100644 index 0000000..2f20bde --- /dev/null +++ b/rustpython_vm/frame/index.html @@ -0,0 +1,5 @@ +rustpython_vm::frame - Rust

[][src]Module rustpython_vm::frame

Structs

+
Frame
Scope

Enums

+
ExecutionResult

Traits

+
NameProtocol

Type Definitions

+
FrameResult
\ No newline at end of file diff --git a/rustpython_vm/frame/sidebar-items.js b/rustpython_vm/frame/sidebar-items.js new file mode 100644 index 0000000..95f7819 --- /dev/null +++ b/rustpython_vm/frame/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"enum":[["ExecutionResult",""]],"struct":[["Frame",""],["Scope",""]],"trait":[["NameProtocol",""]],"type":[["FrameResult",""]]}); \ No newline at end of file diff --git a/rustpython_vm/frame/struct.Frame.html b/rustpython_vm/frame/struct.Frame.html new file mode 100644 index 0000000..bdf030f --- /dev/null +++ b/rustpython_vm/frame/struct.Frame.html @@ -0,0 +1,18 @@ +rustpython_vm::frame::Frame - Rust

[][src]Struct rustpython_vm::frame::Frame

pub struct Frame {
+    pub code: CodeObject,
+    pub scope: Scope,
+    pub lasti: RefCell<usize>,
+    // some fields omitted
+}

+ Fields

code: CodeObjectscope: Scopelasti: RefCell<usize>

Methods

impl Frame[src]

pub fn new(code: PyObjectRef, scope: Scope) -> Frame[src]

pub fn run(&self, vm: &VirtualMachine) -> Result<ExecutionResult, PyObjectRef>[src]

pub fn fetch_instruction(&self) -> &Instruction[src]

pub fn get_lineno(&self) -> Location[src]

pub fn push_value(&self, obj: PyObjectRef)[src]

Trait Implementations

impl PyValue for Frame[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for Frame[src]

Auto Trait Implementations

impl !Send for Frame

impl !Sync for Frame

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/frame/struct.Scope.html b/rustpython_vm/frame/struct.Scope.html new file mode 100644 index 0000000..0f4bf0a --- /dev/null +++ b/rustpython_vm/frame/struct.Scope.html @@ -0,0 +1,21 @@ +rustpython_vm::frame::Scope - Rust

[][src]Struct rustpython_vm::frame::Scope

pub struct Scope {
+    pub globals: PyObjectRef,
+    // some fields omitted
+}

+ Fields

globals: PyObjectRef

Methods

impl Scope[src]

pub fn new(locals: Option<PyObjectRef>, globals: PyObjectRef) -> Scope[src]

pub fn get_locals(&self) -> PyObjectRef[src]

pub fn get_only_locals(&self) -> Option<PyObjectRef>[src]

pub fn child_scope_with_locals(&self, locals: PyObjectRef) -> Scope[src]

pub fn child_scope(&self, ctx: &PyContext) -> Scope[src]

Trait Implementations

impl NameProtocol for Scope[src]

impl Clone for Scope[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Debug for Scope[src]

Auto Trait Implementations

impl !Send for Scope

impl !Sync for Scope

Blanket Implementations

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/frame/trait.NameProtocol.html b/rustpython_vm/frame/trait.NameProtocol.html new file mode 100644 index 0000000..beafed0 --- /dev/null +++ b/rustpython_vm/frame/trait.NameProtocol.html @@ -0,0 +1,10 @@ +rustpython_vm::frame::NameProtocol - Rust

[][src]Trait rustpython_vm::frame::NameProtocol

pub trait NameProtocol {
+    fn load_name(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>;
+
fn store_name(&self, vm: &VirtualMachine, name: &str, value: PyObjectRef); +
fn delete_name(&self, vm: &VirtualMachine, name: &str); +
fn load_cell(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>; +}
+

Required methods

fn load_name(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>

fn store_name(&self, vm: &VirtualMachine, name: &str, value: PyObjectRef)

fn delete_name(&self, vm: &VirtualMachine, name: &str)

fn load_cell(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>

Loading content... +

Implementors

impl NameProtocol for Scope[src]

Loading content...
\ No newline at end of file diff --git a/rustpython_vm/frame/type.FrameResult.html b/rustpython_vm/frame/type.FrameResult.html new file mode 100644 index 0000000..ee86966 --- /dev/null +++ b/rustpython_vm/frame/type.FrameResult.html @@ -0,0 +1 @@ +rustpython_vm::frame::FrameResult - Rust

[][src]Type Definition rustpython_vm::frame::FrameResult

type FrameResult = Result<Option<ExecutionResult>, PyObjectRef>;
\ No newline at end of file diff --git a/rustpython_vm/function/Args.t.html b/rustpython_vm/function/Args.t.html new file mode 100644 index 0000000..09069a2 --- /dev/null +++ b/rustpython_vm/function/Args.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.Args.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/function/ArgumentError.t.html b/rustpython_vm/function/ArgumentError.t.html new file mode 100644 index 0000000..bb186b3 --- /dev/null +++ b/rustpython_vm/function/ArgumentError.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to enum.ArgumentError.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/function/FromArgs.t.html b/rustpython_vm/function/FromArgs.t.html new file mode 100644 index 0000000..0450462 --- /dev/null +++ b/rustpython_vm/function/FromArgs.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to trait.FromArgs.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/function/IntoPyNativeFunc.t.html b/rustpython_vm/function/IntoPyNativeFunc.t.html new file mode 100644 index 0000000..4384db9 --- /dev/null +++ b/rustpython_vm/function/IntoPyNativeFunc.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to trait.IntoPyNativeFunc.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/function/KwArgs.t.html b/rustpython_vm/function/KwArgs.t.html new file mode 100644 index 0000000..d13eca9 --- /dev/null +++ b/rustpython_vm/function/KwArgs.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.KwArgs.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/function/OptionalArg.t.html b/rustpython_vm/function/OptionalArg.t.html new file mode 100644 index 0000000..f1b919a --- /dev/null +++ b/rustpython_vm/function/OptionalArg.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to enum.OptionalArg.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/function/PyFuncArgs.t.html b/rustpython_vm/function/PyFuncArgs.t.html new file mode 100644 index 0000000..f104bb5 --- /dev/null +++ b/rustpython_vm/function/PyFuncArgs.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyFuncArgs.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/function/PyNativeFunc.t.html b/rustpython_vm/function/PyNativeFunc.t.html new file mode 100644 index 0000000..7351f46 --- /dev/null +++ b/rustpython_vm/function/PyNativeFunc.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyNativeFunc.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/function/enum.ArgumentError.html b/rustpython_vm/function/enum.ArgumentError.html new file mode 100644 index 0000000..677544e --- /dev/null +++ b/rustpython_vm/function/enum.ArgumentError.html @@ -0,0 +1,26 @@ +rustpython_vm::function::ArgumentError - Rust

[][src]Enum rustpython_vm::function::ArgumentError

pub enum ArgumentError {
+    TooFewArgs,
+    TooManyArgs,
+    InvalidKeywordArgument(String),
+    Exception(PyObjectRef),
+}

An error encountered while binding arguments to the parameters of a Python +function call.

+

+ Variants

+TooFewArgs

The call provided fewer positional arguments than the function requires.

+
TooManyArgs

The call provided more positional arguments than the function accepts.

+
InvalidKeywordArgument(String)

The function doesn't accept a keyword argument with the given name.

+
Exception(PyObjectRef)

An exception was raised while binding arguments to the function +parameters.

+

Trait Implementations

impl From<Rc<PyObject>> for ArgumentError[src]

Auto Trait Implementations

Blanket Implementations

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/function/enum.OptionalArg.html b/rustpython_vm/function/enum.OptionalArg.html new file mode 100644 index 0000000..3191579 --- /dev/null +++ b/rustpython_vm/function/enum.OptionalArg.html @@ -0,0 +1,22 @@ +rustpython_vm::function::OptionalArg - Rust

[][src]Enum rustpython_vm::function::OptionalArg

pub enum OptionalArg<T> {
+    Present(T),
+    Missing,
+}

An argument that may or may not be provided by the caller.

+

This style of argument is not possible in pure Python.

+

+ Variants

+Present(T)Missing

Methods

impl<T> OptionalArg<T>[src]

pub fn into_option(self) -> Option<T>[src]

Trait Implementations

impl<T> FromArgs for OptionalArg<T> where
    T: TryFromObject
[src]

Auto Trait Implementations

impl<T> Send for OptionalArg<T> where
    T: Send

impl<T> Sync for OptionalArg<T> where
    T: Sync

Blanket Implementations

impl<T> FromArgs for T where
    T: TryFromObject
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/function/index.html b/rustpython_vm/function/index.html new file mode 100644 index 0000000..3586e5e --- /dev/null +++ b/rustpython_vm/function/index.html @@ -0,0 +1,17 @@ +rustpython_vm::function - Rust

[][src]Module rustpython_vm::function

Structs

+
Args

A list of positional argument values.

+
KwArgs

A map of keyword arguments to their values.

+
PyFuncArgs

The PyFuncArgs struct is one of the most used structs then creating +a rust function that can be called from python. It holds both positional +arguments, as well as keyword arguments passed to the function.

+

Enums

+
ArgumentError

An error encountered while binding arguments to the parameters of a Python +function call.

+
OptionalArg

An argument that may or may not be provided by the caller.

+

Traits

+
FromArgs

Implemented by any type that can be accepted as a parameter to a built-in +function.

+
IntoPyNativeFunc

Implemented by types that are or can generate built-in functions.

+

Type Definitions

+
PyNativeFunc

A built-in Python function.

+
\ No newline at end of file diff --git a/rustpython_vm/function/sidebar-items.js b/rustpython_vm/function/sidebar-items.js new file mode 100644 index 0000000..862a4ce --- /dev/null +++ b/rustpython_vm/function/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"enum":[["ArgumentError","An error encountered while binding arguments to the parameters of a Python function call."],["OptionalArg","An argument that may or may not be provided by the caller."]],"struct":[["Args","A list of positional argument values."],["KwArgs","A map of keyword arguments to their values."],["PyFuncArgs","The `PyFuncArgs` struct is one of the most used structs then creating a rust function that can be called from python. It holds both positional arguments, as well as keyword arguments passed to the function."]],"trait":[["FromArgs","Implemented by any type that can be accepted as a parameter to a built-in function."],["IntoPyNativeFunc","Implemented by types that are or can generate built-in functions."]],"type":[["PyNativeFunc","A built-in Python function."]]}); \ No newline at end of file diff --git a/rustpython_vm/function/struct.Args.html b/rustpython_vm/function/struct.Args.html new file mode 100644 index 0000000..aea416d --- /dev/null +++ b/rustpython_vm/function/struct.Args.html @@ -0,0 +1,41 @@ +rustpython_vm::function::Args - Rust

[][src]Struct rustpython_vm::function::Args

pub struct Args<T = PyObjectRef>(_);

A list of positional argument values.

+

A built-in function with a Args parameter is analagous to a Python +function with *args. All remaining positional arguments are extracted +(and hence the function will permit an arbitrary number of them).

+

Args optionally accepts a generic type parameter to allow type checks +or conversions of each argument.

+

Trait Implementations

impl<T> FromArgs for Args<T> where
    T: TryFromObject
[src]

fn arity() -> RangeInclusive<usize>[src]

The range of positional arguments permitted by the function signature. Read more

+

impl<T> IntoIterator for Args<T>[src]

type Item = T

The type of the elements being iterated over.

+

type IntoIter = IntoIter<T>

Which kind of iterator are we turning this into?

+

Auto Trait Implementations

impl<T> Send for Args<T> where
    T: Send

impl<T> Sync for Args<T> where
    T: Sync

Blanket Implementations

impl<T> FromArgs for T where
    T: TryFromObject
[src]

impl<I> IntoIterator for I where
    I: Iterator
[src]

type Item = <I as Iterator>::Item

The type of the elements being iterated over.

+

type IntoIter = I

Which kind of iterator are we turning this into?

+

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Statistics for T where
    T: IntoIterator,
    <T as IntoIterator>::Item: Borrow<f64>, 

\ No newline at end of file diff --git a/rustpython_vm/function/struct.KwArgs.html b/rustpython_vm/function/struct.KwArgs.html new file mode 100644 index 0000000..8d189f9 --- /dev/null +++ b/rustpython_vm/function/struct.KwArgs.html @@ -0,0 +1,25 @@ +rustpython_vm::function::KwArgs - Rust

[][src]Struct rustpython_vm::function::KwArgs

pub struct KwArgs<T = PyObjectRef>(_);

A map of keyword arguments to their values.

+

A built-in function with a KwArgs parameter is analagous to a Python +function with **kwargs. All remaining keyword arguments are extracted +(and hence the function will permit an arbitrary number of them).

+

KwArgs optionally accepts a generic type parameter to allow type checks +or conversions of each argument.

+

Note:

+

KwArgs is only for functions that accept arbitrary keyword arguments. For +functions that accept only specific named arguments, a rust struct with +an appropriate FromArgs implementation must be created.

+

Trait Implementations

impl<T> FromArgs for KwArgs<T> where
    T: TryFromObject
[src]

fn arity() -> RangeInclusive<usize>[src]

The range of positional arguments permitted by the function signature. Read more

+

Auto Trait Implementations

impl<T> Send for KwArgs<T> where
    T: Send

impl<T> Sync for KwArgs<T> where
    T: Sync

Blanket Implementations

impl<T> FromArgs for T where
    T: TryFromObject
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/function/struct.PyFuncArgs.html b/rustpython_vm/function/struct.PyFuncArgs.html new file mode 100644 index 0000000..a594bd9 --- /dev/null +++ b/rustpython_vm/function/struct.PyFuncArgs.html @@ -0,0 +1,28 @@ +rustpython_vm::function::PyFuncArgs - Rust

[][src]Struct rustpython_vm::function::PyFuncArgs

pub struct PyFuncArgs {
+    pub args: Vec<PyObjectRef>,
+    pub kwargs: Vec<(String, PyObjectRef)>,
+}

The PyFuncArgs struct is one of the most used structs then creating +a rust function that can be called from python. It holds both positional +arguments, as well as keyword arguments passed to the function.

+

+ Fields

args: Vec<PyObjectRef>kwargs: Vec<(String, PyObjectRef)>

Methods

impl PyFuncArgs[src]

pub fn new(args: Vec<PyObjectRef>, kwarg_names: Vec<String>) -> PyFuncArgs[src]

pub fn insert(&self, item: PyObjectRef) -> PyFuncArgs[src]

pub fn shift(&mut self) -> PyObjectRef[src]

pub fn get_kwarg(&self, key: &str, default: PyObjectRef) -> PyObjectRef[src]

pub fn get_optional_kwarg(&self, key: &str) -> Option<PyObjectRef>[src]

pub fn get_optional_kwarg_with_type(
    &self,
    key: &str,
    ty: PyObjectRef,
    vm: &VirtualMachine
) -> Result<Option<PyObjectRef>, PyObjectRef>
[src]

pub fn next_positional(&mut self) -> Option<PyObjectRef>[src]

pub fn take_keyword(&mut self, name: &str) -> Option<PyObjectRef>[src]

pub fn remaining_keyword<'a>(
    &'a mut self
) -> impl Iterator<Item = (String, PyObjectRef)> + 'a
[src]

Trait Implementations

impl<F> IntoPyNativeFunc<PyFuncArgs, Result<Rc<PyObject>, Rc<PyObject>>> for F where
    F: Fn(&VirtualMachine, PyFuncArgs) -> PyResult + 'static, 
[src]

impl IntoPyNativeFunc<PyFuncArgs, Result<Rc<PyObject>, Rc<PyObject>>> for PyNativeFunc[src]

impl Default for PyFuncArgs[src]

impl Clone for PyFuncArgs[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl From<Vec<Rc<PyObject>>> for PyFuncArgs[src]

Conversion from vector of python objects to function arguments.

+

impl From<Rc<PyObject>> for PyFuncArgs[src]

impl Debug for PyFuncArgs[src]

Auto Trait Implementations

impl !Send for PyFuncArgs

impl !Sync for PyFuncArgs

Blanket Implementations

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/function/trait.FromArgs.html b/rustpython_vm/function/trait.FromArgs.html new file mode 100644 index 0000000..8ec7397 --- /dev/null +++ b/rustpython_vm/function/trait.FromArgs.html @@ -0,0 +1,16 @@ +rustpython_vm::function::FromArgs - Rust

[][src]Trait rustpython_vm::function::FromArgs

pub trait FromArgs: Sized {
+    fn from_args(
        vm: &VirtualMachine,
        args: &mut PyFuncArgs
    ) -> Result<Self, ArgumentError>; + + fn arity() -> RangeInclusive<usize> { ... } +}

Implemented by any type that can be accepted as a parameter to a built-in +function.

+
+

Required methods

fn from_args(
    vm: &VirtualMachine,
    args: &mut PyFuncArgs
) -> Result<Self, ArgumentError>

Extracts this item from the next argument(s).

+
Loading content... +

Provided methods

fn arity() -> RangeInclusive<usize>

The range of positional arguments permitted by the function signature.

+

Returns an empty range if not applicable.

+
Loading content... +

Implementations on Foreign Types

impl FromArgs for ()[src]

fn arity() -> RangeInclusive<usize>[src]

impl<A> FromArgs for (A,) where
    A: FromArgs
[src]

impl<A, B> FromArgs for (A, B) where
    A: FromArgs,
    B: FromArgs
[src]

impl<A, B, C> FromArgs for (A, B, C) where
    A: FromArgs,
    B: FromArgs,
    C: FromArgs
[src]

impl<A, B, C, D> FromArgs for (A, B, C, D) where
    A: FromArgs,
    B: FromArgs,
    C: FromArgs,
    D: FromArgs
[src]

impl<A, B, C, D, E> FromArgs for (A, B, C, D, E) where
    A: FromArgs,
    B: FromArgs,
    C: FromArgs,
    D: FromArgs,
    E: FromArgs
[src]

Loading content... +

Implementors

impl<T> FromArgs for OptionalArg<T> where
    T: TryFromObject
[src]

impl<T> FromArgs for Args<T> where
    T: TryFromObject
[src]

fn arity() -> RangeInclusive<usize>[src]

impl<T> FromArgs for KwArgs<T> where
    T: TryFromObject
[src]

fn arity() -> RangeInclusive<usize>[src]

impl<T> FromArgs for T where
    T: TryFromObject
[src]

Loading content...
\ No newline at end of file diff --git a/rustpython_vm/function/trait.IntoPyNativeFunc.html b/rustpython_vm/function/trait.IntoPyNativeFunc.html new file mode 100644 index 0000000..d4ba1ef --- /dev/null +++ b/rustpython_vm/function/trait.IntoPyNativeFunc.html @@ -0,0 +1,19 @@ +rustpython_vm::function::IntoPyNativeFunc - Rust

[][src]Trait rustpython_vm::function::IntoPyNativeFunc

pub trait IntoPyNativeFunc<T, R> {
+    fn into_func(self) -> PyNativeFunc;
+}

Implemented by types that are or can generate built-in functions.

+

For example, any function that:

+
    +
  • Accepts a sequence of types that implement FromArgs, followed by a +&VirtualMachine
  • +
  • Returns some type that implements IntoPyObject
  • +
+

will generate a PyNativeFunc that performs the appropriate type and arity +checking, any requested conversions, and then if successful call the function +with the bound values.

+

A bare PyNativeFunc also implements this trait, allowing the above to be +done manually, for rare situations that don't fit into this model.

+
+

Required methods

Loading content... +

Implementors

impl IntoPyNativeFunc<PyFuncArgs, Result<Rc<PyObject>, Rc<PyObject>>> for PyNativeFunc[src]

impl<F> IntoPyNativeFunc<PyFuncArgs, Result<Rc<PyObject>, Rc<PyObject>>> for F where
    F: Fn(&VirtualMachine, PyFuncArgs) -> PyResult + 'static, 
[src]

impl<F, A, B, C, D, E, R> IntoPyNativeFunc<(A, B, C, D, E), R> for F where
    F: Fn(A, B, C, D, E, &VirtualMachine) -> R + 'static,
    A: FromArgs,
    B: FromArgs,
    C: FromArgs,
    D: FromArgs,
    E: FromArgs,
    (A, B, C, D, E): FromArgs,
    R: IntoPyObject
[src]

impl<F, A, B, C, D, R> IntoPyNativeFunc<(A, B, C, D), R> for F where
    F: Fn(A, B, C, D, &VirtualMachine) -> R + 'static,
    A: FromArgs,
    B: FromArgs,
    C: FromArgs,
    D: FromArgs,
    (A, B, C, D): FromArgs,
    R: IntoPyObject
[src]

impl<F, A, B, C, R> IntoPyNativeFunc<(A, B, C), R> for F where
    F: Fn(A, B, C, &VirtualMachine) -> R + 'static,
    A: FromArgs,
    B: FromArgs,
    C: FromArgs,
    (A, B, C): FromArgs,
    R: IntoPyObject
[src]

impl<F, A, B, R> IntoPyNativeFunc<(A, B), R> for F where
    F: Fn(A, B, &VirtualMachine) -> R + 'static,
    A: FromArgs,
    B: FromArgs,
    (A, B): FromArgs,
    R: IntoPyObject
[src]

impl<F, A, R> IntoPyNativeFunc<(A,), R> for F where
    F: Fn(A, &VirtualMachine) -> R + 'static,
    A: FromArgs,
    (A,): FromArgs,
    R: IntoPyObject
[src]

impl<F, R> IntoPyNativeFunc<(), R> for F where
    F: Fn(&VirtualMachine) -> R + 'static,
    (): FromArgs,
    R: IntoPyObject
[src]

Loading content...
\ No newline at end of file diff --git a/rustpython_vm/function/type.PyNativeFunc.html b/rustpython_vm/function/type.PyNativeFunc.html new file mode 100644 index 0000000..6816d80 --- /dev/null +++ b/rustpython_vm/function/type.PyNativeFunc.html @@ -0,0 +1,2 @@ +rustpython_vm::function::PyNativeFunc - Rust

[][src]Type Definition rustpython_vm::function::PyNativeFunc

type PyNativeFunc = Box<dyn Fn(&VirtualMachine, PyFuncArgs) -> PyResult + 'static>;

A built-in Python function.

+

Trait Implementations

\ No newline at end of file diff --git a/rustpython_vm/import/fn.import_module.html b/rustpython_vm/import/fn.import_module.html index 10fd36b..9433795 100644 --- a/rustpython_vm/import/fn.import_module.html +++ b/rustpython_vm/import/fn.import_module.html @@ -1 +1 @@ -rustpython_vm::import::import_module - Rust

[][src]Function rustpython_vm::import::import_module

pub fn import_module(
    vm: &mut VirtualMachine,
    current_path: PathBuf,
    module_name: &str
) -> PyResult
\ No newline at end of file +rustpython_vm::import::import_module - Rust

[][src]Function rustpython_vm::import::import_module

pub fn import_module(
    vm: &VirtualMachine,
    current_path: PathBuf,
    module_name: &str
) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/import/index.html b/rustpython_vm/import/index.html index a3d00a2..1ed4d57 100644 --- a/rustpython_vm/import/index.html +++ b/rustpython_vm/import/index.html @@ -1,2 +1,2 @@ -rustpython_vm::import - Rust

[][src]Module rustpython_vm::import

Functions

-
import
import_module
\ No newline at end of file +rustpython_vm::import - Rust

[][src]Module rustpython_vm::import

Functions

+
import_module
\ No newline at end of file diff --git a/rustpython_vm/import/sidebar-items.js b/rustpython_vm/import/sidebar-items.js index 4ec07ea..ef150d4 100644 --- a/rustpython_vm/import/sidebar-items.js +++ b/rustpython_vm/import/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["import",""],["import_module",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["import_module",""]]}); \ No newline at end of file diff --git a/rustpython_vm/index.html b/rustpython_vm/index.html index cbc170a..755ce77 100644 --- a/rustpython_vm/index.html +++ b/rustpython_vm/index.html @@ -1,4 +1,4 @@ -rustpython_vm - Rust

[][src]Crate rustpython_vm

This crate contains most python logic.

+rustpython_vm - Rust

[][src]Crate rustpython_vm

This crate contains most python logic.

\ No newline at end of file +
print_exception
\ No newline at end of file diff --git a/rustpython_vm/macro.arg_check.html b/rustpython_vm/macro.arg_check.html index 6b7cdb8..8b1f092 100644 --- a/rustpython_vm/macro.arg_check.html +++ b/rustpython_vm/macro.arg_check.html @@ -1,7 +1,7 @@ -rustpython_vm::arg_check - Rust

[][src]Macro rustpython_vm::arg_check

+rustpython_vm::arg_check - Rust

[][src]Macro rustpython_vm::arg_check

 macro_rules! arg_check {
     ( $vm: ident, $args:ident ) => { ... };
     ( $vm: ident, $args:ident, required=[$( ($arg_name:ident, $arg_type:expr) ),*] ) => { ... };
     ( $vm: ident, $args:ident, required=[$( ($arg_name:ident, $arg_type:expr) ),*], optional=[$( ($optional_arg_name:ident, $optional_arg_type:expr) ),*] ) => { ... };
 }
-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/macro.count_tts.html b/rustpython_vm/macro.count_tts.html index 3dde311..0fe7452 100644 --- a/rustpython_vm/macro.count_tts.html +++ b/rustpython_vm/macro.count_tts.html @@ -1,5 +1,5 @@ -rustpython_vm::count_tts - Rust

[][src]Macro rustpython_vm::count_tts

+rustpython_vm::count_tts - Rust

[][src]Macro rustpython_vm::count_tts

 macro_rules! count_tts {
     ($($tts:tt)*) => { ... };
 }
-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/macro.extend_class!.html b/rustpython_vm/macro.extend_class!.html new file mode 100644 index 0000000..45c47b8 --- /dev/null +++ b/rustpython_vm/macro.extend_class!.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to macro.extend_class.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/macro.extend_class.html b/rustpython_vm/macro.extend_class.html new file mode 100644 index 0000000..320a4f8 --- /dev/null +++ b/rustpython_vm/macro.extend_class.html @@ -0,0 +1,5 @@ +rustpython_vm::extend_class - Rust

[][src]Macro rustpython_vm::extend_class

+macro_rules! extend_class {
+    ( $ctx:expr, $class:expr, { $($name:expr => $value:expr),* $(,)* }) => { ... };
+}
+
\ No newline at end of file diff --git a/rustpython_vm/macro.no_kwargs.html b/rustpython_vm/macro.no_kwargs.html index 3555185..6b7dafc 100644 --- a/rustpython_vm/macro.no_kwargs.html +++ b/rustpython_vm/macro.no_kwargs.html @@ -1,5 +1,5 @@ -rustpython_vm::no_kwargs - Rust

[][src]Macro rustpython_vm::no_kwargs

+rustpython_vm::no_kwargs - Rust

[][src]Macro rustpython_vm::no_kwargs

 macro_rules! no_kwargs {
     ( $vm: ident, $args:ident ) => { ... };
 }
-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/macro.py_class!.html b/rustpython_vm/macro.py_class!.html new file mode 100644 index 0000000..001b820 --- /dev/null +++ b/rustpython_vm/macro.py_class!.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to macro.py_class.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/macro.py_class.html b/rustpython_vm/macro.py_class.html new file mode 100644 index 0000000..feec53d --- /dev/null +++ b/rustpython_vm/macro.py_class.html @@ -0,0 +1,5 @@ +rustpython_vm::py_class - Rust

[][src]Macro rustpython_vm::py_class

+macro_rules! py_class {
+    ( $ctx:expr, $class_name:expr, $class_base:expr, { $($name:expr => $value:expr),* $(,)* }) => { ... };
+}
+
\ No newline at end of file diff --git a/rustpython_vm/macro.py_module!.html b/rustpython_vm/macro.py_module!.html new file mode 100644 index 0000000..b4477c4 --- /dev/null +++ b/rustpython_vm/macro.py_module!.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to macro.py_module.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/macro.py_module.html b/rustpython_vm/macro.py_module.html new file mode 100644 index 0000000..5981b61 --- /dev/null +++ b/rustpython_vm/macro.py_module.html @@ -0,0 +1,5 @@ +rustpython_vm::py_module - Rust

[][src]Macro rustpython_vm::py_module

+macro_rules! py_module {
+    ( $ctx:expr, $module_name:expr, { $($name:expr => $value:expr),* $(,)* }) => { ... };
+}
+
\ No newline at end of file diff --git a/rustpython_vm/macro.replace_expr.html b/rustpython_vm/macro.replace_expr.html index c64800d..e2ed0a2 100644 --- a/rustpython_vm/macro.replace_expr.html +++ b/rustpython_vm/macro.replace_expr.html @@ -1,5 +1,5 @@ -rustpython_vm::replace_expr - Rust

[][src]Macro rustpython_vm::replace_expr

+rustpython_vm::replace_expr - Rust

[][src]Macro rustpython_vm::replace_expr

 macro_rules! replace_expr {
     ($_t:tt $sub:expr) => { ... };
 }
-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/macro.type_check.html b/rustpython_vm/macro.type_check.html index af0c281..0c45069 100644 --- a/rustpython_vm/macro.type_check.html +++ b/rustpython_vm/macro.type_check.html @@ -1,5 +1,5 @@ -rustpython_vm::type_check - Rust

[][src]Macro rustpython_vm::type_check

+rustpython_vm::type_check - Rust

[][src]Macro rustpython_vm::type_check

 macro_rules! type_check {
     ($vm:ident, $args:ident, $arg_count:ident, $arg_name:ident, $arg_type:expr) => { ... };
 }
-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/macros/index.html b/rustpython_vm/macros/index.html index 74ba7e0..0291a06 100644 --- a/rustpython_vm/macros/index.html +++ b/rustpython_vm/macros/index.html @@ -1 +1 @@ -rustpython_vm::macros - Rust

[][src]Module rustpython_vm::macros

\ No newline at end of file +rustpython_vm::macros - Rust

[][src]Module rustpython_vm::macros

\ No newline at end of file diff --git a/rustpython_vm/obj/index.html b/rustpython_vm/obj/index.html index 0c97973..2e6dc3b 100644 --- a/rustpython_vm/obj/index.html +++ b/rustpython_vm/obj/index.html @@ -1,8 +1,8 @@ -rustpython_vm::obj - Rust

[][src]Module rustpython_vm::obj

This package contains the python basic/builtin types

+rustpython_vm::obj - Rust

[][src]Module rustpython_vm::obj

This package contains the python basic/builtin types

Modules

-
objbool
objbytearray

Implementation of the python bytearray object.

-
objbytes
objcode

Infamous code object. The python class code

-
objcomplex
objdict
objenumerate
objfilter
objfloat
objframe

The python frame type.

-
objfunction
objgenerator
objint
objiter
objlist
objmap
objmemory
objnone
objobject
objproperty

Python property descriptor class.

-
objrange
objsequence
objset
objslice
objstr
objsuper

Python super class.

-
objtuple
objtype
objzip
\ No newline at end of file +
objbool
objbuiltinfunc
objbytearray

Implementation of the python bytearray object.

+
objbytes
objclassmethod
objcode

Infamous code object. The python class code

+
objcomplex
objdict
objellipsis
objenumerate
objfilter
objfloat
objframe

The python frame type.

+
objfunction
objgenerator
objint
objiter
objlist
objmap
objmemory
objmodule
objnone
objobject
objproperty

Python property descriptor class.

+
objrange
objsequence
objset
objslice
objstaticmethod
objstr
objsuper

Python super class.

+
objtuple
objtype
objweakref
objzip
\ No newline at end of file diff --git a/rustpython_vm/obj/objbool/fn.boolval.html b/rustpython_vm/obj/objbool/fn.boolval.html index 7bf202e..d9335f0 100644 --- a/rustpython_vm/obj/objbool/fn.boolval.html +++ b/rustpython_vm/obj/objbool/fn.boolval.html @@ -1 +1 @@ -rustpython_vm::obj::objbool::boolval - Rust

[][src]Function rustpython_vm::obj::objbool::boolval

pub fn boolval(
    vm: &mut VirtualMachine,
    obj: PyObjectRef
) -> Result<bool, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objbool::boolval - Rust

[][src]Function rustpython_vm::obj::objbool::boolval

pub fn boolval(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<bool>
\ No newline at end of file diff --git a/rustpython_vm/obj/objbool/fn.get_value.html b/rustpython_vm/obj/objbool/fn.get_value.html index cb3031a..8246539 100644 --- a/rustpython_vm/obj/objbool/fn.get_value.html +++ b/rustpython_vm/obj/objbool/fn.get_value.html @@ -1 +1 @@ -rustpython_vm::obj::objbool::get_value - Rust

[][src]Function rustpython_vm::obj::objbool::get_value

pub fn get_value(obj: &PyObjectRef) -> bool
\ No newline at end of file +rustpython_vm::obj::objbool::get_value - Rust

[][src]Function rustpython_vm::obj::objbool::get_value

pub fn get_value(obj: &PyObjectRef) -> bool
\ No newline at end of file diff --git a/rustpython_vm/obj/objbool/fn.init.html b/rustpython_vm/obj/objbool/fn.init.html index 8a3f86a..dbd5cae 100644 --- a/rustpython_vm/obj/objbool/fn.init.html +++ b/rustpython_vm/obj/objbool/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objbool::init - Rust

[][src]Function rustpython_vm::obj::objbool::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objbool::init - Rust

[][src]Function rustpython_vm::obj::objbool::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objbool/fn.not.html b/rustpython_vm/obj/objbool/fn.not.html index fe57696..92926d7 100644 --- a/rustpython_vm/obj/objbool/fn.not.html +++ b/rustpython_vm/obj/objbool/fn.not.html @@ -1 +1 @@ -rustpython_vm::obj::objbool::not - Rust

[][src]Function rustpython_vm::obj::objbool::not

pub fn not(vm: &mut VirtualMachine, obj: &PyObjectRef) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objbool::not - Rust

[][src]Function rustpython_vm::obj::objbool::not

pub fn not(vm: &VirtualMachine, obj: &PyObjectRef) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objbool/index.html b/rustpython_vm/obj/objbool/index.html index 208e4fe..4be17ca 100644 --- a/rustpython_vm/obj/objbool/index.html +++ b/rustpython_vm/obj/objbool/index.html @@ -1,2 +1,2 @@ -rustpython_vm::obj::objbool - Rust

[][src]Module rustpython_vm::obj::objbool

Functions

-
boolval
get_value
init
not
\ No newline at end of file +rustpython_vm::obj::objbool - Rust

[][src]Module rustpython_vm::obj::objbool

Functions

+
boolval
get_value
init
not
\ No newline at end of file diff --git a/rustpython_vm/obj/objbuiltinfunc/PyBuiltinFunction.t.html b/rustpython_vm/obj/objbuiltinfunc/PyBuiltinFunction.t.html new file mode 100644 index 0000000..f0a5462 --- /dev/null +++ b/rustpython_vm/obj/objbuiltinfunc/PyBuiltinFunction.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyBuiltinFunction.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objbuiltinfunc/index.html b/rustpython_vm/obj/objbuiltinfunc/index.html new file mode 100644 index 0000000..fcc8806 --- /dev/null +++ b/rustpython_vm/obj/objbuiltinfunc/index.html @@ -0,0 +1,2 @@ +rustpython_vm::obj::objbuiltinfunc - Rust

[][src]Module rustpython_vm::obj::objbuiltinfunc

Structs

+
PyBuiltinFunction
\ No newline at end of file diff --git a/rustpython_vm/obj/objbuiltinfunc/sidebar-items.js b/rustpython_vm/obj/objbuiltinfunc/sidebar-items.js new file mode 100644 index 0000000..660f491 --- /dev/null +++ b/rustpython_vm/obj/objbuiltinfunc/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"struct":[["PyBuiltinFunction",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objbuiltinfunc/struct.PyBuiltinFunction.html b/rustpython_vm/obj/objbuiltinfunc/struct.PyBuiltinFunction.html new file mode 100644 index 0000000..8c781f4 --- /dev/null +++ b/rustpython_vm/obj/objbuiltinfunc/struct.PyBuiltinFunction.html @@ -0,0 +1,15 @@ +rustpython_vm::obj::objbuiltinfunc::PyBuiltinFunction - Rust

[][src]Struct rustpython_vm::obj::objbuiltinfunc::PyBuiltinFunction

pub struct PyBuiltinFunction {
+    pub value: PyNativeFunc,
+}

+ Fields

value: PyNativeFunc

Methods

impl PyBuiltinFunction[src]

pub fn new(value: PyNativeFunc) -> Self[src]

Trait Implementations

impl PyValue for PyBuiltinFunction[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyBuiltinFunction[src]

Auto Trait Implementations

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objbytearray/PyByteArray.t.html b/rustpython_vm/obj/objbytearray/PyByteArray.t.html new file mode 100644 index 0000000..305b263 --- /dev/null +++ b/rustpython_vm/obj/objbytearray/PyByteArray.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyByteArray.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objbytearray/fn.get_mut_value.html b/rustpython_vm/obj/objbytearray/fn.get_mut_value.html new file mode 100644 index 0000000..9dbefd4 --- /dev/null +++ b/rustpython_vm/obj/objbytearray/fn.get_mut_value.html @@ -0,0 +1 @@ +rustpython_vm::obj::objbytearray::get_mut_value - Rust

[][src]Function rustpython_vm::obj::objbytearray::get_mut_value

pub fn get_mut_value<'a>(
    obj: &'a PyObjectRef
) -> impl DerefMut<Target = Vec<u8>> + 'a
\ No newline at end of file diff --git a/rustpython_vm/obj/objbytearray/fn.get_value.html b/rustpython_vm/obj/objbytearray/fn.get_value.html new file mode 100644 index 0000000..2d7de32 --- /dev/null +++ b/rustpython_vm/obj/objbytearray/fn.get_value.html @@ -0,0 +1 @@ +rustpython_vm::obj::objbytearray::get_value - Rust

[][src]Function rustpython_vm::obj::objbytearray::get_value

pub fn get_value<'a>(
    obj: &'a PyObjectRef
) -> impl Deref<Target = Vec<u8>> + 'a
\ No newline at end of file diff --git a/rustpython_vm/obj/objbytearray/fn.init.html b/rustpython_vm/obj/objbytearray/fn.init.html index 7cbf0bb..d7d1716 100644 --- a/rustpython_vm/obj/objbytearray/fn.init.html +++ b/rustpython_vm/obj/objbytearray/fn.init.html @@ -1,2 +1,2 @@ -rustpython_vm::obj::objbytearray::init - Rust

[][src]Function rustpython_vm::obj::objbytearray::init

pub fn init(context: &PyContext)

Fill bytearray class methods dictionary.

-
\ No newline at end of file +rustpython_vm::obj::objbytearray::init - Rust

[][src]Function rustpython_vm::obj::objbytearray::init

pub fn init(context: &PyContext)

Fill bytearray class methods dictionary.

+
\ No newline at end of file diff --git a/rustpython_vm/obj/objbytearray/get_mut_value.v.html b/rustpython_vm/obj/objbytearray/get_mut_value.v.html new file mode 100644 index 0000000..dcb97cf --- /dev/null +++ b/rustpython_vm/obj/objbytearray/get_mut_value.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.get_mut_value.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objbytearray/get_value.v.html b/rustpython_vm/obj/objbytearray/get_value.v.html new file mode 100644 index 0000000..61d8a8b --- /dev/null +++ b/rustpython_vm/obj/objbytearray/get_value.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.get_value.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objbytearray/index.html b/rustpython_vm/obj/objbytearray/index.html index 0212558..9b659f2 100644 --- a/rustpython_vm/obj/objbytearray/index.html +++ b/rustpython_vm/obj/objbytearray/index.html @@ -1,4 +1,5 @@ -rustpython_vm::obj::objbytearray - Rust

[][src]Module rustpython_vm::obj::objbytearray

Implementation of the python bytearray object.

-

Functions

-
init

Fill bytearray class methods dictionary.

-
\ No newline at end of file +rustpython_vm::obj::objbytearray - Rust

[][src]Module rustpython_vm::obj::objbytearray

Implementation of the python bytearray object.

+

Structs

+
PyByteArray

Functions

+
get_mut_value
get_value
init

Fill bytearray class methods dictionary.

+
\ No newline at end of file diff --git a/rustpython_vm/obj/objbytearray/sidebar-items.js b/rustpython_vm/obj/objbytearray/sidebar-items.js index f411271..717722b 100644 --- a/rustpython_vm/obj/objbytearray/sidebar-items.js +++ b/rustpython_vm/obj/objbytearray/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init","Fill bytearray class methods dictionary."]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_mut_value",""],["get_value",""],["init","Fill bytearray class methods dictionary."]],"struct":[["PyByteArray",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objbytearray/struct.PyByteArray.html b/rustpython_vm/obj/objbytearray/struct.PyByteArray.html new file mode 100644 index 0000000..2074766 --- /dev/null +++ b/rustpython_vm/obj/objbytearray/struct.PyByteArray.html @@ -0,0 +1,15 @@ +rustpython_vm::obj::objbytearray::PyByteArray - Rust

[][src]Struct rustpython_vm::obj::objbytearray::PyByteArray

pub struct PyByteArray {
+    pub value: RefCell<Vec<u8>>,
+}

+ Fields

value: RefCell<Vec<u8>>

Methods

impl PyByteArray[src]

pub fn new(data: Vec<u8>) -> Self[src]

Trait Implementations

impl PyValue for PyByteArray[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyByteArray[src]

Auto Trait Implementations

impl Send for PyByteArray

impl !Sync for PyByteArray

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objbytes/PyBytes.t.html b/rustpython_vm/obj/objbytes/PyBytes.t.html new file mode 100644 index 0000000..238868d --- /dev/null +++ b/rustpython_vm/obj/objbytes/PyBytes.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyBytes.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objbytes/fn.get_value.html b/rustpython_vm/obj/objbytes/fn.get_value.html index efd3ce2..d327267 100644 --- a/rustpython_vm/obj/objbytes/fn.get_value.html +++ b/rustpython_vm/obj/objbytes/fn.get_value.html @@ -1 +1 @@ -rustpython_vm::obj::objbytes::get_value - Rust

[][src]Function rustpython_vm::obj::objbytes::get_value

pub fn get_value<'a>(
    obj: &'a PyObjectRef
) -> impl Deref<Target = Vec<u8>> + 'a
\ No newline at end of file +rustpython_vm::obj::objbytes::get_value - Rust

[][src]Function rustpython_vm::obj::objbytes::get_value

pub fn get_value<'a>(
    obj: &'a PyObjectRef
) -> impl Deref<Target = Vec<u8>> + 'a
\ No newline at end of file diff --git a/rustpython_vm/obj/objbytes/fn.init.html b/rustpython_vm/obj/objbytes/fn.init.html index dbd415a..80fb64f 100644 --- a/rustpython_vm/obj/objbytes/fn.init.html +++ b/rustpython_vm/obj/objbytes/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objbytes::init - Rust

[][src]Function rustpython_vm::obj::objbytes::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objbytes::init - Rust

[][src]Function rustpython_vm::obj::objbytes::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objbytes/index.html b/rustpython_vm/obj/objbytes/index.html index 9466173..87eb319 100644 --- a/rustpython_vm/obj/objbytes/index.html +++ b/rustpython_vm/obj/objbytes/index.html @@ -1,2 +1,3 @@ -rustpython_vm::obj::objbytes - Rust

[][src]Module rustpython_vm::obj::objbytes

Functions

-
get_mut_value
get_value
init
\ No newline at end of file +rustpython_vm::obj::objbytes - Rust

[][src]Module rustpython_vm::obj::objbytes

Structs

+
PyBytes

Functions

+
get_value
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objbytes/sidebar-items.js b/rustpython_vm/obj/objbytes/sidebar-items.js index edee562..d853200 100644 --- a/rustpython_vm/obj/objbytes/sidebar-items.js +++ b/rustpython_vm/obj/objbytes/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["get_mut_value",""],["get_value",""],["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_value",""],["init",""]],"struct":[["PyBytes",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objbytes/struct.PyBytes.html b/rustpython_vm/obj/objbytes/struct.PyBytes.html new file mode 100644 index 0000000..15b9e2a --- /dev/null +++ b/rustpython_vm/obj/objbytes/struct.PyBytes.html @@ -0,0 +1,14 @@ +rustpython_vm::obj::objbytes::PyBytes - Rust

[][src]Struct rustpython_vm::obj::objbytes::PyBytes

pub struct PyBytes { /* fields omitted */ }

Methods

impl PyBytes[src]

pub fn new(data: Vec<u8>) -> Self[src]

Trait Implementations

impl PyValue for PyBytes[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyBytes[src]

impl Deref for PyBytes[src]

type Target = [u8]

The resulting type after dereferencing.

+

Auto Trait Implementations

impl Send for PyBytes

impl Sync for PyBytes

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objclassmethod/PyClassMethod.t.html b/rustpython_vm/obj/objclassmethod/PyClassMethod.t.html new file mode 100644 index 0000000..fdbe37f --- /dev/null +++ b/rustpython_vm/obj/objclassmethod/PyClassMethod.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyClassMethod.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objclassmethod/PyClassMethodRef.t.html b/rustpython_vm/obj/objclassmethod/PyClassMethodRef.t.html new file mode 100644 index 0000000..c95c95c --- /dev/null +++ b/rustpython_vm/obj/objclassmethod/PyClassMethodRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyClassMethodRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objclassmethod/fn.init.html b/rustpython_vm/obj/objclassmethod/fn.init.html new file mode 100644 index 0000000..a720b4d --- /dev/null +++ b/rustpython_vm/obj/objclassmethod/fn.init.html @@ -0,0 +1 @@ +rustpython_vm::obj::objclassmethod::init - Rust

[][src]Function rustpython_vm::obj::objclassmethod::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objclassmethod/index.html b/rustpython_vm/obj/objclassmethod/index.html new file mode 100644 index 0000000..b0406a3 --- /dev/null +++ b/rustpython_vm/obj/objclassmethod/index.html @@ -0,0 +1,4 @@ +rustpython_vm::obj::objclassmethod - Rust

[][src]Module rustpython_vm::obj::objclassmethod

Structs

+
PyClassMethod

Functions

+
init

Type Definitions

+
PyClassMethodRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objclassmethod/init.v.html b/rustpython_vm/obj/objclassmethod/init.v.html new file mode 100644 index 0000000..3be617d --- /dev/null +++ b/rustpython_vm/obj/objclassmethod/init.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.init.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objclassmethod/sidebar-items.js b/rustpython_vm/obj/objclassmethod/sidebar-items.js new file mode 100644 index 0000000..48a051e --- /dev/null +++ b/rustpython_vm/obj/objclassmethod/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"fn":[["init",""]],"struct":[["PyClassMethod",""]],"type":[["PyClassMethodRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objclassmethod/struct.PyClassMethod.html b/rustpython_vm/obj/objclassmethod/struct.PyClassMethod.html new file mode 100644 index 0000000..8061e09 --- /dev/null +++ b/rustpython_vm/obj/objclassmethod/struct.PyClassMethod.html @@ -0,0 +1,20 @@ +rustpython_vm::obj::objclassmethod::PyClassMethod - Rust

[][src]Struct rustpython_vm::obj::objclassmethod::PyClassMethod

pub struct PyClassMethod {
+    pub callable: PyObjectRef,
+}

+ Fields

callable: PyObjectRef

Trait Implementations

impl PyValue for PyClassMethod[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Clone for PyClassMethod[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Debug for PyClassMethod[src]

Auto Trait Implementations

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objclassmethod/type.PyClassMethodRef.html b/rustpython_vm/obj/objclassmethod/type.PyClassMethodRef.html new file mode 100644 index 0000000..aae248d --- /dev/null +++ b/rustpython_vm/obj/objclassmethod/type.PyClassMethodRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objclassmethod::PyClassMethodRef - Rust

[][src]Type Definition rustpython_vm::obj::objclassmethod::PyClassMethodRef

type PyClassMethodRef = PyRef<PyClassMethod>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objcode/PyCode.t.html b/rustpython_vm/obj/objcode/PyCode.t.html new file mode 100644 index 0000000..763aa34 --- /dev/null +++ b/rustpython_vm/obj/objcode/PyCode.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyCode.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objcode/fn.get_value.html b/rustpython_vm/obj/objcode/fn.get_value.html index bf799c8..5981c16 100644 --- a/rustpython_vm/obj/objcode/fn.get_value.html +++ b/rustpython_vm/obj/objcode/fn.get_value.html @@ -1 +1 @@ -rustpython_vm::obj::objcode::get_value - Rust

[][src]Function rustpython_vm::obj::objcode::get_value

pub fn get_value(obj: &PyObjectRef) -> CodeObject
\ No newline at end of file +rustpython_vm::obj::objcode::get_value - Rust

[][src]Function rustpython_vm::obj::objcode::get_value

pub fn get_value(obj: &PyObjectRef) -> CodeObject
\ No newline at end of file diff --git a/rustpython_vm/obj/objcode/fn.init.html b/rustpython_vm/obj/objcode/fn.init.html index 1e00245..be81040 100644 --- a/rustpython_vm/obj/objcode/fn.init.html +++ b/rustpython_vm/obj/objcode/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objcode::init - Rust

[][src]Function rustpython_vm::obj::objcode::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objcode::init - Rust

[][src]Function rustpython_vm::obj::objcode::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objcode/index.html b/rustpython_vm/obj/objcode/index.html index 40ad61d..028515a 100644 --- a/rustpython_vm/obj/objcode/index.html +++ b/rustpython_vm/obj/objcode/index.html @@ -1,3 +1,4 @@ -rustpython_vm::obj::objcode - Rust

[][src]Module rustpython_vm::obj::objcode

Infamous code object. The python class code

-

Functions

-
get_value
init
\ No newline at end of file +rustpython_vm::obj::objcode - Rust

[][src]Module rustpython_vm::obj::objcode

Infamous code object. The python class code

+

Structs

+
PyCode

Functions

+
get_value
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objcode/sidebar-items.js b/rustpython_vm/obj/objcode/sidebar-items.js index 860f5c7..46c24a7 100644 --- a/rustpython_vm/obj/objcode/sidebar-items.js +++ b/rustpython_vm/obj/objcode/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["get_value",""],["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_value",""],["init",""]],"struct":[["PyCode",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objcode/struct.PyCode.html b/rustpython_vm/obj/objcode/struct.PyCode.html new file mode 100644 index 0000000..672ddfa --- /dev/null +++ b/rustpython_vm/obj/objcode/struct.PyCode.html @@ -0,0 +1,12 @@ +rustpython_vm::obj::objcode::PyCode - Rust

[][src]Struct rustpython_vm::obj::objcode::PyCode

pub struct PyCode { /* fields omitted */ }

Methods

impl PyCode[src]

pub fn new(code: CodeObject) -> PyCode[src]

Trait Implementations

impl PyValue for PyCode[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyCode[src]

Auto Trait Implementations

impl Send for PyCode

impl Sync for PyCode

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objcomplex/PyComplex.t.html b/rustpython_vm/obj/objcomplex/PyComplex.t.html new file mode 100644 index 0000000..c032a40 --- /dev/null +++ b/rustpython_vm/obj/objcomplex/PyComplex.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyComplex.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objcomplex/fn.get_value.html b/rustpython_vm/obj/objcomplex/fn.get_value.html index 92728f9..65047d3 100644 --- a/rustpython_vm/obj/objcomplex/fn.get_value.html +++ b/rustpython_vm/obj/objcomplex/fn.get_value.html @@ -1 +1 @@ -rustpython_vm::obj::objcomplex::get_value - Rust

[][src]Function rustpython_vm::obj::objcomplex::get_value

pub fn get_value(obj: &PyObjectRef) -> Complex64
\ No newline at end of file +rustpython_vm::obj::objcomplex::get_value - Rust

[][src]Function rustpython_vm::obj::objcomplex::get_value

pub fn get_value(obj: &PyObjectRef) -> Complex64
\ No newline at end of file diff --git a/rustpython_vm/obj/objcomplex/fn.init.html b/rustpython_vm/obj/objcomplex/fn.init.html index f09d70f..069dc29 100644 --- a/rustpython_vm/obj/objcomplex/fn.init.html +++ b/rustpython_vm/obj/objcomplex/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objcomplex::init - Rust

[][src]Function rustpython_vm::obj::objcomplex::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objcomplex::init - Rust

[][src]Function rustpython_vm::obj::objcomplex::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objcomplex/index.html b/rustpython_vm/obj/objcomplex/index.html index 915e190..95d89c7 100644 --- a/rustpython_vm/obj/objcomplex/index.html +++ b/rustpython_vm/obj/objcomplex/index.html @@ -1,2 +1,3 @@ -rustpython_vm::obj::objcomplex - Rust

[][src]Module rustpython_vm::obj::objcomplex

Functions

-
get_value
init
\ No newline at end of file +rustpython_vm::obj::objcomplex - Rust

[][src]Module rustpython_vm::obj::objcomplex

Structs

+
PyComplex

Functions

+
get_value
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objcomplex/sidebar-items.js b/rustpython_vm/obj/objcomplex/sidebar-items.js index 860f5c7..ee2cc08 100644 --- a/rustpython_vm/obj/objcomplex/sidebar-items.js +++ b/rustpython_vm/obj/objcomplex/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["get_value",""],["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_value",""],["init",""]],"struct":[["PyComplex",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objcomplex/struct.PyComplex.html b/rustpython_vm/obj/objcomplex/struct.PyComplex.html new file mode 100644 index 0000000..42f903b --- /dev/null +++ b/rustpython_vm/obj/objcomplex/struct.PyComplex.html @@ -0,0 +1,20 @@ +rustpython_vm::obj::objcomplex::PyComplex - Rust

[][src]Struct rustpython_vm::obj::objcomplex::PyComplex

pub struct PyComplex { /* fields omitted */ }

Trait Implementations

impl PyValue for PyComplex[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PartialEq<PyComplex> for PyComplex[src]

impl Clone for PyComplex[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl From<Complex<f64>> for PyComplex[src]

impl Copy for PyComplex[src]

impl Debug for PyComplex[src]

Auto Trait Implementations

impl Send for PyComplex

impl Sync for PyComplex

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/PyDict.t.html b/rustpython_vm/obj/objdict/PyDict.t.html new file mode 100644 index 0000000..1a39721 --- /dev/null +++ b/rustpython_vm/obj/objdict/PyDict.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyDict.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objdict/PyDictRef.t.html b/rustpython_vm/obj/objdict/PyDictRef.t.html new file mode 100644 index 0000000..4902599 --- /dev/null +++ b/rustpython_vm/obj/objdict/PyDictRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyDictRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.attributes_to_py_dict.html b/rustpython_vm/obj/objdict/fn.attributes_to_py_dict.html index 8f3dadd..ac3e266 100644 --- a/rustpython_vm/obj/objdict/fn.attributes_to_py_dict.html +++ b/rustpython_vm/obj/objdict/fn.attributes_to_py_dict.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::attributes_to_py_dict - Rust

[][src]Function rustpython_vm::obj::objdict::attributes_to_py_dict

pub fn attributes_to_py_dict(
    vm: &mut VirtualMachine,
    attributes: PyAttributes
) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objdict::attributes_to_py_dict - Rust

[][src]Function rustpython_vm::obj::objdict::attributes_to_py_dict

pub fn attributes_to_py_dict(
    vm: &VirtualMachine,
    attributes: PyAttributes
) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.contains_key_str.html b/rustpython_vm/obj/objdict/fn.contains_key_str.html index f7cce4e..7b19f40 100644 --- a/rustpython_vm/obj/objdict/fn.contains_key_str.html +++ b/rustpython_vm/obj/objdict/fn.contains_key_str.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::contains_key_str - Rust

[][src]Function rustpython_vm::obj::objdict::contains_key_str

pub fn contains_key_str(dict: &PyObjectRef, key: &str) -> bool
\ No newline at end of file +rustpython_vm::obj::objdict::contains_key_str - Rust

[][src]Function rustpython_vm::obj::objdict::contains_key_str

pub fn contains_key_str(dict: &PyObjectRef, key: &str) -> bool
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.content_contains_key_str.html b/rustpython_vm/obj/objdict/fn.content_contains_key_str.html index a5e8dd2..3adca41 100644 --- a/rustpython_vm/obj/objdict/fn.content_contains_key_str.html +++ b/rustpython_vm/obj/objdict/fn.content_contains_key_str.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::content_contains_key_str - Rust

[][src]Function rustpython_vm::obj::objdict::content_contains_key_str

pub fn content_contains_key_str(elements: &DictContentType, key: &str) -> bool
\ No newline at end of file +rustpython_vm::obj::objdict::content_contains_key_str - Rust

[][src]Function rustpython_vm::obj::objdict::content_contains_key_str

pub fn content_contains_key_str(elements: &DictContentType, key: &str) -> bool
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.content_get_key_str.html b/rustpython_vm/obj/objdict/fn.content_get_key_str.html index 7bc11ab..2fe76e8 100644 --- a/rustpython_vm/obj/objdict/fn.content_get_key_str.html +++ b/rustpython_vm/obj/objdict/fn.content_get_key_str.html @@ -1,2 +1,2 @@ -rustpython_vm::obj::objdict::content_get_key_str - Rust

[][src]Function rustpython_vm::obj::objdict::content_get_key_str

pub fn content_get_key_str(
    elements: &DictContentType,
    key: &str
) -> Option<PyObjectRef>

Retrieve a key from dict contents:

-
\ No newline at end of file +rustpython_vm::obj::objdict::content_get_key_str - Rust

[][src]Function rustpython_vm::obj::objdict::content_get_key_str

pub fn content_get_key_str(
    elements: &DictContentType,
    key: &str
) -> Option<PyObjectRef>

Retrieve a key from dict contents:

+
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.get_elements.html b/rustpython_vm/obj/objdict/fn.get_elements.html index 6ae89f4..7a0d87a 100644 --- a/rustpython_vm/obj/objdict/fn.get_elements.html +++ b/rustpython_vm/obj/objdict/fn.get_elements.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::get_elements - Rust

[][src]Function rustpython_vm::obj::objdict::get_elements

pub fn get_elements<'a>(
    obj: &'a PyObjectRef
) -> impl Deref<Target = DictContentType> + 'a
\ No newline at end of file +rustpython_vm::obj::objdict::get_elements - Rust

[][src]Function rustpython_vm::obj::objdict::get_elements

pub fn get_elements<'a>(
    obj: &'a PyObjectRef
) -> impl Deref<Target = DictContentType> + 'a
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.get_item.html b/rustpython_vm/obj/objdict/fn.get_item.html index 2f3f96e..6dbb0b2 100644 --- a/rustpython_vm/obj/objdict/fn.get_item.html +++ b/rustpython_vm/obj/objdict/fn.get_item.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::get_item - Rust

[][src]Function rustpython_vm::obj::objdict::get_item

pub fn get_item(dict: &PyObjectRef, key: &PyObjectRef) -> Option<PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objdict::get_item - Rust

[][src]Function rustpython_vm::obj::objdict::get_item

pub fn get_item(dict: &PyObjectRef, key: &PyObjectRef) -> Option<PyObjectRef>
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.get_key_str.html b/rustpython_vm/obj/objdict/fn.get_key_str.html index e5f4a5d..70a7014 100644 --- a/rustpython_vm/obj/objdict/fn.get_key_str.html +++ b/rustpython_vm/obj/objdict/fn.get_key_str.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::get_key_str - Rust

[][src]Function rustpython_vm::obj::objdict::get_key_str

pub fn get_key_str(dict: &PyObjectRef, key: &str) -> Option<PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objdict::get_key_str - Rust

[][src]Function rustpython_vm::obj::objdict::get_key_str

pub fn get_key_str(dict: &PyObjectRef, key: &str) -> Option<PyObjectRef>
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.get_key_value_pairs.html b/rustpython_vm/obj/objdict/fn.get_key_value_pairs.html index 1527efa..d3d956a 100644 --- a/rustpython_vm/obj/objdict/fn.get_key_value_pairs.html +++ b/rustpython_vm/obj/objdict/fn.get_key_value_pairs.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::get_key_value_pairs - Rust

[][src]Function rustpython_vm::obj::objdict::get_key_value_pairs

pub fn get_key_value_pairs(
    dict: &PyObjectRef
) -> Vec<(PyObjectRef, PyObjectRef)>
\ No newline at end of file +rustpython_vm::obj::objdict::get_key_value_pairs - Rust

[][src]Function rustpython_vm::obj::objdict::get_key_value_pairs

pub fn get_key_value_pairs(
    dict: &PyObjectRef
) -> Vec<(PyObjectRef, PyObjectRef)>
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.get_key_value_pairs_from_content.html b/rustpython_vm/obj/objdict/fn.get_key_value_pairs_from_content.html index f0eb874..d4eb469 100644 --- a/rustpython_vm/obj/objdict/fn.get_key_value_pairs_from_content.html +++ b/rustpython_vm/obj/objdict/fn.get_key_value_pairs_from_content.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::get_key_value_pairs_from_content - Rust

[][src]Function rustpython_vm::obj::objdict::get_key_value_pairs_from_content

pub fn get_key_value_pairs_from_content(
    dict_content: &DictContentType
) -> Vec<(PyObjectRef, PyObjectRef)>
\ No newline at end of file +rustpython_vm::obj::objdict::get_key_value_pairs_from_content - Rust

[][src]Function rustpython_vm::obj::objdict::get_key_value_pairs_from_content

pub fn get_key_value_pairs_from_content(
    dict_content: &DictContentType
) -> Vec<(PyObjectRef, PyObjectRef)>
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.get_mut_elements.html b/rustpython_vm/obj/objdict/fn.get_mut_elements.html new file mode 100644 index 0000000..920e453 --- /dev/null +++ b/rustpython_vm/obj/objdict/fn.get_mut_elements.html @@ -0,0 +1 @@ +rustpython_vm::obj::objdict::get_mut_elements - Rust

[][src]Function rustpython_vm::obj::objdict::get_mut_elements

pub fn get_mut_elements<'a>(
    obj: &'a PyObjectRef
) -> impl DerefMut<Target = DictContentType> + 'a
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.init.html b/rustpython_vm/obj/objdict/fn.init.html index 2c54564..e1bbbd7 100644 --- a/rustpython_vm/obj/objdict/fn.init.html +++ b/rustpython_vm/obj/objdict/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::init - Rust

[][src]Function rustpython_vm::obj::objdict::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objdict::init - Rust

[][src]Function rustpython_vm::obj::objdict::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.py_dict_to_attributes.html b/rustpython_vm/obj/objdict/fn.py_dict_to_attributes.html index 89e9263..f5d2edd 100644 --- a/rustpython_vm/obj/objdict/fn.py_dict_to_attributes.html +++ b/rustpython_vm/obj/objdict/fn.py_dict_to_attributes.html @@ -1,2 +1,2 @@ -rustpython_vm::obj::objdict::py_dict_to_attributes - Rust

[][src]Function rustpython_vm::obj::objdict::py_dict_to_attributes

pub fn py_dict_to_attributes(dict: &PyObjectRef) -> PyAttributes

Take a python dictionary and convert it to attributes.

-
\ No newline at end of file +rustpython_vm::obj::objdict::py_dict_to_attributes - Rust

[][src]Function rustpython_vm::obj::objdict::py_dict_to_attributes

pub fn py_dict_to_attributes(dict: &PyObjectRef) -> PyAttributes

Take a python dictionary and convert it to attributes.

+
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.set_item.html b/rustpython_vm/obj/objdict/fn.set_item.html index 226e285..b80e061 100644 --- a/rustpython_vm/obj/objdict/fn.set_item.html +++ b/rustpython_vm/obj/objdict/fn.set_item.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::set_item - Rust

[][src]Function rustpython_vm::obj::objdict::set_item

pub fn set_item(
    dict: &PyObjectRef,
    _vm: &mut VirtualMachine,
    needle: &PyObjectRef,
    value: &PyObjectRef
)
\ No newline at end of file +rustpython_vm::obj::objdict::set_item - Rust

[][src]Function rustpython_vm::obj::objdict::set_item

pub fn set_item(
    dict: &PyObjectRef,
    _vm: &VirtualMachine,
    needle: &PyObjectRef,
    value: &PyObjectRef
)
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/fn.set_item_in_content.html b/rustpython_vm/obj/objdict/fn.set_item_in_content.html index baf8679..a497bea 100644 --- a/rustpython_vm/obj/objdict/fn.set_item_in_content.html +++ b/rustpython_vm/obj/objdict/fn.set_item_in_content.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::set_item_in_content - Rust

[][src]Function rustpython_vm::obj::objdict::set_item_in_content

pub fn set_item_in_content(
    elements: &mut DictContentType,
    needle: &PyObjectRef,
    value: &PyObjectRef
)
\ No newline at end of file +rustpython_vm::obj::objdict::set_item_in_content - Rust

[][src]Function rustpython_vm::obj::objdict::set_item_in_content

pub fn set_item_in_content(
    elements: &mut DictContentType,
    needle: &PyObjectRef,
    value: &PyObjectRef
)
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/get_mut_elements.v.html b/rustpython_vm/obj/objdict/get_mut_elements.v.html new file mode 100644 index 0000000..70f715f --- /dev/null +++ b/rustpython_vm/obj/objdict/get_mut_elements.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.get_mut_elements.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objdict/index.html b/rustpython_vm/obj/objdict/index.html index 5470b24..424e4a7 100644 --- a/rustpython_vm/obj/objdict/index.html +++ b/rustpython_vm/obj/objdict/index.html @@ -1,5 +1,6 @@ -rustpython_vm::obj::objdict - Rust

[][src]Module rustpython_vm::obj::objdict

Functions

+rustpython_vm::obj::objdict - Rust

[][src]Module rustpython_vm::obj::objdict

Structs

+
PyDict

Functions

attributes_to_py_dict
contains_key_str
content_contains_key_str
content_get_key_str

Retrieve a key from dict contents:

-
create_type
dict_contains
get_elements
get_item
get_key_str
get_key_value_pairs
get_key_value_pairs_from_content
init
new
py_dict_to_attributes

Take a python dictionary and convert it to attributes.

+
get_elements
get_item
get_key_str
get_key_value_pairs
get_key_value_pairs_from_content
get_mut_elements
init
py_dict_to_attributes

Take a python dictionary and convert it to attributes.

set_item
set_item_in_content

Type Definitions

-
DictContentType
\ No newline at end of file +
DictContentType
PyDictRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/sidebar-items.js b/rustpython_vm/obj/objdict/sidebar-items.js index 466a9b4..d9c91e3 100644 --- a/rustpython_vm/obj/objdict/sidebar-items.js +++ b/rustpython_vm/obj/objdict/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["attributes_to_py_dict",""],["contains_key_str",""],["content_contains_key_str",""],["content_get_key_str","Retrieve a key from dict contents:"],["create_type",""],["dict_contains",""],["get_elements",""],["get_item",""],["get_key_str",""],["get_key_value_pairs",""],["get_key_value_pairs_from_content",""],["init",""],["new",""],["py_dict_to_attributes","Take a python dictionary and convert it to attributes."],["set_item",""],["set_item_in_content",""]],"type":[["DictContentType",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["attributes_to_py_dict",""],["contains_key_str",""],["content_contains_key_str",""],["content_get_key_str","Retrieve a key from dict contents:"],["get_elements",""],["get_item",""],["get_key_str",""],["get_key_value_pairs",""],["get_key_value_pairs_from_content",""],["get_mut_elements",""],["init",""],["py_dict_to_attributes","Take a python dictionary and convert it to attributes."],["set_item",""],["set_item_in_content",""]],"struct":[["PyDict",""]],"type":[["DictContentType",""],["PyDictRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objdict/struct.PyDict.html b/rustpython_vm/obj/objdict/struct.PyDict.html new file mode 100644 index 0000000..4e5335c --- /dev/null +++ b/rustpython_vm/obj/objdict/struct.PyDict.html @@ -0,0 +1,16 @@ +rustpython_vm::obj::objdict::PyDict - Rust

[][src]Struct rustpython_vm::obj::objdict::PyDict

pub struct PyDict {
+    pub entries: RefCell<DictContentType>,
+}

+ Fields

entries: RefCell<DictContentType>

Trait Implementations

impl PyValue for PyDict[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Default for PyDict[src]

impl Debug for PyDict[src]

Auto Trait Implementations

impl !Send for PyDict

impl !Sync for PyDict

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/type.DictContentType.html b/rustpython_vm/obj/objdict/type.DictContentType.html index 265e875..5be67d2 100644 --- a/rustpython_vm/obj/objdict/type.DictContentType.html +++ b/rustpython_vm/obj/objdict/type.DictContentType.html @@ -1 +1 @@ -rustpython_vm::obj::objdict::DictContentType - Rust

[][src]Type Definition rustpython_vm::obj::objdict::DictContentType

type DictContentType = HashMap<String, (PyObjectRef, PyObjectRef)>;
\ No newline at end of file +rustpython_vm::obj::objdict::DictContentType - Rust

[][src]Type Definition rustpython_vm::obj::objdict::DictContentType

type DictContentType = HashMap<String, (PyObjectRef, PyObjectRef)>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objdict/type.PyDictRef.html b/rustpython_vm/obj/objdict/type.PyDictRef.html new file mode 100644 index 0000000..8081214 --- /dev/null +++ b/rustpython_vm/obj/objdict/type.PyDictRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objdict::PyDictRef - Rust

[][src]Type Definition rustpython_vm::obj::objdict::PyDictRef

type PyDictRef = PyRef<PyDict>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objellipsis/fn.init.html b/rustpython_vm/obj/objellipsis/fn.init.html new file mode 100644 index 0000000..32aff64 --- /dev/null +++ b/rustpython_vm/obj/objellipsis/fn.init.html @@ -0,0 +1 @@ +rustpython_vm::obj::objellipsis::init - Rust

[][src]Function rustpython_vm::obj::objellipsis::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objellipsis/index.html b/rustpython_vm/obj/objellipsis/index.html new file mode 100644 index 0000000..1a5f84c --- /dev/null +++ b/rustpython_vm/obj/objellipsis/index.html @@ -0,0 +1,2 @@ +rustpython_vm::obj::objellipsis - Rust

[][src]Module rustpython_vm::obj::objellipsis

Functions

+
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objellipsis/init.v.html b/rustpython_vm/obj/objellipsis/init.v.html new file mode 100644 index 0000000..3be617d --- /dev/null +++ b/rustpython_vm/obj/objellipsis/init.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.init.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objellipsis/sidebar-items.js b/rustpython_vm/obj/objellipsis/sidebar-items.js new file mode 100644 index 0000000..7fc930a --- /dev/null +++ b/rustpython_vm/obj/objellipsis/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"fn":[["init",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objenumerate/PyEnumerate.t.html b/rustpython_vm/obj/objenumerate/PyEnumerate.t.html new file mode 100644 index 0000000..68fae6d --- /dev/null +++ b/rustpython_vm/obj/objenumerate/PyEnumerate.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyEnumerate.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objenumerate/fn.init.html b/rustpython_vm/obj/objenumerate/fn.init.html index 4c830d7..9269636 100644 --- a/rustpython_vm/obj/objenumerate/fn.init.html +++ b/rustpython_vm/obj/objenumerate/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objenumerate::init - Rust

[][src]Function rustpython_vm::obj::objenumerate::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objenumerate::init - Rust

[][src]Function rustpython_vm::obj::objenumerate::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objenumerate/index.html b/rustpython_vm/obj/objenumerate/index.html index da222da..76e4364 100644 --- a/rustpython_vm/obj/objenumerate/index.html +++ b/rustpython_vm/obj/objenumerate/index.html @@ -1,2 +1,3 @@ -rustpython_vm::obj::objenumerate - Rust

[][src]Module rustpython_vm::obj::objenumerate

Functions

-
init
\ No newline at end of file +rustpython_vm::obj::objenumerate - Rust

[][src]Module rustpython_vm::obj::objenumerate

Structs

+
PyEnumerate

Functions

+
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objenumerate/sidebar-items.js b/rustpython_vm/obj/objenumerate/sidebar-items.js index 7fc930a..a3dbc85 100644 --- a/rustpython_vm/obj/objenumerate/sidebar-items.js +++ b/rustpython_vm/obj/objenumerate/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PyEnumerate",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objenumerate/struct.PyEnumerate.html b/rustpython_vm/obj/objenumerate/struct.PyEnumerate.html new file mode 100644 index 0000000..e8e0f0e --- /dev/null +++ b/rustpython_vm/obj/objenumerate/struct.PyEnumerate.html @@ -0,0 +1,12 @@ +rustpython_vm::obj::objenumerate::PyEnumerate - Rust

[][src]Struct rustpython_vm::obj::objenumerate::PyEnumerate

pub struct PyEnumerate { /* fields omitted */ }

Trait Implementations

impl PyValue for PyEnumerate[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyEnumerate[src]

Auto Trait Implementations

impl !Send for PyEnumerate

impl !Sync for PyEnumerate

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objfilter/PyFilter.t.html b/rustpython_vm/obj/objfilter/PyFilter.t.html new file mode 100644 index 0000000..11fd982 --- /dev/null +++ b/rustpython_vm/obj/objfilter/PyFilter.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyFilter.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objfilter/fn.init.html b/rustpython_vm/obj/objfilter/fn.init.html index 54752a5..e2ec320 100644 --- a/rustpython_vm/obj/objfilter/fn.init.html +++ b/rustpython_vm/obj/objfilter/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objfilter::init - Rust

[][src]Function rustpython_vm::obj::objfilter::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objfilter::init - Rust

[][src]Function rustpython_vm::obj::objfilter::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objfilter/index.html b/rustpython_vm/obj/objfilter/index.html index 8772cb5..cf46ee5 100644 --- a/rustpython_vm/obj/objfilter/index.html +++ b/rustpython_vm/obj/objfilter/index.html @@ -1,2 +1,3 @@ -rustpython_vm::obj::objfilter - Rust

[][src]Module rustpython_vm::obj::objfilter

Functions

-
init
\ No newline at end of file +rustpython_vm::obj::objfilter - Rust

[][src]Module rustpython_vm::obj::objfilter

Structs

+
PyFilter

Functions

+
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objfilter/sidebar-items.js b/rustpython_vm/obj/objfilter/sidebar-items.js index 7fc930a..a71dcf7 100644 --- a/rustpython_vm/obj/objfilter/sidebar-items.js +++ b/rustpython_vm/obj/objfilter/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PyFilter",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objfilter/struct.PyFilter.html b/rustpython_vm/obj/objfilter/struct.PyFilter.html new file mode 100644 index 0000000..09bb432 --- /dev/null +++ b/rustpython_vm/obj/objfilter/struct.PyFilter.html @@ -0,0 +1,12 @@ +rustpython_vm::obj::objfilter::PyFilter - Rust

[][src]Struct rustpython_vm::obj::objfilter::PyFilter

pub struct PyFilter { /* fields omitted */ }

Trait Implementations

impl PyValue for PyFilter[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyFilter[src]

Auto Trait Implementations

impl !Send for PyFilter

impl !Sync for PyFilter

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objfloat/PyFloat.t.html b/rustpython_vm/obj/objfloat/PyFloat.t.html new file mode 100644 index 0000000..6a51788 --- /dev/null +++ b/rustpython_vm/obj/objfloat/PyFloat.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyFloat.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objfloat/PyFloatRef.t.html b/rustpython_vm/obj/objfloat/PyFloatRef.t.html new file mode 100644 index 0000000..3802dca --- /dev/null +++ b/rustpython_vm/obj/objfloat/PyFloatRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyFloatRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objfloat/fn.get_value.html b/rustpython_vm/obj/objfloat/fn.get_value.html index 1bb05f3..1f2c73a 100644 --- a/rustpython_vm/obj/objfloat/fn.get_value.html +++ b/rustpython_vm/obj/objfloat/fn.get_value.html @@ -1 +1 @@ -rustpython_vm::obj::objfloat::get_value - Rust

[][src]Function rustpython_vm::obj::objfloat::get_value

pub fn get_value(obj: &PyObjectRef) -> f64
\ No newline at end of file +rustpython_vm::obj::objfloat::get_value - Rust

[][src]Function rustpython_vm::obj::objfloat::get_value

pub fn get_value(obj: &PyObjectRef) -> f64
\ No newline at end of file diff --git a/rustpython_vm/obj/objfloat/fn.init.html b/rustpython_vm/obj/objfloat/fn.init.html index c3f0c0e..bd4e7cc 100644 --- a/rustpython_vm/obj/objfloat/fn.init.html +++ b/rustpython_vm/obj/objfloat/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objfloat::init - Rust

[][src]Function rustpython_vm::obj::objfloat::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objfloat::init - Rust

[][src]Function rustpython_vm::obj::objfloat::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objfloat/fn.make_float.html b/rustpython_vm/obj/objfloat/fn.make_float.html index 5de80fa..d242d98 100644 --- a/rustpython_vm/obj/objfloat/fn.make_float.html +++ b/rustpython_vm/obj/objfloat/fn.make_float.html @@ -1 +1 @@ -rustpython_vm::obj::objfloat::make_float - Rust

[][src]Function rustpython_vm::obj::objfloat::make_float

pub fn make_float(
    vm: &mut VirtualMachine,
    obj: &PyObjectRef
) -> Result<f64, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objfloat::make_float - Rust

[][src]Function rustpython_vm::obj::objfloat::make_float

pub fn make_float(vm: &VirtualMachine, obj: &PyObjectRef) -> PyResult<f64>
\ No newline at end of file diff --git a/rustpython_vm/obj/objfloat/index.html b/rustpython_vm/obj/objfloat/index.html index 15ea079..e30243a 100644 --- a/rustpython_vm/obj/objfloat/index.html +++ b/rustpython_vm/obj/objfloat/index.html @@ -1,2 +1,4 @@ -rustpython_vm::obj::objfloat - Rust

[][src]Module rustpython_vm::obj::objfloat

Functions

-
get_value
init
make_float
\ No newline at end of file +rustpython_vm::obj::objfloat - Rust

[][src]Module rustpython_vm::obj::objfloat

Structs

+
PyFloat

Functions

+
get_value
init
make_float

Type Definitions

+
PyFloatRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objfloat/sidebar-items.js b/rustpython_vm/obj/objfloat/sidebar-items.js index 2459ea7..7aaef6b 100644 --- a/rustpython_vm/obj/objfloat/sidebar-items.js +++ b/rustpython_vm/obj/objfloat/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["get_value",""],["init",""],["make_float",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_value",""],["init",""],["make_float",""]],"struct":[["PyFloat",""]],"type":[["PyFloatRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objfloat/struct.PyFloat.html b/rustpython_vm/obj/objfloat/struct.PyFloat.html new file mode 100644 index 0000000..1a8228a --- /dev/null +++ b/rustpython_vm/obj/objfloat/struct.PyFloat.html @@ -0,0 +1,20 @@ +rustpython_vm::obj::objfloat::PyFloat - Rust

[][src]Struct rustpython_vm::obj::objfloat::PyFloat

pub struct PyFloat { /* fields omitted */ }

Trait Implementations

impl PyValue for PyFloat[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PartialEq<PyFloat> for PyFloat[src]

impl Clone for PyFloat[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl From<f64> for PyFloat[src]

impl Copy for PyFloat[src]

impl Debug for PyFloat[src]

Auto Trait Implementations

impl Send for PyFloat

impl Sync for PyFloat

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objfloat/type.PyFloatRef.html b/rustpython_vm/obj/objfloat/type.PyFloatRef.html new file mode 100644 index 0000000..8e50020 --- /dev/null +++ b/rustpython_vm/obj/objfloat/type.PyFloatRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objfloat::PyFloatRef - Rust

[][src]Type Definition rustpython_vm::obj::objfloat::PyFloatRef

type PyFloatRef = PyRef<PyFloat>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objframe/fn.get_value.html b/rustpython_vm/obj/objframe/fn.get_value.html index 4e5e29b..683a585 100644 --- a/rustpython_vm/obj/objframe/fn.get_value.html +++ b/rustpython_vm/obj/objframe/fn.get_value.html @@ -1 +1 @@ -rustpython_vm::obj::objframe::get_value - Rust

[][src]Function rustpython_vm::obj::objframe::get_value

pub fn get_value(obj: &PyObjectRef) -> Frame
\ No newline at end of file +rustpython_vm::obj::objframe::get_value - Rust

[][src]Function rustpython_vm::obj::objframe::get_value

pub fn get_value(obj: &PyObjectRef) -> &Frame
\ No newline at end of file diff --git a/rustpython_vm/obj/objframe/fn.init.html b/rustpython_vm/obj/objframe/fn.init.html index f8f9d18..1b6f99d 100644 --- a/rustpython_vm/obj/objframe/fn.init.html +++ b/rustpython_vm/obj/objframe/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objframe::init - Rust

[][src]Function rustpython_vm::obj::objframe::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objframe::init - Rust

[][src]Function rustpython_vm::obj::objframe::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objframe/index.html b/rustpython_vm/obj/objframe/index.html index 273e34f..1851986 100644 --- a/rustpython_vm/obj/objframe/index.html +++ b/rustpython_vm/obj/objframe/index.html @@ -1,3 +1,3 @@ -rustpython_vm::obj::objframe - Rust

[][src]Module rustpython_vm::obj::objframe

The python frame type.

+rustpython_vm::obj::objframe - Rust

[][src]Module rustpython_vm::obj::objframe

The python frame type.

Functions

-
get_value
init
\ No newline at end of file +
get_value
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objfunction/PyFunction.t.html b/rustpython_vm/obj/objfunction/PyFunction.t.html new file mode 100644 index 0000000..15e7ae2 --- /dev/null +++ b/rustpython_vm/obj/objfunction/PyFunction.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyFunction.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objfunction/PyMethod.t.html b/rustpython_vm/obj/objfunction/PyMethod.t.html new file mode 100644 index 0000000..a31e879 --- /dev/null +++ b/rustpython_vm/obj/objfunction/PyMethod.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyMethod.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objfunction/fn.init.html b/rustpython_vm/obj/objfunction/fn.init.html index 86431c9..ac0e876 100644 --- a/rustpython_vm/obj/objfunction/fn.init.html +++ b/rustpython_vm/obj/objfunction/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objfunction::init - Rust

[][src]Function rustpython_vm::obj::objfunction::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objfunction::init - Rust

[][src]Function rustpython_vm::obj::objfunction::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objfunction/index.html b/rustpython_vm/obj/objfunction/index.html index c6900ca..6cd007b 100644 --- a/rustpython_vm/obj/objfunction/index.html +++ b/rustpython_vm/obj/objfunction/index.html @@ -1,2 +1,3 @@ -rustpython_vm::obj::objfunction - Rust

[][src]Module rustpython_vm::obj::objfunction

Functions

-
init
\ No newline at end of file +rustpython_vm::obj::objfunction - Rust

[][src]Module rustpython_vm::obj::objfunction

Structs

+
PyFunction
PyMethod

Functions

+
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objfunction/sidebar-items.js b/rustpython_vm/obj/objfunction/sidebar-items.js index 7fc930a..1fa1c3d 100644 --- a/rustpython_vm/obj/objfunction/sidebar-items.js +++ b/rustpython_vm/obj/objfunction/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PyFunction",""],["PyMethod",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objfunction/struct.PyFunction.html b/rustpython_vm/obj/objfunction/struct.PyFunction.html new file mode 100644 index 0000000..f3d988f --- /dev/null +++ b/rustpython_vm/obj/objfunction/struct.PyFunction.html @@ -0,0 +1,17 @@ +rustpython_vm::obj::objfunction::PyFunction - Rust

[][src]Struct rustpython_vm::obj::objfunction::PyFunction

pub struct PyFunction {
+    pub code: PyObjectRef,
+    pub scope: Scope,
+    pub defaults: PyObjectRef,
+}

+ Fields

code: PyObjectRefscope: Scopedefaults: PyObjectRef

Methods

impl PyFunction[src]

pub fn new(code: PyObjectRef, scope: Scope, defaults: PyObjectRef) -> Self[src]

Trait Implementations

impl PyValue for PyFunction[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyFunction[src]

Auto Trait Implementations

impl !Send for PyFunction

impl !Sync for PyFunction

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objfunction/struct.PyMethod.html b/rustpython_vm/obj/objfunction/struct.PyMethod.html new file mode 100644 index 0000000..7f8e84a --- /dev/null +++ b/rustpython_vm/obj/objfunction/struct.PyMethod.html @@ -0,0 +1,16 @@ +rustpython_vm::obj::objfunction::PyMethod - Rust

[][src]Struct rustpython_vm::obj::objfunction::PyMethod

pub struct PyMethod {
+    pub object: PyObjectRef,
+    pub function: PyObjectRef,
+}

+ Fields

object: PyObjectReffunction: PyObjectRef

Methods

impl PyMethod[src]

pub fn new(object: PyObjectRef, function: PyObjectRef) -> Self[src]

Trait Implementations

impl PyValue for PyMethod[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyMethod[src]

Auto Trait Implementations

impl !Send for PyMethod

impl !Sync for PyMethod

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objgenerator/PyGenerator.t.html b/rustpython_vm/obj/objgenerator/PyGenerator.t.html new file mode 100644 index 0000000..e9dbe27 --- /dev/null +++ b/rustpython_vm/obj/objgenerator/PyGenerator.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyGenerator.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objgenerator/fn.init.html b/rustpython_vm/obj/objgenerator/fn.init.html index 4733915..2b7b651 100644 --- a/rustpython_vm/obj/objgenerator/fn.init.html +++ b/rustpython_vm/obj/objgenerator/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objgenerator::init - Rust

[][src]Function rustpython_vm::obj::objgenerator::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objgenerator::init - Rust

[][src]Function rustpython_vm::obj::objgenerator::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objgenerator/fn.new_generator.html b/rustpython_vm/obj/objgenerator/fn.new_generator.html index 8592919..32a566d 100644 --- a/rustpython_vm/obj/objgenerator/fn.new_generator.html +++ b/rustpython_vm/obj/objgenerator/fn.new_generator.html @@ -1 +1 @@ -rustpython_vm::obj::objgenerator::new_generator - Rust

[][src]Function rustpython_vm::obj::objgenerator::new_generator

pub fn new_generator(vm: &mut VirtualMachine, frame: Frame) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objgenerator::new_generator - Rust

[][src]Function rustpython_vm::obj::objgenerator::new_generator

pub fn new_generator(
    frame: PyObjectRef,
    vm: &VirtualMachine
) -> PyRef<PyGenerator>
\ No newline at end of file diff --git a/rustpython_vm/obj/objgenerator/index.html b/rustpython_vm/obj/objgenerator/index.html index f7b1938..42bc308 100644 --- a/rustpython_vm/obj/objgenerator/index.html +++ b/rustpython_vm/obj/objgenerator/index.html @@ -1,2 +1,3 @@ -rustpython_vm::obj::objgenerator - Rust

[][src]Module rustpython_vm::obj::objgenerator

Functions

-
init
new_generator
\ No newline at end of file +rustpython_vm::obj::objgenerator - Rust

[][src]Module rustpython_vm::obj::objgenerator

Structs

+
PyGenerator

Functions

+
init
new_generator
\ No newline at end of file diff --git a/rustpython_vm/obj/objgenerator/sidebar-items.js b/rustpython_vm/obj/objgenerator/sidebar-items.js index 39f1c8b..5d74ecc 100644 --- a/rustpython_vm/obj/objgenerator/sidebar-items.js +++ b/rustpython_vm/obj/objgenerator/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""],["new_generator",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""],["new_generator",""]],"struct":[["PyGenerator",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objgenerator/struct.PyGenerator.html b/rustpython_vm/obj/objgenerator/struct.PyGenerator.html new file mode 100644 index 0000000..4b2f7ec --- /dev/null +++ b/rustpython_vm/obj/objgenerator/struct.PyGenerator.html @@ -0,0 +1,12 @@ +rustpython_vm::obj::objgenerator::PyGenerator - Rust

[][src]Struct rustpython_vm::obj::objgenerator::PyGenerator

pub struct PyGenerator { /* fields omitted */ }

Trait Implementations

impl PyValue for PyGenerator[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyGenerator[src]

Auto Trait Implementations

impl !Send for PyGenerator

impl !Sync for PyGenerator

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objint/PyInt.t.html b/rustpython_vm/obj/objint/PyInt.t.html new file mode 100644 index 0000000..d136fa3 --- /dev/null +++ b/rustpython_vm/obj/objint/PyInt.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyInt.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objint/PyIntRef.t.html b/rustpython_vm/obj/objint/PyIntRef.t.html new file mode 100644 index 0000000..9ed5e61 --- /dev/null +++ b/rustpython_vm/obj/objint/PyIntRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyIntRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objint/fn.get_value.html b/rustpython_vm/obj/objint/fn.get_value.html index 4926aa4..6939bd8 100644 --- a/rustpython_vm/obj/objint/fn.get_value.html +++ b/rustpython_vm/obj/objint/fn.get_value.html @@ -1 +1 @@ -rustpython_vm::obj::objint::get_value - Rust

[][src]Function rustpython_vm::obj::objint::get_value

pub fn get_value(obj: &PyObjectRef) -> BigInt
\ No newline at end of file +rustpython_vm::obj::objint::get_value - Rust

[][src]Function rustpython_vm::obj::objint::get_value

pub fn get_value(obj: &PyObjectRef) -> &BigInt
\ No newline at end of file diff --git a/rustpython_vm/obj/objint/fn.init.html b/rustpython_vm/obj/objint/fn.init.html index e7ba1f6..2a308fb 100644 --- a/rustpython_vm/obj/objint/fn.init.html +++ b/rustpython_vm/obj/objint/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objint::init - Rust

[][src]Function rustpython_vm::obj::objint::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objint::init - Rust

[][src]Function rustpython_vm::obj::objint::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objint/fn.to_int.html b/rustpython_vm/obj/objint/fn.to_int.html index 4905997..06a215d 100644 --- a/rustpython_vm/obj/objint/fn.to_int.html +++ b/rustpython_vm/obj/objint/fn.to_int.html @@ -1 +1 @@ -rustpython_vm::obj::objint::to_int - Rust

[][src]Function rustpython_vm::obj::objint::to_int

pub fn to_int(
    vm: &mut VirtualMachine,
    obj: &PyObjectRef,
    base: u32
) -> Result<BigInt, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objint::to_int - Rust

[][src]Function rustpython_vm::obj::objint::to_int

pub fn to_int(
    vm: &VirtualMachine,
    obj: &PyObjectRef,
    base: u32
) -> PyResult<BigInt>
\ No newline at end of file diff --git a/rustpython_vm/obj/objint/index.html b/rustpython_vm/obj/objint/index.html index 6e46215..2e2a8ae 100644 --- a/rustpython_vm/obj/objint/index.html +++ b/rustpython_vm/obj/objint/index.html @@ -1,2 +1,4 @@ -rustpython_vm::obj::objint - Rust

[][src]Module rustpython_vm::obj::objint

Functions

-
get_value
init
to_int
\ No newline at end of file +rustpython_vm::obj::objint - Rust

[][src]Module rustpython_vm::obj::objint

Structs

+
PyInt

Functions

+
get_value
init
to_int

Type Definitions

+
PyIntRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objint/sidebar-items.js b/rustpython_vm/obj/objint/sidebar-items.js index e001cd1..949ad0a 100644 --- a/rustpython_vm/obj/objint/sidebar-items.js +++ b/rustpython_vm/obj/objint/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["get_value",""],["init",""],["to_int",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_value",""],["init",""],["to_int",""]],"struct":[["PyInt",""]],"type":[["PyIntRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objint/struct.PyInt.html b/rustpython_vm/obj/objint/struct.PyInt.html new file mode 100644 index 0000000..471893d --- /dev/null +++ b/rustpython_vm/obj/objint/struct.PyInt.html @@ -0,0 +1,15 @@ +rustpython_vm::obj::objint::PyInt - Rust

[][src]Struct rustpython_vm::obj::objint::PyInt

pub struct PyInt {
+    pub value: BigInt,
+}

+ Fields

value: BigInt

Methods

impl PyInt[src]

pub fn new<T: Into<BigInt>>(i: T) -> Self[src]

Trait Implementations

impl PyValue for PyInt[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyInt[src]

Auto Trait Implementations

impl Send for PyInt

impl Sync for PyInt

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objint/type.PyIntRef.html b/rustpython_vm/obj/objint/type.PyIntRef.html new file mode 100644 index 0000000..a792db8 --- /dev/null +++ b/rustpython_vm/obj/objint/type.PyIntRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objint::PyIntRef - Rust

[][src]Type Definition rustpython_vm::obj::objint::PyIntRef

type PyIntRef = PyRef<PyInt>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objiter/fn.call_next.html b/rustpython_vm/obj/objiter/fn.call_next.html index 274bc67..e81301b 100644 --- a/rustpython_vm/obj/objiter/fn.call_next.html +++ b/rustpython_vm/obj/objiter/fn.call_next.html @@ -1 +1 @@ -rustpython_vm::obj::objiter::call_next - Rust

[][src]Function rustpython_vm::obj::objiter::call_next

pub fn call_next(vm: &mut VirtualMachine, iter_obj: &PyObjectRef) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objiter::call_next - Rust

[][src]Function rustpython_vm::obj::objiter::call_next

pub fn call_next(vm: &VirtualMachine, iter_obj: &PyObjectRef) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objiter/fn.get_all.html b/rustpython_vm/obj/objiter/fn.get_all.html index 7aac24f..3a7446d 100644 --- a/rustpython_vm/obj/objiter/fn.get_all.html +++ b/rustpython_vm/obj/objiter/fn.get_all.html @@ -1 +1 @@ -rustpython_vm::obj::objiter::get_all - Rust

[][src]Function rustpython_vm::obj::objiter::get_all

pub fn get_all(
    vm: &mut VirtualMachine,
    iter_obj: &PyObjectRef
) -> Result<Vec<PyObjectRef>, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objiter::get_all - Rust

[][src]Function rustpython_vm::obj::objiter::get_all

pub fn get_all(
    vm: &VirtualMachine,
    iter_obj: &PyObjectRef
) -> PyResult<Vec<PyObjectRef>>
\ No newline at end of file diff --git a/rustpython_vm/obj/objiter/fn.get_iter.html b/rustpython_vm/obj/objiter/fn.get_iter.html index a2241d1..2d012b1 100644 --- a/rustpython_vm/obj/objiter/fn.get_iter.html +++ b/rustpython_vm/obj/objiter/fn.get_iter.html @@ -1 +1 @@ -rustpython_vm::obj::objiter::get_iter - Rust

[][src]Function rustpython_vm::obj::objiter::get_iter

pub fn get_iter(vm: &mut VirtualMachine, iter_target: &PyObjectRef) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objiter::get_iter - Rust

[][src]Function rustpython_vm::obj::objiter::get_iter

pub fn get_iter(vm: &VirtualMachine, iter_target: &PyObjectRef) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objiter/fn.get_next_object.html b/rustpython_vm/obj/objiter/fn.get_next_object.html index 12dbaed..2c8f50f 100644 --- a/rustpython_vm/obj/objiter/fn.get_next_object.html +++ b/rustpython_vm/obj/objiter/fn.get_next_object.html @@ -1 +1 @@ -rustpython_vm::obj::objiter::get_next_object - Rust

[][src]Function rustpython_vm::obj::objiter::get_next_object

pub fn get_next_object(
    vm: &mut VirtualMachine,
    iter_obj: &PyObjectRef
) -> Result<Option<PyObjectRef>, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objiter::get_next_object - Rust

[][src]Function rustpython_vm::obj::objiter::get_next_object

pub fn get_next_object(
    vm: &VirtualMachine,
    iter_obj: &PyObjectRef
) -> PyResult<Option<PyObjectRef>>
\ No newline at end of file diff --git a/rustpython_vm/obj/objiter/fn.init.html b/rustpython_vm/obj/objiter/fn.init.html index 4e0695f..7d25060 100644 --- a/rustpython_vm/obj/objiter/fn.init.html +++ b/rustpython_vm/obj/objiter/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objiter::init - Rust

[][src]Function rustpython_vm::obj::objiter::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objiter::init - Rust

[][src]Function rustpython_vm::obj::objiter::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objiter/fn.iter_type_init.html b/rustpython_vm/obj/objiter/fn.iter_type_init.html index 946d85a..f9e2c14 100644 --- a/rustpython_vm/obj/objiter/fn.iter_type_init.html +++ b/rustpython_vm/obj/objiter/fn.iter_type_init.html @@ -1,2 +1,2 @@ -rustpython_vm::obj::objiter::iter_type_init - Rust

[][src]Function rustpython_vm::obj::objiter::iter_type_init

pub fn iter_type_init(context: &PyContext, iter_type: &PyObjectRef)

Common setup for iter types, adds iter and contains methods

-
\ No newline at end of file +rustpython_vm::obj::objiter::iter_type_init - Rust

[][src]Function rustpython_vm::obj::objiter::iter_type_init

pub fn iter_type_init(context: &PyContext, iter_type: &PyObjectRef)

Common setup for iter types, adds iter and contains methods

+
\ No newline at end of file diff --git a/rustpython_vm/obj/objiter/fn.new_stop_iteration.html b/rustpython_vm/obj/objiter/fn.new_stop_iteration.html index b0e248e..4536e7b 100644 --- a/rustpython_vm/obj/objiter/fn.new_stop_iteration.html +++ b/rustpython_vm/obj/objiter/fn.new_stop_iteration.html @@ -1 +1 @@ -rustpython_vm::obj::objiter::new_stop_iteration - Rust

[][src]Function rustpython_vm::obj::objiter::new_stop_iteration

pub fn new_stop_iteration(vm: &mut VirtualMachine) -> PyObjectRef
\ No newline at end of file +rustpython_vm::obj::objiter::new_stop_iteration - Rust

[][src]Function rustpython_vm::obj::objiter::new_stop_iteration

pub fn new_stop_iteration(vm: &VirtualMachine) -> PyObjectRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objiter/index.html b/rustpython_vm/obj/objiter/index.html index 1973639..9b6aa3d 100644 --- a/rustpython_vm/obj/objiter/index.html +++ b/rustpython_vm/obj/objiter/index.html @@ -1,3 +1,3 @@ -rustpython_vm::obj::objiter - Rust

[][src]Module rustpython_vm::obj::objiter

Functions

+rustpython_vm::obj::objiter - Rust

[][src]Module rustpython_vm::obj::objiter

Functions

call_next
get_all
get_iter
get_next_object
init
iter_type_init

Common setup for iter types, adds iter and contains methods

-
new_stop_iteration
\ No newline at end of file +new_stop_iteration
\ No newline at end of file diff --git a/rustpython_vm/obj/objlist/PyList.t.html b/rustpython_vm/obj/objlist/PyList.t.html new file mode 100644 index 0000000..bd626c9 --- /dev/null +++ b/rustpython_vm/obj/objlist/PyList.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyList.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objlist/PyListRef.t.html b/rustpython_vm/obj/objlist/PyListRef.t.html new file mode 100644 index 0000000..86120f7 --- /dev/null +++ b/rustpython_vm/obj/objlist/PyListRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyListRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objlist/fn.init.html b/rustpython_vm/obj/objlist/fn.init.html index 5f9013e..bb1112a 100644 --- a/rustpython_vm/obj/objlist/fn.init.html +++ b/rustpython_vm/obj/objlist/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objlist::init - Rust

[][src]Function rustpython_vm::obj::objlist::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objlist::init - Rust

[][src]Function rustpython_vm::obj::objlist::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objlist/index.html b/rustpython_vm/obj/objlist/index.html index 778b6dd..2ac1218 100644 --- a/rustpython_vm/obj/objlist/index.html +++ b/rustpython_vm/obj/objlist/index.html @@ -1,2 +1,4 @@ -rustpython_vm::obj::objlist - Rust

[][src]Module rustpython_vm::obj::objlist

Functions

-
init
list_append
list_extend
\ No newline at end of file +rustpython_vm::obj::objlist - Rust

[][src]Module rustpython_vm::obj::objlist

Structs

+
PyList

Functions

+
init

Type Definitions

+
PyListRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objlist/sidebar-items.js b/rustpython_vm/obj/objlist/sidebar-items.js index 99c2f11..ee33af2 100644 --- a/rustpython_vm/obj/objlist/sidebar-items.js +++ b/rustpython_vm/obj/objlist/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""],["list_append",""],["list_extend",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PyList",""]],"type":[["PyListRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objlist/struct.PyList.html b/rustpython_vm/obj/objlist/struct.PyList.html new file mode 100644 index 0000000..8744b41 --- /dev/null +++ b/rustpython_vm/obj/objlist/struct.PyList.html @@ -0,0 +1,17 @@ +rustpython_vm::obj::objlist::PyList - Rust

[][src]Struct rustpython_vm::obj::objlist::PyList

pub struct PyList {
+    pub elements: RefCell<Vec<PyObjectRef>>,
+}

+ Fields

elements: RefCell<Vec<PyObjectRef>>

Trait Implementations

impl PyValue for PyList[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Default for PyList[src]

impl From<Vec<Rc<PyObject>>> for PyList[src]

impl Debug for PyList[src]

Auto Trait Implementations

impl !Send for PyList

impl !Sync for PyList

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objlist/type.PyListRef.html b/rustpython_vm/obj/objlist/type.PyListRef.html new file mode 100644 index 0000000..e241701 --- /dev/null +++ b/rustpython_vm/obj/objlist/type.PyListRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objlist::PyListRef - Rust

[][src]Type Definition rustpython_vm::obj::objlist::PyListRef

type PyListRef = PyRef<PyList>;

Methods

impl PyListRef[src]

pub fn append(self, x: PyObjectRef, _vm: &VirtualMachine)[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objmap/PyMap.t.html b/rustpython_vm/obj/objmap/PyMap.t.html new file mode 100644 index 0000000..afd69e3 --- /dev/null +++ b/rustpython_vm/obj/objmap/PyMap.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyMap.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objmap/fn.init.html b/rustpython_vm/obj/objmap/fn.init.html index 695c3bb..58fd9d0 100644 --- a/rustpython_vm/obj/objmap/fn.init.html +++ b/rustpython_vm/obj/objmap/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objmap::init - Rust

[][src]Function rustpython_vm::obj::objmap::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objmap::init - Rust

[][src]Function rustpython_vm::obj::objmap::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objmap/index.html b/rustpython_vm/obj/objmap/index.html index 63c5850..e115d8a 100644 --- a/rustpython_vm/obj/objmap/index.html +++ b/rustpython_vm/obj/objmap/index.html @@ -1,2 +1,3 @@ -rustpython_vm::obj::objmap - Rust

[][src]Module rustpython_vm::obj::objmap

Functions

-
init
\ No newline at end of file +rustpython_vm::obj::objmap - Rust

[][src]Module rustpython_vm::obj::objmap

Structs

+
PyMap

Functions

+
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objmap/sidebar-items.js b/rustpython_vm/obj/objmap/sidebar-items.js index 7fc930a..219c8f6 100644 --- a/rustpython_vm/obj/objmap/sidebar-items.js +++ b/rustpython_vm/obj/objmap/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PyMap",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objmap/struct.PyMap.html b/rustpython_vm/obj/objmap/struct.PyMap.html new file mode 100644 index 0000000..afd74ef --- /dev/null +++ b/rustpython_vm/obj/objmap/struct.PyMap.html @@ -0,0 +1,12 @@ +rustpython_vm::obj::objmap::PyMap - Rust

[][src]Struct rustpython_vm::obj::objmap::PyMap

pub struct PyMap { /* fields omitted */ }

Trait Implementations

impl PyValue for PyMap[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyMap[src]

Auto Trait Implementations

impl !Send for PyMap

impl !Sync for PyMap

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objmemory/PyMemoryView.t.html b/rustpython_vm/obj/objmemory/PyMemoryView.t.html new file mode 100644 index 0000000..6ef7bdb --- /dev/null +++ b/rustpython_vm/obj/objmemory/PyMemoryView.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyMemoryView.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objmemory/fn.init.html b/rustpython_vm/obj/objmemory/fn.init.html index 10b067a..5c05a2f 100644 --- a/rustpython_vm/obj/objmemory/fn.init.html +++ b/rustpython_vm/obj/objmemory/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objmemory::init - Rust

[][src]Function rustpython_vm::obj::objmemory::init

pub fn init(ctx: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objmemory::init - Rust

[][src]Function rustpython_vm::obj::objmemory::init

pub fn init(ctx: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objmemory/fn.new_memory_view.html b/rustpython_vm/obj/objmemory/fn.new_memory_view.html index 6971f86..f5a5dab 100644 --- a/rustpython_vm/obj/objmemory/fn.new_memory_view.html +++ b/rustpython_vm/obj/objmemory/fn.new_memory_view.html @@ -1 +1 @@ -rustpython_vm::obj::objmemory::new_memory_view - Rust

[][src]Function rustpython_vm::obj::objmemory::new_memory_view

pub fn new_memory_view(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objmemory::new_memory_view - Rust

[][src]Function rustpython_vm::obj::objmemory::new_memory_view

pub fn new_memory_view(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objmemory/index.html b/rustpython_vm/obj/objmemory/index.html index e0ce585..d3e1d26 100644 --- a/rustpython_vm/obj/objmemory/index.html +++ b/rustpython_vm/obj/objmemory/index.html @@ -1,2 +1,3 @@ -rustpython_vm::obj::objmemory - Rust

[][src]Module rustpython_vm::obj::objmemory

Functions

-
init
new_memory_view
\ No newline at end of file +rustpython_vm::obj::objmemory - Rust

[][src]Module rustpython_vm::obj::objmemory

Structs

+
PyMemoryView

Functions

+
init
new_memory_view
\ No newline at end of file diff --git a/rustpython_vm/obj/objmemory/sidebar-items.js b/rustpython_vm/obj/objmemory/sidebar-items.js index 8d0f8d6..594e7b4 100644 --- a/rustpython_vm/obj/objmemory/sidebar-items.js +++ b/rustpython_vm/obj/objmemory/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""],["new_memory_view",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""],["new_memory_view",""]],"struct":[["PyMemoryView",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objmemory/struct.PyMemoryView.html b/rustpython_vm/obj/objmemory/struct.PyMemoryView.html new file mode 100644 index 0000000..8f0d2b5 --- /dev/null +++ b/rustpython_vm/obj/objmemory/struct.PyMemoryView.html @@ -0,0 +1,12 @@ +rustpython_vm::obj::objmemory::PyMemoryView - Rust

[][src]Struct rustpython_vm::obj::objmemory::PyMemoryView

pub struct PyMemoryView { /* fields omitted */ }

Trait Implementations

impl PyValue for PyMemoryView[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyMemoryView[src]

Auto Trait Implementations

impl !Send for PyMemoryView

impl !Sync for PyMemoryView

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objmodule/PyModule.t.html b/rustpython_vm/obj/objmodule/PyModule.t.html new file mode 100644 index 0000000..3f7de47 --- /dev/null +++ b/rustpython_vm/obj/objmodule/PyModule.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyModule.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objmodule/PyModuleRef.t.html b/rustpython_vm/obj/objmodule/PyModuleRef.t.html new file mode 100644 index 0000000..8c4ec71 --- /dev/null +++ b/rustpython_vm/obj/objmodule/PyModuleRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyModuleRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objmodule/fn.init.html b/rustpython_vm/obj/objmodule/fn.init.html new file mode 100644 index 0000000..47c27d3 --- /dev/null +++ b/rustpython_vm/obj/objmodule/fn.init.html @@ -0,0 +1 @@ +rustpython_vm::obj::objmodule::init - Rust

[][src]Function rustpython_vm::obj::objmodule::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objmodule/index.html b/rustpython_vm/obj/objmodule/index.html new file mode 100644 index 0000000..9a1efbd --- /dev/null +++ b/rustpython_vm/obj/objmodule/index.html @@ -0,0 +1,4 @@ +rustpython_vm::obj::objmodule - Rust

[][src]Module rustpython_vm::obj::objmodule

Structs

+
PyModule

Functions

+
init

Type Definitions

+
PyModuleRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objmodule/init.v.html b/rustpython_vm/obj/objmodule/init.v.html new file mode 100644 index 0000000..3be617d --- /dev/null +++ b/rustpython_vm/obj/objmodule/init.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.init.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objmodule/sidebar-items.js b/rustpython_vm/obj/objmodule/sidebar-items.js new file mode 100644 index 0000000..91c7c42 --- /dev/null +++ b/rustpython_vm/obj/objmodule/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"fn":[["init",""]],"struct":[["PyModule",""]],"type":[["PyModuleRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objmodule/struct.PyModule.html b/rustpython_vm/obj/objmodule/struct.PyModule.html new file mode 100644 index 0000000..d88744f --- /dev/null +++ b/rustpython_vm/obj/objmodule/struct.PyModule.html @@ -0,0 +1,21 @@ +rustpython_vm::obj::objmodule::PyModule - Rust

[][src]Struct rustpython_vm::obj::objmodule::PyModule

pub struct PyModule {
+    pub name: String,
+    pub dict: PyObjectRef,
+}

+ Fields

name: Stringdict: PyObjectRef

Trait Implementations

impl PyValue for PyModule[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Clone for PyModule[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Debug for PyModule[src]

Auto Trait Implementations

impl !Send for PyModule

impl !Sync for PyModule

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objmodule/type.PyModuleRef.html b/rustpython_vm/obj/objmodule/type.PyModuleRef.html new file mode 100644 index 0000000..12d3598 --- /dev/null +++ b/rustpython_vm/obj/objmodule/type.PyModuleRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objmodule::PyModuleRef - Rust

[][src]Type Definition rustpython_vm::obj::objmodule::PyModuleRef

type PyModuleRef = PyRef<PyModule>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objnone/PyNone.t.html b/rustpython_vm/obj/objnone/PyNone.t.html new file mode 100644 index 0000000..39b1111 --- /dev/null +++ b/rustpython_vm/obj/objnone/PyNone.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyNone.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objnone/PyNoneRef.t.html b/rustpython_vm/obj/objnone/PyNoneRef.t.html new file mode 100644 index 0000000..6eaafc1 --- /dev/null +++ b/rustpython_vm/obj/objnone/PyNoneRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyNoneRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objnone/fn.init.html b/rustpython_vm/obj/objnone/fn.init.html index 05972b0..a175479 100644 --- a/rustpython_vm/obj/objnone/fn.init.html +++ b/rustpython_vm/obj/objnone/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objnone::init - Rust

[][src]Function rustpython_vm::obj::objnone::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objnone::init - Rust

[][src]Function rustpython_vm::obj::objnone::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objnone/index.html b/rustpython_vm/obj/objnone/index.html index 7980be8..5013d38 100644 --- a/rustpython_vm/obj/objnone/index.html +++ b/rustpython_vm/obj/objnone/index.html @@ -1,2 +1,4 @@ -rustpython_vm::obj::objnone - Rust

[][src]Module rustpython_vm::obj::objnone

Functions

-
init
\ No newline at end of file +rustpython_vm::obj::objnone - Rust

[][src]Module rustpython_vm::obj::objnone

Structs

+
PyNone

Functions

+
init

Type Definitions

+
PyNoneRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objnone/sidebar-items.js b/rustpython_vm/obj/objnone/sidebar-items.js index 7fc930a..18ba008 100644 --- a/rustpython_vm/obj/objnone/sidebar-items.js +++ b/rustpython_vm/obj/objnone/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PyNone",""]],"type":[["PyNoneRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objnone/struct.PyNone.html b/rustpython_vm/obj/objnone/struct.PyNone.html new file mode 100644 index 0000000..38473b3 --- /dev/null +++ b/rustpython_vm/obj/objnone/struct.PyNone.html @@ -0,0 +1,17 @@ +rustpython_vm::obj::objnone::PyNone - Rust

[][src]Struct rustpython_vm::obj::objnone::PyNone

pub struct PyNone;

Trait Implementations

impl PyValue for PyNone[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Clone for PyNone[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Debug for PyNone[src]

Auto Trait Implementations

impl Send for PyNone

impl Sync for PyNone

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objnone/type.PyNoneRef.html b/rustpython_vm/obj/objnone/type.PyNoneRef.html new file mode 100644 index 0000000..3d8a69f --- /dev/null +++ b/rustpython_vm/obj/objnone/type.PyNoneRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objnone::PyNoneRef - Rust

[][src]Type Definition rustpython_vm::obj::objnone::PyNoneRef

type PyNoneRef = PyRef<PyNone>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objobject/PyInstance.t.html b/rustpython_vm/obj/objobject/PyInstance.t.html new file mode 100644 index 0000000..2cd3c26 --- /dev/null +++ b/rustpython_vm/obj/objobject/PyInstance.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyInstance.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objobject/PyInstanceRef.t.html b/rustpython_vm/obj/objobject/PyInstanceRef.t.html new file mode 100644 index 0000000..65ab3c2 --- /dev/null +++ b/rustpython_vm/obj/objobject/PyInstanceRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyInstanceRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objobject/fn.get_attributes.html b/rustpython_vm/obj/objobject/fn.get_attributes.html new file mode 100644 index 0000000..9539186 --- /dev/null +++ b/rustpython_vm/obj/objobject/fn.get_attributes.html @@ -0,0 +1 @@ +rustpython_vm::obj::objobject::get_attributes - Rust

[][src]Function rustpython_vm::obj::objobject::get_attributes

pub fn get_attributes(obj: &PyObjectRef) -> PyAttributes
\ No newline at end of file diff --git a/rustpython_vm/obj/objobject/fn.init.html b/rustpython_vm/obj/objobject/fn.init.html index 4c9296b..cf6cb01 100644 --- a/rustpython_vm/obj/objobject/fn.init.html +++ b/rustpython_vm/obj/objobject/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objobject::init - Rust

[][src]Function rustpython_vm::obj::objobject::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objobject::init - Rust

[][src]Function rustpython_vm::obj::objobject::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objobject/fn.new_instance.html b/rustpython_vm/obj/objobject/fn.new_instance.html index f2394f3..ecd51b1 100644 --- a/rustpython_vm/obj/objobject/fn.new_instance.html +++ b/rustpython_vm/obj/objobject/fn.new_instance.html @@ -1 +1 @@ -rustpython_vm::obj::objobject::new_instance - Rust

[][src]Function rustpython_vm::obj::objobject::new_instance

pub fn new_instance(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objobject::new_instance - Rust

[][src]Function rustpython_vm::obj::objobject::new_instance

pub fn new_instance(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objobject/fn.object_dir.html b/rustpython_vm/obj/objobject/fn.object_dir.html new file mode 100644 index 0000000..8820633 --- /dev/null +++ b/rustpython_vm/obj/objobject/fn.object_dir.html @@ -0,0 +1 @@ +rustpython_vm::obj::objobject::object_dir - Rust

[][src]Function rustpython_vm::obj::objobject::object_dir

pub fn object_dir(obj: PyObjectRef, vm: &VirtualMachine) -> PyList
\ No newline at end of file diff --git a/rustpython_vm/obj/objobject/get_attributes.v.html b/rustpython_vm/obj/objobject/get_attributes.v.html new file mode 100644 index 0000000..bff88fc --- /dev/null +++ b/rustpython_vm/obj/objobject/get_attributes.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.get_attributes.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objobject/index.html b/rustpython_vm/obj/objobject/index.html index 8857425..5cefd29 100644 --- a/rustpython_vm/obj/objobject/index.html +++ b/rustpython_vm/obj/objobject/index.html @@ -1,2 +1,4 @@ -rustpython_vm::obj::objobject - Rust

[][src]Module rustpython_vm::obj::objobject

Functions

-
create_object
init
new_instance
\ No newline at end of file +rustpython_vm::obj::objobject - Rust

[][src]Module rustpython_vm::obj::objobject

Structs

+
PyInstance

Functions

+
get_attributes
init
new_instance
object_dir

Type Definitions

+
PyInstanceRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objobject/object_dir.v.html b/rustpython_vm/obj/objobject/object_dir.v.html new file mode 100644 index 0000000..6562210 --- /dev/null +++ b/rustpython_vm/obj/objobject/object_dir.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.object_dir.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objobject/sidebar-items.js b/rustpython_vm/obj/objobject/sidebar-items.js index 2b76566..d5b38e1 100644 --- a/rustpython_vm/obj/objobject/sidebar-items.js +++ b/rustpython_vm/obj/objobject/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["create_object",""],["init",""],["new_instance",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_attributes",""],["init",""],["new_instance",""],["object_dir",""]],"struct":[["PyInstance",""]],"type":[["PyInstanceRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objobject/struct.PyInstance.html b/rustpython_vm/obj/objobject/struct.PyInstance.html new file mode 100644 index 0000000..9a8913b --- /dev/null +++ b/rustpython_vm/obj/objobject/struct.PyInstance.html @@ -0,0 +1,17 @@ +rustpython_vm::obj::objobject::PyInstance - Rust

[][src]Struct rustpython_vm::obj::objobject::PyInstance

pub struct PyInstance;

Trait Implementations

impl PyValue for PyInstance[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Clone for PyInstance[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Debug for PyInstance[src]

Auto Trait Implementations

impl Send for PyInstance

impl Sync for PyInstance

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objobject/type.PyInstanceRef.html b/rustpython_vm/obj/objobject/type.PyInstanceRef.html new file mode 100644 index 0000000..801a628 --- /dev/null +++ b/rustpython_vm/obj/objobject/type.PyInstanceRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objobject::PyInstanceRef - Rust

[][src]Type Definition rustpython_vm::obj::objobject::PyInstanceRef

type PyInstanceRef = PyRef<PyInstance>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/PropertyBuilder.t.html b/rustpython_vm/obj/objproperty/PropertyBuilder.t.html new file mode 100644 index 0000000..697610c --- /dev/null +++ b/rustpython_vm/obj/objproperty/PropertyBuilder.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PropertyBuilder.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/PyProperty.t.html b/rustpython_vm/obj/objproperty/PyProperty.t.html new file mode 100644 index 0000000..5686aa6 --- /dev/null +++ b/rustpython_vm/obj/objproperty/PyProperty.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyProperty.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/PyPropertyRef.t.html b/rustpython_vm/obj/objproperty/PyPropertyRef.t.html new file mode 100644 index 0000000..def9d03 --- /dev/null +++ b/rustpython_vm/obj/objproperty/PyPropertyRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyPropertyRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/PyReadOnlyProperty.t.html b/rustpython_vm/obj/objproperty/PyReadOnlyProperty.t.html new file mode 100644 index 0000000..8989a20 --- /dev/null +++ b/rustpython_vm/obj/objproperty/PyReadOnlyProperty.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyReadOnlyProperty.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/PyReadOnlyPropertyRef.t.html b/rustpython_vm/obj/objproperty/PyReadOnlyPropertyRef.t.html new file mode 100644 index 0000000..bb2ae1d --- /dev/null +++ b/rustpython_vm/obj/objproperty/PyReadOnlyPropertyRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyReadOnlyPropertyRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/fn.init.html b/rustpython_vm/obj/objproperty/fn.init.html index 40aa128..c637180 100644 --- a/rustpython_vm/obj/objproperty/fn.init.html +++ b/rustpython_vm/obj/objproperty/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objproperty::init - Rust

[][src]Function rustpython_vm::obj::objproperty::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objproperty::init - Rust

[][src]Function rustpython_vm::obj::objproperty::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/index.html b/rustpython_vm/obj/objproperty/index.html index 3fcf99d..e3e9c61 100644 --- a/rustpython_vm/obj/objproperty/index.html +++ b/rustpython_vm/obj/objproperty/index.html @@ -1,3 +1,7 @@ -rustpython_vm::obj::objproperty - Rust

[][src]Module rustpython_vm::obj::objproperty

Python property descriptor class.

-

Functions

-
init
\ No newline at end of file +rustpython_vm::obj::objproperty - Rust

[][src]Module rustpython_vm::obj::objproperty

Python property descriptor class.

+

Structs

+
PropertyBuilder
PyProperty

Fully fledged property

+
PyReadOnlyProperty

Read-only property, doesn't have set or delete

+

Functions

+
init

Type Definitions

+
PyPropertyRef
PyReadOnlyPropertyRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/sidebar-items.js b/rustpython_vm/obj/objproperty/sidebar-items.js index 7fc930a..04b6aaf 100644 --- a/rustpython_vm/obj/objproperty/sidebar-items.js +++ b/rustpython_vm/obj/objproperty/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PropertyBuilder",""],["PyProperty","Fully fledged property"],["PyReadOnlyProperty","Read-only property, doesn't have set or delete"]],"type":[["PyPropertyRef",""],["PyReadOnlyPropertyRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/struct.PropertyBuilder.html b/rustpython_vm/obj/objproperty/struct.PropertyBuilder.html new file mode 100644 index 0000000..f661586 --- /dev/null +++ b/rustpython_vm/obj/objproperty/struct.PropertyBuilder.html @@ -0,0 +1,11 @@ +rustpython_vm::obj::objproperty::PropertyBuilder - Rust

[][src]Struct rustpython_vm::obj::objproperty::PropertyBuilder

pub struct PropertyBuilder<'a> { /* fields omitted */ }

Methods

impl<'a> PropertyBuilder<'a>[src]

pub fn new(ctx: &'a PyContext) -> Self[src]

pub fn add_getter<I, V, F: IntoPyNativeFunc<I, V>>(self, func: F) -> Self[src]

pub fn add_setter<I, V, F: IntoPyNativeFunc<(I, V), PyResult>>(
    self,
    func: F
) -> Self
[src]

pub fn create(self) -> PyObjectRef[src]

Auto Trait Implementations

impl<'a> !Send for PropertyBuilder<'a>

impl<'a> !Sync for PropertyBuilder<'a>

Blanket Implementations

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/struct.PyProperty.html b/rustpython_vm/obj/objproperty/struct.PyProperty.html new file mode 100644 index 0000000..1d93ab3 --- /dev/null +++ b/rustpython_vm/obj/objproperty/struct.PyProperty.html @@ -0,0 +1,13 @@ +rustpython_vm::obj::objproperty::PyProperty - Rust

[][src]Struct rustpython_vm::obj::objproperty::PyProperty

pub struct PyProperty { /* fields omitted */ }

Fully fledged property

+

Trait Implementations

impl PyValue for PyProperty[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyProperty[src]

Auto Trait Implementations

impl !Send for PyProperty

impl !Sync for PyProperty

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/struct.PyReadOnlyProperty.html b/rustpython_vm/obj/objproperty/struct.PyReadOnlyProperty.html new file mode 100644 index 0000000..fce1966 --- /dev/null +++ b/rustpython_vm/obj/objproperty/struct.PyReadOnlyProperty.html @@ -0,0 +1,13 @@ +rustpython_vm::obj::objproperty::PyReadOnlyProperty - Rust

[][src]Struct rustpython_vm::obj::objproperty::PyReadOnlyProperty

pub struct PyReadOnlyProperty { /* fields omitted */ }

Read-only property, doesn't have set or delete

+

Trait Implementations

impl PyValue for PyReadOnlyProperty[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyReadOnlyProperty[src]

Auto Trait Implementations

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/type.PyPropertyRef.html b/rustpython_vm/obj/objproperty/type.PyPropertyRef.html new file mode 100644 index 0000000..78be838 --- /dev/null +++ b/rustpython_vm/obj/objproperty/type.PyPropertyRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objproperty::PyPropertyRef - Rust

[][src]Type Definition rustpython_vm::obj::objproperty::PyPropertyRef

type PyPropertyRef = PyRef<PyProperty>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objproperty/type.PyReadOnlyPropertyRef.html b/rustpython_vm/obj/objproperty/type.PyReadOnlyPropertyRef.html new file mode 100644 index 0000000..afcb3f2 --- /dev/null +++ b/rustpython_vm/obj/objproperty/type.PyReadOnlyPropertyRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objproperty::PyReadOnlyPropertyRef - Rust

[][src]Type Definition rustpython_vm::obj::objproperty::PyReadOnlyPropertyRef

type PyReadOnlyPropertyRef = PyRef<PyReadOnlyProperty>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objrange/PyRange.t.html b/rustpython_vm/obj/objrange/PyRange.t.html new file mode 100644 index 0000000..09ebd6c --- /dev/null +++ b/rustpython_vm/obj/objrange/PyRange.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyRange.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objrange/fn.get_value.html b/rustpython_vm/obj/objrange/fn.get_value.html index bf3a407..1698d59 100644 --- a/rustpython_vm/obj/objrange/fn.get_value.html +++ b/rustpython_vm/obj/objrange/fn.get_value.html @@ -1 +1 @@ -rustpython_vm::obj::objrange::get_value - Rust

[][src]Function rustpython_vm::obj::objrange::get_value

pub fn get_value(obj: &PyObjectRef) -> RangeType
\ No newline at end of file +rustpython_vm::obj::objrange::get_value - Rust

[][src]Function rustpython_vm::obj::objrange::get_value

pub fn get_value(obj: &PyObjectRef) -> PyRange
\ No newline at end of file diff --git a/rustpython_vm/obj/objrange/fn.init.html b/rustpython_vm/obj/objrange/fn.init.html index 02b784c..a39e993 100644 --- a/rustpython_vm/obj/objrange/fn.init.html +++ b/rustpython_vm/obj/objrange/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objrange::init - Rust

[][src]Function rustpython_vm::obj::objrange::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objrange::init - Rust

[][src]Function rustpython_vm::obj::objrange::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objrange/index.html b/rustpython_vm/obj/objrange/index.html index b64b843..d7b6c4a 100644 --- a/rustpython_vm/obj/objrange/index.html +++ b/rustpython_vm/obj/objrange/index.html @@ -1,3 +1,3 @@ -rustpython_vm::obj::objrange - Rust

[][src]Module rustpython_vm::obj::objrange

Structs

-
RangeType

Functions

-
get_value
init
\ No newline at end of file +rustpython_vm::obj::objrange - Rust

[][src]Module rustpython_vm::obj::objrange

Structs

+
PyRange

Functions

+
get_value
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objrange/sidebar-items.js b/rustpython_vm/obj/objrange/sidebar-items.js index 649e26f..4c64d41 100644 --- a/rustpython_vm/obj/objrange/sidebar-items.js +++ b/rustpython_vm/obj/objrange/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["get_value",""],["init",""]],"struct":[["RangeType",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_value",""],["init",""]],"struct":[["PyRange",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objrange/struct.PyRange.html b/rustpython_vm/obj/objrange/struct.PyRange.html new file mode 100644 index 0000000..936c902 --- /dev/null +++ b/rustpython_vm/obj/objrange/struct.PyRange.html @@ -0,0 +1,22 @@ +rustpython_vm::obj::objrange::PyRange - Rust

[][src]Struct rustpython_vm::obj::objrange::PyRange

pub struct PyRange {
+    pub start: BigInt,
+    pub end: BigInt,
+    pub step: BigInt,
+}

+ Fields

start: BigIntend: BigIntstep: BigInt

Methods

impl PyRange[src]

pub fn try_len(&self) -> Option<usize>[src]

pub fn len(&self) -> usize[src]

pub fn contains(&self, value: &BigInt) -> bool[src]

pub fn index_of(&self, value: &BigInt) -> Option<BigInt>[src]

pub fn count(&self, value: &BigInt) -> usize[src]

pub fn is_empty(&self) -> bool[src]

pub fn forward(&self) -> bool[src]

pub fn get<'a, T>(&'a self, index: T) -> Option<BigInt> where
    &'a BigInt: Mul<T, Output = BigInt>, 
[src]

pub fn reversed(&self) -> Self[src]

pub fn repr(&self) -> String[src]

Trait Implementations

impl PyValue for PyRange[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Clone for PyRange[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Debug for PyRange[src]

Auto Trait Implementations

impl Send for PyRange

impl Sync for PyRange

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/fn.get_elements.html b/rustpython_vm/obj/objsequence/fn.get_elements.html index 53c3dcd..a7eb226 100644 --- a/rustpython_vm/obj/objsequence/fn.get_elements.html +++ b/rustpython_vm/obj/objsequence/fn.get_elements.html @@ -1 +1 @@ -rustpython_vm::obj::objsequence::get_elements - Rust

[][src]Function rustpython_vm::obj::objsequence::get_elements

pub fn get_elements<'a>(
    obj: &'a PyObjectRef
) -> impl Deref<Target = Vec<PyObjectRef>> + 'a
\ No newline at end of file +rustpython_vm::obj::objsequence::get_elements - Rust

[][src]Function rustpython_vm::obj::objsequence::get_elements

pub fn get_elements<'a>(
    obj: &'a PyObjectRef
) -> impl Deref<Target = Vec<PyObjectRef>> + 'a
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/fn.get_elements_cell.html b/rustpython_vm/obj/objsequence/fn.get_elements_cell.html new file mode 100644 index 0000000..7d15a4d --- /dev/null +++ b/rustpython_vm/obj/objsequence/fn.get_elements_cell.html @@ -0,0 +1 @@ +rustpython_vm::obj::objsequence::get_elements_cell - Rust

[][src]Function rustpython_vm::obj::objsequence::get_elements_cell

pub fn get_elements_cell<'a>(
    obj: &'a PyObjectRef
) -> &'a RefCell<Vec<PyObjectRef>>
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/fn.get_item.html b/rustpython_vm/obj/objsequence/fn.get_item.html index be5e819..ccfe08d 100644 --- a/rustpython_vm/obj/objsequence/fn.get_item.html +++ b/rustpython_vm/obj/objsequence/fn.get_item.html @@ -1 +1 @@ -rustpython_vm::obj::objsequence::get_item - Rust

[][src]Function rustpython_vm::obj::objsequence::get_item

pub fn get_item(
    vm: &mut VirtualMachine,
    sequence: &PyObjectRef,
    elements: &[PyObjectRef],
    subscript: PyObjectRef
) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objsequence::get_item - Rust

[][src]Function rustpython_vm::obj::objsequence::get_item

pub fn get_item(
    vm: &VirtualMachine,
    sequence: &PyObjectRef,
    elements: &[PyObjectRef],
    subscript: PyObjectRef
) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/fn.get_mut_elements.html b/rustpython_vm/obj/objsequence/fn.get_mut_elements.html index a400407..d4f964b 100644 --- a/rustpython_vm/obj/objsequence/fn.get_mut_elements.html +++ b/rustpython_vm/obj/objsequence/fn.get_mut_elements.html @@ -1 +1 @@ -rustpython_vm::obj::objsequence::get_mut_elements - Rust

[][src]Function rustpython_vm::obj::objsequence::get_mut_elements

pub fn get_mut_elements<'a>(
    obj: &'a PyObjectRef
) -> impl DerefMut<Target = Vec<PyObjectRef>> + 'a
\ No newline at end of file +rustpython_vm::obj::objsequence::get_mut_elements - Rust

[][src]Function rustpython_vm::obj::objsequence::get_mut_elements

pub fn get_mut_elements<'a>(
    obj: &'a PyObjectRef
) -> impl DerefMut<Target = Vec<PyObjectRef>> + 'a
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/fn.seq_equal.html b/rustpython_vm/obj/objsequence/fn.seq_equal.html index 9ccfca0..fb16f95 100644 --- a/rustpython_vm/obj/objsequence/fn.seq_equal.html +++ b/rustpython_vm/obj/objsequence/fn.seq_equal.html @@ -1 +1 @@ -rustpython_vm::obj::objsequence::seq_equal - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_equal

pub fn seq_equal(
    vm: &mut VirtualMachine,
    zelf: &[PyObjectRef],
    other: &[PyObjectRef]
) -> Result<bool, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objsequence::seq_equal - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_equal

pub fn seq_equal(
    vm: &VirtualMachine,
    zelf: &[PyObjectRef],
    other: &[PyObjectRef]
) -> Result<bool, PyObjectRef>
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/fn.seq_ge.html b/rustpython_vm/obj/objsequence/fn.seq_ge.html index fe3802a..0199d8e 100644 --- a/rustpython_vm/obj/objsequence/fn.seq_ge.html +++ b/rustpython_vm/obj/objsequence/fn.seq_ge.html @@ -1 +1 @@ -rustpython_vm::obj::objsequence::seq_ge - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_ge

pub fn seq_ge(
    vm: &mut VirtualMachine,
    zelf: &[PyObjectRef],
    other: &[PyObjectRef]
) -> Result<bool, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objsequence::seq_ge - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_ge

pub fn seq_ge(
    vm: &VirtualMachine,
    zelf: &[PyObjectRef],
    other: &[PyObjectRef]
) -> Result<bool, PyObjectRef>
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/fn.seq_gt.html b/rustpython_vm/obj/objsequence/fn.seq_gt.html index c397375..98516e2 100644 --- a/rustpython_vm/obj/objsequence/fn.seq_gt.html +++ b/rustpython_vm/obj/objsequence/fn.seq_gt.html @@ -1 +1 @@ -rustpython_vm::obj::objsequence::seq_gt - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_gt

pub fn seq_gt(
    vm: &mut VirtualMachine,
    zelf: &[PyObjectRef],
    other: &[PyObjectRef]
) -> Result<bool, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objsequence::seq_gt - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_gt

pub fn seq_gt(
    vm: &VirtualMachine,
    zelf: &[PyObjectRef],
    other: &[PyObjectRef]
) -> Result<bool, PyObjectRef>
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/fn.seq_le.html b/rustpython_vm/obj/objsequence/fn.seq_le.html index a10d2dc..4e20d6d 100644 --- a/rustpython_vm/obj/objsequence/fn.seq_le.html +++ b/rustpython_vm/obj/objsequence/fn.seq_le.html @@ -1 +1 @@ -rustpython_vm::obj::objsequence::seq_le - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_le

pub fn seq_le(
    vm: &mut VirtualMachine,
    zelf: &[PyObjectRef],
    other: &[PyObjectRef]
) -> Result<bool, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objsequence::seq_le - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_le

pub fn seq_le(
    vm: &VirtualMachine,
    zelf: &[PyObjectRef],
    other: &[PyObjectRef]
) -> Result<bool, PyObjectRef>
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/fn.seq_lt.html b/rustpython_vm/obj/objsequence/fn.seq_lt.html index 494710f..d5e5e36 100644 --- a/rustpython_vm/obj/objsequence/fn.seq_lt.html +++ b/rustpython_vm/obj/objsequence/fn.seq_lt.html @@ -1 +1 @@ -rustpython_vm::obj::objsequence::seq_lt - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_lt

pub fn seq_lt(
    vm: &mut VirtualMachine,
    zelf: &[PyObjectRef],
    other: &[PyObjectRef]
) -> Result<bool, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objsequence::seq_lt - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_lt

pub fn seq_lt(
    vm: &VirtualMachine,
    zelf: &[PyObjectRef],
    other: &[PyObjectRef]
) -> Result<bool, PyObjectRef>
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/fn.seq_mul.html b/rustpython_vm/obj/objsequence/fn.seq_mul.html index 2e8cdee..58fe811 100644 --- a/rustpython_vm/obj/objsequence/fn.seq_mul.html +++ b/rustpython_vm/obj/objsequence/fn.seq_mul.html @@ -1 +1 @@ -rustpython_vm::obj::objsequence::seq_mul - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_mul

pub fn seq_mul(
    elements: &[PyObjectRef],
    product: &PyObjectRef
) -> Vec<PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objsequence::seq_mul - Rust

[][src]Function rustpython_vm::obj::objsequence::seq_mul

pub fn seq_mul(elements: &[PyObjectRef], counter: isize) -> Vec<PyObjectRef>
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/get_elements_cell.v.html b/rustpython_vm/obj/objsequence/get_elements_cell.v.html new file mode 100644 index 0000000..84301f4 --- /dev/null +++ b/rustpython_vm/obj/objsequence/get_elements_cell.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.get_elements_cell.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/index.html b/rustpython_vm/obj/objsequence/index.html index ef63c63..461fce5 100644 --- a/rustpython_vm/obj/objsequence/index.html +++ b/rustpython_vm/obj/objsequence/index.html @@ -1,3 +1,3 @@ -rustpython_vm::obj::objsequence - Rust

[][src]Module rustpython_vm::obj::objsequence

Traits

+rustpython_vm::obj::objsequence - Rust

[][src]Module rustpython_vm::obj::objsequence

Traits

PySliceableSequence

Functions

-
get_elements
get_item
get_mut_elements
seq_equal
seq_ge
seq_gt
seq_le
seq_lt
seq_mul
\ No newline at end of file +
get_elements
get_elements_cell
get_item
get_mut_elements
seq_equal
seq_ge
seq_gt
seq_le
seq_lt
seq_mul
\ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/sidebar-items.js b/rustpython_vm/obj/objsequence/sidebar-items.js index 49ed434..9beb22e 100644 --- a/rustpython_vm/obj/objsequence/sidebar-items.js +++ b/rustpython_vm/obj/objsequence/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["get_elements",""],["get_item",""],["get_mut_elements",""],["seq_equal",""],["seq_ge",""],["seq_gt",""],["seq_le",""],["seq_lt",""],["seq_mul",""]],"trait":[["PySliceableSequence",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_elements",""],["get_elements_cell",""],["get_item",""],["get_mut_elements",""],["seq_equal",""],["seq_ge",""],["seq_gt",""],["seq_le",""],["seq_lt",""],["seq_mul",""]],"trait":[["PySliceableSequence",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objsequence/trait.PySliceableSequence.html b/rustpython_vm/obj/objsequence/trait.PySliceableSequence.html index 5023f18..8d1d289 100644 --- a/rustpython_vm/obj/objsequence/trait.PySliceableSequence.html +++ b/rustpython_vm/obj/objsequence/trait.PySliceableSequence.html @@ -1,4 +1,4 @@ -rustpython_vm::obj::objsequence::PySliceableSequence - Rust

[][src]Trait rustpython_vm::obj::objsequence::PySliceableSequence

pub trait PySliceableSequence {
+rustpython_vm::obj::objsequence::PySliceableSequence - Rust

[][src]Trait rustpython_vm::obj::objsequence::PySliceableSequence

pub trait PySliceableSequence {
     fn do_slice(&self, range: Range<usize>) -> Self;
 
fn do_slice_reverse(&self, range: Range<usize>) -> Self;
fn do_stepped_slice(&self, range: Range<usize>, step: usize) -> Self; @@ -10,22 +10,12 @@ fn get_pos(&self, p: i32) -> Option<usize> { ... }
fn get_slice_pos(&self, slice_pos: &BigInt) -> usize { ... }
fn get_slice_range(
        &self,
        start: &Option<BigInt>,
        stop: &Option<BigInt>
    ) -> Range<usize> { ... } -
fn get_slice_items(
        &self,
        vm: &mut VirtualMachine,
        slice: &PyObjectRef
    ) -> Result<Self, PyObjectRef>
    where
        Self: Sized
, +
fn get_slice_items(
        &self,
        vm: &VirtualMachine,
        slice: &PyObjectRef
    ) -> Result<Self, PyObjectRef>
    where
        Self: Sized
, { ... } }
-

- Required Methods -

-
-

-

- Provided Methods -

-
-

-

- Implementations on Foreign Types -

-

impl<T: Clone> PySliceableSequence for Vec<T>
[src]

impl PySliceableSequence for String
[src]

Implementors

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/obj/objset/PySet.t.html b/rustpython_vm/obj/objset/PySet.t.html new file mode 100644 index 0000000..85f1f3f --- /dev/null +++ b/rustpython_vm/obj/objset/PySet.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PySet.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objset/PySetRef.t.html b/rustpython_vm/obj/objset/PySetRef.t.html new file mode 100644 index 0000000..a24d67b --- /dev/null +++ b/rustpython_vm/obj/objset/PySetRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PySetRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objset/fn.get_elements.html b/rustpython_vm/obj/objset/fn.get_elements.html index bcb4616..1225984 100644 --- a/rustpython_vm/obj/objset/fn.get_elements.html +++ b/rustpython_vm/obj/objset/fn.get_elements.html @@ -1 +1 @@ -rustpython_vm::obj::objset::get_elements - Rust

[][src]Function rustpython_vm::obj::objset::get_elements

pub fn get_elements(obj: &PyObjectRef) -> HashMap<u64, PyObjectRef>
\ No newline at end of file +rustpython_vm::obj::objset::get_elements - Rust

[][src]Function rustpython_vm::obj::objset::get_elements

pub fn get_elements(obj: &PyObjectRef) -> HashMap<u64, PyObjectRef>
\ No newline at end of file diff --git a/rustpython_vm/obj/objset/fn.init.html b/rustpython_vm/obj/objset/fn.init.html index d74d4bc..9f20555 100644 --- a/rustpython_vm/obj/objset/fn.init.html +++ b/rustpython_vm/obj/objset/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objset::init - Rust

[][src]Function rustpython_vm::obj::objset::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objset::init - Rust

[][src]Function rustpython_vm::obj::objset::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objset/fn.set_contains.html b/rustpython_vm/obj/objset/fn.set_contains.html index eac0821..4361460 100644 --- a/rustpython_vm/obj/objset/fn.set_contains.html +++ b/rustpython_vm/obj/objset/fn.set_contains.html @@ -1 +1 @@ -rustpython_vm::obj::objset::set_contains - Rust

[][src]Function rustpython_vm::obj::objset::set_contains

pub fn set_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objset::set_contains - Rust

[][src]Function rustpython_vm::obj::objset::set_contains

pub fn set_contains(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objset/index.html b/rustpython_vm/obj/objset/index.html index 171be3e..04b973c 100644 --- a/rustpython_vm/obj/objset/index.html +++ b/rustpython_vm/obj/objset/index.html @@ -1,2 +1,4 @@ -rustpython_vm::obj::objset - Rust

[][src]Module rustpython_vm::obj::objset

Functions

-
get_elements
init
set_contains
\ No newline at end of file +rustpython_vm::obj::objset - Rust

[][src]Module rustpython_vm::obj::objset

Structs

+
PySet

Functions

+
get_elements
init
set_contains

Type Definitions

+
PySetRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objset/sidebar-items.js b/rustpython_vm/obj/objset/sidebar-items.js index 3d0bd33..8061fd7 100644 --- a/rustpython_vm/obj/objset/sidebar-items.js +++ b/rustpython_vm/obj/objset/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["get_elements",""],["init",""],["set_contains",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_elements",""],["init",""],["set_contains",""]],"struct":[["PySet",""]],"type":[["PySetRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objset/struct.PySet.html b/rustpython_vm/obj/objset/struct.PySet.html new file mode 100644 index 0000000..c5400a5 --- /dev/null +++ b/rustpython_vm/obj/objset/struct.PySet.html @@ -0,0 +1,13 @@ +rustpython_vm::obj::objset::PySet - Rust

[][src]Struct rustpython_vm::obj::objset::PySet

pub struct PySet { /* fields omitted */ }

Trait Implementations

impl PyValue for PySet[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Default for PySet[src]

impl Debug for PySet[src]

Auto Trait Implementations

impl !Send for PySet

impl !Sync for PySet

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objset/type.PySetRef.html b/rustpython_vm/obj/objset/type.PySetRef.html new file mode 100644 index 0000000..2e04d30 --- /dev/null +++ b/rustpython_vm/obj/objset/type.PySetRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objset::PySetRef - Rust

[][src]Type Definition rustpython_vm::obj::objset::PySetRef

type PySetRef = PyRef<PySet>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objslice/PySlice.t.html b/rustpython_vm/obj/objslice/PySlice.t.html new file mode 100644 index 0000000..28095a9 --- /dev/null +++ b/rustpython_vm/obj/objslice/PySlice.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PySlice.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objslice/fn.init.html b/rustpython_vm/obj/objslice/fn.init.html index eefb88a..d8cdc68 100644 --- a/rustpython_vm/obj/objslice/fn.init.html +++ b/rustpython_vm/obj/objslice/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objslice::init - Rust

[][src]Function rustpython_vm::obj::objslice::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objslice::init - Rust

[][src]Function rustpython_vm::obj::objslice::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objslice/index.html b/rustpython_vm/obj/objslice/index.html index f812e4c..13af248 100644 --- a/rustpython_vm/obj/objslice/index.html +++ b/rustpython_vm/obj/objslice/index.html @@ -1,2 +1,3 @@ -rustpython_vm::obj::objslice - Rust

[][src]Module rustpython_vm::obj::objslice

Functions

-
init
\ No newline at end of file +rustpython_vm::obj::objslice - Rust

[][src]Module rustpython_vm::obj::objslice

Structs

+
PySlice

Functions

+
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objslice/sidebar-items.js b/rustpython_vm/obj/objslice/sidebar-items.js index 7fc930a..1cecf38 100644 --- a/rustpython_vm/obj/objslice/sidebar-items.js +++ b/rustpython_vm/obj/objslice/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PySlice",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objslice/struct.PySlice.html b/rustpython_vm/obj/objslice/struct.PySlice.html new file mode 100644 index 0000000..6ed95d1 --- /dev/null +++ b/rustpython_vm/obj/objslice/struct.PySlice.html @@ -0,0 +1,17 @@ +rustpython_vm::obj::objslice::PySlice - Rust

[][src]Struct rustpython_vm::obj::objslice::PySlice

pub struct PySlice {
+    pub start: Option<BigInt>,
+    pub stop: Option<BigInt>,
+    pub step: Option<BigInt>,
+}

+ Fields

start: Option<BigInt>stop: Option<BigInt>step: Option<BigInt>

Trait Implementations

impl PyValue for PySlice[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PySlice[src]

Auto Trait Implementations

impl Send for PySlice

impl Sync for PySlice

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objstaticmethod/PyStaticMethod.t.html b/rustpython_vm/obj/objstaticmethod/PyStaticMethod.t.html new file mode 100644 index 0000000..714c780 --- /dev/null +++ b/rustpython_vm/obj/objstaticmethod/PyStaticMethod.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyStaticMethod.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objstaticmethod/PyStaticMethodRef.t.html b/rustpython_vm/obj/objstaticmethod/PyStaticMethodRef.t.html new file mode 100644 index 0000000..aa97e2d --- /dev/null +++ b/rustpython_vm/obj/objstaticmethod/PyStaticMethodRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyStaticMethodRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objstaticmethod/fn.init.html b/rustpython_vm/obj/objstaticmethod/fn.init.html new file mode 100644 index 0000000..266736b --- /dev/null +++ b/rustpython_vm/obj/objstaticmethod/fn.init.html @@ -0,0 +1 @@ +rustpython_vm::obj::objstaticmethod::init - Rust

[][src]Function rustpython_vm::obj::objstaticmethod::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objstaticmethod/index.html b/rustpython_vm/obj/objstaticmethod/index.html new file mode 100644 index 0000000..bcea11d --- /dev/null +++ b/rustpython_vm/obj/objstaticmethod/index.html @@ -0,0 +1,4 @@ +rustpython_vm::obj::objstaticmethod - Rust

[][src]Module rustpython_vm::obj::objstaticmethod

Structs

+
PyStaticMethod

Functions

+
init

Type Definitions

+
PyStaticMethodRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objstaticmethod/init.v.html b/rustpython_vm/obj/objstaticmethod/init.v.html new file mode 100644 index 0000000..3be617d --- /dev/null +++ b/rustpython_vm/obj/objstaticmethod/init.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.init.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objstaticmethod/sidebar-items.js b/rustpython_vm/obj/objstaticmethod/sidebar-items.js new file mode 100644 index 0000000..9ee76ed --- /dev/null +++ b/rustpython_vm/obj/objstaticmethod/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"fn":[["init",""]],"struct":[["PyStaticMethod",""]],"type":[["PyStaticMethodRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objstaticmethod/struct.PyStaticMethod.html b/rustpython_vm/obj/objstaticmethod/struct.PyStaticMethod.html new file mode 100644 index 0000000..f4b88bc --- /dev/null +++ b/rustpython_vm/obj/objstaticmethod/struct.PyStaticMethod.html @@ -0,0 +1,20 @@ +rustpython_vm::obj::objstaticmethod::PyStaticMethod - Rust

[][src]Struct rustpython_vm::obj::objstaticmethod::PyStaticMethod

pub struct PyStaticMethod {
+    pub callable: PyObjectRef,
+}

+ Fields

callable: PyObjectRef

Trait Implementations

impl PyValue for PyStaticMethod[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Clone for PyStaticMethod[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Debug for PyStaticMethod[src]

Auto Trait Implementations

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objstaticmethod/type.PyStaticMethodRef.html b/rustpython_vm/obj/objstaticmethod/type.PyStaticMethodRef.html new file mode 100644 index 0000000..4cf8dfc --- /dev/null +++ b/rustpython_vm/obj/objstaticmethod/type.PyStaticMethodRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objstaticmethod::PyStaticMethodRef - Rust

[][src]Type Definition rustpython_vm::obj::objstaticmethod::PyStaticMethodRef

type PyStaticMethodRef = PyRef<PyStaticMethod>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objstr/PyString.t.html b/rustpython_vm/obj/objstr/PyString.t.html new file mode 100644 index 0000000..78da134 --- /dev/null +++ b/rustpython_vm/obj/objstr/PyString.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyString.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objstr/PyStringRef.t.html b/rustpython_vm/obj/objstr/PyStringRef.t.html new file mode 100644 index 0000000..c0635b3 --- /dev/null +++ b/rustpython_vm/obj/objstr/PyStringRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyStringRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objstr/fn.borrow_value.html b/rustpython_vm/obj/objstr/fn.borrow_value.html index e8ac832..ba8aeaf 100644 --- a/rustpython_vm/obj/objstr/fn.borrow_value.html +++ b/rustpython_vm/obj/objstr/fn.borrow_value.html @@ -1 +1 @@ -rustpython_vm::obj::objstr::borrow_value - Rust

[][src]Function rustpython_vm::obj::objstr::borrow_value

pub fn borrow_value(obj: &PyObjectRef) -> Ref<str>
\ No newline at end of file +rustpython_vm::obj::objstr::borrow_value - Rust

[][src]Function rustpython_vm::obj::objstr::borrow_value

pub fn borrow_value(obj: &PyObjectRef) -> &str
\ No newline at end of file diff --git a/rustpython_vm/obj/objstr/fn.get_value.html b/rustpython_vm/obj/objstr/fn.get_value.html index 0545d13..c0177d4 100644 --- a/rustpython_vm/obj/objstr/fn.get_value.html +++ b/rustpython_vm/obj/objstr/fn.get_value.html @@ -1 +1 @@ -rustpython_vm::obj::objstr::get_value - Rust

[][src]Function rustpython_vm::obj::objstr::get_value

pub fn get_value(obj: &PyObjectRef) -> String
\ No newline at end of file +rustpython_vm::obj::objstr::get_value - Rust

[][src]Function rustpython_vm::obj::objstr::get_value

pub fn get_value(obj: &PyObjectRef) -> String
\ No newline at end of file diff --git a/rustpython_vm/obj/objstr/fn.init.html b/rustpython_vm/obj/objstr/fn.init.html index 56c5bd9..7d5c094 100644 --- a/rustpython_vm/obj/objstr/fn.init.html +++ b/rustpython_vm/obj/objstr/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objstr::init - Rust

[][src]Function rustpython_vm::obj::objstr::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objstr::init - Rust

[][src]Function rustpython_vm::obj::objstr::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objstr/fn.subscript.html b/rustpython_vm/obj/objstr/fn.subscript.html index 1676231..46bcd75 100644 --- a/rustpython_vm/obj/objstr/fn.subscript.html +++ b/rustpython_vm/obj/objstr/fn.subscript.html @@ -1 +1 @@ -rustpython_vm::obj::objstr::subscript - Rust

[][src]Function rustpython_vm::obj::objstr::subscript

pub fn subscript(
    vm: &mut VirtualMachine,
    value: &str,
    b: PyObjectRef
) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objstr::subscript - Rust

[][src]Function rustpython_vm::obj::objstr::subscript

pub fn subscript(vm: &VirtualMachine, value: &str, b: PyObjectRef) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objstr/index.html b/rustpython_vm/obj/objstr/index.html index ee684f0..9a6397b 100644 --- a/rustpython_vm/obj/objstr/index.html +++ b/rustpython_vm/obj/objstr/index.html @@ -1,2 +1,4 @@ -rustpython_vm::obj::objstr - Rust

[][src]Module rustpython_vm::obj::objstr

Functions

-
borrow_value
get_value
init
subscript
\ No newline at end of file +rustpython_vm::obj::objstr - Rust

[][src]Module rustpython_vm::obj::objstr

Structs

+
PyString

Functions

+
borrow_value
get_value
init
subscript

Type Definitions

+
PyStringRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objstr/sidebar-items.js b/rustpython_vm/obj/objstr/sidebar-items.js index b300340..04c0e69 100644 --- a/rustpython_vm/obj/objstr/sidebar-items.js +++ b/rustpython_vm/obj/objstr/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["borrow_value",""],["get_value",""],["init",""],["subscript",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["borrow_value",""],["get_value",""],["init",""],["subscript",""]],"struct":[["PyString",""]],"type":[["PyStringRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objstr/struct.PyString.html b/rustpython_vm/obj/objstr/struct.PyString.html new file mode 100644 index 0000000..c00921a --- /dev/null +++ b/rustpython_vm/obj/objstr/struct.PyString.html @@ -0,0 +1,22 @@ +rustpython_vm::obj::objstr::PyString - Rust

[][src]Struct rustpython_vm::obj::objstr::PyString

pub struct PyString {
+    pub value: String,
+}

+ Fields

value: String

Trait Implementations

impl TryIntoRef<PyString> for String[src]

impl<'_> TryIntoRef<PyString> for &'_ str[src]

impl PyValue for PyString[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Clone for PyString[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Debug for PyString[src]

impl Display for PyString[src]

Auto Trait Implementations

impl Send for PyString

impl Sync for PyString

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objstr/type.PyStringRef.html b/rustpython_vm/obj/objstr/type.PyStringRef.html new file mode 100644 index 0000000..5ff5aa4 --- /dev/null +++ b/rustpython_vm/obj/objstr/type.PyStringRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objstr::PyStringRef - Rust

[][src]Type Definition rustpython_vm::obj::objstr::PyStringRef

type PyStringRef = PyRef<PyString>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objsuper/PySuper.t.html b/rustpython_vm/obj/objsuper/PySuper.t.html new file mode 100644 index 0000000..e9b3d86 --- /dev/null +++ b/rustpython_vm/obj/objsuper/PySuper.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PySuper.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objsuper/fn.init.html b/rustpython_vm/obj/objsuper/fn.init.html index c479cb1..ed373c8 100644 --- a/rustpython_vm/obj/objsuper/fn.init.html +++ b/rustpython_vm/obj/objsuper/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objsuper::init - Rust

[][src]Function rustpython_vm::obj::objsuper::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objsuper::init - Rust

[][src]Function rustpython_vm::obj::objsuper::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objsuper/index.html b/rustpython_vm/obj/objsuper/index.html index e75acd2..ddbf7bb 100644 --- a/rustpython_vm/obj/objsuper/index.html +++ b/rustpython_vm/obj/objsuper/index.html @@ -1,5 +1,6 @@ -rustpython_vm::obj::objsuper - Rust

[][src]Module rustpython_vm::obj::objsuper

Python super class.

+rustpython_vm::obj::objsuper - Rust

[][src]Module rustpython_vm::obj::objsuper

Python super class.

See also:

https://github.com/python/cpython/blob/50b48572d9a90c5bb36e2bef6179548ea927a35a/Objects/typeobject.c#L7663

-

Functions

-
init
\ No newline at end of file +

Structs

+
PySuper

Functions

+
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objsuper/sidebar-items.js b/rustpython_vm/obj/objsuper/sidebar-items.js index 7fc930a..02ada4e 100644 --- a/rustpython_vm/obj/objsuper/sidebar-items.js +++ b/rustpython_vm/obj/objsuper/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PySuper",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objsuper/struct.PySuper.html b/rustpython_vm/obj/objsuper/struct.PySuper.html new file mode 100644 index 0000000..f45971e --- /dev/null +++ b/rustpython_vm/obj/objsuper/struct.PySuper.html @@ -0,0 +1,12 @@ +rustpython_vm::obj::objsuper::PySuper - Rust

[][src]Struct rustpython_vm::obj::objsuper::PySuper

pub struct PySuper { /* fields omitted */ }

Trait Implementations

impl PyValue for PySuper[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PySuper[src]

Auto Trait Implementations

impl !Send for PySuper

impl !Sync for PySuper

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objtuple/PyTuple.t.html b/rustpython_vm/obj/objtuple/PyTuple.t.html new file mode 100644 index 0000000..2642b2f --- /dev/null +++ b/rustpython_vm/obj/objtuple/PyTuple.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyTuple.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objtuple/PyTupleRef.t.html b/rustpython_vm/obj/objtuple/PyTupleRef.t.html new file mode 100644 index 0000000..7dfe728 --- /dev/null +++ b/rustpython_vm/obj/objtuple/PyTupleRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyTupleRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objtuple/fn.init.html b/rustpython_vm/obj/objtuple/fn.init.html index 00e5a09..f2b90d7 100644 --- a/rustpython_vm/obj/objtuple/fn.init.html +++ b/rustpython_vm/obj/objtuple/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objtuple::init - Rust

[][src]Function rustpython_vm::obj::objtuple::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objtuple::init - Rust

[][src]Function rustpython_vm::obj::objtuple::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objtuple/index.html b/rustpython_vm/obj/objtuple/index.html index 324e039..06b7c46 100644 --- a/rustpython_vm/obj/objtuple/index.html +++ b/rustpython_vm/obj/objtuple/index.html @@ -1,2 +1,4 @@ -rustpython_vm::obj::objtuple - Rust

[][src]Module rustpython_vm::obj::objtuple

Functions

-
init
tuple_contains
tuple_index
\ No newline at end of file +rustpython_vm::obj::objtuple - Rust

[][src]Module rustpython_vm::obj::objtuple

Structs

+
PyTuple

Functions

+
init

Type Definitions

+
PyTupleRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objtuple/sidebar-items.js b/rustpython_vm/obj/objtuple/sidebar-items.js index 9924ab4..0416966 100644 --- a/rustpython_vm/obj/objtuple/sidebar-items.js +++ b/rustpython_vm/obj/objtuple/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""],["tuple_contains",""],["tuple_index",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PyTuple",""]],"type":[["PyTupleRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objtuple/struct.PyTuple.html b/rustpython_vm/obj/objtuple/struct.PyTuple.html new file mode 100644 index 0000000..cec6544 --- /dev/null +++ b/rustpython_vm/obj/objtuple/struct.PyTuple.html @@ -0,0 +1,17 @@ +rustpython_vm::obj::objtuple::PyTuple - Rust

[][src]Struct rustpython_vm::obj::objtuple::PyTuple

pub struct PyTuple {
+    pub elements: RefCell<Vec<PyObjectRef>>,
+}

+ Fields

elements: RefCell<Vec<PyObjectRef>>

Trait Implementations

impl PyValue for PyTuple[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Default for PyTuple[src]

impl From<Vec<Rc<PyObject>>> for PyTuple[src]

impl Debug for PyTuple[src]

Auto Trait Implementations

impl !Send for PyTuple

impl !Sync for PyTuple

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objtuple/type.PyTupleRef.html b/rustpython_vm/obj/objtuple/type.PyTupleRef.html new file mode 100644 index 0000000..fd599f5 --- /dev/null +++ b/rustpython_vm/obj/objtuple/type.PyTupleRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objtuple::PyTupleRef - Rust

[][src]Type Definition rustpython_vm::obj::objtuple::PyTupleRef

type PyTupleRef = PyRef<PyTuple>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/PyClass.t.html b/rustpython_vm/obj/objtype/PyClass.t.html new file mode 100644 index 0000000..2a7e138 --- /dev/null +++ b/rustpython_vm/obj/objtype/PyClass.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyClass.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objtype/PyClassRef.t.html b/rustpython_vm/obj/objtype/PyClassRef.t.html new file mode 100644 index 0000000..28ac15b --- /dev/null +++ b/rustpython_vm/obj/objtype/PyClassRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyClassRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objtype/fn.get_attributes.html b/rustpython_vm/obj/objtype/fn.get_attributes.html index e3cbdcf..0ce55e2 100644 --- a/rustpython_vm/obj/objtype/fn.get_attributes.html +++ b/rustpython_vm/obj/objtype/fn.get_attributes.html @@ -1 +1 @@ -rustpython_vm::obj::objtype::get_attributes - Rust

[][src]Function rustpython_vm::obj::objtype::get_attributes

pub fn get_attributes(obj: &PyObjectRef) -> PyAttributes
\ No newline at end of file +rustpython_vm::obj::objtype::get_attributes - Rust

[][src]Function rustpython_vm::obj::objtype::get_attributes

pub fn get_attributes(cls: PyClassRef) -> PyAttributes
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/fn.get_type_name.html b/rustpython_vm/obj/objtype/fn.get_type_name.html index a924dfd..5238902 100644 --- a/rustpython_vm/obj/objtype/fn.get_type_name.html +++ b/rustpython_vm/obj/objtype/fn.get_type_name.html @@ -1 +1 @@ -rustpython_vm::obj::objtype::get_type_name - Rust

[][src]Function rustpython_vm::obj::objtype::get_type_name

pub fn get_type_name(typ: &PyObjectRef) -> String
\ No newline at end of file +rustpython_vm::obj::objtype::get_type_name - Rust

[][src]Function rustpython_vm::obj::objtype::get_type_name

pub fn get_type_name(typ: &PyObjectRef) -> String
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/fn.init.html b/rustpython_vm/obj/objtype/fn.init.html index b19ed1c..56bda0c 100644 --- a/rustpython_vm/obj/objtype/fn.init.html +++ b/rustpython_vm/obj/objtype/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objtype::init - Rust

[][src]Function rustpython_vm::obj::objtype::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objtype::init - Rust

[][src]Function rustpython_vm::obj::objtype::init

pub fn init(ctx: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/fn.isinstance.html b/rustpython_vm/obj/objtype/fn.isinstance.html index 0c7a9ea..ee26a84 100644 --- a/rustpython_vm/obj/objtype/fn.isinstance.html +++ b/rustpython_vm/obj/objtype/fn.isinstance.html @@ -1 +1,3 @@ -rustpython_vm::obj::objtype::isinstance - Rust

[][src]Function rustpython_vm::obj::objtype::isinstance

pub fn isinstance(obj: &PyObjectRef, cls: &PyObjectRef) -> bool
\ No newline at end of file +rustpython_vm::obj::objtype::isinstance - Rust

[][src]Function rustpython_vm::obj::objtype::isinstance

pub fn isinstance(obj: &PyObjectRef, cls: &PyObjectRef) -> bool

Determines if obj actually an instance of cls, this doesn't call instancecheck, so only +use this if cls is known to have not overridden the base instancecheck magic method.

+
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/fn.issubclass.html b/rustpython_vm/obj/objtype/fn.issubclass.html index e68688f..627edd0 100644 --- a/rustpython_vm/obj/objtype/fn.issubclass.html +++ b/rustpython_vm/obj/objtype/fn.issubclass.html @@ -1 +1,4 @@ -rustpython_vm::obj::objtype::issubclass - Rust

[][src]Function rustpython_vm::obj::objtype::issubclass

pub fn issubclass(typ: &PyObjectRef, cls: &PyObjectRef) -> bool
\ No newline at end of file +rustpython_vm::obj::objtype::issubclass - Rust

[][src]Function rustpython_vm::obj::objtype::issubclass

pub fn issubclass(subclass: &PyObjectRef, cls: &PyObjectRef) -> bool

Determines if subclass is actually a subclass of cls, this doesn't call subclasscheck, +so only use this if cls is known to have not overridden the base subclasscheck magic +method.

+
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/fn.new.html b/rustpython_vm/obj/objtype/fn.new.html index af913d4..2b6dad8 100644 --- a/rustpython_vm/obj/objtype/fn.new.html +++ b/rustpython_vm/obj/objtype/fn.new.html @@ -1 +1 @@ -rustpython_vm::obj::objtype::new - Rust

[][src]Function rustpython_vm::obj::objtype::new

pub fn new(
    typ: PyObjectRef,
    name: &str,
    bases: Vec<PyObjectRef>,
    dict: HashMap<String, PyObjectRef>
) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objtype::new - Rust

[][src]Function rustpython_vm::obj::objtype::new

pub fn new(
    typ: PyObjectRef,
    name: &str,
    bases: Vec<PyClassRef>,
    dict: HashMap<String, PyObjectRef>
) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/fn.type_call.html b/rustpython_vm/obj/objtype/fn.type_call.html index 5c4e088..c813bd3 100644 --- a/rustpython_vm/obj/objtype/fn.type_call.html +++ b/rustpython_vm/obj/objtype/fn.type_call.html @@ -1 +1 @@ -rustpython_vm::obj::objtype::type_call - Rust

[][src]Function rustpython_vm::obj::objtype::type_call

pub fn type_call(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objtype::type_call - Rust

[][src]Function rustpython_vm::obj::objtype::type_call

pub fn type_call(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/fn.type_getattribute.html b/rustpython_vm/obj/objtype/fn.type_getattribute.html index 915ca2e..8fb3bd6 100644 --- a/rustpython_vm/obj/objtype/fn.type_getattribute.html +++ b/rustpython_vm/obj/objtype/fn.type_getattribute.html @@ -1 +1 @@ -rustpython_vm::obj::objtype::type_getattribute - Rust

[][src]Function rustpython_vm::obj::objtype::type_getattribute

pub fn type_getattribute(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objtype::type_getattribute - Rust

[][src]Function rustpython_vm::obj::objtype::type_getattribute

pub fn type_getattribute(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/fn.type_new.html b/rustpython_vm/obj/objtype/fn.type_new.html index c26e59d..300ecfe 100644 --- a/rustpython_vm/obj/objtype/fn.type_new.html +++ b/rustpython_vm/obj/objtype/fn.type_new.html @@ -1 +1 @@ -rustpython_vm::obj::objtype::type_new - Rust

[][src]Function rustpython_vm::obj::objtype::type_new

pub fn type_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file +rustpython_vm::obj::objtype::type_new - Rust

[][src]Function rustpython_vm::obj::objtype::type_new

pub fn type_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/fn.type_new_class.html b/rustpython_vm/obj/objtype/fn.type_new_class.html new file mode 100644 index 0000000..6009535 --- /dev/null +++ b/rustpython_vm/obj/objtype/fn.type_new_class.html @@ -0,0 +1 @@ +rustpython_vm::obj::objtype::type_new_class - Rust

[][src]Function rustpython_vm::obj::objtype::type_new_class

pub fn type_new_class(
    vm: &VirtualMachine,
    typ: &PyObjectRef,
    name: &PyObjectRef,
    bases: &PyObjectRef,
    dict: &PyObjectRef
) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/index.html b/rustpython_vm/obj/objtype/index.html index 907e2b1..a6f890d 100644 --- a/rustpython_vm/obj/objtype/index.html +++ b/rustpython_vm/obj/objtype/index.html @@ -1,2 +1,9 @@ -rustpython_vm::obj::objtype - Rust

[][src]Module rustpython_vm::obj::objtype

Functions

-
base_classes
create_type
get_attributes
get_type_name
init
isinstance
issubclass
new
type_call
type_getattribute
type_new
\ No newline at end of file +rustpython_vm::obj::objtype - Rust

[][src]Module rustpython_vm::obj::objtype

Structs

+
PyClass

Functions

+
get_attributes
get_type_name
init
isinstance

Determines if obj actually an instance of cls, this doesn't call instancecheck, so only +use this if cls is known to have not overridden the base instancecheck magic method.

+
issubclass

Determines if subclass is actually a subclass of cls, this doesn't call subclasscheck, +so only use this if cls is known to have not overridden the base subclasscheck magic +method.

+
new
type_call
type_getattribute
type_new
type_new_class

Type Definitions

+
PyClassRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/sidebar-items.js b/rustpython_vm/obj/objtype/sidebar-items.js index 410d9b6..f69dcdc 100644 --- a/rustpython_vm/obj/objtype/sidebar-items.js +++ b/rustpython_vm/obj/objtype/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["base_classes",""],["create_type",""],["get_attributes",""],["get_type_name",""],["init",""],["isinstance",""],["issubclass",""],["new",""],["type_call",""],["type_getattribute",""],["type_new",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_attributes",""],["get_type_name",""],["init",""],["isinstance","Determines if `obj` actually an instance of `cls`, this doesn't call instancecheck, so only use this if `cls` is known to have not overridden the base instancecheck magic method."],["issubclass","Determines if `subclass` is actually a subclass of `cls`, this doesn't call subclasscheck, so only use this if `cls` is known to have not overridden the base subclasscheck magic method."],["new",""],["type_call",""],["type_getattribute",""],["type_new",""],["type_new_class",""]],"struct":[["PyClass",""]],"type":[["PyClassRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objtype/struct.PyClass.html b/rustpython_vm/obj/objtype/struct.PyClass.html new file mode 100644 index 0000000..eaee683 --- /dev/null +++ b/rustpython_vm/obj/objtype/struct.PyClass.html @@ -0,0 +1,23 @@ +rustpython_vm::obj::objtype::PyClass - Rust

[][src]Struct rustpython_vm::obj::objtype::PyClass

pub struct PyClass {
+    pub name: String,
+    pub mro: Vec<PyClassRef>,
+}

+ Fields

name: Stringmro: Vec<PyClassRef>

Trait Implementations

impl PyValue for PyClass[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Clone for PyClass[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl Debug for PyClass[src]

impl Display for PyClass[src]

Auto Trait Implementations

impl !Send for PyClass

impl !Sync for PyClass

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/type.PyClassRef.html b/rustpython_vm/obj/objtype/type.PyClassRef.html new file mode 100644 index 0000000..cb96e43 --- /dev/null +++ b/rustpython_vm/obj/objtype/type.PyClassRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objtype::PyClassRef - Rust

[][src]Type Definition rustpython_vm::obj::objtype::PyClassRef

type PyClassRef = PyRef<PyClass>;

Trait Implementations

impl IdProtocol for PyClassRef[src]

fn is<T>(&self, other: &T) -> bool where
    T: IdProtocol
[src]

impl TypeProtocol for PyClassRef[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objtype/type_new_class.v.html b/rustpython_vm/obj/objtype/type_new_class.v.html new file mode 100644 index 0000000..589a012 --- /dev/null +++ b/rustpython_vm/obj/objtype/type_new_class.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.type_new_class.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objweakref/PyWeak.t.html b/rustpython_vm/obj/objweakref/PyWeak.t.html new file mode 100644 index 0000000..4008b01 --- /dev/null +++ b/rustpython_vm/obj/objweakref/PyWeak.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyWeak.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objweakref/PyWeakRef.t.html b/rustpython_vm/obj/objweakref/PyWeakRef.t.html new file mode 100644 index 0000000..1f80bcd --- /dev/null +++ b/rustpython_vm/obj/objweakref/PyWeakRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to type.PyWeakRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objweakref/fn.init.html b/rustpython_vm/obj/objweakref/fn.init.html new file mode 100644 index 0000000..d9d62e3 --- /dev/null +++ b/rustpython_vm/obj/objweakref/fn.init.html @@ -0,0 +1 @@ +rustpython_vm::obj::objweakref::init - Rust

[][src]Function rustpython_vm::obj::objweakref::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objweakref/index.html b/rustpython_vm/obj/objweakref/index.html new file mode 100644 index 0000000..ca2a7f2 --- /dev/null +++ b/rustpython_vm/obj/objweakref/index.html @@ -0,0 +1,4 @@ +rustpython_vm::obj::objweakref - Rust

[][src]Module rustpython_vm::obj::objweakref

Structs

+
PyWeak

Functions

+
init

Type Definitions

+
PyWeakRef
\ No newline at end of file diff --git a/rustpython_vm/obj/objweakref/init.v.html b/rustpython_vm/obj/objweakref/init.v.html new file mode 100644 index 0000000..3be617d --- /dev/null +++ b/rustpython_vm/obj/objweakref/init.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.init.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objweakref/sidebar-items.js b/rustpython_vm/obj/objweakref/sidebar-items.js new file mode 100644 index 0000000..fbf5e46 --- /dev/null +++ b/rustpython_vm/obj/objweakref/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"fn":[["init",""]],"struct":[["PyWeak",""]],"type":[["PyWeakRef",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objweakref/struct.PyWeak.html b/rustpython_vm/obj/objweakref/struct.PyWeak.html new file mode 100644 index 0000000..dc1c9c9 --- /dev/null +++ b/rustpython_vm/obj/objweakref/struct.PyWeak.html @@ -0,0 +1,12 @@ +rustpython_vm::obj::objweakref::PyWeak - Rust

[][src]Struct rustpython_vm::obj::objweakref::PyWeak

pub struct PyWeak { /* fields omitted */ }

Methods

impl PyWeak[src]

Trait Implementations

impl PyValue for PyWeak[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyWeak[src]

Auto Trait Implementations

impl !Send for PyWeak

impl !Sync for PyWeak

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/objweakref/type.PyWeakRef.html b/rustpython_vm/obj/objweakref/type.PyWeakRef.html new file mode 100644 index 0000000..b770b9b --- /dev/null +++ b/rustpython_vm/obj/objweakref/type.PyWeakRef.html @@ -0,0 +1 @@ +rustpython_vm::obj::objweakref::PyWeakRef - Rust

[][src]Type Definition rustpython_vm::obj::objweakref::PyWeakRef

type PyWeakRef = PyRef<PyWeak>;
\ No newline at end of file diff --git a/rustpython_vm/obj/objzip/PyZip.t.html b/rustpython_vm/obj/objzip/PyZip.t.html new file mode 100644 index 0000000..d218849 --- /dev/null +++ b/rustpython_vm/obj/objzip/PyZip.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyZip.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/obj/objzip/fn.init.html b/rustpython_vm/obj/objzip/fn.init.html index 05c33c0..66ae66e 100644 --- a/rustpython_vm/obj/objzip/fn.init.html +++ b/rustpython_vm/obj/objzip/fn.init.html @@ -1 +1 @@ -rustpython_vm::obj::objzip::init - Rust

[][src]Function rustpython_vm::obj::objzip::init

pub fn init(context: &PyContext)
\ No newline at end of file +rustpython_vm::obj::objzip::init - Rust

[][src]Function rustpython_vm::obj::objzip::init

pub fn init(context: &PyContext)
\ No newline at end of file diff --git a/rustpython_vm/obj/objzip/index.html b/rustpython_vm/obj/objzip/index.html index 4872b82..a2e0c3b 100644 --- a/rustpython_vm/obj/objzip/index.html +++ b/rustpython_vm/obj/objzip/index.html @@ -1,2 +1,3 @@ -rustpython_vm::obj::objzip - Rust

[][src]Module rustpython_vm::obj::objzip

Functions

-
init
\ No newline at end of file +rustpython_vm::obj::objzip - Rust

[][src]Module rustpython_vm::obj::objzip

Structs

+
PyZip

Functions

+
init
\ No newline at end of file diff --git a/rustpython_vm/obj/objzip/sidebar-items.js b/rustpython_vm/obj/objzip/sidebar-items.js index 7fc930a..4ff260c 100644 --- a/rustpython_vm/obj/objzip/sidebar-items.js +++ b/rustpython_vm/obj/objzip/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["init",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["init",""]],"struct":[["PyZip",""]]}); \ No newline at end of file diff --git a/rustpython_vm/obj/objzip/struct.PyZip.html b/rustpython_vm/obj/objzip/struct.PyZip.html new file mode 100644 index 0000000..af09385 --- /dev/null +++ b/rustpython_vm/obj/objzip/struct.PyZip.html @@ -0,0 +1,12 @@ +rustpython_vm::obj::objzip::PyZip - Rust

[][src]Struct rustpython_vm::obj::objzip::PyZip

pub struct PyZip { /* fields omitted */ }

Trait Implementations

impl PyValue for PyZip[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyZip[src]

Auto Trait Implementations

impl !Send for PyZip

impl !Sync for PyZip

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/obj/sidebar-items.js b/rustpython_vm/obj/sidebar-items.js index b49f9c0..55d391d 100644 --- a/rustpython_vm/obj/sidebar-items.js +++ b/rustpython_vm/obj/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"mod":[["objbool",""],["objbytearray","Implementation of the python bytearray object."],["objbytes",""],["objcode","Infamous code object. The python class `code`"],["objcomplex",""],["objdict",""],["objenumerate",""],["objfilter",""],["objfloat",""],["objframe","The python `frame` type."],["objfunction",""],["objgenerator",""],["objint",""],["objiter",""],["objlist",""],["objmap",""],["objmemory",""],["objnone",""],["objobject",""],["objproperty","Python `property` descriptor class."],["objrange",""],["objsequence",""],["objset",""],["objslice",""],["objstr",""],["objsuper","Python `super` class."],["objtuple",""],["objtype",""],["objzip",""]]}); \ No newline at end of file +initSidebarItems({"mod":[["objbool",""],["objbuiltinfunc",""],["objbytearray","Implementation of the python bytearray object."],["objbytes",""],["objclassmethod",""],["objcode","Infamous code object. The python class `code`"],["objcomplex",""],["objdict",""],["objellipsis",""],["objenumerate",""],["objfilter",""],["objfloat",""],["objframe","The python `frame` type."],["objfunction",""],["objgenerator",""],["objint",""],["objiter",""],["objlist",""],["objmap",""],["objmemory",""],["objmodule",""],["objnone",""],["objobject",""],["objproperty","Python `property` descriptor class."],["objrange",""],["objsequence",""],["objset",""],["objslice",""],["objstaticmethod",""],["objstr",""],["objsuper","Python `super` class."],["objtuple",""],["objtype",""],["objweakref",""],["objzip",""]]}); \ No newline at end of file diff --git a/rustpython_vm/py_class.m.html b/rustpython_vm/py_class.m.html new file mode 100644 index 0000000..001b820 --- /dev/null +++ b/rustpython_vm/py_class.m.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to macro.py_class.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/py_module.m.html b/rustpython_vm/py_module.m.html new file mode 100644 index 0000000..b4477c4 --- /dev/null +++ b/rustpython_vm/py_module.m.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to macro.py_module.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/pyobject/IntoPyObject.t.html b/rustpython_vm/pyobject/IntoPyObject.t.html new file mode 100644 index 0000000..7580b06 --- /dev/null +++ b/rustpython_vm/pyobject/IntoPyObject.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to trait.IntoPyObject.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/pyobject/PyEllipsis.t.html b/rustpython_vm/pyobject/PyEllipsis.t.html new file mode 100644 index 0000000..6da6f01 --- /dev/null +++ b/rustpython_vm/pyobject/PyEllipsis.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyEllipsis.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/pyobject/PyIterable.t.html b/rustpython_vm/pyobject/PyIterable.t.html new file mode 100644 index 0000000..0dd56b1 --- /dev/null +++ b/rustpython_vm/pyobject/PyIterable.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyIterable.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/pyobject/PyIterator.t.html b/rustpython_vm/pyobject/PyIterator.t.html new file mode 100644 index 0000000..22398b3 --- /dev/null +++ b/rustpython_vm/pyobject/PyIterator.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyIterator.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/pyobject/PyIteratorValue.t.html b/rustpython_vm/pyobject/PyIteratorValue.t.html new file mode 100644 index 0000000..b015ea7 --- /dev/null +++ b/rustpython_vm/pyobject/PyIteratorValue.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyIteratorValue.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/pyobject/PyNotImplemented.t.html b/rustpython_vm/pyobject/PyNotImplemented.t.html new file mode 100644 index 0000000..bce5c37 --- /dev/null +++ b/rustpython_vm/pyobject/PyNotImplemented.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.PyNotImplemented.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/pyobject/PyValue.t.html b/rustpython_vm/pyobject/PyValue.t.html new file mode 100644 index 0000000..2baef8a --- /dev/null +++ b/rustpython_vm/pyobject/PyValue.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to trait.PyValue.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/pyobject/TryFromObject.t.html b/rustpython_vm/pyobject/TryFromObject.t.html new file mode 100644 index 0000000..5e1cb7d --- /dev/null +++ b/rustpython_vm/pyobject/TryFromObject.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to trait.TryFromObject.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/pyobject/TryIntoRef.t.html b/rustpython_vm/pyobject/TryIntoRef.t.html new file mode 100644 index 0000000..9506edd --- /dev/null +++ b/rustpython_vm/pyobject/TryIntoRef.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to trait.TryIntoRef.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/pyobject/fn.create_type.html b/rustpython_vm/pyobject/fn.create_type.html index 9fe4672..f63ed72 100644 --- a/rustpython_vm/pyobject/fn.create_type.html +++ b/rustpython_vm/pyobject/fn.create_type.html @@ -1 +1 @@ -rustpython_vm::pyobject::create_type - Rust

[][src]Function rustpython_vm::pyobject::create_type

pub fn create_type(
    name: &str,
    type_type: &PyObjectRef,
    base: &PyObjectRef,
    _dict_type: &PyObjectRef
) -> PyObjectRef
\ No newline at end of file +rustpython_vm::pyobject::create_type - Rust

[][src]Function rustpython_vm::pyobject::create_type

pub fn create_type(
    name: &str,
    type_type: &PyObjectRef,
    base: &PyObjectRef
) -> PyObjectRef
\ No newline at end of file diff --git a/rustpython_vm/pyobject/index.html b/rustpython_vm/pyobject/index.html index 9f451e3..a98a02d 100644 --- a/rustpython_vm/pyobject/index.html +++ b/rustpython_vm/pyobject/index.html @@ -1,17 +1,15 @@ -rustpython_vm::pyobject - Rust

[][src]Module rustpython_vm::pyobject

Structs

-
PyContext
PyFuncArgs

The PyFuncArgs struct is one of the most used structs then creating -a rust function that can be called from python. It holds both positional -arguments, as well as keyword arguments passed to the function.

-
PyObject

This is an actual python object. It consists of a typ which is the +rustpython_vm::pyobject - Rust

[][src]Module rustpython_vm::pyobject

Structs

+
PyContext
PyEllipsis
PyIterable

An iterable Python object.

+
PyIterator
PyIteratorValue
PyNotImplemented
PyObject

This is an actual python object. It consists of a typ which is the python class, and carries some rust payload optionally. This rust payload can be a rust float or rust int in case of float and int objects.

-
Scope

Enums

-
PyObjectPayload

Rather than determining the type of a python object, this enum is more -a holder for the rust payload of a python object. It is more a carrier -of rust data for a particular python object. Determine the python type -by using for example the .typ() method on a python object.

+
PyRef

A reference to a Python object.

Traits

-
AttributeProtocol
BufferProtocol
DictProtocol
FromPyObjectRef
IdProtocol
ParentProtocol
TypeProtocol

Functions

+
AttributeProtocol
BufferProtocol
DictProtocol
FromPyObjectRef
IdProtocol
IntoPyObject

Implemented by any type that can be returned from a built-in Python function.

+
PyObjectPayload
PyValue
TryFromObject

Implemented by any type that can be created from a Python object.

+
TryIntoRef

Allows coercion of a types into PyRefs, so that we can write functions that can take +refs, pyobject refs or basic types.

+
TypeProtocol

Functions

create_type

Type Definitions

PyAttributes

For attributes we do not use a dict, but a hashmap. This is probably faster, unordered, and only supports strings as keys.

@@ -20,8 +18,7 @@ this reference counting is accounted for by this type. Use the .clone() method to create a new reference and increment the amount of references to the python object by 1.

-
PyObjectWeakRef

Same as PyObjectRef, except for being a weak reference.

-
PyRef
PyResult

Use this type for function which return a python object or and exception. +

PyResult

Use this type for function which return a python object or and exception. Both the python object and the python exception are PyObjectRef types since exceptions are also python objects.

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/pyobject/sidebar-items.js b/rustpython_vm/pyobject/sidebar-items.js index 249fbe0..9144ed5 100644 --- a/rustpython_vm/pyobject/sidebar-items.js +++ b/rustpython_vm/pyobject/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"enum":[["PyObjectPayload","Rather than determining the type of a python object, this enum is more a holder for the rust payload of a python object. It is more a carrier of rust data for a particular python object. Determine the python type by using for example the `.typ()` method on a python object."]],"fn":[["create_type",""]],"struct":[["PyContext",""],["PyFuncArgs","The `PyFuncArgs` struct is one of the most used structs then creating a rust function that can be called from python. It holds both positional arguments, as well as keyword arguments passed to the function."],["PyObject","This is an actual python object. It consists of a `typ` which is the python class, and carries some rust payload optionally. This rust payload can be a rust float or rust int in case of float and int objects."],["Scope",""]],"trait":[["AttributeProtocol",""],["BufferProtocol",""],["DictProtocol",""],["FromPyObjectRef",""],["IdProtocol",""],["ParentProtocol",""],["TypeProtocol",""]],"type":[["PyAttributes","For attributes we do not use a dict, but a hashmap. This is probably faster, unordered, and only supports strings as keys."],["PyObjectRef","The `PyObjectRef` is one of the most used types. It is a reference to a python object. A single python object can have multiple references, and this reference counting is accounted for by this type. Use the `.clone()` method to create a new reference and increment the amount of references to the python object by 1."],["PyObjectWeakRef","Same as PyObjectRef, except for being a weak reference."],["PyRef",""],["PyResult","Use this type for function which return a python object or and exception. Both the python object and the python exception are `PyObjectRef` types since exceptions are also python objects."]]}); \ No newline at end of file +initSidebarItems({"fn":[["create_type",""]],"struct":[["PyContext",""],["PyEllipsis",""],["PyIterable","An iterable Python object."],["PyIterator",""],["PyIteratorValue",""],["PyNotImplemented",""],["PyObject","This is an actual python object. It consists of a `typ` which is the python class, and carries some rust payload optionally. This rust payload can be a rust float or rust int in case of float and int objects."],["PyRef","A reference to a Python object."]],"trait":[["AttributeProtocol",""],["BufferProtocol",""],["DictProtocol",""],["FromPyObjectRef",""],["IdProtocol",""],["IntoPyObject","Implemented by any type that can be returned from a built-in Python function."],["PyObjectPayload",""],["PyValue",""],["TryFromObject","Implemented by any type that can be created from a Python object."],["TryIntoRef","Allows coercion of a types into PyRefs, so that we can write functions that can take refs, pyobject refs or basic types."],["TypeProtocol",""]],"type":[["PyAttributes","For attributes we do not use a dict, but a hashmap. This is probably faster, unordered, and only supports strings as keys."],["PyObjectRef","The `PyObjectRef` is one of the most used types. It is a reference to a python object. A single python object can have multiple references, and this reference counting is accounted for by this type. Use the `.clone()` method to create a new reference and increment the amount of references to the python object by 1."],["PyResult","Use this type for function which return a python object or and exception. Both the python object and the python exception are `PyObjectRef` types since exceptions are also python objects."]]}); \ No newline at end of file diff --git a/rustpython_vm/pyobject/struct.PyContext.html b/rustpython_vm/pyobject/struct.PyContext.html index 1f31731..c8d4be4 100644 --- a/rustpython_vm/pyobject/struct.PyContext.html +++ b/rustpython_vm/pyobject/struct.PyContext.html @@ -1,10 +1,11 @@ -rustpython_vm::pyobject::PyContext - Rust

[][src]Struct rustpython_vm::pyobject::PyContext

pub struct PyContext {
+rustpython_vm::pyobject::PyContext - Rust

[][src]Struct rustpython_vm::pyobject::PyContext

pub struct PyContext {
     pub bytes_type: PyObjectRef,
     pub bytearray_type: PyObjectRef,
     pub bool_type: PyObjectRef,
     pub classmethod_type: PyObjectRef,
     pub code_type: PyObjectRef,
     pub dict_type: PyObjectRef,
+    pub ellipsis_type: PyObjectRef,
     pub enumerate_type: PyObjectRef,
     pub filter_type: PyObjectRef,
     pub float_type: PyObjectRef,
@@ -20,6 +21,7 @@
     pub map_type: PyObjectRef,
     pub memoryview_type: PyObjectRef,
     pub none: PyObjectRef,
+    pub ellipsis: PyObjectRef,
     pub not_implemented: PyObjectRef,
     pub tuple_type: PyObjectRef,
     pub set_type: PyObjectRef,
@@ -33,179 +35,23 @@
     pub function_type: PyObjectRef,
     pub builtin_function_or_method_type: PyObjectRef,
     pub property_type: PyObjectRef,
+    pub readonly_property_type: PyObjectRef,
     pub module_type: PyObjectRef,
     pub bound_method_type: PyObjectRef,
-    pub member_descriptor_type: PyObjectRef,
+    pub weakref_type: PyObjectRef,
     pub object: PyObjectRef,
     pub exceptions: ExceptionZoo,
 }

- Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Methods

impl PyContext
[src]

Trait Implementations

impl Debug for PyContext
[src]

Auto Trait Implementations

impl !Send for PyContext

impl !Sync for PyContext

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/pyobject/struct.PyEllipsis.html b/rustpython_vm/pyobject/struct.PyEllipsis.html new file mode 100644 index 0000000..4377ff8 --- /dev/null +++ b/rustpython_vm/pyobject/struct.PyEllipsis.html @@ -0,0 +1,12 @@ +rustpython_vm::pyobject::PyEllipsis - Rust

[][src]Struct rustpython_vm::pyobject::PyEllipsis

pub struct PyEllipsis;

Trait Implementations

impl PyValue for PyEllipsis[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyEllipsis[src]

Auto Trait Implementations

impl Send for PyEllipsis

impl Sync for PyEllipsis

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/pyobject/struct.PyIterable.html b/rustpython_vm/pyobject/struct.PyIterable.html new file mode 100644 index 0000000..22fe263 --- /dev/null +++ b/rustpython_vm/pyobject/struct.PyIterable.html @@ -0,0 +1,22 @@ +rustpython_vm::pyobject::PyIterable - Rust

[][src]Struct rustpython_vm::pyobject::PyIterable

pub struct PyIterable<T = PyObjectRef> { /* fields omitted */ }

An iterable Python object.

+

PyIterable implements FromArgs so that a built-in function can accept +an object that is required to conform to the Python iterator protocol.

+

PyIterable can optionally perform type checking and conversions on iterated +objects using a generic type parameter that implements TryFromObject.

+

Methods

impl<T> PyIterable<T>[src]

pub fn iter<'a>(&self, vm: &'a VirtualMachine) -> PyResult<PyIterator<'a, T>>[src]

Returns an iterator over this sequence of objects.

+

This operation may fail if an exception is raised while invoking the +__iter__ method of the iterable object.

+

Trait Implementations

impl<T> TryFromObject for PyIterable<T> where
    T: TryFromObject
[src]

Auto Trait Implementations

impl<T = Rc<PyObject>> !Send for PyIterable<T>

impl<T = Rc<PyObject>> !Sync for PyIterable<T>

Blanket Implementations

impl<T> FromArgs for T where
    T: TryFromObject
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/pyobject/struct.PyIterator.html b/rustpython_vm/pyobject/struct.PyIterator.html new file mode 100644 index 0000000..1224296 --- /dev/null +++ b/rustpython_vm/pyobject/struct.PyIterator.html @@ -0,0 +1,72 @@ +rustpython_vm::pyobject::PyIterator - Rust

[][src]Struct rustpython_vm::pyobject::PyIterator

pub struct PyIterator<'a, T> { /* fields omitted */ }

Trait Implementations

impl<'a, T> Iterator for PyIterator<'a, T> where
    T: TryFromObject
[src]

type Item = PyResult<T>

The type of the elements being iterated over.

+

fn size_hint(&self) -> (usize, Option<usize>)
1.0.0
[src]

Returns the bounds on the remaining length of the iterator. Read more

+

fn count(self) -> usize
1.0.0
[src]

Consumes the iterator, counting the number of iterations and returning it. Read more

+

fn last(self) -> Option<Self::Item>
1.0.0
[src]

Consumes the iterator, returning the last element. Read more

+

fn nth(&mut self, n: usize) -> Option<Self::Item>
1.0.0
[src]

Returns the nth element of the iterator. Read more

+

fn step_by(self, step: usize) -> StepBy<Self>
1.28.0
[src]

Creates an iterator starting at the same point, but stepping by the given amount at each iteration. Read more

+

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter> where
    U: IntoIterator<Item = Self::Item>, 
1.0.0
[src]

Takes two iterators and creates a new iterator over both in sequence. Read more

+

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter> where
    U: IntoIterator
1.0.0
[src]

'Zips up' two iterators into a single iterator of pairs. Read more

+

fn map<B, F>(self, f: F) -> Map<Self, F> where
    F: FnMut(Self::Item) -> B, 
1.0.0
[src]

Takes a closure and creates an iterator which calls that closure on each element. Read more

+

fn for_each<F>(self, f: F) where
    F: FnMut(Self::Item), 
1.21.0
[src]

Calls a closure on each element of an iterator. Read more

+

fn filter<P>(self, predicate: P) -> Filter<Self, P> where
    P: FnMut(&Self::Item) -> bool
1.0.0
[src]

Creates an iterator which uses a closure to determine if an element should be yielded. Read more

+

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F> where
    F: FnMut(Self::Item) -> Option<B>, 
1.0.0
[src]

Creates an iterator that both filters and maps. Read more

+

fn enumerate(self) -> Enumerate<Self>
1.0.0
[src]

Creates an iterator which gives the current iteration count as well as the next value. Read more

+

fn peekable(self) -> Peekable<Self>
1.0.0
[src]

Creates an iterator which can use peek to look at the next element of the iterator without consuming it. Read more

+

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P> where
    P: FnMut(&Self::Item) -> bool
1.0.0
[src]

Creates an iterator that [skip]s elements based on a predicate. Read more

+

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> where
    P: FnMut(&Self::Item) -> bool
1.0.0
[src]

Creates an iterator that yields elements based on a predicate. Read more

+

fn skip(self, n: usize) -> Skip<Self>
1.0.0
[src]

Creates an iterator that skips the first n elements. Read more

+

fn take(self, n: usize) -> Take<Self>
1.0.0
[src]

Creates an iterator that yields its first n elements. Read more

+

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F> where
    F: FnMut(&mut St, Self::Item) -> Option<B>, 
1.0.0
[src]

An iterator adaptor similar to [fold] that holds internal state and produces a new iterator. Read more

+

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F> where
    F: FnMut(Self::Item) -> U,
    U: IntoIterator
1.0.0
[src]

Creates an iterator that works like map, but flattens nested structure. Read more

+

fn flatten(self) -> Flatten<Self> where
    Self::Item: IntoIterator
1.29.0
[src]

Creates an iterator that flattens nested structure. Read more

+

fn fuse(self) -> Fuse<Self>
1.0.0
[src]

Creates an iterator which ends after the first [None]. Read more

+

fn inspect<F>(self, f: F) -> Inspect<Self, F> where
    F: FnMut(&Self::Item), 
1.0.0
[src]

Do something with each element of an iterator, passing the value on. Read more

+

fn by_ref(&mut self) -> &mut Self
1.0.0
[src]

Borrows an iterator, rather than consuming it. Read more

+

#[must_use = "if you really need to exhaust the iterator, consider `.for_each(drop)` instead"] +
fn collect<B>(self) -> B where
    B: FromIterator<Self::Item>, 
1.0.0
[src]

Transforms an iterator into a collection. Read more

+

fn partition<B, F>(self, f: F) -> (B, B) where
    B: Default + Extend<Self::Item>,
    F: FnMut(&Self::Item) -> bool
1.0.0
[src]

Consumes an iterator, creating two collections from it. Read more

+

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R where
    F: FnMut(B, Self::Item) -> R,
    R: Try<Ok = B>, 
1.27.0
[src]

An iterator method that applies a function as long as it returns successfully, producing a single, final value. Read more

+

fn try_for_each<F, R>(&mut self, f: F) -> R where
    F: FnMut(Self::Item) -> R,
    R: Try<Ok = ()>, 
1.27.0
[src]

An iterator method that applies a fallible function to each item in the iterator, stopping at the first error and returning that error. Read more

+

fn fold<B, F>(self, init: B, f: F) -> B where
    F: FnMut(B, Self::Item) -> B, 
1.0.0
[src]

An iterator method that applies a function, producing a single, final value. Read more

+

fn all<F>(&mut self, f: F) -> bool where
    F: FnMut(Self::Item) -> bool
1.0.0
[src]

Tests if every element of the iterator matches a predicate. Read more

+

fn any<F>(&mut self, f: F) -> bool where
    F: FnMut(Self::Item) -> bool
1.0.0
[src]

Tests if any element of the iterator matches a predicate. Read more

+

fn find<P>(&mut self, predicate: P) -> Option<Self::Item> where
    P: FnMut(&Self::Item) -> bool
1.0.0
[src]

Searches for an element of an iterator that satisfies a predicate. Read more

+

fn find_map<B, F>(&mut self, f: F) -> Option<B> where
    F: FnMut(Self::Item) -> Option<B>, 
1.30.0
[src]

Applies function to the elements of iterator and returns the first non-none result. Read more

+

fn position<P>(&mut self, predicate: P) -> Option<usize> where
    P: FnMut(Self::Item) -> bool
1.0.0
[src]

Searches for an element in an iterator, returning its index. Read more

+

fn rposition<P>(&mut self, predicate: P) -> Option<usize> where
    P: FnMut(Self::Item) -> bool,
    Self: ExactSizeIterator + DoubleEndedIterator
1.0.0
[src]

Searches for an element in an iterator from the right, returning its index. Read more

+

fn max(self) -> Option<Self::Item> where
    Self::Item: Ord
1.0.0
[src]

Returns the maximum element of an iterator. Read more

+

fn min(self) -> Option<Self::Item> where
    Self::Item: Ord
1.0.0
[src]

Returns the minimum element of an iterator. Read more

+

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item> where
    B: Ord,
    F: FnMut(&Self::Item) -> B, 
1.6.0
[src]

Returns the element that gives the maximum value from the specified function. Read more

+

fn max_by<F>(self, compare: F) -> Option<Self::Item> where
    F: FnMut(&Self::Item, &Self::Item) -> Ordering
1.15.0
[src]

Returns the element that gives the maximum value with respect to the specified comparison function. Read more

+

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item> where
    B: Ord,
    F: FnMut(&Self::Item) -> B, 
1.6.0
[src]

Returns the element that gives the minimum value from the specified function. Read more

+

fn min_by<F>(self, compare: F) -> Option<Self::Item> where
    F: FnMut(&Self::Item, &Self::Item) -> Ordering
1.15.0
[src]

Returns the element that gives the minimum value with respect to the specified comparison function. Read more

+

fn rev(self) -> Rev<Self> where
    Self: DoubleEndedIterator
1.0.0
[src]

Reverses an iterator's direction. Read more

+

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB) where
    FromA: Default + Extend<A>,
    FromB: Default + Extend<B>,
    Self: Iterator<Item = (A, B)>, 
1.0.0
[src]

Converts an iterator of pairs into a pair of containers. Read more

+

fn copied<'a, T>(self) -> Copied<Self> where
    Self: Iterator<Item = &'a T>,
    T: 'a + Copy
[src]

🔬 This is a nightly-only experimental API. (iter_copied)

Creates an iterator which copies all of its elements. Read more

+

fn cloned<'a, T>(self) -> Cloned<Self> where
    Self: Iterator<Item = &'a T>,
    T: 'a + Clone
1.0.0
[src]

Creates an iterator which [clone]s all of its elements. Read more

+

fn cycle(self) -> Cycle<Self> where
    Self: Clone
1.0.0
[src]

Repeats an iterator endlessly. Read more

+

fn sum<S>(self) -> S where
    S: Sum<Self::Item>, 
1.11.0
[src]

Sums the elements of an iterator. Read more

+

fn product<P>(self) -> P where
    P: Product<Self::Item>, 
1.11.0
[src]

Iterates over the entire iterator, multiplying all the elements Read more

+

fn cmp<I>(self, other: I) -> Ordering where
    I: IntoIterator<Item = Self::Item>,
    Self::Item: Ord
1.5.0
[src]

Lexicographically compares the elements of this Iterator with those of another. Read more

+

fn partial_cmp<I>(self, other: I) -> Option<Ordering> where
    I: IntoIterator,
    Self::Item: PartialOrd<<I as IntoIterator>::Item>, 
1.5.0
[src]

Lexicographically compares the elements of this Iterator with those of another. Read more

+

fn eq<I>(self, other: I) -> bool where
    I: IntoIterator,
    Self::Item: PartialEq<<I as IntoIterator>::Item>, 
1.5.0
[src]

Determines if the elements of this Iterator are equal to those of another. Read more

+

fn ne<I>(self, other: I) -> bool where
    I: IntoIterator,
    Self::Item: PartialEq<<I as IntoIterator>::Item>, 
1.5.0
[src]

Determines if the elements of this Iterator are unequal to those of another. Read more

+

fn lt<I>(self, other: I) -> bool where
    I: IntoIterator,
    Self::Item: PartialOrd<<I as IntoIterator>::Item>, 
1.5.0
[src]

Determines if the elements of this Iterator are lexicographically less than those of another. Read more

+

fn le<I>(self, other: I) -> bool where
    I: IntoIterator,
    Self::Item: PartialOrd<<I as IntoIterator>::Item>, 
1.5.0
[src]

Determines if the elements of this Iterator are lexicographically less or equal to those of another. Read more

+

fn gt<I>(self, other: I) -> bool where
    I: IntoIterator,
    Self::Item: PartialOrd<<I as IntoIterator>::Item>, 
1.5.0
[src]

Determines if the elements of this Iterator are lexicographically greater than those of another. Read more

+

fn ge<I>(self, other: I) -> bool where
    I: IntoIterator,
    Self::Item: PartialOrd<<I as IntoIterator>::Item>, 
1.5.0
[src]

Determines if the elements of this Iterator are lexicographically greater than or equal to those of another. Read more

+

Auto Trait Implementations

impl<'a, T> !Send for PyIterator<'a, T>

impl<'a, T> !Sync for PyIterator<'a, T>

Blanket Implementations

impl<I> IntoIterator for I where
    I: Iterator
[src]

type Item = <I as Iterator>::Item

The type of the elements being iterated over.

+

type IntoIter = I

Which kind of iterator are we turning this into?

+

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/pyobject/struct.PyIteratorValue.html b/rustpython_vm/pyobject/struct.PyIteratorValue.html new file mode 100644 index 0000000..e177fa9 --- /dev/null +++ b/rustpython_vm/pyobject/struct.PyIteratorValue.html @@ -0,0 +1,16 @@ +rustpython_vm::pyobject::PyIteratorValue - Rust

[][src]Struct rustpython_vm::pyobject::PyIteratorValue

pub struct PyIteratorValue {
+    pub position: Cell<usize>,
+    pub iterated_obj: PyObjectRef,
+}

+ Fields

position: Cell<usize>iterated_obj: PyObjectRef

Trait Implementations

impl PyValue for PyIteratorValue[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyIteratorValue[src]

Auto Trait Implementations

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/pyobject/struct.PyNotImplemented.html b/rustpython_vm/pyobject/struct.PyNotImplemented.html new file mode 100644 index 0000000..987aec1 --- /dev/null +++ b/rustpython_vm/pyobject/struct.PyNotImplemented.html @@ -0,0 +1,12 @@ +rustpython_vm::pyobject::PyNotImplemented - Rust

[][src]Struct rustpython_vm::pyobject::PyNotImplemented

pub struct PyNotImplemented;

Trait Implementations

impl PyValue for PyNotImplemented[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for PyNotImplemented[src]

Auto Trait Implementations

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/pyobject/struct.PyObject.html b/rustpython_vm/pyobject/struct.PyObject.html index 5a040ec..c09db60 100644 --- a/rustpython_vm/pyobject/struct.PyObject.html +++ b/rustpython_vm/pyobject/struct.PyObject.html @@ -1,31 +1,22 @@ -rustpython_vm::pyobject::PyObject - Rust

[][src]Struct rustpython_vm::pyobject::PyObject

pub struct PyObject {
-    pub payload: PyObjectPayload,
-    pub typ: Option<PyObjectRef>,
+rustpython_vm::pyobject::PyObject - Rust

[][src]Struct rustpython_vm::pyobject::PyObject

pub struct PyObject {
+    pub typ: PyObjectRef,
+    pub dict: Option<RefCell<PyAttributes>>,
+    pub payload: Box<dyn PyObjectPayload>,
 }

This is an actual python object. It consists of a typ which is the python class, and carries some rust payload optionally. This rust payload can be a rust float or rust int in case of float and int objects.

- Fields

- - - -

Methods

impl PyObject
[src]

Trait Implementations

impl TypeProtocol for PyObject
[src]

impl Display for PyObject
[src]

impl Debug for PyObject
[src]

Auto Trait Implementations

impl !Send for PyObject

impl !Sync for PyObject

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> From for T
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

-
🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

-

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/pyobject/struct.PyRef.html b/rustpython_vm/pyobject/struct.PyRef.html new file mode 100644 index 0000000..071c1eb --- /dev/null +++ b/rustpython_vm/pyobject/struct.PyRef.html @@ -0,0 +1,31 @@ +rustpython_vm::pyobject::PyRef - Rust

[][src]Struct rustpython_vm::pyobject::PyRef

pub struct PyRef<T> { /* fields omitted */ }

A reference to a Python object.

+

Note that a PyRef<T> can only deref to a shared / immutable reference. +It is the payload type's responsibility to handle (possibly concurrent) +mutability with locks or concurrent data structures if required.

+

A PyRef<T> can be directly returned from a built-in function to handle +situations (such as when implementing in-place methods such as __iadd__) +where a reference to the same object must be returned.

+

Methods

impl<T: PyValue> PyRef<T>[src]

pub fn as_object(&self) -> &PyObjectRef[src]

pub fn into_object(self) -> PyObjectRef[src]

pub fn typ(&self) -> PyClassRef[src]

Trait Implementations

impl FromPyObjectRef for PyRef<PyClass>[src]

impl<T> TryIntoRef<T> for PyRef<T>[src]

impl<T> TryFromObject for PyRef<T> where
    T: PyValue
[src]

impl<T> IntoPyObject for PyRef<T>[src]

impl<T: Clone> Clone for PyRef<T>[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

+

impl<T: Debug> Debug for PyRef<T>[src]

impl<T: Display> Display for PyRef<T> where
    T: PyValue + Display
[src]

impl<T> Deref for PyRef<T> where
    T: PyValue
[src]

type Target = T

The resulting type after dereferencing.

+

Auto Trait Implementations

impl<T> !Send for PyRef<T>

impl<T> !Sync for PyRef<T>

Blanket Implementations

impl<T> FromArgs for T where
    T: TryFromObject
[src]

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.AttributeProtocol.html b/rustpython_vm/pyobject/trait.AttributeProtocol.html index fd54890..1b055d6 100644 --- a/rustpython_vm/pyobject/trait.AttributeProtocol.html +++ b/rustpython_vm/pyobject/trait.AttributeProtocol.html @@ -1,11 +1,8 @@ -rustpython_vm::pyobject::AttributeProtocol - Rust

[][src]Trait rustpython_vm::pyobject::AttributeProtocol

pub trait AttributeProtocol {
+rustpython_vm::pyobject::AttributeProtocol - Rust

[][src]Trait rustpython_vm::pyobject::AttributeProtocol

pub trait AttributeProtocol {
     fn get_attr(&self, attr_name: &str) -> Option<PyObjectRef>;
 
fn has_attr(&self, attr_name: &str) -> bool; }
-

- Required Methods -

-
-

Implementors

impl AttributeProtocol for PyObjectRef
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.BufferProtocol.html b/rustpython_vm/pyobject/trait.BufferProtocol.html index dead0cc..d5b5f43 100644 --- a/rustpython_vm/pyobject/trait.BufferProtocol.html +++ b/rustpython_vm/pyobject/trait.BufferProtocol.html @@ -1,10 +1,7 @@ -rustpython_vm::pyobject::BufferProtocol - Rust

[][src]Trait rustpython_vm::pyobject::BufferProtocol

pub trait BufferProtocol {
+rustpython_vm::pyobject::BufferProtocol - Rust

[][src]Trait rustpython_vm::pyobject::BufferProtocol

pub trait BufferProtocol {
     fn readonly(&self) -> bool;
 }
-

- Required Methods -

-
-

Implementors

impl BufferProtocol for PyObjectRef
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.DictProtocol.html b/rustpython_vm/pyobject/trait.DictProtocol.html index b11c1b7..7bdc69a 100644 --- a/rustpython_vm/pyobject/trait.DictProtocol.html +++ b/rustpython_vm/pyobject/trait.DictProtocol.html @@ -1,12 +1,11 @@ -rustpython_vm::pyobject::DictProtocol - Rust

[][src]Trait rustpython_vm::pyobject::DictProtocol

pub trait DictProtocol {
+rustpython_vm::pyobject::DictProtocol - Rust

[][src]Trait rustpython_vm::pyobject::DictProtocol

pub trait DictProtocol {
     fn contains_key(&self, k: &str) -> bool;
 
fn get_item(&self, k: &str) -> Option<PyObjectRef>;
fn get_key_value_pairs(&self) -> Vec<(PyObjectRef, PyObjectRef)>; +
fn set_item(&self, ctx: &PyContext, key: &str, v: PyObjectRef); +
fn del_item(&self, key: &str); }
-

- Required Methods -

-
-

Implementors

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.FromPyObjectRef.html b/rustpython_vm/pyobject/trait.FromPyObjectRef.html index e801abc..b9b05b9 100644 --- a/rustpython_vm/pyobject/trait.FromPyObjectRef.html +++ b/rustpython_vm/pyobject/trait.FromPyObjectRef.html @@ -1,14 +1,7 @@ -rustpython_vm::pyobject::FromPyObjectRef - Rust

[][src]Trait rustpython_vm::pyobject::FromPyObjectRef

pub trait FromPyObjectRef {
+rustpython_vm::pyobject::FromPyObjectRef - Rust

[][src]Trait rustpython_vm::pyobject::FromPyObjectRef

pub trait FromPyObjectRef {
     fn from_pyobj(obj: &PyObjectRef) -> Self;
 }
-

- Required Methods -

-
-

-

- Implementations on Foreign Types -

-

impl FromPyObjectRef for BigInt
[src]

Implementors

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.IdProtocol.html b/rustpython_vm/pyobject/trait.IdProtocol.html index 37a5d8c..10f1dfe 100644 --- a/rustpython_vm/pyobject/trait.IdProtocol.html +++ b/rustpython_vm/pyobject/trait.IdProtocol.html @@ -1,11 +1,11 @@ -rustpython_vm::pyobject::IdProtocol - Rust

[][src]Trait rustpython_vm::pyobject::IdProtocol

pub trait IdProtocol {
+rustpython_vm::pyobject::IdProtocol - Rust

[][src]Trait rustpython_vm::pyobject::IdProtocol

pub trait IdProtocol {
     fn get_id(&self) -> usize;
-
fn is(&self, other: &PyObjectRef) -> bool; + + fn is<T>(&self, other: &T) -> bool
    where
        T: IdProtocol
, + { ... } }
-

- Required Methods -

-
-

Implementors

impl IdProtocol for PyObjectRef
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.IntoPyObject.html b/rustpython_vm/pyobject/trait.IntoPyObject.html new file mode 100644 index 0000000..4be31e6 --- /dev/null +++ b/rustpython_vm/pyobject/trait.IntoPyObject.html @@ -0,0 +1,12 @@ +rustpython_vm::pyobject::IntoPyObject - Rust

[][src]Trait rustpython_vm::pyobject::IntoPyObject

pub trait IntoPyObject {
+    fn into_pyobject(self, vm: &VirtualMachine) -> PyResult;
+}

Implemented by any type that can be returned from a built-in Python function.

+

IntoPyObject has a blanket implementation for any built-in object payload, +and should be implemented by many primitive Rust types, allowing a built-in +function to simply return a bool or a usize for example.

+
+

Required methods

Loading content... +

Implementations on Foreign Types

impl IntoPyObject for bool[src]

impl IntoPyObject for f64[src]

impl IntoPyObject for BigInt[src]

impl IntoPyObject for isize[src]

impl IntoPyObject for i8[src]

impl IntoPyObject for i16[src]

impl IntoPyObject for i32[src]

impl IntoPyObject for i64[src]

impl IntoPyObject for usize[src]

impl IntoPyObject for u8[src]

impl IntoPyObject for u16[src]

impl IntoPyObject for u32[src]

impl IntoPyObject for u64[src]

impl IntoPyObject for ()[src]

impl<T: IntoPyObject> IntoPyObject for Option<T>[src]

impl IntoPyObject for String[src]

Loading content... +

Implementors

impl IntoPyObject for PyObjectRef[src]

impl<T> IntoPyObject for PyRef<T>[src]

impl<T> IntoPyObject for PyResult<T> where
    T: IntoPyObject
[src]

impl<T> IntoPyObject for T where
    T: PyValue + Sized
[src]

Loading content...
\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.PyObjectPayload.html b/rustpython_vm/pyobject/trait.PyObjectPayload.html new file mode 100644 index 0000000..1df83de --- /dev/null +++ b/rustpython_vm/pyobject/trait.PyObjectPayload.html @@ -0,0 +1,7 @@ +rustpython_vm::pyobject::PyObjectPayload - Rust

[][src]Trait rustpython_vm::pyobject::PyObjectPayload

pub trait PyObjectPayload: Any + Debug + 'static {
+    fn as_any(&self) -> &dyn Any;
+}
+

Required methods

fn as_any(&self) -> &dyn Any

Loading content... +

Implementors

impl<T: PyValue + 'static> PyObjectPayload for T[src]

Loading content...
\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.PyValue.html b/rustpython_vm/pyobject/trait.PyValue.html new file mode 100644 index 0000000..a4bd64b --- /dev/null +++ b/rustpython_vm/pyobject/trait.PyValue.html @@ -0,0 +1,12 @@ +rustpython_vm::pyobject::PyValue - Rust

[][src]Trait rustpython_vm::pyobject::PyValue

pub trait PyValue: Debug + Sized + 'static {
+    fn class(vm: &VirtualMachine) -> PyObjectRef;
+
+    fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self> { ... }
+
fn into_ref_with_type(
        self,
        vm: &VirtualMachine,
        cls: PyClassRef
    ) -> PyResult<PyRef<Self>> { ... } +}
+

Required methods

Loading content... +

Provided methods

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>

Loading content... +

Implementations on Foreign Types

impl PyValue for Regex[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

Loading content... +

Implementors

impl PyValue for Frame[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyBuiltinFunction[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyByteArray[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyBytes[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyClassMethod[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyCode[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyComplex[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyDict[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyEnumerate[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyFilter[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyFloat[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyFunction[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyMethod[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyGenerator[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyInt[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyList[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyMap[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyMemoryView[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyModule[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyNone[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyInstance[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyProperty[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyReadOnlyProperty[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyRange[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PySet[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PySlice[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyStaticMethod[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyString[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PySuper[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyTuple[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyClass[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyWeak[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyZip[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyEllipsis[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyIteratorValue[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for PyNotImplemented[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl PyValue for Socket[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

Loading content...
\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.TryFromObject.html b/rustpython_vm/pyobject/trait.TryFromObject.html new file mode 100644 index 0000000..443905b --- /dev/null +++ b/rustpython_vm/pyobject/trait.TryFromObject.html @@ -0,0 +1,12 @@ +rustpython_vm::pyobject::TryFromObject - Rust

[][src]Trait rustpython_vm::pyobject::TryFromObject

pub trait TryFromObject: Sized {
+    fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self>;
+}

Implemented by any type that can be created from a Python object.

+

Any type that implements TryFromObject is automatically FromArgs, and +so can be accepted as a argument to a built-in function.

+
+

Required methods

fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self>

Attempt to convert a Python object to a value of this type.

+
Loading content... +

Implementations on Foreign Types

impl TryFromObject for bool[src]

impl TryFromObject for isize[src]

impl TryFromObject for i8[src]

impl TryFromObject for i16[src]

impl TryFromObject for i32[src]

impl TryFromObject for i64[src]

impl TryFromObject for usize[src]

impl TryFromObject for u8[src]

impl TryFromObject for u16[src]

impl TryFromObject for u32[src]

impl TryFromObject for u64[src]

impl<T: TryFromObject> TryFromObject for Option<T>[src]

Loading content... +

Implementors

impl TryFromObject for PyObjectRef[src]

impl<T> TryFromObject for PyIterable<T> where
    T: TryFromObject
[src]

impl<T> TryFromObject for PyRef<T> where
    T: PyValue
[src]

Loading content...
\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.TryIntoRef.html b/rustpython_vm/pyobject/trait.TryIntoRef.html new file mode 100644 index 0000000..088c87e --- /dev/null +++ b/rustpython_vm/pyobject/trait.TryIntoRef.html @@ -0,0 +1,10 @@ +rustpython_vm::pyobject::TryIntoRef - Rust

[][src]Trait rustpython_vm::pyobject::TryIntoRef

pub trait TryIntoRef<T> {
+    fn try_into_ref(self, vm: &VirtualMachine) -> PyResult<PyRef<T>>;
+}

Allows coercion of a types into PyRefs, so that we can write functions that can take +refs, pyobject refs or basic types.

+
+

Required methods

Loading content... +

Implementations on Foreign Types

impl TryIntoRef<PyString> for String[src]

impl<'_> TryIntoRef<PyString> for &'_ str[src]

Loading content... +

Implementors

impl<T> TryIntoRef<T> for PyRef<T>[src]

impl<T> TryIntoRef<T> for PyObjectRef where
    T: PyValue
[src]

Loading content...
\ No newline at end of file diff --git a/rustpython_vm/pyobject/trait.TypeProtocol.html b/rustpython_vm/pyobject/trait.TypeProtocol.html index c3af91f..4fb5923 100644 --- a/rustpython_vm/pyobject/trait.TypeProtocol.html +++ b/rustpython_vm/pyobject/trait.TypeProtocol.html @@ -1,10 +1,11 @@ -rustpython_vm::pyobject::TypeProtocol - Rust

[][src]Trait rustpython_vm::pyobject::TypeProtocol

pub trait TypeProtocol {
-    fn typ(&self) -> PyObjectRef;
+rustpython_vm::pyobject::TypeProtocol - Rust

[][src]Trait rustpython_vm::pyobject::TypeProtocol

pub trait TypeProtocol {
+    fn type_ref(&self) -> &PyObjectRef;
+
+    fn typ(&self) -> PyObjectRef { ... }
+
fn type_pyref(&self) -> PyClassRef { ... } }
-

- Required Methods -

-
-

Implementors

impl TypeProtocol for PyObject
[src]

impl TypeProtocol for PyObjectRef
[src]

\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/pyobject/type.PyAttributes.html b/rustpython_vm/pyobject/type.PyAttributes.html index 36556b7..774a0b2 100644 --- a/rustpython_vm/pyobject/type.PyAttributes.html +++ b/rustpython_vm/pyobject/type.PyAttributes.html @@ -1,3 +1,3 @@ -rustpython_vm::pyobject::PyAttributes - Rust

[][src]Type Definition rustpython_vm::pyobject::PyAttributes

type PyAttributes = HashMap<String, PyObjectRef>;

For attributes we do not use a dict, but a hashmap. This is probably +rustpython_vm::pyobject::PyAttributes - Rust

[][src]Type Definition rustpython_vm::pyobject::PyAttributes

type PyAttributes = HashMap<String, PyObjectRef>;

For attributes we do not use a dict, but a hashmap. This is probably faster, unordered, and only supports strings as keys.

-
\ No newline at end of file +
\ No newline at end of file diff --git a/rustpython_vm/pyobject/type.PyObjectRef.html b/rustpython_vm/pyobject/type.PyObjectRef.html index 3d86a40..ad5d695 100644 --- a/rustpython_vm/pyobject/type.PyObjectRef.html +++ b/rustpython_vm/pyobject/type.PyObjectRef.html @@ -1,6 +1,7 @@ -rustpython_vm::pyobject::PyObjectRef - Rust

[][src]Type Definition rustpython_vm::pyobject::PyObjectRef

type PyObjectRef = PyRef<PyObject>;

The PyObjectRef is one of the most used types. It is a reference to a +rustpython_vm::pyobject::PyObjectRef - Rust

[][src]Type Definition rustpython_vm::pyobject::PyObjectRef

type PyObjectRef = Rc<PyObject>;

The PyObjectRef is one of the most used types. It is a reference to a python object. A single python object can have multiple references, and this reference counting is accounted for by this type. Use the .clone() method to create a new reference and increment the amount of references to the python object by 1.

-

Trait Implementations

\ No newline at end of file +

Trait Implementations

impl IdProtocol for PyObjectRef[src]

fn is<T>(&self, other: &T) -> bool where
    T: IdProtocol
[src]

impl TypeProtocol for PyObjectRef[src]

impl AttributeProtocol for PyObjectRef[src]

impl DictProtocol for PyObjectRef[src]

impl BufferProtocol for PyObjectRef[src]

impl<T> TryIntoRef<T> for PyObjectRef where
    T: PyValue
[src]

impl TryFromObject for PyObjectRef[src]

impl IntoPyObject for PyObjectRef[src]

\ No newline at end of file diff --git a/rustpython_vm/pyobject/type.PyResult.html b/rustpython_vm/pyobject/type.PyResult.html index d6cd2d1..a061f87 100644 --- a/rustpython_vm/pyobject/type.PyResult.html +++ b/rustpython_vm/pyobject/type.PyResult.html @@ -1,4 +1,4 @@ -rustpython_vm::pyobject::PyResult - Rust

[][src]Type Definition rustpython_vm::pyobject::PyResult

type PyResult = Result<PyObjectRef, PyObjectRef>;

Use this type for function which return a python object or and exception. +rustpython_vm::pyobject::PyResult - Rust

[][src]Type Definition rustpython_vm::pyobject::PyResult

type PyResult<T = PyObjectRef> = Result<T, PyObjectRef>;

Use this type for function which return a python object or and exception. Both the python object and the python exception are PyObjectRef types since exceptions are also python objects.

-
\ No newline at end of file +

Trait Implementations

impl<T> IntoPyObject for PyResult<T> where
    T: IntoPyObject
[src]

\ No newline at end of file diff --git a/rustpython_vm/sidebar-items.js b/rustpython_vm/sidebar-items.js index 5c4055e..53a6f1a 100644 --- a/rustpython_vm/sidebar-items.js +++ b/rustpython_vm/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["print_exception",""]],"macro":[["arg_check",""],["count_tts",""],["no_kwargs",""],["replace_expr",""],["type_check",""]],"mod":[["bytecode","Implement python as a virtual machine with bytecodes. This module implements bytecode structure."],["compile","Take an AST and transform it into bytecode"],["error",""],["eval",""],["format",""],["import",""],["macros",""],["obj","This package contains the python basic/builtin types"],["pyobject",""],["stdlib",""],["util",""]],"struct":[["VirtualMachine","Top level container of a python virtual machine. In theory you could create more instances of this struct and have them operate fully isolated."]]}); \ No newline at end of file +initSidebarItems({"fn":[["print_exception",""]],"macro":[["arg_check",""],["count_tts",""],["extend_class",""],["no_kwargs",""],["py_class",""],["py_module",""],["replace_expr",""],["type_check",""]],"mod":[["bytecode","Implement python as a virtual machine with bytecodes. This module implements bytecode structure."],["compile","Take an AST and transform it into bytecode"],["error",""],["eval",""],["format",""],["frame",""],["function",""],["import",""],["macros",""],["obj","This package contains the python basic/builtin types"],["pyobject",""],["stdlib",""],["util",""]],"struct":[["VirtualMachine","Top level container of a python virtual machine. In theory you could create more instances of this struct and have them operate fully isolated."]]}); \ No newline at end of file diff --git a/rustpython_vm/stdlib/fn.get_module_inits.html b/rustpython_vm/stdlib/fn.get_module_inits.html index 20e2c14..54bd62e 100644 --- a/rustpython_vm/stdlib/fn.get_module_inits.html +++ b/rustpython_vm/stdlib/fn.get_module_inits.html @@ -1 +1 @@ -rustpython_vm::stdlib::get_module_inits - Rust

[][src]Function rustpython_vm::stdlib::get_module_inits

pub fn get_module_inits() -> HashMap<String, StdlibInitFunc>
\ No newline at end of file +rustpython_vm::stdlib::get_module_inits - Rust

[][src]Function rustpython_vm::stdlib::get_module_inits

pub fn get_module_inits() -> HashMap<String, StdlibInitFunc>
\ No newline at end of file diff --git a/rustpython_vm/stdlib/index.html b/rustpython_vm/stdlib/index.html index 461fc1a..fa435b7 100644 --- a/rustpython_vm/stdlib/index.html +++ b/rustpython_vm/stdlib/index.html @@ -1,4 +1,4 @@ -rustpython_vm::stdlib - Rust

[][src]Module rustpython_vm::stdlib

Modules

-
io

Functions

+rustpython_vm::stdlib - Rust

[][src]Module rustpython_vm::stdlib

Modules

+
io
socket

Functions

get_module_inits

Type Definitions

-
StdlibInitFunc
\ No newline at end of file +
StdlibInitFunc
\ No newline at end of file diff --git a/rustpython_vm/stdlib/io/fn.io_open.html b/rustpython_vm/stdlib/io/fn.io_open.html index 309a40a..1c6b709 100644 --- a/rustpython_vm/stdlib/io/fn.io_open.html +++ b/rustpython_vm/stdlib/io/fn.io_open.html @@ -1 +1 @@ -rustpython_vm::stdlib::io::io_open - Rust

[][src]Function rustpython_vm::stdlib::io::io_open

pub fn io_open(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file +rustpython_vm::stdlib::io::io_open - Rust

[][src]Function rustpython_vm::stdlib::io::io_open

pub fn io_open(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult
\ No newline at end of file diff --git a/rustpython_vm/stdlib/io/fn.make_module.html b/rustpython_vm/stdlib/io/fn.make_module.html new file mode 100644 index 0000000..7e28cd6 --- /dev/null +++ b/rustpython_vm/stdlib/io/fn.make_module.html @@ -0,0 +1 @@ +rustpython_vm::stdlib::io::make_module - Rust

[][src]Function rustpython_vm::stdlib::io::make_module

pub fn make_module(ctx: &PyContext) -> PyObjectRef
\ No newline at end of file diff --git a/rustpython_vm/stdlib/io/index.html b/rustpython_vm/stdlib/io/index.html index 67e0289..ee0d677 100644 --- a/rustpython_vm/stdlib/io/index.html +++ b/rustpython_vm/stdlib/io/index.html @@ -1,2 +1,2 @@ -rustpython_vm::stdlib::io - Rust

[][src]Module rustpython_vm::stdlib::io

Functions

-
io_open
mk_module
\ No newline at end of file +rustpython_vm::stdlib::io - Rust

[][src]Module rustpython_vm::stdlib::io

Functions

+
io_open
make_module
\ No newline at end of file diff --git a/rustpython_vm/stdlib/io/make_module.v.html b/rustpython_vm/stdlib/io/make_module.v.html new file mode 100644 index 0000000..1166bdd --- /dev/null +++ b/rustpython_vm/stdlib/io/make_module.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.make_module.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/stdlib/io/sidebar-items.js b/rustpython_vm/stdlib/io/sidebar-items.js index 0625b77..9090f26 100644 --- a/rustpython_vm/stdlib/io/sidebar-items.js +++ b/rustpython_vm/stdlib/io/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["io_open",""],["mk_module",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["io_open",""],["make_module",""]]}); \ No newline at end of file diff --git a/rustpython_vm/stdlib/sidebar-items.js b/rustpython_vm/stdlib/sidebar-items.js index 3d84151..48926af 100644 --- a/rustpython_vm/stdlib/sidebar-items.js +++ b/rustpython_vm/stdlib/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["get_module_inits",""]],"mod":[["io",""]],"type":[["StdlibInitFunc",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["get_module_inits",""]],"mod":[["io",""],["socket",""]],"type":[["StdlibInitFunc",""]]}); \ No newline at end of file diff --git a/rustpython_vm/stdlib/socket/Socket.t.html b/rustpython_vm/stdlib/socket/Socket.t.html new file mode 100644 index 0000000..cb5bb6d --- /dev/null +++ b/rustpython_vm/stdlib/socket/Socket.t.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to struct.Socket.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/stdlib/socket/fn.make_module.html b/rustpython_vm/stdlib/socket/fn.make_module.html new file mode 100644 index 0000000..053965f --- /dev/null +++ b/rustpython_vm/stdlib/socket/fn.make_module.html @@ -0,0 +1 @@ +rustpython_vm::stdlib::socket::make_module - Rust

[][src]Function rustpython_vm::stdlib::socket::make_module

pub fn make_module(ctx: &PyContext) -> PyObjectRef
\ No newline at end of file diff --git a/rustpython_vm/stdlib/socket/index.html b/rustpython_vm/stdlib/socket/index.html new file mode 100644 index 0000000..1fa7b2a --- /dev/null +++ b/rustpython_vm/stdlib/socket/index.html @@ -0,0 +1,3 @@ +rustpython_vm::stdlib::socket - Rust

[][src]Module rustpython_vm::stdlib::socket

Structs

+
Socket

Functions

+
make_module
\ No newline at end of file diff --git a/rustpython_vm/stdlib/socket/make_module.v.html b/rustpython_vm/stdlib/socket/make_module.v.html new file mode 100644 index 0000000..1166bdd --- /dev/null +++ b/rustpython_vm/stdlib/socket/make_module.v.html @@ -0,0 +1,10 @@ + + + + + + +

Redirecting to fn.make_module.html...

+ + + \ No newline at end of file diff --git a/rustpython_vm/stdlib/socket/sidebar-items.js b/rustpython_vm/stdlib/socket/sidebar-items.js new file mode 100644 index 0000000..a451100 --- /dev/null +++ b/rustpython_vm/stdlib/socket/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"fn":[["make_module",""]],"struct":[["Socket",""]]}); \ No newline at end of file diff --git a/rustpython_vm/stdlib/socket/struct.Socket.html b/rustpython_vm/stdlib/socket/struct.Socket.html new file mode 100644 index 0000000..7f9aa6a --- /dev/null +++ b/rustpython_vm/stdlib/socket/struct.Socket.html @@ -0,0 +1,12 @@ +rustpython_vm::stdlib::socket::Socket - Rust

[][src]Struct rustpython_vm::stdlib::socket::Socket

pub struct Socket { /* fields omitted */ }

Trait Implementations

impl PyValue for Socket[src]

fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

fn into_ref_with_type(
    self,
    vm: &VirtualMachine,
    cls: PyClassRef
) -> PyResult<PyRef<Self>>
[src]

impl Debug for Socket[src]

Auto Trait Implementations

impl Send for Socket

impl !Sync for Socket

Blanket Implementations

impl<T> IntoPyObject for T where
    T: PyValue
[src]

impl<T> PyObjectPayload for T where
    T: 'static + PyValue
[src]

impl<T> From for T[src]

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom for T where
    T: From<U>, 
[src]

type Error = !

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

🔬 This is a nightly-only experimental API. (try_from)

The type returned in the event of a conversion error.

+

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/rustpython_vm/stdlib/type.StdlibInitFunc.html b/rustpython_vm/stdlib/type.StdlibInitFunc.html index 1e6956e..574aaa4 100644 --- a/rustpython_vm/stdlib/type.StdlibInitFunc.html +++ b/rustpython_vm/stdlib/type.StdlibInitFunc.html @@ -1 +1 @@ -rustpython_vm::stdlib::StdlibInitFunc - Rust

[][src]Type Definition rustpython_vm::stdlib::StdlibInitFunc

type StdlibInitFunc = fn(_: &PyContext) -> PyObjectRef;
\ No newline at end of file +rustpython_vm::stdlib::StdlibInitFunc - Rust

[][src]Type Definition rustpython_vm::stdlib::StdlibInitFunc

type StdlibInitFunc = Box<dyn Fn(&PyContext) -> PyObjectRef>;
\ No newline at end of file diff --git a/rustpython_vm/struct.VirtualMachine.html b/rustpython_vm/struct.VirtualMachine.html index 54e8357..c837049 100644 --- a/rustpython_vm/struct.VirtualMachine.html +++ b/rustpython_vm/struct.VirtualMachine.html @@ -1,46 +1,27 @@ -rustpython_vm::VirtualMachine - Rust

[][src]Struct rustpython_vm::VirtualMachine

pub struct VirtualMachine {
+rustpython_vm::VirtualMachine - Rust

[][src]Struct rustpython_vm::VirtualMachine

pub struct VirtualMachine {
     pub builtins: PyObjectRef,
     pub sys_module: PyObjectRef,
-    pub stdlib_inits: HashMap<String, StdlibInitFunc>,
+    pub stdlib_inits: RefCell<HashMap<String, StdlibInitFunc>>,
     pub ctx: PyContext,
-    pub current_frame: Option<PyObjectRef>,
+    pub frames: RefCell<Vec<PyObjectRef>>,
     pub wasm_id: Option<String>,
 }

Top level container of a python virtual machine. In theory you could create more instances of this struct and have them operate fully isolated.

- Fields

- - - - - - - - - - - -

Methods

impl VirtualMachine
[src]

Create a new VirtualMachine structure.

-

Create a new python string object.

-

Create a new python bool object.

-

Create a new python ValueError object. Useful for raising errors from + Fieldsbuiltins: PyObjectRefsys_module: PyObjectRefstdlib_inits: RefCell<HashMap<String, StdlibInitFunc>>ctx: PyContextframes: RefCell<Vec<PyObjectRef>>wasm_id: Option<String>

Methods

impl VirtualMachine[src]

pub fn new() -> VirtualMachine[src]

Create a new VirtualMachine structure.

+

pub fn run_code_obj(&self, code: PyObjectRef, scope: Scope) -> PyResult[src]

pub fn run_frame_full(&self, frame: PyObjectRef) -> PyResult[src]

pub fn run_frame(&self, frame: PyObjectRef) -> PyResult<ExecutionResult>[src]

pub fn current_frame(&self) -> Ref<Frame>[src]

pub fn current_scope(&self) -> Ref<Scope>[src]

pub fn class(&self, module: &str, class: &str) -> PyObjectRef[src]

pub fn new_str(&self, s: String) -> PyObjectRef[src]

Create a new python string object.

+

pub fn new_int<T: Into<BigInt>>(&self, i: T) -> PyObjectRef[src]

Create a new python int object.

+

pub fn new_bool(&self, b: bool) -> PyObjectRef[src]

Create a new python bool object.

+

pub fn new_dict(&self) -> PyObjectRef[src]

pub fn new_empty_exception(&self, exc_type: PyObjectRef) -> PyResult[src]

pub fn new_exception(&self, exc_type: PyObjectRef, msg: String) -> PyObjectRef[src]

pub fn new_attribute_error(&self, msg: String) -> PyObjectRef[src]

pub fn new_type_error(&self, msg: String) -> PyObjectRef[src]

pub fn new_unsupported_operand_error(
    &self,
    a: PyObjectRef,
    b: PyObjectRef,
    op: &str
) -> PyObjectRef
[src]

pub fn new_os_error(&self, msg: String) -> PyObjectRef[src]

pub fn new_value_error(&self, msg: String) -> PyObjectRef[src]

Create a new python ValueError object. Useful for raising errors from python functions implemented in rust.

-

Calls a method on obj passing arg, if the method exists.

+

pub fn new_key_error(&self, msg: String) -> PyObjectRef[src]

pub fn new_index_error(&self, msg: String) -> PyObjectRef[src]

pub fn new_not_implemented_error(&self, msg: String) -> PyObjectRef[src]

pub fn new_zero_division_error(&self, msg: String) -> PyObjectRef[src]

pub fn new_overflow_error(&self, msg: String) -> PyObjectRef[src]

pub fn get_none(&self) -> PyObjectRef[src]

pub fn get_type(&self) -> PyObjectRef[src]

pub fn get_object(&self) -> PyObjectRef[src]

pub fn get_locals(&self) -> PyObjectRef[src]

pub fn context(&self) -> &PyContext[src]

pub fn to_str(&self, obj: &PyObjectRef) -> PyResult<PyStringRef>[src]

pub fn to_pystr(&self, obj: &PyObjectRef) -> Result<String, PyObjectRef>[src]

pub fn to_repr(&self, obj: &PyObjectRef) -> PyResult<PyStringRef>[src]

pub fn import(&self, module: &str) -> PyResult[src]

pub fn isinstance(&self, obj: &PyObjectRef, cls: &PyObjectRef) -> PyResult<bool>[src]

Determines if obj is an instance of cls, either directly, indirectly or virtually via +the instancecheck magic method.

+

pub fn issubclass(
    &self,
    subclass: &PyObjectRef,
    cls: &PyObjectRef
) -> PyResult<bool>
[src]

Determines if subclass is a subclass of cls, either directly, indirectly or virtually +via the subclasscheck magic method.

+

pub fn call_get_descriptor(
    &self,
    attr: PyObjectRef,
    obj: PyObjectRef
) -> PyResult
[src]

pub fn call_method<T>(
    &self,
    obj: &PyObjectRef,
    method_name: &str,
    args: T
) -> PyResult where
    T: Into<PyFuncArgs>, 
[src]

pub fn invoke<T>(&self, func_ref: PyObjectRef, args: T) -> PyResult where
    T: Into<PyFuncArgs>, 
[src]

pub fn invoke_with_locals(
    &self,
    function: PyObjectRef,
    cells: PyObjectRef,
    locals: PyObjectRef
) -> PyResult
[src]

pub fn extract_elements(
    &self,
    value: &PyObjectRef
) -> PyResult<Vec<PyObjectRef>>
[src]

pub fn get_attribute<T>(&self, obj: PyObjectRef, attr_name: T) -> PyResult where
    T: TryIntoRef<PyString>, 
[src]

pub fn set_attr(
    &self,
    obj: &PyObjectRef,
    attr_name: PyObjectRef,
    attr_value: PyObjectRef
) -> PyResult
[src]

pub fn del_attr(&self, obj: &PyObjectRef, attr_name: PyObjectRef) -> PyResult[src]

pub fn get_method(&self, obj: PyObjectRef, method_name: &str) -> PyResult[src]

pub fn call_or_unsupported<F>(
    &self,
    obj: PyObjectRef,
    arg: PyObjectRef,
    method: &str,
    unsupported: F
) -> PyResult where
    F: Fn(&VirtualMachine, PyObjectRef, PyObjectRef) -> PyResult
[src]

Calls a method on obj passing arg, if the method exists.

Otherwise, or if the result is the special NotImplemented built-in constant, calls unsupported to determine fallback value.

-

Calls a method, falling back to its reflection with the operands +

pub fn call_or_reflection(
    &self,
    lhs: PyObjectRef,
    rhs: PyObjectRef,
    default: &str,
    reflection: &str,
    unsupported: fn(_: &VirtualMachine, _: PyObjectRef, _: PyObjectRef) -> PyResult
) -> PyResult
[src]

Calls a method, falling back to its reflection with the operands reversed, and then to the value provided by unsupported.

For example: the following:

call_or_reflection(lhs, rhs, "__and__", "__rand__", unsupported)

@@ -49,16 +30,15 @@
  • If above is not implemented, calls __rand__ with rhs and lhs.
  • If above is not implemented, invokes unsupported for the result.
  • -

    Auto Trait Implementations

    Blanket Implementations

    impl<T, U> Into for T where
        U: From<T>, 
    [src]

    impl<T> From for T
    [src]

    impl<T, U> TryFrom for T where
        T: From<U>, 
    [src]

    -
    🔬 This is a nightly-only experimental API. (try_from)

    The type returned in the event of a conversion error.

    -

    impl<T> Borrow for T where
        T: ?Sized
    [src]

    impl<T> Any for T where
        T: 'static + ?Sized
    [src]

    Trait Implementations

    impl Default for VirtualMachine[src]

    Auto Trait Implementations

    Blanket Implementations

    impl<T> From for T[src]

    impl<T, U> Into for T where
        U: From<T>, 
    [src]

    impl<T, U> TryFrom for T where
        T: From<U>, 
    [src]

    type Error = !

    🔬 This is a nightly-only experimental API. (try_from)

    The type returned in the event of a conversion error.

    +

    impl<T> Borrow for T where
        T: ?Sized
    [src]

    impl<T> BorrowMut for T where
        T: ?Sized
    [src]

    impl<T, U> TryInto for T where
        U: TryFrom<T>, 
    [src]

    type Error = <U as TryFrom<T>>::Error

    🔬 This is a nightly-only experimental API. (try_from)

    The type returned in the event of a conversion error.

    +

    impl<T> Any for T where
        T: 'static + ?Sized
    [src]

    impl<T, U> TryInto for T where
        U: TryFrom<T>, 
    [src]

    -
    🔬 This is a nightly-only experimental API. (try_from)

    The type returned in the event of a conversion error.

    -

    impl<T> BorrowMut for T where
        T: ?Sized
    [src]

    \ No newline at end of file +
    \ No newline at end of file diff --git a/rustpython_vm/util/fn.read_file.html b/rustpython_vm/util/fn.read_file.html index 64aa3ac..37d2e34 100644 --- a/rustpython_vm/util/fn.read_file.html +++ b/rustpython_vm/util/fn.read_file.html @@ -1,2 +1,2 @@ -rustpython_vm::util::read_file - Rust

    [][src]Function rustpython_vm::util::read_file

    pub fn read_file(path: &Path) -> Result<String>

    Read a file at path into a String

    -
    \ No newline at end of file +rustpython_vm::util::read_file - Rust

    [][src]Function rustpython_vm::util::read_file

    pub fn read_file(path: &Path) -> Result<String>

    Read a file at path into a String

    +
    \ No newline at end of file diff --git a/rustpython_vm/util/index.html b/rustpython_vm/util/index.html index 6401813..8cda7a2 100644 --- a/rustpython_vm/util/index.html +++ b/rustpython_vm/util/index.html @@ -1,3 +1,3 @@ -rustpython_vm::util - Rust

    [][src]Module rustpython_vm::util

    Functions

    +rustpython_vm::util - Rust

    [][src]Module rustpython_vm::util

    Functions

    read_file

    Read a file at path into a String

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/rustpython_wasm/all.html b/rustpython_wasm/all.html index 7787cb0..10ed884 100644 --- a/rustpython_wasm/all.html +++ b/rustpython_wasm/all.html @@ -1,3 +1,3 @@ -List of all items in this crate

    [] +List of all items in this crate

    [] - List of all items

    Structs

    Functions

    \ No newline at end of file + List of all items

    Structs

    Traits

    Functions

    \ No newline at end of file diff --git a/rustpython_wasm/browser_module/PyPromise.t.html b/rustpython_wasm/browser_module/PyPromise.t.html new file mode 100644 index 0000000..6a1cf6a --- /dev/null +++ b/rustpython_wasm/browser_module/PyPromise.t.html @@ -0,0 +1,10 @@ + + + + + + +

    Redirecting to struct.PyPromise.html...

    + + + \ No newline at end of file diff --git a/rustpython_wasm/browser_module/fn.get_promise_value.html b/rustpython_wasm/browser_module/fn.get_promise_value.html new file mode 100644 index 0000000..51c2789 --- /dev/null +++ b/rustpython_wasm/browser_module/fn.get_promise_value.html @@ -0,0 +1 @@ +rustpython_wasm::browser_module::get_promise_value - Rust

    [][src]Function rustpython_wasm::browser_module::get_promise_value

    pub fn get_promise_value(obj: &PyObjectRef) -> Promise
    \ No newline at end of file diff --git a/rustpython_wasm/browser_module/fn.import_promise_type.html b/rustpython_wasm/browser_module/fn.import_promise_type.html new file mode 100644 index 0000000..d32155b --- /dev/null +++ b/rustpython_wasm/browser_module/fn.import_promise_type.html @@ -0,0 +1 @@ +rustpython_wasm::browser_module::import_promise_type - Rust

    [][src]Function rustpython_wasm::browser_module::import_promise_type

    pub fn import_promise_type(vm: &VirtualMachine) -> PyResult
    \ No newline at end of file diff --git a/rustpython_wasm/browser_module/fn.make_module.html b/rustpython_wasm/browser_module/fn.make_module.html new file mode 100644 index 0000000..1953fdb --- /dev/null +++ b/rustpython_wasm/browser_module/fn.make_module.html @@ -0,0 +1 @@ +rustpython_wasm::browser_module::make_module - Rust

    [][src]Function rustpython_wasm::browser_module::make_module

    pub fn make_module(ctx: &PyContext) -> PyObjectRef
    \ No newline at end of file diff --git a/rustpython_wasm/browser_module/fn.setup_browser_module.html b/rustpython_wasm/browser_module/fn.setup_browser_module.html new file mode 100644 index 0000000..98a388d --- /dev/null +++ b/rustpython_wasm/browser_module/fn.setup_browser_module.html @@ -0,0 +1 @@ +rustpython_wasm::browser_module::setup_browser_module - Rust

    [][src]Function rustpython_wasm::browser_module::setup_browser_module

    pub fn setup_browser_module(vm: &VirtualMachine)
    \ No newline at end of file diff --git a/rustpython_wasm/browser_module/get_promise_value.v.html b/rustpython_wasm/browser_module/get_promise_value.v.html new file mode 100644 index 0000000..8bdb4cb --- /dev/null +++ b/rustpython_wasm/browser_module/get_promise_value.v.html @@ -0,0 +1,10 @@ + + + + + + +

    Redirecting to fn.get_promise_value.html...

    + + + \ No newline at end of file diff --git a/rustpython_wasm/browser_module/import_promise_type.v.html b/rustpython_wasm/browser_module/import_promise_type.v.html new file mode 100644 index 0000000..2c83e87 --- /dev/null +++ b/rustpython_wasm/browser_module/import_promise_type.v.html @@ -0,0 +1,10 @@ + + + + + + +

    Redirecting to fn.import_promise_type.html...

    + + + \ No newline at end of file diff --git a/rustpython_wasm/browser_module/index.html b/rustpython_wasm/browser_module/index.html new file mode 100644 index 0000000..3db18d1 --- /dev/null +++ b/rustpython_wasm/browser_module/index.html @@ -0,0 +1,3 @@ +rustpython_wasm::browser_module - Rust

    [][src]Module rustpython_wasm::browser_module

    Structs

    +
    PyPromise

    Functions

    +
    get_promise_value
    import_promise_type
    make_module
    setup_browser_module
    \ No newline at end of file diff --git a/rustpython_wasm/browser_module/make_module.v.html b/rustpython_wasm/browser_module/make_module.v.html new file mode 100644 index 0000000..1166bdd --- /dev/null +++ b/rustpython_wasm/browser_module/make_module.v.html @@ -0,0 +1,10 @@ + + + + + + +

    Redirecting to fn.make_module.html...

    + + + \ No newline at end of file diff --git a/rustpython_wasm/browser_module/setup_browser_module.v.html b/rustpython_wasm/browser_module/setup_browser_module.v.html new file mode 100644 index 0000000..7ce589e --- /dev/null +++ b/rustpython_wasm/browser_module/setup_browser_module.v.html @@ -0,0 +1,10 @@ + + + + + + +

    Redirecting to fn.setup_browser_module.html...

    + + + \ No newline at end of file diff --git a/rustpython_wasm/browser_module/sidebar-items.js b/rustpython_wasm/browser_module/sidebar-items.js new file mode 100644 index 0000000..ec9c213 --- /dev/null +++ b/rustpython_wasm/browser_module/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"fn":[["get_promise_value",""],["import_promise_type",""],["make_module",""],["setup_browser_module",""]],"struct":[["PyPromise",""]]}); \ No newline at end of file diff --git a/rustpython_wasm/browser_module/struct.PyPromise.html b/rustpython_wasm/browser_module/struct.PyPromise.html new file mode 100644 index 0000000..4ed9d0d --- /dev/null +++ b/rustpython_wasm/browser_module/struct.PyPromise.html @@ -0,0 +1,12 @@ +rustpython_wasm::browser_module::PyPromise - Rust

    [][src]Struct rustpython_wasm::browser_module::PyPromise

    pub struct PyPromise { /* fields omitted */ }

    Methods

    impl PyPromise[src]

    pub fn new_obj(promise_type: PyObjectRef, value: Promise) -> PyObjectRef[src]

    Trait Implementations

    impl Debug for PyPromise[src]

    impl PyValue for PyPromise[src]

    fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self>[src]

    fn into_ref_with_type(
        self,
        vm: &VirtualMachine,
        cls: PyRef<PyClass>
    ) -> Result<PyRef<Self>, Rc<PyObject>>
    [src]

    Auto Trait Implementations

    impl !Send for PyPromise

    impl !Sync for PyPromise

    Blanket Implementations

    impl<T> HeldRcInner for T[src]

    impl<T> From for T[src]

    impl<T, U> Into for T where
        U: From<T>, 
    [src]

    impl<T, U> TryFrom for T where
        T: From<U>, 
    [src]

    type Error = !

    🔬 This is a nightly-only experimental API. (try_from)

    The type returned in the event of a conversion error.

    +

    impl<T> Borrow for T where
        T: ?Sized
    [src]

    impl<T> BorrowMut for T where
        T: ?Sized
    [src]

    impl<T, U> TryInto for T where
        U: TryFrom<T>, 
    [src]

    type Error = <U as TryFrom<T>>::Error

    🔬 This is a nightly-only experimental API. (try_from)

    The type returned in the event of a conversion error.

    +

    impl<T> Any for T where
        T: 'static + ?Sized
    [src]

    impl<T> IntoPyObject for T where
        T: PyValue
    [src]

    impl<T> PyObjectPayload for T where
        T: 'static + PyValue
    [src]

    \ No newline at end of file diff --git a/rustpython_wasm/convert/fn.js_py_typeerror.html b/rustpython_wasm/convert/fn.js_py_typeerror.html index 6254eef..0395bdd 100644 --- a/rustpython_wasm/convert/fn.js_py_typeerror.html +++ b/rustpython_wasm/convert/fn.js_py_typeerror.html @@ -1 +1 @@ -rustpython_wasm::convert::js_py_typeerror - Rust

    [][src]Function rustpython_wasm::convert::js_py_typeerror

    pub fn js_py_typeerror(vm: &mut VirtualMachine, js_err: JsValue) -> PyObjectRef
    \ No newline at end of file +rustpython_wasm::convert::js_py_typeerror - Rust

    [][src]Function rustpython_wasm::convert::js_py_typeerror

    pub fn js_py_typeerror(vm: &VirtualMachine, js_err: JsValue) -> PyObjectRef
    \ No newline at end of file diff --git a/rustpython_wasm/convert/fn.js_to_py.html b/rustpython_wasm/convert/fn.js_to_py.html index b549821..6f91cb0 100644 --- a/rustpython_wasm/convert/fn.js_to_py.html +++ b/rustpython_wasm/convert/fn.js_to_py.html @@ -1 +1 @@ -rustpython_wasm::convert::js_to_py - Rust

    [][src]Function rustpython_wasm::convert::js_to_py

    pub fn js_to_py(vm: &mut VirtualMachine, js_val: JsValue) -> PyObjectRef
    \ No newline at end of file +rustpython_wasm::convert::js_to_py - Rust

    [][src]Function rustpython_wasm::convert::js_to_py

    pub fn js_to_py(vm: &VirtualMachine, js_val: JsValue) -> PyObjectRef
    \ No newline at end of file diff --git a/rustpython_wasm/convert/fn.object_entries.html b/rustpython_wasm/convert/fn.object_entries.html index 2cbeeec..ea9f8f4 100644 --- a/rustpython_wasm/convert/fn.object_entries.html +++ b/rustpython_wasm/convert/fn.object_entries.html @@ -1 +1 @@ -rustpython_wasm::convert::object_entries - Rust

    [][src]Function rustpython_wasm::convert::object_entries

    pub fn object_entries(
        obj: &Object
    ) -> impl Iterator<Item = Result<(JsValue, JsValue), JsValue>>
    \ No newline at end of file +rustpython_wasm::convert::object_entries - Rust

    [][src]Function rustpython_wasm::convert::object_entries

    pub fn object_entries(
        obj: &Object
    ) -> impl Iterator<Item = Result<(JsValue, JsValue), JsValue>>
    \ No newline at end of file diff --git a/rustpython_wasm/convert/fn.py_err_to_js_err.html b/rustpython_wasm/convert/fn.py_err_to_js_err.html new file mode 100644 index 0000000..0b1198e --- /dev/null +++ b/rustpython_wasm/convert/fn.py_err_to_js_err.html @@ -0,0 +1 @@ +rustpython_wasm::convert::py_err_to_js_err - Rust

    [][src]Function rustpython_wasm::convert::py_err_to_js_err

    pub fn py_err_to_js_err(vm: &VirtualMachine, py_err: &PyObjectRef) -> JsValue
    \ No newline at end of file diff --git a/rustpython_wasm/convert/fn.py_to_js.html b/rustpython_wasm/convert/fn.py_to_js.html index 4b56bd1..6aa6aba 100644 --- a/rustpython_wasm/convert/fn.py_to_js.html +++ b/rustpython_wasm/convert/fn.py_to_js.html @@ -1 +1 @@ -rustpython_wasm::convert::py_to_js - Rust

    [][src]Function rustpython_wasm::convert::py_to_js

    pub fn py_to_js(vm: &mut VirtualMachine, py_obj: PyObjectRef) -> JsValue
    \ No newline at end of file +rustpython_wasm::convert::py_to_js - Rust

    [][src]Function rustpython_wasm::convert::py_to_js

    pub fn py_to_js(vm: &VirtualMachine, py_obj: PyObjectRef) -> JsValue
    \ No newline at end of file diff --git a/rustpython_wasm/convert/fn.pyresult_to_jsresult.html b/rustpython_wasm/convert/fn.pyresult_to_jsresult.html index f613940..354a5cf 100644 --- a/rustpython_wasm/convert/fn.pyresult_to_jsresult.html +++ b/rustpython_wasm/convert/fn.pyresult_to_jsresult.html @@ -1 +1 @@ -rustpython_wasm::convert::pyresult_to_jsresult - Rust

    [][src]Function rustpython_wasm::convert::pyresult_to_jsresult

    pub fn pyresult_to_jsresult(
        vm: &mut VirtualMachine,
        result: PyResult
    ) -> Result<JsValue, JsValue>
    \ No newline at end of file +rustpython_wasm::convert::pyresult_to_jsresult - Rust

    [][src]Function rustpython_wasm::convert::pyresult_to_jsresult

    pub fn pyresult_to_jsresult(
        vm: &VirtualMachine,
        result: PyResult
    ) -> Result<JsValue, JsValue>
    \ No newline at end of file diff --git a/rustpython_wasm/convert/index.html b/rustpython_wasm/convert/index.html index c707be7..1a854b2 100644 --- a/rustpython_wasm/convert/index.html +++ b/rustpython_wasm/convert/index.html @@ -1,2 +1,2 @@ -rustpython_wasm::convert - Rust

    [][src]Module rustpython_wasm::convert

    Functions

    -
    js_py_typeerror
    js_to_py
    object_entries
    py_str_err
    py_to_js
    pyresult_to_jsresult
    \ No newline at end of file +rustpython_wasm::convert - Rust

    [][src]Module rustpython_wasm::convert

    Functions

    +
    js_py_typeerror
    js_to_py
    object_entries
    py_err_to_js_err
    py_to_js
    pyresult_to_jsresult
    \ No newline at end of file diff --git a/rustpython_wasm/convert/py_err_to_js_err.v.html b/rustpython_wasm/convert/py_err_to_js_err.v.html new file mode 100644 index 0000000..1487af7 --- /dev/null +++ b/rustpython_wasm/convert/py_err_to_js_err.v.html @@ -0,0 +1,10 @@ + + + + + + +

    Redirecting to fn.py_err_to_js_err.html...

    + + + \ No newline at end of file diff --git a/rustpython_wasm/convert/sidebar-items.js b/rustpython_wasm/convert/sidebar-items.js index 0e3bd74..7a4a4bc 100644 --- a/rustpython_wasm/convert/sidebar-items.js +++ b/rustpython_wasm/convert/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["js_py_typeerror",""],["js_to_py",""],["object_entries",""],["py_str_err",""],["py_to_js",""],["pyresult_to_jsresult",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["js_py_typeerror",""],["js_to_py",""],["object_entries",""],["py_err_to_js_err",""],["py_to_js",""],["pyresult_to_jsresult",""]]}); \ No newline at end of file diff --git a/rustpython_wasm/fn.eval_py.html b/rustpython_wasm/fn.eval_py.html index 79951ec..feffa5d 100644 --- a/rustpython_wasm/fn.eval_py.html +++ b/rustpython_wasm/fn.eval_py.html @@ -1,4 +1,4 @@ -rustpython_wasm::eval_py - Rust

    [][src]Function rustpython_wasm::eval_py

    pub fn eval_py(
        source: String,
        options: Option<Object>
    ) -> Result<JsValue, JsValue>

    Evaluate Python code

    +rustpython_wasm::eval_py - Rust

    [][src]Function rustpython_wasm::eval_py

    pub fn eval_py(
        source: String,
        options: Option<Object>
    ) -> Result<JsValue, JsValue>

    Evaluate Python code

    pyEval(code, options?);
     

    code: string: The Python code to run

    @@ -10,4 +10,4 @@
  • stdout?: (out: string) => void: A function to replace the native print function, by default console.log.
  • -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/rustpython_wasm/fn.setup_console_error.html b/rustpython_wasm/fn.setup_console_error.html index 1098244..4683c9d 100644 --- a/rustpython_wasm/fn.setup_console_error.html +++ b/rustpython_wasm/fn.setup_console_error.html @@ -1 +1 @@ -rustpython_wasm::setup_console_error - Rust

    [][src]Function rustpython_wasm::setup_console_error

    pub fn setup_console_error()
    \ No newline at end of file +rustpython_wasm::setup_console_error - Rust

    [][src]Function rustpython_wasm::setup_console_error

    pub fn setup_console_error()
    \ No newline at end of file diff --git a/rustpython_wasm/index.html b/rustpython_wasm/index.html index 30090f5..307be88 100644 --- a/rustpython_wasm/index.html +++ b/rustpython_wasm/index.html @@ -1,6 +1,6 @@ -rustpython_wasm - Rust

    [][src]Crate rustpython_wasm

    Re-exports

    +rustpython_wasm - Rust

    [][src]Crate rustpython_wasm

    Re-exports

    pub use crate::vm_class::*;

    Modules

    -
    convert
    vm_class
    wasm_builtins

    Builtin function specific to WASM build.

    +
    browser_module
    convert
    vm_class
    wasm_builtins

    Builtin function specific to WASM build.

    Functions

    eval_py

    Evaluate Python code

    -
    setup_console_error
    \ No newline at end of file +
    setup_console_error
    \ No newline at end of file diff --git a/rustpython_wasm/sidebar-items.js b/rustpython_wasm/sidebar-items.js index 495035e..8327c76 100644 --- a/rustpython_wasm/sidebar-items.js +++ b/rustpython_wasm/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["eval_py","Evaluate Python code"],["setup_console_error",""]],"mod":[["convert",""],["vm_class",""],["wasm_builtins","Builtin function specific to WASM build."]]}); \ No newline at end of file +initSidebarItems({"fn":[["eval_py","Evaluate Python code"],["setup_console_error",""]],"mod":[["browser_module",""],["convert",""],["vm_class",""],["wasm_builtins","Builtin function specific to WASM build."]]}); \ No newline at end of file diff --git a/rustpython_wasm/vm_class/HeldRcInner.t.html b/rustpython_wasm/vm_class/HeldRcInner.t.html new file mode 100644 index 0000000..cbdce53 --- /dev/null +++ b/rustpython_wasm/vm_class/HeldRcInner.t.html @@ -0,0 +1,10 @@ + + + + + + +

    Redirecting to trait.HeldRcInner.html...

    + + + \ No newline at end of file diff --git a/rustpython_wasm/vm_class/index.html b/rustpython_wasm/vm_class/index.html index f02c69d..b9b86f4 100644 --- a/rustpython_wasm/vm_class/index.html +++ b/rustpython_wasm/vm_class/index.html @@ -1,2 +1,3 @@ -rustpython_wasm::vm_class - Rust

    [][src]Module rustpython_wasm::vm_class

    Structs

    -
    AccessibleVM
    AccessibleVMPtr
    VMStore
    WASMVirtualMachine
    \ No newline at end of file +rustpython_wasm::vm_class - Rust

    [][src]Module rustpython_wasm::vm_class

    Structs

    +
    VMStore
    WASMVirtualMachine

    Traits

    +
    HeldRcInner
    \ No newline at end of file diff --git a/rustpython_wasm/vm_class/sidebar-items.js b/rustpython_wasm/vm_class/sidebar-items.js index 5fc0ba3..7aca161 100644 --- a/rustpython_wasm/vm_class/sidebar-items.js +++ b/rustpython_wasm/vm_class/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"struct":[["AccessibleVM",""],["AccessibleVMPtr",""],["VMStore",""],["WASMVirtualMachine",""]]}); \ No newline at end of file +initSidebarItems({"struct":[["VMStore",""],["WASMVirtualMachine",""]],"trait":[["HeldRcInner",""]]}); \ No newline at end of file diff --git a/rustpython_wasm/vm_class/struct.VMStore.html b/rustpython_wasm/vm_class/struct.VMStore.html index 44dec28..8c1e57e 100644 --- a/rustpython_wasm/vm_class/struct.VMStore.html +++ b/rustpython_wasm/vm_class/struct.VMStore.html @@ -1,33 +1,24 @@ -rustpython_wasm::vm_class::VMStore - Rust

    [][src]Struct rustpython_wasm::vm_class::VMStore

    pub struct VMStore;

    Methods

    impl VMStore
    [src]

    Trait Implementations

    impl From<VMStore> for JsValue
    [src]

    impl FromWasmAbi for VMStore
    [src]

    -

    The wasm ABI type that this converts from when coming back out from the ABI boundary. Read more

    -

    impl WasmDescribe for VMStore
    [src]

    impl IntoWasmAbi for VMStore
    [src]

    -

    The wasm ABI type that this converts into when crossing the ABI boundary. Read more

    -

    impl RefFromWasmAbi for VMStore
    [src]

    -

    The wasm ABI type references to Self are recovered from.

    -

    -

    The type that holds the reference to Self for the duration of the invocation of the function that has an &Self parameter. This is required to ensure that the lifetimes don't persist beyond one function call, and so that they remain anonymous. Read more

    -

    impl RefMutFromWasmAbi for VMStore
    [src]

    -

    Same as RefFromWasmAbi::Abi

    -

    -

    Same as RefFromWasmAbi::Anchor

    -

    Auto Trait Implementations

    impl Send for VMStore

    impl Sync for VMStore

    Blanket Implementations

    impl<T, U> Into for T where
        U: From<T>, 
    [src]

    impl<T> From for T
    [src]

    impl<T, U> TryFrom for T where
        T: From<U>, 
    [src]

    -
    🔬 This is a nightly-only experimental API. (try_from)

    The type returned in the event of a conversion error.

    -

    impl<T> Borrow for T where
        T: ?Sized
    [src]

    impl<T> Any for T where
        T: 'static + ?Sized
    [src]

    impl<T> ReturnWasmAbi for T where
        T: IntoWasmAbi
    [src]

    type Abi = <T as IntoWasmAbi>::Abi

    Same as IntoWasmAbi::Abi

    +
    \ No newline at end of file diff --git a/rustpython_wasm/vm_class/struct.WASMVirtualMachine.html b/rustpython_wasm/vm_class/struct.WASMVirtualMachine.html index eb2b670..78318ea 100644 --- a/rustpython_wasm/vm_class/struct.WASMVirtualMachine.html +++ b/rustpython_wasm/vm_class/struct.WASMVirtualMachine.html @@ -1,41 +1,29 @@ -rustpython_wasm::vm_class::WASMVirtualMachine - Rust

    [][src]Struct rustpython_wasm::vm_class::WASMVirtualMachine

    pub struct WASMVirtualMachine { /* fields omitted */ }

    Methods

    impl WASMVirtualMachine
    [src]

    Trait Implementations

    impl From<WASMVirtualMachine> for AccessibleVM
    [src]

    impl<'_> From<&'_ WASMVirtualMachine> for AccessibleVM
    [src]

    impl From<WASMVirtualMachine> for JsValue
    [src]

    impl Clone for WASMVirtualMachine
    [src]

    Performs copy-assignment from source. Read more

    -

    impl FromWasmAbi for WASMVirtualMachine
    [src]

    -

    The wasm ABI type that this converts from when coming back out from the ABI boundary. Read more

    -

    impl WasmDescribe for WASMVirtualMachine
    [src]

    impl IntoWasmAbi for WASMVirtualMachine
    [src]

    -

    The wasm ABI type that this converts into when crossing the ABI boundary. Read more

    -

    impl RefFromWasmAbi for WASMVirtualMachine
    [src]

    -

    The wasm ABI type references to Self are recovered from.

    -

    -

    The type that holds the reference to Self for the duration of the invocation of the function that has an &Self parameter. This is required to ensure that the lifetimes don't persist beyond one function call, and so that they remain anonymous. Read more

    -

    impl RefMutFromWasmAbi for WASMVirtualMachine
    [src]

    -

    Same as RefFromWasmAbi::Abi

    -

    -

    Same as RefFromWasmAbi::Anchor

    -

    Auto Trait Implementations

    Blanket Implementations

    impl<T, U> Into for T where
        U: From<T>, 
    [src]

    impl<T> ToOwned for T where
        T: Clone
    [src]

    -

    impl<T> ReturnWasmAbi for T where
        T: IntoWasmAbi
    [src]

    type Abi = <T as IntoWasmAbi>::Abi

    Same as IntoWasmAbi::Abi

    +
    \ No newline at end of file diff --git a/rustpython_wasm/vm_class/trait.HeldRcInner.html b/rustpython_wasm/vm_class/trait.HeldRcInner.html new file mode 100644 index 0000000..55119d9 --- /dev/null +++ b/rustpython_wasm/vm_class/trait.HeldRcInner.html @@ -0,0 +1,4 @@ +rustpython_wasm::vm_class::HeldRcInner - Rust

    [][src]Trait rustpython_wasm::vm_class::HeldRcInner

    pub trait HeldRcInner { }
    +

    Implementors

    impl<T> HeldRcInner for T[src]

    Loading content...
    \ No newline at end of file diff --git a/rustpython_wasm/wasm_builtins/fn.builtin_print_console.html b/rustpython_wasm/wasm_builtins/fn.builtin_print_console.html index 21506c4..b472f34 100644 --- a/rustpython_wasm/wasm_builtins/fn.builtin_print_console.html +++ b/rustpython_wasm/wasm_builtins/fn.builtin_print_console.html @@ -1 +1 @@ -rustpython_wasm::wasm_builtins::builtin_print_console - Rust

    [][src]Function rustpython_wasm::wasm_builtins::builtin_print_console

    pub fn builtin_print_console(
        vm: &mut VirtualMachine,
        args: PyFuncArgs
    ) -> PyResult
    \ No newline at end of file +rustpython_wasm::wasm_builtins::builtin_print_console - Rust

    [][src]Function rustpython_wasm::wasm_builtins::builtin_print_console

    pub fn builtin_print_console(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult
    \ No newline at end of file diff --git a/rustpython_wasm/wasm_builtins/fn.format_print_args.html b/rustpython_wasm/wasm_builtins/fn.format_print_args.html index 82f82bf..73c5010 100644 --- a/rustpython_wasm/wasm_builtins/fn.format_print_args.html +++ b/rustpython_wasm/wasm_builtins/fn.format_print_args.html @@ -1 +1 @@ -rustpython_wasm::wasm_builtins::format_print_args - Rust

    [][src]Function rustpython_wasm::wasm_builtins::format_print_args

    pub fn format_print_args(
        vm: &mut VirtualMachine,
        args: PyFuncArgs
    ) -> Result<String, PyObjectRef>
    \ No newline at end of file +rustpython_wasm::wasm_builtins::format_print_args - Rust

    [][src]Function rustpython_wasm::wasm_builtins::format_print_args

    pub fn format_print_args(
        vm: &VirtualMachine,
        args: PyFuncArgs
    ) -> Result<String, PyObjectRef>
    \ No newline at end of file diff --git a/rustpython_wasm/wasm_builtins/index.html b/rustpython_wasm/wasm_builtins/index.html index 1fe9e6c..f1f0816 100644 --- a/rustpython_wasm/wasm_builtins/index.html +++ b/rustpython_wasm/wasm_builtins/index.html @@ -1,7 +1,6 @@ -rustpython_wasm::wasm_builtins - Rust

    [][src]Module rustpython_wasm::wasm_builtins

    Builtin function specific to WASM build.

    +rustpython_wasm::wasm_builtins - Rust

    [][src]Module rustpython_wasm::wasm_builtins

    Builtin function specific to WASM build.

    This is required because some feature like I/O works differently in the browser comparing to desktop. -Implements functions listed here: https://docs.python.org/3/library/builtins.html and some -others.

    +Implements functions listed here: https://docs.python.org/3/library/builtins.html.

    Functions

    -
    builtin_print_console
    builtin_print_html
    format_print_args
    print_to_html
    setup_wasm_builtins
    \ No newline at end of file +
    builtin_print_console
    format_print_args
    \ No newline at end of file diff --git a/rustpython_wasm/wasm_builtins/sidebar-items.js b/rustpython_wasm/wasm_builtins/sidebar-items.js index 1ac27cd..d2aa8b3 100644 --- a/rustpython_wasm/wasm_builtins/sidebar-items.js +++ b/rustpython_wasm/wasm_builtins/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["builtin_print_console",""],["builtin_print_html",""],["format_print_args",""],["print_to_html",""],["setup_wasm_builtins",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["builtin_print_console",""],["format_print_args",""]]}); \ No newline at end of file diff --git a/search-index.js b/search-index.js index 625a3be..127ca80 100644 --- a/search-index.js +++ b/search-index.js @@ -1,6 +1,7 @@ var N = null;var searchIndex = {}; searchIndex["rustpython"]={"doc":"","items":[],"paths":[]}; -searchIndex["rustpython_parser"]={"doc":"","items":[[0,"ast","rustpython_parser","Implement abstract syntax tree nodes for the python language.",N,N],[3,"Program","rustpython_parser::ast","",N,N],[12,"statements","","",0,N],[3,"SingleImport","","",N,N],[12,"module","","",1,N],[12,"symbol","","",1,N],[12,"alias","","",1,N],[3,"Located","","",N,N],[12,"location","","",2,N],[12,"node","","",2,N],[3,"WithItem","","",N,N],[12,"context_expr","","",3,N],[12,"optional_vars","","",3,N],[3,"Parameters","","",N,N],[12,"args","","",4,N],[12,"kwonlyargs","","",4,N],[12,"vararg","","",4,N],[12,"kwarg","","",4,N],[12,"defaults","","",4,N],[12,"kw_defaults","","",4,N],[3,"Comprehension","","",N,N],[12,"target","","",5,N],[12,"iter","","",5,N],[12,"ifs","","",5,N],[3,"Keyword","","",N,N],[12,"name","","",6,N],[12,"value","","",6,N],[3,"ExceptHandler","","",N,N],[12,"typ","","",7,N],[12,"name","","",7,N],[12,"body","","",7,N],[4,"Top","","",N,N],[13,"Program","","",8,N],[13,"Statement","","",8,N],[13,"Expression","","",8,N],[4,"Statement","","Abstract syntax tree nodes for python statements.",N,N],[13,"Break","","",9,N],[13,"Continue","","",9,N],[13,"Return","","",9,N],[12,"value","rustpython_parser::ast::Statement","",9,N],[13,"Import","rustpython_parser::ast","",9,N],[12,"import_parts","rustpython_parser::ast::Statement","",9,N],[13,"Pass","rustpython_parser::ast","",9,N],[13,"Assert","","",9,N],[12,"test","rustpython_parser::ast::Statement","",9,N],[12,"msg","","",9,N],[13,"Delete","rustpython_parser::ast","",9,N],[12,"targets","rustpython_parser::ast::Statement","",9,N],[13,"Assign","rustpython_parser::ast","",9,N],[12,"targets","rustpython_parser::ast::Statement","",9,N],[12,"value","","",9,N],[13,"AugAssign","rustpython_parser::ast","",9,N],[12,"target","rustpython_parser::ast::Statement","",9,N],[12,"op","","",9,N],[12,"value","","",9,N],[13,"Expression","rustpython_parser::ast","",9,N],[12,"expression","rustpython_parser::ast::Statement","",9,N],[13,"Global","rustpython_parser::ast","",9,N],[12,"names","rustpython_parser::ast::Statement","",9,N],[13,"Nonlocal","rustpython_parser::ast","",9,N],[12,"names","rustpython_parser::ast::Statement","",9,N],[13,"If","rustpython_parser::ast","",9,N],[12,"test","rustpython_parser::ast::Statement","",9,N],[12,"body","","",9,N],[12,"orelse","","",9,N],[13,"While","rustpython_parser::ast","",9,N],[12,"test","rustpython_parser::ast::Statement","",9,N],[12,"body","","",9,N],[12,"orelse","","",9,N],[13,"With","rustpython_parser::ast","",9,N],[12,"items","rustpython_parser::ast::Statement","",9,N],[12,"body","","",9,N],[13,"For","rustpython_parser::ast","",9,N],[12,"target","rustpython_parser::ast::Statement","",9,N],[12,"iter","","",9,N],[12,"body","","",9,N],[12,"orelse","","",9,N],[13,"Raise","rustpython_parser::ast","",9,N],[12,"exception","rustpython_parser::ast::Statement","",9,N],[12,"cause","","",9,N],[13,"Try","rustpython_parser::ast","",9,N],[12,"body","rustpython_parser::ast::Statement","",9,N],[12,"handlers","","",9,N],[12,"orelse","","",9,N],[12,"finalbody","","",9,N],[13,"ClassDef","rustpython_parser::ast","",9,N],[12,"name","rustpython_parser::ast::Statement","",9,N],[12,"body","","",9,N],[12,"bases","","",9,N],[12,"keywords","","",9,N],[12,"decorator_list","","",9,N],[13,"FunctionDef","rustpython_parser::ast","",9,N],[12,"name","rustpython_parser::ast::Statement","",9,N],[12,"args","","",9,N],[12,"body","","",9,N],[12,"decorator_list","","",9,N],[4,"Expression","rustpython_parser::ast","",N,N],[13,"BoolOp","","",10,N],[12,"a","rustpython_parser::ast::Expression","",10,N],[12,"op","","",10,N],[12,"b","","",10,N],[13,"Binop","rustpython_parser::ast","",10,N],[12,"a","rustpython_parser::ast::Expression","",10,N],[12,"op","","",10,N],[12,"b","","",10,N],[13,"Subscript","rustpython_parser::ast","",10,N],[12,"a","rustpython_parser::ast::Expression","",10,N],[12,"b","","",10,N],[13,"Unop","rustpython_parser::ast","",10,N],[12,"op","rustpython_parser::ast::Expression","",10,N],[12,"a","","",10,N],[13,"Yield","rustpython_parser::ast","",10,N],[12,"value","rustpython_parser::ast::Expression","",10,N],[13,"YieldFrom","rustpython_parser::ast","",10,N],[12,"value","rustpython_parser::ast::Expression","",10,N],[13,"Compare","rustpython_parser::ast","",10,N],[12,"a","rustpython_parser::ast::Expression","",10,N],[12,"op","","",10,N],[12,"b","","",10,N],[13,"Attribute","rustpython_parser::ast","",10,N],[12,"value","rustpython_parser::ast::Expression","",10,N],[12,"name","","",10,N],[13,"Call","rustpython_parser::ast","",10,N],[12,"function","rustpython_parser::ast::Expression","",10,N],[12,"args","","",10,N],[12,"keywords","","",10,N],[13,"Number","rustpython_parser::ast","",10,N],[12,"value","rustpython_parser::ast::Expression","",10,N],[13,"List","rustpython_parser::ast","",10,N],[12,"elements","rustpython_parser::ast::Expression","",10,N],[13,"Tuple","rustpython_parser::ast","",10,N],[12,"elements","rustpython_parser::ast::Expression","",10,N],[13,"Dict","rustpython_parser::ast","",10,N],[12,"elements","rustpython_parser::ast::Expression","",10,N],[13,"Set","rustpython_parser::ast","",10,N],[12,"elements","rustpython_parser::ast::Expression","",10,N],[13,"Comprehension","rustpython_parser::ast","",10,N],[12,"kind","rustpython_parser::ast::Expression","",10,N],[12,"generators","","",10,N],[13,"Starred","rustpython_parser::ast","",10,N],[12,"value","rustpython_parser::ast::Expression","",10,N],[13,"Slice","rustpython_parser::ast","",10,N],[12,"elements","rustpython_parser::ast::Expression","",10,N],[13,"String","rustpython_parser::ast","",10,N],[12,"value","rustpython_parser::ast::Expression","",10,N],[13,"Bytes","rustpython_parser::ast","",10,N],[12,"value","rustpython_parser::ast::Expression","",10,N],[13,"Identifier","rustpython_parser::ast","",10,N],[12,"name","rustpython_parser::ast::Expression","",10,N],[13,"Lambda","rustpython_parser::ast","",10,N],[12,"args","rustpython_parser::ast::Expression","",10,N],[12,"body","","",10,N],[13,"IfExpression","rustpython_parser::ast","",10,N],[12,"test","rustpython_parser::ast::Expression","",10,N],[12,"body","","",10,N],[12,"orelse","","",10,N],[13,"True","rustpython_parser::ast","",10,N],[13,"False","","",10,N],[13,"None","","",10,N],[4,"ComprehensionKind","","",N,N],[13,"GeneratorExpression","","",11,N],[12,"element","rustpython_parser::ast::ComprehensionKind","",11,N],[13,"List","rustpython_parser::ast","",11,N],[12,"element","rustpython_parser::ast::ComprehensionKind","",11,N],[13,"Set","rustpython_parser::ast","",11,N],[12,"element","rustpython_parser::ast::ComprehensionKind","",11,N],[13,"Dict","rustpython_parser::ast","",11,N],[12,"key","rustpython_parser::ast::ComprehensionKind","",11,N],[12,"value","","",11,N],[4,"Operator","rustpython_parser::ast","",N,N],[13,"Add","","",12,N],[13,"Sub","","",12,N],[13,"Mult","","",12,N],[13,"MatMult","","",12,N],[13,"Div","","",12,N],[13,"Mod","","",12,N],[13,"Pow","","",12,N],[13,"LShift","","",12,N],[13,"RShift","","",12,N],[13,"BitOr","","",12,N],[13,"BitXor","","",12,N],[13,"BitAnd","","",12,N],[13,"FloorDiv","","",12,N],[4,"BooleanOperator","","",N,N],[13,"And","","",13,N],[13,"Or","","",13,N],[4,"UnaryOperator","","",N,N],[13,"Pos","","",14,N],[13,"Neg","","",14,N],[13,"Not","","",14,N],[13,"Inv","","",14,N],[4,"Comparison","","",N,N],[13,"Equal","","",15,N],[13,"NotEqual","","",15,N],[13,"Less","","",15,N],[13,"LessOrEqual","","",15,N],[13,"Greater","","",15,N],[13,"GreaterOrEqual","","",15,N],[13,"In","","",15,N],[13,"NotIn","","",15,N],[13,"Is","","",15,N],[13,"IsNot","","",15,N],[4,"Number","","",N,N],[13,"Integer","","",16,N],[12,"value","rustpython_parser::ast::Number","",16,N],[13,"Float","rustpython_parser::ast","",16,N],[12,"value","rustpython_parser::ast::Number","",16,N],[13,"Complex","rustpython_parser::ast","",16,N],[12,"real","rustpython_parser::ast::Number","",16,N],[12,"imag","","",16,N],[4,"StringGroup","rustpython_parser::ast","",N,N],[13,"Constant","","",17,N],[12,"value","rustpython_parser::ast::StringGroup","",17,N],[13,"FormattedValue","rustpython_parser::ast","",17,N],[12,"value","rustpython_parser::ast::StringGroup","",17,N],[12,"spec","","",17,N],[13,"Joined","rustpython_parser::ast","",17,N],[12,"values","rustpython_parser::ast::StringGroup","",17,N],[6,"LocatedStatement","rustpython_parser::ast","",N,N],[11,"name","","Returns a short name for the node suitable for use in error messages.",10,[[["self"]],["str"]]],[0,"error","rustpython_parser","Define internal parse error types The goal is to provide a matching and a safe error API, maksing errors from LALR",N,N],[4,"ParseError","rustpython_parser::error","Represents an error during parsing",N,N],[13,"EOF","","Parser encountered an unexpected end of input",18,N],[13,"ExtraToken","","Parser encountered an extra token",18,N],[13,"InvalidToken","","Parser encountered an invalid token",18,N],[13,"UnrecognizedToken","","Parser encountered an unexpected token",18,N],[13,"Other","","Maps to `User` type from `lalrpop-util`",18,N],[0,"lexer","rustpython_parser","This module takes care of lexing python source text. This means source code is translated into separate tokens.",N,N],[3,"Lexer","rustpython_parser::lexer","",N,N],[3,"Location","","",N,N],[3,"NewlineHandler","","",N,N],[3,"LineContinationHandler","","",N,N],[4,"LexicalError","","",N,N],[13,"StringError","","",19,N],[13,"NestingError","","",19,N],[5,"get_keywords","","",N,[[],["hashmap",["string","tok"]]]],[5,"make_tokenizer","","",N,N],[6,"Spanned","","",N,N],[11,"new","","",20,[[["usize"],["usize"]],["self"]]],[11,"get_row","","",20,[[["self"]],["usize"]]],[11,"get_column","","",20,[[["self"]],["usize"]]],[11,"new","","",21,[[["t"]],["self"]]],[11,"new","","",22,[[["t"]],["self"]]],[11,"new","","",23,[[["t"]],["self"]]],[0,"parser","rustpython_parser","",N,N],[4,"FStringError","rustpython_parser::parser","",N,N],[13,"UnclosedLbrace","","",24,N],[13,"UnopenedRbrace","","",24,N],[13,"InvalidExpression","","",24,N],[5,"parse_program","","",N,[[["str"]],["result",["program","parseerror"]]]],[5,"parse_statement","","",N,[[["str"]],["result",["locatedstatement","parseerror"]]]],[5,"parse_expression","","Parses a python expression",N,[[["str"]],["result",["expression","parseerror"]]]],[5,"parse_fstring","","",N,[[["str"]],["result",["stringgroup","fstringerror"]]]],[0,"token","rustpython_parser","Different token definitions. Loosely based on token.h from CPython source:",N,N],[4,"Tok","rustpython_parser::token","Python source code can be tokenized in a sequence of these tokens.",N,N],[13,"Name","","",25,N],[12,"name","rustpython_parser::token::Tok","",25,N],[13,"Int","rustpython_parser::token","",25,N],[12,"value","rustpython_parser::token::Tok","",25,N],[13,"Float","rustpython_parser::token","",25,N],[12,"value","rustpython_parser::token::Tok","",25,N],[13,"Complex","rustpython_parser::token","",25,N],[12,"real","rustpython_parser::token::Tok","",25,N],[12,"imag","","",25,N],[13,"String","rustpython_parser::token","",25,N],[12,"value","rustpython_parser::token::Tok","",25,N],[12,"is_fstring","","",25,N],[13,"Bytes","rustpython_parser::token","",25,N],[12,"value","rustpython_parser::token::Tok","",25,N],[13,"Newline","rustpython_parser::token","",25,N],[13,"Indent","","",25,N],[13,"Dedent","","",25,N],[13,"StartProgram","","",25,N],[13,"StartStatement","","",25,N],[13,"StartExpression","","",25,N],[13,"Lpar","","",25,N],[13,"Rpar","","",25,N],[13,"Lsqb","","",25,N],[13,"Rsqb","","",25,N],[13,"Colon","","",25,N],[13,"Comma","","",25,N],[13,"Semi","","",25,N],[13,"Plus","","",25,N],[13,"Minus","","",25,N],[13,"Star","","",25,N],[13,"Slash","","",25,N],[13,"Vbar","","",25,N],[13,"Amper","","",25,N],[13,"Less","","",25,N],[13,"Greater","","",25,N],[13,"Equal","","",25,N],[13,"Dot","","",25,N],[13,"Percent","","",25,N],[13,"Lbrace","","",25,N],[13,"Rbrace","","",25,N],[13,"EqEqual","","",25,N],[13,"NotEqual","","",25,N],[13,"LessEqual","","",25,N],[13,"GreaterEqual","","",25,N],[13,"Tilde","","",25,N],[13,"CircumFlex","","",25,N],[13,"LeftShift","","",25,N],[13,"RightShift","","",25,N],[13,"DoubleStar","","",25,N],[13,"DoubleStarEqual","","",25,N],[13,"PlusEqual","","",25,N],[13,"MinusEqual","","",25,N],[13,"StarEqual","","",25,N],[13,"SlashEqual","","",25,N],[13,"PercentEqual","","",25,N],[13,"AmperEqual","","",25,N],[13,"VbarEqual","","",25,N],[13,"CircumflexEqual","","",25,N],[13,"LeftShiftEqual","","",25,N],[13,"RightShiftEqual","","",25,N],[13,"DoubleSlash","","",25,N],[13,"DoubleSlashEqual","","",25,N],[13,"At","","",25,N],[13,"AtEqual","","",25,N],[13,"Rarrow","","",25,N],[13,"Ellipsis","","",25,N],[13,"False","","",25,N],[13,"None","","",25,N],[13,"True","","",25,N],[13,"And","","",25,N],[13,"As","","",25,N],[13,"Assert","","",25,N],[13,"Break","","",25,N],[13,"Class","","",25,N],[13,"Continue","","",25,N],[13,"Def","","",25,N],[13,"Del","","",25,N],[13,"Elif","","",25,N],[13,"Else","","",25,N],[13,"Except","","",25,N],[13,"Finally","","",25,N],[13,"For","","",25,N],[13,"From","","",25,N],[13,"Global","","",25,N],[13,"If","","",25,N],[13,"Import","","",25,N],[13,"In","","",25,N],[13,"Is","","",25,N],[13,"Lambda","","",25,N],[13,"Nonlocal","","",25,N],[13,"Not","","",25,N],[13,"Or","","",25,N],[13,"Pass","","",25,N],[13,"Raise","","",25,N],[13,"Return","","",25,N],[13,"Try","","",25,N],[13,"While","","",25,N],[13,"With","","",25,N],[13,"Yield","","",25,N],[11,"into","rustpython_parser::ast","",0,[[["self"]],["u"]]],[11,"from","","",0,[[["t"]],["t"]]],[11,"try_from","","",0,[[["u"]],["result"]]],[11,"borrow","","",0,[[["self"]],["t"]]],[11,"get_type_id","","",0,[[["self"]],["typeid"]]],[11,"try_into","","",0,[[["self"]],["result"]]],[11,"borrow_mut","","",0,[[["self"]],["t"]]],[11,"into","","",1,[[["self"]],["u"]]],[11,"from","","",1,[[["t"]],["t"]]],[11,"try_from","","",1,[[["u"]],["result"]]],[11,"borrow","","",1,[[["self"]],["t"]]],[11,"get_type_id","","",1,[[["self"]],["typeid"]]],[11,"try_into","","",1,[[["self"]],["result"]]],[11,"borrow_mut","","",1,[[["self"]],["t"]]],[11,"into","","",2,[[["self"]],["u"]]],[11,"from","","",2,[[["t"]],["t"]]],[11,"try_from","","",2,[[["u"]],["result"]]],[11,"borrow","","",2,[[["self"]],["t"]]],[11,"get_type_id","","",2,[[["self"]],["typeid"]]],[11,"try_into","","",2,[[["self"]],["result"]]],[11,"borrow_mut","","",2,[[["self"]],["t"]]],[11,"into","","",3,[[["self"]],["u"]]],[11,"from","","",3,[[["t"]],["t"]]],[11,"try_from","","",3,[[["u"]],["result"]]],[11,"borrow","","",3,[[["self"]],["t"]]],[11,"get_type_id","","",3,[[["self"]],["typeid"]]],[11,"try_into","","",3,[[["self"]],["result"]]],[11,"borrow_mut","","",3,[[["self"]],["t"]]],[11,"into","","",4,[[["self"]],["u"]]],[11,"from","","",4,[[["t"]],["t"]]],[11,"try_from","","",4,[[["u"]],["result"]]],[11,"borrow","","",4,[[["self"]],["t"]]],[11,"get_type_id","","",4,[[["self"]],["typeid"]]],[11,"try_into","","",4,[[["self"]],["result"]]],[11,"borrow_mut","","",4,[[["self"]],["t"]]],[11,"into","","",5,[[["self"]],["u"]]],[11,"from","","",5,[[["t"]],["t"]]],[11,"try_from","","",5,[[["u"]],["result"]]],[11,"borrow","","",5,[[["self"]],["t"]]],[11,"get_type_id","","",5,[[["self"]],["typeid"]]],[11,"try_into","","",5,[[["self"]],["result"]]],[11,"borrow_mut","","",5,[[["self"]],["t"]]],[11,"into","","",6,[[["self"]],["u"]]],[11,"from","","",6,[[["t"]],["t"]]],[11,"try_from","","",6,[[["u"]],["result"]]],[11,"borrow","","",6,[[["self"]],["t"]]],[11,"get_type_id","","",6,[[["self"]],["typeid"]]],[11,"try_into","","",6,[[["self"]],["result"]]],[11,"borrow_mut","","",6,[[["self"]],["t"]]],[11,"into","","",7,[[["self"]],["u"]]],[11,"from","","",7,[[["t"]],["t"]]],[11,"try_from","","",7,[[["u"]],["result"]]],[11,"borrow","","",7,[[["self"]],["t"]]],[11,"get_type_id","","",7,[[["self"]],["typeid"]]],[11,"try_into","","",7,[[["self"]],["result"]]],[11,"borrow_mut","","",7,[[["self"]],["t"]]],[11,"into","","",8,[[["self"]],["u"]]],[11,"from","","",8,[[["t"]],["t"]]],[11,"try_from","","",8,[[["u"]],["result"]]],[11,"borrow","","",8,[[["self"]],["t"]]],[11,"get_type_id","","",8,[[["self"]],["typeid"]]],[11,"try_into","","",8,[[["self"]],["result"]]],[11,"borrow_mut","","",8,[[["self"]],["t"]]],[11,"into","","",9,[[["self"]],["u"]]],[11,"from","","",9,[[["t"]],["t"]]],[11,"try_from","","",9,[[["u"]],["result"]]],[11,"borrow","","",9,[[["self"]],["t"]]],[11,"get_type_id","","",9,[[["self"]],["typeid"]]],[11,"try_into","","",9,[[["self"]],["result"]]],[11,"borrow_mut","","",9,[[["self"]],["t"]]],[11,"into","","",10,[[["self"]],["u"]]],[11,"from","","",10,[[["t"]],["t"]]],[11,"try_from","","",10,[[["u"]],["result"]]],[11,"borrow","","",10,[[["self"]],["t"]]],[11,"get_type_id","","",10,[[["self"]],["typeid"]]],[11,"try_into","","",10,[[["self"]],["result"]]],[11,"borrow_mut","","",10,[[["self"]],["t"]]],[11,"into","","",11,[[["self"]],["u"]]],[11,"from","","",11,[[["t"]],["t"]]],[11,"try_from","","",11,[[["u"]],["result"]]],[11,"borrow","","",11,[[["self"]],["t"]]],[11,"get_type_id","","",11,[[["self"]],["typeid"]]],[11,"try_into","","",11,[[["self"]],["result"]]],[11,"borrow_mut","","",11,[[["self"]],["t"]]],[11,"into","","",12,[[["self"]],["u"]]],[11,"from","","",12,[[["t"]],["t"]]],[11,"try_from","","",12,[[["u"]],["result"]]],[11,"borrow","","",12,[[["self"]],["t"]]],[11,"get_type_id","","",12,[[["self"]],["typeid"]]],[11,"try_into","","",12,[[["self"]],["result"]]],[11,"borrow_mut","","",12,[[["self"]],["t"]]],[11,"into","","",13,[[["self"]],["u"]]],[11,"from","","",13,[[["t"]],["t"]]],[11,"try_from","","",13,[[["u"]],["result"]]],[11,"borrow","","",13,[[["self"]],["t"]]],[11,"get_type_id","","",13,[[["self"]],["typeid"]]],[11,"try_into","","",13,[[["self"]],["result"]]],[11,"borrow_mut","","",13,[[["self"]],["t"]]],[11,"into","","",14,[[["self"]],["u"]]],[11,"from","","",14,[[["t"]],["t"]]],[11,"try_from","","",14,[[["u"]],["result"]]],[11,"borrow","","",14,[[["self"]],["t"]]],[11,"get_type_id","","",14,[[["self"]],["typeid"]]],[11,"try_into","","",14,[[["self"]],["result"]]],[11,"borrow_mut","","",14,[[["self"]],["t"]]],[11,"into","","",15,[[["self"]],["u"]]],[11,"from","","",15,[[["t"]],["t"]]],[11,"try_from","","",15,[[["u"]],["result"]]],[11,"borrow","","",15,[[["self"]],["t"]]],[11,"get_type_id","","",15,[[["self"]],["typeid"]]],[11,"try_into","","",15,[[["self"]],["result"]]],[11,"borrow_mut","","",15,[[["self"]],["t"]]],[11,"into","","",16,[[["self"]],["u"]]],[11,"from","","",16,[[["t"]],["t"]]],[11,"try_from","","",16,[[["u"]],["result"]]],[11,"borrow","","",16,[[["self"]],["t"]]],[11,"get_type_id","","",16,[[["self"]],["typeid"]]],[11,"try_into","","",16,[[["self"]],["result"]]],[11,"borrow_mut","","",16,[[["self"]],["t"]]],[11,"into","","",17,[[["self"]],["u"]]],[11,"from","","",17,[[["t"]],["t"]]],[11,"try_from","","",17,[[["u"]],["result"]]],[11,"borrow","","",17,[[["self"]],["t"]]],[11,"get_type_id","","",17,[[["self"]],["typeid"]]],[11,"try_into","","",17,[[["self"]],["result"]]],[11,"borrow_mut","","",17,[[["self"]],["t"]]],[11,"into","rustpython_parser::error","",18,[[["self"]],["u"]]],[11,"to_string","","",18,[[["self"]],["string"]]],[11,"from","","",18,[[["t"]],["t"]]],[11,"try_from","","",18,[[["u"]],["result"]]],[11,"borrow","","",18,[[["self"]],["t"]]],[11,"get_type_id","","",18,[[["self"]],["typeid"]]],[11,"try_into","","",18,[[["self"]],["result"]]],[11,"borrow_mut","","",18,[[["self"]],["t"]]],[11,"into","rustpython_parser::lexer","",23,[[["self"]],["u"]]],[11,"from","","",23,[[["t"]],["t"]]],[11,"into_iter","","",23,[[["self"]],["i"]]],[11,"try_from","","",23,[[["u"]],["result"]]],[11,"borrow","","",23,[[["self"]],["t"]]],[11,"get_type_id","","",23,[[["self"]],["typeid"]]],[11,"try_into","","",23,[[["self"]],["result"]]],[11,"borrow_mut","","",23,[[["self"]],["t"]]],[11,"into","","",20,[[["self"]],["u"]]],[11,"to_owned","","",20,[[["self"]],["t"]]],[11,"clone_into","","",20,N],[11,"from","","",20,[[["t"]],["t"]]],[11,"try_from","","",20,[[["u"]],["result"]]],[11,"borrow","","",20,[[["self"]],["t"]]],[11,"get_type_id","","",20,[[["self"]],["typeid"]]],[11,"try_into","","",20,[[["self"]],["result"]]],[11,"borrow_mut","","",20,[[["self"]],["t"]]],[11,"into","","",21,[[["self"]],["u"]]],[11,"from","","",21,[[["t"]],["t"]]],[11,"into_iter","","",21,[[["self"]],["i"]]],[11,"try_from","","",21,[[["u"]],["result"]]],[11,"borrow","","",21,[[["self"]],["t"]]],[11,"get_type_id","","",21,[[["self"]],["typeid"]]],[11,"try_into","","",21,[[["self"]],["result"]]],[11,"borrow_mut","","",21,[[["self"]],["t"]]],[11,"into","","",22,[[["self"]],["u"]]],[11,"from","","",22,[[["t"]],["t"]]],[11,"into_iter","","",22,[[["self"]],["i"]]],[11,"try_from","","",22,[[["u"]],["result"]]],[11,"borrow","","",22,[[["self"]],["t"]]],[11,"get_type_id","","",22,[[["self"]],["typeid"]]],[11,"try_into","","",22,[[["self"]],["result"]]],[11,"borrow_mut","","",22,[[["self"]],["t"]]],[11,"into","","",19,[[["self"]],["u"]]],[11,"from","","",19,[[["t"]],["t"]]],[11,"try_from","","",19,[[["u"]],["result"]]],[11,"borrow","","",19,[[["self"]],["t"]]],[11,"get_type_id","","",19,[[["self"]],["typeid"]]],[11,"try_into","","",19,[[["self"]],["result"]]],[11,"borrow_mut","","",19,[[["self"]],["t"]]],[11,"into","rustpython_parser::parser","",24,[[["self"]],["u"]]],[11,"from","","",24,[[["t"]],["t"]]],[11,"try_from","","",24,[[["u"]],["result"]]],[11,"borrow","","",24,[[["self"]],["t"]]],[11,"get_type_id","","",24,[[["self"]],["typeid"]]],[11,"try_into","","",24,[[["self"]],["result"]]],[11,"borrow_mut","","",24,[[["self"]],["t"]]],[11,"into","rustpython_parser::token","",25,[[["self"]],["u"]]],[11,"from","","",25,[[["t"]],["t"]]],[11,"try_from","","",25,[[["u"]],["result"]]],[11,"borrow","","",25,[[["self"]],["t"]]],[11,"get_type_id","","",25,[[["self"]],["typeid"]]],[11,"try_into","","",25,[[["self"]],["result"]]],[11,"borrow_mut","","",25,[[["self"]],["t"]]],[11,"next","rustpython_parser::lexer","",21,[[["self"]],["option"]]],[11,"next","","",22,[[["self"]],["option"]]],[11,"next","","",23,[[["self"]],["option"]]],[11,"default","rustpython_parser::ast","",4,[[],["parameters"]]],[11,"default","rustpython_parser::lexer","",20,[[],["location"]]],[11,"eq","rustpython_parser::ast","",8,[[["self"],["top"]],["bool"]]],[11,"ne","","",8,[[["self"],["top"]],["bool"]]],[11,"eq","","",0,[[["self"],["program"]],["bool"]]],[11,"ne","","",0,[[["self"],["program"]],["bool"]]],[11,"eq","","",1,[[["self"],["singleimport"]],["bool"]]],[11,"ne","","",1,[[["self"],["singleimport"]],["bool"]]],[11,"eq","","",2,[[["self"],["located"]],["bool"]]],[11,"ne","","",2,[[["self"],["located"]],["bool"]]],[11,"eq","","",9,[[["self"],["statement"]],["bool"]]],[11,"ne","","",9,[[["self"],["statement"]],["bool"]]],[11,"eq","","",3,[[["self"],["withitem"]],["bool"]]],[11,"ne","","",3,[[["self"],["withitem"]],["bool"]]],[11,"eq","","",10,[[["self"],["expression"]],["bool"]]],[11,"ne","","",10,[[["self"],["expression"]],["bool"]]],[11,"eq","","",4,[[["self"],["parameters"]],["bool"]]],[11,"ne","","",4,[[["self"],["parameters"]],["bool"]]],[11,"eq","","",11,[[["self"],["comprehensionkind"]],["bool"]]],[11,"ne","","",11,[[["self"],["comprehensionkind"]],["bool"]]],[11,"eq","","",5,[[["self"],["comprehension"]],["bool"]]],[11,"ne","","",5,[[["self"],["comprehension"]],["bool"]]],[11,"eq","","",6,[[["self"],["keyword"]],["bool"]]],[11,"ne","","",6,[[["self"],["keyword"]],["bool"]]],[11,"eq","","",7,[[["self"],["excepthandler"]],["bool"]]],[11,"ne","","",7,[[["self"],["excepthandler"]],["bool"]]],[11,"eq","","",12,[[["self"],["operator"]],["bool"]]],[11,"eq","","",13,[[["self"],["booleanoperator"]],["bool"]]],[11,"eq","","",14,[[["self"],["unaryoperator"]],["bool"]]],[11,"eq","","",15,[[["self"],["comparison"]],["bool"]]],[11,"eq","","",16,[[["self"],["number"]],["bool"]]],[11,"ne","","",16,[[["self"],["number"]],["bool"]]],[11,"eq","","",17,[[["self"],["stringgroup"]],["bool"]]],[11,"ne","","",17,[[["self"],["stringgroup"]],["bool"]]],[11,"eq","rustpython_parser::error","",18,[[["self"],["parseerror"]],["bool"]]],[11,"ne","","",18,[[["self"],["parseerror"]],["bool"]]],[11,"eq","rustpython_parser::lexer","",20,[[["self"],["location"]],["bool"]]],[11,"ne","","",20,[[["self"],["location"]],["bool"]]],[11,"eq","rustpython_parser::parser","",24,[[["self"],["fstringerror"]],["bool"]]],[11,"eq","rustpython_parser::token","",25,[[["self"],["tok"]],["bool"]]],[11,"ne","","",25,[[["self"],["tok"]],["bool"]]],[11,"from","rustpython_parser::error","",18,[[["innererror",["location","tok","lexicalerror"]]],["self"]]],[11,"clone","rustpython_parser::lexer","",20,[[["self"]],["location"]]],[11,"fmt","rustpython_parser::error","",18,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_parser::ast","",8,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",0,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",1,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",2,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",9,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",3,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",10,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",4,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",11,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",5,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",6,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",7,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",12,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",13,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",14,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",15,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",16,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",17,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_parser::error","",18,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_parser::lexer","",19,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",20,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_parser::parser","",24,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_parser::token","",25,[[["self"],["formatter"]],["result"]]],[11,"source","rustpython_parser::error","",18,[[["self"]],["option",["error"]]]]],"paths":[[3,"Program"],[3,"SingleImport"],[3,"Located"],[3,"WithItem"],[3,"Parameters"],[3,"Comprehension"],[3,"Keyword"],[3,"ExceptHandler"],[4,"Top"],[4,"Statement"],[4,"Expression"],[4,"ComprehensionKind"],[4,"Operator"],[4,"BooleanOperator"],[4,"UnaryOperator"],[4,"Comparison"],[4,"Number"],[4,"StringGroup"],[4,"ParseError"],[4,"LexicalError"],[3,"Location"],[3,"NewlineHandler"],[3,"LineContinationHandler"],[3,"Lexer"],[4,"FStringError"],[4,"Tok"]]}; -searchIndex["rustpython_vm"]={"doc":"This crate contains most python logic.","items":[[3,"VirtualMachine","rustpython_vm","Top level container of a python virtual machine. In theory you could create more instances of this struct and have them operate fully isolated.",N,N],[12,"builtins","","",0,N],[12,"sys_module","","",0,N],[12,"stdlib_inits","","",0,N],[12,"ctx","","",0,N],[12,"current_frame","","",0,N],[12,"wasm_id","","",0,N],[5,"print_exception","","",N,[[["virtualmachine"],["pyobjectref"]]]],[0,"macros","","",N,N],[0,"bytecode","","Implement python as a virtual machine with bytecodes. This module implements bytecode structure.",N,N],[3,"CodeObject","rustpython_vm::bytecode","Primary container of a single code object. Each python function has a codeobject. Also a module has a codeobject.",N,N],[12,"instructions","","",1,N],[12,"label_map","","",1,N],[12,"locations","","",1,N],[12,"arg_names","","",1,N],[12,"varargs","","",1,N],[12,"kwonlyarg_names","","",1,N],[12,"varkeywords","","",1,N],[12,"source_path","","",1,N],[12,"first_line_number","","",1,N],[12,"obj_name","","",1,N],[12,"is_generator","","",1,N],[3,"FunctionOpArg","","",N,N],[4,"Instruction","","A Single bytecode instruction.",N,N],[13,"Import","","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[12,"symbol","","",2,N],[13,"ImportStar","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"LoadName","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"StoreName","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"DeleteName","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"StoreSubscript","rustpython_vm::bytecode","",2,N],[13,"DeleteSubscript","","",2,N],[13,"StoreAttr","","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"DeleteAttr","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"LoadConst","rustpython_vm::bytecode","",2,N],[12,"value","rustpython_vm::bytecode::Instruction","",2,N],[13,"UnaryOperation","rustpython_vm::bytecode","",2,N],[12,"op","rustpython_vm::bytecode::Instruction","",2,N],[13,"BinaryOperation","rustpython_vm::bytecode","",2,N],[12,"op","rustpython_vm::bytecode::Instruction","",2,N],[12,"inplace","","",2,N],[13,"LoadAttr","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"CompareOperation","rustpython_vm::bytecode","",2,N],[12,"op","rustpython_vm::bytecode::Instruction","",2,N],[13,"Pop","rustpython_vm::bytecode","",2,N],[13,"Rotate","","",2,N],[12,"amount","rustpython_vm::bytecode::Instruction","",2,N],[13,"Duplicate","rustpython_vm::bytecode","",2,N],[13,"GetIter","","",2,N],[13,"Pass","","",2,N],[13,"Continue","","",2,N],[13,"Break","","",2,N],[13,"Jump","","",2,N],[12,"target","rustpython_vm::bytecode::Instruction","",2,N],[13,"JumpIf","rustpython_vm::bytecode","",2,N],[12,"target","rustpython_vm::bytecode::Instruction","",2,N],[13,"JumpIfFalse","rustpython_vm::bytecode","",2,N],[12,"target","rustpython_vm::bytecode::Instruction","",2,N],[13,"MakeFunction","rustpython_vm::bytecode","",2,N],[12,"flags","rustpython_vm::bytecode::Instruction","",2,N],[13,"CallFunction","rustpython_vm::bytecode","",2,N],[12,"typ","rustpython_vm::bytecode::Instruction","",2,N],[13,"ForIter","rustpython_vm::bytecode","",2,N],[12,"target","rustpython_vm::bytecode::Instruction","",2,N],[13,"ReturnValue","rustpython_vm::bytecode","",2,N],[13,"YieldValue","","",2,N],[13,"YieldFrom","","",2,N],[13,"SetupLoop","","",2,N],[12,"start","rustpython_vm::bytecode::Instruction","",2,N],[12,"end","","",2,N],[13,"SetupExcept","rustpython_vm::bytecode","",2,N],[12,"handler","rustpython_vm::bytecode::Instruction","",2,N],[13,"SetupWith","rustpython_vm::bytecode","",2,N],[12,"end","rustpython_vm::bytecode::Instruction","",2,N],[13,"CleanupWith","rustpython_vm::bytecode","",2,N],[12,"end","rustpython_vm::bytecode::Instruction","",2,N],[13,"PopBlock","rustpython_vm::bytecode","",2,N],[13,"Raise","","",2,N],[12,"argc","rustpython_vm::bytecode::Instruction","",2,N],[13,"BuildString","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[13,"BuildTuple","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[12,"unpack","","",2,N],[13,"BuildList","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[12,"unpack","","",2,N],[13,"BuildSet","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[12,"unpack","","",2,N],[13,"BuildMap","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[12,"unpack","","",2,N],[13,"BuildSlice","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[13,"ListAppend","rustpython_vm::bytecode","",2,N],[12,"i","rustpython_vm::bytecode::Instruction","",2,N],[13,"SetAdd","rustpython_vm::bytecode","",2,N],[12,"i","rustpython_vm::bytecode::Instruction","",2,N],[13,"MapAdd","rustpython_vm::bytecode","",2,N],[12,"i","rustpython_vm::bytecode::Instruction","",2,N],[13,"PrintExpr","rustpython_vm::bytecode","",2,N],[13,"LoadBuildClass","","",2,N],[13,"StoreLocals","","",2,N],[13,"UnpackSequence","","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[13,"UnpackEx","rustpython_vm::bytecode","",2,N],[12,"before","rustpython_vm::bytecode::Instruction","",2,N],[12,"after","","",2,N],[13,"Unpack","rustpython_vm::bytecode","",2,N],[13,"FormatValue","","",2,N],[12,"spec","rustpython_vm::bytecode::Instruction","",2,N],[4,"CallType","rustpython_vm::bytecode","",N,N],[13,"Positional","","",3,N],[13,"Keyword","","",3,N],[13,"Ex","","",3,N],[4,"Constant","","",N,N],[13,"Integer","","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"Float","rustpython_vm::bytecode","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"Complex","rustpython_vm::bytecode","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"Boolean","rustpython_vm::bytecode","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"String","rustpython_vm::bytecode","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"Bytes","rustpython_vm::bytecode","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"Code","rustpython_vm::bytecode","",4,N],[12,"code","rustpython_vm::bytecode::Constant","",4,N],[13,"Tuple","rustpython_vm::bytecode","",4,N],[12,"elements","rustpython_vm::bytecode::Constant","",4,N],[13,"None","rustpython_vm::bytecode","",4,N],[4,"ComparisonOperator","","",N,N],[13,"Greater","","",5,N],[13,"GreaterOrEqual","","",5,N],[13,"Less","","",5,N],[13,"LessOrEqual","","",5,N],[13,"Equal","","",5,N],[13,"NotEqual","","",5,N],[13,"In","","",5,N],[13,"NotIn","","",5,N],[13,"Is","","",5,N],[13,"IsNot","","",5,N],[4,"BinaryOperator","","",N,N],[13,"Power","","",6,N],[13,"Multiply","","",6,N],[13,"MatrixMultiply","","",6,N],[13,"Divide","","",6,N],[13,"FloorDivide","","",6,N],[13,"Modulo","","",6,N],[13,"Add","","",6,N],[13,"Subtract","","",6,N],[13,"Subscript","","",6,N],[13,"Lshift","","",6,N],[13,"Rshift","","",6,N],[13,"And","","",6,N],[13,"Xor","","",6,N],[13,"Or","","",6,N],[4,"UnaryOperator","","",N,N],[13,"Not","","",7,N],[13,"Invert","","",7,N],[13,"Minus","","",7,N],[13,"Plus","","",7,N],[6,"Label","","",N,N],[18,"HAS_DEFAULTS","","",8,N],[11,"empty","","Returns an empty set of flags.",8,[[],["functionoparg"]]],[11,"all","","Returns the set containing all flags.",8,[[],["functionoparg"]]],[11,"bits","","Returns the raw value of the flags currently stored.",8,[[["self"]],["u8"]]],[11,"from_bits","","Convert from underlying bit representation, unless that representation contains bits that do not correspond to a flag.",8,[[["u8"]],["option",["functionoparg"]]]],[11,"from_bits_truncate","","Convert from underlying bit representation, dropping any bits that do not correspond to flags.",8,[[["u8"]],["functionoparg"]]],[11,"is_empty","","Returns `true` if no flags are currently stored.",8,[[["self"]],["bool"]]],[11,"is_all","","Returns `true` if all flags are currently set.",8,[[["self"]],["bool"]]],[11,"intersects","","Returns `true` if there are flags common to both `self` and `other`.",8,[[["self"],["functionoparg"]],["bool"]]],[11,"contains","","Returns `true` all of the flags in `other` are contained within `self`.",8,[[["self"],["functionoparg"]],["bool"]]],[11,"insert","","Inserts the specified flags in-place.",8,[[["self"],["functionoparg"]]]],[11,"remove","","Removes the specified flags in-place.",8,[[["self"],["functionoparg"]]]],[11,"toggle","","Toggles the specified flags in-place.",8,[[["self"],["functionoparg"]]]],[11,"set","","Inserts or removes the specified flags depending on the passed value.",8,[[["self"],["functionoparg"],["bool"]]]],[11,"new","","",1,[[["vec",["string"]],["option",["option"]],["vec",["string"]],["option",["option"]],["string"],["usize"],["string"]],["codeobject"]]],[11,"get_constants","","",1,N],[0,"compile","rustpython_vm","Take an AST and transform it into bytecode",N,N],[4,"Mode","rustpython_vm::compile","",N,N],[13,"Exec","","",9,N],[13,"Eval","","",9,N],[13,"Single","","",9,N],[5,"compile","","Compile a given sourcecode into a bytecode object.",N,[[["str"],["mode"],["string"],["pyobjectref"]],["result",["pyobjectref","compileerror"]]]],[0,"error","rustpython_vm","",N,N],[4,"CompileError","rustpython_vm::error","",N,N],[13,"Assign","","Invalid assignment, cannot store value in target.",10,N],[13,"Delete","","Invalid delete",10,N],[13,"ExpectExpr","","Expected an expression got a statement",10,N],[13,"Parse","","Parser error",10,N],[13,"StarArgs","","Multiple `*` detected",10,N],[13,"InvalidBreak","","Break statement outside of loop.",10,N],[13,"InvalidContinue","","Continue statement outside of loop.",10,N],[0,"eval","rustpython_vm","",N,N],[5,"eval","rustpython_vm::eval","",N,[[["virtualmachine"],["str"],["pyobjectref"],["str"]],["pyresult"]]],[0,"format","rustpython_vm","",N,N],[3,"FormatSpec","rustpython_vm::format","",N,N],[3,"FormatString","","",N,N],[12,"format_parts","","",11,N],[4,"FormatAlign","","",N,N],[13,"Left","","",12,N],[13,"Right","","",12,N],[13,"AfterSign","","",12,N],[13,"Center","","",12,N],[4,"FormatSign","","",N,N],[13,"Plus","","",13,N],[13,"Minus","","",13,N],[13,"MinusOrSpace","","",13,N],[4,"FormatGrouping","","",N,N],[13,"Comma","","",14,N],[13,"Underscore","","",14,N],[4,"FormatType","","",N,N],[13,"String","","",15,N],[13,"Binary","","",15,N],[13,"Character","","",15,N],[13,"Decimal","","",15,N],[13,"Octal","","",15,N],[13,"HexLower","","",15,N],[13,"HexUpper","","",15,N],[13,"Number","","",15,N],[13,"ExponentLower","","",15,N],[13,"ExponentUpper","","",15,N],[13,"GeneralFormatLower","","",15,N],[13,"GeneralFormatUpper","","",15,N],[13,"FixedPointLower","","",15,N],[13,"FixedPointUpper","","",15,N],[4,"FormatParseError","","",N,N],[13,"UnmatchedBracket","","",16,N],[13,"MissingStartBracket","","",16,N],[13,"UnescapedStartBracketInLiteral","","",16,N],[4,"FormatPart","","",N,N],[13,"AutoSpec","","",17,N],[13,"IndexSpec","","",17,N],[13,"KeywordSpec","","",17,N],[13,"Literal","","",17,N],[11,"parse","","",18,[[["str"]],["formatspec"]]],[11,"format_int","","",18,[[["self"],["bigint"]],["result",["string","str"]]]],[11,"is_auto","","",17,[[["self"]],["bool"]]],[11,"is_index","","",17,[[["self"]],["bool"]]],[0,"import","rustpython_vm","",N,N],[5,"import_module","rustpython_vm::import","",N,[[["virtualmachine"],["pathbuf"],["str"]],["pyresult"]]],[5,"import","","",N,[[["virtualmachine"],["pathbuf"],["str"],["option"]],["pyresult"]]],[0,"obj","rustpython_vm","This package contains the python basic/builtin types",N,N],[0,"objbool","rustpython_vm::obj","",N,N],[5,"boolval","rustpython_vm::obj::objbool","",N,[[["virtualmachine"],["pyobjectref"]],["result",["bool","pyobjectref"]]]],[5,"init","","",N,[[["pycontext"]]]],[5,"not","","",N,[[["virtualmachine"],["pyobjectref"]],["pyresult"]]],[5,"get_value","","",N,[[["pyobjectref"]],["bool"]]],[0,"objbytearray","rustpython_vm::obj","Implementation of the python bytearray object.",N,N],[5,"init","rustpython_vm::obj::objbytearray","Fill bytearray class methods dictionary.",N,[[["pycontext"]]]],[0,"objbytes","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objbytes","",N,[[["pycontext"]]]],[5,"get_value","","",N,N],[5,"get_mut_value","","",N,N],[0,"objcode","rustpython_vm::obj","Infamous code object. The python class `code`",N,N],[5,"init","rustpython_vm::obj::objcode","",N,[[["pycontext"]]]],[5,"get_value","","",N,[[["pyobjectref"]],["codeobject"]]],[0,"objcomplex","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objcomplex","",N,[[["pycontext"]]]],[5,"get_value","","",N,[[["pyobjectref"]],["complex64"]]],[0,"objdict","rustpython_vm::obj","",N,N],[5,"new","rustpython_vm::obj::objdict","",N,[[["pyobjectref"]],["pyobjectref"]]],[5,"get_elements","","",N,N],[5,"set_item","","",N,[[["pyobjectref"],["virtualmachine"],["pyobjectref"],["pyobjectref"]]]],[5,"set_item_in_content","","",N,[[["dictcontenttype"],["pyobjectref"],["pyobjectref"]]]],[5,"get_key_value_pairs","","",N,[[["pyobjectref"]],["vec"]]],[5,"get_key_value_pairs_from_content","","",N,[[["dictcontenttype"]],["vec"]]],[5,"get_item","","",N,[[["pyobjectref"],["pyobjectref"]],["option",["pyobjectref"]]]],[5,"get_key_str","","",N,[[["pyobjectref"],["str"]],["option",["pyobjectref"]]]],[5,"content_get_key_str","","Retrieve a key from dict contents:",N,[[["dictcontenttype"],["str"]],["option",["pyobjectref"]]]],[5,"contains_key_str","","",N,[[["pyobjectref"],["str"]],["bool"]]],[5,"content_contains_key_str","","",N,[[["dictcontenttype"],["str"]],["bool"]]],[5,"py_dict_to_attributes","","Take a python dictionary and convert it to attributes.",N,[[["pyobjectref"]],["pyattributes"]]],[5,"attributes_to_py_dict","","",N,[[["virtualmachine"],["pyattributes"]],["pyresult"]]],[5,"dict_contains","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"create_type","","",N,[[["pyobjectref"],["pyobjectref"],["pyobjectref"]]]],[5,"init","","",N,[[["pycontext"]]]],[6,"DictContentType","","",N,N],[0,"objenumerate","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objenumerate","",N,[[["pycontext"]]]],[0,"objfilter","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objfilter","",N,[[["pycontext"]]]],[0,"objfloat","rustpython_vm::obj","",N,N],[5,"get_value","rustpython_vm::obj::objfloat","",N,[[["pyobjectref"]],["f64"]]],[5,"make_float","","",N,[[["virtualmachine"],["pyobjectref"]],["result",["f64","pyobjectref"]]]],[5,"init","","",N,[[["pycontext"]]]],[0,"objframe","rustpython_vm::obj","The python `frame` type.",N,N],[5,"init","rustpython_vm::obj::objframe","",N,[[["pycontext"]]]],[5,"get_value","","",N,[[["pyobjectref"]],["frame"]]],[0,"objfunction","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objfunction","",N,[[["pycontext"]]]],[0,"objgenerator","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objgenerator","",N,[[["pycontext"]]]],[5,"new_generator","","",N,[[["virtualmachine"],["frame"]],["pyresult"]]],[0,"objint","rustpython_vm::obj","",N,N],[5,"to_int","rustpython_vm::obj::objint","",N,[[["virtualmachine"],["pyobjectref"],["u32"]],["result",["bigint","pyobjectref"]]]],[5,"get_value","","",N,[[["pyobjectref"]],["bigint"]]],[5,"init","","",N,[[["pycontext"]]]],[0,"objiter","rustpython_vm::obj","",N,N],[5,"get_iter","rustpython_vm::obj::objiter","",N,[[["virtualmachine"],["pyobjectref"]],["pyresult"]]],[5,"call_next","","",N,[[["virtualmachine"],["pyobjectref"]],["pyresult"]]],[5,"get_next_object","","",N,[[["virtualmachine"],["pyobjectref"]],["result",["option","pyobjectref"]]]],[5,"get_all","","",N,[[["virtualmachine"],["pyobjectref"]],["result",["vec","pyobjectref"]]]],[5,"new_stop_iteration","","",N,[[["virtualmachine"]],["pyobjectref"]]],[5,"iter_type_init","","Common setup for iter types, adds iter and contains methods",N,[[["pycontext"],["pyobjectref"]]]],[5,"init","","",N,[[["pycontext"]]]],[0,"objlist","rustpython_vm::obj","",N,N],[5,"list_append","rustpython_vm::obj::objlist","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"list_extend","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"init","","",N,[[["pycontext"]]]],[0,"objmap","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objmap","",N,[[["pycontext"]]]],[0,"objmemory","rustpython_vm::obj","",N,N],[5,"new_memory_view","rustpython_vm::obj::objmemory","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"init","","",N,[[["pycontext"]]]],[0,"objnone","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objnone","",N,[[["pycontext"]]]],[0,"objobject","rustpython_vm::obj","",N,N],[5,"new_instance","rustpython_vm::obj::objobject","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"create_object","","",N,[[["pyobjectref"],["pyobjectref"],["pyobjectref"]]]],[5,"init","","",N,[[["pycontext"]]]],[0,"objproperty","rustpython_vm::obj","Python `property` descriptor class.",N,N],[5,"init","rustpython_vm::obj::objproperty","",N,[[["pycontext"]]]],[0,"objrange","rustpython_vm::obj","",N,N],[3,"RangeType","rustpython_vm::obj::objrange","",N,N],[12,"start","","",19,N],[12,"end","","",19,N],[12,"step","","",19,N],[5,"get_value","","",N,[[["pyobjectref"]],["rangetype"]]],[5,"init","","",N,[[["pycontext"]]]],[11,"try_len","","",19,[[["self"]],["option",["usize"]]]],[11,"len","","",19,[[["self"]],["usize"]]],[11,"contains","","",19,[[["self"],["bigint"]],["bool"]]],[11,"index_of","","",19,[[["self"],["bigint"]],["option",["bigint"]]]],[11,"count","","",19,[[["self"],["bigint"]],["usize"]]],[11,"is_empty","","",19,[[["self"]],["bool"]]],[11,"forward","","",19,[[["self"]],["bool"]]],[11,"get","","",19,[[["self"],["t"]],["option",["bigint"]]]],[11,"reversed","","",19,[[["self"]],["self"]]],[11,"repr","","",19,[[["self"]],["string"]]],[0,"objsequence","rustpython_vm::obj","",N,N],[5,"get_item","rustpython_vm::obj::objsequence","",N,N],[5,"seq_equal","","",N,N],[5,"seq_lt","","",N,N],[5,"seq_gt","","",N,N],[5,"seq_ge","","",N,N],[5,"seq_le","","",N,N],[5,"seq_mul","","",N,N],[5,"get_elements","","",N,N],[5,"get_mut_elements","","",N,N],[8,"PySliceableSequence","","",N,N],[10,"do_slice","","",20,[[["self"],["range",["usize"]]],["self"]]],[10,"do_slice_reverse","","",20,[[["self"],["range",["usize"]]],["self"]]],[10,"do_stepped_slice","","",20,[[["self"],["range",["usize"]],["usize"]],["self"]]],[10,"do_stepped_slice_reverse","","",20,[[["self"],["range",["usize"]],["usize"]],["self"]]],[10,"empty","","",20,[[],["self"]]],[10,"len","","",20,[[["self"]],["usize"]]],[10,"is_empty","","",20,[[["self"]],["bool"]]],[11,"get_pos","","",20,[[["self"],["i32"]],["option",["usize"]]]],[11,"get_slice_pos","","",20,[[["self"],["bigint"]],["usize"]]],[11,"get_slice_range","","",20,[[["self"],["option"],["option"]],["range",["usize"]]]],[11,"get_slice_items","","",20,[[["self"],["virtualmachine"],["pyobjectref"]],["result",["pyobjectref"]]]],[0,"objset","rustpython_vm::obj","",N,N],[5,"get_elements","rustpython_vm::obj::objset","",N,[[["pyobjectref"]],["hashmap",["u64","pyobjectref"]]]],[5,"set_contains","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"init","","",N,[[["pycontext"]]]],[0,"objslice","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objslice","",N,[[["pycontext"]]]],[0,"objstr","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objstr","",N,[[["pycontext"]]]],[5,"get_value","","",N,[[["pyobjectref"]],["string"]]],[5,"borrow_value","","",N,[[["pyobjectref"]],["ref",["str"]]]],[5,"subscript","","",N,[[["virtualmachine"],["str"],["pyobjectref"]],["pyresult"]]],[0,"objsuper","rustpython_vm::obj","Python `super` class.",N,N],[5,"init","rustpython_vm::obj::objsuper","",N,[[["pycontext"]]]],[0,"objtuple","rustpython_vm::obj","",N,N],[5,"tuple_index","rustpython_vm::obj::objtuple","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"tuple_contains","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"init","","",N,[[["pycontext"]]]],[0,"objtype","rustpython_vm::obj","",N,N],[5,"create_type","rustpython_vm::obj::objtype","",N,[[["pyobjectref"],["pyobjectref"],["pyobjectref"]]]],[5,"init","","",N,[[["pycontext"]]]],[5,"base_classes","","",N,[[["pyobjectref"]],["vec",["pyobjectref"]]]],[5,"isinstance","","",N,[[["pyobjectref"],["pyobjectref"]],["bool"]]],[5,"issubclass","","",N,[[["pyobjectref"],["pyobjectref"]],["bool"]]],[5,"get_type_name","","",N,[[["pyobjectref"]],["string"]]],[5,"type_new","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"type_call","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"type_getattribute","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"get_attributes","","",N,[[["pyobjectref"]],["pyattributes"]]],[5,"new","","",N,[[["pyobjectref"],["str"],["vec",["pyobjectref"]],["hashmap",["string","pyobjectref"]]],["pyresult"]]],[0,"objzip","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objzip","",N,[[["pycontext"]]]],[0,"pyobject","rustpython_vm","",N,N],[3,"PyContext","rustpython_vm::pyobject","",N,N],[12,"bytes_type","","",21,N],[12,"bytearray_type","","",21,N],[12,"bool_type","","",21,N],[12,"classmethod_type","","",21,N],[12,"code_type","","",21,N],[12,"dict_type","","",21,N],[12,"enumerate_type","","",21,N],[12,"filter_type","","",21,N],[12,"float_type","","",21,N],[12,"frame_type","","",21,N],[12,"frozenset_type","","",21,N],[12,"generator_type","","",21,N],[12,"int_type","","",21,N],[12,"iter_type","","",21,N],[12,"complex_type","","",21,N],[12,"true_value","","",21,N],[12,"false_value","","",21,N],[12,"list_type","","",21,N],[12,"map_type","","",21,N],[12,"memoryview_type","","",21,N],[12,"none","","",21,N],[12,"not_implemented","","",21,N],[12,"tuple_type","","",21,N],[12,"set_type","","",21,N],[12,"staticmethod_type","","",21,N],[12,"super_type","","",21,N],[12,"str_type","","",21,N],[12,"range_type","","",21,N],[12,"slice_type","","",21,N],[12,"type_type","","",21,N],[12,"zip_type","","",21,N],[12,"function_type","","",21,N],[12,"builtin_function_or_method_type","","",21,N],[12,"property_type","","",21,N],[12,"module_type","","",21,N],[12,"bound_method_type","","",21,N],[12,"member_descriptor_type","","",21,N],[12,"object","","",21,N],[12,"exceptions","","",21,N],[3,"Scope","","",N,N],[12,"locals","","",22,N],[12,"parent","","",22,N],[3,"PyObject","","This is an actual python object. It consists of a `typ` which is the python class, and carries some rust payload optionally. This rust payload can be a rust float or rust int in case of float and int objects.",N,N],[12,"payload","","",23,N],[12,"typ","","",23,N],[3,"PyFuncArgs","","The `PyFuncArgs` struct is one of the most used structs then creating a rust function that can be called from python. It holds both positional arguments, as well as keyword arguments passed to the function.",N,N],[12,"args","","",24,N],[12,"kwargs","","",24,N],[4,"PyObjectPayload","","Rather than determining the type of a python object, this enum is more a holder for the rust payload of a python object. It is more a carrier of rust data for a particular python object. Determine the python type by using for example the `.typ()` method on a python object.",N,N],[13,"String","","",25,N],[12,"value","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Integer","rustpython_vm::pyobject","",25,N],[12,"value","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Float","rustpython_vm::pyobject","",25,N],[12,"value","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Complex","rustpython_vm::pyobject","",25,N],[12,"value","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Bytes","rustpython_vm::pyobject","",25,N],[12,"value","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Sequence","rustpython_vm::pyobject","",25,N],[12,"elements","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Dict","rustpython_vm::pyobject","",25,N],[12,"elements","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Set","rustpython_vm::pyobject","",25,N],[12,"elements","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Iterator","rustpython_vm::pyobject","",25,N],[12,"position","rustpython_vm::pyobject::PyObjectPayload","",25,N],[12,"iterated_obj","","",25,N],[13,"EnumerateIterator","rustpython_vm::pyobject","",25,N],[12,"counter","rustpython_vm::pyobject::PyObjectPayload","",25,N],[12,"iterator","","",25,N],[13,"FilterIterator","rustpython_vm::pyobject","",25,N],[12,"predicate","rustpython_vm::pyobject::PyObjectPayload","",25,N],[12,"iterator","","",25,N],[13,"MapIterator","rustpython_vm::pyobject","",25,N],[12,"mapper","rustpython_vm::pyobject::PyObjectPayload","",25,N],[12,"iterators","","",25,N],[13,"ZipIterator","rustpython_vm::pyobject","",25,N],[12,"iterators","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Slice","rustpython_vm::pyobject","",25,N],[12,"start","rustpython_vm::pyobject::PyObjectPayload","",25,N],[12,"stop","","",25,N],[12,"step","","",25,N],[13,"Range","rustpython_vm::pyobject","",25,N],[12,"range","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"MemoryView","rustpython_vm::pyobject","",25,N],[12,"obj","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Code","rustpython_vm::pyobject","",25,N],[12,"code","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Frame","rustpython_vm::pyobject","",25,N],[12,"frame","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Function","rustpython_vm::pyobject","",25,N],[12,"code","rustpython_vm::pyobject::PyObjectPayload","",25,N],[12,"scope","","",25,N],[12,"defaults","","",25,N],[13,"Generator","rustpython_vm::pyobject","",25,N],[12,"frame","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"BoundMethod","rustpython_vm::pyobject","",25,N],[12,"function","rustpython_vm::pyobject::PyObjectPayload","",25,N],[12,"object","","",25,N],[13,"Scope","rustpython_vm::pyobject","",25,N],[12,"scope","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Module","rustpython_vm::pyobject","",25,N],[12,"name","rustpython_vm::pyobject::PyObjectPayload","",25,N],[12,"dict","","",25,N],[13,"None","rustpython_vm::pyobject","",25,N],[13,"NotImplemented","","",25,N],[13,"Class","","",25,N],[12,"name","rustpython_vm::pyobject::PyObjectPayload","",25,N],[12,"dict","","",25,N],[12,"mro","","",25,N],[13,"WeakRef","rustpython_vm::pyobject","",25,N],[12,"referent","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"Instance","rustpython_vm::pyobject","",25,N],[12,"dict","rustpython_vm::pyobject::PyObjectPayload","",25,N],[13,"RustFunction","rustpython_vm::pyobject","",25,N],[12,"function","rustpython_vm::pyobject::PyObjectPayload","",25,N],[5,"create_type","rustpython_vm::pyobject","",N,[[["str"],["pyobjectref"],["pyobjectref"],["pyobjectref"]],["pyobjectref"]]],[6,"PyRef","","",N,N],[6,"PyObjectRef","","The `PyObjectRef` is one of the most used types. It is a reference to a python object. A single python object can have multiple references, and this reference counting is accounted for by this type. Use the `.clone()` method to create a new reference and increment the amount of references to the python object by 1.",N,N],[6,"PyObjectWeakRef","","Same as PyObjectRef, except for being a weak reference.",N,N],[6,"PyResult","","Use this type for function which return a python object or and exception. Both the python object and the python exception are `PyObjectRef` types since exceptions are also python objects.",N,N],[6,"PyAttributes","","For attributes we do not use a dict, but a hashmap. This is probably faster, unordered, and only supports strings as keys.",N,N],[8,"IdProtocol","","",N,N],[10,"get_id","","",26,[[["self"]],["usize"]]],[10,"is","","",26,[[["self"],["pyobjectref"]],["bool"]]],[8,"FromPyObjectRef","","",N,N],[10,"from_pyobj","","",27,[[["pyobjectref"]],["self"]]],[8,"TypeProtocol","","",N,N],[10,"typ","","",28,[[["self"]],["pyobjectref"]]],[8,"ParentProtocol","","",N,N],[10,"has_parent","","",29,[[["self"]],["bool"]]],[10,"get_parent","","",29,[[["self"]],["pyobjectref"]]],[8,"AttributeProtocol","","",N,N],[10,"get_attr","","",30,[[["self"],["str"]],["option",["pyobjectref"]]]],[10,"has_attr","","",30,[[["self"],["str"]],["bool"]]],[8,"DictProtocol","","",N,N],[10,"contains_key","","",31,[[["self"],["str"]],["bool"]]],[10,"get_item","","",31,[[["self"],["str"]],["option",["pyobjectref"]]]],[10,"get_key_value_pairs","","",31,[[["self"]],["vec"]]],[8,"BufferProtocol","","",N,N],[10,"readonly","","",32,[[["self"]],["bool"]]],[11,"new","","",21,[[],["self"]]],[11,"bytearray_type","","",21,[[["self"]],["pyobjectref"]]],[11,"bytes_type","","",21,[[["self"]],["pyobjectref"]]],[11,"code_type","","",21,[[["self"]],["pyobjectref"]]],[11,"complex_type","","",21,[[["self"]],["pyobjectref"]]],[11,"dict_type","","",21,[[["self"]],["pyobjectref"]]],[11,"float_type","","",21,[[["self"]],["pyobjectref"]]],[11,"frame_type","","",21,[[["self"]],["pyobjectref"]]],[11,"int_type","","",21,[[["self"]],["pyobjectref"]]],[11,"list_type","","",21,[[["self"]],["pyobjectref"]]],[11,"set_type","","",21,[[["self"]],["pyobjectref"]]],[11,"range_type","","",21,[[["self"]],["pyobjectref"]]],[11,"slice_type","","",21,[[["self"]],["pyobjectref"]]],[11,"frozenset_type","","",21,[[["self"]],["pyobjectref"]]],[11,"bool_type","","",21,[[["self"]],["pyobjectref"]]],[11,"memoryview_type","","",21,[[["self"]],["pyobjectref"]]],[11,"tuple_type","","",21,[[["self"]],["pyobjectref"]]],[11,"iter_type","","",21,[[["self"]],["pyobjectref"]]],[11,"enumerate_type","","",21,[[["self"]],["pyobjectref"]]],[11,"filter_type","","",21,[[["self"]],["pyobjectref"]]],[11,"map_type","","",21,[[["self"]],["pyobjectref"]]],[11,"zip_type","","",21,[[["self"]],["pyobjectref"]]],[11,"str_type","","",21,[[["self"]],["pyobjectref"]]],[11,"super_type","","",21,[[["self"]],["pyobjectref"]]],[11,"function_type","","",21,[[["self"]],["pyobjectref"]]],[11,"builtin_function_or_method_type","","",21,[[["self"]],["pyobjectref"]]],[11,"property_type","","",21,[[["self"]],["pyobjectref"]]],[11,"classmethod_type","","",21,[[["self"]],["pyobjectref"]]],[11,"staticmethod_type","","",21,[[["self"]],["pyobjectref"]]],[11,"generator_type","","",21,[[["self"]],["pyobjectref"]]],[11,"bound_method_type","","",21,[[["self"]],["pyobjectref"]]],[11,"member_descriptor_type","","",21,[[["self"]],["pyobjectref"]]],[11,"type_type","","",21,[[["self"]],["pyobjectref"]]],[11,"none","","",21,[[["self"]],["pyobjectref"]]],[11,"not_implemented","","",21,[[["self"]],["pyobjectref"]]],[11,"object","","",21,[[["self"]],["pyobjectref"]]],[11,"new_object","","",21,[[["self"]],["pyobjectref"]]],[11,"new_int","","",21,[[["self"],["t"]],["pyobjectref"]]],[11,"new_float","","",21,[[["self"],["f64"]],["pyobjectref"]]],[11,"new_complex","","",21,[[["self"],["complex64"]],["pyobjectref"]]],[11,"new_str","","",21,[[["self"],["string"]],["pyobjectref"]]],[11,"new_bytes","","",21,[[["self"],["vec",["u8"]]],["pyobjectref"]]],[11,"new_bytearray","","",21,[[["self"],["vec",["u8"]]],["pyobjectref"]]],[11,"new_bool","","",21,[[["self"],["bool"]],["pyobjectref"]]],[11,"new_tuple","","",21,[[["self"],["vec",["pyobjectref"]]],["pyobjectref"]]],[11,"new_list","","",21,[[["self"],["vec",["pyobjectref"]]],["pyobjectref"]]],[11,"new_set","","",21,[[["self"]],["pyobjectref"]]],[11,"new_dict","","",21,[[["self"]],["pyobjectref"]]],[11,"new_class","","",21,[[["self"],["str"],["pyobjectref"]],["pyobjectref"]]],[11,"new_scope","","",21,[[["self"],["option",["pyobjectref"]]],["pyobjectref"]]],[11,"new_module","","",21,[[["self"],["str"],["pyobjectref"]],["pyobjectref"]]],[11,"new_rustfunc","","",21,[[["self"],["f"]],["pyobjectref"]]],[11,"new_rustfunc_from_box","","",21,[[["self"],["box",["fn"]]],["pyobjectref"]]],[11,"new_frame","","",21,[[["self"],["frame"]],["pyobjectref"]]],[11,"new_property","","",21,[[["self"],["f"]],["pyobjectref"]]],[11,"new_code_object","","",21,[[["self"],["codeobject"]],["pyobjectref"]]],[11,"new_function","","",21,[[["self"],["pyobjectref"],["pyobjectref"],["pyobjectref"]],["pyobjectref"]]],[11,"new_bound_method","","",21,[[["self"],["pyobjectref"],["pyobjectref"]],["pyobjectref"]]],[11,"new_member_descriptor","","",21,[[["self"],["f"]],["pyobjectref"]]],[11,"new_instance","","",21,[[["self"],["pyobjectref"],["option",["pyattributes"]]],["pyobjectref"]]],[11,"set_item","","",21,[[["self"],["pyobjectref"],["str"],["pyobjectref"]]]],[11,"get_attr","","",21,[[["self"],["pyobjectref"],["str"]],["option",["pyobjectref"]]]],[11,"set_attr","","",21,[[["self"],["pyobjectref"],["str"],["pyobjectref"]]]],[11,"unwrap_constant","","",21,[[["self"],["constant"]],["pyobjectref"]]],[11,"new","","",24,[[["vec",["pyobjectref"]],["vec",["string"]]],["pyfuncargs"]]],[11,"insert","","",24,[[["self"],["pyobjectref"]],["pyfuncargs"]]],[11,"shift","","",24,[[["self"]],["pyobjectref"]]],[11,"get_kwarg","","",24,[[["self"],["str"],["pyobjectref"]],["pyobjectref"]]],[11,"get_optional_kwarg","","",24,[[["self"],["str"]],["option",["pyobjectref"]]]],[11,"new","","",23,[[["pyobjectpayload"],["pyobjectref"]],["pyobjectref"]]],[11,"into_ref","","",23,[[["self"]],["pyobjectref"]]],[0,"stdlib","rustpython_vm","",N,N],[5,"get_module_inits","rustpython_vm::stdlib","",N,[[],["hashmap",["string","stdlibinitfunc"]]]],[0,"io","","",N,N],[5,"io_open","rustpython_vm::stdlib::io","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"mk_module","","",N,[[["pycontext"]],["pyobjectref"]]],[6,"StdlibInitFunc","rustpython_vm::stdlib","",N,N],[0,"util","rustpython_vm","",N,N],[5,"read_file","rustpython_vm::util","Read a file at `path` into a String",N,[[["path"]],["result",["string"]]]],[11,"new","rustpython_vm","Create a new `VirtualMachine` structure.",0,[[],["virtualmachine"]]],[11,"run_code_obj","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"new_str","","Create a new python string object.",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_bool","","Create a new python bool object.",0,[[["self"],["bool"]],["pyobjectref"]]],[11,"new_dict","","",0,[[["self"]],["pyobjectref"]]],[11,"new_exception","","",0,[[["self"],["pyobjectref"],["string"]],["pyobjectref"]]],[11,"new_type_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_unsupported_operand_error","","",0,[[["self"],["pyobjectref"],["pyobjectref"],["str"]],["pyobjectref"]]],[11,"new_os_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_value_error","","Create a new python ValueError object. Useful for raising errors from python functions implemented in rust.",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_key_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_index_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_not_implemented_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_zero_division_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_overflow_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_scope","","",0,[[["self"],["option",["pyobjectref"]]],["pyobjectref"]]],[11,"get_none","","",0,[[["self"]],["pyobjectref"]]],[11,"get_type","","",0,[[["self"]],["pyobjectref"]]],[11,"get_object","","",0,[[["self"]],["pyobjectref"]]],[11,"get_locals","","",0,[[["self"]],["pyobjectref"]]],[11,"context","","",0,[[["self"]],["pycontext"]]],[11,"get_builtin_scope","","",0,[[["self"]],["pyobjectref"]]],[11,"to_str","","",0,[[["self"],["pyobjectref"]],["pyresult"]]],[11,"to_pystr","","",0,[[["self"],["pyobjectref"]],["result",["string","pyobjectref"]]]],[11,"to_repr","","",0,[[["self"],["pyobjectref"]],["pyresult"]]],[11,"call_get_descriptor","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"call_method","","",0,[[["self"],["pyobjectref"],["str"],["vec",["pyobjectref"]]],["pyresult"]]],[11,"call_method_pyargs","","",0,[[["self"],["pyobjectref"],["str"],["pyfuncargs"]],["pyresult"]]],[11,"invoke","","",0,[[["self"],["pyobjectref"],["pyfuncargs"]],["pyresult"]]],[11,"extract_elements","","",0,[[["self"],["pyobjectref"]],["result",["vec","pyobjectref"]]]],[11,"get_attribute","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"del_attr","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"get_method","","",0,[[["self"],["pyobjectref"],["str"]],["pyresult"]]],[11,"call_or_unsupported","","Calls a method on `obj` passing `arg`, if the method exists.",0,[[["self"],["pyobjectref"],["pyobjectref"],["str"],["f"]],["pyresult"]]],[11,"call_or_reflection","","Calls a method, falling back to its reflection with the operands reversed, and then to the value provided by `unsupported`.",0,N],[11,"_sub","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_isub","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_add","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_iadd","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_mul","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_imul","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_matmul","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_imatmul","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_truediv","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_itruediv","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_floordiv","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ifloordiv","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_pow","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ipow","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_mod","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_imod","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_lshift","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ilshift","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_rshift","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_irshift","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_xor","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ixor","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_or","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ior","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_and","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_iand","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_eq","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ne","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_lt","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_le","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_gt","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ge","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[14,"replace_expr","","",N,N],[14,"count_tts","","",N,N],[14,"type_check","","",N,N],[14,"arg_check","","",N,N],[14,"no_kwargs","","",N,N],[11,"into","","",0,[[["self"]],["u"]]],[11,"from","","",0,[[["t"]],["t"]]],[11,"try_from","","",0,[[["u"]],["result"]]],[11,"borrow","","",0,[[["self"]],["t"]]],[11,"get_type_id","","",0,[[["self"]],["typeid"]]],[11,"try_into","","",0,[[["self"]],["result"]]],[11,"borrow_mut","","",0,[[["self"]],["t"]]],[11,"into","rustpython_vm::bytecode","",1,[[["self"]],["u"]]],[11,"to_string","","",1,[[["self"]],["string"]]],[11,"to_owned","","",1,[[["self"]],["t"]]],[11,"clone_into","","",1,N],[11,"from","","",1,[[["t"]],["t"]]],[11,"try_from","","",1,[[["u"]],["result"]]],[11,"borrow","","",1,[[["self"]],["t"]]],[11,"get_type_id","","",1,[[["self"]],["typeid"]]],[11,"try_into","","",1,[[["self"]],["result"]]],[11,"borrow_mut","","",1,[[["self"]],["t"]]],[11,"into","","",8,[[["self"]],["u"]]],[11,"to_owned","","",8,[[["self"]],["t"]]],[11,"clone_into","","",8,N],[11,"from","","",8,[[["t"]],["t"]]],[11,"try_from","","",8,[[["u"]],["result"]]],[11,"borrow","","",8,[[["self"]],["t"]]],[11,"get_type_id","","",8,[[["self"]],["typeid"]]],[11,"try_into","","",8,[[["self"]],["result"]]],[11,"borrow_mut","","",8,[[["self"]],["t"]]],[11,"into","","",2,[[["self"]],["u"]]],[11,"to_owned","","",2,[[["self"]],["t"]]],[11,"clone_into","","",2,N],[11,"from","","",2,[[["t"]],["t"]]],[11,"try_from","","",2,[[["u"]],["result"]]],[11,"borrow","","",2,[[["self"]],["t"]]],[11,"get_type_id","","",2,[[["self"]],["typeid"]]],[11,"try_into","","",2,[[["self"]],["result"]]],[11,"borrow_mut","","",2,[[["self"]],["t"]]],[11,"into","","",3,[[["self"]],["u"]]],[11,"to_owned","","",3,[[["self"]],["t"]]],[11,"clone_into","","",3,N],[11,"from","","",3,[[["t"]],["t"]]],[11,"try_from","","",3,[[["u"]],["result"]]],[11,"borrow","","",3,[[["self"]],["t"]]],[11,"get_type_id","","",3,[[["self"]],["typeid"]]],[11,"try_into","","",3,[[["self"]],["result"]]],[11,"borrow_mut","","",3,[[["self"]],["t"]]],[11,"into","","",4,[[["self"]],["u"]]],[11,"to_string","","",4,[[["self"]],["string"]]],[11,"to_owned","","",4,[[["self"]],["t"]]],[11,"clone_into","","",4,N],[11,"from","","",4,[[["t"]],["t"]]],[11,"try_from","","",4,[[["u"]],["result"]]],[11,"borrow","","",4,[[["self"]],["t"]]],[11,"get_type_id","","",4,[[["self"]],["typeid"]]],[11,"try_into","","",4,[[["self"]],["result"]]],[11,"borrow_mut","","",4,[[["self"]],["t"]]],[11,"into","","",5,[[["self"]],["u"]]],[11,"to_owned","","",5,[[["self"]],["t"]]],[11,"clone_into","","",5,N],[11,"from","","",5,[[["t"]],["t"]]],[11,"try_from","","",5,[[["u"]],["result"]]],[11,"borrow","","",5,[[["self"]],["t"]]],[11,"get_type_id","","",5,[[["self"]],["typeid"]]],[11,"try_into","","",5,[[["self"]],["result"]]],[11,"borrow_mut","","",5,[[["self"]],["t"]]],[11,"into","","",6,[[["self"]],["u"]]],[11,"to_owned","","",6,[[["self"]],["t"]]],[11,"clone_into","","",6,N],[11,"from","","",6,[[["t"]],["t"]]],[11,"try_from","","",6,[[["u"]],["result"]]],[11,"borrow","","",6,[[["self"]],["t"]]],[11,"get_type_id","","",6,[[["self"]],["typeid"]]],[11,"try_into","","",6,[[["self"]],["result"]]],[11,"borrow_mut","","",6,[[["self"]],["t"]]],[11,"into","","",7,[[["self"]],["u"]]],[11,"to_owned","","",7,[[["self"]],["t"]]],[11,"clone_into","","",7,N],[11,"from","","",7,[[["t"]],["t"]]],[11,"try_from","","",7,[[["u"]],["result"]]],[11,"borrow","","",7,[[["self"]],["t"]]],[11,"get_type_id","","",7,[[["self"]],["typeid"]]],[11,"try_into","","",7,[[["self"]],["result"]]],[11,"borrow_mut","","",7,[[["self"]],["t"]]],[11,"into","rustpython_vm::compile","",9,[[["self"]],["u"]]],[11,"from","","",9,[[["t"]],["t"]]],[11,"try_from","","",9,[[["u"]],["result"]]],[11,"borrow","","",9,[[["self"]],["t"]]],[11,"get_type_id","","",9,[[["self"]],["typeid"]]],[11,"try_into","","",9,[[["self"]],["result"]]],[11,"borrow_mut","","",9,[[["self"]],["t"]]],[11,"into","rustpython_vm::error","",10,[[["self"]],["u"]]],[11,"to_string","","",10,[[["self"]],["string"]]],[11,"from","","",10,[[["t"]],["t"]]],[11,"try_from","","",10,[[["u"]],["result"]]],[11,"borrow","","",10,[[["self"]],["t"]]],[11,"get_type_id","","",10,[[["self"]],["typeid"]]],[11,"try_into","","",10,[[["self"]],["result"]]],[11,"borrow_mut","","",10,[[["self"]],["t"]]],[11,"into","rustpython_vm::format","",18,[[["self"]],["u"]]],[11,"from","","",18,[[["t"]],["t"]]],[11,"try_from","","",18,[[["u"]],["result"]]],[11,"borrow","","",18,[[["self"]],["t"]]],[11,"get_type_id","","",18,[[["self"]],["typeid"]]],[11,"try_into","","",18,[[["self"]],["result"]]],[11,"borrow_mut","","",18,[[["self"]],["t"]]],[11,"into","","",11,[[["self"]],["u"]]],[11,"from","","",11,[[["t"]],["t"]]],[11,"try_from","","",11,[[["u"]],["result"]]],[11,"borrow","","",11,[[["self"]],["t"]]],[11,"get_type_id","","",11,[[["self"]],["typeid"]]],[11,"try_into","","",11,[[["self"]],["result"]]],[11,"borrow_mut","","",11,[[["self"]],["t"]]],[11,"into","","",12,[[["self"]],["u"]]],[11,"to_owned","","",12,[[["self"]],["t"]]],[11,"clone_into","","",12,N],[11,"from","","",12,[[["t"]],["t"]]],[11,"try_from","","",12,[[["u"]],["result"]]],[11,"borrow","","",12,[[["self"]],["t"]]],[11,"get_type_id","","",12,[[["self"]],["typeid"]]],[11,"try_into","","",12,[[["self"]],["result"]]],[11,"borrow_mut","","",12,[[["self"]],["t"]]],[11,"into","","",13,[[["self"]],["u"]]],[11,"to_owned","","",13,[[["self"]],["t"]]],[11,"clone_into","","",13,N],[11,"from","","",13,[[["t"]],["t"]]],[11,"try_from","","",13,[[["u"]],["result"]]],[11,"borrow","","",13,[[["self"]],["t"]]],[11,"get_type_id","","",13,[[["self"]],["typeid"]]],[11,"try_into","","",13,[[["self"]],["result"]]],[11,"borrow_mut","","",13,[[["self"]],["t"]]],[11,"into","","",14,[[["self"]],["u"]]],[11,"from","","",14,[[["t"]],["t"]]],[11,"try_from","","",14,[[["u"]],["result"]]],[11,"borrow","","",14,[[["self"]],["t"]]],[11,"get_type_id","","",14,[[["self"]],["typeid"]]],[11,"try_into","","",14,[[["self"]],["result"]]],[11,"borrow_mut","","",14,[[["self"]],["t"]]],[11,"into","","",15,[[["self"]],["u"]]],[11,"from","","",15,[[["t"]],["t"]]],[11,"try_from","","",15,[[["u"]],["result"]]],[11,"borrow","","",15,[[["self"]],["t"]]],[11,"get_type_id","","",15,[[["self"]],["typeid"]]],[11,"try_into","","",15,[[["self"]],["result"]]],[11,"borrow_mut","","",15,[[["self"]],["t"]]],[11,"into","","",16,[[["self"]],["u"]]],[11,"from","","",16,[[["t"]],["t"]]],[11,"try_from","","",16,[[["u"]],["result"]]],[11,"borrow","","",16,[[["self"]],["t"]]],[11,"get_type_id","","",16,[[["self"]],["typeid"]]],[11,"try_into","","",16,[[["self"]],["result"]]],[11,"borrow_mut","","",16,[[["self"]],["t"]]],[11,"into","","",17,[[["self"]],["u"]]],[11,"from","","",17,[[["t"]],["t"]]],[11,"try_from","","",17,[[["u"]],["result"]]],[11,"borrow","","",17,[[["self"]],["t"]]],[11,"get_type_id","","",17,[[["self"]],["typeid"]]],[11,"try_into","","",17,[[["self"]],["result"]]],[11,"borrow_mut","","",17,[[["self"]],["t"]]],[11,"into","rustpython_vm::obj::objrange","",19,[[["self"]],["u"]]],[11,"to_owned","","",19,[[["self"]],["t"]]],[11,"clone_into","","",19,N],[11,"from","","",19,[[["t"]],["t"]]],[11,"try_from","","",19,[[["u"]],["result"]]],[11,"borrow","","",19,[[["self"]],["t"]]],[11,"get_type_id","","",19,[[["self"]],["typeid"]]],[11,"try_into","","",19,[[["self"]],["result"]]],[11,"borrow_mut","","",19,[[["self"]],["t"]]],[11,"into","rustpython_vm::pyobject","",21,[[["self"]],["u"]]],[11,"from","","",21,[[["t"]],["t"]]],[11,"try_from","","",21,[[["u"]],["result"]]],[11,"borrow","","",21,[[["self"]],["t"]]],[11,"get_type_id","","",21,[[["self"]],["typeid"]]],[11,"try_into","","",21,[[["self"]],["result"]]],[11,"borrow_mut","","",21,[[["self"]],["t"]]],[11,"into","","",22,[[["self"]],["u"]]],[11,"from","","",22,[[["t"]],["t"]]],[11,"try_from","","",22,[[["u"]],["result"]]],[11,"borrow","","",22,[[["self"]],["t"]]],[11,"get_type_id","","",22,[[["self"]],["typeid"]]],[11,"try_into","","",22,[[["self"]],["result"]]],[11,"borrow_mut","","",22,[[["self"]],["t"]]],[11,"into","","",23,[[["self"]],["u"]]],[11,"to_string","","",23,[[["self"]],["string"]]],[11,"from","","",23,[[["t"]],["t"]]],[11,"try_from","","",23,[[["u"]],["result"]]],[11,"borrow","","",23,[[["self"]],["t"]]],[11,"get_type_id","","",23,[[["self"]],["typeid"]]],[11,"try_into","","",23,[[["self"]],["result"]]],[11,"borrow_mut","","",23,[[["self"]],["t"]]],[11,"into","","",24,[[["self"]],["u"]]],[11,"to_owned","","",24,[[["self"]],["t"]]],[11,"clone_into","","",24,N],[11,"from","","",24,[[["t"]],["t"]]],[11,"try_from","","",24,[[["u"]],["result"]]],[11,"borrow","","",24,[[["self"]],["t"]]],[11,"get_type_id","","",24,[[["self"]],["typeid"]]],[11,"try_into","","",24,[[["self"]],["result"]]],[11,"borrow_mut","","",24,[[["self"]],["t"]]],[11,"into","","",25,[[["self"]],["u"]]],[11,"from","","",25,[[["t"]],["t"]]],[11,"try_from","","",25,[[["u"]],["result"]]],[11,"borrow","","",25,[[["self"]],["t"]]],[11,"get_type_id","","",25,[[["self"]],["typeid"]]],[11,"try_into","","",25,[[["self"]],["result"]]],[11,"borrow_mut","","",25,[[["self"]],["t"]]],[11,"get_id","rustpython_vm","",33,[[["self"]],["usize"]]],[11,"is","","",33,[[["self"],["pyobjectref"]],["bool"]]],[11,"typ","","",33,[[["self"]],["pyobjectref"]]],[11,"typ","rustpython_vm::pyobject","",23,[[["self"]],["pyobjectref"]]],[11,"has_parent","rustpython_vm","",33,[[["self"]],["bool"]]],[11,"get_parent","","",33,[[["self"]],["pyobjectref"]]],[11,"get_attr","","",33,[[["self"],["str"]],["option",["pyobjectref"]]]],[11,"has_attr","","",33,[[["self"],["str"]],["bool"]]],[11,"contains_key","","",33,[[["self"],["str"]],["bool"]]],[11,"get_item","","",33,[[["self"],["str"]],["option",["pyobjectref"]]]],[11,"get_key_value_pairs","","",33,[[["self"]],["vec"]]],[11,"readonly","","",33,[[["self"]],["bool"]]],[11,"partial_cmp","rustpython_vm::bytecode","",8,[[["self"],["functionoparg"]],["option",["ordering"]]]],[11,"lt","","",8,[[["self"],["functionoparg"]],["bool"]]],[11,"le","","",8,[[["self"],["functionoparg"]],["bool"]]],[11,"gt","","",8,[[["self"],["functionoparg"]],["bool"]]],[11,"ge","","",8,[[["self"],["functionoparg"]],["bool"]]],[11,"default","rustpython_vm::pyobject","",24,[[],["pyfuncargs"]]],[11,"cmp","rustpython_vm::bytecode","",8,[[["self"],["functionoparg"]],["ordering"]]],[11,"eq","","",1,[[["self"],["codeobject"]],["bool"]]],[11,"ne","","",1,[[["self"],["codeobject"]],["bool"]]],[11,"eq","","",8,[[["self"],["functionoparg"]],["bool"]]],[11,"ne","","",8,[[["self"],["functionoparg"]],["bool"]]],[11,"eq","","",2,[[["self"],["instruction"]],["bool"]]],[11,"ne","","",2,[[["self"],["instruction"]],["bool"]]],[11,"eq","","",3,[[["self"],["calltype"]],["bool"]]],[11,"ne","","",3,[[["self"],["calltype"]],["bool"]]],[11,"eq","","",4,[[["self"],["constant"]],["bool"]]],[11,"ne","","",4,[[["self"],["constant"]],["bool"]]],[11,"eq","","",5,[[["self"],["comparisonoperator"]],["bool"]]],[11,"eq","","",6,[[["self"],["binaryoperator"]],["bool"]]],[11,"eq","","",7,[[["self"],["unaryoperator"]],["bool"]]],[11,"eq","rustpython_vm::format","",12,[[["self"],["formatalign"]],["bool"]]],[11,"eq","","",13,[[["self"],["formatsign"]],["bool"]]],[11,"eq","","",14,[[["self"],["formatgrouping"]],["bool"]]],[11,"eq","","",15,[[["self"],["formattype"]],["bool"]]],[11,"eq","","",18,[[["self"],["formatspec"]],["bool"]]],[11,"ne","","",18,[[["self"],["formatspec"]],["bool"]]],[11,"eq","","",16,[[["self"],["formatparseerror"]],["bool"]]],[11,"eq","","",17,[[["self"],["formatpart"]],["bool"]]],[11,"ne","","",17,[[["self"],["formatpart"]],["bool"]]],[11,"eq","","",11,[[["self"],["formatstring"]],["bool"]]],[11,"ne","","",11,[[["self"],["formatstring"]],["bool"]]],[11,"clone","rustpython_vm::bytecode","",1,[[["self"]],["codeobject"]]],[11,"clone","","",8,[[["self"]],["functionoparg"]]],[11,"clone","","",2,[[["self"]],["instruction"]]],[11,"clone","","",3,[[["self"]],["calltype"]]],[11,"clone","","",4,[[["self"]],["constant"]]],[11,"clone","","",5,[[["self"]],["comparisonoperator"]]],[11,"clone","","",6,[[["self"]],["binaryoperator"]]],[11,"clone","","",7,[[["self"]],["unaryoperator"]]],[11,"clone","rustpython_vm::format","",12,[[["self"]],["formatalign"]]],[11,"clone","","",13,[[["self"]],["formatsign"]]],[11,"clone","rustpython_vm::obj::objrange","",19,[[["self"]],["rangetype"]]],[11,"clone","rustpython_vm::pyobject","",24,[[["self"]],["pyfuncargs"]]],[11,"extend","rustpython_vm::bytecode","",8,[[["self"],["t"]]]],[11,"fmt","","",8,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",1,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",4,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::error","",10,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::pyobject","",23,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::bytecode","",8,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",8,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",2,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",3,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",4,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",5,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",6,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",7,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",1,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::error","",10,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::format","",12,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",13,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",14,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",15,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",18,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",16,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",17,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",11,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objrange","",19,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::pyobject","",21,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",22,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",23,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",24,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",25,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::bytecode","",8,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",8,[[["self"],["formatter"]],["result"]]],[11,"hash","","",8,N],[11,"sub","","Returns the set difference of the two sets of flags.",8,[[["self"],["functionoparg"]],["functionoparg"]]],[11,"sub_assign","","Disables all flags enabled in the set.",8,[[["self"],["functionoparg"]]]],[11,"not","","Returns the complement of this set of flags.",8,[[["self"]],["functionoparg"]]],[11,"bitand","","Returns the intersection between the two sets of flags.",8,[[["self"],["functionoparg"]],["functionoparg"]]],[11,"bitor","","Returns the union of the two sets of flags.",8,[[["self"],["functionoparg"]],["functionoparg"]]],[11,"bitxor","","Returns the left flags, but with all the right flags toggled.",8,[[["self"],["functionoparg"]],["functionoparg"]]],[11,"bitand_assign","","Disables all flags disabled in the set.",8,[[["self"],["functionoparg"]]]],[11,"bitor_assign","","Adds the set of flags.",8,[[["self"],["functionoparg"]]]],[11,"bitxor_assign","","Toggles the set of flags.",8,[[["self"],["functionoparg"]]]],[11,"from_iter","","",8,[[["t"]],["functionoparg"]]],[11,"from_str","rustpython_vm::format","",18,[[["str"]],["result"]]],[11,"from_str","","",11,[[["str"]],["result"]]],[11,"source","rustpython_vm::error","",10,[[["self"]],["option",["error"]]]]],"paths":[[3,"VirtualMachine"],[3,"CodeObject"],[4,"Instruction"],[4,"CallType"],[4,"Constant"],[4,"ComparisonOperator"],[4,"BinaryOperator"],[4,"UnaryOperator"],[3,"FunctionOpArg"],[4,"Mode"],[4,"CompileError"],[3,"FormatString"],[4,"FormatAlign"],[4,"FormatSign"],[4,"FormatGrouping"],[4,"FormatType"],[4,"FormatParseError"],[4,"FormatPart"],[3,"FormatSpec"],[3,"RangeType"],[8,"PySliceableSequence"],[3,"PyContext"],[3,"Scope"],[3,"PyObject"],[3,"PyFuncArgs"],[4,"PyObjectPayload"],[8,"IdProtocol"],[8,"FromPyObjectRef"],[8,"TypeProtocol"],[8,"ParentProtocol"],[8,"AttributeProtocol"],[8,"DictProtocol"],[8,"BufferProtocol"],[6,"PyObjectRef"]]}; -searchIndex["rustpython_wasm"]={"doc":"","items":[[5,"setup_console_error","rustpython_wasm","",N,[[]]],[5,"eval_py","","Evaluate Python code",N,[[["string"],["option",["object"]]],["result",["jsvalue","jsvalue"]]]],[0,"convert","","",N,N],[5,"py_str_err","rustpython_wasm::convert","",N,[[["virtualmachine"],["pyobjectref"]],["string"]]],[5,"js_py_typeerror","","",N,[[["virtualmachine"],["jsvalue"]],["pyobjectref"]]],[5,"py_to_js","","",N,[[["virtualmachine"],["pyobjectref"]],["jsvalue"]]],[5,"object_entries","","",N,N],[5,"pyresult_to_jsresult","","",N,[[["virtualmachine"],["pyresult"]],["result",["jsvalue","jsvalue"]]]],[5,"js_to_py","","",N,[[["virtualmachine"],["jsvalue"]],["pyobjectref"]]],[0,"vm_class","rustpython_wasm","",N,N],[3,"VMStore","rustpython_wasm::vm_class","",N,N],[3,"AccessibleVM","","",N,N],[3,"AccessibleVMPtr","","",N,N],[3,"WASMVirtualMachine","","",N,N],[11,"init","","",0,[[["string"],["option",["bool"]]],["wasmvirtualmachine"]]],[11,"get","","",0,[[["string"]],["jsvalue"]]],[11,"destroy","","",0,[[["string"]]]],[11,"ids","","",0,[[],["vec",["jsvalue"]]]],[11,"from_id","","",1,[[["string"]],["accessiblevm"]]],[11,"from_vm","","",1,[[["virtualmachine"]],["accessiblevm"]]],[11,"upgrade","","",1,[[["self"]],["option",["accessiblevmptr"]]]],[11,"valid","","",2,[[["self"]],["bool"]]],[11,"assert_valid","","",2,[[["self"]],["result",["jsvalue"]]]],[11,"destroy","","",2,[[["self"]],["result",["jsvalue"]]]],[11,"add_to_scope","","",2,[[["self"],["string"],["jsvalue"]],["result",["jsvalue"]]]],[11,"set_stdout","","",2,[[["self"],["jsvalue"]],["result",["jsvalue"]]]],[11,"exec","","",2,[[["self"],["string"]],["result",["jsvalue","jsvalue"]]]],[11,"eval","","",2,[[["self"],["string"]],["result",["jsvalue","jsvalue"]]]],[0,"wasm_builtins","rustpython_wasm","Builtin function specific to WASM build.",N,N],[5,"print_to_html","rustpython_wasm::wasm_builtins","",N,[[["str"],["str"]],["result",["jsvalue"]]]],[5,"format_print_args","","",N,[[["virtualmachine"],["pyfuncargs"]],["result",["string","pyobjectref"]]]],[5,"builtin_print_html","","",N,[[["virtualmachine"],["pyfuncargs"],["str"]],["pyresult"]]],[5,"builtin_print_console","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"setup_wasm_builtins","","",N,[[["virtualmachine"],["pyobjectref"]]]],[11,"into","rustpython_wasm::vm_class","",0,[[["self"]],["u"]]],[11,"from","","",0,[[["t"]],["t"]]],[11,"try_from","","",0,[[["u"]],["result"]]],[11,"borrow","","",0,[[["self"]],["t"]]],[11,"get_type_id","","",0,[[["self"]],["typeid"]]],[11,"try_into","","",0,[[["self"]],["result"]]],[11,"borrow_mut","","",0,[[["self"]],["t"]]],[11,"return_abi","","",0,N],[11,"into","","",1,[[["self"]],["u"]]],[11,"to_owned","","",1,[[["self"]],["t"]]],[11,"clone_into","","",1,N],[11,"from","","",1,[[["t"]],["t"]]],[11,"try_from","","",1,[[["u"]],["result"]]],[11,"borrow","","",1,[[["self"]],["t"]]],[11,"get_type_id","","",1,[[["self"]],["typeid"]]],[11,"try_into","","",1,[[["self"]],["result"]]],[11,"borrow_mut","","",1,[[["self"]],["t"]]],[11,"into","","",3,[[["self"]],["u"]]],[11,"from","","",3,[[["t"]],["t"]]],[11,"try_from","","",3,[[["u"]],["result"]]],[11,"borrow","","",3,[[["self"]],["t"]]],[11,"get_type_id","","",3,[[["self"]],["typeid"]]],[11,"try_into","","",3,[[["self"]],["result"]]],[11,"borrow_mut","","",3,[[["self"]],["t"]]],[11,"into","","",2,[[["self"]],["u"]]],[11,"to_owned","","",2,[[["self"]],["t"]]],[11,"clone_into","","",2,N],[11,"from","","",2,[[["t"]],["t"]]],[11,"try_from","","",2,[[["u"]],["result"]]],[11,"borrow","","",2,[[["self"]],["t"]]],[11,"get_type_id","","",2,[[["self"]],["typeid"]]],[11,"try_into","","",2,[[["self"]],["result"]]],[11,"borrow_mut","","",2,[[["self"]],["t"]]],[11,"return_abi","","",2,N],[11,"from","","",1,[[["wasmvirtualmachine"]],["accessiblevm"]]],[11,"from","","",1,[[["wasmvirtualmachine"]],["accessiblevm"]]],[11,"clone","","",1,[[["self"]],["accessiblevm"]]],[11,"clone","","",2,[[["self"]],["wasmvirtualmachine"]]],[11,"drop","","",3,[[["self"]]]],[11,"deref","","",3,[[["self"]],["virtualmachine"]]],[11,"deref_mut","","",3,[[["self"]],["virtualmachine"]]],[11,"from_abi","","",0,[[["u32"],["stack"]],["self"]]],[11,"from_abi","","",2,[[["u32"],["stack"]],["self"]]],[11,"describe","","",0,[[]]],[11,"describe","","",2,[[]]],[11,"into_abi","","",0,[[["self"],["stack"]],["u32"]]],[11,"into_abi","","",2,[[["self"],["stack"]],["u32"]]],[11,"ref_from_abi","","",0,N],[11,"ref_from_abi","","",2,N],[11,"ref_mut_from_abi","","",0,N],[11,"ref_mut_from_abi","","",2,N]],"paths":[[3,"VMStore"],[3,"AccessibleVM"],[3,"WASMVirtualMachine"],[3,"AccessibleVMPtr"]]}; -initSearch(searchIndex); +searchIndex["rustpython_derive"]={"doc":"","items":[[24,"FromArgs","rustpython_derive","",N,N]],"paths":[]}; +searchIndex["rustpython_parser"]={"doc":"","items":[[0,"ast","rustpython_parser","Implement abstract syntax tree nodes for the python…",N,N],[3,"Program","rustpython_parser::ast","",N,N],[12,"statements","","",0,N],[3,"SingleImport","","",N,N],[12,"module","","",1,N],[12,"symbol","","",1,N],[12,"alias","","",1,N],[3,"Located","","",N,N],[12,"location","","",2,N],[12,"node","","",2,N],[3,"WithItem","","",N,N],[12,"context_expr","","",3,N],[12,"optional_vars","","",3,N],[3,"Parameters","","",N,N],[12,"args","","",4,N],[12,"kwonlyargs","","",4,N],[12,"vararg","","",4,N],[12,"kwarg","","",4,N],[12,"defaults","","",4,N],[12,"kw_defaults","","",4,N],[3,"Parameter","","",N,N],[12,"arg","","",5,N],[12,"annotation","","",5,N],[3,"Comprehension","","",N,N],[12,"target","","",6,N],[12,"iter","","",6,N],[12,"ifs","","",6,N],[3,"Keyword","","",N,N],[12,"name","","",7,N],[12,"value","","",7,N],[3,"ExceptHandler","","",N,N],[12,"typ","","",8,N],[12,"name","","",8,N],[12,"body","","",8,N],[4,"Top","","",N,N],[13,"Program","","",9,N],[13,"Statement","","",9,N],[13,"Expression","","",9,N],[4,"Statement","","Abstract syntax tree nodes for python statements.",N,N],[13,"Break","","",10,N],[13,"Continue","","",10,N],[13,"Return","","",10,N],[12,"value","rustpython_parser::ast::Statement","",10,N],[13,"Import","rustpython_parser::ast","",10,N],[12,"import_parts","rustpython_parser::ast::Statement","",10,N],[13,"Pass","rustpython_parser::ast","",10,N],[13,"Assert","","",10,N],[12,"test","rustpython_parser::ast::Statement","",10,N],[12,"msg","","",10,N],[13,"Delete","rustpython_parser::ast","",10,N],[12,"targets","rustpython_parser::ast::Statement","",10,N],[13,"Assign","rustpython_parser::ast","",10,N],[12,"targets","rustpython_parser::ast::Statement","",10,N],[12,"value","","",10,N],[13,"AugAssign","rustpython_parser::ast","",10,N],[12,"target","rustpython_parser::ast::Statement","",10,N],[12,"op","","",10,N],[12,"value","","",10,N],[13,"Expression","rustpython_parser::ast","",10,N],[12,"expression","rustpython_parser::ast::Statement","",10,N],[13,"Global","rustpython_parser::ast","",10,N],[12,"names","rustpython_parser::ast::Statement","",10,N],[13,"Nonlocal","rustpython_parser::ast","",10,N],[12,"names","rustpython_parser::ast::Statement","",10,N],[13,"If","rustpython_parser::ast","",10,N],[12,"test","rustpython_parser::ast::Statement","",10,N],[12,"body","","",10,N],[12,"orelse","","",10,N],[13,"While","rustpython_parser::ast","",10,N],[12,"test","rustpython_parser::ast::Statement","",10,N],[12,"body","","",10,N],[12,"orelse","","",10,N],[13,"With","rustpython_parser::ast","",10,N],[12,"items","rustpython_parser::ast::Statement","",10,N],[12,"body","","",10,N],[13,"For","rustpython_parser::ast","",10,N],[12,"target","rustpython_parser::ast::Statement","",10,N],[12,"iter","","",10,N],[12,"body","","",10,N],[12,"orelse","","",10,N],[13,"Raise","rustpython_parser::ast","",10,N],[12,"exception","rustpython_parser::ast::Statement","",10,N],[12,"cause","","",10,N],[13,"Try","rustpython_parser::ast","",10,N],[12,"body","rustpython_parser::ast::Statement","",10,N],[12,"handlers","","",10,N],[12,"orelse","","",10,N],[12,"finalbody","","",10,N],[13,"ClassDef","rustpython_parser::ast","",10,N],[12,"name","rustpython_parser::ast::Statement","",10,N],[12,"body","","",10,N],[12,"bases","","",10,N],[12,"keywords","","",10,N],[12,"decorator_list","","",10,N],[13,"FunctionDef","rustpython_parser::ast","",10,N],[12,"name","rustpython_parser::ast::Statement","",10,N],[12,"args","","",10,N],[12,"body","","",10,N],[12,"decorator_list","","",10,N],[12,"returns","","",10,N],[4,"Expression","rustpython_parser::ast","",N,N],[13,"BoolOp","","",11,N],[12,"a","rustpython_parser::ast::Expression","",11,N],[12,"op","","",11,N],[12,"b","","",11,N],[13,"Binop","rustpython_parser::ast","",11,N],[12,"a","rustpython_parser::ast::Expression","",11,N],[12,"op","","",11,N],[12,"b","","",11,N],[13,"Subscript","rustpython_parser::ast","",11,N],[12,"a","rustpython_parser::ast::Expression","",11,N],[12,"b","","",11,N],[13,"Unop","rustpython_parser::ast","",11,N],[12,"op","rustpython_parser::ast::Expression","",11,N],[12,"a","","",11,N],[13,"Yield","rustpython_parser::ast","",11,N],[12,"value","rustpython_parser::ast::Expression","",11,N],[13,"YieldFrom","rustpython_parser::ast","",11,N],[12,"value","rustpython_parser::ast::Expression","",11,N],[13,"Compare","rustpython_parser::ast","",11,N],[12,"a","rustpython_parser::ast::Expression","",11,N],[12,"op","","",11,N],[12,"b","","",11,N],[13,"Attribute","rustpython_parser::ast","",11,N],[12,"value","rustpython_parser::ast::Expression","",11,N],[12,"name","","",11,N],[13,"Call","rustpython_parser::ast","",11,N],[12,"function","rustpython_parser::ast::Expression","",11,N],[12,"args","","",11,N],[12,"keywords","","",11,N],[13,"Number","rustpython_parser::ast","",11,N],[12,"value","rustpython_parser::ast::Expression","",11,N],[13,"List","rustpython_parser::ast","",11,N],[12,"elements","rustpython_parser::ast::Expression","",11,N],[13,"Tuple","rustpython_parser::ast","",11,N],[12,"elements","rustpython_parser::ast::Expression","",11,N],[13,"Dict","rustpython_parser::ast","",11,N],[12,"elements","rustpython_parser::ast::Expression","",11,N],[13,"Set","rustpython_parser::ast","",11,N],[12,"elements","rustpython_parser::ast::Expression","",11,N],[13,"Comprehension","rustpython_parser::ast","",11,N],[12,"kind","rustpython_parser::ast::Expression","",11,N],[12,"generators","","",11,N],[13,"Starred","rustpython_parser::ast","",11,N],[12,"value","rustpython_parser::ast::Expression","",11,N],[13,"Slice","rustpython_parser::ast","",11,N],[12,"elements","rustpython_parser::ast::Expression","",11,N],[13,"String","rustpython_parser::ast","",11,N],[12,"value","rustpython_parser::ast::Expression","",11,N],[13,"Bytes","rustpython_parser::ast","",11,N],[12,"value","rustpython_parser::ast::Expression","",11,N],[13,"Identifier","rustpython_parser::ast","",11,N],[12,"name","rustpython_parser::ast::Expression","",11,N],[13,"Lambda","rustpython_parser::ast","",11,N],[12,"args","rustpython_parser::ast::Expression","",11,N],[12,"body","","",11,N],[13,"IfExpression","rustpython_parser::ast","",11,N],[12,"test","rustpython_parser::ast::Expression","",11,N],[12,"body","","",11,N],[12,"orelse","","",11,N],[13,"True","rustpython_parser::ast","",11,N],[13,"False","","",11,N],[13,"None","","",11,N],[13,"Ellipsis","","",11,N],[4,"ComprehensionKind","","",N,N],[13,"GeneratorExpression","","",12,N],[12,"element","rustpython_parser::ast::ComprehensionKind","",12,N],[13,"List","rustpython_parser::ast","",12,N],[12,"element","rustpython_parser::ast::ComprehensionKind","",12,N],[13,"Set","rustpython_parser::ast","",12,N],[12,"element","rustpython_parser::ast::ComprehensionKind","",12,N],[13,"Dict","rustpython_parser::ast","",12,N],[12,"key","rustpython_parser::ast::ComprehensionKind","",12,N],[12,"value","","",12,N],[4,"Operator","rustpython_parser::ast","",N,N],[13,"Add","","",13,N],[13,"Sub","","",13,N],[13,"Mult","","",13,N],[13,"MatMult","","",13,N],[13,"Div","","",13,N],[13,"Mod","","",13,N],[13,"Pow","","",13,N],[13,"LShift","","",13,N],[13,"RShift","","",13,N],[13,"BitOr","","",13,N],[13,"BitXor","","",13,N],[13,"BitAnd","","",13,N],[13,"FloorDiv","","",13,N],[4,"BooleanOperator","","",N,N],[13,"And","","",14,N],[13,"Or","","",14,N],[4,"UnaryOperator","","",N,N],[13,"Pos","","",15,N],[13,"Neg","","",15,N],[13,"Not","","",15,N],[13,"Inv","","",15,N],[4,"Comparison","","",N,N],[13,"Equal","","",16,N],[13,"NotEqual","","",16,N],[13,"Less","","",16,N],[13,"LessOrEqual","","",16,N],[13,"Greater","","",16,N],[13,"GreaterOrEqual","","",16,N],[13,"In","","",16,N],[13,"NotIn","","",16,N],[13,"Is","","",16,N],[13,"IsNot","","",16,N],[4,"Number","","",N,N],[13,"Integer","","",17,N],[12,"value","rustpython_parser::ast::Number","",17,N],[13,"Float","rustpython_parser::ast","",17,N],[12,"value","rustpython_parser::ast::Number","",17,N],[13,"Complex","rustpython_parser::ast","",17,N],[12,"real","rustpython_parser::ast::Number","",17,N],[12,"imag","","",17,N],[4,"ConversionFlag","rustpython_parser::ast","Transforms a value prior to formatting it.",N,N],[13,"Str","","Converts by calling `str()`.",18,N],[13,"Ascii","","Converts by calling `ascii()`.",18,N],[13,"Repr","","Converts by calling `repr()`.",18,N],[4,"StringGroup","","",N,N],[13,"Constant","","",19,N],[12,"value","rustpython_parser::ast::StringGroup","",19,N],[13,"FormattedValue","rustpython_parser::ast","",19,N],[12,"value","rustpython_parser::ast::StringGroup","",19,N],[12,"conversion","","",19,N],[12,"spec","","",19,N],[13,"Joined","rustpython_parser::ast","",19,N],[12,"values","rustpython_parser::ast::StringGroup","",19,N],[4,"Varargs","rustpython_parser::ast","",N,N],[13,"None","","",20,N],[13,"Unnamed","","",20,N],[13,"Named","","",20,N],[6,"LocatedStatement","","",N,N],[11,"name","","Returns a short name for the node suitable for use in…",11,[[["self"]],["str"]]],[0,"error","rustpython_parser","Define internal parse error types The goal is to provide a…",N,N],[4,"ParseError","rustpython_parser::error","Represents an error during parsing",N,N],[13,"EOF","","Parser encountered an unexpected end of input",21,N],[13,"ExtraToken","","Parser encountered an extra token",21,N],[13,"InvalidToken","","Parser encountered an invalid token",21,N],[13,"UnrecognizedToken","","Parser encountered an unexpected token",21,N],[13,"Other","","Maps to `User` type from `lalrpop-util`",21,N],[0,"lexer","rustpython_parser","This module takes care of lexing python source text. This…",N,N],[3,"Lexer","rustpython_parser::lexer","",N,N],[3,"Location","","",N,N],[3,"NewlineHandler","","",N,N],[3,"LineContinationHandler","","",N,N],[4,"LexicalError","","",N,N],[13,"StringError","","",22,N],[13,"NestingError","","",22,N],[13,"UnrecognizedToken","","",22,N],[12,"tok","rustpython_parser::lexer::LexicalError","",22,N],[5,"get_keywords","rustpython_parser::lexer","",N,[[],["hashmap",["string","tok"]]]],[5,"make_tokenizer","","",N,N],[6,"Spanned","","",N,N],[11,"new","","",23,[[["usize"],["usize"]],["self"]]],[11,"get_row","","",23,[[["self"]],["usize"]]],[11,"get_column","","",23,[[["self"]],["usize"]]],[11,"new","","",24,[[["t"]],["self"]]],[11,"new","","",25,[[["t"]],["self"]]],[11,"new","","",26,[[["t"]],["self"]]],[0,"parser","rustpython_parser","",N,N],[5,"parse_program","rustpython_parser::parser","",N,[[["str"]],["result",["program","parseerror"]]]],[5,"parse_statement","","",N,[[["str"]],["result",["locatedstatement","parseerror"]]]],[5,"parse_expression","","Parses a python expression",N,[[["str"]],["result",["expression","parseerror"]]]],[0,"token","rustpython_parser","Different token definitions. Loosely based on token.h from…",N,N],[4,"Tok","rustpython_parser::token","Python source code can be tokenized in a sequence of these…",N,N],[13,"Name","","",27,N],[12,"name","rustpython_parser::token::Tok","",27,N],[13,"Int","rustpython_parser::token","",27,N],[12,"value","rustpython_parser::token::Tok","",27,N],[13,"Float","rustpython_parser::token","",27,N],[12,"value","rustpython_parser::token::Tok","",27,N],[13,"Complex","rustpython_parser::token","",27,N],[12,"real","rustpython_parser::token::Tok","",27,N],[12,"imag","","",27,N],[13,"String","rustpython_parser::token","",27,N],[12,"value","rustpython_parser::token::Tok","",27,N],[12,"is_fstring","","",27,N],[13,"Bytes","rustpython_parser::token","",27,N],[12,"value","rustpython_parser::token::Tok","",27,N],[13,"Newline","rustpython_parser::token","",27,N],[13,"Indent","","",27,N],[13,"Dedent","","",27,N],[13,"StartProgram","","",27,N],[13,"StartStatement","","",27,N],[13,"StartExpression","","",27,N],[13,"Lpar","","",27,N],[13,"Rpar","","",27,N],[13,"Lsqb","","",27,N],[13,"Rsqb","","",27,N],[13,"Colon","","",27,N],[13,"Comma","","",27,N],[13,"Semi","","",27,N],[13,"Plus","","",27,N],[13,"Minus","","",27,N],[13,"Star","","",27,N],[13,"Slash","","",27,N],[13,"Vbar","","",27,N],[13,"Amper","","",27,N],[13,"Less","","",27,N],[13,"Greater","","",27,N],[13,"Equal","","",27,N],[13,"Dot","","",27,N],[13,"Percent","","",27,N],[13,"Lbrace","","",27,N],[13,"Rbrace","","",27,N],[13,"EqEqual","","",27,N],[13,"NotEqual","","",27,N],[13,"LessEqual","","",27,N],[13,"GreaterEqual","","",27,N],[13,"Tilde","","",27,N],[13,"CircumFlex","","",27,N],[13,"LeftShift","","",27,N],[13,"RightShift","","",27,N],[13,"DoubleStar","","",27,N],[13,"DoubleStarEqual","","",27,N],[13,"PlusEqual","","",27,N],[13,"MinusEqual","","",27,N],[13,"StarEqual","","",27,N],[13,"SlashEqual","","",27,N],[13,"PercentEqual","","",27,N],[13,"AmperEqual","","",27,N],[13,"VbarEqual","","",27,N],[13,"CircumflexEqual","","",27,N],[13,"LeftShiftEqual","","",27,N],[13,"RightShiftEqual","","",27,N],[13,"DoubleSlash","","",27,N],[13,"DoubleSlashEqual","","",27,N],[13,"At","","",27,N],[13,"AtEqual","","",27,N],[13,"Rarrow","","",27,N],[13,"Ellipsis","","",27,N],[13,"False","","",27,N],[13,"None","","",27,N],[13,"True","","",27,N],[13,"And","","",27,N],[13,"As","","",27,N],[13,"Assert","","",27,N],[13,"Break","","",27,N],[13,"Class","","",27,N],[13,"Continue","","",27,N],[13,"Def","","",27,N],[13,"Del","","",27,N],[13,"Elif","","",27,N],[13,"Else","","",27,N],[13,"Except","","",27,N],[13,"Finally","","",27,N],[13,"For","","",27,N],[13,"From","","",27,N],[13,"Global","","",27,N],[13,"If","","",27,N],[13,"Import","","",27,N],[13,"In","","",27,N],[13,"Is","","",27,N],[13,"Lambda","","",27,N],[13,"Nonlocal","","",27,N],[13,"Not","","",27,N],[13,"Or","","",27,N],[13,"Pass","","",27,N],[13,"Raise","","",27,N],[13,"Return","","",27,N],[13,"Try","","",27,N],[13,"While","","",27,N],[13,"With","","",27,N],[13,"Yield","","",27,N],[11,"from","rustpython_parser::ast","",0,[[["t"]],["t"]]],[11,"into","","",0,[[["self"]],["u"]]],[11,"try_from","","",0,[[["u"]],["result"]]],[11,"borrow","","",0,[[["self"]],["t"]]],[11,"borrow_mut","","",0,[[["self"]],["t"]]],[11,"try_into","","",0,[[["self"]],["result"]]],[11,"get_type_id","","",0,[[["self"]],["typeid"]]],[11,"from","","",1,[[["t"]],["t"]]],[11,"into","","",1,[[["self"]],["u"]]],[11,"try_from","","",1,[[["u"]],["result"]]],[11,"borrow","","",1,[[["self"]],["t"]]],[11,"borrow_mut","","",1,[[["self"]],["t"]]],[11,"try_into","","",1,[[["self"]],["result"]]],[11,"get_type_id","","",1,[[["self"]],["typeid"]]],[11,"from","","",2,[[["t"]],["t"]]],[11,"into","","",2,[[["self"]],["u"]]],[11,"try_from","","",2,[[["u"]],["result"]]],[11,"borrow","","",2,[[["self"]],["t"]]],[11,"borrow_mut","","",2,[[["self"]],["t"]]],[11,"try_into","","",2,[[["self"]],["result"]]],[11,"get_type_id","","",2,[[["self"]],["typeid"]]],[11,"from","","",3,[[["t"]],["t"]]],[11,"into","","",3,[[["self"]],["u"]]],[11,"try_from","","",3,[[["u"]],["result"]]],[11,"borrow","","",3,[[["self"]],["t"]]],[11,"borrow_mut","","",3,[[["self"]],["t"]]],[11,"try_into","","",3,[[["self"]],["result"]]],[11,"get_type_id","","",3,[[["self"]],["typeid"]]],[11,"from","","",4,[[["t"]],["t"]]],[11,"into","","",4,[[["self"]],["u"]]],[11,"try_from","","",4,[[["u"]],["result"]]],[11,"borrow","","",4,[[["self"]],["t"]]],[11,"borrow_mut","","",4,[[["self"]],["t"]]],[11,"try_into","","",4,[[["self"]],["result"]]],[11,"get_type_id","","",4,[[["self"]],["typeid"]]],[11,"from","","",5,[[["t"]],["t"]]],[11,"into","","",5,[[["self"]],["u"]]],[11,"try_from","","",5,[[["u"]],["result"]]],[11,"borrow","","",5,[[["self"]],["t"]]],[11,"borrow_mut","","",5,[[["self"]],["t"]]],[11,"try_into","","",5,[[["self"]],["result"]]],[11,"get_type_id","","",5,[[["self"]],["typeid"]]],[11,"from","","",6,[[["t"]],["t"]]],[11,"into","","",6,[[["self"]],["u"]]],[11,"try_from","","",6,[[["u"]],["result"]]],[11,"borrow","","",6,[[["self"]],["t"]]],[11,"borrow_mut","","",6,[[["self"]],["t"]]],[11,"try_into","","",6,[[["self"]],["result"]]],[11,"get_type_id","","",6,[[["self"]],["typeid"]]],[11,"from","","",7,[[["t"]],["t"]]],[11,"into","","",7,[[["self"]],["u"]]],[11,"try_from","","",7,[[["u"]],["result"]]],[11,"borrow","","",7,[[["self"]],["t"]]],[11,"borrow_mut","","",7,[[["self"]],["t"]]],[11,"try_into","","",7,[[["self"]],["result"]]],[11,"get_type_id","","",7,[[["self"]],["typeid"]]],[11,"from","","",8,[[["t"]],["t"]]],[11,"into","","",8,[[["self"]],["u"]]],[11,"try_from","","",8,[[["u"]],["result"]]],[11,"borrow","","",8,[[["self"]],["t"]]],[11,"borrow_mut","","",8,[[["self"]],["t"]]],[11,"try_into","","",8,[[["self"]],["result"]]],[11,"get_type_id","","",8,[[["self"]],["typeid"]]],[11,"from","","",9,[[["t"]],["t"]]],[11,"into","","",9,[[["self"]],["u"]]],[11,"try_from","","",9,[[["u"]],["result"]]],[11,"borrow","","",9,[[["self"]],["t"]]],[11,"borrow_mut","","",9,[[["self"]],["t"]]],[11,"try_into","","",9,[[["self"]],["result"]]],[11,"get_type_id","","",9,[[["self"]],["typeid"]]],[11,"from","","",10,[[["t"]],["t"]]],[11,"into","","",10,[[["self"]],["u"]]],[11,"try_from","","",10,[[["u"]],["result"]]],[11,"borrow","","",10,[[["self"]],["t"]]],[11,"borrow_mut","","",10,[[["self"]],["t"]]],[11,"try_into","","",10,[[["self"]],["result"]]],[11,"get_type_id","","",10,[[["self"]],["typeid"]]],[11,"from","","",11,[[["t"]],["t"]]],[11,"into","","",11,[[["self"]],["u"]]],[11,"try_from","","",11,[[["u"]],["result"]]],[11,"borrow","","",11,[[["self"]],["t"]]],[11,"borrow_mut","","",11,[[["self"]],["t"]]],[11,"try_into","","",11,[[["self"]],["result"]]],[11,"get_type_id","","",11,[[["self"]],["typeid"]]],[11,"from","","",12,[[["t"]],["t"]]],[11,"into","","",12,[[["self"]],["u"]]],[11,"try_from","","",12,[[["u"]],["result"]]],[11,"borrow","","",12,[[["self"]],["t"]]],[11,"borrow_mut","","",12,[[["self"]],["t"]]],[11,"try_into","","",12,[[["self"]],["result"]]],[11,"get_type_id","","",12,[[["self"]],["typeid"]]],[11,"from","","",13,[[["t"]],["t"]]],[11,"into","","",13,[[["self"]],["u"]]],[11,"try_from","","",13,[[["u"]],["result"]]],[11,"borrow","","",13,[[["self"]],["t"]]],[11,"borrow_mut","","",13,[[["self"]],["t"]]],[11,"try_into","","",13,[[["self"]],["result"]]],[11,"get_type_id","","",13,[[["self"]],["typeid"]]],[11,"from","","",14,[[["t"]],["t"]]],[11,"into","","",14,[[["self"]],["u"]]],[11,"try_from","","",14,[[["u"]],["result"]]],[11,"borrow","","",14,[[["self"]],["t"]]],[11,"borrow_mut","","",14,[[["self"]],["t"]]],[11,"try_into","","",14,[[["self"]],["result"]]],[11,"get_type_id","","",14,[[["self"]],["typeid"]]],[11,"from","","",15,[[["t"]],["t"]]],[11,"into","","",15,[[["self"]],["u"]]],[11,"try_from","","",15,[[["u"]],["result"]]],[11,"borrow","","",15,[[["self"]],["t"]]],[11,"borrow_mut","","",15,[[["self"]],["t"]]],[11,"try_into","","",15,[[["self"]],["result"]]],[11,"get_type_id","","",15,[[["self"]],["typeid"]]],[11,"from","","",16,[[["t"]],["t"]]],[11,"into","","",16,[[["self"]],["u"]]],[11,"try_from","","",16,[[["u"]],["result"]]],[11,"borrow","","",16,[[["self"]],["t"]]],[11,"borrow_mut","","",16,[[["self"]],["t"]]],[11,"try_into","","",16,[[["self"]],["result"]]],[11,"get_type_id","","",16,[[["self"]],["typeid"]]],[11,"from","","",17,[[["t"]],["t"]]],[11,"into","","",17,[[["self"]],["u"]]],[11,"try_from","","",17,[[["u"]],["result"]]],[11,"borrow","","",17,[[["self"]],["t"]]],[11,"borrow_mut","","",17,[[["self"]],["t"]]],[11,"try_into","","",17,[[["self"]],["result"]]],[11,"get_type_id","","",17,[[["self"]],["typeid"]]],[11,"from","","",18,[[["t"]],["t"]]],[11,"into","","",18,[[["self"]],["u"]]],[11,"to_owned","","",18,[[["self"]],["t"]]],[11,"clone_into","","",18,N],[11,"try_from","","",18,[[["u"]],["result"]]],[11,"borrow","","",18,[[["self"]],["t"]]],[11,"borrow_mut","","",18,[[["self"]],["t"]]],[11,"try_into","","",18,[[["self"]],["result"]]],[11,"get_type_id","","",18,[[["self"]],["typeid"]]],[11,"from","","",19,[[["t"]],["t"]]],[11,"into","","",19,[[["self"]],["u"]]],[11,"try_from","","",19,[[["u"]],["result"]]],[11,"borrow","","",19,[[["self"]],["t"]]],[11,"borrow_mut","","",19,[[["self"]],["t"]]],[11,"try_into","","",19,[[["self"]],["result"]]],[11,"get_type_id","","",19,[[["self"]],["typeid"]]],[11,"from","","",20,[[["t"]],["t"]]],[11,"into","","",20,[[["self"]],["u"]]],[11,"try_from","","",20,[[["u"]],["result"]]],[11,"borrow","","",20,[[["self"]],["t"]]],[11,"borrow_mut","","",20,[[["self"]],["t"]]],[11,"try_into","","",20,[[["self"]],["result"]]],[11,"get_type_id","","",20,[[["self"]],["typeid"]]],[11,"to_string","rustpython_parser::error","",21,[[["self"]],["string"]]],[11,"from","","",21,[[["t"]],["t"]]],[11,"into","","",21,[[["self"]],["u"]]],[11,"try_from","","",21,[[["u"]],["result"]]],[11,"borrow","","",21,[[["self"]],["t"]]],[11,"borrow_mut","","",21,[[["self"]],["t"]]],[11,"try_into","","",21,[[["self"]],["result"]]],[11,"get_type_id","","",21,[[["self"]],["typeid"]]],[11,"into_iter","rustpython_parser::lexer","",26,[[["self"]],["i"]]],[11,"from","","",26,[[["t"]],["t"]]],[11,"into","","",26,[[["self"]],["u"]]],[11,"try_from","","",26,[[["u"]],["result"]]],[11,"borrow","","",26,[[["self"]],["t"]]],[11,"borrow_mut","","",26,[[["self"]],["t"]]],[11,"try_into","","",26,[[["self"]],["result"]]],[11,"get_type_id","","",26,[[["self"]],["typeid"]]],[11,"from","","",23,[[["t"]],["t"]]],[11,"into","","",23,[[["self"]],["u"]]],[11,"to_owned","","",23,[[["self"]],["t"]]],[11,"clone_into","","",23,N],[11,"try_from","","",23,[[["u"]],["result"]]],[11,"borrow","","",23,[[["self"]],["t"]]],[11,"borrow_mut","","",23,[[["self"]],["t"]]],[11,"try_into","","",23,[[["self"]],["result"]]],[11,"get_type_id","","",23,[[["self"]],["typeid"]]],[11,"into_iter","","",24,[[["self"]],["i"]]],[11,"from","","",24,[[["t"]],["t"]]],[11,"into","","",24,[[["self"]],["u"]]],[11,"try_from","","",24,[[["u"]],["result"]]],[11,"borrow","","",24,[[["self"]],["t"]]],[11,"borrow_mut","","",24,[[["self"]],["t"]]],[11,"try_into","","",24,[[["self"]],["result"]]],[11,"get_type_id","","",24,[[["self"]],["typeid"]]],[11,"into_iter","","",25,[[["self"]],["i"]]],[11,"from","","",25,[[["t"]],["t"]]],[11,"into","","",25,[[["self"]],["u"]]],[11,"try_from","","",25,[[["u"]],["result"]]],[11,"borrow","","",25,[[["self"]],["t"]]],[11,"borrow_mut","","",25,[[["self"]],["t"]]],[11,"try_into","","",25,[[["self"]],["result"]]],[11,"get_type_id","","",25,[[["self"]],["typeid"]]],[11,"from","","",22,[[["t"]],["t"]]],[11,"into","","",22,[[["self"]],["u"]]],[11,"try_from","","",22,[[["u"]],["result"]]],[11,"borrow","","",22,[[["self"]],["t"]]],[11,"borrow_mut","","",22,[[["self"]],["t"]]],[11,"try_into","","",22,[[["self"]],["result"]]],[11,"get_type_id","","",22,[[["self"]],["typeid"]]],[11,"from","rustpython_parser::token","",27,[[["t"]],["t"]]],[11,"into","","",27,[[["self"]],["u"]]],[11,"try_from","","",27,[[["u"]],["result"]]],[11,"borrow","","",27,[[["self"]],["t"]]],[11,"borrow_mut","","",27,[[["self"]],["t"]]],[11,"try_into","","",27,[[["self"]],["result"]]],[11,"get_type_id","","",27,[[["self"]],["typeid"]]],[11,"next","rustpython_parser::lexer","",24,[[["self"]],["option"]]],[11,"next","","",25,[[["self"]],["option"]]],[11,"next","","",26,[[["self"]],["option"]]],[11,"eq","rustpython_parser::ast","",9,[[["self"],["top"]],["bool"]]],[11,"ne","","",9,[[["self"],["top"]],["bool"]]],[11,"eq","","",0,[[["self"],["program"]],["bool"]]],[11,"ne","","",0,[[["self"],["program"]],["bool"]]],[11,"eq","","",1,[[["self"],["singleimport"]],["bool"]]],[11,"ne","","",1,[[["self"],["singleimport"]],["bool"]]],[11,"eq","","",2,[[["self"],["located"]],["bool"]]],[11,"ne","","",2,[[["self"],["located"]],["bool"]]],[11,"eq","","",10,[[["self"],["statement"]],["bool"]]],[11,"ne","","",10,[[["self"],["statement"]],["bool"]]],[11,"eq","","",3,[[["self"],["withitem"]],["bool"]]],[11,"ne","","",3,[[["self"],["withitem"]],["bool"]]],[11,"eq","","",11,[[["self"],["expression"]],["bool"]]],[11,"ne","","",11,[[["self"],["expression"]],["bool"]]],[11,"eq","","",4,[[["self"],["parameters"]],["bool"]]],[11,"ne","","",4,[[["self"],["parameters"]],["bool"]]],[11,"eq","","",5,[[["self"],["parameter"]],["bool"]]],[11,"ne","","",5,[[["self"],["parameter"]],["bool"]]],[11,"eq","","",12,[[["self"],["comprehensionkind"]],["bool"]]],[11,"ne","","",12,[[["self"],["comprehensionkind"]],["bool"]]],[11,"eq","","",6,[[["self"],["comprehension"]],["bool"]]],[11,"ne","","",6,[[["self"],["comprehension"]],["bool"]]],[11,"eq","","",7,[[["self"],["keyword"]],["bool"]]],[11,"ne","","",7,[[["self"],["keyword"]],["bool"]]],[11,"eq","","",8,[[["self"],["excepthandler"]],["bool"]]],[11,"ne","","",8,[[["self"],["excepthandler"]],["bool"]]],[11,"eq","","",13,[[["self"],["operator"]],["bool"]]],[11,"eq","","",14,[[["self"],["booleanoperator"]],["bool"]]],[11,"eq","","",15,[[["self"],["unaryoperator"]],["bool"]]],[11,"eq","","",16,[[["self"],["comparison"]],["bool"]]],[11,"eq","","",17,[[["self"],["number"]],["bool"]]],[11,"ne","","",17,[[["self"],["number"]],["bool"]]],[11,"eq","","",18,[[["self"],["conversionflag"]],["bool"]]],[11,"eq","","",19,[[["self"],["stringgroup"]],["bool"]]],[11,"ne","","",19,[[["self"],["stringgroup"]],["bool"]]],[11,"eq","","",20,[[["self"],["varargs"]],["bool"]]],[11,"ne","","",20,[[["self"],["varargs"]],["bool"]]],[11,"eq","rustpython_parser::error","",21,[[["self"],["parseerror"]],["bool"]]],[11,"ne","","",21,[[["self"],["parseerror"]],["bool"]]],[11,"eq","rustpython_parser::lexer","",23,[[["self"],["location"]],["bool"]]],[11,"ne","","",23,[[["self"],["location"]],["bool"]]],[11,"eq","rustpython_parser::token","",27,[[["self"],["tok"]],["bool"]]],[11,"ne","","",27,[[["self"],["tok"]],["bool"]]],[11,"default","rustpython_parser::ast","",4,[[],["parameters"]]],[11,"default","","",5,[[],["parameter"]]],[11,"default","","",20,[[],["varargs"]]],[11,"default","rustpython_parser::lexer","",23,[[],["location"]]],[11,"clone","rustpython_parser::ast","",18,[[["self"]],["conversionflag"]]],[11,"clone","rustpython_parser::lexer","",23,[[["self"]],["location"]]],[11,"from","rustpython_parser::ast","",20,[[["option",["option"]]],["varargs"]]],[11,"from","rustpython_parser::error","",21,[[["innererror",["location","tok","lexicalerror"]]],["self"]]],[11,"fmt","rustpython_parser::ast","",9,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",0,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",1,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",2,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",10,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",3,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",11,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",4,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",5,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",12,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",6,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",7,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",8,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",13,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",14,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",15,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",16,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",17,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",18,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",19,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",20,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_parser::error","",21,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_parser::lexer","",22,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",23,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_parser::token","",27,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_parser::error","",21,[[["self"],["formatter"]],["result"]]],[11,"source","","",21,[[["self"]],["option",["error"]]]]],"paths":[[3,"Program"],[3,"SingleImport"],[3,"Located"],[3,"WithItem"],[3,"Parameters"],[3,"Parameter"],[3,"Comprehension"],[3,"Keyword"],[3,"ExceptHandler"],[4,"Top"],[4,"Statement"],[4,"Expression"],[4,"ComprehensionKind"],[4,"Operator"],[4,"BooleanOperator"],[4,"UnaryOperator"],[4,"Comparison"],[4,"Number"],[4,"ConversionFlag"],[4,"StringGroup"],[4,"Varargs"],[4,"ParseError"],[4,"LexicalError"],[3,"Location"],[3,"NewlineHandler"],[3,"LineContinationHandler"],[3,"Lexer"],[4,"Tok"]]}; +searchIndex["rustpython_vm"]={"doc":"This crate contains most python logic.","items":[[3,"VirtualMachine","rustpython_vm","Top level container of a python virtual machine. In theory…",N,N],[12,"builtins","","",0,N],[12,"sys_module","","",0,N],[12,"stdlib_inits","","",0,N],[12,"ctx","","",0,N],[12,"frames","","",0,N],[12,"wasm_id","","",0,N],[5,"print_exception","","",N,[[["virtualmachine"],["pyobjectref"]]]],[0,"macros","","",N,N],[0,"bytecode","","Implement python as a virtual machine with bytecodes. This…",N,N],[3,"CodeObject","rustpython_vm::bytecode","Primary container of a single code object. Each python…",N,N],[12,"instructions","","",1,N],[12,"label_map","","",1,N],[12,"locations","","",1,N],[12,"arg_names","","",1,N],[12,"varargs","","",1,N],[12,"kwonlyarg_names","","",1,N],[12,"varkeywords","","",1,N],[12,"source_path","","",1,N],[12,"first_line_number","","",1,N],[12,"obj_name","","",1,N],[12,"is_generator","","",1,N],[3,"FunctionOpArg","","",N,N],[4,"Instruction","","A Single bytecode instruction.",N,N],[13,"Import","","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[12,"symbol","","",2,N],[13,"ImportStar","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"LoadName","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"StoreName","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"DeleteName","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"StoreSubscript","rustpython_vm::bytecode","",2,N],[13,"DeleteSubscript","","",2,N],[13,"StoreAttr","","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"DeleteAttr","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"LoadConst","rustpython_vm::bytecode","",2,N],[12,"value","rustpython_vm::bytecode::Instruction","",2,N],[13,"UnaryOperation","rustpython_vm::bytecode","",2,N],[12,"op","rustpython_vm::bytecode::Instruction","",2,N],[13,"BinaryOperation","rustpython_vm::bytecode","",2,N],[12,"op","rustpython_vm::bytecode::Instruction","",2,N],[12,"inplace","","",2,N],[13,"LoadAttr","rustpython_vm::bytecode","",2,N],[12,"name","rustpython_vm::bytecode::Instruction","",2,N],[13,"CompareOperation","rustpython_vm::bytecode","",2,N],[12,"op","rustpython_vm::bytecode::Instruction","",2,N],[13,"Pop","rustpython_vm::bytecode","",2,N],[13,"Rotate","","",2,N],[12,"amount","rustpython_vm::bytecode::Instruction","",2,N],[13,"Duplicate","rustpython_vm::bytecode","",2,N],[13,"GetIter","","",2,N],[13,"Pass","","",2,N],[13,"Continue","","",2,N],[13,"Break","","",2,N],[13,"Jump","","",2,N],[12,"target","rustpython_vm::bytecode::Instruction","",2,N],[13,"JumpIf","rustpython_vm::bytecode","",2,N],[12,"target","rustpython_vm::bytecode::Instruction","",2,N],[13,"JumpIfFalse","rustpython_vm::bytecode","",2,N],[12,"target","rustpython_vm::bytecode::Instruction","",2,N],[13,"MakeFunction","rustpython_vm::bytecode","",2,N],[12,"flags","rustpython_vm::bytecode::Instruction","",2,N],[13,"CallFunction","rustpython_vm::bytecode","",2,N],[12,"typ","rustpython_vm::bytecode::Instruction","",2,N],[13,"ForIter","rustpython_vm::bytecode","",2,N],[12,"target","rustpython_vm::bytecode::Instruction","",2,N],[13,"ReturnValue","rustpython_vm::bytecode","",2,N],[13,"YieldValue","","",2,N],[13,"YieldFrom","","",2,N],[13,"SetupLoop","","",2,N],[12,"start","rustpython_vm::bytecode::Instruction","",2,N],[12,"end","","",2,N],[13,"SetupExcept","rustpython_vm::bytecode","",2,N],[12,"handler","rustpython_vm::bytecode::Instruction","",2,N],[13,"SetupWith","rustpython_vm::bytecode","",2,N],[12,"end","rustpython_vm::bytecode::Instruction","",2,N],[13,"CleanupWith","rustpython_vm::bytecode","",2,N],[12,"end","rustpython_vm::bytecode::Instruction","",2,N],[13,"PopBlock","rustpython_vm::bytecode","",2,N],[13,"Raise","","",2,N],[12,"argc","rustpython_vm::bytecode::Instruction","",2,N],[13,"BuildString","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[13,"BuildTuple","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[12,"unpack","","",2,N],[13,"BuildList","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[12,"unpack","","",2,N],[13,"BuildSet","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[12,"unpack","","",2,N],[13,"BuildMap","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[12,"unpack","","",2,N],[13,"BuildSlice","rustpython_vm::bytecode","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[13,"ListAppend","rustpython_vm::bytecode","",2,N],[12,"i","rustpython_vm::bytecode::Instruction","",2,N],[13,"SetAdd","rustpython_vm::bytecode","",2,N],[12,"i","rustpython_vm::bytecode::Instruction","",2,N],[13,"MapAdd","rustpython_vm::bytecode","",2,N],[12,"i","rustpython_vm::bytecode::Instruction","",2,N],[13,"PrintExpr","rustpython_vm::bytecode","",2,N],[13,"LoadBuildClass","","",2,N],[13,"UnpackSequence","","",2,N],[12,"size","rustpython_vm::bytecode::Instruction","",2,N],[13,"UnpackEx","rustpython_vm::bytecode","",2,N],[12,"before","rustpython_vm::bytecode::Instruction","",2,N],[12,"after","","",2,N],[13,"Unpack","rustpython_vm::bytecode","",2,N],[13,"FormatValue","","",2,N],[12,"conversion","rustpython_vm::bytecode::Instruction","",2,N],[12,"spec","","",2,N],[4,"CallType","rustpython_vm::bytecode","",N,N],[13,"Positional","","",3,N],[13,"Keyword","","",3,N],[13,"Ex","","",3,N],[4,"Constant","","",N,N],[13,"Integer","","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"Float","rustpython_vm::bytecode","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"Complex","rustpython_vm::bytecode","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"Boolean","rustpython_vm::bytecode","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"String","rustpython_vm::bytecode","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"Bytes","rustpython_vm::bytecode","",4,N],[12,"value","rustpython_vm::bytecode::Constant","",4,N],[13,"Code","rustpython_vm::bytecode","",4,N],[12,"code","rustpython_vm::bytecode::Constant","",4,N],[13,"Tuple","rustpython_vm::bytecode","",4,N],[12,"elements","rustpython_vm::bytecode::Constant","",4,N],[13,"None","rustpython_vm::bytecode","",4,N],[13,"Ellipsis","","",4,N],[4,"ComparisonOperator","","",N,N],[13,"Greater","","",5,N],[13,"GreaterOrEqual","","",5,N],[13,"Less","","",5,N],[13,"LessOrEqual","","",5,N],[13,"Equal","","",5,N],[13,"NotEqual","","",5,N],[13,"In","","",5,N],[13,"NotIn","","",5,N],[13,"Is","","",5,N],[13,"IsNot","","",5,N],[4,"BinaryOperator","","",N,N],[13,"Power","","",6,N],[13,"Multiply","","",6,N],[13,"MatrixMultiply","","",6,N],[13,"Divide","","",6,N],[13,"FloorDivide","","",6,N],[13,"Modulo","","",6,N],[13,"Add","","",6,N],[13,"Subtract","","",6,N],[13,"Subscript","","",6,N],[13,"Lshift","","",6,N],[13,"Rshift","","",6,N],[13,"And","","",6,N],[13,"Xor","","",6,N],[13,"Or","","",6,N],[4,"UnaryOperator","","",N,N],[13,"Not","","",7,N],[13,"Invert","","",7,N],[13,"Minus","","",7,N],[13,"Plus","","",7,N],[4,"Varargs","","",N,N],[13,"None","","",8,N],[13,"Unnamed","","",8,N],[13,"Named","","",8,N],[6,"Label","","",N,N],[18,"HAS_DEFAULTS","","",9,N],[18,"HAS_ANNOTATIONS","","",9,N],[11,"empty","","Returns an empty set of flags.",9,[[],["functionoparg"]]],[11,"all","","Returns the set containing all flags.",9,[[],["functionoparg"]]],[11,"bits","","Returns the raw value of the flags currently stored.",9,[[["self"]],["u8"]]],[11,"from_bits","","Convert from underlying bit representation, unless that…",9,[[["u8"]],["option",["functionoparg"]]]],[11,"from_bits_truncate","","Convert from underlying bit representation, dropping any…",9,[[["u8"]],["functionoparg"]]],[11,"is_empty","","Returns `true` if no flags are currently stored.",9,[[["self"]],["bool"]]],[11,"is_all","","Returns `true` if all flags are currently set.",9,[[["self"]],["bool"]]],[11,"intersects","","Returns `true` if there are flags common to both `self`…",9,[[["self"],["functionoparg"]],["bool"]]],[11,"contains","","Returns `true` all of the flags in `other` are contained…",9,[[["self"],["functionoparg"]],["bool"]]],[11,"insert","","Inserts the specified flags in-place.",9,[[["self"],["functionoparg"]]]],[11,"remove","","Removes the specified flags in-place.",9,[[["self"],["functionoparg"]]]],[11,"toggle","","Toggles the specified flags in-place.",9,[[["self"],["functionoparg"]]]],[11,"set","","Inserts or removes the specified flags depending on the…",9,[[["self"],["functionoparg"],["bool"]]]],[11,"new","","",1,[[["vec",["string"]],["varargs"],["vec",["string"]],["varargs"],["string"],["usize"],["string"]],["codeobject"]]],[11,"get_constants","","",1,N],[0,"compile","rustpython_vm","Take an AST and transform it into bytecode",N,N],[4,"Mode","rustpython_vm::compile","",N,N],[13,"Exec","","",10,N],[13,"Eval","","",10,N],[13,"Single","","",10,N],[5,"compile","","Compile a given sourcecode into a bytecode object.",N,[[["str"],["mode"],["string"],["pyobjectref"]],["result",["pyobjectref","compileerror"]]]],[0,"error","rustpython_vm","",N,N],[4,"CompileError","rustpython_vm::error","",N,N],[13,"Assign","","Invalid assignment, cannot store value in target.",11,N],[13,"Delete","","Invalid delete",11,N],[13,"ExpectExpr","","Expected an expression got a statement",11,N],[13,"Parse","","Parser error",11,N],[13,"StarArgs","","Multiple `*` detected",11,N],[13,"InvalidBreak","","Break statement outside of loop.",11,N],[13,"InvalidContinue","","Continue statement outside of loop.",11,N],[13,"InvalidReturn","","",11,N],[13,"InvalidYield","","",11,N],[0,"eval","rustpython_vm","",N,N],[5,"eval","rustpython_vm::eval","",N,[[["virtualmachine"],["str"],["scope"],["str"]],["pyresult"]]],[0,"format","rustpython_vm","",N,N],[3,"FormatSpec","rustpython_vm::format","",N,N],[3,"FormatString","","",N,N],[12,"format_parts","","",12,N],[4,"FormatAlign","","",N,N],[13,"Left","","",13,N],[13,"Right","","",13,N],[13,"AfterSign","","",13,N],[13,"Center","","",13,N],[4,"FormatSign","","",N,N],[13,"Plus","","",14,N],[13,"Minus","","",14,N],[13,"MinusOrSpace","","",14,N],[4,"FormatGrouping","","",N,N],[13,"Comma","","",15,N],[13,"Underscore","","",15,N],[4,"FormatType","","",N,N],[13,"String","","",16,N],[13,"Binary","","",16,N],[13,"Character","","",16,N],[13,"Decimal","","",16,N],[13,"Octal","","",16,N],[13,"HexLower","","",16,N],[13,"HexUpper","","",16,N],[13,"Number","","",16,N],[13,"ExponentLower","","",16,N],[13,"ExponentUpper","","",16,N],[13,"GeneralFormatLower","","",16,N],[13,"GeneralFormatUpper","","",16,N],[13,"FixedPointLower","","",16,N],[13,"FixedPointUpper","","",16,N],[4,"FormatParseError","","",N,N],[13,"UnmatchedBracket","","",17,N],[13,"MissingStartBracket","","",17,N],[13,"UnescapedStartBracketInLiteral","","",17,N],[4,"FormatPart","","",N,N],[13,"AutoSpec","","",18,N],[13,"IndexSpec","","",18,N],[13,"KeywordSpec","","",18,N],[13,"Literal","","",18,N],[11,"parse","","",19,[[["str"]],["formatspec"]]],[11,"format_int","","",19,[[["self"],["bigint"]],["result",["string","str"]]]],[11,"is_auto","","",18,[[["self"]],["bool"]]],[11,"is_index","","",18,[[["self"]],["bool"]]],[0,"frame","rustpython_vm","",N,N],[3,"Scope","rustpython_vm::frame","",N,N],[12,"globals","","",20,N],[3,"Frame","","",N,N],[12,"code","","",21,N],[12,"scope","","",21,N],[12,"lasti","","",21,N],[4,"ExecutionResult","","",N,N],[13,"Return","","",22,N],[13,"Yield","","",22,N],[6,"FrameResult","","",N,N],[8,"NameProtocol","","",N,N],[10,"load_name","","",23,[[["self"],["virtualmachine"],["str"]],["option",["pyobjectref"]]]],[10,"store_name","","",23,[[["self"],["virtualmachine"],["str"],["pyobjectref"]]]],[10,"delete_name","","",23,[[["self"],["virtualmachine"],["str"]]]],[10,"load_cell","","",23,[[["self"],["virtualmachine"],["str"]],["option",["pyobjectref"]]]],[11,"new","","",20,[[["option",["pyobjectref"]],["pyobjectref"]],["scope"]]],[11,"get_locals","","",20,[[["self"]],["pyobjectref"]]],[11,"get_only_locals","","",20,[[["self"]],["option",["pyobjectref"]]]],[11,"child_scope_with_locals","","",20,[[["self"],["pyobjectref"]],["scope"]]],[11,"child_scope","","",20,[[["self"],["pycontext"]],["scope"]]],[11,"new","","",21,[[["pyobjectref"],["scope"]],["frame"]]],[11,"run","","",21,[[["self"],["virtualmachine"]],["result",["executionresult","pyobjectref"]]]],[11,"fetch_instruction","","",21,[[["self"]],["instruction"]]],[11,"get_lineno","","",21,[[["self"]],["location"]]],[11,"push_value","","",21,[[["self"],["pyobjectref"]]]],[0,"function","rustpython_vm","",N,N],[3,"PyFuncArgs","rustpython_vm::function","The `PyFuncArgs` struct is one of the most used structs…",N,N],[12,"args","","",24,N],[12,"kwargs","","",24,N],[3,"KwArgs","","A map of keyword arguments to their values.",N,N],[3,"Args","","A list of positional argument values.",N,N],[4,"ArgumentError","","An error encountered while binding arguments to the…",N,N],[13,"TooFewArgs","","The call provided fewer positional arguments than the…",25,N],[13,"TooManyArgs","","The call provided more positional arguments than the…",25,N],[13,"InvalidKeywordArgument","","The function doesn't accept a keyword argument with the…",25,N],[13,"Exception","","An exception was raised while binding arguments to the…",25,N],[4,"OptionalArg","","An argument that may or may not be provided by the caller.",N,N],[13,"Present","","",26,N],[13,"Missing","","",26,N],[6,"PyNativeFunc","","A built-in Python function.",N,N],[8,"FromArgs","","Implemented by any type that can be accepted as a…",N,N],[11,"arity","","The range of positional arguments permitted by the…",27,[[],["rangeinclusive",["usize"]]]],[10,"from_args","","Extracts this item from the next argument(s).",27,[[["virtualmachine"],["pyfuncargs"]],["result",["argumenterror"]]]],[8,"IntoPyNativeFunc","","Implemented by types that are or can generate built-in…",N,N],[10,"into_func","","",28,[[["self"]],["pynativefunc"]]],[11,"new","","",24,[[["vec",["pyobjectref"]],["vec",["string"]]],["pyfuncargs"]]],[11,"insert","","",24,[[["self"],["pyobjectref"]],["pyfuncargs"]]],[11,"shift","","",24,[[["self"]],["pyobjectref"]]],[11,"get_kwarg","","",24,[[["self"],["str"],["pyobjectref"]],["pyobjectref"]]],[11,"get_optional_kwarg","","",24,[[["self"],["str"]],["option",["pyobjectref"]]]],[11,"get_optional_kwarg_with_type","","",24,[[["self"],["str"],["pyobjectref"],["virtualmachine"]],["result",["option","pyobjectref"]]]],[11,"next_positional","","",24,[[["self"]],["option",["pyobjectref"]]]],[11,"take_keyword","","",24,[[["self"],["str"]],["option",["pyobjectref"]]]],[11,"remaining_keyword","","",24,N],[11,"into_option","","",26,[[["self"]],["option"]]],[0,"import","rustpython_vm","",N,N],[5,"import_module","rustpython_vm::import","",N,[[["virtualmachine"],["pathbuf"],["str"]],["pyresult"]]],[0,"obj","rustpython_vm","This package contains the python basic/builtin types",N,N],[0,"objbool","rustpython_vm::obj","",N,N],[5,"boolval","rustpython_vm::obj::objbool","",N,[[["virtualmachine"],["pyobjectref"]],["pyresult",["bool"]]]],[5,"init","","",N,[[["pycontext"]]]],[5,"not","","",N,[[["virtualmachine"],["pyobjectref"]],["pyresult"]]],[5,"get_value","","",N,[[["pyobjectref"]],["bool"]]],[0,"objbuiltinfunc","rustpython_vm::obj","",N,N],[3,"PyBuiltinFunction","rustpython_vm::obj::objbuiltinfunc","",N,N],[12,"value","","",29,N],[11,"new","","",29,[[["pynativefunc"]],["self"]]],[0,"objbytearray","rustpython_vm::obj","Implementation of the python bytearray object.",N,N],[3,"PyByteArray","rustpython_vm::obj::objbytearray","",N,N],[12,"value","","",30,N],[5,"get_value","","",N,N],[5,"get_mut_value","","",N,N],[5,"init","","Fill bytearray class methods dictionary.",N,[[["pycontext"]]]],[11,"new","","",30,[[["vec",["u8"]]],["self"]]],[0,"objbytes","rustpython_vm::obj","",N,N],[3,"PyBytes","rustpython_vm::obj::objbytes","",N,N],[5,"init","","",N,[[["pycontext"]]]],[5,"get_value","","",N,N],[11,"new","","",31,[[["vec",["u8"]]],["self"]]],[0,"objclassmethod","rustpython_vm::obj","",N,N],[3,"PyClassMethod","rustpython_vm::obj::objclassmethod","",N,N],[12,"callable","","",32,N],[5,"init","","",N,[[["pycontext"]]]],[6,"PyClassMethodRef","","",N,N],[0,"objcode","rustpython_vm::obj","Infamous code object. The python class `code`",N,N],[3,"PyCode","rustpython_vm::obj::objcode","",N,N],[5,"init","","",N,[[["pycontext"]]]],[5,"get_value","","",N,[[["pyobjectref"]],["codeobject"]]],[11,"new","","",33,[[["codeobject"]],["pycode"]]],[0,"objcomplex","rustpython_vm::obj","",N,N],[3,"PyComplex","rustpython_vm::obj::objcomplex","",N,N],[5,"init","","",N,[[["pycontext"]]]],[5,"get_value","","",N,[[["pyobjectref"]],["complex64"]]],[0,"objdict","rustpython_vm::obj","",N,N],[3,"PyDict","rustpython_vm::obj::objdict","",N,N],[12,"entries","","",34,N],[5,"get_elements","","",N,N],[5,"get_mut_elements","","",N,N],[5,"set_item","","",N,[[["pyobjectref"],["virtualmachine"],["pyobjectref"],["pyobjectref"]]]],[5,"set_item_in_content","","",N,[[["dictcontenttype"],["pyobjectref"],["pyobjectref"]]]],[5,"get_key_value_pairs","","",N,[[["pyobjectref"]],["vec"]]],[5,"get_key_value_pairs_from_content","","",N,[[["dictcontenttype"]],["vec"]]],[5,"get_item","","",N,[[["pyobjectref"],["pyobjectref"]],["option",["pyobjectref"]]]],[5,"get_key_str","","",N,[[["pyobjectref"],["str"]],["option",["pyobjectref"]]]],[5,"content_get_key_str","","Retrieve a key from dict contents:",N,[[["dictcontenttype"],["str"]],["option",["pyobjectref"]]]],[5,"contains_key_str","","",N,[[["pyobjectref"],["str"]],["bool"]]],[5,"content_contains_key_str","","",N,[[["dictcontenttype"],["str"]],["bool"]]],[5,"py_dict_to_attributes","","Take a python dictionary and convert it to attributes.",N,[[["pyobjectref"]],["pyattributes"]]],[5,"attributes_to_py_dict","","",N,[[["virtualmachine"],["pyattributes"]],["pyresult"]]],[5,"init","","",N,[[["pycontext"]]]],[6,"DictContentType","","",N,N],[6,"PyDictRef","","",N,N],[0,"objellipsis","rustpython_vm::obj","",N,N],[5,"init","rustpython_vm::obj::objellipsis","",N,[[["pycontext"]]]],[0,"objenumerate","rustpython_vm::obj","",N,N],[3,"PyEnumerate","rustpython_vm::obj::objenumerate","",N,N],[5,"init","","",N,[[["pycontext"]]]],[0,"objfilter","rustpython_vm::obj","",N,N],[3,"PyFilter","rustpython_vm::obj::objfilter","",N,N],[5,"init","","",N,[[["pycontext"]]]],[0,"objfloat","rustpython_vm::obj","",N,N],[3,"PyFloat","rustpython_vm::obj::objfloat","",N,N],[5,"get_value","","",N,[[["pyobjectref"]],["f64"]]],[5,"make_float","","",N,[[["virtualmachine"],["pyobjectref"]],["pyresult",["f64"]]]],[5,"init","","",N,[[["pycontext"]]]],[6,"PyFloatRef","","",N,N],[0,"objframe","rustpython_vm::obj","The python `frame` type.",N,N],[5,"init","rustpython_vm::obj::objframe","",N,[[["pycontext"]]]],[5,"get_value","","",N,[[["pyobjectref"]],["frame"]]],[0,"objfunction","rustpython_vm::obj","",N,N],[3,"PyFunction","rustpython_vm::obj::objfunction","",N,N],[12,"code","","",35,N],[12,"scope","","",35,N],[12,"defaults","","",35,N],[3,"PyMethod","","",N,N],[12,"object","","",36,N],[12,"function","","",36,N],[5,"init","","",N,[[["pycontext"]]]],[11,"new","","",35,[[["pyobjectref"],["scope"],["pyobjectref"]],["self"]]],[11,"new","","",36,[[["pyobjectref"],["pyobjectref"]],["self"]]],[0,"objgenerator","rustpython_vm::obj","",N,N],[3,"PyGenerator","rustpython_vm::obj::objgenerator","",N,N],[5,"init","","",N,[[["pycontext"]]]],[5,"new_generator","","",N,[[["pyobjectref"],["virtualmachine"]],["pyref",["pygenerator"]]]],[0,"objint","rustpython_vm::obj","",N,N],[3,"PyInt","rustpython_vm::obj::objint","",N,N],[12,"value","","",37,N],[5,"to_int","","",N,[[["virtualmachine"],["pyobjectref"],["u32"]],["pyresult",["bigint"]]]],[5,"get_value","","",N,[[["pyobjectref"]],["bigint"]]],[5,"init","","",N,[[["pycontext"]]]],[6,"PyIntRef","","",N,N],[11,"new","","",37,[[["t"]],["self"]]],[0,"objiter","rustpython_vm::obj","",N,N],[5,"get_iter","rustpython_vm::obj::objiter","",N,[[["virtualmachine"],["pyobjectref"]],["pyresult"]]],[5,"call_next","","",N,[[["virtualmachine"],["pyobjectref"]],["pyresult"]]],[5,"get_next_object","","",N,[[["virtualmachine"],["pyobjectref"]],["pyresult",["option"]]]],[5,"get_all","","",N,[[["virtualmachine"],["pyobjectref"]],["pyresult",["vec"]]]],[5,"new_stop_iteration","","",N,[[["virtualmachine"]],["pyobjectref"]]],[5,"iter_type_init","","Common setup for iter types, adds iter and contains methods",N,[[["pycontext"],["pyobjectref"]]]],[5,"init","","",N,[[["pycontext"]]]],[0,"objlist","rustpython_vm::obj","",N,N],[3,"PyList","rustpython_vm::obj::objlist","",N,N],[12,"elements","","",38,N],[5,"init","","",N,[[["pycontext"]]]],[6,"PyListRef","","",N,N],[11,"append","","",39,[[["self"],["pyobjectref"],["virtualmachine"]]]],[0,"objmap","rustpython_vm::obj","",N,N],[3,"PyMap","rustpython_vm::obj::objmap","",N,N],[5,"init","","",N,[[["pycontext"]]]],[0,"objmemory","rustpython_vm::obj","",N,N],[3,"PyMemoryView","rustpython_vm::obj::objmemory","",N,N],[5,"new_memory_view","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"init","","",N,[[["pycontext"]]]],[0,"objmodule","rustpython_vm::obj","",N,N],[3,"PyModule","rustpython_vm::obj::objmodule","",N,N],[12,"name","","",40,N],[12,"dict","","",40,N],[5,"init","","",N,[[["pycontext"]]]],[6,"PyModuleRef","","",N,N],[0,"objnone","rustpython_vm::obj","",N,N],[3,"PyNone","rustpython_vm::obj::objnone","",N,N],[5,"init","","",N,[[["pycontext"]]]],[6,"PyNoneRef","","",N,N],[0,"objobject","rustpython_vm::obj","",N,N],[3,"PyInstance","rustpython_vm::obj::objobject","",N,N],[5,"new_instance","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"object_dir","","",N,[[["pyobjectref"],["virtualmachine"]],["pylist"]]],[5,"init","","",N,[[["pycontext"]]]],[5,"get_attributes","","",N,[[["pyobjectref"]],["pyattributes"]]],[6,"PyInstanceRef","","",N,N],[0,"objproperty","rustpython_vm::obj","Python `property` descriptor class.",N,N],[3,"PyReadOnlyProperty","rustpython_vm::obj::objproperty","Read-only property, doesn't have set or delete",N,N],[3,"PyProperty","","Fully fledged property",N,N],[3,"PropertyBuilder","","",N,N],[5,"init","","",N,[[["pycontext"]]]],[6,"PyReadOnlyPropertyRef","","",N,N],[6,"PyPropertyRef","","",N,N],[11,"new","","",41,[[["pycontext"]],["self"]]],[11,"add_getter","","",41,[[["self"],["f"]],["self"]]],[11,"add_setter","","",41,[[["self"],["f"]],["self"]]],[11,"create","","",41,[[["self"]],["pyobjectref"]]],[0,"objrange","rustpython_vm::obj","",N,N],[3,"PyRange","rustpython_vm::obj::objrange","",N,N],[12,"start","","",42,N],[12,"end","","",42,N],[12,"step","","",42,N],[5,"get_value","","",N,[[["pyobjectref"]],["pyrange"]]],[5,"init","","",N,[[["pycontext"]]]],[11,"try_len","","",42,[[["self"]],["option",["usize"]]]],[11,"len","","",42,[[["self"]],["usize"]]],[11,"contains","","",42,[[["self"],["bigint"]],["bool"]]],[11,"index_of","","",42,[[["self"],["bigint"]],["option",["bigint"]]]],[11,"count","","",42,[[["self"],["bigint"]],["usize"]]],[11,"is_empty","","",42,[[["self"]],["bool"]]],[11,"forward","","",42,[[["self"]],["bool"]]],[11,"get","","",42,[[["self"],["t"]],["option",["bigint"]]]],[11,"reversed","","",42,[[["self"]],["self"]]],[11,"repr","","",42,[[["self"]],["string"]]],[0,"objsequence","rustpython_vm::obj","",N,N],[5,"get_item","rustpython_vm::obj::objsequence","",N,N],[5,"seq_equal","","",N,N],[5,"seq_lt","","",N,N],[5,"seq_gt","","",N,N],[5,"seq_ge","","",N,N],[5,"seq_le","","",N,N],[5,"seq_mul","","",N,N],[5,"get_elements_cell","","",N,[[["pyobjectref"]],["refcell"]]],[5,"get_elements","","",N,N],[5,"get_mut_elements","","",N,N],[8,"PySliceableSequence","","",N,N],[10,"do_slice","","",43,[[["self"],["range",["usize"]]],["self"]]],[10,"do_slice_reverse","","",43,[[["self"],["range",["usize"]]],["self"]]],[10,"do_stepped_slice","","",43,[[["self"],["range",["usize"]],["usize"]],["self"]]],[10,"do_stepped_slice_reverse","","",43,[[["self"],["range",["usize"]],["usize"]],["self"]]],[10,"empty","","",43,[[],["self"]]],[10,"len","","",43,[[["self"]],["usize"]]],[10,"is_empty","","",43,[[["self"]],["bool"]]],[11,"get_pos","","",43,[[["self"],["i32"]],["option",["usize"]]]],[11,"get_slice_pos","","",43,[[["self"],["bigint"]],["usize"]]],[11,"get_slice_range","","",43,[[["self"],["option"],["option"]],["range",["usize"]]]],[11,"get_slice_items","","",43,[[["self"],["virtualmachine"],["pyobjectref"]],["result",["pyobjectref"]]]],[0,"objset","rustpython_vm::obj","",N,N],[3,"PySet","rustpython_vm::obj::objset","",N,N],[5,"get_elements","","",N,[[["pyobjectref"]],["hashmap",["u64","pyobjectref"]]]],[5,"set_contains","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"init","","",N,[[["pycontext"]]]],[6,"PySetRef","","",N,N],[0,"objslice","rustpython_vm::obj","",N,N],[3,"PySlice","rustpython_vm::obj::objslice","",N,N],[12,"start","","",44,N],[12,"stop","","",44,N],[12,"step","","",44,N],[5,"init","","",N,[[["pycontext"]]]],[0,"objstaticmethod","rustpython_vm::obj","",N,N],[3,"PyStaticMethod","rustpython_vm::obj::objstaticmethod","",N,N],[12,"callable","","",45,N],[5,"init","","",N,[[["pycontext"]]]],[6,"PyStaticMethodRef","","",N,N],[0,"objstr","rustpython_vm::obj","",N,N],[3,"PyString","rustpython_vm::obj::objstr","",N,N],[12,"value","","",46,N],[5,"init","","",N,[[["pycontext"]]]],[5,"get_value","","",N,[[["pyobjectref"]],["string"]]],[5,"borrow_value","","",N,[[["pyobjectref"]],["str"]]],[5,"subscript","","",N,[[["virtualmachine"],["str"],["pyobjectref"]],["pyresult"]]],[6,"PyStringRef","","",N,N],[0,"objsuper","rustpython_vm::obj","Python `super` class.",N,N],[3,"PySuper","rustpython_vm::obj::objsuper","",N,N],[5,"init","","",N,[[["pycontext"]]]],[0,"objtuple","rustpython_vm::obj","",N,N],[3,"PyTuple","rustpython_vm::obj::objtuple","",N,N],[12,"elements","","",47,N],[5,"init","","",N,[[["pycontext"]]]],[6,"PyTupleRef","","",N,N],[0,"objtype","rustpython_vm::obj","",N,N],[3,"PyClass","rustpython_vm::obj::objtype","",N,N],[12,"name","","",48,N],[12,"mro","","",48,N],[5,"init","","",N,[[["pycontext"]]]],[5,"isinstance","","Determines if `obj` actually an instance of `cls`, this…",N,[[["pyobjectref"],["pyobjectref"]],["bool"]]],[5,"issubclass","","Determines if `subclass` is actually a subclass of `cls`,…",N,[[["pyobjectref"],["pyobjectref"]],["bool"]]],[5,"get_type_name","","",N,[[["pyobjectref"]],["string"]]],[5,"type_new","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"type_new_class","","",N,[[["virtualmachine"],["pyobjectref"],["pyobjectref"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[5,"type_call","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"type_getattribute","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"get_attributes","","",N,[[["pyclassref"]],["pyattributes"]]],[5,"new","","",N,[[["pyobjectref"],["str"],["vec",["pyclassref"]],["hashmap",["string","pyobjectref"]]],["pyresult"]]],[6,"PyClassRef","","",N,N],[0,"objweakref","rustpython_vm::obj","",N,N],[3,"PyWeak","rustpython_vm::obj::objweakref","",N,N],[5,"init","","",N,[[["pycontext"]]]],[6,"PyWeakRef","","",N,N],[11,"downgrade","","",49,[[["pyobjectref"]],["pyweak"]]],[11,"upgrade","","",49,[[["self"]],["option",["pyobjectref"]]]],[0,"objzip","rustpython_vm::obj","",N,N],[3,"PyZip","rustpython_vm::obj::objzip","",N,N],[5,"init","","",N,[[["pycontext"]]]],[0,"pyobject","rustpython_vm","",N,N],[3,"PyContext","rustpython_vm::pyobject","",N,N],[12,"bytes_type","","",50,N],[12,"bytearray_type","","",50,N],[12,"bool_type","","",50,N],[12,"classmethod_type","","",50,N],[12,"code_type","","",50,N],[12,"dict_type","","",50,N],[12,"ellipsis_type","","",50,N],[12,"enumerate_type","","",50,N],[12,"filter_type","","",50,N],[12,"float_type","","",50,N],[12,"frame_type","","",50,N],[12,"frozenset_type","","",50,N],[12,"generator_type","","",50,N],[12,"int_type","","",50,N],[12,"iter_type","","",50,N],[12,"complex_type","","",50,N],[12,"true_value","","",50,N],[12,"false_value","","",50,N],[12,"list_type","","",50,N],[12,"map_type","","",50,N],[12,"memoryview_type","","",50,N],[12,"none","","",50,N],[12,"ellipsis","","",50,N],[12,"not_implemented","","",50,N],[12,"tuple_type","","",50,N],[12,"set_type","","",50,N],[12,"staticmethod_type","","",50,N],[12,"super_type","","",50,N],[12,"str_type","","",50,N],[12,"range_type","","",50,N],[12,"slice_type","","",50,N],[12,"type_type","","",50,N],[12,"zip_type","","",50,N],[12,"function_type","","",50,N],[12,"builtin_function_or_method_type","","",50,N],[12,"property_type","","",50,N],[12,"readonly_property_type","","",50,N],[12,"module_type","","",50,N],[12,"bound_method_type","","",50,N],[12,"weakref_type","","",50,N],[12,"object","","",50,N],[12,"exceptions","","",50,N],[3,"PyNotImplemented","","",N,N],[3,"PyEllipsis","","",N,N],[3,"PyObject","","This is an actual python object. It consists of a `typ`…",N,N],[12,"typ","","",51,N],[12,"dict","","",51,N],[12,"payload","","",51,N],[3,"PyRef","","A reference to a Python object.",N,N],[3,"PyIterable","","An iterable Python object.",N,N],[3,"PyIterator","","",N,N],[3,"PyIteratorValue","","",N,N],[12,"position","","",52,N],[12,"iterated_obj","","",52,N],[5,"create_type","","",N,[[["str"],["pyobjectref"],["pyobjectref"]],["pyobjectref"]]],[6,"PyObjectRef","","The `PyObjectRef` is one of the most used types. It is a…",N,N],[6,"PyResult","","Use this type for function which return a python object or…",N,N],[6,"PyAttributes","","For attributes we do not use a dict, but a hashmap. This…",N,N],[8,"IdProtocol","","",N,N],[10,"get_id","","",53,[[["self"]],["usize"]]],[11,"is","","",53,[[["self"],["t"]],["bool"]]],[8,"FromPyObjectRef","","",N,N],[10,"from_pyobj","","",54,[[["pyobjectref"]],["self"]]],[8,"TypeProtocol","","",N,N],[11,"typ","","",55,[[["self"]],["pyobjectref"]]],[11,"type_pyref","","",55,[[["self"]],["pyclassref"]]],[10,"type_ref","","",55,[[["self"]],["pyobjectref"]]],[8,"AttributeProtocol","","",N,N],[10,"get_attr","","",56,[[["self"],["str"]],["option",["pyobjectref"]]]],[10,"has_attr","","",56,[[["self"],["str"]],["bool"]]],[8,"DictProtocol","","",N,N],[10,"contains_key","","",57,[[["self"],["str"]],["bool"]]],[10,"get_item","","",57,[[["self"],["str"]],["option",["pyobjectref"]]]],[10,"get_key_value_pairs","","",57,[[["self"]],["vec"]]],[10,"set_item","","",57,[[["self"],["pycontext"],["str"],["pyobjectref"]]]],[10,"del_item","","",57,[[["self"],["str"]]]],[8,"BufferProtocol","","",N,N],[10,"readonly","","",58,[[["self"]],["bool"]]],[8,"TryIntoRef","","Allows coercion of a types into PyRefs, so that we can…",N,N],[10,"try_into_ref","","",59,[[["self"],["virtualmachine"]],["pyresult",["pyref"]]]],[8,"TryFromObject","","Implemented by any type that can be created from a Python…",N,N],[10,"try_from_object","","Attempt to convert a Python object to a value of this type.",60,[[["virtualmachine"],["pyobjectref"]],["pyresult"]]],[8,"IntoPyObject","","Implemented by any type that can be returned from a…",N,N],[10,"into_pyobject","","",61,[[["self"],["virtualmachine"]],["pyresult"]]],[8,"PyValue","","",N,N],[10,"class","","",62,[[["virtualmachine"]],["pyobjectref"]]],[11,"into_ref","","",62,[[["self"],["virtualmachine"]],["pyref"]]],[11,"into_ref_with_type","","",62,[[["self"],["virtualmachine"],["pyclassref"]],["pyresult",["pyref"]]]],[8,"PyObjectPayload","","",N,N],[10,"as_any","","",63,[[["self"]],["any"]]],[11,"new","","",50,[[],["self"]]],[11,"bytearray_type","","",50,[[["self"]],["pyobjectref"]]],[11,"bytes_type","","",50,[[["self"]],["pyobjectref"]]],[11,"code_type","","",50,[[["self"]],["pyobjectref"]]],[11,"complex_type","","",50,[[["self"]],["pyobjectref"]]],[11,"dict_type","","",50,[[["self"]],["pyobjectref"]]],[11,"float_type","","",50,[[["self"]],["pyobjectref"]]],[11,"frame_type","","",50,[[["self"]],["pyobjectref"]]],[11,"int_type","","",50,[[["self"]],["pyobjectref"]]],[11,"list_type","","",50,[[["self"]],["pyobjectref"]]],[11,"module_type","","",50,[[["self"]],["pyobjectref"]]],[11,"set_type","","",50,[[["self"]],["pyobjectref"]]],[11,"range_type","","",50,[[["self"]],["pyobjectref"]]],[11,"slice_type","","",50,[[["self"]],["pyobjectref"]]],[11,"frozenset_type","","",50,[[["self"]],["pyobjectref"]]],[11,"bool_type","","",50,[[["self"]],["pyobjectref"]]],[11,"memoryview_type","","",50,[[["self"]],["pyobjectref"]]],[11,"tuple_type","","",50,[[["self"]],["pyobjectref"]]],[11,"iter_type","","",50,[[["self"]],["pyobjectref"]]],[11,"enumerate_type","","",50,[[["self"]],["pyobjectref"]]],[11,"filter_type","","",50,[[["self"]],["pyobjectref"]]],[11,"map_type","","",50,[[["self"]],["pyobjectref"]]],[11,"zip_type","","",50,[[["self"]],["pyobjectref"]]],[11,"str_type","","",50,[[["self"]],["pyobjectref"]]],[11,"super_type","","",50,[[["self"]],["pyobjectref"]]],[11,"function_type","","",50,[[["self"]],["pyobjectref"]]],[11,"builtin_function_or_method_type","","",50,[[["self"]],["pyobjectref"]]],[11,"property_type","","",50,[[["self"]],["pyobjectref"]]],[11,"readonly_property_type","","",50,[[["self"]],["pyobjectref"]]],[11,"classmethod_type","","",50,[[["self"]],["pyobjectref"]]],[11,"staticmethod_type","","",50,[[["self"]],["pyobjectref"]]],[11,"generator_type","","",50,[[["self"]],["pyobjectref"]]],[11,"bound_method_type","","",50,[[["self"]],["pyobjectref"]]],[11,"weakref_type","","",50,[[["self"]],["pyobjectref"]]],[11,"type_type","","",50,[[["self"]],["pyobjectref"]]],[11,"none","","",50,[[["self"]],["pyobjectref"]]],[11,"ellipsis","","",50,[[["self"]],["pyobjectref"]]],[11,"not_implemented","","",50,[[["self"]],["pyobjectref"]]],[11,"object","","",50,[[["self"]],["pyobjectref"]]],[11,"new_object","","",50,[[["self"]],["pyobjectref"]]],[11,"new_int","","",50,[[["self"],["t"]],["pyobjectref"]]],[11,"new_float","","",50,[[["self"],["f64"]],["pyobjectref"]]],[11,"new_complex","","",50,[[["self"],["complex64"]],["pyobjectref"]]],[11,"new_str","","",50,[[["self"],["string"]],["pyobjectref"]]],[11,"new_bytes","","",50,[[["self"],["vec",["u8"]]],["pyobjectref"]]],[11,"new_bytearray","","",50,[[["self"],["vec",["u8"]]],["pyobjectref"]]],[11,"new_bool","","",50,[[["self"],["bool"]],["pyobjectref"]]],[11,"new_tuple","","",50,[[["self"],["vec",["pyobjectref"]]],["pyobjectref"]]],[11,"new_list","","",50,[[["self"],["vec",["pyobjectref"]]],["pyobjectref"]]],[11,"new_set","","",50,[[["self"]],["pyobjectref"]]],[11,"new_dict","","",50,[[["self"]],["pyobjectref"]]],[11,"new_class","","",50,[[["self"],["str"],["pyobjectref"]],["pyobjectref"]]],[11,"new_scope","","",50,[[["self"]],["scope"]]],[11,"new_module","","",50,[[["self"],["str"],["pyobjectref"]],["pyobjectref"]]],[11,"new_rustfunc","","",50,[[["self"],["f"]],["pyobjectref"]]],[11,"new_frame","","",50,[[["self"],["pyobjectref"],["scope"]],["pyobjectref"]]],[11,"new_property","","",50,[[["self"],["f"]],["pyobjectref"]]],[11,"new_code_object","","",50,[[["self"],["codeobject"]],["pyobjectref"]]],[11,"new_function","","",50,[[["self"],["pyobjectref"],["scope"],["pyobjectref"]],["pyobjectref"]]],[11,"new_bound_method","","",50,[[["self"],["pyobjectref"],["pyobjectref"]],["pyobjectref"]]],[11,"new_instance","","",50,[[["self"],["pyobjectref"],["option",["pyattributes"]]],["pyobjectref"]]],[11,"set_item","","",50,[[["self"],["pyobjectref"],["str"],["pyobjectref"]]]],[11,"get_attr","","",50,[[["self"],["pyobjectref"],["str"]],["option",["pyobjectref"]]]],[11,"set_attr","","",50,[[["self"],["pyobjectref"],["str"],["pyobjectref"]]]],[11,"unwrap_constant","","",50,[[["self"],["constant"]],["pyobjectref"]]],[11,"as_object","","",64,[[["self"]],["pyobjectref"]]],[11,"into_object","","",64,[[["self"]],["pyobjectref"]]],[11,"typ","","",64,[[["self"]],["pyclassref"]]],[11,"iter","","Returns an iterator over this sequence of objects.",65,[[["self"],["virtualmachine"]],["pyresult",["pyiterator"]]]],[11,"new","","",51,[[["t"],["pyobjectref"]],["pyobjectref"]]],[11,"new_without_dict","","",51,[[["t"],["pyobjectref"]],["pyobjectref"]]],[11,"into_ref","","",51,[[["self"]],["pyobjectref"]]],[11,"payload","","",51,[[["self"]],["option"]]],[11,"payload_is","","",51,[[["self"]],["bool"]]],[0,"stdlib","rustpython_vm","",N,N],[5,"get_module_inits","rustpython_vm::stdlib","",N,[[],["hashmap",["string","stdlibinitfunc"]]]],[0,"socket","","",N,N],[3,"Socket","rustpython_vm::stdlib::socket","",N,N],[5,"make_module","","",N,[[["pycontext"]],["pyobjectref"]]],[0,"io","rustpython_vm::stdlib","",N,N],[5,"io_open","rustpython_vm::stdlib::io","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[5,"make_module","","",N,[[["pycontext"]],["pyobjectref"]]],[6,"StdlibInitFunc","rustpython_vm::stdlib","",N,N],[0,"util","rustpython_vm","",N,N],[5,"read_file","rustpython_vm::util","Read a file at `path` into a String",N,[[["path"]],["result",["string"]]]],[11,"new","rustpython_vm","Create a new `VirtualMachine` structure.",0,[[],["virtualmachine"]]],[11,"run_code_obj","","",0,[[["self"],["pyobjectref"],["scope"]],["pyresult"]]],[11,"run_frame_full","","",0,[[["self"],["pyobjectref"]],["pyresult"]]],[11,"run_frame","","",0,[[["self"],["pyobjectref"]],["pyresult",["executionresult"]]]],[11,"current_frame","","",0,[[["self"]],["ref",["frame"]]]],[11,"current_scope","","",0,[[["self"]],["ref",["scope"]]]],[11,"class","","",0,[[["self"],["str"],["str"]],["pyobjectref"]]],[11,"new_str","","Create a new python string object.",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_int","","Create a new python int object.",0,[[["self"],["t"]],["pyobjectref"]]],[11,"new_bool","","Create a new python bool object.",0,[[["self"],["bool"]],["pyobjectref"]]],[11,"new_dict","","",0,[[["self"]],["pyobjectref"]]],[11,"new_empty_exception","","",0,[[["self"],["pyobjectref"]],["pyresult"]]],[11,"new_exception","","",0,[[["self"],["pyobjectref"],["string"]],["pyobjectref"]]],[11,"new_attribute_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_type_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_unsupported_operand_error","","",0,[[["self"],["pyobjectref"],["pyobjectref"],["str"]],["pyobjectref"]]],[11,"new_os_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_value_error","","Create a new python ValueError object. Useful for raising…",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_key_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_index_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_not_implemented_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_zero_division_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"new_overflow_error","","",0,[[["self"],["string"]],["pyobjectref"]]],[11,"get_none","","",0,[[["self"]],["pyobjectref"]]],[11,"get_type","","",0,[[["self"]],["pyobjectref"]]],[11,"get_object","","",0,[[["self"]],["pyobjectref"]]],[11,"get_locals","","",0,[[["self"]],["pyobjectref"]]],[11,"context","","",0,[[["self"]],["pycontext"]]],[11,"to_str","","",0,[[["self"],["pyobjectref"]],["pyresult",["pystringref"]]]],[11,"to_pystr","","",0,[[["self"],["pyobjectref"]],["result",["string","pyobjectref"]]]],[11,"to_repr","","",0,[[["self"],["pyobjectref"]],["pyresult",["pystringref"]]]],[11,"import","","",0,[[["self"],["str"]],["pyresult"]]],[11,"isinstance","","Determines if `obj` is an instance of `cls`, either…",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult",["bool"]]]],[11,"issubclass","","Determines if `subclass` is a subclass of `cls`, either…",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult",["bool"]]]],[11,"call_get_descriptor","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"call_method","","",0,[[["self"],["pyobjectref"],["str"],["t"]],["pyresult"]]],[11,"invoke","","",0,[[["self"],["pyobjectref"],["t"]],["pyresult"]]],[11,"invoke_with_locals","","",0,[[["self"],["pyobjectref"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"extract_elements","","",0,[[["self"],["pyobjectref"]],["pyresult",["vec"]]]],[11,"get_attribute","","",0,[[["self"],["pyobjectref"],["t"]],["pyresult"]]],[11,"set_attr","","",0,[[["self"],["pyobjectref"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"del_attr","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"get_method","","",0,[[["self"],["pyobjectref"],["str"]],["pyresult"]]],[11,"call_or_unsupported","","Calls a method on `obj` passing `arg`, if the method exists.",0,[[["self"],["pyobjectref"],["pyobjectref"],["str"],["f"]],["pyresult"]]],[11,"call_or_reflection","","Calls a method, falling back to its reflection with the…",0,N],[11,"serialize","","",0,[[["self"],["pyobjectref"]],["pyresult",["string"]]]],[11,"deserialize","","",0,[[["self"],["str"]],["pyresult"]]],[11,"_sub","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_isub","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_add","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_iadd","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_mul","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_imul","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_matmul","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_imatmul","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_truediv","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_itruediv","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_floordiv","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ifloordiv","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_pow","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ipow","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_mod","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_imod","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_lshift","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ilshift","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_rshift","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_irshift","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_xor","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ixor","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_or","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ior","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_and","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_iand","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_eq","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ne","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_lt","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_le","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_gt","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[11,"_ge","","",0,[[["self"],["pyobjectref"],["pyobjectref"]],["pyresult"]]],[14,"replace_expr","","",N,N],[14,"count_tts","","",N,N],[14,"type_check","","",N,N],[14,"arg_check","","",N,N],[14,"no_kwargs","","",N,N],[14,"py_module","","",N,N],[14,"py_class","","",N,N],[14,"extend_class","","",N,N],[11,"from","","",0,[[["t"]],["t"]]],[11,"into","","",0,[[["self"]],["u"]]],[11,"try_from","","",0,[[["u"]],["result"]]],[11,"borrow","","",0,[[["self"]],["t"]]],[11,"borrow_mut","","",0,[[["self"]],["t"]]],[11,"try_into","","",0,[[["self"]],["result"]]],[11,"get_type_id","","",0,[[["self"]],["typeid"]]],[11,"to_string","rustpython_vm::bytecode","",1,[[["self"]],["string"]]],[11,"from","","",1,[[["t"]],["t"]]],[11,"into","","",1,[[["self"]],["u"]]],[11,"to_owned","","",1,[[["self"]],["t"]]],[11,"clone_into","","",1,N],[11,"try_from","","",1,[[["u"]],["result"]]],[11,"borrow","","",1,[[["self"]],["t"]]],[11,"borrow_mut","","",1,[[["self"]],["t"]]],[11,"try_into","","",1,[[["self"]],["result"]]],[11,"get_type_id","","",1,[[["self"]],["typeid"]]],[11,"from","","",9,[[["t"]],["t"]]],[11,"into","","",9,[[["self"]],["u"]]],[11,"to_owned","","",9,[[["self"]],["t"]]],[11,"clone_into","","",9,N],[11,"try_from","","",9,[[["u"]],["result"]]],[11,"borrow","","",9,[[["self"]],["t"]]],[11,"borrow_mut","","",9,[[["self"]],["t"]]],[11,"try_into","","",9,[[["self"]],["result"]]],[11,"get_type_id","","",9,[[["self"]],["typeid"]]],[11,"from","","",2,[[["t"]],["t"]]],[11,"into","","",2,[[["self"]],["u"]]],[11,"to_owned","","",2,[[["self"]],["t"]]],[11,"clone_into","","",2,N],[11,"try_from","","",2,[[["u"]],["result"]]],[11,"borrow","","",2,[[["self"]],["t"]]],[11,"borrow_mut","","",2,[[["self"]],["t"]]],[11,"try_into","","",2,[[["self"]],["result"]]],[11,"get_type_id","","",2,[[["self"]],["typeid"]]],[11,"from","","",3,[[["t"]],["t"]]],[11,"into","","",3,[[["self"]],["u"]]],[11,"to_owned","","",3,[[["self"]],["t"]]],[11,"clone_into","","",3,N],[11,"try_from","","",3,[[["u"]],["result"]]],[11,"borrow","","",3,[[["self"]],["t"]]],[11,"borrow_mut","","",3,[[["self"]],["t"]]],[11,"try_into","","",3,[[["self"]],["result"]]],[11,"get_type_id","","",3,[[["self"]],["typeid"]]],[11,"to_string","","",4,[[["self"]],["string"]]],[11,"from","","",4,[[["t"]],["t"]]],[11,"into","","",4,[[["self"]],["u"]]],[11,"to_owned","","",4,[[["self"]],["t"]]],[11,"clone_into","","",4,N],[11,"try_from","","",4,[[["u"]],["result"]]],[11,"borrow","","",4,[[["self"]],["t"]]],[11,"borrow_mut","","",4,[[["self"]],["t"]]],[11,"try_into","","",4,[[["self"]],["result"]]],[11,"get_type_id","","",4,[[["self"]],["typeid"]]],[11,"from","","",5,[[["t"]],["t"]]],[11,"into","","",5,[[["self"]],["u"]]],[11,"to_owned","","",5,[[["self"]],["t"]]],[11,"clone_into","","",5,N],[11,"try_from","","",5,[[["u"]],["result"]]],[11,"borrow","","",5,[[["self"]],["t"]]],[11,"borrow_mut","","",5,[[["self"]],["t"]]],[11,"try_into","","",5,[[["self"]],["result"]]],[11,"get_type_id","","",5,[[["self"]],["typeid"]]],[11,"from","","",6,[[["t"]],["t"]]],[11,"into","","",6,[[["self"]],["u"]]],[11,"to_owned","","",6,[[["self"]],["t"]]],[11,"clone_into","","",6,N],[11,"try_from","","",6,[[["u"]],["result"]]],[11,"borrow","","",6,[[["self"]],["t"]]],[11,"borrow_mut","","",6,[[["self"]],["t"]]],[11,"try_into","","",6,[[["self"]],["result"]]],[11,"get_type_id","","",6,[[["self"]],["typeid"]]],[11,"from","","",7,[[["t"]],["t"]]],[11,"into","","",7,[[["self"]],["u"]]],[11,"to_owned","","",7,[[["self"]],["t"]]],[11,"clone_into","","",7,N],[11,"try_from","","",7,[[["u"]],["result"]]],[11,"borrow","","",7,[[["self"]],["t"]]],[11,"borrow_mut","","",7,[[["self"]],["t"]]],[11,"try_into","","",7,[[["self"]],["result"]]],[11,"get_type_id","","",7,[[["self"]],["typeid"]]],[11,"from","","",8,[[["t"]],["t"]]],[11,"into","","",8,[[["self"]],["u"]]],[11,"to_owned","","",8,[[["self"]],["t"]]],[11,"clone_into","","",8,N],[11,"try_from","","",8,[[["u"]],["result"]]],[11,"borrow","","",8,[[["self"]],["t"]]],[11,"borrow_mut","","",8,[[["self"]],["t"]]],[11,"try_into","","",8,[[["self"]],["result"]]],[11,"get_type_id","","",8,[[["self"]],["typeid"]]],[11,"from","rustpython_vm::compile","",10,[[["t"]],["t"]]],[11,"into","","",10,[[["self"]],["u"]]],[11,"try_from","","",10,[[["u"]],["result"]]],[11,"borrow","","",10,[[["self"]],["t"]]],[11,"borrow_mut","","",10,[[["self"]],["t"]]],[11,"try_into","","",10,[[["self"]],["result"]]],[11,"get_type_id","","",10,[[["self"]],["typeid"]]],[11,"to_string","rustpython_vm::error","",11,[[["self"]],["string"]]],[11,"from","","",11,[[["t"]],["t"]]],[11,"into","","",11,[[["self"]],["u"]]],[11,"try_from","","",11,[[["u"]],["result"]]],[11,"borrow","","",11,[[["self"]],["t"]]],[11,"borrow_mut","","",11,[[["self"]],["t"]]],[11,"try_into","","",11,[[["self"]],["result"]]],[11,"get_type_id","","",11,[[["self"]],["typeid"]]],[11,"from","rustpython_vm::format","",19,[[["t"]],["t"]]],[11,"into","","",19,[[["self"]],["u"]]],[11,"try_from","","",19,[[["u"]],["result"]]],[11,"borrow","","",19,[[["self"]],["t"]]],[11,"borrow_mut","","",19,[[["self"]],["t"]]],[11,"try_into","","",19,[[["self"]],["result"]]],[11,"get_type_id","","",19,[[["self"]],["typeid"]]],[11,"from","","",12,[[["t"]],["t"]]],[11,"into","","",12,[[["self"]],["u"]]],[11,"try_from","","",12,[[["u"]],["result"]]],[11,"borrow","","",12,[[["self"]],["t"]]],[11,"borrow_mut","","",12,[[["self"]],["t"]]],[11,"try_into","","",12,[[["self"]],["result"]]],[11,"get_type_id","","",12,[[["self"]],["typeid"]]],[11,"from","","",13,[[["t"]],["t"]]],[11,"into","","",13,[[["self"]],["u"]]],[11,"to_owned","","",13,[[["self"]],["t"]]],[11,"clone_into","","",13,N],[11,"try_from","","",13,[[["u"]],["result"]]],[11,"borrow","","",13,[[["self"]],["t"]]],[11,"borrow_mut","","",13,[[["self"]],["t"]]],[11,"try_into","","",13,[[["self"]],["result"]]],[11,"get_type_id","","",13,[[["self"]],["typeid"]]],[11,"from","","",14,[[["t"]],["t"]]],[11,"into","","",14,[[["self"]],["u"]]],[11,"to_owned","","",14,[[["self"]],["t"]]],[11,"clone_into","","",14,N],[11,"try_from","","",14,[[["u"]],["result"]]],[11,"borrow","","",14,[[["self"]],["t"]]],[11,"borrow_mut","","",14,[[["self"]],["t"]]],[11,"try_into","","",14,[[["self"]],["result"]]],[11,"get_type_id","","",14,[[["self"]],["typeid"]]],[11,"from","","",15,[[["t"]],["t"]]],[11,"into","","",15,[[["self"]],["u"]]],[11,"try_from","","",15,[[["u"]],["result"]]],[11,"borrow","","",15,[[["self"]],["t"]]],[11,"borrow_mut","","",15,[[["self"]],["t"]]],[11,"try_into","","",15,[[["self"]],["result"]]],[11,"get_type_id","","",15,[[["self"]],["typeid"]]],[11,"from","","",16,[[["t"]],["t"]]],[11,"into","","",16,[[["self"]],["u"]]],[11,"try_from","","",16,[[["u"]],["result"]]],[11,"borrow","","",16,[[["self"]],["t"]]],[11,"borrow_mut","","",16,[[["self"]],["t"]]],[11,"try_into","","",16,[[["self"]],["result"]]],[11,"get_type_id","","",16,[[["self"]],["typeid"]]],[11,"from","","",17,[[["t"]],["t"]]],[11,"into","","",17,[[["self"]],["u"]]],[11,"try_from","","",17,[[["u"]],["result"]]],[11,"borrow","","",17,[[["self"]],["t"]]],[11,"borrow_mut","","",17,[[["self"]],["t"]]],[11,"try_into","","",17,[[["self"]],["result"]]],[11,"get_type_id","","",17,[[["self"]],["typeid"]]],[11,"from","","",18,[[["t"]],["t"]]],[11,"into","","",18,[[["self"]],["u"]]],[11,"try_from","","",18,[[["u"]],["result"]]],[11,"borrow","","",18,[[["self"]],["t"]]],[11,"borrow_mut","","",18,[[["self"]],["t"]]],[11,"try_into","","",18,[[["self"]],["result"]]],[11,"get_type_id","","",18,[[["self"]],["typeid"]]],[11,"from","rustpython_vm::frame","",20,[[["t"]],["t"]]],[11,"into","","",20,[[["self"]],["u"]]],[11,"to_owned","","",20,[[["self"]],["t"]]],[11,"clone_into","","",20,N],[11,"try_from","","",20,[[["u"]],["result"]]],[11,"borrow","","",20,[[["self"]],["t"]]],[11,"borrow_mut","","",20,[[["self"]],["t"]]],[11,"try_into","","",20,[[["self"]],["result"]]],[11,"get_type_id","","",20,[[["self"]],["typeid"]]],[11,"into_pyobject","","",21,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",21,[[["self"]],["any"]]],[11,"from","","",21,[[["t"]],["t"]]],[11,"into","","",21,[[["self"]],["u"]]],[11,"try_from","","",21,[[["u"]],["result"]]],[11,"borrow","","",21,[[["self"]],["t"]]],[11,"borrow_mut","","",21,[[["self"]],["t"]]],[11,"try_into","","",21,[[["self"]],["result"]]],[11,"get_type_id","","",21,[[["self"]],["typeid"]]],[11,"from","","",22,[[["t"]],["t"]]],[11,"into","","",22,[[["self"]],["u"]]],[11,"try_from","","",22,[[["u"]],["result"]]],[11,"borrow","","",22,[[["self"]],["t"]]],[11,"borrow_mut","","",22,[[["self"]],["t"]]],[11,"try_into","","",22,[[["self"]],["result"]]],[11,"get_type_id","","",22,[[["self"]],["typeid"]]],[11,"from","rustpython_vm::function","",24,[[["t"]],["t"]]],[11,"into","","",24,[[["self"]],["u"]]],[11,"to_owned","","",24,[[["self"]],["t"]]],[11,"clone_into","","",24,N],[11,"try_from","","",24,[[["u"]],["result"]]],[11,"borrow","","",24,[[["self"]],["t"]]],[11,"borrow_mut","","",24,[[["self"]],["t"]]],[11,"try_into","","",24,[[["self"]],["result"]]],[11,"get_type_id","","",24,[[["self"]],["typeid"]]],[11,"arity","","",66,[[],["rangeinclusive",["usize"]]]],[11,"from_args","","",66,[[["virtualmachine"],["pyfuncargs"]],["result",["argumenterror"]]]],[11,"from","","",66,[[["t"]],["t"]]],[11,"into","","",66,[[["self"]],["u"]]],[11,"try_from","","",66,[[["u"]],["result"]]],[11,"borrow","","",66,[[["self"]],["t"]]],[11,"borrow_mut","","",66,[[["self"]],["t"]]],[11,"try_into","","",66,[[["self"]],["result"]]],[11,"get_type_id","","",66,[[["self"]],["typeid"]]],[11,"arity","","",67,[[],["rangeinclusive",["usize"]]]],[11,"from_args","","",67,[[["virtualmachine"],["pyfuncargs"]],["result",["argumenterror"]]]],[11,"into_iter","","",67,[[["self"]],["i"]]],[11,"from","","",67,[[["t"]],["t"]]],[11,"into","","",67,[[["self"]],["u"]]],[11,"try_from","","",67,[[["u"]],["result"]]],[11,"borrow","","",67,[[["self"]],["t"]]],[11,"borrow_mut","","",67,[[["self"]],["t"]]],[11,"try_into","","",67,[[["self"]],["result"]]],[11,"get_type_id","","",67,[[["self"]],["typeid"]]],[11,"min","","",67,[[["self"]],["f64"]]],[11,"max","","",67,[[["self"]],["f64"]]],[11,"abs_min","","",67,[[["self"]],["f64"]]],[11,"abs_max","","",67,[[["self"]],["f64"]]],[11,"mean","","",67,[[["self"]],["f64"]]],[11,"geometric_mean","","",67,[[["self"]],["f64"]]],[11,"harmonic_mean","","",67,[[["self"]],["f64"]]],[11,"variance","","",67,[[["self"]],["f64"]]],[11,"std_dev","","",67,[[["self"]],["f64"]]],[11,"population_variance","","",67,[[["self"]],["f64"]]],[11,"population_std_dev","","",67,[[["self"]],["f64"]]],[11,"covariance","","",67,[[["self"],["t"]],["f64"]]],[11,"population_covariance","","",67,[[["self"],["t"]],["f64"]]],[11,"quadratic_mean","","",67,[[["self"]],["f64"]]],[11,"from","","",25,[[["t"]],["t"]]],[11,"into","","",25,[[["self"]],["u"]]],[11,"try_from","","",25,[[["u"]],["result"]]],[11,"borrow","","",25,[[["self"]],["t"]]],[11,"borrow_mut","","",25,[[["self"]],["t"]]],[11,"try_into","","",25,[[["self"]],["result"]]],[11,"get_type_id","","",25,[[["self"]],["typeid"]]],[11,"arity","","",26,[[],["rangeinclusive",["usize"]]]],[11,"from_args","","",26,[[["virtualmachine"],["pyfuncargs"]],["result",["argumenterror"]]]],[11,"from","","",26,[[["t"]],["t"]]],[11,"into","","",26,[[["self"]],["u"]]],[11,"try_from","","",26,[[["u"]],["result"]]],[11,"borrow","","",26,[[["self"]],["t"]]],[11,"borrow_mut","","",26,[[["self"]],["t"]]],[11,"try_into","","",26,[[["self"]],["result"]]],[11,"get_type_id","","",26,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objbuiltinfunc","",29,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",29,[[["self"]],["any"]]],[11,"from","","",29,[[["t"]],["t"]]],[11,"into","","",29,[[["self"]],["u"]]],[11,"try_from","","",29,[[["u"]],["result"]]],[11,"borrow","","",29,[[["self"]],["t"]]],[11,"borrow_mut","","",29,[[["self"]],["t"]]],[11,"try_into","","",29,[[["self"]],["result"]]],[11,"get_type_id","","",29,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objbytearray","",30,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",30,[[["self"]],["any"]]],[11,"from","","",30,[[["t"]],["t"]]],[11,"into","","",30,[[["self"]],["u"]]],[11,"try_from","","",30,[[["u"]],["result"]]],[11,"borrow","","",30,[[["self"]],["t"]]],[11,"borrow_mut","","",30,[[["self"]],["t"]]],[11,"try_into","","",30,[[["self"]],["result"]]],[11,"get_type_id","","",30,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objbytes","",31,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",31,[[["self"]],["any"]]],[11,"from","","",31,[[["t"]],["t"]]],[11,"into","","",31,[[["self"]],["u"]]],[11,"try_from","","",31,[[["u"]],["result"]]],[11,"borrow","","",31,[[["self"]],["t"]]],[11,"borrow_mut","","",31,[[["self"]],["t"]]],[11,"try_into","","",31,[[["self"]],["result"]]],[11,"get_type_id","","",31,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objclassmethod","",32,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",32,[[["self"]],["any"]]],[11,"from","","",32,[[["t"]],["t"]]],[11,"into","","",32,[[["self"]],["u"]]],[11,"to_owned","","",32,[[["self"]],["t"]]],[11,"clone_into","","",32,N],[11,"try_from","","",32,[[["u"]],["result"]]],[11,"borrow","","",32,[[["self"]],["t"]]],[11,"borrow_mut","","",32,[[["self"]],["t"]]],[11,"try_into","","",32,[[["self"]],["result"]]],[11,"get_type_id","","",32,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objcode","",33,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",33,[[["self"]],["any"]]],[11,"from","","",33,[[["t"]],["t"]]],[11,"into","","",33,[[["self"]],["u"]]],[11,"try_from","","",33,[[["u"]],["result"]]],[11,"borrow","","",33,[[["self"]],["t"]]],[11,"borrow_mut","","",33,[[["self"]],["t"]]],[11,"try_into","","",33,[[["self"]],["result"]]],[11,"get_type_id","","",33,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objcomplex","",68,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",68,[[["self"]],["any"]]],[11,"from","","",68,[[["t"]],["t"]]],[11,"into","","",68,[[["self"]],["u"]]],[11,"to_owned","","",68,[[["self"]],["t"]]],[11,"clone_into","","",68,N],[11,"try_from","","",68,[[["u"]],["result"]]],[11,"borrow","","",68,[[["self"]],["t"]]],[11,"borrow_mut","","",68,[[["self"]],["t"]]],[11,"try_into","","",68,[[["self"]],["result"]]],[11,"get_type_id","","",68,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objdict","",34,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",34,[[["self"]],["any"]]],[11,"from","","",34,[[["t"]],["t"]]],[11,"into","","",34,[[["self"]],["u"]]],[11,"try_from","","",34,[[["u"]],["result"]]],[11,"borrow","","",34,[[["self"]],["t"]]],[11,"borrow_mut","","",34,[[["self"]],["t"]]],[11,"try_into","","",34,[[["self"]],["result"]]],[11,"get_type_id","","",34,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objenumerate","",69,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",69,[[["self"]],["any"]]],[11,"from","","",69,[[["t"]],["t"]]],[11,"into","","",69,[[["self"]],["u"]]],[11,"try_from","","",69,[[["u"]],["result"]]],[11,"borrow","","",69,[[["self"]],["t"]]],[11,"borrow_mut","","",69,[[["self"]],["t"]]],[11,"try_into","","",69,[[["self"]],["result"]]],[11,"get_type_id","","",69,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objfilter","",70,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",70,[[["self"]],["any"]]],[11,"from","","",70,[[["t"]],["t"]]],[11,"into","","",70,[[["self"]],["u"]]],[11,"try_from","","",70,[[["u"]],["result"]]],[11,"borrow","","",70,[[["self"]],["t"]]],[11,"borrow_mut","","",70,[[["self"]],["t"]]],[11,"try_into","","",70,[[["self"]],["result"]]],[11,"get_type_id","","",70,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objfloat","",71,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",71,[[["self"]],["any"]]],[11,"from","","",71,[[["t"]],["t"]]],[11,"into","","",71,[[["self"]],["u"]]],[11,"to_owned","","",71,[[["self"]],["t"]]],[11,"clone_into","","",71,N],[11,"try_from","","",71,[[["u"]],["result"]]],[11,"borrow","","",71,[[["self"]],["t"]]],[11,"borrow_mut","","",71,[[["self"]],["t"]]],[11,"try_into","","",71,[[["self"]],["result"]]],[11,"get_type_id","","",71,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objfunction","",35,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",35,[[["self"]],["any"]]],[11,"from","","",35,[[["t"]],["t"]]],[11,"into","","",35,[[["self"]],["u"]]],[11,"try_from","","",35,[[["u"]],["result"]]],[11,"borrow","","",35,[[["self"]],["t"]]],[11,"borrow_mut","","",35,[[["self"]],["t"]]],[11,"try_into","","",35,[[["self"]],["result"]]],[11,"get_type_id","","",35,[[["self"]],["typeid"]]],[11,"into_pyobject","","",36,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",36,[[["self"]],["any"]]],[11,"from","","",36,[[["t"]],["t"]]],[11,"into","","",36,[[["self"]],["u"]]],[11,"try_from","","",36,[[["u"]],["result"]]],[11,"borrow","","",36,[[["self"]],["t"]]],[11,"borrow_mut","","",36,[[["self"]],["t"]]],[11,"try_into","","",36,[[["self"]],["result"]]],[11,"get_type_id","","",36,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objgenerator","",72,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",72,[[["self"]],["any"]]],[11,"from","","",72,[[["t"]],["t"]]],[11,"into","","",72,[[["self"]],["u"]]],[11,"try_from","","",72,[[["u"]],["result"]]],[11,"borrow","","",72,[[["self"]],["t"]]],[11,"borrow_mut","","",72,[[["self"]],["t"]]],[11,"try_into","","",72,[[["self"]],["result"]]],[11,"get_type_id","","",72,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objint","",37,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",37,[[["self"]],["any"]]],[11,"from","","",37,[[["t"]],["t"]]],[11,"into","","",37,[[["self"]],["u"]]],[11,"try_from","","",37,[[["u"]],["result"]]],[11,"borrow","","",37,[[["self"]],["t"]]],[11,"borrow_mut","","",37,[[["self"]],["t"]]],[11,"try_into","","",37,[[["self"]],["result"]]],[11,"get_type_id","","",37,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objlist","",38,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",38,[[["self"]],["any"]]],[11,"from","","",38,[[["t"]],["t"]]],[11,"into","","",38,[[["self"]],["u"]]],[11,"try_from","","",38,[[["u"]],["result"]]],[11,"borrow","","",38,[[["self"]],["t"]]],[11,"borrow_mut","","",38,[[["self"]],["t"]]],[11,"try_into","","",38,[[["self"]],["result"]]],[11,"get_type_id","","",38,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objmap","",73,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",73,[[["self"]],["any"]]],[11,"from","","",73,[[["t"]],["t"]]],[11,"into","","",73,[[["self"]],["u"]]],[11,"try_from","","",73,[[["u"]],["result"]]],[11,"borrow","","",73,[[["self"]],["t"]]],[11,"borrow_mut","","",73,[[["self"]],["t"]]],[11,"try_into","","",73,[[["self"]],["result"]]],[11,"get_type_id","","",73,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objmemory","",74,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",74,[[["self"]],["any"]]],[11,"from","","",74,[[["t"]],["t"]]],[11,"into","","",74,[[["self"]],["u"]]],[11,"try_from","","",74,[[["u"]],["result"]]],[11,"borrow","","",74,[[["self"]],["t"]]],[11,"borrow_mut","","",74,[[["self"]],["t"]]],[11,"try_into","","",74,[[["self"]],["result"]]],[11,"get_type_id","","",74,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objmodule","",40,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",40,[[["self"]],["any"]]],[11,"from","","",40,[[["t"]],["t"]]],[11,"into","","",40,[[["self"]],["u"]]],[11,"to_owned","","",40,[[["self"]],["t"]]],[11,"clone_into","","",40,N],[11,"try_from","","",40,[[["u"]],["result"]]],[11,"borrow","","",40,[[["self"]],["t"]]],[11,"borrow_mut","","",40,[[["self"]],["t"]]],[11,"try_into","","",40,[[["self"]],["result"]]],[11,"get_type_id","","",40,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objnone","",75,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",75,[[["self"]],["any"]]],[11,"from","","",75,[[["t"]],["t"]]],[11,"into","","",75,[[["self"]],["u"]]],[11,"to_owned","","",75,[[["self"]],["t"]]],[11,"clone_into","","",75,N],[11,"try_from","","",75,[[["u"]],["result"]]],[11,"borrow","","",75,[[["self"]],["t"]]],[11,"borrow_mut","","",75,[[["self"]],["t"]]],[11,"try_into","","",75,[[["self"]],["result"]]],[11,"get_type_id","","",75,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objobject","",76,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",76,[[["self"]],["any"]]],[11,"from","","",76,[[["t"]],["t"]]],[11,"into","","",76,[[["self"]],["u"]]],[11,"to_owned","","",76,[[["self"]],["t"]]],[11,"clone_into","","",76,N],[11,"try_from","","",76,[[["u"]],["result"]]],[11,"borrow","","",76,[[["self"]],["t"]]],[11,"borrow_mut","","",76,[[["self"]],["t"]]],[11,"try_into","","",76,[[["self"]],["result"]]],[11,"get_type_id","","",76,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objproperty","",77,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",77,[[["self"]],["any"]]],[11,"from","","",77,[[["t"]],["t"]]],[11,"into","","",77,[[["self"]],["u"]]],[11,"try_from","","",77,[[["u"]],["result"]]],[11,"borrow","","",77,[[["self"]],["t"]]],[11,"borrow_mut","","",77,[[["self"]],["t"]]],[11,"try_into","","",77,[[["self"]],["result"]]],[11,"get_type_id","","",77,[[["self"]],["typeid"]]],[11,"into_pyobject","","",78,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",78,[[["self"]],["any"]]],[11,"from","","",78,[[["t"]],["t"]]],[11,"into","","",78,[[["self"]],["u"]]],[11,"try_from","","",78,[[["u"]],["result"]]],[11,"borrow","","",78,[[["self"]],["t"]]],[11,"borrow_mut","","",78,[[["self"]],["t"]]],[11,"try_into","","",78,[[["self"]],["result"]]],[11,"get_type_id","","",78,[[["self"]],["typeid"]]],[11,"from","","",41,[[["t"]],["t"]]],[11,"into","","",41,[[["self"]],["u"]]],[11,"try_from","","",41,[[["u"]],["result"]]],[11,"borrow","","",41,[[["self"]],["t"]]],[11,"borrow_mut","","",41,[[["self"]],["t"]]],[11,"try_into","","",41,[[["self"]],["result"]]],[11,"get_type_id","","",41,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objrange","",42,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",42,[[["self"]],["any"]]],[11,"from","","",42,[[["t"]],["t"]]],[11,"into","","",42,[[["self"]],["u"]]],[11,"to_owned","","",42,[[["self"]],["t"]]],[11,"clone_into","","",42,N],[11,"try_from","","",42,[[["u"]],["result"]]],[11,"borrow","","",42,[[["self"]],["t"]]],[11,"borrow_mut","","",42,[[["self"]],["t"]]],[11,"try_into","","",42,[[["self"]],["result"]]],[11,"get_type_id","","",42,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objset","",79,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",79,[[["self"]],["any"]]],[11,"from","","",79,[[["t"]],["t"]]],[11,"into","","",79,[[["self"]],["u"]]],[11,"try_from","","",79,[[["u"]],["result"]]],[11,"borrow","","",79,[[["self"]],["t"]]],[11,"borrow_mut","","",79,[[["self"]],["t"]]],[11,"try_into","","",79,[[["self"]],["result"]]],[11,"get_type_id","","",79,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objslice","",44,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",44,[[["self"]],["any"]]],[11,"from","","",44,[[["t"]],["t"]]],[11,"into","","",44,[[["self"]],["u"]]],[11,"try_from","","",44,[[["u"]],["result"]]],[11,"borrow","","",44,[[["self"]],["t"]]],[11,"borrow_mut","","",44,[[["self"]],["t"]]],[11,"try_into","","",44,[[["self"]],["result"]]],[11,"get_type_id","","",44,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objstaticmethod","",45,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",45,[[["self"]],["any"]]],[11,"from","","",45,[[["t"]],["t"]]],[11,"into","","",45,[[["self"]],["u"]]],[11,"to_owned","","",45,[[["self"]],["t"]]],[11,"clone_into","","",45,N],[11,"try_from","","",45,[[["u"]],["result"]]],[11,"borrow","","",45,[[["self"]],["t"]]],[11,"borrow_mut","","",45,[[["self"]],["t"]]],[11,"try_into","","",45,[[["self"]],["result"]]],[11,"get_type_id","","",45,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objstr","",46,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",46,[[["self"]],["any"]]],[11,"to_string","","",46,[[["self"]],["string"]]],[11,"from","","",46,[[["t"]],["t"]]],[11,"into","","",46,[[["self"]],["u"]]],[11,"to_owned","","",46,[[["self"]],["t"]]],[11,"clone_into","","",46,N],[11,"try_from","","",46,[[["u"]],["result"]]],[11,"borrow","","",46,[[["self"]],["t"]]],[11,"borrow_mut","","",46,[[["self"]],["t"]]],[11,"try_into","","",46,[[["self"]],["result"]]],[11,"get_type_id","","",46,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objsuper","",80,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",80,[[["self"]],["any"]]],[11,"from","","",80,[[["t"]],["t"]]],[11,"into","","",80,[[["self"]],["u"]]],[11,"try_from","","",80,[[["u"]],["result"]]],[11,"borrow","","",80,[[["self"]],["t"]]],[11,"borrow_mut","","",80,[[["self"]],["t"]]],[11,"try_into","","",80,[[["self"]],["result"]]],[11,"get_type_id","","",80,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objtuple","",47,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",47,[[["self"]],["any"]]],[11,"from","","",47,[[["t"]],["t"]]],[11,"into","","",47,[[["self"]],["u"]]],[11,"try_from","","",47,[[["u"]],["result"]]],[11,"borrow","","",47,[[["self"]],["t"]]],[11,"borrow_mut","","",47,[[["self"]],["t"]]],[11,"try_into","","",47,[[["self"]],["result"]]],[11,"get_type_id","","",47,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objtype","",48,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",48,[[["self"]],["any"]]],[11,"to_string","","",48,[[["self"]],["string"]]],[11,"from","","",48,[[["t"]],["t"]]],[11,"into","","",48,[[["self"]],["u"]]],[11,"to_owned","","",48,[[["self"]],["t"]]],[11,"clone_into","","",48,N],[11,"try_from","","",48,[[["u"]],["result"]]],[11,"borrow","","",48,[[["self"]],["t"]]],[11,"borrow_mut","","",48,[[["self"]],["t"]]],[11,"try_into","","",48,[[["self"]],["result"]]],[11,"get_type_id","","",48,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objweakref","",49,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",49,[[["self"]],["any"]]],[11,"from","","",49,[[["t"]],["t"]]],[11,"into","","",49,[[["self"]],["u"]]],[11,"try_from","","",49,[[["u"]],["result"]]],[11,"borrow","","",49,[[["self"]],["t"]]],[11,"borrow_mut","","",49,[[["self"]],["t"]]],[11,"try_into","","",49,[[["self"]],["result"]]],[11,"get_type_id","","",49,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::obj::objzip","",81,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",81,[[["self"]],["any"]]],[11,"from","","",81,[[["t"]],["t"]]],[11,"into","","",81,[[["self"]],["u"]]],[11,"try_from","","",81,[[["u"]],["result"]]],[11,"borrow","","",81,[[["self"]],["t"]]],[11,"borrow_mut","","",81,[[["self"]],["t"]]],[11,"try_into","","",81,[[["self"]],["result"]]],[11,"get_type_id","","",81,[[["self"]],["typeid"]]],[11,"from","rustpython_vm::pyobject","",50,[[["t"]],["t"]]],[11,"into","","",50,[[["self"]],["u"]]],[11,"try_from","","",50,[[["u"]],["result"]]],[11,"borrow","","",50,[[["self"]],["t"]]],[11,"borrow_mut","","",50,[[["self"]],["t"]]],[11,"try_into","","",50,[[["self"]],["result"]]],[11,"get_type_id","","",50,[[["self"]],["typeid"]]],[11,"into_pyobject","","",82,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",82,[[["self"]],["any"]]],[11,"from","","",82,[[["t"]],["t"]]],[11,"into","","",82,[[["self"]],["u"]]],[11,"try_from","","",82,[[["u"]],["result"]]],[11,"borrow","","",82,[[["self"]],["t"]]],[11,"borrow_mut","","",82,[[["self"]],["t"]]],[11,"try_into","","",82,[[["self"]],["result"]]],[11,"get_type_id","","",82,[[["self"]],["typeid"]]],[11,"into_pyobject","","",83,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",83,[[["self"]],["any"]]],[11,"from","","",83,[[["t"]],["t"]]],[11,"into","","",83,[[["self"]],["u"]]],[11,"try_from","","",83,[[["u"]],["result"]]],[11,"borrow","","",83,[[["self"]],["t"]]],[11,"borrow_mut","","",83,[[["self"]],["t"]]],[11,"try_into","","",83,[[["self"]],["result"]]],[11,"get_type_id","","",83,[[["self"]],["typeid"]]],[11,"to_string","","",51,[[["self"]],["string"]]],[11,"from","","",51,[[["t"]],["t"]]],[11,"into","","",51,[[["self"]],["u"]]],[11,"try_from","","",51,[[["u"]],["result"]]],[11,"borrow","","",51,[[["self"]],["t"]]],[11,"borrow_mut","","",51,[[["self"]],["t"]]],[11,"try_into","","",51,[[["self"]],["result"]]],[11,"get_type_id","","",51,[[["self"]],["typeid"]]],[11,"arity","","",64,[[],["rangeinclusive",["usize"]]]],[11,"from_args","","",64,[[["virtualmachine"],["pyfuncargs"]],["result",["argumenterror"]]]],[11,"into_pyobject","","",64,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"to_string","","",64,[[["self"]],["string"]]],[11,"from","","",64,[[["t"]],["t"]]],[11,"into","","",64,[[["self"]],["u"]]],[11,"to_owned","","",64,[[["self"]],["t"]]],[11,"clone_into","","",64,N],[11,"try_from","","",64,[[["u"]],["result"]]],[11,"borrow","","",64,[[["self"]],["t"]]],[11,"borrow_mut","","",64,[[["self"]],["t"]]],[11,"try_into","","",64,[[["self"]],["result"]]],[11,"get_type_id","","",64,[[["self"]],["typeid"]]],[11,"arity","","",65,[[],["rangeinclusive",["usize"]]]],[11,"from_args","","",65,[[["virtualmachine"],["pyfuncargs"]],["result",["argumenterror"]]]],[11,"from","","",65,[[["t"]],["t"]]],[11,"into","","",65,[[["self"]],["u"]]],[11,"try_from","","",65,[[["u"]],["result"]]],[11,"borrow","","",65,[[["self"]],["t"]]],[11,"borrow_mut","","",65,[[["self"]],["t"]]],[11,"try_into","","",65,[[["self"]],["result"]]],[11,"get_type_id","","",65,[[["self"]],["typeid"]]],[11,"into_iter","","",84,[[["self"]],["i"]]],[11,"from","","",84,[[["t"]],["t"]]],[11,"into","","",84,[[["self"]],["u"]]],[11,"try_from","","",84,[[["u"]],["result"]]],[11,"borrow","","",84,[[["self"]],["t"]]],[11,"borrow_mut","","",84,[[["self"]],["t"]]],[11,"try_into","","",84,[[["self"]],["result"]]],[11,"get_type_id","","",84,[[["self"]],["typeid"]]],[11,"into_pyobject","","",52,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",52,[[["self"]],["any"]]],[11,"from","","",52,[[["t"]],["t"]]],[11,"into","","",52,[[["self"]],["u"]]],[11,"try_from","","",52,[[["u"]],["result"]]],[11,"borrow","","",52,[[["self"]],["t"]]],[11,"borrow_mut","","",52,[[["self"]],["t"]]],[11,"try_into","","",52,[[["self"]],["result"]]],[11,"get_type_id","","",52,[[["self"]],["typeid"]]],[11,"into_pyobject","rustpython_vm::stdlib::socket","",85,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",85,[[["self"]],["any"]]],[11,"from","","",85,[[["t"]],["t"]]],[11,"into","","",85,[[["self"]],["u"]]],[11,"try_from","","",85,[[["u"]],["result"]]],[11,"borrow","","",85,[[["self"]],["t"]]],[11,"borrow_mut","","",85,[[["self"]],["t"]]],[11,"try_into","","",85,[[["self"]],["result"]]],[11,"get_type_id","","",85,[[["self"]],["typeid"]]],[11,"load_name","rustpython_vm::frame","",20,[[["self"],["virtualmachine"],["str"]],["option",["pyobjectref"]]]],[11,"load_cell","","",20,[[["self"],["virtualmachine"],["str"]],["option",["pyobjectref"]]]],[11,"store_name","","",20,[[["self"],["virtualmachine"],["str"],["pyobjectref"]]]],[11,"delete_name","","",20,[[["self"],["virtualmachine"],["str"]]]],[11,"from_args","rustpython_vm::function","",66,[[["virtualmachine"],["pyfuncargs"]],["result",["argumenterror"]]]],[11,"from_args","","",67,[[["virtualmachine"],["pyfuncargs"]],["result",["argumenterror"]]]],[11,"arity","","",26,[[],["rangeinclusive",["usize"]]]],[11,"from_args","","",26,[[["virtualmachine"],["pyfuncargs"]],["result",["argumenterror"]]]],[11,"into_func","rustpython_vm","",86,[[["self"]],["pynativefunc"]]],[11,"get_id","","",87,[[["self"]],["usize"]]],[11,"get_id","","",88,[[["self"]],["usize"]]],[11,"from_pyobj","rustpython_vm::pyobject","",64,[[["pyobjectref"]],["self"]]],[11,"type_ref","rustpython_vm","",87,[[["self"]],["pyobjectref"]]],[11,"type_ref","","",88,[[["self"]],["pyobjectref"]]],[11,"type_ref","rustpython_vm::pyobject","",51,[[["self"]],["pyobjectref"]]],[11,"get_attr","rustpython_vm","",88,[[["self"],["str"]],["option",["pyobjectref"]]]],[11,"has_attr","","",88,[[["self"],["str"]],["bool"]]],[11,"contains_key","","",88,[[["self"],["str"]],["bool"]]],[11,"get_item","","",88,[[["self"],["str"]],["option",["pyobjectref"]]]],[11,"get_key_value_pairs","","",88,[[["self"]],["vec"]]],[11,"set_item","","",88,[[["self"],["pycontext"],["str"],["pyobjectref"]]]],[11,"del_item","","",88,[[["self"],["str"]]]],[11,"readonly","","",88,[[["self"]],["bool"]]],[11,"try_into_ref","rustpython_vm::pyobject","",64,[[["self"],["virtualmachine"]],["pyresult",["pyref"]]]],[11,"try_into_ref","rustpython_vm","",88,[[["self"],["virtualmachine"]],["pyresult",["pyref"]]]],[11,"try_from_object","rustpython_vm::pyobject","",64,[[["virtualmachine"],["pyobjectref"]],["pyresult"]]],[11,"try_from_object","","",65,[[["virtualmachine"],["pyobjectref"]],["pyresult"]]],[11,"try_from_object","rustpython_vm","",88,[[["virtualmachine"],["pyobjectref"]],["pyresult"]]],[11,"into_pyobject","rustpython_vm::pyobject","",64,[[["self"],["virtualmachine"]],["pyresult"]]],[11,"into_pyobject","rustpython_vm","",88,[[["self"],["virtualmachine"]],["pyresult"]]],[11,"into_pyobject","","",89,[[["self"],["virtualmachine"]],["pyresult"]]],[11,"class","rustpython_vm::frame","",21,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objbuiltinfunc","",29,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objbytearray","",30,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objbytes","",31,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objclassmethod","",32,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objcode","",33,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objcomplex","",68,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objdict","",34,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objenumerate","",69,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objfilter","",70,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objfloat","",71,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objfunction","",35,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","","",36,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objgenerator","",72,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objint","",37,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objlist","",38,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objmap","",73,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objmemory","",74,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objmodule","",40,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objnone","",75,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objobject","",76,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objproperty","",77,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","","",78,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objrange","",42,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objset","",79,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objslice","",44,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objstaticmethod","",45,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objstr","",46,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objsuper","",80,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objtuple","",47,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objtype","",48,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objweakref","",49,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::obj::objzip","",81,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::pyobject","",82,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","","",83,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","","",52,[[["virtualmachine"]],["pyobjectref"]]],[11,"class","rustpython_vm::stdlib::socket","",85,[[["virtualmachine"]],["pyobjectref"]]],[11,"next","rustpython_vm::pyobject","",84,[[["self"]],["option"]]],[11,"eq","rustpython_vm::bytecode","",1,[[["self"],["codeobject"]],["bool"]]],[11,"ne","","",1,[[["self"],["codeobject"]],["bool"]]],[11,"eq","","",9,[[["self"],["functionoparg"]],["bool"]]],[11,"ne","","",9,[[["self"],["functionoparg"]],["bool"]]],[11,"eq","","",2,[[["self"],["instruction"]],["bool"]]],[11,"ne","","",2,[[["self"],["instruction"]],["bool"]]],[11,"eq","","",3,[[["self"],["calltype"]],["bool"]]],[11,"ne","","",3,[[["self"],["calltype"]],["bool"]]],[11,"eq","","",4,[[["self"],["constant"]],["bool"]]],[11,"ne","","",4,[[["self"],["constant"]],["bool"]]],[11,"eq","","",5,[[["self"],["comparisonoperator"]],["bool"]]],[11,"eq","","",6,[[["self"],["binaryoperator"]],["bool"]]],[11,"eq","","",7,[[["self"],["unaryoperator"]],["bool"]]],[11,"eq","","",8,[[["self"],["varargs"]],["bool"]]],[11,"ne","","",8,[[["self"],["varargs"]],["bool"]]],[11,"eq","rustpython_vm::format","",13,[[["self"],["formatalign"]],["bool"]]],[11,"eq","","",14,[[["self"],["formatsign"]],["bool"]]],[11,"eq","","",15,[[["self"],["formatgrouping"]],["bool"]]],[11,"eq","","",16,[[["self"],["formattype"]],["bool"]]],[11,"eq","","",19,[[["self"],["formatspec"]],["bool"]]],[11,"ne","","",19,[[["self"],["formatspec"]],["bool"]]],[11,"eq","","",17,[[["self"],["formatparseerror"]],["bool"]]],[11,"eq","","",18,[[["self"],["formatpart"]],["bool"]]],[11,"ne","","",18,[[["self"],["formatpart"]],["bool"]]],[11,"eq","","",12,[[["self"],["formatstring"]],["bool"]]],[11,"ne","","",12,[[["self"],["formatstring"]],["bool"]]],[11,"eq","rustpython_vm::obj::objcomplex","",68,[[["self"],["pycomplex"]],["bool"]]],[11,"ne","","",68,[[["self"],["pycomplex"]],["bool"]]],[11,"eq","rustpython_vm::obj::objfloat","",71,[[["self"],["pyfloat"]],["bool"]]],[11,"ne","","",71,[[["self"],["pyfloat"]],["bool"]]],[11,"into_iter","rustpython_vm::function","",67,N],[11,"default","","",24,[[],["pyfuncargs"]]],[11,"default","rustpython_vm::obj::objdict","",34,[[],["pydict"]]],[11,"default","rustpython_vm::obj::objlist","",38,[[],["pylist"]]],[11,"default","rustpython_vm::obj::objset","",79,[[],["pyset"]]],[11,"default","rustpython_vm::obj::objtuple","",47,[[],["pytuple"]]],[11,"default","rustpython_vm::pyobject","",50,[[],["self"]]],[11,"default","rustpython_vm","",0,[[],["self"]]],[11,"cmp","rustpython_vm::bytecode","",9,[[["self"],["functionoparg"]],["ordering"]]],[11,"clone","","",1,[[["self"]],["codeobject"]]],[11,"clone","","",9,[[["self"]],["functionoparg"]]],[11,"clone","","",2,[[["self"]],["instruction"]]],[11,"clone","","",3,[[["self"]],["calltype"]]],[11,"clone","","",4,[[["self"]],["constant"]]],[11,"clone","","",5,[[["self"]],["comparisonoperator"]]],[11,"clone","","",6,[[["self"]],["binaryoperator"]]],[11,"clone","","",7,[[["self"]],["unaryoperator"]]],[11,"clone","","",8,[[["self"]],["varargs"]]],[11,"clone","rustpython_vm::format","",13,[[["self"]],["formatalign"]]],[11,"clone","","",14,[[["self"]],["formatsign"]]],[11,"clone","rustpython_vm::frame","",20,[[["self"]],["scope"]]],[11,"clone","rustpython_vm::function","",24,[[["self"]],["pyfuncargs"]]],[11,"clone","rustpython_vm::obj::objclassmethod","",32,[[["self"]],["pyclassmethod"]]],[11,"clone","rustpython_vm::obj::objcomplex","",68,[[["self"]],["pycomplex"]]],[11,"clone","rustpython_vm::obj::objfloat","",71,[[["self"]],["pyfloat"]]],[11,"clone","rustpython_vm::obj::objmodule","",40,[[["self"]],["pymodule"]]],[11,"clone","rustpython_vm::obj::objnone","",75,[[["self"]],["pynone"]]],[11,"clone","rustpython_vm::obj::objobject","",76,[[["self"]],["pyinstance"]]],[11,"clone","rustpython_vm::obj::objrange","",42,[[["self"]],["pyrange"]]],[11,"clone","rustpython_vm::obj::objstaticmethod","",45,[[["self"]],["pystaticmethod"]]],[11,"clone","rustpython_vm::obj::objstr","",46,[[["self"]],["pystring"]]],[11,"clone","rustpython_vm::obj::objtype","",48,[[["self"]],["pyclass"]]],[11,"clone","rustpython_vm::pyobject","",64,[[["self"]],["pyref"]]],[11,"extend","rustpython_vm::bytecode","",9,[[["self"],["t"]]]],[11,"from","","",8,[[["varargs"]],["varargs"]]],[11,"from","","",8,[[["varargs"]],["varargs"]]],[11,"from","rustpython_vm::function","",24,[[["vec",["pyobjectref"]]],["self"]]],[11,"from","","",24,[[["pyobjectref"]],["self"]]],[11,"from","","",25,[[["pyobjectref"]],["self"]]],[11,"from","rustpython_vm::obj::objcomplex","",68,[[["complex64"]],["self"]]],[11,"from","rustpython_vm::obj::objfloat","",71,[[["f64"]],["self"]]],[11,"from","rustpython_vm::obj::objlist","",38,[[["vec",["pyobjectref"]]],["self"]]],[11,"from","rustpython_vm::obj::objtuple","",47,[[["vec",["pyobjectref"]]],["self"]]],[11,"partial_cmp","rustpython_vm::bytecode","",9,[[["self"],["functionoparg"]],["option",["ordering"]]]],[11,"lt","","",9,[[["self"],["functionoparg"]],["bool"]]],[11,"le","","",9,[[["self"],["functionoparg"]],["bool"]]],[11,"gt","","",9,[[["self"],["functionoparg"]],["bool"]]],[11,"ge","","",9,[[["self"],["functionoparg"]],["bool"]]],[11,"fmt","","",9,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",9,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",2,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",3,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",4,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",5,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",6,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",7,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",8,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",1,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::error","",11,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::format","",13,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",14,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",15,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",16,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",19,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",17,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",18,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",12,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::frame","",20,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",21,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::function","",24,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objbuiltinfunc","",29,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objbytearray","",30,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objbytes","",31,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objclassmethod","",32,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objcode","",33,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objcomplex","",68,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objdict","",34,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objenumerate","",69,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objfilter","",70,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objfloat","",71,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objfunction","",35,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",36,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objgenerator","",72,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objint","",37,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objlist","",38,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objmap","",73,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objmemory","",74,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objmodule","",40,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objnone","",75,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objobject","",76,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objproperty","",77,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",78,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objrange","",42,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objset","",79,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objslice","",44,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objstaticmethod","",45,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objstr","",46,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objsuper","",80,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objtuple","",47,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objtype","",48,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objweakref","",49,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objzip","",81,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::pyobject","",50,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",82,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",83,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",64,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",51,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",52,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::stdlib::socket","",85,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::bytecode","",1,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",4,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::error","",11,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objstr","",46,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::obj::objtype","",48,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::pyobject","",51,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",64,[[["self"],["formatter"]],["result"]]],[11,"fmt","rustpython_vm::bytecode","",9,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",9,[[["self"],["formatter"]],["result"]]],[11,"fmt","","",9,[[["self"],["formatter"]],["result"]]],[11,"hash","","",9,N],[11,"sub","","Returns the set difference of the two sets of flags.",9,[[["self"],["functionoparg"]],["functionoparg"]]],[11,"sub_assign","","Disables all flags enabled in the set.",9,[[["self"],["functionoparg"]]]],[11,"not","","Returns the complement of this set of flags.",9,[[["self"]],["functionoparg"]]],[11,"bitand","","Returns the intersection between the two sets of flags.",9,[[["self"],["functionoparg"]],["functionoparg"]]],[11,"bitor","","Returns the union of the two sets of flags.",9,[[["self"],["functionoparg"]],["functionoparg"]]],[11,"bitxor","","Returns the left flags, but with all the right flags…",9,[[["self"],["functionoparg"]],["functionoparg"]]],[11,"bitand_assign","","Disables all flags disabled in the set.",9,[[["self"],["functionoparg"]]]],[11,"bitor_assign","","Adds the set of flags.",9,[[["self"],["functionoparg"]]]],[11,"bitxor_assign","","Toggles the set of flags.",9,[[["self"],["functionoparg"]]]],[11,"deref","rustpython_vm::obj::objbytes","",31,N],[11,"deref","rustpython_vm::pyobject","",64,[[["self"]],["t"]]],[11,"from_iter","rustpython_vm::bytecode","",9,[[["t"]],["functionoparg"]]],[11,"from_str","rustpython_vm::format","",19,[[["str"]],["result"]]],[11,"from_str","","",12,[[["str"]],["result"]]],[11,"source","rustpython_vm::error","",11,[[["self"]],["option",["error"]]]]],"paths":[[3,"VirtualMachine"],[3,"CodeObject"],[4,"Instruction"],[4,"CallType"],[4,"Constant"],[4,"ComparisonOperator"],[4,"BinaryOperator"],[4,"UnaryOperator"],[4,"Varargs"],[3,"FunctionOpArg"],[4,"Mode"],[4,"CompileError"],[3,"FormatString"],[4,"FormatAlign"],[4,"FormatSign"],[4,"FormatGrouping"],[4,"FormatType"],[4,"FormatParseError"],[4,"FormatPart"],[3,"FormatSpec"],[3,"Scope"],[3,"Frame"],[4,"ExecutionResult"],[8,"NameProtocol"],[3,"PyFuncArgs"],[4,"ArgumentError"],[4,"OptionalArg"],[8,"FromArgs"],[8,"IntoPyNativeFunc"],[3,"PyBuiltinFunction"],[3,"PyByteArray"],[3,"PyBytes"],[3,"PyClassMethod"],[3,"PyCode"],[3,"PyDict"],[3,"PyFunction"],[3,"PyMethod"],[3,"PyInt"],[3,"PyList"],[6,"PyListRef"],[3,"PyModule"],[3,"PropertyBuilder"],[3,"PyRange"],[8,"PySliceableSequence"],[3,"PySlice"],[3,"PyStaticMethod"],[3,"PyString"],[3,"PyTuple"],[3,"PyClass"],[3,"PyWeak"],[3,"PyContext"],[3,"PyObject"],[3,"PyIteratorValue"],[8,"IdProtocol"],[8,"FromPyObjectRef"],[8,"TypeProtocol"],[8,"AttributeProtocol"],[8,"DictProtocol"],[8,"BufferProtocol"],[8,"TryIntoRef"],[8,"TryFromObject"],[8,"IntoPyObject"],[8,"PyValue"],[8,"PyObjectPayload"],[3,"PyRef"],[3,"PyIterable"],[3,"KwArgs"],[3,"Args"],[3,"PyComplex"],[3,"PyEnumerate"],[3,"PyFilter"],[3,"PyFloat"],[3,"PyGenerator"],[3,"PyMap"],[3,"PyMemoryView"],[3,"PyNone"],[3,"PyInstance"],[3,"PyReadOnlyProperty"],[3,"PyProperty"],[3,"PySet"],[3,"PySuper"],[3,"PyZip"],[3,"PyNotImplemented"],[3,"PyEllipsis"],[3,"PyIterator"],[3,"Socket"],[6,"PyNativeFunc"],[6,"PyClassRef"],[6,"PyObjectRef"],[6,"PyResult"]]}; +searchIndex["rustpython_wasm"]={"doc":"","items":[[5,"setup_console_error","rustpython_wasm","",N,[[]]],[5,"eval_py","","Evaluate Python code",N,[[["string"],["option",["object"]]],["result",["jsvalue","jsvalue"]]]],[0,"browser_module","","",N,N],[3,"PyPromise","rustpython_wasm::browser_module","",N,N],[5,"get_promise_value","","",N,[[["pyobjectref"]],["promise"]]],[5,"import_promise_type","","",N,[[["virtualmachine"]],["pyresult"]]],[5,"make_module","","",N,[[["pycontext"]],["pyobjectref"]]],[5,"setup_browser_module","","",N,[[["virtualmachine"]]]],[11,"new_obj","","",0,[[["pyobjectref"],["promise"]],["pyobjectref"]]],[0,"convert","rustpython_wasm","",N,N],[5,"py_err_to_js_err","rustpython_wasm::convert","",N,[[["virtualmachine"],["pyobjectref"]],["jsvalue"]]],[5,"js_py_typeerror","","",N,[[["virtualmachine"],["jsvalue"]],["pyobjectref"]]],[5,"py_to_js","","",N,[[["virtualmachine"],["pyobjectref"]],["jsvalue"]]],[5,"object_entries","","",N,N],[5,"pyresult_to_jsresult","","",N,[[["virtualmachine"],["pyresult"]],["result",["jsvalue","jsvalue"]]]],[5,"js_to_py","","",N,[[["virtualmachine"],["jsvalue"]],["pyobjectref"]]],[0,"vm_class","rustpython_wasm","",N,N],[3,"VMStore","rustpython_wasm::vm_class","",N,N],[3,"WASMVirtualMachine","","",N,N],[8,"HeldRcInner","","",N,N],[11,"init","","",1,[[["string"],["option",["bool"]]],["wasmvirtualmachine"]]],[11,"get","","",1,[[["string"]],["jsvalue"]]],[11,"destroy","","",1,[[["string"]]]],[11,"ids","","",1,[[],["vec",["jsvalue"]]]],[11,"valid","","",2,[[["self"]],["bool"]]],[11,"assert_valid","","",2,[[["self"]],["result",["jsvalue"]]]],[11,"destroy","","",2,[[["self"]],["result",["jsvalue"]]]],[11,"add_to_scope","","",2,[[["self"],["string"],["jsvalue"]],["result",["jsvalue"]]]],[11,"set_stdout","","",2,[[["self"],["jsvalue"]],["result",["jsvalue"]]]],[11,"inject_module","","",2,[[["self"],["string"],["object"]],["result",["jsvalue"]]]],[11,"exec","","",2,[[["self"],["string"]],["result",["jsvalue","jsvalue"]]]],[11,"eval","","",2,[[["self"],["string"]],["result",["jsvalue","jsvalue"]]]],[11,"exec_single","","",2,[[["self"],["string"]],["result",["jsvalue","jsvalue"]]]],[0,"wasm_builtins","rustpython_wasm","Builtin function specific to WASM build.",N,N],[5,"format_print_args","rustpython_wasm::wasm_builtins","",N,[[["virtualmachine"],["pyfuncargs"]],["result",["string","pyobjectref"]]]],[5,"builtin_print_console","","",N,[[["virtualmachine"],["pyfuncargs"]],["pyresult"]]],[11,"from","rustpython_wasm::browser_module","",0,[[["t"]],["t"]]],[11,"into","","",0,[[["self"]],["u"]]],[11,"try_from","","",0,[[["u"]],["result"]]],[11,"borrow","","",0,[[["self"]],["t"]]],[11,"borrow_mut","","",0,[[["self"]],["t"]]],[11,"try_into","","",0,[[["self"]],["result"]]],[11,"get_type_id","","",0,[[["self"]],["typeid"]]],[11,"into_pyobject","","",0,[[["self"],["virtualmachine"]],["result",["rc","rc"]]]],[11,"as_any","","",0,[[["self"]],["any"]]],[11,"from","rustpython_wasm::vm_class","",1,[[["t"]],["t"]]],[11,"into","","",1,[[["self"]],["u"]]],[11,"try_from","","",1,[[["u"]],["result"]]],[11,"borrow","","",1,[[["self"]],["t"]]],[11,"borrow_mut","","",1,[[["self"]],["t"]]],[11,"try_into","","",1,[[["self"]],["result"]]],[11,"get_type_id","","",1,[[["self"]],["typeid"]]],[11,"return_abi","","",1,N],[11,"from","","",2,[[["t"]],["t"]]],[11,"into","","",2,[[["self"]],["u"]]],[11,"to_owned","","",2,[[["self"]],["t"]]],[11,"clone_into","","",2,N],[11,"try_from","","",2,[[["u"]],["result"]]],[11,"borrow","","",2,[[["self"]],["t"]]],[11,"borrow_mut","","",2,[[["self"]],["t"]]],[11,"try_into","","",2,[[["self"]],["result"]]],[11,"get_type_id","","",2,[[["self"]],["typeid"]]],[11,"return_abi","","",2,N],[11,"clone","","",2,[[["self"]],["wasmvirtualmachine"]]],[11,"fmt","rustpython_wasm::browser_module","",0,[[["self"],["formatter"]],["result"]]],[11,"from_abi","rustpython_wasm::vm_class","",1,[[["u32"],["stack"]],["self"]]],[11,"from_abi","","",2,[[["u32"],["stack"]],["self"]]],[11,"describe","","",1,[[]]],[11,"describe","","",2,[[]]],[11,"into_abi","","",1,[[["self"],["stack"]],["u32"]]],[11,"into_abi","","",2,[[["self"],["stack"]],["u32"]]],[11,"ref_from_abi","","",1,N],[11,"ref_from_abi","","",2,N],[11,"ref_mut_from_abi","","",1,N],[11,"ref_mut_from_abi","","",2,N],[11,"class","rustpython_wasm::browser_module","",0,[[["virtualmachine"]],["pyobjectref"]]]],"paths":[[3,"PyPromise"],[3,"VMStore"],[3,"WASMVirtualMachine"]]}; +initSearch(searchIndex);addSearchOptions(searchIndex); diff --git a/settings.css b/settings.css index 11fbf77..4201b26 100644 --- a/settings.css +++ b/settings.css @@ -1,12 +1 @@ -/*! - * Copyright 2018 The Rust Project Developers. See the COPYRIGHT - * file at the top-level directory of this distribution and at - * http://rust-lang.org/COPYRIGHT. - * - * Licensed under the Apache License, Version 2.0 or the MIT license - * , at your - * option. This file may not be copied, modified, or distributed - * except according to those terms. - */ .setting-line{padding:5px;}.setting-line>div{max-width:calc(100% - 74px);display:inline-block;vertical-align:top;font-size:17px;padding-top:2px;}.toggle{position:relative;display:inline-block;width:45px;height:27px;margin-right:20px;}.toggle input{display:none;}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.3s;transition:.3s;}.slider:before{position:absolute;content:"";height:19px;width:19px;left:4px;bottom:4px;background-color:white;-webkit-transition:.3s;transition:.3s;}input:checked+.slider{background-color:#2196F3;}input:focus+.slider{box-shadow:0 0 1px #2196F3;}input:checked+.slider:before{-webkit-transform:translateX(19px);-ms-transform:translateX(19px);transform:translateX(19px);} \ No newline at end of file diff --git a/settings.html b/settings.html index a244e38..8e51b0d 100644 --- a/settings.html +++ b/settings.html @@ -1 +1 @@ -Rustdoc settings

    Rustdoc settings

    Auto-hide item declarations.
    Auto-hide item attributes.
    Auto-hide trait implementations documentation
    Auto-hide item methods' documentation
    Directly go to item in search if there is only one result
    Show line numbers on code examples
    \ No newline at end of file +Rustdoc settings

    Rustdoc settings

    Auto-hide item declarations.
    Auto-hide item attributes.
    Auto-hide trait implementations documentation
    Auto-hide item methods' documentation
    Directly go to item in search if there is only one result
    Show line numbers on code examples
    \ No newline at end of file diff --git a/settings.js b/settings.js index ff9ce17..cfed84c 100644 --- a/settings.js +++ b/settings.js @@ -1,11 +1 @@ -/*! - * Copyright 2018 The Rust Project Developers. See the COPYRIGHT - * file at the top-level directory of this distribution and at - * http://rust-lang.org/COPYRIGHT. - * - * Licensed under the Apache License, Version 2.0 or the MIT license - * , at your - * option. This file may not be copied, modified, or distributed - * except according to those terms. - */(function(){function changeSetting(settingName,isEnabled){updateLocalStorage('rustdoc-'+settingName,isEnabled);}function getSettingValue(settingName){return getCurrentValue('rustdoc-'+settingName);}function setEvents(){var elems=document.getElementsByClassName("slider");if(!elems||elems.length===0){return;}for(var i=0;i or the MIT license - * , at your - * option. This file may not be copied, modified, or distributed - * except according to those terms. - */function getCurrentFilePath(){var parts=window.location.pathname.split("/");var rootPathParts=window.rootPath.split("/");for(var i=0;i"){sidebar.style.left="";this.style.left="";child.innerText="<";updateLocalStorage("rustdoc-source-sidebar-show","true");}else{sidebar.style.left="-300px";this.style.left="0";child.innerText=">";updateLocalStorage("rustdoc-source-sidebar-show","false");}}function createSidebarToggle(){var sidebarToggle=document.createElement("div");sidebarToggle.id="sidebar-toggle";sidebarToggle.onclick=toggleSidebar;var inner1=document.createElement("div");inner1.style.position="relative";var inner2=document.createElement("div");inner2.style.marginTop="-2px";if(getCurrentValue("rustdoc-source-sidebar-show")==="true"){inner2.innerText="<";}else{inner2.innerText=">";sidebarToggle.style.left="0";}inner1.appendChild(inner2);sidebarToggle.appendChild(inner1);return sidebarToggle;}function createSourceSidebar(){if(window.rootPath.endsWith("/")===false){window.rootPath+="/";}var main=document.getElementById("main");var sidebarToggle=createSidebarToggle();main.insertBefore(sidebarToggle,main.firstChild);var sidebar=document.createElement("div");sidebar.id="source-sidebar";if(getCurrentValue("rustdoc-source-sidebar-show")!=="true"){sidebar.style.left="-300px";}var currentFile=getCurrentFilePath();var hasFoundFile=false;var title=document.createElement("div");title.className="title";title.innerText="Files";sidebar.appendChild(title);Object.keys(sourcesIndex).forEach(function(key){sourcesIndex[key].name=key;hasFoundFile=createDirEntry(sourcesIndex[key],sidebar,"",currentFile,hasFoundFile);});main.insertBefore(sidebar,main.firstChild);}createSourceSidebar(); \ No newline at end of file +function getCurrentFilePath(){var parts=window.location.pathname.split("/");var rootPathParts=window.rootPath.split("/");for(var i=0;i"){sidebar.style.left="";this.style.left="";child.innerText="<";updateLocalStorage("rustdoc-source-sidebar-show","true");}else{sidebar.style.left="-300px";this.style.left="0";child.innerText=">";updateLocalStorage("rustdoc-source-sidebar-show","false");}}function createSidebarToggle(){var sidebarToggle=document.createElement("div");sidebarToggle.id="sidebar-toggle";sidebarToggle.onclick=toggleSidebar;var inner1=document.createElement("div");inner1.style.position="relative";var inner2=document.createElement("div");inner2.style.marginTop="-2px";if(getCurrentValue("rustdoc-source-sidebar-show")==="true"){inner2.innerText="<";}else{inner2.innerText=">";sidebarToggle.style.left="0";}inner1.appendChild(inner2);sidebarToggle.appendChild(inner1);return sidebarToggle;}function createSourceSidebar(){if(window.rootPath.endsWith("/")===false){window.rootPath+="/";}var main=document.getElementById("main");var sidebarToggle=createSidebarToggle();main.insertBefore(sidebarToggle,main.firstChild);var sidebar=document.createElement("div");sidebar.id="source-sidebar";if(getCurrentValue("rustdoc-source-sidebar-show")!=="true"){sidebar.style.left="-300px";}var currentFile=getCurrentFilePath();var hasFoundFile=false;var title=document.createElement("div");title.className="title";title.innerText="Files";sidebar.appendChild(title);Object.keys(sourcesIndex).forEach(function(key){sourcesIndex[key].name=key;hasFoundFile=createDirEntry(sourcesIndex[key],sidebar,"",currentFile,hasFoundFile);});main.insertBefore(sidebar,main.firstChild);}createSourceSidebar(); \ No newline at end of file diff --git a/src/rustpython/main.rs.html b/src/rustpython/main.rs.html index c53f6d6..7e0211b 100644 --- a/src/rustpython/main.rs.html +++ b/src/rustpython/main.rs.html @@ -1,4 +1,4 @@ -main.rs.html -- source
      1
    +main.rs.html -- source
      1
       2
       3
       4
    @@ -222,6 +222,14 @@
     222
     223
     224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
     
     #[macro_use]
     extern crate clap;
    @@ -235,13 +243,8 @@
     use clap::{App, Arg};
     use rustpython_parser::error::ParseError;
     use rustpython_vm::{
    -    compile,
    -    error::CompileError,
    -    import,
    -    obj::objstr,
    -    print_exception,
    -    pyobject::{AttributeProtocol, PyObjectRef, PyResult},
    -    util, VirtualMachine,
    +    compile, error::CompileError, frame::Scope, import, obj::objstr, print_exception,
    +    pyobject::PyResult, util, VirtualMachine,
     };
     use rustyline::{error::ReadlineError, Editor};
     use std::path::{Path, PathBuf};
    @@ -275,26 +278,26 @@
             .get_matches();
     
         // Construct vm:
    -    let mut vm = VirtualMachine::new();
    +    let vm = VirtualMachine::new();
     
         // Figure out if a -c option was given:
         let result = if let Some(command) = matches.value_of("c") {
    -        run_command(&mut vm, command.to_string())
    +        run_command(&vm, command.to_string())
         } else if let Some(module) = matches.value_of("m") {
    -        run_module(&mut vm, module)
    +        run_module(&vm, module)
         } else {
             // Figure out if a script was passed:
             match matches.value_of("script") {
    -            None => run_shell(&mut vm),
    -            Some(filename) => run_script(&mut vm, filename),
    +            None => run_shell(&vm),
    +            Some(filename) => run_script(&vm, filename),
             }
         };
     
         // See if any exception leaked out:
    -    handle_exception(&mut vm, result);
    +    handle_exception(&vm, result);
     }
     
    -fn _run_string(vm: &mut VirtualMachine, source: &str, source_path: String) -> PyResult {
    +fn _run_string(vm: &VirtualMachine, source: &str, source_path: String) -> PyResult {
         let code_obj = compile::compile(
             source,
             &compile::Mode::Exec,
    @@ -306,19 +309,18 @@
             vm.new_exception(syntax_error, err.to_string())
         })?;
         // trace!("Code object: {:?}", code_obj.borrow());
    -    let builtins = vm.get_builtin_scope();
    -    let vars = vm.context().new_scope(Some(builtins)); // Keep track of local variables
    +    let vars = vm.ctx.new_scope(); // Keep track of local variables
         vm.run_code_obj(code_obj, vars)
     }
     
    -fn handle_exception(vm: &mut VirtualMachine, result: PyResult) {
    +fn handle_exception(vm: &VirtualMachine, result: PyResult) {
         if let Err(err) = result {
             print_exception(vm, &err);
             std::process::exit(1);
         }
     }
     
    -fn run_command(vm: &mut VirtualMachine, mut source: String) -> PyResult {
    +fn run_command(vm: &VirtualMachine, mut source: String) -> PyResult {
         debug!("Running command {}", source);
     
         // This works around https://github.com/RustPython/RustPython/issues/17
    @@ -326,13 +328,13 @@
         _run_string(vm, &source, "<stdin>".to_string())
     }
     
    -fn run_module(vm: &mut VirtualMachine, module: &str) -> PyResult {
    +fn run_module(vm: &VirtualMachine, module: &str) -> PyResult {
         debug!("Running module {}", module);
         let current_path = PathBuf::from(".");
         import::import_module(vm, current_path, module)
     }
     
    -fn run_script(vm: &mut VirtualMachine, script_file: &str) -> PyResult {
    +fn run_script(vm: &VirtualMachine, script_file: &str) -> PyResult {
         debug!("Running file {}", script_file);
         // Parse an ast from it:
         let file_path = Path::new(script_file);
    @@ -345,11 +347,7 @@
         }
     }
     
    -fn shell_exec(
    -    vm: &mut VirtualMachine,
    -    source: &str,
    -    scope: PyObjectRef,
    -) -> Result<(), CompileError> {
    +fn shell_exec(vm: &VirtualMachine, source: &str, scope: Scope) -> Result<(), CompileError> {
         match compile::compile(
             source,
             &compile::Mode::Single,
    @@ -388,13 +386,20 @@
         xdg_dirs.place_cache_file("repl_history.txt").unwrap()
     }
     
    -fn run_shell(vm: &mut VirtualMachine) -> PyResult {
    +fn get_prompt(vm: &VirtualMachine, prompt_name: &str) -> String {
    +    vm.get_attribute(vm.sys_module.clone(), prompt_name)
    +        .ok()
    +        .as_ref()
    +        .map(objstr::get_value)
    +        .unwrap_or_else(String::new)
    +}
    +
    +fn run_shell(vm: &VirtualMachine) -> PyResult {
         println!(
             "Welcome to the magnificent Rust Python {} interpreter",
             crate_version!()
         );
    -    let builtins = vm.get_builtin_scope();
    -    let vars = vm.context().new_scope(Some(builtins)); // Keep track of local variables
    +    let vars = vm.ctx.new_scope();
     
         // Read a single line:
         let mut input = String::new();
    @@ -406,25 +411,35 @@
             println!("No previous history.");
         }
     
    -    let ps1 = &objstr::get_value(&vm.sys_module.get_attr("ps1").unwrap());
    -    let ps2 = &objstr::get_value(&vm.sys_module.get_attr("ps2").unwrap());
    -    let mut prompt = ps1;
    +    let mut continuing = false;
     
         loop {
    -        match repl.readline(prompt) {
    +        let prompt = if continuing {
    +            get_prompt(vm, "ps2")
    +        } else {
    +            get_prompt(vm, "ps1")
    +        };
    +        match repl.readline(&prompt) {
                 Ok(line) => {
                     debug!("You entered {:?}", line);
                     input.push_str(&line);
    -                input.push_str("\n");
    -                repl.add_history_entry(line.trim_end().as_ref());
    +                input.push('\n');
    +                repl.add_history_entry(line.trim_end());
    +
    +                if continuing {
    +                    if line.is_empty() {
    +                        continuing = false;
    +                    } else {
    +                        continue;
    +                    }
    +                }
     
                     match shell_exec(vm, &input, vars.clone()) {
                         Err(CompileError::Parse(ParseError::EOF(_))) => {
    -                        prompt = ps2;
    +                        continuing = true;
                             continue;
                         }
                         _ => {
    -                        prompt = ps1;
                             input = String::new();
                         }
                     }
    @@ -432,7 +447,8 @@
                 Err(ReadlineError::Interrupted) => {
                     // TODO: Raise a real KeyboardInterrupt exception
                     println!("^C");
    -                break;
    +                continuing = false;
    +                continue;
                 }
                 Err(ReadlineError::Eof) => {
                     break;
    @@ -448,4 +464,4 @@
         Ok(vm.get_none())
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_derive/lib.rs.html b/src/rustpython_derive/lib.rs.html new file mode 100644 index 0000000..cd92cd0 --- /dev/null +++ b/src/rustpython_derive/lib.rs.html @@ -0,0 +1,99 @@ +lib.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +
    +extern crate proc_macro;
    +
    +use proc_macro::TokenStream;
    +use proc_macro2::TokenStream as TokenStream2;
    +use quote::quote;
    +use syn::{Data, DeriveInput, Fields};
    +
    +#[proc_macro_derive(FromArgs)]
    +pub fn derive_from_args(input: TokenStream) -> TokenStream {
    +    let ast: DeriveInput = syn::parse(input).unwrap();
    +
    +    let gen = impl_from_args(&ast);
    +    gen.to_string().parse().unwrap()
    +}
    +
    +fn impl_from_args(input: &DeriveInput) -> TokenStream2 {
    +    // FIXME: This references types using `crate` instead of `rustpython_vm`
    +    //        so that it can be used in the latter. How can we support both?
    +    let fields = match input.data {
    +        Data::Struct(ref data) => {
    +            match data.fields {
    +                Fields::Named(ref fields) => fields.named.iter().map(|field| {
    +                    let name = &field.ident;
    +                    quote! {
    +                        #name: crate::pyobject::TryFromObject::try_from_object(
    +                            vm,
    +                            args.take_keyword(stringify!(#name)).unwrap_or_else(|| vm.ctx.none())
    +                        )?,
    +                    }
    +                }),
    +                Fields::Unnamed(_) | Fields::Unit => unimplemented!(), // TODO: better error message
    +            }
    +        }
    +        Data::Enum(_) | Data::Union(_) => unimplemented!(), // TODO: better error message
    +    };
    +
    +    let name = &input.ident;
    +    quote! {
    +        impl crate::function::FromArgs for #name {
    +            fn from_args(
    +                vm: &crate::vm::VirtualMachine,
    +                args: &mut crate::function::PyFuncArgs
    +            ) -> Result<Self, crate::function::ArgumentError> {
    +                Ok(#name { #(#fields)* })
    +            }
    +        }
    +    }
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_parser/ast.rs.html b/src/rustpython_parser/ast.rs.html index 3841e93..ea2e26d 100644 --- a/src/rustpython_parser/ast.rs.html +++ b/src/rustpython_parser/ast.rs.html @@ -1,4 +1,4 @@ -ast.rs.html -- source
      1
    +ast.rs.html -- source
      1
       2
       3
       4
    @@ -370,6 +370,52 @@
     370
     371
     372
    +373
    +374
    +375
    +376
    +377
    +378
    +379
    +380
    +381
    +382
    +383
    +384
    +385
    +386
    +387
    +388
    +389
    +390
    +391
    +392
    +393
    +394
    +395
    +396
    +397
    +398
    +399
    +400
    +401
    +402
    +403
    +404
    +405
    +406
    +407
    +408
    +409
    +410
    +411
    +412
    +413
    +414
    +415
    +416
    +417
    +418
     
     //! Implement abstract syntax tree nodes for the python language.
     //!
    @@ -495,6 +541,7 @@
             // docstring: String,
             body: Vec<LocatedStatement>,
             decorator_list: Vec<Expression>,
    +        returns: Option<Expression>,
         },
     }
     
    @@ -590,6 +637,7 @@
         True,
         False,
         None,
    +    Ellipsis,
     }
     
     impl Expression {
    @@ -632,6 +680,7 @@
                 Lambda { .. } => "lambda",
                 IfExpression { .. } => "conditional expression",
                 True | False | None => "keyword",
    +            Ellipsis => "ellipsis",
             }
         }
     }
    @@ -642,14 +691,20 @@
      */
     #[derive(Debug, PartialEq, Default)]
     pub struct Parameters {
    -    pub args: Vec<String>,
    -    pub kwonlyargs: Vec<String>,
    -    pub vararg: Option<Option<String>>, // Optionally we handle optionally named '*args' or '*'
    -    pub kwarg: Option<Option<String>>,
    +    pub args: Vec<Parameter>,
    +    pub kwonlyargs: Vec<Parameter>,
    +    pub vararg: Varargs, // Optionally we handle optionally named '*args' or '*'
    +    pub kwarg: Varargs,
         pub defaults: Vec<Expression>,
         pub kw_defaults: Vec<Option<Expression>>,
     }
     
    +#[derive(Debug, PartialEq, Default)]
    +pub struct Parameter {
    +    pub arg: String,
    +    pub annotation: Option<Box<Expression>>,
    +}
    +
     #[derive(Debug, PartialEq)]
     pub enum ComprehensionKind {
         GeneratorExpression { element: Expression },
    @@ -730,6 +785,17 @@
         Complex { real: f64, imag: f64 },
     }
     
    +/// Transforms a value prior to formatting it.
    +#[derive(Copy, Clone, Debug, PartialEq)]
    +pub enum ConversionFlag {
    +    /// Converts by calling `str(<value>)`.
    +    Str,
    +    /// Converts by calling `ascii(<value>)`.
    +    Ascii,
    +    /// Converts by calling `repr(<value>)`.
    +    Repr,
    +}
    +
     #[derive(Debug, PartialEq)]
     pub enum StringGroup {
         Constant {
    @@ -737,11 +803,37 @@
         },
         FormattedValue {
             value: Box<Expression>,
    +        conversion: Option<ConversionFlag>,
             spec: String,
         },
         Joined {
             values: Vec<StringGroup>,
         },
     }
    +
    +#[derive(Debug, PartialEq)]
    +pub enum Varargs {
    +    None,
    +    Unnamed,
    +    Named(Parameter),
    +}
    +
    +impl Default for Varargs {
    +    fn default() -> Varargs {
    +        Varargs::None
    +    }
    +}
    +
    +impl From<Option<Option<Parameter>>> for Varargs {
    +    fn from(opt: Option<Option<Parameter>>) -> Varargs {
    +        match opt {
    +            Some(inner_opt) => match inner_opt {
    +                Some(param) => Varargs::Named(param),
    +                None => Varargs::Unnamed,
    +            },
    +            None => Varargs::None,
    +        }
    +    }
    +}
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_parser/error.rs.html b/src/rustpython_parser/error.rs.html index b3ada86..a798c0a 100644 --- a/src/rustpython_parser/error.rs.html +++ b/src/rustpython_parser/error.rs.html @@ -1,4 +1,4 @@ -error.rs.html -- source
     1
    +error.rs.html -- source
     1
      2
      3
      4
    @@ -158,4 +158,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_parser/fstring.rs.html b/src/rustpython_parser/fstring.rs.html new file mode 100644 index 0000000..8005554 --- /dev/null +++ b/src/rustpython_parser/fstring.rs.html @@ -0,0 +1,471 @@ +fstring.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    +175
    +176
    +177
    +178
    +179
    +180
    +181
    +182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    +217
    +218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +233
    +234
    +
    +use std::iter;
    +use std::mem;
    +use std::str;
    +
    +use lalrpop_util::ParseError as LalrpopError;
    +
    +use crate::ast::{ConversionFlag, StringGroup};
    +use crate::lexer::{LexicalError, Location, Tok};
    +use crate::parser::parse_expression;
    +
    +use self::FStringError::*;
    +use self::StringGroup::*;
    +
    +// TODO: consolidate these with ParseError
    +#[derive(Debug, PartialEq)]
    +pub enum FStringError {
    +    UnclosedLbrace,
    +    UnopenedRbrace,
    +    InvalidExpression,
    +    InvalidConversionFlag,
    +    EmptyExpression,
    +    MismatchedDelimiter,
    +}
    +
    +impl From<FStringError> for LalrpopError<Location, Tok, LexicalError> {
    +    fn from(_err: FStringError) -> Self {
    +        lalrpop_util::ParseError::User {
    +            error: LexicalError::StringError,
    +        }
    +    }
    +}
    +
    +struct FStringParser<'a> {
    +    chars: iter::Peekable<str::Chars<'a>>,
    +}
    +
    +impl<'a> FStringParser<'a> {
    +    fn new(source: &'a str) -> Self {
    +        Self {
    +            chars: source.chars().peekable(),
    +        }
    +    }
    +
    +    fn parse_formatted_value(&mut self) -> Result<StringGroup, FStringError> {
    +        let mut expression = String::new();
    +        let mut spec = String::new();
    +        let mut delims = Vec::new();
    +        let mut conversion = None;
    +
    +        while let Some(ch) = self.chars.next() {
    +            match ch {
    +                '!' if delims.is_empty() => {
    +                    conversion = Some(match self.chars.next() {
    +                        Some('s') => ConversionFlag::Str,
    +                        Some('a') => ConversionFlag::Ascii,
    +                        Some('r') => ConversionFlag::Repr,
    +                        Some(_) => {
    +                            return Err(InvalidConversionFlag);
    +                        }
    +                        None => {
    +                            break;
    +                        }
    +                    })
    +                }
    +                ':' if delims.is_empty() => {
    +                    while let Some(&next) = self.chars.peek() {
    +                        if next != '}' {
    +                            spec.push(next);
    +                            self.chars.next();
    +                        } else {
    +                            break;
    +                        }
    +                    }
    +                }
    +                '(' | '{' | '[' => {
    +                    expression.push(ch);
    +                    delims.push(ch);
    +                }
    +                ')' => {
    +                    if delims.pop() != Some('(') {
    +                        return Err(MismatchedDelimiter);
    +                    }
    +                    expression.push(ch);
    +                }
    +                ']' => {
    +                    if delims.pop() != Some('[') {
    +                        return Err(MismatchedDelimiter);
    +                    }
    +                    expression.push(ch);
    +                }
    +                '}' if !delims.is_empty() => {
    +                    if delims.pop() != Some('{') {
    +                        return Err(MismatchedDelimiter);
    +                    }
    +                    expression.push(ch);
    +                }
    +                '}' => {
    +                    if expression.is_empty() {
    +                        return Err(EmptyExpression);
    +                    }
    +                    return Ok(FormattedValue {
    +                        value: Box::new(
    +                            parse_expression(expression.trim()).map_err(|_| InvalidExpression)?,
    +                        ),
    +                        conversion,
    +                        spec,
    +                    });
    +                }
    +                '"' | '\'' => {
    +                    expression.push(ch);
    +                    while let Some(next) = self.chars.next() {
    +                        expression.push(next);
    +                        if next == ch {
    +                            break;
    +                        }
    +                    }
    +                }
    +                _ => {
    +                    expression.push(ch);
    +                }
    +            }
    +        }
    +
    +        Err(UnclosedLbrace)
    +    }
    +
    +    fn parse(mut self) -> Result<StringGroup, FStringError> {
    +        let mut content = String::new();
    +        let mut values = vec![];
    +
    +        while let Some(ch) = self.chars.next() {
    +            match ch {
    +                '{' => {
    +                    if let Some('{') = self.chars.peek() {
    +                        self.chars.next();
    +                        content.push('{');
    +                    } else {
    +                        if !content.is_empty() {
    +                            values.push(Constant {
    +                                value: mem::replace(&mut content, String::new()),
    +                            });
    +                        }
    +
    +                        values.push(self.parse_formatted_value()?);
    +                    }
    +                }
    +                '}' => {
    +                    if let Some('}') = self.chars.peek() {
    +                        self.chars.next();
    +                        content.push('}');
    +                    } else {
    +                        return Err(UnopenedRbrace);
    +                    }
    +                }
    +                _ => {
    +                    content.push(ch);
    +                }
    +            }
    +        }
    +
    +        if !content.is_empty() {
    +            values.push(Constant { value: content })
    +        }
    +
    +        Ok(match values.len() {
    +            0 => Constant {
    +                value: String::new(),
    +            },
    +            1 => values.into_iter().next().unwrap(),
    +            _ => Joined { values },
    +        })
    +    }
    +}
    +
    +pub fn parse_fstring(source: &str) -> Result<StringGroup, FStringError> {
    +    FStringParser::new(source).parse()
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use crate::ast;
    +
    +    use super::*;
    +
    +    fn mk_ident(name: &str) -> ast::Expression {
    +        ast::Expression::Identifier {
    +            name: name.to_owned(),
    +        }
    +    }
    +
    +    #[test]
    +    fn test_parse_fstring() {
    +        let source = String::from("{a}{ b }{{foo}}");
    +        let parse_ast = parse_fstring(&source).unwrap();
    +
    +        assert_eq!(
    +            parse_ast,
    +            Joined {
    +                values: vec![
    +                    FormattedValue {
    +                        value: Box::new(mk_ident("a")),
    +                        conversion: None,
    +                        spec: String::new(),
    +                    },
    +                    FormattedValue {
    +                        value: Box::new(mk_ident("b")),
    +                        conversion: None,
    +                        spec: String::new(),
    +                    },
    +                    Constant {
    +                        value: "{foo}".to_owned()
    +                    }
    +                ]
    +            }
    +        );
    +    }
    +
    +    #[test]
    +    fn test_parse_empty_fstring() {
    +        assert_eq!(
    +            parse_fstring(""),
    +            Ok(Constant {
    +                value: String::new(),
    +            }),
    +        );
    +    }
    +
    +    #[test]
    +    fn test_parse_invalid_fstring() {
    +        assert_eq!(parse_fstring("{"), Err(UnclosedLbrace));
    +        assert_eq!(parse_fstring("}"), Err(UnopenedRbrace));
    +        assert_eq!(parse_fstring("{class}"), Err(InvalidExpression));
    +    }
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_parser/lexer.rs.html b/src/rustpython_parser/lexer.rs.html index c8a4ef1..3cad817 100644 --- a/src/rustpython_parser/lexer.rs.html +++ b/src/rustpython_parser/lexer.rs.html @@ -1,4 +1,4 @@ -lexer.rs.html -- source
       1
    +lexer.rs.html -- source
       1
        2
        3
        4
    @@ -1449,14 +1449,6 @@
     1449
     1450
     1451
    -1452
    -1453
    -1454
    -1455
    -1456
    -1457
    -1458
    -1459
     
     //! This module takes care of lexing python source text. This means source
     //! code is translated into separate tokens.
    @@ -1515,6 +1507,7 @@
     pub enum LexicalError {
         StringError,
         NestingError,
    +    UnrecognizedToken { tok: char },
     }
     
     #[derive(Clone, Debug, Default, PartialEq)]
    @@ -2147,7 +2140,9 @@
     
                 match self.chr0 {
                     Some('0'..='9') => return Some(self.lex_number()),
    -                Some('_') | Some('a'..='z') | Some('A'..='Z') => return Some(self.lex_identifier()),
    +                Some('_') | Some('a'..='z') | Some('A'..='Z') => {
    +                    return Some(self.lex_identifier());
    +                }
                     Some('#') => {
                         self.lex_comment();
                         continue;
    @@ -2176,16 +2171,13 @@
                     Some('+') => {
                         let tok_start = self.get_pos();
                         self.next_char();
    -                    match self.chr0 {
    -                        Some('=') => {
    -                            self.next_char();
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::PlusEqual, tok_end)));
    -                        }
    -                        _ => {
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::Plus, tok_end)));
    -                        }
    +                    if let Some('=') = self.chr0 {
    +                        self.next_char();
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::PlusEqual, tok_end)));
    +                    } else {
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::Plus, tok_end)));
                         }
                     }
                     Some('*') => {
    @@ -2249,61 +2241,49 @@
                     Some('%') => {
                         let tok_start = self.get_pos();
                         self.next_char();
    -                    match self.chr0 {
    -                        Some('=') => {
    -                            self.next_char();
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::PercentEqual, tok_end)));
    -                        }
    -                        _ => {
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::Percent, tok_end)));
    -                        }
    +                    if let Some('=') = self.chr0 {
    +                        self.next_char();
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::PercentEqual, tok_end)));
    +                    } else {
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::Percent, tok_end)));
                         }
                     }
                     Some('|') => {
                         let tok_start = self.get_pos();
                         self.next_char();
    -                    match self.chr0 {
    -                        Some('=') => {
    -                            self.next_char();
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::VbarEqual, tok_end)));
    -                        }
    -                        _ => {
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::Vbar, tok_end)));
    -                        }
    +                    if let Some('=') = self.chr0 {
    +                        self.next_char();
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::VbarEqual, tok_end)));
    +                    } else {
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::Vbar, tok_end)));
                         }
                     }
                     Some('^') => {
                         let tok_start = self.get_pos();
                         self.next_char();
    -                    match self.chr0 {
    -                        Some('=') => {
    -                            self.next_char();
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::CircumflexEqual, tok_end)));
    -                        }
    -                        _ => {
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::CircumFlex, tok_end)));
    -                        }
    +                    if let Some('=') = self.chr0 {
    +                        self.next_char();
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::CircumflexEqual, tok_end)));
    +                    } else {
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::CircumFlex, tok_end)));
                         }
                     }
                     Some('&') => {
                         let tok_start = self.get_pos();
                         self.next_char();
    -                    match self.chr0 {
    -                        Some('=') => {
    -                            self.next_char();
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::AmperEqual, tok_end)));
    -                        }
    -                        _ => {
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::Amper, tok_end)));
    -                        }
    +                    if let Some('=') = self.chr0 {
    +                        self.next_char();
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::AmperEqual, tok_end)));
    +                    } else {
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::Amper, tok_end)));
                         }
                     }
                     Some('-') => {
    @@ -2329,16 +2309,13 @@
                     Some('@') => {
                         let tok_start = self.get_pos();
                         self.next_char();
    -                    match self.chr0 {
    -                        Some('=') => {
    -                            self.next_char();
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::AtEqual, tok_end)));
    -                        }
    -                        _ => {
    -                            let tok_end = self.get_pos();
    -                            return Some(Ok((tok_start, Tok::At, tok_end)));
    -                        }
    +                    if let Some('=') = self.chr0 {
    +                        self.next_char();
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::AtEqual, tok_end)));
    +                    } else {
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::At, tok_end)));
                         }
                     }
                     Some('!') => {
    @@ -2468,8 +2445,15 @@
                     Some('.') => {
                         let tok_start = self.get_pos();
                         self.next_char();
    -                    let tok_end = self.get_pos();
    -                    return Some(Ok((tok_start, Tok::Dot, tok_end)));
    +                    if let (Some('.'), Some('.')) = (&self.chr0, &self.chr1) {
    +                        self.next_char();
    +                        self.next_char();
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::Ellipsis, tok_end)));
    +                    } else {
    +                        let tok_end = self.get_pos();
    +                        return Some(Ok((tok_start, Tok::Dot, tok_end)));
    +                    }
                     }
                     Some('\n') => {
                         let tok_start = self.get_pos();
    @@ -2493,7 +2477,7 @@
                     None => return None,
                     _ => {
                         let c = self.next_char();
    -                    panic!("Not impl {:?}", c)
    +                    return Some(Err(LexicalError::UnrecognizedToken { tok: c.unwrap() }));
                     } // Ignore all the rest..
                 }
             }
    @@ -2918,4 +2902,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_parser/lib.rs.html b/src/rustpython_parser/lib.rs.html index fcc012f..a8f05aa 100644 --- a/src/rustpython_parser/lib.rs.html +++ b/src/rustpython_parser/lib.rs.html @@ -1,4 +1,4 @@ -lib.rs.html -- source
     1
    +lib.rs.html -- source
     1
      2
      3
      4
    @@ -8,16 +8,18 @@
      8
      9
     10
    +11
     
     #[macro_use]
     extern crate log;
     
     pub mod ast;
     pub mod error;
    +mod fstring;
     pub mod lexer;
     pub mod parser;
     #[cfg_attr(rustfmt, rustfmt_skip)]
     mod python;
     pub mod token;
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_parser/parser.rs.html b/src/rustpython_parser/parser.rs.html index f80de92..724a6b3 100644 --- a/src/rustpython_parser/parser.rs.html +++ b/src/rustpython_parser/parser.rs.html @@ -1,4 +1,4 @@ -parser.rs.html -- source
      1
    +parser.rs.html -- source
      1
       2
       3
       4
    @@ -488,200 +488,6 @@
     488
     489
     490
    -491
    -492
    -493
    -494
    -495
    -496
    -497
    -498
    -499
    -500
    -501
    -502
    -503
    -504
    -505
    -506
    -507
    -508
    -509
    -510
    -511
    -512
    -513
    -514
    -515
    -516
    -517
    -518
    -519
    -520
    -521
    -522
    -523
    -524
    -525
    -526
    -527
    -528
    -529
    -530
    -531
    -532
    -533
    -534
    -535
    -536
    -537
    -538
    -539
    -540
    -541
    -542
    -543
    -544
    -545
    -546
    -547
    -548
    -549
    -550
    -551
    -552
    -553
    -554
    -555
    -556
    -557
    -558
    -559
    -560
    -561
    -562
    -563
    -564
    -565
    -566
    -567
    -568
    -569
    -570
    -571
    -572
    -573
    -574
    -575
    -576
    -577
    -578
    -579
    -580
    -581
    -582
    -583
    -584
    -585
    -586
    -587
    -588
    -589
    -590
    -591
    -592
    -593
    -594
    -595
    -596
    -597
    -598
    -599
    -600
    -601
    -602
    -603
    -604
    -605
    -606
    -607
    -608
    -609
    -610
    -611
    -612
    -613
    -614
    -615
    -616
    -617
    -618
    -619
    -620
    -621
    -622
    -623
    -624
    -625
    -626
    -627
    -628
    -629
    -630
    -631
    -632
    -633
    -634
    -635
    -636
    -637
    -638
    -639
    -640
    -641
    -642
    -643
    -644
    -645
    -646
    -647
    -648
    -649
    -650
    -651
    -652
    -653
    -654
    -655
    -656
    -657
    -658
    -659
    -660
    -661
    -662
    -663
    -664
    -665
    -666
    -667
    -668
    -669
    -670
    -671
    -672
    -673
    -674
    -675
    -676
    -677
    -678
    -679
    -680
    -681
    -682
    -683
    -684
     
     use std::iter;
     
    @@ -750,180 +556,12 @@
         do_lalr_parsing!(source, Expression, StartExpression)
     }
     
    -// TODO: consolidate these with ParseError
    -#[derive(Debug, PartialEq)]
    -pub enum FStringError {
    -    UnclosedLbrace,
    -    UnopenedRbrace,
    -    InvalidExpression,
    -}
    -
    -impl From<FStringError>
    -    for lalrpop_util::ParseError<lexer::Location, token::Tok, lexer::LexicalError>
    -{
    -    fn from(_err: FStringError) -> Self {
    -        lalrpop_util::ParseError::User {
    -            error: lexer::LexicalError::StringError,
    -        }
    -    }
    -}
    -
    -enum ParseState {
    -    Text {
    -        content: String,
    -    },
    -    FormattedValue {
    -        expression: String,
    -        spec: Option<String>,
    -        depth: usize,
    -    },
    -}
    -
    -pub fn parse_fstring(source: &str) -> Result<ast::StringGroup, FStringError> {
    -    use self::ParseState::*;
    -
    -    let mut values = vec![];
    -    let mut state = ParseState::Text {
    -        content: String::new(),
    -    };
    -
    -    let mut chars = source.chars().peekable();
    -    while let Some(ch) = chars.next() {
    -        state = match state {
    -            Text { mut content } => match ch {
    -                '{' => {
    -                    if let Some('{') = chars.peek() {
    -                        chars.next();
    -                        content.push('{');
    -                        Text { content }
    -                    } else {
    -                        if !content.is_empty() {
    -                            values.push(ast::StringGroup::Constant { value: content });
    -                        }
    -
    -                        FormattedValue {
    -                            expression: String::new(),
    -                            spec: None,
    -                            depth: 0,
    -                        }
    -                    }
    -                }
    -                '}' => {
    -                    if let Some('}') = chars.peek() {
    -                        chars.next();
    -                        content.push('}');
    -                        Text { content }
    -                    } else {
    -                        return Err(FStringError::UnopenedRbrace);
    -                    }
    -                }
    -                _ => {
    -                    content.push(ch);
    -                    Text { content }
    -                }
    -            },
    -
    -            FormattedValue {
    -                mut expression,
    -                mut spec,
    -                depth,
    -            } => match ch {
    -                ':' if depth == 0 => FormattedValue {
    -                    expression,
    -                    spec: Some(String::new()),
    -                    depth,
    -                },
    -                '{' => {
    -                    if let Some('{') = chars.peek() {
    -                        expression.push_str("{{");
    -                        chars.next();
    -                        FormattedValue {
    -                            expression,
    -                            spec,
    -                            depth,
    -                        }
    -                    } else {
    -                        expression.push('{');
    -                        FormattedValue {
    -                            expression,
    -                            spec,
    -                            depth: depth + 1,
    -                        }
    -                    }
    -                }
    -                '}' => {
    -                    if let Some('}') = chars.peek() {
    -                        expression.push_str("}}");
    -                        chars.next();
    -                        FormattedValue {
    -                            expression,
    -                            spec,
    -                            depth,
    -                        }
    -                    } else if depth > 0 {
    -                        expression.push('}');
    -                        FormattedValue {
    -                            expression,
    -                            spec,
    -                            depth: depth - 1,
    -                        }
    -                    } else {
    -                        values.push(ast::StringGroup::FormattedValue {
    -                            value: Box::new(match parse_expression(expression.trim()) {
    -                                Ok(expr) => expr,
    -                                Err(_) => return Err(FStringError::InvalidExpression),
    -                            }),
    -                            spec: spec.unwrap_or_default(),
    -                        });
    -                        Text {
    -                            content: String::new(),
    -                        }
    -                    }
    -                }
    -                _ => {
    -                    if let Some(spec) = spec.as_mut() {
    -                        spec.push(ch)
    -                    } else {
    -                        expression.push(ch);
    -                    }
    -                    FormattedValue {
    -                        expression,
    -                        spec,
    -                        depth,
    -                    }
    -                }
    -            },
    -        };
    -    }
    -
    -    match state {
    -        Text { content } => {
    -            if !content.is_empty() {
    -                values.push(ast::StringGroup::Constant { value: content })
    -            }
    -        }
    -        FormattedValue { .. } => {
    -            return Err(FStringError::UnclosedLbrace);
    -        }
    -    }
    -
    -    Ok(match values.len() {
    -        0 => ast::StringGroup::Constant {
    -            value: String::new(),
    -        },
    -        1 => values.into_iter().next().unwrap(),
    -        _ => ast::StringGroup::Joined { values },
    -    })
    -}
    -
     #[cfg(test)]
     mod tests {
         use super::ast;
         use super::parse_expression;
    -    use super::parse_fstring;
         use super::parse_program;
         use super::parse_statement;
    -    use super::FStringError;
         use num_bigint::BigInt;
     
         #[test]
    @@ -1097,10 +735,19 @@
                     node: ast::Statement::Expression {
                         expression: ast::Expression::Lambda {
                             args: ast::Parameters {
    -                            args: vec![String::from("x"), String::from("y")],
    +                            args: vec![
    +                                ast::Parameter {
    +                                    arg: String::from("x"),
    +                                    annotation: None,
    +                                },
    +                                ast::Parameter {
    +                                    arg: String::from("y"),
    +                                    annotation: None,
    +                                }
    +                            ],
                                 kwonlyargs: vec![],
    -                            vararg: None,
    -                            kwarg: None,
    +                            vararg: ast::Varargs::None,
    +                            kwarg: ast::Varargs::None,
                                 defaults: vec![],
                                 kw_defaults: vec![],
                             },
    @@ -1159,7 +806,9 @@
     
         #[test]
         fn test_parse_class() {
    -        let source = String::from("class Foo(A, B):\n def __init__(self):\n  pass\n def method_with_default(self, arg='default'):\n  pass\n");
    +        let source = String::from(
    +            "class Foo(A, B):\n def __init__(self):\n  pass\n def method_with_default(self, arg='default'):\n  pass\n",
    +        );
             assert_eq!(
                 parse_statement(&source),
                 Ok(ast::LocatedStatement {
    @@ -1181,10 +830,13 @@
                                 node: ast::Statement::FunctionDef {
                                     name: String::from("__init__"),
                                     args: ast::Parameters {
    -                                    args: vec![String::from("self")],
    +                                    args: vec![ast::Parameter {
    +                                        arg: String::from("self"),
    +                                        annotation: None,
    +                                    }],
                                         kwonlyargs: vec![],
    -                                    vararg: None,
    -                                    kwarg: None,
    +                                    vararg: ast::Varargs::None,
    +                                    kwarg: ast::Varargs::None,
                                         defaults: vec![],
                                         kw_defaults: vec![],
                                     },
    @@ -1193,6 +845,7 @@
                                         node: ast::Statement::Pass,
                                     }],
                                     decorator_list: vec![],
    +                                returns: None,
                                 }
                             },
                             ast::LocatedStatement {
    @@ -1200,10 +853,19 @@
                                 node: ast::Statement::FunctionDef {
                                     name: String::from("method_with_default"),
                                     args: ast::Parameters {
    -                                    args: vec![String::from("self"), String::from("arg"),],
    +                                    args: vec![
    +                                        ast::Parameter {
    +                                            arg: String::from("self"),
    +                                            annotation: None,
    +                                        },
    +                                        ast::Parameter {
    +                                            arg: String::from("arg"),
    +                                            annotation: None,
    +                                        }
    +                                    ],
                                         kwonlyargs: vec![],
    -                                    vararg: None,
    -                                    kwarg: None,
    +                                    vararg: ast::Varargs::None,
    +                                    kwarg: ast::Varargs::None,
                                         defaults: vec![ast::Expression::String {
                                             value: ast::StringGroup::Constant {
                                                 value: "default".to_string()
    @@ -1216,6 +878,7 @@
                                         node: ast::Statement::Pass,
                                     }],
                                     decorator_list: vec![],
    +                                returns: None,
                                 }
                             }
                         ],
    @@ -1315,57 +978,6 @@
                 }
             );
         }
    -
    -    fn mk_ident(name: &str) -> ast::Expression {
    -        ast::Expression::Identifier {
    -            name: name.to_owned(),
    -        }
    -    }
    -
    -    #[test]
    -    fn test_parse_fstring() {
    -        let source = String::from("{a}{ b }{{foo}}");
    -        let parse_ast = parse_fstring(&source).unwrap();
    -
    -        assert_eq!(
    -            parse_ast,
    -            ast::StringGroup::Joined {
    -                values: vec![
    -                    ast::StringGroup::FormattedValue {
    -                        value: Box::new(mk_ident("a")),
    -                        spec: String::new(),
    -                    },
    -                    ast::StringGroup::FormattedValue {
    -                        value: Box::new(mk_ident("b")),
    -                        spec: String::new(),
    -                    },
    -                    ast::StringGroup::Constant {
    -                        value: "{foo}".to_owned()
    -                    }
    -                ]
    -            }
    -        );
    -    }
    -
    -    #[test]
    -    fn test_parse_empty_fstring() {
    -        assert_eq!(
    -            parse_fstring(""),
    -            Ok(ast::StringGroup::Constant {
    -                value: String::new(),
    -            }),
    -        );
    -    }
    -
    -    #[test]
    -    fn test_parse_invalid_fstring() {
    -        assert_eq!(parse_fstring("{"), Err(FStringError::UnclosedLbrace));
    -        assert_eq!(parse_fstring("}"), Err(FStringError::UnopenedRbrace));
    -        assert_eq!(
    -            parse_fstring("{class}"),
    -            Err(FStringError::InvalidExpression)
    -        );
    -    }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_parser/python.rs.html b/src/rustpython_parser/python.rs.html index 9c1d727..5b283d3 100644 --- a/src/rustpython_parser/python.rs.html +++ b/src/rustpython_parser/python.rs.html @@ -1,4 +1,4 @@ -python.rs.html -- source
        1
    +python.rs.html -- source
        1
         2
         3
         4
    @@ -24145,14 +24145,2909 @@
     24145
     24146
     24147
    +24148
    +24149
    +24150
    +24151
    +24152
    +24153
    +24154
    +24155
    +24156
    +24157
    +24158
    +24159
    +24160
    +24161
    +24162
    +24163
    +24164
    +24165
    +24166
    +24167
    +24168
    +24169
    +24170
    +24171
    +24172
    +24173
    +24174
    +24175
    +24176
    +24177
    +24178
    +24179
    +24180
    +24181
    +24182
    +24183
    +24184
    +24185
    +24186
    +24187
    +24188
    +24189
    +24190
    +24191
    +24192
    +24193
    +24194
    +24195
    +24196
    +24197
    +24198
    +24199
    +24200
    +24201
    +24202
    +24203
    +24204
    +24205
    +24206
    +24207
    +24208
    +24209
    +24210
    +24211
    +24212
    +24213
    +24214
    +24215
    +24216
    +24217
    +24218
    +24219
    +24220
    +24221
    +24222
    +24223
    +24224
    +24225
    +24226
    +24227
    +24228
    +24229
    +24230
    +24231
    +24232
    +24233
    +24234
    +24235
    +24236
    +24237
    +24238
    +24239
    +24240
    +24241
    +24242
    +24243
    +24244
    +24245
    +24246
    +24247
    +24248
    +24249
    +24250
    +24251
    +24252
    +24253
    +24254
    +24255
    +24256
    +24257
    +24258
    +24259
    +24260
    +24261
    +24262
    +24263
    +24264
    +24265
    +24266
    +24267
    +24268
    +24269
    +24270
    +24271
    +24272
    +24273
    +24274
    +24275
    +24276
    +24277
    +24278
    +24279
    +24280
    +24281
    +24282
    +24283
    +24284
    +24285
    +24286
    +24287
    +24288
    +24289
    +24290
    +24291
    +24292
    +24293
    +24294
    +24295
    +24296
    +24297
    +24298
    +24299
    +24300
    +24301
    +24302
    +24303
    +24304
    +24305
    +24306
    +24307
    +24308
    +24309
    +24310
    +24311
    +24312
    +24313
    +24314
    +24315
    +24316
    +24317
    +24318
    +24319
    +24320
    +24321
    +24322
    +24323
    +24324
    +24325
    +24326
    +24327
    +24328
    +24329
    +24330
    +24331
    +24332
    +24333
    +24334
    +24335
    +24336
    +24337
    +24338
    +24339
    +24340
    +24341
    +24342
    +24343
    +24344
    +24345
    +24346
    +24347
    +24348
    +24349
    +24350
    +24351
    +24352
    +24353
    +24354
    +24355
    +24356
    +24357
    +24358
    +24359
    +24360
    +24361
    +24362
    +24363
    +24364
    +24365
    +24366
    +24367
    +24368
    +24369
    +24370
    +24371
    +24372
    +24373
    +24374
    +24375
    +24376
    +24377
    +24378
    +24379
    +24380
    +24381
    +24382
    +24383
    +24384
    +24385
    +24386
    +24387
    +24388
    +24389
    +24390
    +24391
    +24392
    +24393
    +24394
    +24395
    +24396
    +24397
    +24398
    +24399
    +24400
    +24401
    +24402
    +24403
    +24404
    +24405
    +24406
    +24407
    +24408
    +24409
    +24410
    +24411
    +24412
    +24413
    +24414
    +24415
    +24416
    +24417
    +24418
    +24419
    +24420
    +24421
    +24422
    +24423
    +24424
    +24425
    +24426
    +24427
    +24428
    +24429
    +24430
    +24431
    +24432
    +24433
    +24434
    +24435
    +24436
    +24437
    +24438
    +24439
    +24440
    +24441
    +24442
    +24443
    +24444
    +24445
    +24446
    +24447
    +24448
    +24449
    +24450
    +24451
    +24452
    +24453
    +24454
    +24455
    +24456
    +24457
    +24458
    +24459
    +24460
    +24461
    +24462
    +24463
    +24464
    +24465
    +24466
    +24467
    +24468
    +24469
    +24470
    +24471
    +24472
    +24473
    +24474
    +24475
    +24476
    +24477
    +24478
    +24479
    +24480
    +24481
    +24482
    +24483
    +24484
    +24485
    +24486
    +24487
    +24488
    +24489
    +24490
    +24491
    +24492
    +24493
    +24494
    +24495
    +24496
    +24497
    +24498
    +24499
    +24500
    +24501
    +24502
    +24503
    +24504
    +24505
    +24506
    +24507
    +24508
    +24509
    +24510
    +24511
    +24512
    +24513
    +24514
    +24515
    +24516
    +24517
    +24518
    +24519
    +24520
    +24521
    +24522
    +24523
    +24524
    +24525
    +24526
    +24527
    +24528
    +24529
    +24530
    +24531
    +24532
    +24533
    +24534
    +24535
    +24536
    +24537
    +24538
    +24539
    +24540
    +24541
    +24542
    +24543
    +24544
    +24545
    +24546
    +24547
    +24548
    +24549
    +24550
    +24551
    +24552
    +24553
    +24554
    +24555
    +24556
    +24557
    +24558
    +24559
    +24560
    +24561
    +24562
    +24563
    +24564
    +24565
    +24566
    +24567
    +24568
    +24569
    +24570
    +24571
    +24572
    +24573
    +24574
    +24575
    +24576
    +24577
    +24578
    +24579
    +24580
    +24581
    +24582
    +24583
    +24584
    +24585
    +24586
    +24587
    +24588
    +24589
    +24590
    +24591
    +24592
    +24593
    +24594
    +24595
    +24596
    +24597
    +24598
    +24599
    +24600
    +24601
    +24602
    +24603
    +24604
    +24605
    +24606
    +24607
    +24608
    +24609
    +24610
    +24611
    +24612
    +24613
    +24614
    +24615
    +24616
    +24617
    +24618
    +24619
    +24620
    +24621
    +24622
    +24623
    +24624
    +24625
    +24626
    +24627
    +24628
    +24629
    +24630
    +24631
    +24632
    +24633
    +24634
    +24635
    +24636
    +24637
    +24638
    +24639
    +24640
    +24641
    +24642
    +24643
    +24644
    +24645
    +24646
    +24647
    +24648
    +24649
    +24650
    +24651
    +24652
    +24653
    +24654
    +24655
    +24656
    +24657
    +24658
    +24659
    +24660
    +24661
    +24662
    +24663
    +24664
    +24665
    +24666
    +24667
    +24668
    +24669
    +24670
    +24671
    +24672
    +24673
    +24674
    +24675
    +24676
    +24677
    +24678
    +24679
    +24680
    +24681
    +24682
    +24683
    +24684
    +24685
    +24686
    +24687
    +24688
    +24689
    +24690
    +24691
    +24692
    +24693
    +24694
    +24695
    +24696
    +24697
    +24698
    +24699
    +24700
    +24701
    +24702
    +24703
    +24704
    +24705
    +24706
    +24707
    +24708
    +24709
    +24710
    +24711
    +24712
    +24713
    +24714
    +24715
    +24716
    +24717
    +24718
    +24719
    +24720
    +24721
    +24722
    +24723
    +24724
    +24725
    +24726
    +24727
    +24728
    +24729
    +24730
    +24731
    +24732
    +24733
    +24734
    +24735
    +24736
    +24737
    +24738
    +24739
    +24740
    +24741
    +24742
    +24743
    +24744
    +24745
    +24746
    +24747
    +24748
    +24749
    +24750
    +24751
    +24752
    +24753
    +24754
    +24755
    +24756
    +24757
    +24758
    +24759
    +24760
    +24761
    +24762
    +24763
    +24764
    +24765
    +24766
    +24767
    +24768
    +24769
    +24770
    +24771
    +24772
    +24773
    +24774
    +24775
    +24776
    +24777
    +24778
    +24779
    +24780
    +24781
    +24782
    +24783
    +24784
    +24785
    +24786
    +24787
    +24788
    +24789
    +24790
    +24791
    +24792
    +24793
    +24794
    +24795
    +24796
    +24797
    +24798
    +24799
    +24800
    +24801
    +24802
    +24803
    +24804
    +24805
    +24806
    +24807
    +24808
    +24809
    +24810
    +24811
    +24812
    +24813
    +24814
    +24815
    +24816
    +24817
    +24818
    +24819
    +24820
    +24821
    +24822
    +24823
    +24824
    +24825
    +24826
    +24827
    +24828
    +24829
    +24830
    +24831
    +24832
    +24833
    +24834
    +24835
    +24836
    +24837
    +24838
    +24839
    +24840
    +24841
    +24842
    +24843
    +24844
    +24845
    +24846
    +24847
    +24848
    +24849
    +24850
    +24851
    +24852
    +24853
    +24854
    +24855
    +24856
    +24857
    +24858
    +24859
    +24860
    +24861
    +24862
    +24863
    +24864
    +24865
    +24866
    +24867
    +24868
    +24869
    +24870
    +24871
    +24872
    +24873
    +24874
    +24875
    +24876
    +24877
    +24878
    +24879
    +24880
    +24881
    +24882
    +24883
    +24884
    +24885
    +24886
    +24887
    +24888
    +24889
    +24890
    +24891
    +24892
    +24893
    +24894
    +24895
    +24896
    +24897
    +24898
    +24899
    +24900
    +24901
    +24902
    +24903
    +24904
    +24905
    +24906
    +24907
    +24908
    +24909
    +24910
    +24911
    +24912
    +24913
    +24914
    +24915
    +24916
    +24917
    +24918
    +24919
    +24920
    +24921
    +24922
    +24923
    +24924
    +24925
    +24926
    +24927
    +24928
    +24929
    +24930
    +24931
    +24932
    +24933
    +24934
    +24935
    +24936
    +24937
    +24938
    +24939
    +24940
    +24941
    +24942
    +24943
    +24944
    +24945
    +24946
    +24947
    +24948
    +24949
    +24950
    +24951
    +24952
    +24953
    +24954
    +24955
    +24956
    +24957
    +24958
    +24959
    +24960
    +24961
    +24962
    +24963
    +24964
    +24965
    +24966
    +24967
    +24968
    +24969
    +24970
    +24971
    +24972
    +24973
    +24974
    +24975
    +24976
    +24977
    +24978
    +24979
    +24980
    +24981
    +24982
    +24983
    +24984
    +24985
    +24986
    +24987
    +24988
    +24989
    +24990
    +24991
    +24992
    +24993
    +24994
    +24995
    +24996
    +24997
    +24998
    +24999
    +25000
    +25001
    +25002
    +25003
    +25004
    +25005
    +25006
    +25007
    +25008
    +25009
    +25010
    +25011
    +25012
    +25013
    +25014
    +25015
    +25016
    +25017
    +25018
    +25019
    +25020
    +25021
    +25022
    +25023
    +25024
    +25025
    +25026
    +25027
    +25028
    +25029
    +25030
    +25031
    +25032
    +25033
    +25034
    +25035
    +25036
    +25037
    +25038
    +25039
    +25040
    +25041
    +25042
    +25043
    +25044
    +25045
    +25046
    +25047
    +25048
    +25049
    +25050
    +25051
    +25052
    +25053
    +25054
    +25055
    +25056
    +25057
    +25058
    +25059
    +25060
    +25061
    +25062
    +25063
    +25064
    +25065
    +25066
    +25067
    +25068
    +25069
    +25070
    +25071
    +25072
    +25073
    +25074
    +25075
    +25076
    +25077
    +25078
    +25079
    +25080
    +25081
    +25082
    +25083
    +25084
    +25085
    +25086
    +25087
    +25088
    +25089
    +25090
    +25091
    +25092
    +25093
    +25094
    +25095
    +25096
    +25097
    +25098
    +25099
    +25100
    +25101
    +25102
    +25103
    +25104
    +25105
    +25106
    +25107
    +25108
    +25109
    +25110
    +25111
    +25112
    +25113
    +25114
    +25115
    +25116
    +25117
    +25118
    +25119
    +25120
    +25121
    +25122
    +25123
    +25124
    +25125
    +25126
    +25127
    +25128
    +25129
    +25130
    +25131
    +25132
    +25133
    +25134
    +25135
    +25136
    +25137
    +25138
    +25139
    +25140
    +25141
    +25142
    +25143
    +25144
    +25145
    +25146
    +25147
    +25148
    +25149
    +25150
    +25151
    +25152
    +25153
    +25154
    +25155
    +25156
    +25157
    +25158
    +25159
    +25160
    +25161
    +25162
    +25163
    +25164
    +25165
    +25166
    +25167
    +25168
    +25169
    +25170
    +25171
    +25172
    +25173
    +25174
    +25175
    +25176
    +25177
    +25178
    +25179
    +25180
    +25181
    +25182
    +25183
    +25184
    +25185
    +25186
    +25187
    +25188
    +25189
    +25190
    +25191
    +25192
    +25193
    +25194
    +25195
    +25196
    +25197
    +25198
    +25199
    +25200
    +25201
    +25202
    +25203
    +25204
    +25205
    +25206
    +25207
    +25208
    +25209
    +25210
    +25211
    +25212
    +25213
    +25214
    +25215
    +25216
    +25217
    +25218
    +25219
    +25220
    +25221
    +25222
    +25223
    +25224
    +25225
    +25226
    +25227
    +25228
    +25229
    +25230
    +25231
    +25232
    +25233
    +25234
    +25235
    +25236
    +25237
    +25238
    +25239
    +25240
    +25241
    +25242
    +25243
    +25244
    +25245
    +25246
    +25247
    +25248
    +25249
    +25250
    +25251
    +25252
    +25253
    +25254
    +25255
    +25256
    +25257
    +25258
    +25259
    +25260
    +25261
    +25262
    +25263
    +25264
    +25265
    +25266
    +25267
    +25268
    +25269
    +25270
    +25271
    +25272
    +25273
    +25274
    +25275
    +25276
    +25277
    +25278
    +25279
    +25280
    +25281
    +25282
    +25283
    +25284
    +25285
    +25286
    +25287
    +25288
    +25289
    +25290
    +25291
    +25292
    +25293
    +25294
    +25295
    +25296
    +25297
    +25298
    +25299
    +25300
    +25301
    +25302
    +25303
    +25304
    +25305
    +25306
    +25307
    +25308
    +25309
    +25310
    +25311
    +25312
    +25313
    +25314
    +25315
    +25316
    +25317
    +25318
    +25319
    +25320
    +25321
    +25322
    +25323
    +25324
    +25325
    +25326
    +25327
    +25328
    +25329
    +25330
    +25331
    +25332
    +25333
    +25334
    +25335
    +25336
    +25337
    +25338
    +25339
    +25340
    +25341
    +25342
    +25343
    +25344
    +25345
    +25346
    +25347
    +25348
    +25349
    +25350
    +25351
    +25352
    +25353
    +25354
    +25355
    +25356
    +25357
    +25358
    +25359
    +25360
    +25361
    +25362
    +25363
    +25364
    +25365
    +25366
    +25367
    +25368
    +25369
    +25370
    +25371
    +25372
    +25373
    +25374
    +25375
    +25376
    +25377
    +25378
    +25379
    +25380
    +25381
    +25382
    +25383
    +25384
    +25385
    +25386
    +25387
    +25388
    +25389
    +25390
    +25391
    +25392
    +25393
    +25394
    +25395
    +25396
    +25397
    +25398
    +25399
    +25400
    +25401
    +25402
    +25403
    +25404
    +25405
    +25406
    +25407
    +25408
    +25409
    +25410
    +25411
    +25412
    +25413
    +25414
    +25415
    +25416
    +25417
    +25418
    +25419
    +25420
    +25421
    +25422
    +25423
    +25424
    +25425
    +25426
    +25427
    +25428
    +25429
    +25430
    +25431
    +25432
    +25433
    +25434
    +25435
    +25436
    +25437
    +25438
    +25439
    +25440
    +25441
    +25442
    +25443
    +25444
    +25445
    +25446
    +25447
    +25448
    +25449
    +25450
    +25451
    +25452
    +25453
    +25454
    +25455
    +25456
    +25457
    +25458
    +25459
    +25460
    +25461
    +25462
    +25463
    +25464
    +25465
    +25466
    +25467
    +25468
    +25469
    +25470
    +25471
    +25472
    +25473
    +25474
    +25475
    +25476
    +25477
    +25478
    +25479
    +25480
    +25481
    +25482
    +25483
    +25484
    +25485
    +25486
    +25487
    +25488
    +25489
    +25490
    +25491
    +25492
    +25493
    +25494
    +25495
    +25496
    +25497
    +25498
    +25499
    +25500
    +25501
    +25502
    +25503
    +25504
    +25505
    +25506
    +25507
    +25508
    +25509
    +25510
    +25511
    +25512
    +25513
    +25514
    +25515
    +25516
    +25517
    +25518
    +25519
    +25520
    +25521
    +25522
    +25523
    +25524
    +25525
    +25526
    +25527
    +25528
    +25529
    +25530
    +25531
    +25532
    +25533
    +25534
    +25535
    +25536
    +25537
    +25538
    +25539
    +25540
    +25541
    +25542
    +25543
    +25544
    +25545
    +25546
    +25547
    +25548
    +25549
    +25550
    +25551
    +25552
    +25553
    +25554
    +25555
    +25556
    +25557
    +25558
    +25559
    +25560
    +25561
    +25562
    +25563
    +25564
    +25565
    +25566
    +25567
    +25568
    +25569
    +25570
    +25571
    +25572
    +25573
    +25574
    +25575
    +25576
    +25577
    +25578
    +25579
    +25580
    +25581
    +25582
    +25583
    +25584
    +25585
    +25586
    +25587
    +25588
    +25589
    +25590
    +25591
    +25592
    +25593
    +25594
    +25595
    +25596
    +25597
    +25598
    +25599
    +25600
    +25601
    +25602
    +25603
    +25604
    +25605
    +25606
    +25607
    +25608
    +25609
    +25610
    +25611
    +25612
    +25613
    +25614
    +25615
    +25616
    +25617
    +25618
    +25619
    +25620
    +25621
    +25622
    +25623
    +25624
    +25625
    +25626
    +25627
    +25628
    +25629
    +25630
    +25631
    +25632
    +25633
    +25634
    +25635
    +25636
    +25637
    +25638
    +25639
    +25640
    +25641
    +25642
    +25643
    +25644
    +25645
    +25646
    +25647
    +25648
    +25649
    +25650
    +25651
    +25652
    +25653
    +25654
    +25655
    +25656
    +25657
    +25658
    +25659
    +25660
    +25661
    +25662
    +25663
    +25664
    +25665
    +25666
    +25667
    +25668
    +25669
    +25670
    +25671
    +25672
    +25673
    +25674
    +25675
    +25676
    +25677
    +25678
    +25679
    +25680
    +25681
    +25682
    +25683
    +25684
    +25685
    +25686
    +25687
    +25688
    +25689
    +25690
    +25691
    +25692
    +25693
    +25694
    +25695
    +25696
    +25697
    +25698
    +25699
    +25700
    +25701
    +25702
    +25703
    +25704
    +25705
    +25706
    +25707
    +25708
    +25709
    +25710
    +25711
    +25712
    +25713
    +25714
    +25715
    +25716
    +25717
    +25718
    +25719
    +25720
    +25721
    +25722
    +25723
    +25724
    +25725
    +25726
    +25727
    +25728
    +25729
    +25730
    +25731
    +25732
    +25733
    +25734
    +25735
    +25736
    +25737
    +25738
    +25739
    +25740
    +25741
    +25742
    +25743
    +25744
    +25745
    +25746
    +25747
    +25748
    +25749
    +25750
    +25751
    +25752
    +25753
    +25754
    +25755
    +25756
    +25757
    +25758
    +25759
    +25760
    +25761
    +25762
    +25763
    +25764
    +25765
    +25766
    +25767
    +25768
    +25769
    +25770
    +25771
    +25772
    +25773
    +25774
    +25775
    +25776
    +25777
    +25778
    +25779
    +25780
    +25781
    +25782
    +25783
    +25784
    +25785
    +25786
    +25787
    +25788
    +25789
    +25790
    +25791
    +25792
    +25793
    +25794
    +25795
    +25796
    +25797
    +25798
    +25799
    +25800
    +25801
    +25802
    +25803
    +25804
    +25805
    +25806
    +25807
    +25808
    +25809
    +25810
    +25811
    +25812
    +25813
    +25814
    +25815
    +25816
    +25817
    +25818
    +25819
    +25820
    +25821
    +25822
    +25823
    +25824
    +25825
    +25826
    +25827
    +25828
    +25829
    +25830
    +25831
    +25832
    +25833
    +25834
    +25835
    +25836
    +25837
    +25838
    +25839
    +25840
    +25841
    +25842
    +25843
    +25844
    +25845
    +25846
    +25847
    +25848
    +25849
    +25850
    +25851
    +25852
    +25853
    +25854
    +25855
    +25856
    +25857
    +25858
    +25859
    +25860
    +25861
    +25862
    +25863
    +25864
    +25865
    +25866
    +25867
    +25868
    +25869
    +25870
    +25871
    +25872
    +25873
    +25874
    +25875
    +25876
    +25877
    +25878
    +25879
    +25880
    +25881
    +25882
    +25883
    +25884
    +25885
    +25886
    +25887
    +25888
    +25889
    +25890
    +25891
    +25892
    +25893
    +25894
    +25895
    +25896
    +25897
    +25898
    +25899
    +25900
    +25901
    +25902
    +25903
    +25904
    +25905
    +25906
    +25907
    +25908
    +25909
    +25910
    +25911
    +25912
    +25913
    +25914
    +25915
    +25916
    +25917
    +25918
    +25919
    +25920
    +25921
    +25922
    +25923
    +25924
    +25925
    +25926
    +25927
    +25928
    +25929
    +25930
    +25931
    +25932
    +25933
    +25934
    +25935
    +25936
    +25937
    +25938
    +25939
    +25940
    +25941
    +25942
    +25943
    +25944
    +25945
    +25946
    +25947
    +25948
    +25949
    +25950
    +25951
    +25952
    +25953
    +25954
    +25955
    +25956
    +25957
    +25958
    +25959
    +25960
    +25961
    +25962
    +25963
    +25964
    +25965
    +25966
    +25967
    +25968
    +25969
    +25970
    +25971
    +25972
    +25973
    +25974
    +25975
    +25976
    +25977
    +25978
    +25979
    +25980
    +25981
    +25982
    +25983
    +25984
    +25985
    +25986
    +25987
    +25988
    +25989
    +25990
    +25991
    +25992
    +25993
    +25994
    +25995
    +25996
    +25997
    +25998
    +25999
    +26000
    +26001
    +26002
    +26003
    +26004
    +26005
    +26006
    +26007
    +26008
    +26009
    +26010
    +26011
    +26012
    +26013
    +26014
    +26015
    +26016
    +26017
    +26018
    +26019
    +26020
    +26021
    +26022
    +26023
    +26024
    +26025
    +26026
    +26027
    +26028
    +26029
    +26030
    +26031
    +26032
    +26033
    +26034
    +26035
    +26036
    +26037
    +26038
    +26039
    +26040
    +26041
    +26042
    +26043
    +26044
    +26045
    +26046
    +26047
    +26048
    +26049
    +26050
    +26051
    +26052
    +26053
    +26054
    +26055
    +26056
    +26057
    +26058
    +26059
    +26060
    +26061
    +26062
    +26063
    +26064
    +26065
    +26066
    +26067
    +26068
    +26069
    +26070
    +26071
    +26072
    +26073
    +26074
    +26075
    +26076
    +26077
    +26078
    +26079
    +26080
    +26081
    +26082
    +26083
    +26084
    +26085
    +26086
    +26087
    +26088
    +26089
    +26090
    +26091
    +26092
    +26093
    +26094
    +26095
    +26096
    +26097
    +26098
    +26099
    +26100
    +26101
    +26102
    +26103
    +26104
    +26105
    +26106
    +26107
    +26108
    +26109
    +26110
    +26111
    +26112
    +26113
    +26114
    +26115
    +26116
    +26117
    +26118
    +26119
    +26120
    +26121
    +26122
    +26123
    +26124
    +26125
    +26126
    +26127
    +26128
    +26129
    +26130
    +26131
    +26132
    +26133
    +26134
    +26135
    +26136
    +26137
    +26138
    +26139
    +26140
    +26141
    +26142
    +26143
    +26144
    +26145
    +26146
    +26147
    +26148
    +26149
    +26150
    +26151
    +26152
    +26153
    +26154
    +26155
    +26156
    +26157
    +26158
    +26159
    +26160
    +26161
    +26162
    +26163
    +26164
    +26165
    +26166
    +26167
    +26168
    +26169
    +26170
    +26171
    +26172
    +26173
    +26174
    +26175
    +26176
    +26177
    +26178
    +26179
    +26180
    +26181
    +26182
    +26183
    +26184
    +26185
    +26186
    +26187
    +26188
    +26189
    +26190
    +26191
    +26192
    +26193
    +26194
    +26195
    +26196
    +26197
    +26198
    +26199
    +26200
    +26201
    +26202
    +26203
    +26204
    +26205
    +26206
    +26207
    +26208
    +26209
    +26210
    +26211
    +26212
    +26213
    +26214
    +26215
    +26216
    +26217
    +26218
    +26219
    +26220
    +26221
    +26222
    +26223
    +26224
    +26225
    +26226
    +26227
    +26228
    +26229
    +26230
    +26231
    +26232
    +26233
    +26234
    +26235
    +26236
    +26237
    +26238
    +26239
    +26240
    +26241
    +26242
    +26243
    +26244
    +26245
    +26246
    +26247
    +26248
    +26249
    +26250
    +26251
    +26252
    +26253
    +26254
    +26255
    +26256
    +26257
    +26258
    +26259
    +26260
    +26261
    +26262
    +26263
    +26264
    +26265
    +26266
    +26267
    +26268
    +26269
    +26270
    +26271
    +26272
    +26273
    +26274
    +26275
    +26276
    +26277
    +26278
    +26279
    +26280
    +26281
    +26282
    +26283
    +26284
    +26285
    +26286
    +26287
    +26288
    +26289
    +26290
    +26291
    +26292
    +26293
    +26294
    +26295
    +26296
    +26297
    +26298
    +26299
    +26300
    +26301
    +26302
    +26303
    +26304
    +26305
    +26306
    +26307
    +26308
    +26309
    +26310
    +26311
    +26312
    +26313
    +26314
    +26315
    +26316
    +26317
    +26318
    +26319
    +26320
    +26321
    +26322
    +26323
    +26324
    +26325
    +26326
    +26327
    +26328
    +26329
    +26330
    +26331
    +26332
    +26333
    +26334
    +26335
    +26336
    +26337
    +26338
    +26339
    +26340
    +26341
    +26342
    +26343
    +26344
    +26345
    +26346
    +26347
    +26348
    +26349
    +26350
    +26351
    +26352
    +26353
    +26354
    +26355
    +26356
    +26357
    +26358
    +26359
    +26360
    +26361
    +26362
    +26363
    +26364
    +26365
    +26366
    +26367
    +26368
    +26369
    +26370
    +26371
    +26372
    +26373
    +26374
    +26375
    +26376
    +26377
    +26378
    +26379
    +26380
    +26381
    +26382
    +26383
    +26384
    +26385
    +26386
    +26387
    +26388
    +26389
    +26390
    +26391
    +26392
    +26393
    +26394
    +26395
    +26396
    +26397
    +26398
    +26399
    +26400
    +26401
    +26402
    +26403
    +26404
    +26405
    +26406
    +26407
    +26408
    +26409
    +26410
    +26411
    +26412
    +26413
    +26414
    +26415
    +26416
    +26417
    +26418
    +26419
    +26420
    +26421
    +26422
    +26423
    +26424
    +26425
    +26426
    +26427
    +26428
    +26429
    +26430
    +26431
    +26432
    +26433
    +26434
    +26435
    +26436
    +26437
    +26438
    +26439
    +26440
    +26441
    +26442
    +26443
    +26444
    +26445
    +26446
    +26447
    +26448
    +26449
    +26450
    +26451
    +26452
    +26453
    +26454
    +26455
    +26456
    +26457
    +26458
    +26459
    +26460
    +26461
    +26462
    +26463
    +26464
    +26465
    +26466
    +26467
    +26468
    +26469
    +26470
    +26471
    +26472
    +26473
    +26474
    +26475
    +26476
    +26477
    +26478
    +26479
    +26480
    +26481
    +26482
    +26483
    +26484
    +26485
    +26486
    +26487
    +26488
    +26489
    +26490
    +26491
    +26492
    +26493
    +26494
    +26495
    +26496
    +26497
    +26498
    +26499
    +26500
    +26501
    +26502
    +26503
    +26504
    +26505
    +26506
    +26507
    +26508
    +26509
    +26510
    +26511
    +26512
    +26513
    +26514
    +26515
    +26516
    +26517
    +26518
    +26519
    +26520
    +26521
    +26522
    +26523
    +26524
    +26525
    +26526
    +26527
    +26528
    +26529
    +26530
    +26531
    +26532
    +26533
    +26534
    +26535
    +26536
    +26537
    +26538
    +26539
    +26540
    +26541
    +26542
    +26543
    +26544
    +26545
    +26546
    +26547
    +26548
    +26549
    +26550
    +26551
    +26552
    +26553
    +26554
    +26555
    +26556
    +26557
    +26558
    +26559
    +26560
    +26561
    +26562
    +26563
    +26564
    +26565
    +26566
    +26567
    +26568
    +26569
    +26570
    +26571
    +26572
    +26573
    +26574
    +26575
    +26576
    +26577
    +26578
    +26579
    +26580
    +26581
    +26582
    +26583
    +26584
    +26585
    +26586
    +26587
    +26588
    +26589
    +26590
    +26591
    +26592
    +26593
    +26594
    +26595
    +26596
    +26597
    +26598
    +26599
    +26600
    +26601
    +26602
    +26603
    +26604
    +26605
    +26606
    +26607
    +26608
    +26609
    +26610
    +26611
    +26612
    +26613
    +26614
    +26615
    +26616
    +26617
    +26618
    +26619
    +26620
    +26621
    +26622
    +26623
    +26624
    +26625
    +26626
    +26627
    +26628
    +26629
    +26630
    +26631
    +26632
    +26633
    +26634
    +26635
    +26636
    +26637
    +26638
    +26639
    +26640
    +26641
    +26642
    +26643
    +26644
    +26645
    +26646
    +26647
    +26648
    +26649
    +26650
    +26651
    +26652
    +26653
    +26654
    +26655
    +26656
    +26657
    +26658
    +26659
    +26660
    +26661
    +26662
    +26663
    +26664
    +26665
    +26666
    +26667
    +26668
    +26669
    +26670
    +26671
    +26672
    +26673
    +26674
    +26675
    +26676
    +26677
    +26678
    +26679
    +26680
    +26681
    +26682
    +26683
    +26684
    +26685
    +26686
    +26687
    +26688
    +26689
    +26690
    +26691
    +26692
    +26693
    +26694
    +26695
    +26696
    +26697
    +26698
    +26699
    +26700
    +26701
    +26702
    +26703
    +26704
    +26705
    +26706
    +26707
    +26708
    +26709
    +26710
    +26711
    +26712
    +26713
    +26714
    +26715
    +26716
    +26717
    +26718
    +26719
    +26720
    +26721
    +26722
    +26723
    +26724
    +26725
    +26726
    +26727
    +26728
    +26729
    +26730
    +26731
    +26732
    +26733
    +26734
    +26735
    +26736
    +26737
    +26738
    +26739
    +26740
    +26741
    +26742
    +26743
    +26744
    +26745
    +26746
    +26747
    +26748
    +26749
    +26750
    +26751
    +26752
    +26753
    +26754
    +26755
    +26756
    +26757
    +26758
    +26759
    +26760
    +26761
    +26762
    +26763
    +26764
    +26765
    +26766
    +26767
    +26768
    +26769
    +26770
    +26771
    +26772
    +26773
    +26774
    +26775
    +26776
    +26777
    +26778
    +26779
    +26780
    +26781
    +26782
    +26783
    +26784
    +26785
    +26786
    +26787
    +26788
    +26789
    +26790
    +26791
    +26792
    +26793
    +26794
    +26795
    +26796
    +26797
    +26798
    +26799
    +26800
    +26801
    +26802
    +26803
    +26804
    +26805
    +26806
    +26807
    +26808
    +26809
    +26810
    +26811
    +26812
    +26813
    +26814
    +26815
    +26816
    +26817
    +26818
    +26819
    +26820
    +26821
    +26822
    +26823
    +26824
    +26825
    +26826
    +26827
    +26828
    +26829
    +26830
    +26831
    +26832
    +26833
    +26834
    +26835
    +26836
    +26837
    +26838
    +26839
    +26840
    +26841
    +26842
    +26843
    +26844
    +26845
    +26846
    +26847
    +26848
    +26849
    +26850
    +26851
    +26852
    +26853
    +26854
    +26855
    +26856
    +26857
    +26858
    +26859
    +26860
    +26861
    +26862
    +26863
    +26864
    +26865
    +26866
    +26867
    +26868
    +26869
    +26870
    +26871
    +26872
    +26873
    +26874
    +26875
    +26876
    +26877
    +26878
    +26879
    +26880
    +26881
    +26882
    +26883
    +26884
    +26885
    +26886
    +26887
    +26888
    +26889
    +26890
    +26891
    +26892
    +26893
    +26894
    +26895
    +26896
    +26897
    +26898
    +26899
    +26900
    +26901
    +26902
    +26903
    +26904
    +26905
    +26906
    +26907
    +26908
    +26909
    +26910
    +26911
    +26912
    +26913
    +26914
    +26915
    +26916
    +26917
    +26918
    +26919
    +26920
    +26921
    +26922
    +26923
    +26924
    +26925
    +26926
    +26927
    +26928
    +26929
    +26930
    +26931
    +26932
    +26933
    +26934
    +26935
    +26936
    +26937
    +26938
    +26939
    +26940
    +26941
    +26942
    +26943
    +26944
    +26945
    +26946
    +26947
    +26948
    +26949
    +26950
    +26951
    +26952
    +26953
    +26954
    +26955
    +26956
    +26957
    +26958
    +26959
    +26960
    +26961
    +26962
    +26963
    +26964
    +26965
    +26966
    +26967
    +26968
    +26969
    +26970
    +26971
    +26972
    +26973
    +26974
    +26975
    +26976
    +26977
    +26978
    +26979
    +26980
    +26981
    +26982
    +26983
    +26984
    +26985
    +26986
    +26987
    +26988
    +26989
    +26990
    +26991
    +26992
    +26993
    +26994
    +26995
    +26996
    +26997
    +26998
    +26999
    +27000
    +27001
    +27002
    +27003
    +27004
    +27005
    +27006
    +27007
    +27008
    +27009
    +27010
    +27011
    +27012
    +27013
    +27014
    +27015
    +27016
    +27017
    +27018
    +27019
    +27020
    +27021
    +27022
    +27023
    +27024
    +27025
    +27026
    +27027
    +27028
    +27029
    +27030
    +27031
    +27032
    +27033
    +27034
    +27035
    +27036
    +27037
    +27038
    +27039
    +27040
    +27041
    +27042
     
     // auto-generated: "lalrpop 0.15.2"
    -// sha256: 21ed48d4450baedcf801f84482e2931a3e9c5aeb1ea6e9d3c21a1964bad7
    +// sha256: 156cbeeb057cd44ae1586e9cb95cc99e781844a1fc95cb2c2f19554b48aa
     #![allow(unknown_lints,clippy)]
    -use super::ast;
    -use super::lexer;
    -use super::parser;
     use std::iter::FromIterator;
    +use crate::ast;
    +use crate::fstring::parse_fstring;
    +use crate::lexer;
     use num_bigint::BigInt;
     #[allow(unused_extern_crates)]
     extern crate lalrpop_util as __lalrpop_util;
    @@ -24161,10 +27056,10 @@
     mod __parse__Top {
         #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
     
    -    use super::super::ast;
    -    use super::super::lexer;
    -    use super::super::parser;
         use std::iter::FromIterator;
    +    use crate::ast;
    +    use crate::fstring::parse_fstring;
    +    use crate::lexer;
         use num_bigint::BigInt;
         #[allow(unused_extern_crates)]
         extern crate lalrpop_util as __lalrpop_util;
    @@ -24190,12 +27085,12 @@
             Variant15(::std::vec::Vec<(lexer::Tok, ast::Expression)>),
             Variant16((lexer::Tok, String)),
             Variant17(::std::vec::Vec<(lexer::Tok, String)>),
    -        Variant18((lexer::Tok, Option<String>)),
    -        Variant19(::std::option::Option<(lexer::Tok, Option<String>)>),
    -        Variant20((lexer::Tok, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>))),
    -        Variant21(::std::option::Option<(lexer::Tok, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>))>),
    -        Variant22((lexer::Tok, (String, Option<ast::Expression>))),
    -        Variant23(::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>),
    +        Variant18((lexer::Tok, Option<ast::Parameter>)),
    +        Variant19(::std::option::Option<(lexer::Tok, Option<ast::Parameter>)>),
    +        Variant20((lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))),
    +        Variant21(::std::option::Option<(lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))>),
    +        Variant22((lexer::Tok, (ast::Parameter, Option<ast::Expression>))),
    +        Variant23(::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>),
             Variant24((lexer::Tok, ast::WithItem)),
             Variant25(::std::vec::Vec<(lexer::Tok, ast::WithItem)>),
             Variant26(::std::option::Option<(lexer::Tok, String)>),
    @@ -24230,1101 +27125,1196 @@
             Variant55(Option<ast::LocatedStatement>),
             Variant56(::std::vec::Vec<Option<ast::LocatedStatement>>),
             Variant57(::std::option::Option<(Option<Option<String>>, ast::Expression)>),
    -        Variant58(::std::option::Option<String>),
    -        Variant59(::std::option::Option<(String, Option<String>)>),
    -        Variant60(Option<String>),
    -        Variant61(ast::Number),
    -        Variant62(Vec<(ast::Expression, ast::Expression)>),
    -        Variant63(Vec<String>),
    -        Variant64(Vec<ast::WithItem>),
    -        Variant65((Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)),
    -        Variant66(ast::Program),
    -        Variant67(ast::Comprehension),
    -        Variant68(::std::vec::Vec<ast::Comprehension>),
    -        Variant69(::std::option::Option<ast::Expression>),
    -        Variant70(::std::vec::Vec<ast::LocatedStatement>),
    -        Variant71(ast::StringGroup),
    -        Variant72(Vec<ast::LocatedStatement>),
    -        Variant73(::std::option::Option<Vec<(ast::Expression, ast::Expression)>>),
    -        Variant74(::std::option::Option<Vec<ast::Expression>>),
    -        Variant75(ast::Top),
    -        Variant76((String, Option<ast::Expression>)),
    -        Variant77((Vec<String>, Vec<ast::Expression>)),
    -        Variant78(ast::WithItem),
    -        Variant79(::std::vec::Vec<Vec<u8>>),
    -        Variant80(::std::vec::Vec<(String, bool)>),
    +        Variant58(::std::option::Option<(String, Option<String>)>),
    +        Variant59(Option<ast::Parameter>),
    +        Variant60(ast::Number),
    +        Variant61(Vec<(ast::Expression, ast::Expression)>),
    +        Variant62(Vec<String>),
    +        Variant63(Vec<ast::WithItem>),
    +        Variant64((Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)),
    +        Variant65(ast::Program),
    +        Variant66(ast::Comprehension),
    +        Variant67(::std::vec::Vec<ast::Comprehension>),
    +        Variant68(::std::option::Option<ast::Expression>),
    +        Variant69(::std::vec::Vec<ast::LocatedStatement>),
    +        Variant70(ast::StringGroup),
    +        Variant71(Vec<ast::LocatedStatement>),
    +        Variant72(::std::option::Option<Vec<(ast::Expression, ast::Expression)>>),
    +        Variant73(::std::option::Option<Vec<ast::Expression>>),
    +        Variant74(ast::Top),
    +        Variant75(ast::Parameter),
    +        Variant76(::std::option::Option<ast::Parameter>),
    +        Variant77((ast::Parameter, Option<ast::Expression>)),
    +        Variant78((Vec<ast::Parameter>, Vec<ast::Expression>)),
    +        Variant79(ast::WithItem),
    +        Variant80(::std::vec::Vec<Vec<u8>>),
    +        Variant81(::std::vec::Vec<(String, bool)>),
         }
         const __ACTION: &'static [i16] = &[
             // State 0
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 1
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 2
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 3
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 25, 26, 27, 28, 75, 0, 0, 0, 0, 0, 76, 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, 83, 83, 84, 85, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 93, 94, 95, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 26, 27, 28, 29, 76, 0, 0, 0, 0, 0, 77, 78, 79, 80, 81, 82, 0, 0, 0, 0, 83, 84, 84, 85, 86, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 94, 95, 96, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 4
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 76, 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, 83, 83, 84, 85, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 93, 94, 95, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 77, 78, 79, 80, 81, 82, 0, 0, 0, 0, 83, 84, 84, 85, 86, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 94, 95, 96, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 5
    -        -456, 0, -456, 98, -456, 0, -456, 0, 0, -456, -456, 0, -456, -456, 0, -456, 0, 0, 0, -456, -456, -456, -456, -456, 0, -456, -456, -456, -456, -456, -456, 0, -456, 0, -456, 0, 0, 0, 0, -456, -456, -456, -456, -456, -456, 0, 0, 0, 0, 0, 0, 0, -456, 0, 0, -456, -456, -456, 0, -456, 0, -456, -456, 0, 0, -456, -456, 0, 0, 0, 0, 0, 0, 0, 0, -456, -456, -456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -511, 0, -511, 99, -511, 0, -511, 0, 0, -511, -511, 0, -511, -511, 0, -511, 0, 0, 0, 0, 0, -511, -511, -511, -511, -511, 0, -511, -511, -511, -511, -511, -511, 0, -511, 0, -511, 0, 0, 0, 0, -511, -511, -511, -511, -511, -511, 0, 0, 0, 0, 0, 0, 0, -511, 0, 0, -511, -511, -511, 0, -511, 0, -511, -511, 0, 0, -511, -511, 0, 0, 0, 0, 0, 0, 0, 0, -511, -511, -511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 6
    -        -348, 0, -348, -348, -348, 0, -348, 0, 0, -348, -348, 100, -348, -348, 101, -348, 0, 0, 0, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, 0, -348, 0, 0, 0, 0, -348, -348, -348, -348, -348, -348, 0, 0, 0, 0, 0, 0, 0, -348, 0, 0, -348, -348, -348, 0, -348, 0, -348, -348, 0, 0, -348, -348, 0, 0, 0, 0, 0, 0, 0, 0, -348, -348, -348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -381, 0, -381, -381, -381, 0, -381, 0, 0, -381, -381, 101, -381, -381, 102, -381, 0, 0, 0, 0, 0, -381, -381, -381, -381, -381, -381, -381, -381, -381, -381, -381, -381, -381, -381, 0, -381, 0, 0, 0, 0, -381, -381, -381, -381, -381, -381, 0, 0, 0, 0, 0, 0, 0, -381, 0, 0, -381, -381, -381, 0, -381, 0, -381, -381, 0, 0, -381, -381, 0, 0, 0, 0, 0, 0, 0, 0, -381, -381, -381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 7
    -        -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, 0, 0, 0, -148, -148, -148, -148, -148, -148, -148, 0, 0, 0, 0, 0, 0, 0, -148, 0, 0, -148, -148, -148, 0, -148, 0, -148, -148, 0, 0, -148, -148, 0, 0, 0, 0, 0, 0, 0, 0, -148, -148, -148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, 0, -171, 0, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, -171, 0, 0, 0, -171, -171, -171, -171, -171, -171, -171, 0, 0, 0, 0, 0, 0, 0, -171, 0, 0, -171, -171, -171, 0, -171, 0, -171, -171, 0, 0, -171, -171, 0, 0, 0, 0, 0, 0, 0, 0, -171, -171, -171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 8
    -        -341, -341, -341, -341, -341, 102, -341, -341, 103, -341, -341, -341, -341, -341, -341, -341, 104, -341, -341, -341, -341, -341, -341, -341, -341, -341, -341, -341, -341, -341, -341, -341, -341, -341, -341, 0, 0, 0, 105, -341, -341, -341, -341, -341, -341, 0, 0, 0, 0, 0, 0, 0, -341, 0, 0, -341, -341, -341, 0, -341, 0, -341, -341, 0, 0, -341, -341, 0, 0, 0, 0, 0, 0, 0, 0, -341, -341, -341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -374, -374, -374, -374, -374, 103, -374, -374, 104, -374, -374, -374, -374, -374, -374, -374, 0, 105, 0, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, 0, 0, 0, 106, -374, -374, -374, -374, -374, -374, 0, 0, 0, 0, 0, 0, 0, -374, 0, 0, -374, -374, -374, 0, -374, 0, -374, -374, 0, 0, -374, -374, 0, 0, 0, 0, 0, 0, 0, 0, -374, -374, -374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 9
    -        -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, 0, 0, 0, -127, -127, -127, -127, -127, -127, -127, 0, 0, 0, 0, 0, 0, 0, -127, 0, 0, -127, -127, -127, 0, -127, 0, -127, -127, 0, 0, -127, -127, 0, 0, 0, 0, 0, 0, 0, 0, -127, -127, -127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, 0, -149, 0, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, 0, 0, 0, -149, -149, -149, -149, -149, -149, -149, 0, 0, 0, 0, 0, 0, 0, -149, 0, 0, -149, -149, -149, 0, -149, 0, -149, -149, 0, 0, -149, -149, 0, 0, 0, 0, 0, 0, 0, 0, -149, -149, -149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 10
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 11
    -        -387, -387, -387, -387, -387, 0, -387, -387, 0, -387, -387, -387, -387, -387, -387, -387, 0, -387, -387, -387, -387, -387, -387, -387, -387, -387, -387, -387, -387, -387, -387, -387, -387, -387, -387, 0, 0, 0, 0, -387, -387, -387, -387, -387, -387, 0, 0, 0, 0, 0, 0, 0, -387, 0, 0, -387, -387, -387, 0, -387, 0, -387, -387, 0, 0, -387, -387, 0, 0, 0, 0, 0, 0, 0, 0, -387, -387, -387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -424, -424, -424, -424, -424, 0, -424, -424, 0, -424, -424, -424, -424, -424, -424, -424, 0, 0, 0, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, 0, 0, 0, 0, -424, -424, -424, -424, -424, -424, 0, 0, 0, 0, 0, 0, 0, -424, 0, 0, -424, -424, -424, 0, -424, 0, -424, -424, 0, 0, -424, -424, 0, 0, 0, 0, 0, 0, 0, 0, -424, -424, -424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 12
    -        -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, 0, 0, 0, -129, -129, -129, -129, -129, -129, -129, 0, 0, 0, 0, 0, 0, 0, -129, 0, 0, -129, -129, -129, 0, -129, 0, -129, -129, 0, 0, -129, -129, 0, 0, 0, 0, 0, 0, 0, 0, -129, -129, -129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, 0, -151, 0, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, 0, 0, 0, -151, -151, -151, -151, -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, -151, -151, -151, 0, -151, 0, -151, -151, 0, 0, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 13
    -        -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, 0, 0, 0, -128, -128, -128, -128, -128, -128, -128, 0, 0, 0, 0, 0, 0, 0, -128, 0, 0, -128, -128, -128, 0, -128, 0, -128, -128, 0, 0, -128, -128, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, 0, -150, 0, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, 0, 0, 0, -150, -150, -150, -150, -150, -150, -150, 0, 0, 0, 0, 0, 0, 0, -150, 0, 0, -150, -150, -150, 0, -150, 0, -150, -150, 0, 0, -150, -150, 0, 0, 0, 0, 0, 0, 0, 0, -150, -150, -150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 14
    -        -245, -245, -245, -245, -245, 0, -245, -245, 0, -245, -245, -245, -245, -245, -245, -245, 0, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, 0, 0, 0, 0, -245, -245, -245, -245, -245, -245, 0, 0, 0, 0, 0, 0, 0, -245, 0, 0, -245, -245, -245, 0, -245, 0, -245, -245, 0, 0, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, -245, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -268, -268, -268, -268, -268, 0, -268, -268, 0, -268, -268, -268, -268, -268, -268, -268, 0, 0, 0, -268, -268, -268, -268, -268, -268, -268, -268, -268, -268, -268, -268, -268, -268, -268, -268, -268, -268, 0, 0, 0, 0, -268, -268, -268, -268, -268, -268, 0, 0, 0, 0, 0, 0, 0, -268, 0, 0, -268, -268, -268, 0, -268, 0, -268, -268, 0, 0, -268, -268, 0, 0, 0, 0, 0, 0, 0, 0, -268, -268, -268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 15
    -        -111, 0, -111, -111, -111, 0, -111, 0, 0, -111, -111, 0, -111, -111, 0, -111, 0, 0, 0, -111, -111, -111, -111, -111, 108, -111, -111, -111, -111, -111, -111, 109, -111, 0, -111, 0, 0, 0, 0, -111, -111, -111, -111, -111, -111, 0, 0, 0, 0, 0, 0, 0, -111, 0, 0, -111, -111, -111, 0, -111, 0, -111, -111, 0, 0, -111, -111, 0, 0, 0, 0, 0, 0, 0, 0, -111, -111, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -133, 0, -133, -133, -133, 0, -133, 0, 0, -133, -133, 0, -133, -133, 0, -133, 0, 0, 0, 0, 0, -133, -133, -133, -133, -133, 109, -133, -133, -133, -133, -133, -133, 110, -133, 0, -133, 0, 0, 0, 0, -133, -133, -133, -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, -133, 0, 0, -133, -133, -133, 0, -133, 0, -133, -133, 0, 0, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 16
    -        -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, -126, 0, 0, 0, -126, -126, -126, -126, -126, -126, -126, 0, 0, 0, 0, 0, 0, 0, -126, 0, 0, -126, -126, -126, 0, -126, 0, -126, -126, 0, 0, -126, -126, 0, 0, 0, 0, 0, 0, 0, 0, -126, -126, -126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, 0, -148, 0, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, 0, 0, 0, -148, -148, -148, -148, -148, -148, -148, 0, 0, 0, 0, 0, 0, 0, -148, 0, 0, -148, -148, -148, 0, -148, 0, -148, -148, 0, 0, -148, -148, 0, 0, 0, 0, 0, 0, 0, 0, -148, -148, -148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 17
    -        -116, 111, -116, -116, -116, 0, -116, 112, 0, -116, -116, -116, -116, -116, -116, -116, 0, 113, 114, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, 115, -116, 0, 0, 0, 0, -116, -116, -116, -116, -116, -116, 0, 0, 0, 0, 0, 0, 0, -116, 0, 0, -116, -116, -116, 0, -116, 0, -116, -116, 0, 0, -116, -116, 0, 0, 0, 0, 0, 0, 0, 0, -116, -116, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -138, 112, -138, -138, -138, 0, -138, 113, 0, -138, -138, -138, -138, -138, -138, -138, 0, 0, 0, 114, 115, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, 116, -138, 0, 0, 0, 0, -138, -138, -138, -138, -138, -138, 0, 0, 0, 0, 0, 0, 0, -138, 0, 0, -138, -138, -138, 0, -138, 0, -138, -138, 0, 0, -138, -138, 0, 0, 0, 0, 0, 0, 0, 0, -138, -138, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 18
    -        -231, 0, -231, 0, -231, 0, -231, 0, 0, -231, -231, 0, -231, -231, 0, -231, 0, 0, 0, -231, -231, -231, -231, -231, 0, -231, -231, -231, -231, -231, -231, 0, -231, 0, -231, 0, 0, 0, 0, -231, -231, 116, -231, -231, -231, 0, 0, 0, 0, 0, 0, 0, -231, 0, 0, -231, -231, -231, 0, -231, 0, -231, -231, 0, 0, -231, -231, 0, 0, 0, 0, 0, 0, 0, 0, -231, -231, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -254, 0, -254, 0, -254, 0, -254, 0, 0, -254, -254, 0, -254, -254, 0, -254, 0, 0, 0, 0, 0, -254, -254, -254, -254, -254, 0, -254, -254, -254, -254, -254, -254, 0, -254, 0, -254, 0, 0, 0, 0, -254, -254, 117, -254, -254, -254, 0, 0, 0, 0, 0, 0, 0, -254, 0, 0, -254, -254, -254, 0, -254, 0, -254, -254, 0, 0, -254, -254, 0, 0, 0, 0, 0, 0, 0, 0, -254, -254, -254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 19
    -        -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, 0, 0, 0, -165, -165, -165, -165, -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, -165, 0, 0, -165, -165, -165, 0, -165, 0, -165, -165, 0, 0, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, -165, -165, -165, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0,
    +        -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, 0, -188, 0, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, 0, 0, 0, -188, -188, -188, -188, -188, -188, -188, 0, 0, 0, 0, 0, 0, 0, -188, 0, 0, -188, -188, -188, 0, -188, 0, -188, -188, 0, 0, -188, -188, 0, 0, 0, 0, 0, 0, 0, 0, -188, -188, -188, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0,
             // State 20
    -        -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, 0, 0, 0, -374, -374, -374, -374, -374, -374, -374, 0, 0, 0, 0, 0, 0, 0, -374, 0, 0, -374, -374, -374, 0, -374, 0, -374, -374, 0, 0, -374, -374, 0, 0, 0, 0, 0, 0, 0, 0, -374, -374, -374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118,
    +        -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, 0, -407, 0, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, 0, 0, 0, -407, -407, -407, -407, -407, -407, -407, 0, 0, 0, 0, 0, 0, 0, -407, 0, 0, -407, -407, -407, 0, -407, 0, -407, -407, 0, 0, -407, -407, 0, 0, 0, 0, 0, 0, 0, 0, -407, -407, -407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119,
             // State 21
    -        0, 0, 0, 0, 0, 22, 120, 0, 0, 0, 0, 23, 0, 121, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 121, 0, 0, 0, 0, 23, 0, 122, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 22
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 23
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 24
    -        -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, 0, 0, 0, -146, -146, -146, -146, -146, -146, -146, 0, 0, 0, 0, 0, 0, 0, -146, 0, 0, -146, -146, -146, 0, -146, 0, -146, -146, 0, 0, -146, -146, 0, 0, 0, 0, 0, 0, 0, 0, -146, -146, -146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, 0, -170, 0, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, -170, 0, 0, 0, -170, -170, -170, -170, -170, -170, -170, 0, 0, 0, 0, 0, 0, 0, -170, 0, 0, -170, -170, -170, 0, -170, 0, -170, -170, 0, 0, -170, -170, 0, 0, 0, 0, 0, 0, 0, 0, -170, -170, -170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 25
    -        -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, -147, 0, 0, 0, -147, -147, -147, -147, -147, -147, -147, 0, 0, 0, 0, 0, 0, 0, -147, 0, 0, -147, -147, -147, 0, -147, 0, -147, -147, 0, 0, -147, -147, 0, 0, 0, 0, 0, 0, 0, 0, -147, -147, -147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, 0, -168, 0, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, 0, 0, 0, -168, -168, -168, -168, -168, -168, -168, 0, 0, 0, 0, 0, 0, 0, -168, 0, 0, -168, -168, -168, 0, -168, 0, -168, -168, 0, 0, -168, -168, 0, 0, 0, 0, 0, 0, 0, 0, -168, -168, -168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 26
    -        -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, 0, 0, 0, -145, -145, -145, -145, -145, -145, -145, 0, 0, 0, 0, 0, 0, 0, -145, 0, 0, -145, -145, -145, 0, -145, 0, -145, -145, 0, 0, -145, -145, 0, 0, 0, 0, 0, 0, 0, 0, -145, -145, -145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, 0, -169, 0, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, 0, 0, 0, -169, -169, -169, -169, -169, -169, -169, 0, 0, 0, 0, 0, 0, 0, -169, 0, 0, -169, -169, -169, 0, -169, 0, -169, -169, 0, 0, -169, -169, 0, 0, 0, 0, 0, 0, 0, 0, -169, -169, -169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 27
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, 0, -167, 0, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, 0, 0, 0, -167, -167, -167, -167, -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, -167, 0, 0, -167, -167, -167, 0, -167, 0, -167, -167, 0, 0, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 28
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 134, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 29
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 135, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 30
    -        -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, -462, 0, 0, 0, -462, -462, -462, -462, -462, -462, -462, 0, 0, 0, 0, 0, 0, 0, -462, 0, 0, -462, -462, -462, 0, -462, 0, -462, -462, 0, 0, -462, -462, 0, 0, 0, 0, 0, 0, 0, 0, -462, -462, -462, 0, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 31
    -        -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, -314, 0, 0, 0, -314, -314, -314, -314, -314, -314, -314, 0, 0, 0, 0, 0, 0, 0, -314, 0, 0, -314, -314, -314, 0, -314, 0, -314, -314, 0, 0, -314, -314, 0, 0, 0, 0, 0, 0, 0, 0, -314, -314, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, 0, -517, 0, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, -517, 0, 0, 0, -517, -517, -517, -517, -517, -517, -517, 0, 0, 0, 0, 0, 0, 0, -517, 0, 0, -517, -517, -517, 0, -517, 0, -517, -517, 0, 0, -517, -517, 0, 0, 0, 0, 0, 0, 0, 0, -517, -517, -517, 0, 0, 0, 0, -517, 0, 0, 0, 0, 0, 0, 0,
             // State 32
    -        -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, -313, 0, 0, 0, -313, -313, -313, -313, -313, -313, -313, 0, 0, 0, 0, 0, 0, 0, -313, 0, 0, -313, -313, -313, 0, -313, 0, -313, -313, 0, 0, -313, -313, 0, 0, 0, 0, 0, 0, 0, 0, -313, -313, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, 0, -339, 0, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, -339, 0, 0, 0, -339, -339, -339, -339, -339, -339, -339, 0, 0, 0, 0, 0, 0, 0, -339, 0, 0, -339, -339, -339, 0, -339, 0, -339, -339, 0, 0, -339, -339, 0, 0, 0, 0, 0, 0, 0, 0, -339, -339, -339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 33
    -        -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, 0, 0, 0, -312, -312, -312, -312, -312, -312, -312, 0, 0, 0, 0, 0, 0, 0, -312, 0, 0, -312, -312, -312, 0, -312, 0, -312, -312, 0, 0, -312, -312, 0, 0, 0, 0, 0, 0, 0, 0, -312, -312, -312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, 0, -338, 0, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, -338, 0, 0, 0, -338, -338, -338, -338, -338, -338, -338, 0, 0, 0, 0, 0, 0, 0, -338, 0, 0, -338, -338, -338, 0, -338, 0, -338, -338, 0, 0, -338, -338, 0, 0, 0, 0, 0, 0, 0, 0, -338, -338, -338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 34
    -        -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, -274, 0, 0, 0, -274, -274, -274, -274, -274, -274, -274, 0, 0, 0, 0, 0, 0, 0, -274, 0, 0, -274, -274, -274, 0, -274, -274, -274, -274, 0, 0, -274, -274, 0, 0, 0, 0, 0, 0, 0, 0, -274, -274, -274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, 0, -337, 0, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, -337, 0, 0, 0, -337, -337, -337, -337, -337, -337, -337, 0, 0, 0, 0, 0, 0, 0, -337, 0, 0, -337, -337, -337, 0, -337, 0, -337, -337, 0, 0, -337, -337, 0, 0, 0, 0, 0, 0, 0, 0, -337, -337, -337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 35
    -        -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, -464, 0, 0, 0, -464, -464, -464, -464, -464, -464, -464, 0, 0, 0, 0, 0, 0, 0, -464, 0, 0, -464, -464, -464, 0, -464, 0, -464, -464, 0, 0, -464, -464, 0, 0, 0, 0, 0, 0, 0, 0, -464, -464, -464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -464,
    +        -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, 0, -299, 0, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, -299, 0, 0, 0, -299, -299, -299, -299, -299, -299, -299, 0, 0, 0, 0, 0, 0, 0, -299, 0, 0, -299, -299, -299, 0, -299, -299, -299, -299, 0, 0, -299, -299, 0, 0, 0, 0, 0, 0, 0, 0, -299, -299, -299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 36
    -        0, 0, -325, 0, -325, 0, -325, 0, 0, -325, -325, 0, -325, -325, 0, -325, 0, 0, 0, -325, -325, -325, -325, 0, 0, -325, 0, -325, 0, 0, 0, 0, -325, 0, -325, 0, 0, 0, 0, -325, -325, 0, -325, 136, -325, 0, 0, 0, 0, 0, 0, 0, -325, 0, 0, -325, -325, -325, 0, -325, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, -325, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, 0, -519, 0, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, -519, 0, 0, 0, -519, -519, -519, -519, -519, -519, -519, 0, 0, 0, 0, 0, 0, 0, -519, 0, 0, -519, -519, -519, 0, -519, 0, -519, -519, 0, 0, -519, -519, 0, 0, 0, 0, 0, 0, 0, 0, -519, -519, -519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -519,
             // State 37
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -350, 0, -350, 0, -350, 0, 0, -350, -350, 0, -350, -350, 0, -350, 0, 0, 0, 0, 0, -350, -350, -350, -350, 0, 0, -350, 0, -350, 0, 0, 0, 0, -350, 0, -350, 0, 0, 0, 0, -350, -350, 0, -350, 137, -350, 0, 0, 0, 0, 0, 0, 0, -350, 0, 0, -350, -350, -350, 0, -350, 0, 0, 0, 0, 0, 0, -350, 0, 0, 0, 0, 0, 0, 0, 0, 0, -350, -350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 38
    -        0, 0, 0, 0, 0, -207, 0, -207, 0, 0, 0, -207, 0, 0, -207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -207, 0, -207, -207, -207, -207, -207, 0, 0, 0, 0, 0, -207, -207, -207, -207, -207, -207, 0, 0, 0, 0, -207, -207, -207, -207, -207, -207, 0, 0, -207, -207, -207, 0, -207, -207, -207, -207, -207, -207, -207, -207, 0, 0, 0, -207, 0, 0, 0, -207, -207, -207, -207, 0, -207, -207, -207,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 39
    -        138, 0, -311, 0, -311, 0, -311, 0, 0, -311, -311, 0, -311, -311, 0, -311, 0, 0, 0, -311, -311, -311, -311, 139, 0, -311, 140, -311, 141, 142, 143, 0, -311, 0, -311, 0, 0, 0, 0, -311, -311, 0, -311, -311, -311, 0, 0, 0, 0, 0, 0, 0, -311, 0, 0, -311, -311, -311, 0, -311, 0, 144, 145, 0, 0, 146, -311, 0, 0, 0, 0, 0, 0, 0, 0, 0, -311, -311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -230, 0, -230, 0, 0, 0, -230, 0, 0, -230, 0, 0, 0, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -230, 0, -230, -230, -230, -230, -230, 0, 0, 0, 0, 0, -230, -230, -230, -230, -230, -230, 0, 0, 0, 0, -230, -230, -230, -230, -230, -230, 0, 0, -230, -230, -230, 0, -230, -230, -230, -230, -230, -230, -230, -230, 0, 0, 0, -230, 0, 0, 0, -230, -230, -230, -230, 0, -230, -230, -230,
             // State 40
    -        0, 0, 0, 0, 0, -371, 0, -371, 0, 0, 0, -371, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -371, 0, -371, -371, -371, -371, -371, 0, 0, 0, 0, 0, -371, -371, -371, -371, -371, -371, 0, 0, 0, 0, -371, -371, -371, -371, -371, -371, 0, 0, -371, -371, -371, 0, -371, -371, -371, -371, -371, -371, -371, -371, 0, 0, 0, -371, 0, 0, 0, -371, -371, -371, -371, 0, -371, -371, -371,
    +        139, 0, -336, 0, -336, 0, -336, 0, 0, -336, -336, 0, -336, -336, 0, -336, 0, 0, 0, 0, 0, -336, -336, -336, -336, 140, 0, -336, 141, -336, 142, 143, 144, 0, -336, 0, -336, 0, 0, 0, 0, -336, -336, 0, -336, -336, -336, 0, 0, 0, 0, 0, 0, 0, -336, 0, 0, -336, -336, -336, 0, -336, 0, 145, 146, 0, 0, 147, -336, 0, 0, 0, 0, 0, 0, 0, 0, 0, -336, -336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 41
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -217, 0, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -404, 0, -404, 0, 0, 0, -404, 0, 0, -404, 0, 0, 0, -404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -404, 0, -404, -404, -404, -404, -404, 0, 0, 0, 0, 0, -404, -404, -404, -404, -404, -404, 0, 0, 0, 0, -404, -404, -404, -404, -404, -404, 0, 0, -404, -404, -404, 0, -404, -404, -404, -404, -404, -404, -404, -404, 0, 0, 0, -404, 0, 0, 0, -404, -404, -404, -404, 0, -404, -404, -404,
             // State 42
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 43
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 44
    -        -200, 0, -200, 0, -200, 0, -200, 0, 0, -200, -200, 0, -200, -200, 0, -200, 0, 0, 0, -200, -200, -200, -200, -200, 0, -200, -200, -200, -200, -200, -200, 0, -200, 0, -200, 0, 0, 0, 0, -200, -200, 0, -200, -200, -200, 0, 0, 0, 0, 0, 0, 0, -200, 0, 0, -200, -200, -200, 0, -200, 0, -200, -200, 0, 0, -200, -200, 0, 0, 0, 0, 0, 0, 0, 0, 106, -200, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        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, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 45
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -223, 0, -223, 0, -223, 0, -223, 0, 0, -223, -223, 0, -223, -223, 0, -223, 0, 0, 0, 0, 0, -223, -223, -223, -223, -223, 0, -223, -223, -223, -223, -223, -223, 0, -223, 0, -223, 0, 0, 0, 0, -223, -223, 0, -223, -223, -223, 0, 0, 0, 0, 0, 0, 0, -223, 0, 0, -223, -223, -223, 0, -223, 0, -223, -223, 0, 0, -223, -223, 0, 0, 0, 0, 0, 0, 0, 0, 107, -223, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 46
    -        0, 0, 0, 0, 0, -250, 0, -250, 0, 0, 0, -250, 0, 0, -250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -250, 0, -250, -250, -250, -250, -250, 0, 0, 0, 0, 0, -250, -250, -250, -250, -250, -250, 0, 0, 0, 0, -250, -250, -250, -250, -250, -250, 0, 0, -250, -250, -250, 0, -250, -250, -250, -250, -250, -250, -250, -250, 0, 0, 0, -250, 0, 0, 0, -250, -250, 0, -250, 0, -250, -250, -250,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 47
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 25, 26, 27, 28, 75, 0, 0, 0, 0, 0, 76, 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, 83, 83, 84, 85, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 93, 94, 95, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -273, 0, -273, 0, 0, 0, -273, 0, 0, -273, 0, 0, 0, -273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -273, 0, -273, -273, -273, -273, -273, 0, 0, 0, 0, 0, -273, -273, -273, -273, -273, -273, 0, 0, 0, 0, -273, -273, -273, -273, -273, -273, 0, 0, -273, -273, -273, 0, -273, -273, -273, -273, -273, -273, -273, -273, 0, 0, 0, -273, 0, 0, 0, -273, -273, 0, -273, 0, -273, -273, -273,
             // State 48
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 26, 27, 28, 29, 76, 0, 0, 0, 0, 0, 77, 78, 79, 80, 81, 82, 0, 0, 0, 0, 83, 84, 84, 85, 86, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 94, 95, 96, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 49
    -        0, 0, 0, 0, 0, -203, 0, -203, 0, 0, 0, -203, 0, 0, -203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -203, 0, -203, -203, -203, -203, -203, 0, 0, 0, 0, 0, -203, -203, -203, -203, -203, -203, 0, 0, 0, 0, -203, -203, -203, -203, -203, -203, 0, 0, -203, -203, -203, 0, -203, -203, -203, -203, -203, -203, -203, -203, 0, 0, 0, -203, 0, 0, 0, -203, -203, -203, -203, 0, -203, -203, -203,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 50
    -        0, 0, 0, 0, 0, -206, 0, -206, 0, 0, 0, -206, 0, 0, -206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206, 0, -206, -206, -206, -206, -206, 0, 0, 0, 0, 0, -206, -206, -206, -206, -206, -206, 0, 0, 0, 0, -206, -206, -206, -206, -206, -206, 0, 0, -206, -206, -206, 0, -206, -206, -206, -206, -206, -206, -206, -206, 0, 0, 0, -206, 0, 0, 0, -206, -206, -206, -206, 0, -206, -206, -206,
    +        0, 0, 0, 0, 0, -226, 0, -226, 0, 0, 0, -226, 0, 0, -226, 0, 0, 0, -226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -226, 0, -226, -226, -226, -226, -226, 0, 0, 0, 0, 0, -226, -226, -226, -226, -226, -226, 0, 0, 0, 0, -226, -226, -226, -226, -226, -226, 0, 0, -226, -226, -226, 0, -226, -226, -226, -226, -226, -226, -226, -226, 0, 0, 0, -226, 0, 0, 0, -226, -226, -226, -226, 0, -226, -226, -226,
             // State 51
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -229, 0, -229, 0, 0, 0, -229, 0, 0, -229, 0, 0, 0, -229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -229, 0, -229, -229, -229, -229, -229, 0, 0, 0, 0, 0, -229, -229, -229, -229, -229, -229, 0, 0, 0, 0, -229, -229, -229, -229, -229, -229, 0, 0, -229, -229, -229, 0, -229, -229, -229, -229, -229, -229, -229, -229, 0, 0, 0, -229, 0, 0, 0, -229, -229, -229, -229, 0, -229, -229, -229,
             // State 52
    -        0, 0, 0, 0, 0, -201, 0, -201, 0, 0, 0, -201, 0, 0, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0, -201, -201, -201, -201, -201, 0, 0, 0, 0, 0, -201, -201, -201, -201, -201, -201, 0, 0, 0, 0, -201, -201, -201, -201, -201, -201, 0, 0, -201, -201, -201, 0, -201, -201, -201, -201, -201, -201, -201, -201, 0, 0, 0, -201, 0, 0, 0, -201, -201, -201, -201, 0, -201, -201, -201,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 53
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -224, 0, -224, 0, 0, 0, -224, 0, 0, -224, 0, 0, 0, -224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -224, 0, -224, -224, -224, -224, -224, 0, 0, 0, 0, 0, -224, -224, -224, -224, -224, -224, 0, 0, 0, 0, -224, -224, -224, -224, -224, -224, 0, 0, -224, -224, -224, 0, -224, -224, -224, -224, -224, -224, -224, -224, 0, 0, 0, -224, 0, 0, 0, -224, -224, -224, -224, 0, -224, -224, -224,
             // State 54
    -        0, 0, -390, 0, -390, 0, -390, 0, 0, -390, -390, 0, -390, -390, 0, -390, 0, 0, 0, -390, -390, -390, -390, 0, 0, -390, 0, -390, 0, 0, 0, 0, -390, 0, -390, 0, 0, 0, 0, -390, -390, 0, -390, 0, -390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -390, -390, -390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -390, -390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 55
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -427, 0, -427, 0, -427, 0, 0, -427, -427, 0, -427, -427, 0, -427, 0, 0, 0, 0, 0, -427, -427, -427, -427, 0, 0, -427, 0, -427, 0, 0, 0, 0, -427, 0, -427, 0, 0, 0, 0, -427, -427, 0, -427, 0, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -427, -427, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -427, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 56
    -        0, 0, -112, 0, -112, 0, -112, 0, 0, -112, -112, 0, -112, -112, 0, -112, 0, 0, 0, -112, -112, -112, -112, 0, 0, -112, 0, -112, 0, 0, 0, 0, -112, 0, -112, 0, 0, 0, 0, -112, -112, 0, -112, -112, -112, 0, 0, 0, 0, 0, 0, 0, -112, 0, 0, -112, -112, -112, 0, -112, 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        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, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 57
    -        0, 0, -389, 0, -389, 0, -389, 0, 0, -389, -389, 0, -389, -389, 0, -389, 0, 0, 0, -389, -389, -389, -389, 0, 0, -389, 0, -389, 0, 0, 0, 0, -389, 0, -389, 0, 0, 0, 0, -389, -389, 0, -389, 0, -389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -389, -389, -389, 0, 151, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, -389, -389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -134, 0, -134, 0, -134, 0, 0, -134, -134, 0, -134, -134, 0, -134, 0, 0, 0, 0, 0, -134, -134, -134, -134, 0, 0, -134, 0, -134, 0, 0, 0, 0, -134, 0, -134, 0, 0, 0, 0, -134, -134, 0, -134, -134, -134, 0, 0, 0, 0, 0, 0, 0, -134, 0, 0, -134, -134, -134, 0, -134, 0, 0, 0, 0, 0, 0, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 58
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -426, 0, -426, 0, -426, 0, 0, -426, -426, 0, -426, -426, 0, -426, 0, 0, 0, 0, 0, -426, -426, -426, -426, 0, 0, -426, 0, -426, 0, 0, 0, 0, -426, 0, -426, 0, 0, 0, 0, -426, -426, 0, -426, 0, -426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -426, -426, -426, 0, 152, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, -426, -426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 59
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 60
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 61
    -        0, 0, 0, 0, 0, -370, 0, -370, 0, 0, 0, -370, 0, 0, -370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -370, 0, -370, -370, -370, -370, -370, 0, 0, 0, 0, 0, -370, -370, -370, -370, -370, -370, 0, 0, 0, 0, -370, -370, -370, -370, -370, -370, 0, 0, -370, -370, -370, 0, -370, -370, -370, -370, -370, -370, -370, -370, 0, 0, 0, -370, 0, 0, 0, -370, -370, -370, -370, 0, -370, -370, -370,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 62
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -403, 0, -403, 0, 0, 0, -403, 0, 0, -403, 0, 0, 0, -403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -403, 0, -403, -403, -403, -403, -403, 0, 0, 0, 0, 0, -403, -403, -403, -403, -403, -403, 0, 0, 0, 0, -403, -403, -403, -403, -403, -403, 0, 0, -403, -403, -403, 0, -403, -403, -403, -403, -403, -403, -403, -403, 0, 0, 0, -403, 0, 0, 0, -403, -403, -403, -403, 0, -403, -403, -403,
             // State 63
    -        0, 0, -413, 0, -413, 0, 0, 0, 0, -413, -413, 0, -413, -413, 0, -413, 0, 0, 0, -413, -413, 0, -413, 0, 0, -413, 0, -413, 0, 0, 0, 0, -413, 0, -413, 0, 0, 0, 0, -413, -413, 0, -413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 64
    -        0, 0, 0, 0, 0, -246, 0, -246, 0, 0, 0, -246, 0, 0, -246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -246, 0, -246, -246, -246, -246, -246, 0, 0, 0, 0, 0, -246, -246, -246, -246, -246, -246, 0, 0, 0, 0, -246, -246, -246, -246, -246, -246, 0, 0, -246, -246, -246, 0, -246, -246, -246, -246, -246, -246, -246, -246, 0, 0, 0, -246, 0, 0, 0, -246, -246, 0, -246, 0, -246, -246, -246,
    +        0, 0, -450, 0, -450, 0, 0, 0, 0, -450, -450, 0, -450, -450, 0, -450, 0, 0, 0, 0, 0, -450, -450, 0, -450, 0, 0, -450, 0, -450, 0, 0, 0, 0, -450, 0, -450, 0, 0, 0, 0, -450, -450, 0, -450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 65
    -        0, 0, -412, 0, -412, 0, 0, 0, 0, -412, -412, 0, -412, -412, 0, -412, 0, 0, 0, -412, -412, 0, -412, 0, 0, -412, 0, -412, 0, 0, 0, 0, -412, 0, -412, 0, 0, 0, 0, -412, -412, 0, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -269, 0, -269, 0, 0, 0, -269, 0, 0, -269, 0, 0, 0, -269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -269, 0, -269, -269, -269, -269, -269, 0, 0, 0, 0, 0, -269, -269, -269, -269, -269, -269, 0, 0, 0, 0, -269, -269, -269, -269, -269, -269, 0, 0, -269, -269, -269, 0, -269, -269, -269, -269, -269, -269, -269, -269, 0, 0, 0, -269, 0, 0, 0, -269, -269, 0, -269, 0, -269, -269, -269,
             // State 66
    -        0, 0, -416, 0, -416, 0, 0, 0, 0, -416, -416, 0, -416, 156, 0, -416, 0, 0, 0, -416, -416, 0, -416, 0, 0, -416, 0, -416, 0, 0, 0, 0, -416, 0, -416, 0, 0, 0, 0, -416, 0, 0, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -449, 0, -449, 0, 0, 0, 0, -449, -449, 0, -449, -449, 0, -449, 0, 0, 0, 0, 0, -449, -449, 0, -449, 0, 0, -449, 0, -449, 0, 0, 0, 0, -449, 0, -449, 0, 0, 0, 0, -449, -449, 0, -449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 67
    -        0, 0, 160, 0, 161, 0, 0, 0, 0, 162, 163, 0, 164, 0, 0, 165, 0, 0, 0, 166, 167, 0, -238, 0, 0, 168, 0, 169, 0, 0, 0, 0, 170, 0, 171, 0, 0, 0, 0, -238, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -453, 0, -453, 0, 0, 0, 0, -453, -453, 0, -453, 157, 0, -453, 0, 0, 0, 0, 0, -453, -453, 0, -453, 0, 0, -453, 0, -453, 0, 0, 0, 0, -453, 0, -453, 0, 0, 0, 0, -453, 0, 0, -453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 68
    -        0, 0, 0, 0, 0, -204, 0, -204, 0, 0, 0, -204, 0, 0, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -204, 0, -204, -204, -204, -204, -204, 0, 0, 0, 0, 0, -204, -204, -204, -204, -204, -204, 0, 0, 0, 0, -204, -204, -204, -204, -204, -204, 0, 0, -204, -204, -204, 0, -204, -204, -204, -204, -204, -204, -204, -204, 0, 0, 0, -204, 0, 0, 0, -204, -204, -204, -204, 0, -204, -204, -204,
    +        0, 0, 161, 0, 162, 0, 0, 0, 0, 163, 164, 0, 165, 0, 0, 166, 0, 0, 0, 0, 0, 167, 168, 0, -261, 0, 0, 169, 0, 170, 0, 0, 0, 0, 171, 0, 172, 0, 0, 0, 0, -261, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 69
    -        0, 0, 0, 0, 0, -202, 0, -202, 0, 0, 0, -202, 0, 0, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, 0, -202, -202, -202, -202, -202, 0, 0, 0, 0, 0, -202, -202, -202, -202, -202, -202, 0, 0, 0, 0, -202, -202, -202, -202, -202, -202, 0, 0, -202, -202, -202, 0, -202, -202, -202, -202, -202, -202, -202, -202, 0, 0, 0, -202, 0, 0, 0, -202, -202, -202, -202, 0, -202, -202, -202,
    +        0, 0, 0, 0, 0, -227, 0, -227, 0, 0, 0, -227, 0, 0, -227, 0, 0, 0, -227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -227, 0, -227, -227, -227, -227, -227, 0, 0, 0, 0, 0, -227, -227, -227, -227, -227, -227, 0, 0, 0, 0, -227, -227, -227, -227, -227, -227, 0, 0, -227, -227, -227, 0, -227, -227, -227, -227, -227, -227, -227, -227, 0, 0, 0, -227, 0, 0, 0, -227, -227, -227, -227, 0, -227, -227, -227,
             // State 70
    -        0, 0, 0, 0, 0, -205, 0, -205, 0, 0, 0, -205, 0, 0, -205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -205, 0, -205, -205, -205, -205, -205, 0, 0, 0, 0, 0, -205, -205, -205, -205, -205, -205, 0, 0, 0, 0, -205, -205, -205, -205, -205, -205, 0, 0, -205, -205, -205, 0, -205, -205, -205, -205, -205, -205, -205, -205, 0, 0, 0, -205, 0, 0, 0, -205, -205, -205, -205, 0, -205, -205, -205,
    +        0, 0, 0, 0, 0, -225, 0, -225, 0, 0, 0, -225, 0, 0, -225, 0, 0, 0, -225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -225, 0, -225, -225, -225, -225, -225, 0, 0, 0, 0, 0, -225, -225, -225, -225, -225, -225, 0, 0, 0, 0, -225, -225, -225, -225, -225, -225, 0, 0, -225, -225, -225, 0, -225, -225, -225, -225, -225, -225, -225, -225, 0, 0, 0, -225, 0, 0, 0, -225, -225, -225, -225, 0, -225, -225, -225,
             // State 71
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -228, 0, -228, 0, 0, 0, -228, 0, 0, -228, 0, 0, 0, -228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228, 0, -228, -228, -228, -228, -228, 0, 0, 0, 0, 0, -228, -228, -228, -228, -228, -228, 0, 0, 0, 0, -228, -228, -228, -228, -228, -228, 0, 0, -228, -228, -228, 0, -228, -228, -228, -228, -228, -228, -228, -228, 0, 0, 0, -228, 0, 0, 0, -228, -228, -228, -228, 0, -228, -228, -228,
             // State 72
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 73
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 74
    -        0, 0, 0, 0, 0, -247, 0, -247, 0, 0, 0, -247, 0, 0, -247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -247, 0, -247, -247, -247, -247, -247, 0, 0, 0, 0, 0, -247, -247, -247, -247, -247, -247, 0, 0, 0, 0, -247, -247, -247, -247, -247, -247, 0, 0, -247, -247, -247, 0, -247, -247, -247, -247, -247, -247, -247, -247, 0, 0, 0, -247, 0, 0, 0, -247, -247, 0, -247, 0, -247, -247, -247,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 75
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -270, 0, -270, 0, 0, 0, -270, 0, 0, -270, 0, 0, 0, -270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -270, 0, -270, -270, -270, -270, -270, 0, 0, 0, 0, 0, -270, -270, -270, -270, -270, -270, 0, 0, 0, 0, -270, -270, -270, -270, -270, -270, 0, 0, -270, -270, -270, 0, -270, -270, -270, -270, -270, -270, -270, -270, 0, 0, 0, -270, 0, 0, 0, -270, -270, 0, -270, 0, -270, -270, -270,
             // State 76
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 77
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 78
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 79
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 80
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 81
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 82
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 83
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0,
             // State 84
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 85
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 86
    -        0, 0, 0, 0, 0, 0, 0, 200, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0,
             // State 87
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 201, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 88
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 89
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, -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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 90
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, -344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, -344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 91
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, -256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, -256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, -377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, -377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 92
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 93
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 94
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 95
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, -459, 0, 0, 0, 0, -459, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, -459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 212, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 96
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, -514, 0, 0, 0, 0, -514, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, -514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 213, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 97
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 98
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 99
    -        0, 0, 0, 0, 0, -108, 0, 0, 0, 0, 0, -108, 0, 0, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, -108, -108, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, 0, 0, 0, -108, 0, 0, 0, -108, -108, 0, -108, 0, -108, -108, -108,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 100
    -        0, 0, 0, 0, 0, -109, 0, 0, 0, 0, 0, -109, 0, 0, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109, -109, -109, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109, 0, 0, 0, -109, 0, 0, 0, -109, -109, 0, -109, 0, -109, -109, -109,
    +        0, 0, 0, 0, 0, -130, 0, 0, 0, 0, 0, -130, 0, 0, -130, 0, 0, 0, -130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -130, -130, -130, -130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -130, 0, 0, 0, -130, 0, 0, 0, -130, -130, 0, -130, 0, -130, -130, -130,
             // State 101
    -        0, 0, 0, 0, 0, 22, -171, 221, 222, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -131, 0, 0, 0, 0, 0, -131, 0, 0, -131, 0, 0, 0, -131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -131, -131, -131, -131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -131, 0, 0, 0, -131, 0, 0, 0, -131, -131, 0, -131, 0, -131, -131, -131,
             // State 102
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, -194, 222, 223, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 103
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 104
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 105
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 106
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 107
    -        0, 0, 0, 0, 0, -349, 0, 0, 0, 0, 0, -349, 0, 0, -349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -349, -349, -349, -349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -349, 0, 0, 0, -349, 0, 0, 0, -349, -349, 0, -349, 0, -349, -349, -349,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 108
    -        0, 0, 0, 0, 0, -350, 0, 0, 0, 0, 0, -350, 0, 0, -350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -350, -350, -350, -350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -350, 0, 0, 0, -350, 0, 0, 0, -350, -350, 0, -350, 0, -350, -350, -350,
    +        0, 0, 0, 0, 0, -382, 0, 0, 0, 0, 0, -382, 0, 0, -382, 0, 0, 0, -382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -382, -382, -382, -382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -382, 0, 0, 0, -382, 0, 0, 0, -382, -382, 0, -382, 0, -382, -382, -382,
             // State 109
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -383, 0, 0, 0, 0, 0, -383, 0, 0, -383, 0, 0, 0, -383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -383, -383, -383, -383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -383, 0, 0, 0, -383, 0, 0, 0, -383, -383, 0, -383, 0, -383, -383, -383,
             // State 110
    -        0, 0, 0, 0, 0, -306, 0, 0, 0, 0, 0, -306, 0, 0, -306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -306, -306, -306, -306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -306, 0, 0, 0, -306, 0, 0, 0, -306, -306, 0, -306, 0, -306, -306, -306,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 111
    -        0, 0, 0, 0, 0, -303, 0, 0, 0, 0, 0, -303, 0, 0, -303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -303, -303, -303, -303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -303, 0, 0, 0, -303, 0, 0, 0, -303, -303, 0, -303, 0, -303, -303, -303,
    +        0, 0, 0, 0, 0, -331, 0, 0, 0, 0, 0, -331, 0, 0, -331, 0, 0, 0, -331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -331, -331, -331, -331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -331, 0, 0, 0, -331, 0, 0, 0, -331, -331, 0, -331, 0, -331, -331, -331,
             // State 112
    -        0, 0, 0, 0, 0, -304, 0, 0, 0, 0, 0, -304, 0, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, -304, -304, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, -304, 0, 0, 0, -304, -304, 0, -304, 0, -304, -304, -304,
    +        0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, -328, 0, 0, -328, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -328, -328, -328, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, -328, 0, 0, 0, -328, -328, 0, -328, 0, -328, -328, -328,
             // State 113
    -        0, 0, 0, 0, 0, -305, 0, 0, 0, 0, 0, -305, 0, 0, -305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -305, -305, -305, -305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -305, 0, 0, 0, -305, 0, 0, 0, -305, -305, 0, -305, 0, -305, -305, -305,
    +        0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, -329, 0, 0, -329, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -329, -329, -329, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, -329, 0, 0, 0, -329, -329, 0, -329, 0, -329, -329, -329,
             // State 114
    -        0, 0, 0, 0, 0, -307, 0, 0, 0, 0, 0, -307, 0, 0, -307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -307, -307, -307, -307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -307, 0, 0, 0, -307, 0, 0, 0, -307, -307, 0, -307, 0, -307, -307, -307,
    +        0, 0, 0, 0, 0, -330, 0, 0, 0, 0, 0, -330, 0, 0, -330, 0, 0, 0, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -330, -330, -330, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -330, 0, 0, 0, -330, 0, 0, 0, -330, -330, 0, -330, 0, -330, -330, -330,
             // State 115
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -332, 0, 0, 0, 0, 0, -332, 0, 0, -332, 0, 0, 0, -332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -332, -332, -332, -332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -332, 0, 0, 0, -332, 0, 0, 0, -332, -332, 0, -332, 0, -332, -332, -332,
             // State 116
    -        -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, -463, 0, 0, 0, -463, -463, -463, -463, -463, -463, -463, 0, 0, 0, 0, 0, 0, 0, -463, 0, 0, -463, -463, -463, 0, -463, 0, -463, -463, 0, 0, -463, -463, 0, 0, 0, 0, 0, 0, 0, 0, -463, -463, -463, 0, 0, 0, 0, -463, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 117
    -        -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, -465, 0, 0, 0, -465, -465, -465, -465, -465, -465, -465, 0, 0, 0, 0, 0, 0, 0, -465, 0, 0, -465, -465, -465, 0, -465, 0, -465, -465, 0, 0, -465, -465, 0, 0, 0, 0, 0, 0, 0, 0, -465, -465, -465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -465,
    +        -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, 0, -518, 0, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, 0, 0, 0, -518, -518, -518, -518, -518, -518, -518, 0, 0, 0, 0, 0, 0, 0, -518, 0, 0, -518, -518, -518, 0, -518, 0, -518, -518, 0, 0, -518, -518, 0, 0, 0, 0, 0, 0, 0, 0, -518, -518, -518, 0, 0, 0, 0, -518, 0, 0, 0, 0, 0, 0, 0,
             // State 118
    -        0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, 0, -520, 0, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, 0, 0, 0, -520, -520, -520, -520, -520, -520, -520, 0, 0, 0, 0, 0, 0, 0, -520, 0, 0, -520, -520, -520, 0, -520, 0, -520, -520, 0, 0, -520, -520, 0, 0, 0, 0, 0, 0, 0, 0, -520, -520, -520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -520,
             // State 119
    -        -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, 0, 0, 0, -138, -138, -138, -138, -138, -138, -138, 0, 0, 0, 0, 0, 0, 0, -138, 0, 0, -138, -138, -138, 0, -138, 0, -138, -138, 0, 0, -138, -138, 0, 0, 0, 0, 0, 0, 0, 0, -138, -138, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 120
    -        0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, 0, -160, 0, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, 0, 0, 0, -160, -160, -160, -160, -160, -160, -160, 0, 0, 0, 0, 0, 0, 0, -160, 0, 0, -160, -160, -160, 0, -160, 0, -160, -160, 0, 0, -160, -160, 0, 0, 0, 0, 0, 0, 0, 0, -160, -160, -160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 121
    -        -242, -242, -242, -242, -242, 0, -242, -242, 0, -242, -242, -242, -242, -242, -242, -242, 0, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, 0, 0, 0, 0, -242, -242, -242, -242, -242, -242, 0, 0, 0, 0, 0, 0, 0, -242, 0, 0, -242, -242, -242, 0, -242, 0, -242, -242, 0, 0, -242, -242, 0, 0, 0, 0, 0, 0, 0, 0, -242, -242, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 122
    -        -243, -243, -243, -243, -243, 0, -243, -243, 0, -243, -243, -243, -243, -243, -243, -243, 0, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, 0, 0, 0, 0, -243, -243, -243, -243, -243, -243, 0, 0, 0, 0, 0, 0, 0, -243, 0, 0, -243, -243, -243, 0, -243, 0, -243, -243, 0, 0, -243, -243, 0, 0, 0, 0, 0, 0, 0, 0, -243, -243, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -265, -265, -265, -265, -265, 0, -265, -265, 0, -265, -265, -265, -265, -265, -265, -265, 0, 0, 0, -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, 0, 0, 0, 0, -265, -265, -265, -265, -265, -265, 0, 0, 0, 0, 0, 0, 0, -265, 0, 0, -265, -265, -265, 0, -265, 0, -265, -265, 0, 0, -265, -265, 0, 0, 0, 0, 0, 0, 0, 0, -265, -265, -265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 123
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -266, -266, -266, -266, -266, 0, -266, -266, 0, -266, -266, -266, -266, -266, -266, -266, 0, 0, 0, -266, -266, -266, -266, -266, -266, -266, -266, -266, -266, -266, -266, -266, -266, -266, -266, -266, -266, 0, 0, 0, 0, -266, -266, -266, -266, -266, -266, 0, 0, 0, 0, 0, 0, 0, -266, 0, 0, -266, -266, -266, 0, -266, 0, -266, -266, 0, 0, -266, -266, 0, 0, 0, 0, 0, 0, 0, 0, -266, -266, -266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 124
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 125
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 126
    -        -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, -131, 0, 0, 0, -131, -131, -131, -131, -131, -131, -131, 0, 0, 0, 0, 0, 0, 0, -131, 0, 0, -131, -131, -131, 0, -131, 0, -131, -131, 0, 0, -131, -131, 0, 0, 0, 0, 0, 0, 0, 0, -131, -131, -131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 127
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 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, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, 0, -153, 0, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, -153, 0, 0, 0, -153, -153, -153, -153, -153, -153, -153, 0, 0, 0, 0, 0, 0, 0, -153, 0, 0, -153, -153, -153, 0, -153, 0, -153, -153, 0, 0, -153, -153, 0, 0, 0, 0, 0, 0, 0, 0, -153, -153, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 128
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 129
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 130
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 131
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 132
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 133
    -        -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, -141, 0, 0, 0, -141, -141, -141, -141, -141, -141, -141, 0, 0, 0, 0, 0, 0, 0, -141, 0, 0, -141, -141, -141, 0, -141, 0, -141, -141, 0, 0, -141, -141, 0, 0, 0, 0, 0, 0, 0, 0, -141, -141, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 134
    -        -244, -244, -244, -244, -244, 0, -244, -244, 0, -244, -244, -244, -244, -244, -244, -244, 0, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, 0, 0, 0, 0, -244, -244, -244, -244, -244, -244, 0, 0, 0, 0, 0, 0, 0, -244, 0, 0, -244, -244, -244, 0, -244, 0, -244, -244, 0, 0, -244, -244, 0, 0, 0, 0, 0, 0, 0, 0, -244, -244, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, 0, -163, 0, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, 0, 0, 0, -163, -163, -163, -163, -163, -163, -163, 0, 0, 0, 0, 0, 0, 0, -163, 0, 0, -163, -163, -163, 0, -163, 0, -163, -163, 0, 0, -163, -163, 0, 0, 0, 0, 0, 0, 0, 0, -163, -163, -163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 135
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        -267, -267, -267, -267, -267, 0, -267, -267, 0, -267, -267, -267, -267, -267, -267, -267, 0, 0, 0, -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, 0, 0, 0, 0, -267, -267, -267, -267, -267, -267, 0, 0, 0, 0, 0, 0, 0, -267, 0, 0, -267, -267, -267, 0, -267, 0, -267, -267, 0, 0, -267, -267, 0, 0, 0, 0, 0, 0, 0, 0, -267, -267, -267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 136
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 137
    -        0, 0, 0, 0, 0, -190, 0, 0, 0, 0, 0, -190, 0, 0, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -190, -190, -190, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -190, 0, 0, 0, -190, 0, 0, 0, -190, -190, 0, -190, 0, -190, -190, -190,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 138
    -        0, 0, 0, 0, 0, -191, 0, 0, 0, 0, 0, -191, 0, 0, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -191, -191, -191, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -191, 0, 0, 0, -191, 0, 0, 0, -191, -191, 0, -191, 0, -191, -191, -191,
    +        0, 0, 0, 0, 0, -213, 0, 0, 0, 0, 0, -213, 0, 0, -213, 0, 0, 0, -213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -213, -213, -213, -213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -213, 0, 0, 0, -213, 0, 0, 0, -213, -213, 0, -213, 0, -213, -213, -213,
             // State 139
    -        0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, -192, 0, 0, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, 0, 0, 0, -192, 0, 0, 0, -192, -192, 0, -192, 0, -192, -192, -192,
    +        0, 0, 0, 0, 0, -214, 0, 0, 0, 0, 0, -214, 0, 0, -214, 0, 0, 0, -214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -214, -214, -214, -214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -214, 0, 0, 0, -214, 0, 0, 0, -214, -214, 0, -214, 0, -214, -214, -214,
             // State 140
    -        0, 0, 0, 0, 0, -189, 0, 0, 0, 0, 0, -189, 0, 0, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -189, -189, -189, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -189, 0, 0, 0, -189, 0, 0, 0, -189, -189, 0, -189, 0, -189, -189, -189,
    +        0, 0, 0, 0, 0, -215, 0, 0, 0, 0, 0, -215, 0, 0, -215, 0, 0, 0, -215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -215, -215, -215, -215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -215, 0, 0, 0, -215, 0, 0, 0, -215, -215, 0, -215, 0, -215, -215, -215,
             // State 141
    -        0, 0, 0, 0, 0, -193, 0, 0, 0, 0, 0, -193, 0, 0, -193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, -193, -193, -193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, 0, 0, 0, -193, 0, 0, 0, -193, -193, 0, -193, 0, -193, -193, -193,
    +        0, 0, 0, 0, 0, -212, 0, 0, 0, 0, 0, -212, 0, 0, -212, 0, 0, 0, -212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -212, -212, -212, -212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -212, 0, 0, 0, -212, 0, 0, 0, -212, -212, 0, -212, 0, -212, -212, -212,
             // State 142
    -        0, 0, 0, 0, 0, -194, 0, 0, 0, 0, 0, -194, 0, 0, -194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -194, -194, -194, -194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -194, 0, 0, 0, -194, 0, 0, 0, -194, -194, 0, -194, 0, -194, -194, -194,
    +        0, 0, 0, 0, 0, -216, 0, 0, 0, 0, 0, -216, 0, 0, -216, 0, 0, 0, -216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -216, -216, -216, -216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -216, 0, 0, 0, -216, 0, 0, 0, -216, -216, 0, -216, 0, -216, -216, -216,
             // State 143
    -        0, 0, 0, 0, 0, -195, 0, 0, 0, 0, 0, -195, 0, 0, -195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -195, -195, -195, -195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -195, 0, 0, 0, -195, 0, 0, 0, -195, -195, 0, -195, 0, -195, -195, -195,
    +        0, 0, 0, 0, 0, -217, 0, 0, 0, 0, 0, -217, 0, 0, -217, 0, 0, 0, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -217, -217, -217, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -217, 0, 0, 0, -217, 0, 0, 0, -217, -217, 0, -217, 0, -217, -217, -217,
             // State 144
    -        0, 0, 0, 0, 0, -197, 0, 0, 0, 0, 0, -197, 0, 0, -197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -197, -197, -197, -197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, -197, 0, 0, 0, -197, 0, 0, 0, -197, -197, 0, -197, 0, -197, -197, -197,
    +        0, 0, 0, 0, 0, -218, 0, 0, 0, 0, 0, -218, 0, 0, -218, 0, 0, 0, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -218, -218, -218, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -218, 0, 0, 0, -218, 0, 0, 0, -218, -218, 0, -218, 0, -218, -218, -218,
             // State 145
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -220, 0, 0, 0, 0, 0, -220, 0, 0, -220, 0, 0, 0, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, -220, -220, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0, 0, 0, -220, 0, 0, 0, -220, -220, 0, -220, 0, -220, -220, -220,
             // State 146
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -218, 0, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 147
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, 0, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 148
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 149
    -        0, 0, 0, 0, 0, -251, 0, -251, 0, 0, 0, -251, 0, 0, -251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -251, 0, -251, -251, -251, -251, -251, 0, 0, 0, 0, 0, -251, -251, -251, -251, -251, -251, 0, 0, 0, 0, -251, -251, -251, -251, -251, -251, 0, 0, -251, -251, -251, 0, -251, -251, -251, -251, -251, -251, -251, -251, 0, 0, 0, -251, 0, 0, 0, -251, -251, 0, -251, 0, -251, -251, -251,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 150
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -274, 0, -274, 0, 0, 0, -274, 0, 0, -274, 0, 0, 0, -274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -274, 0, -274, -274, -274, -274, -274, 0, 0, 0, 0, 0, -274, -274, -274, -274, -274, -274, 0, 0, 0, 0, -274, -274, -274, -274, -274, -274, 0, 0, -274, -274, -274, 0, -274, -274, -274, -274, -274, -274, -274, -274, 0, 0, 0, -274, 0, 0, 0, -274, -274, 0, -274, 0, -274, -274, -274,
             // State 151
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 152
    -        0, 0, 0, 0, 0, -352, 0, -352, 0, 0, 0, -352, 0, 0, -352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -352, 0, -352, -352, -352, -352, -352, 0, 0, 0, 0, 0, -352, -352, -352, -352, -352, -352, -352, -352, -352, -352, -352, -352, -352, -352, -352, -352, 0, 0, -352, -352, -352, 0, -352, -352, -352, -352, -352, -352, -352, -352, 0, 0, 0, -352, 0, 0, 0, -352, -352, -352, -352, 0, -352, -352, -352,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 153
    -        0, 0, 0, 0, 0, -351, 0, -351, 0, 0, 0, -351, 0, 0, -351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -351, 0, -351, -351, -351, -351, -351, 0, 0, 0, 0, 0, -351, -351, -351, -351, -351, -351, -351, -351, -351, -351, -351, -351, -351, -351, -351, -351, 0, 0, -351, -351, -351, 0, -351, -351, -351, -351, -351, -351, -351, -351, 0, 0, 0, -351, 0, 0, 0, -351, -351, -351, -351, 0, -351, -351, -351,
    +        0, 0, 0, 0, 0, -385, 0, -385, 0, 0, 0, -385, 0, 0, -385, 0, 0, 0, -385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -385, 0, -385, -385, -385, -385, -385, 0, 0, 0, 0, 0, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, 0, 0, -385, -385, -385, 0, -385, -385, -385, -385, -385, -385, -385, -385, 0, 0, 0, -385, 0, 0, 0, -385, -385, -385, -385, 0, -385, -385, -385,
             // State 154
    -        0, 0, -417, 0, -417, 0, 0, 0, 0, -417, -417, 0, -417, 264, 0, -417, 0, 0, 0, -417, -417, 0, -417, 0, 0, -417, 0, -417, 0, 0, 0, 0, -417, 0, -417, 0, 0, 0, 0, -417, 0, 0, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -384, 0, -384, 0, 0, 0, -384, 0, 0, -384, 0, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, -384, -384, -384, -384, -384, 0, 0, 0, 0, 0, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, 0, 0, -384, -384, -384, 0, -384, -384, -384, -384, -384, -384, -384, -384, 0, 0, 0, -384, 0, 0, 0, -384, -384, -384, -384, 0, -384, -384, -384,
             // State 155
    -        0, 0, -414, 0, -414, 22, 0, 73, 0, -414, -414, 23, -414, 0, 24, -414, 0, 0, 0, -414, -414, 0, -414, 0, 0, -414, 0, -414, 0, 0, 0, 0, -414, 0, -414, 25, 26, 27, 28, -414, 0, 0, -414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, -414, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, -454, 0, -454, 0, 0, 0, 0, -454, -454, 0, -454, 266, 0, -454, 0, 0, 0, 0, 0, -454, -454, 0, -454, 0, 0, -454, 0, -454, 0, 0, 0, 0, -454, 0, -454, 0, 0, 0, 0, -454, 0, 0, -454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 156
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, 0, 0, 0, 0, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -451, 0, -451, 22, 0, 74, 0, -451, -451, 23, -451, 0, 24, -451, 0, 0, 25, 0, 0, -451, -451, 0, -451, 0, 0, -451, 0, -451, 0, 0, 0, 0, -451, 0, -451, 26, 27, 28, 29, -451, 0, 0, -451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, -451, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 157
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -146, 0, 0, 0, 0, -146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 158
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -262, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 159
    -        0, 0, 0, 0, 0, -157, 0, 0, 0, 0, 0, -157, 0, 0, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, -157, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, -157, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0, 0, -157, 0, 0, 0, -157, -157, 0, -157, 0, -157, -157, -157,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 160
    -        0, 0, 0, 0, 0, -158, 0, 0, 0, 0, 0, -158, 0, 0, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, -158, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, -158, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, 0, 0, -158, 0, 0, 0, -158, -158, 0, -158, 0, -158, -158, -158,
    +        0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, -180, 0, 0, -180, 0, 0, 0, -180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -180, -180, -180, -180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, -180, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, -180, 0, 0, 0, -180, -180, 0, -180, 0, -180, -180, -180,
             // State 161
    -        0, 0, 0, 0, 0, -163, 0, 0, 0, 0, 0, -163, 0, 0, -163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -163, -163, -163, -163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -163, 0, -163, 0, 0, 0, 0, 0, 0, 0, 0, -163, 0, 0, 0, -163, 0, 0, 0, -163, -163, 0, -163, 0, -163, -163, -163,
    +        0, 0, 0, 0, 0, -181, 0, 0, 0, 0, 0, -181, 0, 0, -181, 0, 0, 0, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, -181, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, -181, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, 0, 0, -181, 0, 0, 0, -181, -181, 0, -181, 0, -181, -181, -181,
             // State 162
    -        0, 0, 0, 0, 0, -154, 0, 0, 0, 0, 0, -154, 0, 0, -154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, -154, -154, -154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0, -154, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0, 0, 0, -154, 0, 0, 0, -154, -154, 0, -154, 0, -154, -154, -154,
    +        0, 0, 0, 0, 0, -186, 0, 0, 0, 0, 0, -186, 0, 0, -186, 0, 0, 0, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, -186, -186, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, 0, -186, 0, 0, 0, 0, 0, 0, 0, 0, -186, 0, 0, 0, -186, 0, 0, 0, -186, -186, 0, -186, 0, -186, -186, -186,
             // State 163
    -        0, 0, 0, 0, 0, -152, 0, 0, 0, 0, 0, -152, 0, 0, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, -152, -152, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 0, -152, 0, 0, 0, 0, 0, 0, 0, 0, -152, 0, 0, 0, -152, 0, 0, 0, -152, -152, 0, -152, 0, -152, -152, -152,
    +        0, 0, 0, 0, 0, -177, 0, 0, 0, 0, 0, -177, 0, 0, -177, 0, 0, 0, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -177, -177, -177, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -177, 0, -177, 0, 0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 0, -177, 0, 0, 0, -177, -177, 0, -177, 0, -177, -177, -177,
             // State 164
    -        0, 0, 0, 0, 0, -153, 0, 0, 0, 0, 0, -153, 0, 0, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, -153, -153, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, 0, -153, 0, 0, 0, 0, 0, 0, 0, 0, -153, 0, 0, 0, -153, 0, 0, 0, -153, -153, 0, -153, 0, -153, -153, -153,
    +        0, 0, 0, 0, 0, -175, 0, 0, 0, 0, 0, -175, 0, 0, -175, 0, 0, 0, -175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -175, -175, -175, -175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -175, 0, -175, 0, 0, 0, 0, 0, 0, 0, 0, -175, 0, 0, 0, -175, 0, 0, 0, -175, -175, 0, -175, 0, -175, -175, -175,
             // State 165
    -        0, 0, 0, 0, 0, -164, 0, 0, 0, 0, 0, -164, 0, 0, -164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -164, -164, -164, -164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -164, 0, -164, 0, 0, 0, 0, 0, 0, 0, 0, -164, 0, 0, 0, -164, 0, 0, 0, -164, -164, 0, -164, 0, -164, -164, -164,
    +        0, 0, 0, 0, 0, -176, 0, 0, 0, 0, 0, -176, 0, 0, -176, 0, 0, 0, -176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -176, -176, -176, -176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -176, 0, -176, 0, 0, 0, 0, 0, 0, 0, 0, -176, 0, 0, 0, -176, 0, 0, 0, -176, -176, 0, -176, 0, -176, -176, -176,
             // State 166
    -        0, 0, 0, 0, 0, -156, 0, 0, 0, 0, 0, -156, 0, 0, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -156, -156, -156, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -156, 0, -156, 0, 0, 0, 0, 0, 0, 0, 0, -156, 0, 0, 0, -156, 0, 0, 0, -156, -156, 0, -156, 0, -156, -156, -156,
    +        0, 0, 0, 0, 0, -187, 0, 0, 0, 0, 0, -187, 0, 0, -187, 0, 0, 0, -187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -187, -187, -187, -187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -187, 0, -187, 0, 0, 0, 0, 0, 0, 0, 0, -187, 0, 0, 0, -187, 0, 0, 0, -187, -187, 0, -187, 0, -187, -187, -187,
             // State 167
    -        0, 0, 0, 0, 0, -161, 0, 0, 0, 0, 0, -161, 0, 0, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161, -161, -161, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161, 0, -161, 0, 0, 0, 0, 0, 0, 0, 0, -161, 0, 0, 0, -161, 0, 0, 0, -161, -161, 0, -161, 0, -161, -161, -161,
    +        0, 0, 0, 0, 0, -179, 0, 0, 0, 0, 0, -179, 0, 0, -179, 0, 0, 0, -179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -179, -179, -179, -179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -179, 0, -179, 0, 0, 0, 0, 0, 0, 0, 0, -179, 0, 0, 0, -179, 0, 0, 0, -179, -179, 0, -179, 0, -179, -179, -179,
             // State 168
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -184, 0, 0, 0, 0, 0, -184, 0, 0, -184, 0, 0, 0, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, -184, -184, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, 0, -184, 0, 0, 0, 0, 0, 0, 0, 0, -184, 0, 0, 0, -184, 0, 0, 0, -184, -184, 0, -184, 0, -184, -184, -184,
             // State 169
    -        0, 0, 0, 0, 0, -162, 0, 0, 0, 0, 0, -162, 0, 0, -162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -162, -162, -162, -162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -162, 0, -162, 0, 0, 0, 0, 0, 0, 0, 0, -162, 0, 0, 0, -162, 0, 0, 0, -162, -162, 0, -162, 0, -162, -162, -162,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 170
    -        0, 0, 0, 0, 0, -155, 0, 0, 0, 0, 0, -155, 0, 0, -155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -155, -155, -155, -155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -155, 0, -155, 0, 0, 0, 0, 0, 0, 0, 0, -155, 0, 0, 0, -155, 0, 0, 0, -155, -155, 0, -155, 0, -155, -155, -155,
    +        0, 0, 0, 0, 0, -185, 0, 0, 0, 0, 0, -185, 0, 0, -185, 0, 0, 0, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, -185, -185, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, 0, -185, 0, 0, 0, 0, 0, 0, 0, 0, -185, 0, 0, 0, -185, 0, 0, 0, -185, -185, 0, -185, 0, -185, -185, -185,
             // State 171
    -        0, 0, 0, 0, 0, -160, 0, 0, 0, 0, 0, -160, 0, 0, -160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -160, -160, -160, -160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -160, 0, -160, 0, 0, 0, 0, 0, 0, 0, 0, -160, 0, 0, 0, -160, 0, 0, 0, -160, -160, 0, -160, 0, -160, -160, -160,
    +        0, 0, 0, 0, 0, -178, 0, 0, 0, 0, 0, -178, 0, 0, -178, 0, 0, 0, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, -178, -178, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, 0, -178, 0, 0, 0, 0, 0, 0, 0, 0, -178, 0, 0, 0, -178, 0, 0, 0, -178, -178, 0, -178, 0, -178, -178, -178,
             // State 172
    -        0, 0, 0, 0, 0, -159, 0, 0, 0, 0, 0, -159, 0, 0, -159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -159, -159, -159, -159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -159, 0, -159, 0, 0, 0, 0, 0, 0, 0, 0, -159, 0, 0, 0, -159, 0, 0, 0, -159, -159, 0, -159, 0, -159, -159, -159,
    +        0, 0, 0, 0, 0, -183, 0, 0, 0, 0, 0, -183, 0, 0, -183, 0, 0, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, -183, -183, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, 0, -183, 0, 0, 0, -183, -183, 0, -183, 0, -183, -183, -183,
             // State 173
    -        0, 0, -369, 0, -369, 0, 0, 0, 0, -369, -369, 0, -369, -369, 0, -369, 0, 0, 0, -369, -369, 0, -369, 0, 0, -369, 0, -369, 0, 0, 0, 0, -369, 0, -369, 0, 0, 0, 0, -369, -369, 0, -369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, -369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, -182, 0, 0, -182, 0, 0, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, -182, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, -182, 0, 0, 0, -182, -182, 0, -182, 0, -182, -182, -182,
             // State 174
    -        0, 0, 0, 0, 0, -338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -402, 0, -402, 0, 0, 0, 0, -402, -402, 0, -402, -402, 0, -402, 0, 0, 0, 0, 0, -402, -402, 0, -402, 0, 0, -402, 0, -402, 0, 0, 0, 0, -402, 0, -402, 0, 0, 0, 0, -402, -402, 0, -402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, -402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 175
    -        0, 0, 0, 0, 0, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 176
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, -118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 177
    -        0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 178
    -        0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 179
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 180
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 181
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 182
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 183
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 184
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0,
             // State 185
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 186
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 187
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -221, 0, 0, 285, 0, 0, 0, 0, 0, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -221, 0, 0, 0, 0, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, 0,
             // State 188
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, -272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -244, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -244, 0, 0, 0, 0, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 189
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 190
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 191
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0,
             // State 192
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, 0, -175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -175, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 193
    -        0, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 194
    -        0, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -501, 0, 0, 0, 0, 0, 0, 0, 0, 0, -501, 0, 0, 0, 0, 0, -501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 195
    -        0, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 196
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 197
    -        0, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 198
    -        0, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 199
    -        0, 0, 0, 0, 0, 0, -332, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, -332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 200
    -        0, 0, 0, 0, 0, 0, -300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 201
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 202
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, -308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 203
    -        0, 0, -310, 0, -310, 0, -310, 0, 0, -310, -310, 0, -310, -310, 0, -310, 0, 0, 0, -310, -310, -310, -310, 0, 0, -310, 0, -310, 0, 0, 0, 0, -310, 0, -310, 0, 0, 0, 0, -310, -310, 0, -310, -310, -310, 0, 0, 0, 0, 0, 0, 0, -310, 0, 0, -310, -310, -310, 0, -310, 0, 0, 0, 0, 0, 0, -310, 0, 0, 0, 0, 0, 0, 0, 0, 0, -310, -310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 204
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -335, 0, -335, 0, -335, 0, 0, -335, -335, 0, -335, -335, 0, -335, 0, 0, 0, 0, 0, -335, -335, -335, -335, 0, 0, -335, 0, -335, 0, 0, 0, 0, -335, 0, -335, 0, 0, 0, 0, -335, -335, 0, -335, -335, -335, 0, 0, 0, 0, 0, 0, 0, -335, 0, 0, -335, -335, -335, 0, -335, 0, 0, 0, 0, 0, 0, -335, 0, 0, 0, 0, 0, 0, 0, 0, 0, -335, -335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 205
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, -254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 206
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 207
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 208
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -452, 0, 0, 0, 0, 0, 0, 0, -452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 209
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 0, 0, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -507, 0, 0, 0, 0, 0, 0, 0, 0, 0, -507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 210
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, -457, 0, 0, 0, 0, -457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 211
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -512, 0, 0, 0, 0, -512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 212
    -        -110, 0, -110, -110, -110, 0, -110, 0, 0, -110, -110, 0, -110, -110, 0, -110, 0, 0, 0, -110, -110, -110, -110, -110, 108, -110, -110, -110, -110, -110, -110, 109, -110, 0, -110, 0, 0, 0, 0, -110, -110, -110, -110, -110, -110, 0, 0, 0, 0, 0, 0, 0, -110, 0, 0, -110, -110, -110, 0, -110, 0, -110, -110, 0, 0, -110, -110, 0, 0, 0, 0, 0, 0, 0, 0, -110, -110, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 213
    -        -115, 111, -115, -115, -115, 0, -115, 112, 0, -115, -115, -115, -115, -115, -115, -115, 0, 113, 114, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, 115, -115, 0, 0, 0, 0, -115, -115, -115, -115, -115, -115, 0, 0, 0, 0, 0, 0, 0, -115, 0, 0, -115, -115, -115, 0, -115, 0, -115, -115, 0, 0, -115, -115, 0, 0, 0, 0, 0, 0, 0, 0, -115, -115, -115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -132, 0, -132, -132, -132, 0, -132, 0, 0, -132, -132, 0, -132, -132, 0, -132, 0, 0, 0, 0, 0, -132, -132, -132, -132, -132, 109, -132, -132, -132, -132, -132, -132, 110, -132, 0, -132, 0, 0, 0, 0, -132, -132, -132, -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, -132, 0, 0, -132, -132, -132, 0, -132, 0, -132, -132, 0, 0, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 214
    -        0, 0, 0, 0, 0, 22, -173, 221, 222, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        -137, 112, -137, -137, -137, 0, -137, 113, 0, -137, -137, -137, -137, -137, -137, -137, 0, 0, 0, 114, 115, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, 116, -137, 0, 0, 0, 0, -137, -137, -137, -137, -137, -137, 0, 0, 0, 0, 0, 0, 0, -137, 0, 0, -137, -137, -137, 0, -137, 0, -137, -137, 0, 0, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, -137, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 215
    -        0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, -196, 222, 223, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 216
    -        0, 0, 0, 0, 0, 0, -114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 217
    -        0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 218
    -        -129, -129, 0, -129, 0, -129, -129, -129, -129, 0, 0, -129, 0, -129, -129, 0, -129, -129, -129, 0, 0, 0, 0, -129, -129, 0, -129, 318, -129, -129, -129, -129, 0, -129, 0, 0, 0, 0, -129, 0, 0, -129, 0, -129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129, 0, 0, 0, -129, 0, -129, -129, 0, 0, -129, -129, 0, 0, 0, 0, 0, 0, 0, 0, -129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -193, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 219
    -        0, 0, 0, 0, 0, 0, -266, 0, 0, 0, 0, 0, 0, -266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -151, -151, 0, -151, 0, -151, -151, -151, -151, 0, 0, -151, 0, -151, -151, 0, 0, -151, 0, -151, -151, 0, 0, 0, 0, -151, -151, 0, -151, 320, -151, -151, -151, -151, 0, -151, 0, 0, 0, 0, -151, 0, 0, -151, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, -151, 0, -151, -151, 0, 0, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 220
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, -291, 0, 0, 0, 0, 0, 0, -291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 221
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 222
    -        -340, -340, -340, -340, -340, 0, -340, -340, 0, -340, -340, -340, -340, -340, -340, -340, 0, -340, -340, -340, -340, -340, -340, -340, -340, -340, -340, -340, -340, -340, -340, -340, -340, -340, -340, 0, 0, 0, 0, -340, -340, -340, -340, -340, -340, 0, 0, 0, 0, 0, 0, 0, -340, 0, 0, -340, -340, -340, 0, -340, 0, -340, -340, 0, 0, -340, -340, 0, 0, 0, 0, 0, 0, 0, 0, -340, -340, -340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 223
    -        -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, 0, 0, 0, -151, -151, -151, -151, -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, -151, -151, -151, 0, -151, 0, -151, -151, 0, 0, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -373, -373, -373, -373, -373, 0, -373, -373, 0, -373, -373, -373, -373, -373, -373, -373, 0, 0, 0, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, 0, 0, 0, 0, -373, -373, -373, -373, -373, -373, 0, 0, 0, 0, 0, 0, 0, -373, 0, 0, -373, -373, -373, 0, -373, 0, -373, -373, 0, 0, -373, -373, 0, 0, 0, 0, 0, 0, 0, 0, -373, -373, -373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 224
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, 0, -174, 0, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, 0, 0, 0, -174, -174, -174, -174, -174, -174, -174, 0, 0, 0, 0, 0, 0, 0, -174, 0, 0, -174, -174, -174, 0, -174, 0, -174, -174, 0, 0, -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, -174, -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 225
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 226
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, -383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 227
    -        -230, 0, -230, 0, -230, 0, -230, 0, 0, -230, -230, 0, -230, -230, 0, -230, 0, 0, 0, -230, -230, -230, -230, -230, 0, -230, -230, -230, -230, -230, -230, 0, -230, 0, -230, 0, 0, 0, 0, -230, -230, 116, -230, -230, -230, 0, 0, 0, 0, 0, 0, 0, -230, 0, 0, -230, -230, -230, 0, -230, 0, -230, -230, 0, 0, -230, -230, 0, 0, 0, 0, 0, 0, 0, 0, -230, -230, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 228
    -        -347, 0, -347, -347, -347, 0, -347, 0, 0, -347, -347, 100, -347, -347, 101, -347, 0, 0, 0, -347, -347, -347, -347, -347, -347, -347, -347, -347, -347, -347, -347, -347, -347, 0, -347, 0, 0, 0, 0, -347, -347, -347, -347, -347, -347, 0, 0, 0, 0, 0, 0, 0, -347, 0, 0, -347, -347, -347, 0, -347, 0, -347, -347, 0, 0, -347, -347, 0, 0, 0, 0, 0, 0, 0, 0, -347, -347, -347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, -416, 24, 0, 0, 0, 25, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 229
    -        -386, -386, -386, -386, -386, 0, -386, -386, 0, -386, -386, -386, -386, -386, -386, -386, 0, -386, -386, -386, -386, -386, -386, -386, -386, -386, -386, -386, -386, -386, -386, -386, -386, -386, -386, 0, 0, 0, 0, -386, -386, -386, -386, -386, -386, 0, 0, 0, 0, 0, 0, 0, -386, 0, 0, -386, -386, -386, 0, -386, 0, -386, -386, 0, 0, -386, -386, 0, 0, 0, 0, 0, 0, 0, 0, -386, -386, -386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -253, 0, -253, 0, -253, 0, -253, 0, 0, -253, -253, 0, -253, -253, 0, -253, 0, 0, 0, 0, 0, -253, -253, -253, -253, -253, 0, -253, -253, -253, -253, -253, -253, 0, -253, 0, -253, 0, 0, 0, 0, -253, -253, 117, -253, -253, -253, 0, 0, 0, 0, 0, 0, 0, -253, 0, 0, -253, -253, -253, 0, -253, 0, -253, -253, 0, 0, -253, -253, 0, 0, 0, 0, 0, 0, 0, 0, -253, -253, -253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 230
    -        -455, 0, -455, 98, -455, 0, -455, 0, 0, -455, -455, 0, -455, -455, 0, -455, 0, 0, 0, -455, -455, -455, -455, -455, 0, -455, -455, -455, -455, -455, -455, 0, -455, 0, -455, 0, 0, 0, 0, -455, -455, -455, -455, -455, -455, 0, 0, 0, 0, 0, 0, 0, -455, 0, 0, -455, -455, -455, 0, -455, 0, -455, -455, 0, 0, -455, -455, 0, 0, 0, 0, 0, 0, 0, 0, -455, -455, -455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -380, 0, -380, -380, -380, 0, -380, 0, 0, -380, -380, 101, -380, -380, 102, -380, 0, 0, 0, 0, 0, -380, -380, -380, -380, -380, -380, -380, -380, -380, -380, -380, -380, -380, -380, 0, -380, 0, 0, 0, 0, -380, -380, -380, -380, -380, -380, 0, 0, 0, 0, 0, 0, 0, -380, 0, 0, -380, -380, -380, 0, -380, 0, -380, -380, 0, 0, -380, -380, 0, 0, 0, 0, 0, 0, 0, 0, -380, -380, -380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 231
    -        0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -423, -423, -423, -423, -423, 0, -423, -423, 0, -423, -423, -423, -423, -423, -423, -423, 0, 0, 0, -423, -423, -423, -423, -423, -423, -423, -423, -423, -423, -423, -423, -423, -423, -423, -423, -423, -423, 0, 0, 0, 0, -423, -423, -423, -423, -423, -423, 0, 0, 0, 0, 0, 0, 0, -423, 0, 0, -423, -423, -423, 0, -423, 0, -423, -423, 0, 0, -423, -423, 0, 0, 0, 0, 0, 0, 0, 0, -423, -423, -423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 232
    -        0, 0, 0, 0, 0, 0, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -510, 0, -510, 99, -510, 0, -510, 0, 0, -510, -510, 0, -510, -510, 0, -510, 0, 0, 0, 0, 0, -510, -510, -510, -510, -510, 0, -510, -510, -510, -510, -510, -510, 0, -510, 0, -510, 0, 0, 0, 0, -510, -510, -510, -510, -510, -510, 0, 0, 0, 0, 0, 0, 0, -510, 0, 0, -510, -510, -510, 0, -510, 0, -510, -510, 0, 0, -510, -510, 0, 0, 0, 0, 0, 0, 0, 0, -510, -510, -510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 233
    -        0, 0, 0, 0, 0, 0, -355, 0, 0, 0, 0, 0, 0, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 234
    -        0, 0, 0, 0, 0, 0, -186, 0, 0, 0, 0, 0, 0, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 235
    -        -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, 0, 0, 0, -136, -136, -136, -136, -136, -136, -136, 0, 0, 0, 0, 0, 0, 0, -136, 0, 0, -136, -136, -136, 0, -136, 0, -136, -136, 0, 0, -136, -136, 0, 0, 0, 0, 0, 0, 0, 0, -136, -136, -136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -388, 0, 0, 0, 0, 0, 0, -388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 236
    -        0, 0, 0, 0, 0, 22, 332, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, -209, 0, 0, 0, 0, 0, 0, -209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 237
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, 0, -158, 0, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, 0, 0, 0, -158, -158, -158, -158, -158, -158, -158, 0, 0, 0, 0, 0, 0, 0, -158, 0, 0, -158, -158, -158, 0, -158, 0, -158, -158, 0, 0, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, -158, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 238
    -        -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, 0, 0, 0, -135, -135, -135, -135, -135, -135, -135, 0, 0, 0, 0, 0, 0, 0, -135, 0, 0, -135, -135, -135, 0, -135, 0, -135, -135, 0, 0, -135, -135, 0, 0, 0, 0, 0, 0, 0, 0, -135, -135, -135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 336, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 239
    -        -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, -130, 0, 0, 0, -130, -130, -130, -130, -130, -130, -130, 0, 0, 0, 0, 0, 0, 0, -130, 0, 0, -130, -130, -130, 0, -130, 0, -130, -130, 0, 0, -130, -130, 0, 0, 0, 0, 0, 0, 0, 0, -130, -130, -130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 240
    -        -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, -132, 0, 0, 0, -132, -132, -132, -132, -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, -132, 0, 0, -132, -132, -132, 0, -132, 0, -132, -132, 0, 0, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, 0, -157, 0, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, 0, 0, 0, -157, -157, -157, -157, -157, -157, -157, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0, -157, -157, -157, 0, -157, 0, -157, -157, 0, 0, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, -157, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 241
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, 0, -152, 0, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, 0, 0, 0, -152, -152, -152, -152, -152, -152, -152, 0, 0, 0, 0, 0, 0, 0, -152, 0, 0, -152, -152, -152, 0, -152, 0, -152, -152, 0, 0, -152, -152, 0, 0, 0, 0, 0, 0, 0, 0, -152, -152, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 242
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, 0, -154, 0, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, -154, 0, 0, 0, -154, -154, -154, -154, -154, -154, -154, 0, 0, 0, 0, 0, 0, 0, -154, 0, 0, -154, -154, -154, 0, -154, 0, -154, -154, 0, 0, -154, -154, 0, 0, 0, 0, 0, 0, 0, 0, -154, -154, -154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 243
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, -405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 244
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 245
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, -442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 246
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, -393, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 247
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 248
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, -430, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 249
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, -418, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 250
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 251
    -        -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, 0, 0, 0, -140, -140, -140, -140, -140, -140, -140, 0, 0, 0, 0, 0, 0, 0, -140, 0, 0, -140, -140, -140, 0, -140, 0, -140, -140, 0, 0, -140, -140, 0, 0, 0, 0, 0, 0, 0, 0, -140, -140, -140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, -455, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 252
    -        -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, 0, 0, 0, -142, -142, -142, -142, -142, -142, -142, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, -142, -142, -142, 0, -142, 0, -142, -142, 0, 0, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, -142, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 253
    -        -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, -143, 0, 0, 0, -143, -143, -143, -143, -143, -143, -143, 0, 0, 0, 0, 0, 0, 0, -143, 0, 0, -143, -143, -143, 0, -143, 0, -143, -143, 0, 0, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, -143, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, 0, -162, 0, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, 0, 0, 0, -162, -162, -162, -162, -162, -162, -162, 0, 0, 0, 0, 0, 0, 0, -162, 0, 0, -162, -162, -162, 0, -162, 0, -162, -162, 0, 0, -162, -162, 0, 0, 0, 0, 0, 0, 0, 0, -162, -162, -162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 254
    -        -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, 0, 0, 0, -144, -144, -144, -144, -144, -144, -144, 0, 0, 0, 0, 0, 0, 0, -144, 0, 0, -144, -144, -144, 0, -144, 0, -144, -144, 0, 0, -144, -144, 0, 0, 0, 0, 0, 0, 0, 0, -144, -144, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, 0, -164, 0, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, -164, 0, 0, 0, -164, -164, -164, -164, -164, -164, -164, 0, 0, 0, 0, 0, 0, 0, -164, 0, 0, -164, -164, -164, 0, -164, 0, -164, -164, 0, 0, -164, -164, 0, 0, 0, 0, 0, 0, 0, 0, -164, -164, -164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 255
    -        0, 0, -113, 0, -113, 0, -113, 0, 0, -113, -113, 0, -113, -113, 0, -113, 0, 0, 0, -113, -113, -113, -113, 0, 0, -113, 0, -113, 0, 0, 0, 0, -113, 0, -113, 0, 0, 0, 0, -113, -113, 0, -113, -113, -113, 0, 0, 0, 0, 0, 0, 0, -113, 0, 0, -113, -113, -113, 0, -113, 0, 0, 0, 0, 0, 0, -113, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113, -113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, 0, -165, 0, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, 0, 0, 0, -165, -165, -165, -165, -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, -165, 0, 0, -165, -165, -165, 0, -165, 0, -165, -165, 0, 0, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 256
    -        -199, 0, -199, 0, -199, 0, -199, 0, 0, -199, -199, 0, -199, -199, 0, -199, 0, 0, 0, -199, -199, -199, -199, -199, 0, -199, -199, -199, -199, -199, -199, 0, -199, 0, -199, 0, 0, 0, 0, -199, -199, 0, -199, -199, -199, 0, 0, 0, 0, 0, 0, 0, -199, 0, 0, -199, -199, -199, 0, -199, 0, -199, -199, 0, 0, -199, -199, 0, 0, 0, 0, 0, 0, 0, 0, 106, -199, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, 0, -166, 0, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, 0, 0, 0, -166, -166, -166, -166, -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, -166, 0, 0, -166, -166, -166, 0, -166, 0, -166, -166, 0, 0, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 257
    -        0, 0, 0, 0, 0, -198, 0, 0, 0, 0, 0, -198, 0, 0, -198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198, -198, -198, -198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198, 0, 0, 0, -198, 0, 0, 0, -198, -198, 0, -198, 0, -198, -198, -198,
    +        0, 0, -135, 0, -135, 0, -135, 0, 0, -135, -135, 0, -135, -135, 0, -135, 0, 0, 0, 0, 0, -135, -135, -135, -135, 0, 0, -135, 0, -135, 0, 0, 0, 0, -135, 0, -135, 0, 0, 0, 0, -135, -135, 0, -135, -135, -135, 0, 0, 0, 0, 0, 0, 0, -135, 0, 0, -135, -135, -135, 0, -135, 0, 0, 0, 0, 0, 0, -135, 0, 0, 0, 0, 0, 0, 0, 0, 0, -135, -135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 258
    -        0, 0, 0, 0, 0, -196, 0, 0, 0, 0, 0, -196, 0, 0, -196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -196, -196, -196, -196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -196, 0, 0, 0, -196, 0, 0, 0, -196, -196, 0, -196, 0, -196, -196, -196,
    +        -222, 0, -222, 0, -222, 0, -222, 0, 0, -222, -222, 0, -222, -222, 0, -222, 0, 0, 0, 0, 0, -222, -222, -222, -222, -222, 0, -222, -222, -222, -222, -222, -222, 0, -222, 0, -222, 0, 0, 0, 0, -222, -222, 0, -222, -222, -222, 0, 0, 0, 0, 0, 0, 0, -222, 0, 0, -222, -222, -222, 0, -222, 0, -222, -222, 0, 0, -222, -222, 0, 0, 0, 0, 0, 0, 0, 0, 107, -222, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 259
    -        0, 0, 0, 0, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -221, 0, 0, 0, 0, 0, -221, 0, 0, -221, 0, 0, 0, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -221, -221, -221, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -221, 0, 0, 0, -221, 0, 0, 0, -221, -221, 0, -221, 0, -221, -221, -221,
             // State 260
    -        0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -219, 0, 0, 0, 0, 0, -219, 0, 0, -219, 0, 0, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, -219, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, 0, 0, -219, 0, 0, 0, -219, -219, 0, -219, 0, -219, -219, -219,
             // State 261
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 262
    -        0, 0, -326, 0, -326, 0, -326, 0, 0, -326, -326, 0, -326, -326, 0, -326, 0, 0, 0, -326, -326, -326, -326, 0, 0, -326, 0, -326, 0, 0, 0, 0, -326, 0, -326, 0, 0, 0, 0, -326, -326, 0, -326, 136, -326, 0, 0, 0, 0, 0, 0, 0, -326, 0, 0, -326, -326, -326, 0, -326, 0, 0, 0, 0, 0, 0, -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, -326, -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 263
    -        0, 0, -415, 0, -415, 22, 0, 73, 0, -415, -415, 23, -415, 0, 24, -415, 0, 0, 0, -415, -415, 0, -415, 0, 0, -415, 0, -415, 0, 0, 0, 0, -415, 0, -415, 25, 26, 27, 28, -415, 0, 0, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, -415, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 264
    -        0, 0, -44, 0, -44, 0, 0, 0, 0, -44, -44, 0, -44, -44, 0, -44, 0, 0, 0, -44, -44, 0, -44, 0, 0, -44, 0, -44, 0, 0, 0, 0, -44, 0, -44, 0, 0, 0, 0, -44, -44, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -351, 0, -351, 0, -351, 0, 0, -351, -351, 0, -351, -351, 0, -351, 0, 0, 0, 0, 0, -351, -351, -351, -351, 0, 0, -351, 0, -351, 0, 0, 0, 0, -351, 0, -351, 0, 0, 0, 0, -351, -351, 0, -351, 137, -351, 0, 0, 0, 0, 0, 0, 0, -351, 0, 0, -351, -351, -351, 0, -351, 0, 0, 0, 0, 0, 0, -351, 0, 0, 0, 0, 0, 0, 0, 0, 0, -351, -351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 265
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -125, 0, 0, 0, 0, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -452, 0, -452, 22, 0, 74, 0, -452, -452, 23, -452, 0, 24, -452, 0, 0, 25, 0, 0, -452, -452, 0, -452, 0, 0, -452, 0, -452, 0, 0, 0, 0, -452, 0, -452, 26, 27, 28, 29, -452, 0, 0, -452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, -452, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 266
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -55, 0, -55, 0, 0, 0, 0, -55, -55, 0, -55, -55, 0, -55, 0, 0, 0, 0, 0, -55, -55, 0, -55, 0, 0, -55, 0, -55, 0, 0, 0, 0, -55, 0, -55, 0, 0, 0, 0, -55, -55, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 267
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -147, 0, 0, 0, 0, -147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 268
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -121, 0, 0, 0, 0, -121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 269
    -        0, 0, 0, 0, 0, 22, -171, 221, 222, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, 0, 0, 0, 0, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 270
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 348, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, 0, 0, 0, 0, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 271
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -214, 0, -214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, -194, 222, 223, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 272
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352, 0,
             // State 273
    -        0, 0, 0, 0, 0, 22, -171, 221, 222, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, 0, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 274
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 275
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, -194, 222, 223, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 276
    -        0, 0, 0, 0, 0, 0, 354, 200, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 277
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 355, 0, 0, 0, 0, 0, 0, 0, 0, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 0, 0, 0, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 278
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 364, 365, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 279
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 280
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, -256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, -256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 281
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 282
    -        0, 0, 0, 0, 0, 362, 0, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 283
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222, 0, 0, 364, 0, 0, 0, 0, 0, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222, 0, 0, 0, 0, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 0,
             // State 284
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 374, 0, 375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 285
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, -273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, 0, 0, 0, 376, 0, 0, 0, 0, 0, 0, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, 0, 0, 0, 0, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 286
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 287
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 288
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 369, 0, 0, 0, 0, 0, 0, 0, 0, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 289
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -87, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 290
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0, 0, 0, 0, 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 291
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109, 0,
             // State 292
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 293
    -        0, 0, 0, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 294
    -        0, 0, 0, 0, 0, 0, 0, 200, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 295
    -        0, 0, 0, 0, 0, 0, -334, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, -334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 201, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 296
    -        0, 0, 0, 0, 0, 0, -331, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 0, 0, 0, 0, -331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 297
    -        0, 0, 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, -367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 298
    -        0, 0, 0, 0, 0, 0, -299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 299
    -        0, 0, -302, 0, -302, 0, -302, 0, 0, -302, -302, 0, -302, -302, 0, -302, 0, 0, 0, -302, -302, -302, -302, 0, 0, -302, 0, -302, 0, 0, 0, 0, -302, 0, -302, 0, 0, 0, 0, -302, -302, 0, -302, 0, -302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -302, -302, -302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -302, -302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 300
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, -309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 301
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, -327, 0, -327, 0, -327, 0, 0, -327, -327, 0, -327, -327, 0, -327, 0, 0, 0, 0, 0, -327, -327, -327, -327, 0, 0, -327, 0, -327, 0, 0, 0, 0, -327, 0, -327, 0, 0, 0, 0, -327, -327, 0, -327, 0, -327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -327, -327, -327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -327, -327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 302
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 0, -255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 303
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 304
    -        0, 0, 0, 0, 0, -384, 0, -384, 0, 0, 0, -384, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, -384, -384, -384, -384, -384, 0, 0, 0, 0, 0, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, -384, 0, 0, -384, -384, -384, 0, -384, -384, -384, -384, -384, -384, -384, -384, 0, 0, 0, -384, 0, 0, 0, -384, -384, -384, -384, 0, -384, -384, -384,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 305
    -        0, 0, 0, 0, 0, -432, 0, -432, 0, 0, 0, -432, 0, 0, -432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -432, 0, -432, -432, -432, -432, -432, 0, 0, 0, 0, 0, -432, -432, -432, -432, -432, -432, 0, 386, 387, 388, -432, -432, -432, -432, -432, -432, 0, 0, -432, -432, -432, 0, -432, -432, -432, -432, -432, -432, -432, -432, 0, 0, 0, -432, 0, 0, 0, -432, -432, -432, -432, 0, -432, -432, -432,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 306
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 389, 0, 0, 0,
    +        0, 0, 0, 0, 0, -421, 0, -421, 0, 0, 0, -421, 0, 0, -421, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -421, 0, -421, -421, -421, -421, -421, 0, 0, 0, 0, 0, -421, -421, -421, -421, -421, -421, -421, -421, -421, -421, -421, -421, -421, -421, -421, -421, 0, 0, -421, -421, -421, 0, -421, -421, -421, -421, -421, -421, -421, -421, 0, 0, 0, -421, 0, 0, 0, -421, -421, -421, -421, 0, -421, -421, -421,
             // State 307
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -469, 0, -469, 0, 0, 0, -469, 0, 0, -469, 0, 0, 0, -469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -469, 0, -469, -469, -469, -469, -469, 0, 0, 0, 0, 0, -469, -469, -469, -469, -469, -469, 0, 398, 399, 400, -469, -469, -469, -469, -469, -469, 0, 0, -469, -469, -469, 0, -469, -469, -469, -469, -469, -469, -469, -469, 0, 0, 0, -469, 0, 0, 0, -469, -469, -469, -469, 0, -469, -469, -469,
             // State 308
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, 0, 0, 0,
             // State 309
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 310
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 311
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 312
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 0, -458, 0, 0, 0, 0, -458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 313
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -460, 0, 0, 0, 0, -460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 314
    -        0, 0, 0, 0, 0, 0, -172, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, -513, 0, 0, 0, 0, -513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 315
    -        -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, -149, 0, 0, 0, -149, -149, -149, -149, -149, -149, -149, 0, 0, 0, 0, 0, 0, 0, -149, 0, 0, -149, -149, -149, 0, -149, 0, -149, -149, 0, 0, -149, -149, 0, 0, 0, 0, 0, 0, 0, 0, -149, -149, -149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -515, 0, 0, 0, 0, -515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 316
    -        0, 0, 0, 0, 0, -80, -80, -80, -80, 0, 0, -80, 0, 0, -80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -80, -80, -80, -80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -80, 0, -80, 0, 0, 0, 0, 0, 0, 0, 0, -80, 0, 0, 0, -80, 0, 0, 0, -80, -80, 0, -80, 0, -80, -80, -80,
    +        0, 0, 0, 0, 0, 0, -195, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 317
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, 0, -172, 0, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, 0, 0, 0, -172, -172, -172, -172, -172, -172, -172, 0, 0, 0, 0, 0, 0, 0, -172, 0, 0, -172, -172, -172, 0, -172, 0, -172, -172, 0, 0, -172, -172, 0, 0, 0, 0, 0, 0, 0, 0, -172, -172, -172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 318
    -        0, 0, 0, 0, 0, 0, -265, 0, 0, 0, 0, 0, 0, -265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -102, -102, -102, -102, 0, 0, -102, 0, 0, -102, 0, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -102, -102, -102, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, -102, 0, 0, 0, -102, -102, 0, -102, 0, -102, -102, -102,
             // State 319
    -        0, 0, 0, 0, 0, 0, -268, 0, 0, 0, 0, 0, 0, -268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 320
    -        0, 0, 0, 0, 0, 0, -269, 0, 0, 0, 0, 0, 0, -269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -290, 0, 0, 0, 0, 0, 0, -290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 321
    -        -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, -150, 0, 0, 0, -150, -150, -150, -150, -150, -150, -150, 0, 0, 0, 0, 0, 0, 0, -150, 0, 0, -150, -150, -150, 0, -150, 0, -150, -150, 0, 0, -150, -150, 0, 0, 0, 0, 0, 0, 0, 0, -150, -150, -150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -293, 0, 0, 0, 0, 0, 0, -293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 322
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, -381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, -294, 0, 0, 0, 0, 0, 0, -294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 323
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 324
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 325
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, -358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, 0, -173, 0, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, 0, 0, 0, -173, -173, -173, -173, -173, -173, -173, 0, 0, 0, 0, 0, 0, 0, -173, 0, 0, -173, -173, -173, 0, -173, 0, -173, -173, 0, 0, -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, -173, -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 326
    -        -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, 0, 0, 0, -137, -137, -137, -137, -137, -137, -137, 0, 0, 0, 0, 0, 0, 0, -137, 0, 0, -137, -137, -137, 0, -137, 0, -137, -137, 0, 0, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, -137, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, -414, 24, 0, 0, 0, 25, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, -414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 327
    -        0, 0, 0, 0, 0, 22, 403, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 328
    -        -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, 0, 0, 0, -139, -139, -139, -139, -139, -139, -139, 0, 0, 0, 0, 0, 0, 0, -139, 0, 0, -139, -139, -139, 0, -139, 0, -139, -139, 0, 0, -139, -139, 0, 0, 0, 0, 0, 0, 0, 0, -139, -139, -139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 329
    -        0, 0, 0, 0, 0, 0, -356, 0, 0, 0, 0, 0, 0, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, -391, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, -391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 330
    -        0, 0, 0, 0, 0, 0, -37, 0, 0, 0, 0, 0, 0, -37, 0, 0, 0, 0, 0, 0, 0, -37, -37, 0, 0, 0, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, 0, -159, 0, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, -159, 0, 0, 0, -159, -159, -159, -159, -159, -159, -159, 0, 0, 0, 0, 0, 0, 0, -159, 0, 0, -159, -159, -159, 0, -159, 0, -159, -159, 0, 0, -159, -159, 0, 0, 0, 0, 0, 0, 0, 0, -159, -159, -159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 331
    -        -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, -133, 0, 0, 0, -133, -133, -133, -133, -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, -133, 0, 0, -133, -133, -133, 0, -133, 0, -133, -133, 0, 0, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 417, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 332
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, 0, -161, 0, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, 0, 0, 0, -161, -161, -161, -161, -161, -161, -161, 0, 0, 0, 0, 0, 0, 0, -161, 0, 0, -161, -161, -161, 0, -161, 0, -161, -161, 0, 0, -161, -161, 0, 0, 0, 0, 0, 0, 0, 0, -161, -161, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 333
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, -406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, -389, 0, 0, 0, 0, 0, 0, -389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 334
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, -394, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, -48, 0, 0, 0, 0, 0, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, -48, 0, 0, 0, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 335
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, 0, -155, 0, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, -155, 0, 0, 0, -155, -155, -155, -155, -155, -155, -155, 0, 0, 0, 0, 0, 0, 0, -155, 0, 0, -155, -155, -155, 0, -155, 0, -155, -155, 0, 0, -155, -155, 0, 0, 0, 0, 0, 0, 0, 0, -155, -155, -155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 336
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 337
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, -419, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, -443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 338
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, -431, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 339
    -        0, 0, 0, 0, 0, 22, -171, 221, 222, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 340
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 341
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, -456, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 342
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 343
    -        0, 0, -45, 0, -45, 0, 0, 0, 0, -45, -45, 0, -45, -45, 0, -45, 0, 0, 0, -45, -45, 0, -45, 0, 0, -45, 0, -45, 0, 0, 0, 0, -45, 0, -45, 0, 0, 0, 0, -45, -45, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, -194, 222, 223, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 344
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 0, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 345
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 0, -120, 0, 0, 0, 0, -120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, 0, 0, 0, 0, 0, 0, 423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 346
    -        0, 0, 0, 0, 0, 0, 410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 347
    -        0, 0, 0, 0, 0, -339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, -56, 0, -56, 0, 0, 0, 0, -56, -56, 0, -56, -56, 0, -56, 0, 0, 0, 0, 0, -56, -56, 0, -56, 0, 0, -56, 0, -56, 0, 0, 0, 0, -56, 0, -56, 0, 0, 0, 0, -56, -56, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 348
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, -264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 349
    -        0, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 0, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 350
    -        0, 0, 0, 0, 0, -168, 0, -168, 0, 0, 0, -168, 0, 0, -168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -168, 0, -168, -168, -168, -168, -168, 0, 0, 0, 0, 0, -168, -168, -168, -168, -168, -168, 0, 0, 0, 0, -168, -168, -168, -168, -168, -168, 0, 0, -168, -168, -168, 0, -168, -168, -168, -168, -168, -168, -168, -168, 0, 0, 0, -168, 0, 0, 0, -168, -168, -168, -168, 0, -168, -168, -168,
    +        0, 0, 0, 0, 0, 0, 425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 351
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 352
    -        0, 0, 0, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 353
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 354
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -191, 0, -191, 0, 0, 0, -191, 0, 0, -191, 0, 0, 0, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -191, 0, -191, -191, -191, -191, -191, 0, 0, 0, 0, 0, -191, -191, -191, -191, -191, -191, 0, 0, 0, 0, -191, -191, -191, -191, -191, -191, 0, 0, -191, -191, -191, 0, -191, -191, -191, -191, -191, -191, -191, -191, 0, 0, 0, -191, 0, 0, 0, -191, -191, -191, -191, 0, -191, -191, -191,
             // State 355
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 356
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 357
    -        0, 0, 0, 0, 0, 0, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, -490, 0, 0, 0, 0, 0, 0, -490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 358
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 359
    -        0, 0, 0, 0, 0, 0, -181, 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 360
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 361
    -        0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, -493, 0, 0, 0, 0, 0, 0, -493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 362
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -473, 0, 0, 0, 0, 0, 0, 433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 363
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -369, 0, 0, 0, 0, 0, 0, -369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 364
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, 0, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -357, 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 365
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, -323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 366
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, 0, 0, 0, 0, 0, 0, 0, 0, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, -257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, -257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 367
    -        0, 0, 0, 0, 0, -279, 0, -279, 0, 0, 0, -279, 0, 0, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -279, 0, -279, -279, -279, -279, -279, 0, 0, 0, 0, 0, -279, -279, -279, -279, -279, -279, 424, 425, 0, 0, -279, -279, -279, -279, -279, -279, 0, 0, -279, -279, -279, 0, -279, -279, -279, -279, -279, -279, -279, -279, 0, 0, 0, -279, 0, 0, 0, -279, -279, -279, -279, 0, -279, -279, -279,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 368
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -89, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 369
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 370
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 371
    -        0, 0, -301, 0, -301, 0, -301, 0, 0, -301, -301, 0, -301, -301, 0, -301, 0, 0, 0, -301, -301, -301, -301, 0, 0, -301, 0, -301, 0, 0, 0, 0, -301, 0, -301, 0, 0, 0, 0, -301, -301, 0, -301, 0, -301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -301, -301, -301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -301, -301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -204, 0, 0, 0, 0, 0, 0, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -204, 0, 0, 0, 0, 443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 372
    -        0, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 373
    -        0, 0, 0, 0, 0, 0, 0, 200, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, -205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 374
    -        0, 0, 0, 0, 0, 0, -438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 375
    -        0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 376
    -        0, 0, 0, 0, 0, 0, -49, 0, 0, 0, 0, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 377
    -        0, 0, 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 378
    -        0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 432, 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 379
    -        0, 0, 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, -302, 0, -302, 0, 0, 0, -302, 0, 0, -302, 0, 0, 0, -302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -302, 0, -302, -302, -302, -302, -302, 0, 0, 0, 0, 0, -302, -302, -302, -302, -302, -302, 448, 449, 0, 0, -302, -302, -302, -302, -302, -302, 0, 0, -302, -302, -302, 0, -302, -302, -302, -302, -302, -302, -302, -302, 0, 0, 0, -302, 0, 0, 0, -302, -302, -302, -302, 0, -302, -302, -302,
             // State 380
    -        0, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 0,
             // State 381
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 382
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 383
    -        0, 0, 0, 0, 0, -228, 0, -228, 0, 0, 0, -228, 0, 0, -228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228, 0, -228, -228, -228, -228, -228, 0, 0, 0, 0, 0, -228, -228, -228, -228, -228, -228, 0, -228, -228, -228, -228, -228, -228, -228, -228, -228, 0, 0, -228, -228, -228, 0, -228, -228, -228, -228, -228, -228, -228, -228, 0, 0, 0, -228, 0, 0, 0, -228, -228, -228, -228, 0, -228, -228, -228,
    +        0, 0, -326, 0, -326, 0, -326, 0, 0, -326, -326, 0, -326, -326, 0, -326, 0, 0, 0, 0, 0, -326, -326, -326, -326, 0, 0, -326, 0, -326, 0, 0, 0, 0, -326, 0, -326, 0, 0, 0, 0, -326, -326, 0, -326, 0, -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -326, -326, -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -326, -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 384
    -        0, 0, 0, 0, 0, -433, 0, -433, 0, 0, 0, -433, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, -433, -433, -433, -433, -433, 0, 0, 0, 0, 0, -433, -433, -433, -433, -433, -433, 0, 435, 387, 436, -433, -433, -433, -433, -433, -433, 0, 0, -433, -433, -433, 0, -433, -433, -433, -433, -433, -433, -433, -433, 0, 0, 0, -433, 0, 0, 0, -433, -433, -433, -433, 0, -433, -433, -433,
    +        0, 0, 0, 0, 0, 0, 0, 201, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 385
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 386
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 387
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 388
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 76, 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, 83, 83, 84, 85, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 93, 94, 95, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 389
    -        0, 0, 0, 0, 0, -450, 0, -450, 0, 0, 0, -450, 0, 0, -450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -450, 0, -450, -450, -450, -450, -450, 0, 0, 0, 0, 0, -450, -450, -450, -450, -450, -450, 0, 443, 0, 0, -450, -450, -450, -450, -450, -450, 0, 0, -450, -450, -450, 0, -450, -450, -450, -450, -450, -450, -450, -450, 0, 0, 0, -450, 0, 0, 0, -450, -450, -450, -450, 0, -450, -450, -450,
    +        0, 0, 0, 0, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 390
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -451, 0, 0, 0, 0, 0, 0, 0, -451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, -366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 391
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 392
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 393
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, 0, 0, 0, 0, 0, 0, 0, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 394
    -        0, 0, 0, 0, 0, -453, 0, -453, 0, 0, 0, -453, 0, 0, -453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -453, 0, -453, -453, -453, -453, -453, 0, 0, 0, 0, 0, -453, -453, -453, -453, -453, -453, 0, 0, 0, 0, -453, -453, -453, -453, -453, -453, 0, 0, -453, -453, -453, 0, -453, -453, -453, -453, -453, -453, -453, -453, 0, 0, 0, -453, 0, 0, 0, -453, -453, -453, -453, 0, -453, -453, -453,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 395
    -        0, 0, 0, 0, 0, -81, -81, -81, -81, 0, 0, -81, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81, -81, -81, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, -81, 0, 0, 0, -81, 0, 0, 0, -81, -81, 0, -81, 0, -81, -81, -81,
    +        0, 0, 0, 0, 0, -251, 0, -251, 0, 0, 0, -251, 0, 0, -251, 0, 0, 0, -251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -251, 0, -251, -251, -251, -251, -251, 0, 0, 0, 0, 0, -251, -251, -251, -251, -251, -251, 0, -251, -251, -251, -251, -251, -251, -251, -251, -251, 0, 0, -251, -251, -251, 0, -251, -251, -251, -251, -251, -251, -251, -251, 0, 0, 0, -251, 0, 0, 0, -251, -251, -251, -251, 0, -251, -251, -251,
             // State 396
    -        0, 0, 0, 0, 0, 0, -267, 0, 0, 0, 0, 0, 0, -267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -470, 0, -470, 0, 0, 0, -470, 0, 0, -470, 0, 0, 0, -470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -470, 0, -470, -470, -470, -470, -470, 0, 0, 0, 0, 0, -470, -470, -470, -470, -470, -470, 0, 459, 399, 460, -470, -470, -470, -470, -470, -470, 0, 0, -470, -470, -470, 0, -470, -470, -470, -470, -470, -470, -470, -470, 0, 0, 0, -470, 0, 0, 0, -470, -470, -470, -470, 0, -470, -470, -470,
             // State 397
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 398
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 399
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 77, 78, 79, 80, 81, 82, 0, 0, 0, 0, 83, 84, 84, 85, 86, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 94, 95, 96, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 401
    -        0, 0, 0, 0, 0, 0, -38, 0, 0, 0, 0, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, -38, -38, 0, 0, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -505, 0, -505, 0, 0, 0, -505, 0, 0, -505, 0, 0, 0, -505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -505, 0, -505, -505, -505, -505, -505, 0, 0, 0, 0, 0, -505, -505, -505, -505, -505, -505, 0, 467, 0, 0, -505, -505, -505, -505, -505, -505, 0, 0, -505, -505, -505, 0, -505, -505, -505, -505, -505, -505, -505, -505, 0, 0, 0, -505, 0, 0, 0, -505, -505, -505, -505, 0, -505, -505, -505,
             // State 402
    -        -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, 0, 0, 0, -134, -134, -134, -134, -134, -134, -134, 0, 0, 0, 0, 0, 0, 0, -134, 0, 0, -134, -134, -134, 0, -134, 0, -134, -134, 0, 0, -134, -134, 0, 0, 0, 0, 0, 0, 0, 0, -134, -134, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -506, 0, 0, 0, 0, 0, 0, 0, 0, 0, -506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 403
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 404
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 405
    -        0, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 406
    -        0, 0, 0, 0, 0, -169, 0, -169, 0, 0, 0, -169, 0, 0, -169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -169, 0, -169, -169, -169, -169, -169, 0, 0, 0, 0, 0, -169, -169, -169, -169, -169, -169, 0, 0, 0, 0, -169, -169, -169, -169, -169, -169, 0, 0, -169, -169, -169, 0, -169, -169, -169, -169, -169, -169, -169, -169, 0, 0, 0, -169, 0, 0, 0, -169, -169, -169, -169, 0, -169, -169, -169,
    +        0, 0, 0, 0, 0, -508, 0, -508, 0, 0, 0, -508, 0, 0, -508, 0, 0, 0, -508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -508, 0, -508, -508, -508, -508, -508, 0, 0, 0, 0, 0, -508, -508, -508, -508, -508, -508, 0, 0, 0, 0, -508, -508, -508, -508, -508, -508, 0, 0, -508, -508, -508, 0, -508, -508, -508, -508, -508, -508, -508, -508, 0, 0, 0, -508, 0, 0, 0, -508, -508, -508, -508, 0, -508, -508, -508,
             // State 407
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -103, -103, -103, -103, 0, 0, -103, 0, 0, -103, 0, 0, 0, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -103, -103, -103, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -103, 0, -103, 0, 0, 0, 0, 0, 0, 0, 0, -103, 0, 0, 0, -103, 0, 0, 0, -103, -103, 0, -103, 0, -103, -103, -103,
             // State 408
    -        0, 0, -388, 0, -388, 0, -388, 0, 0, -388, -388, 0, -388, -388, 0, -388, 0, 0, 0, -388, -388, -388, -388, 0, 0, -388, 0, -388, 0, 0, 0, 0, -388, 0, -388, 0, 0, 0, 0, -388, -388, 0, -388, 0, -388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -388, -388, -388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -388, -388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -292, 0, 0, 0, 0, 0, 0, -292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 409
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, -418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 410
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 411
    -        0, 0, 0, 0, 0, -263, 0, -263, 0, 0, 0, -263, 0, 0, -263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -263, 0, -263, -263, -263, -263, -263, 0, 0, 0, 0, 0, -263, -263, -263, -263, -263, -263, 0, 0, 0, 0, -263, -263, -263, -263, -263, -263, 0, 0, -263, -263, -263, 0, -263, -263, -263, -263, -263, -263, -263, -263, 0, 0, 0, -263, 0, 0, 0, -263, -263, -263, -263, 0, -263, -263, -263,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 412
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 413
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 414
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 415
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, -49, 0, 0, 0, 0, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, -49, 0, 0, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 416
    -        0, 0, 0, 0, 0, 0, -184, 0, 0, 0, 0, 0, 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, 0, 0, 0, 0, 455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, 0, -156, 0, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, -156, 0, 0, 0, -156, -156, -156, -156, -156, -156, -156, 0, 0, 0, 0, 0, 0, 0, -156, 0, 0, -156, -156, -156, 0, -156, 0, -156, -156, 0, 0, -156, -156, 0, 0, 0, 0, 0, 0, 0, 0, -156, -156, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 417
    -        0, 0, 0, 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -95, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 418
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 419
    -        0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 420
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, 0, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -192, 0, -192, 0, 0, 0, -192, 0, 0, -192, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, 0, -192, -192, -192, -192, -192, 0, 0, 0, 0, 0, -192, -192, -192, -192, -192, -192, 0, 0, 0, 0, -192, -192, -192, -192, -192, -192, 0, 0, -192, -192, -192, 0, -192, -192, -192, -192, -192, -192, -192, -192, 0, 0, 0, -192, 0, 0, 0, -192, -192, -192, -192, 0, -192, -192, -192,
             // State 421
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -27, 0, 0, 0, 0, 0, 0, 0, 0, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 422
    -        0, 0, 0, 0, 0, -280, 0, -280, 0, 0, 0, -280, 0, 0, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, -280, -280, -280, -280, -280, 0, 0, 0, 0, 0, -280, -280, -280, -280, -280, -280, 458, 459, 0, 0, -280, -280, -280, -280, -280, -280, 0, 0, -280, -280, -280, 0, -280, -280, -280, -280, -280, -280, -280, -280, 0, 0, 0, -280, 0, 0, 0, -280, -280, -280, -280, 0, -280, -280, -280,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 423
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, -425, 0, -425, 0, -425, 0, 0, -425, -425, 0, -425, -425, 0, -425, 0, 0, 0, 0, 0, -425, -425, -425, -425, 0, 0, -425, 0, -425, 0, 0, 0, 0, -425, 0, -425, 0, 0, 0, 0, -425, -425, 0, -425, 0, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -425, -425, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -425, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 424
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 425
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 426
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -86, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 427
    -        0, 0, 0, 0, 0, 0, -439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -288, 0, -288, 0, 0, 0, -288, 0, 0, -288, 0, 0, 0, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288, 0, -288, -288, -288, -288, -288, 0, 0, 0, 0, 0, -288, -288, -288, -288, -288, -288, 0, 0, 0, 0, -288, -288, -288, -288, -288, -288, 0, 0, -288, -288, -288, 0, -288, -288, -288, -288, -288, -288, -288, -288, 0, 0, 0, -288, 0, 0, 0, -288, -288, -288, -288, 0, -288, -288, -288,
             // State 428
    -        0, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 429
    -        0, 0, 0, 0, 0, 0, -50, 0, 0, 0, 0, 0, 0, -50, 0, 0, 0, 0, 0, 0, 0, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -368, 0, 0, 0, 0, 0, 0, -368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 430
    -        0, 0, 0, 0, 0, 0, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 431
    -        0, 0, 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, -474, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 432
    -        0, 0, 0, 0, 0, 0, -327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 365, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 433
    -        0, 0, 0, 0, 0, -229, 0, -229, 0, 0, 0, -229, 0, 0, -229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -229, 0, -229, -229, -229, -229, -229, 0, 0, 0, 0, 0, -229, -229, -229, -229, -229, -229, 0, -229, -229, -229, -229, -229, -229, -229, -229, -229, 0, 0, -229, -229, -229, 0, -229, -229, -229, -229, -229, -229, -229, -229, 0, 0, 0, -229, 0, 0, 0, -229, -229, -229, -229, 0, -229, -229, -229,
    +        0, 0, 0, 0, 0, 0, -359, 0, 0, 0, 0, 0, 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 434
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -356, 0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 435
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 436
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, -322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 437
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 438
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 439
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 440
    -        0, 0, 0, 0, 0, -372, 0, -372, 0, 0, 0, -372, 0, 0, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -372, 0, -372, -372, -372, -372, 0, 0, 0, 0, 0, 0, -372, -372, -372, -372, -372, -372, 0, 0, 0, 0, -372, -372, -372, -372, -372, -372, 0, 0, -372, -372, -372, 0, -372, -372, -372, -372, -372, -372, -372, -372, 0, 0, 0, -372, 0, 0, 0, -372, -372, -372, -372, 0, -372, -372, -372,
    +        0, 0, 0, 0, 0, 0, -207, 0, 0, 0, 0, 0, 0, 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -207, 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 441
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 76, 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, 83, 83, 84, 85, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 93, 94, 95, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 472, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, 0,
             // State 442
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 443
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 444
    -        0, 0, 0, 0, 0, -454, 0, -454, 0, 0, 0, -454, 0, 0, -454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -454, 0, -454, -454, -454, -454, -454, 0, 0, 0, 0, 0, -454, -454, -454, -454, -454, -454, 0, 0, 0, 0, -454, -454, -454, -454, -454, -454, 0, 0, -454, -454, -454, 0, -454, -454, -454, -454, -454, -454, -454, -454, 0, 0, 0, -454, 0, 0, 0, -454, -454, -454, -454, 0, -454, -454, -454,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 445
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 446
    -        0, 0, 0, 0, 0, 0, -353, 0, 0, 0, 0, 0, 0, -353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -353, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -303, 0, -303, 0, 0, 0, -303, 0, 0, -303, 0, 0, 0, -303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -303, 0, -303, -303, -303, -303, -303, 0, 0, 0, 0, 0, -303, -303, -303, -303, -303, -303, 495, 496, 0, 0, -303, -303, -303, -303, -303, -303, 0, 0, -303, -303, -303, 0, -303, -303, -303, -303, -303, -303, -303, -303, 0, 0, 0, -303, 0, 0, 0, -303, -303, -303, -303, 0, -303, -303, -303,
             // State 447
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 448
    -        0, 0, 0, 0, 0, -264, 0, -264, 0, 0, 0, -264, 0, 0, -264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -264, 0, -264, -264, -264, -264, -264, 0, 0, 0, 0, 0, -264, -264, -264, -264, -264, -264, 0, 0, 0, 0, -264, -264, -264, -264, -264, -264, 0, 0, -264, -264, -264, 0, -264, -264, -264, -264, -264, -264, -264, -264, 0, 0, 0, -264, 0, 0, 0, -264, -264, -264, -264, 0, -264, -264, -264,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 449
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -213, 0, -213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 450
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, 0,
             // State 451
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 452
    -        0, 0, 0, 0, 0, -261, 0, -261, 0, 0, 0, -261, 0, 0, -261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -261, 0, -261, -261, -261, -261, -261, 0, 0, 0, 0, 0, -261, -261, -261, -261, -261, -261, 0, 480, 0, 0, -261, -261, -261, -261, -261, -261, 0, 0, -261, -261, -261, 0, -261, -261, -261, -261, -261, -261, -261, -261, 0, 0, 0, -261, 0, 0, 0, -261, -261, -261, -261, 0, -261, -261, -261,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 453
    -        0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 454
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 455
    -        0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 456
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 457
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -252, 0, -252, 0, 0, 0, -252, 0, 0, -252, 0, 0, 0, -252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -252, 0, -252, -252, -252, -252, -252, 0, 0, 0, 0, 0, -252, -252, -252, -252, -252, -252, 0, -252, -252, -252, -252, -252, -252, -252, -252, -252, 0, 0, -252, -252, -252, 0, -252, -252, -252, -252, -252, -252, -252, -252, 0, 0, 0, -252, 0, 0, 0, -252, -252, -252, -252, 0, -252, -252, -252,
             // State 458
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 459
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 460
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 461
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -88, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 462
    -        0, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 463
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 464
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -405, 0, -405, 0, 0, 0, -405, 0, 0, -405, 0, 0, 0, -405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -405, 0, -405, -405, -405, -405, 0, 0, 0, 0, 0, 0, -405, -405, -405, -405, -405, -405, 0, 0, 0, 0, -405, -405, -405, -405, -405, -405, 0, 0, -405, -405, -405, 0, -405, -405, -405, -405, -405, -405, -405, -405, 0, 0, 0, -405, 0, 0, 0, -405, -405, -405, -405, 0, -405, -405, -405,
             // State 465
    -        0, 0, 0, 0, 0, -428, 0, -428, 0, 0, 0, -428, 0, 0, -428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -428, 0, -428, -428, -428, -428, -428, 0, 0, 0, 0, 0, -428, -428, -428, -428, -428, -428, 0, 0, 0, 489, -428, -428, -428, -428, -428, -428, 0, 0, -428, -428, -428, 0, -428, -428, -428, -428, -428, -428, -428, -428, 0, 0, 0, -428, 0, 0, 0, -428, -428, -428, -428, 0, -428, -428, -428,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 77, 78, 79, 80, 81, 82, 0, 0, 0, 0, 83, 84, 84, 85, 86, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 94, 95, 96, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 509, 34, 0, 35, 36, 37,
             // State 466
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 467
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 468
    -        0, 0, 0, 0, 0, -224, 0, -224, 0, 0, 0, -224, 0, 0, -224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -224, 0, -224, -224, -224, -224, -224, 0, 0, 0, 0, 0, -224, -224, -224, -224, -224, -224, 0, -224, -224, -224, -224, -224, -224, -224, -224, -224, 0, 0, -224, -224, -224, 0, -224, -224, -224, -224, -224, -224, -224, -224, 0, 0, 0, -224, 0, 0, 0, -224, -224, -224, -224, 0, -224, -224, -224,
    +        0, 0, 0, 0, 0, -509, 0, -509, 0, 0, 0, -509, 0, 0, -509, 0, 0, 0, -509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -509, 0, -509, -509, -509, -509, -509, 0, 0, 0, 0, 0, -509, -509, -509, -509, -509, -509, 0, 0, 0, 0, -509, -509, -509, -509, -509, -509, 0, 0, -509, -509, -509, 0, -509, -509, -509, -509, -509, -509, -509, -509, 0, 0, 0, -509, 0, 0, 0, -509, -509, -509, -509, 0, -509, -509, -509,
             // State 469
    -        0, 0, 0, 0, 0, -430, 0, -430, 0, 0, 0, -430, 0, 0, -430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -430, 0, -430, -430, -430, -430, -430, 0, 0, 0, 0, 0, -430, -430, -430, -430, -430, -430, 0, 0, 0, 0, -430, -430, -430, -430, -430, -430, 0, 0, -430, -430, -430, 0, -430, -430, -430, -430, -430, -430, -430, -430, 0, 0, 0, -430, 0, 0, 0, -430, -430, -430, -430, 0, -430, -430, -430,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 470
    -        0, 0, 0, 0, 0, -373, 0, -373, 0, 0, 0, -373, 0, 0, -373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -373, 0, -373, -373, -373, -373, 0, 0, 0, 0, 0, 0, -373, -373, -373, -373, -373, -373, 0, 0, 0, 0, -373, -373, -373, -373, -373, -373, 0, 0, -373, -373, -373, 0, -373, -373, -373, -373, -373, -373, -373, -373, 0, 0, 0, -373, 0, 0, 0, -373, -373, -373, -373, 0, -373, -373, -373,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 471
    -        0, 0, 0, 0, 0, -385, 0, -385, 0, 0, 0, -385, 0, 0, -385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -385, 0, -385, -385, -385, -385, -385, 0, 0, 0, 0, 0, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, -385, 0, 0, -385, -385, -385, 0, -385, -385, -385, -385, -385, -385, -385, -385, 0, 0, 0, -385, 0, 0, 0, -385, -385, -385, -385, 0, -385, -385, -385,
    +        0, 0, 0, 0, 0, 0, -386, 0, 0, 0, 0, 0, 0, -386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -386, 0, 0, 0, 513, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 472
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 473
    -        0, 0, 0, 0, 0, 0, -211, 0, 0, 0, 0, 0, 0, -211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -211, 0, 0, 0, -211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 474
    -        0, 0, 0, 0, 0, 0, -354, 0, 0, 0, 0, 0, 0, -354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -354, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -289, 0, -289, 0, 0, 0, -289, 0, 0, -289, 0, 0, 0, -289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -289, 0, -289, -289, -289, -289, -289, 0, 0, 0, 0, 0, -289, -289, -289, -289, -289, -289, 0, 0, 0, 0, -289, -289, -289, -289, -289, -289, 0, 0, -289, -289, -289, 0, -289, -289, -289, -289, -289, -289, -289, -289, 0, 0, 0, -289, 0, 0, 0, -289, -289, -289, -289, 0, -289, -289, -289,
             // State 475
    -        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -236, 0, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 476
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 477
    -        0, 0, 0, 0, 0, -166, 0, -166, 0, 0, 0, -166, 0, 0, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, 0, -166, -166, -166, -166, -166, 0, 0, 0, 0, 0, -166, -166, -166, -166, -166, -166, 0, 0, 0, 0, -166, -166, -166, -166, -166, -166, 0, 0, -166, -166, -166, 0, -166, -166, -166, -166, -166, -166, -166, -166, 0, 0, 0, -166, 0, 0, 0, -166, -166, -166, -166, 0, -166, -166, -166,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 478
    -        0, 0, 0, 0, 0, -262, 0, -262, 0, 0, 0, -262, 0, 0, -262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -262, 0, -262, -262, -262, -262, -262, 0, 0, 0, 0, 0, -262, -262, -262, -262, -262, -262, 0, 497, 0, 0, -262, -262, -262, -262, -262, -262, 0, 0, -262, -262, -262, 0, -262, -262, -262, -262, -262, -262, -262, -262, 0, 0, 0, -262, 0, 0, 0, -262, -262, -262, -262, 0, -262, -262, -262,
    +        0, 0, 0, 0, 0, 0, -489, 0, 0, 0, 0, 0, 0, -489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 479
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -494, 0, 0, 0, 0, 0, 0, -494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 480
    -        0, 0, 0, 0, 0, 0, -183, 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 365, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 481
    -        0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0,
    +        0, 0, 0, 0, 0, 0, -475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 482
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 483
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, -60, 0, 0, 0, 0, 0, 0, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 484
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 485
    -        0, 0, 0, 0, 0, -277, 0, -277, 0, 0, 0, -277, 0, 0, -277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -277, 0, -277, -277, -277, -277, -277, 0, 0, 0, 0, 0, -277, -277, -277, -277, -277, -277, 0, 0, 0, 0, -277, -277, -277, -277, -277, -277, 0, 0, -277, -277, -277, 0, -277, -277, -277, -277, -277, -277, -277, -277, 0, 0, 0, -277, 0, 0, 0, -277, -277, -277, -277, 0, -277, -277, -277,
    +        0, 0, 0, 0, 0, 0, -358, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 486
    -        0, 0, 0, 0, 0, -429, 0, -429, 0, 0, 0, -429, 0, 0, -429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -429, 0, -429, -429, -429, -429, -429, 0, 0, 0, 0, 0, -429, -429, -429, -429, -429, -429, 0, 0, 0, 503, -429, -429, -429, -429, -429, -429, 0, 0, -429, -429, -429, 0, -429, -429, -429, -429, -429, -429, -429, -429, 0, 0, 0, -429, 0, 0, 0, -429, -429, -429, -429, 0, -429, -429, -429,
    +        0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 487
    -        0, 0, 0, 0, 0, -431, 0, -431, 0, 0, 0, -431, 0, 0, -431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -431, 0, -431, -431, -431, -431, -431, 0, 0, 0, 0, 0, -431, -431, -431, -431, -431, -431, 0, 0, 0, 0, -431, -431, -431, -431, -431, -431, 0, 0, -431, -431, -431, 0, -431, -431, -431, -431, -431, -431, -431, -431, 0, 0, 0, -431, 0, 0, 0, -431, -431, -431, -431, 0, -431, -431, -431,
    +        0, 0, 0, 0, 0, 0, -353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 488
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 489
    -        0, 0, 0, 0, 0, -223, 0, -223, 0, 0, 0, -223, 0, 0, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -223, 0, -223, -223, -223, -223, -223, 0, 0, 0, 0, 0, -223, -223, -223, -223, -223, -223, 0, -223, -223, -223, -223, -223, -223, -223, -223, -223, 0, 0, -223, -223, -223, 0, -223, -223, -223, -223, -223, -223, -223, -223, 0, 0, 0, -223, 0, 0, 0, -223, -223, -223, -223, 0, -223, -223, -223,
    +        0, 0, 0, 0, 0, -284, 0, -284, 0, 0, 0, -284, 0, 0, -284, 0, 0, 0, -284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -284, 0, -284, -284, -284, -284, -284, 0, 0, 0, 0, 0, -284, -284, -284, -284, -284, -284, 0, 525, 0, 0, -284, -284, -284, -284, -284, -284, 0, 0, -284, -284, -284, 0, -284, -284, -284, -284, -284, -284, -284, -284, 0, 0, 0, -284, 0, 0, 0, -284, -284, -284, -284, 0, -284, -284, -284,
             // State 490
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -119, 0,
             // State 491
    -        0, 0, 0, 0, 0, -449, 0, -449, 0, 0, 0, -449, 0, 0, -449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -449, 0, -449, -449, -449, -449, -449, 0, 0, 0, 0, 0, -449, -449, -449, -449, -449, -449, 0, 0, 0, 0, -449, -449, -449, -449, -449, -449, 0, 0, -449, -449, -449, 0, -449, -449, -449, -449, -449, -449, -449, -449, 0, 0, 0, -449, 0, 0, 0, -449, -449, -449, -449, 0, -449, -449, -449,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 492
    -        0, 0, 0, 0, 0, 0, -212, 0, 0, 0, 0, 0, 0, -212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -212, 0, 0, 0, -212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, -203, 0, 0, 0, 0, 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 493
    -        0, 0, 0, 0, 0, 0, -208, 0, 0, 0, 0, 0, 0, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208, 0, 0, 0, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 494
    -        0, 0, 0, 0, 0, 0, -237, 0, 0, 0, 0, 0, 0, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, 0, 0, 0, -237, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 495
    -        0, 0, 0, 0, 0, -167, 0, -167, 0, 0, 0, -167, 0, 0, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, 0, -167, -167, -167, -167, -167, 0, 0, 0, 0, 0, -167, -167, -167, -167, -167, -167, 0, 0, 0, 0, -167, -167, -167, -167, -167, -167, 0, 0, -167, -167, -167, 0, -167, -167, -167, -167, -167, -167, -167, -167, 0, 0, 0, -167, 0, 0, 0, -167, -167, -167, -167, 0, -167, -167, -167,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 496
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 497
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 498
    -        0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -110, 0,
             // State 499
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 500
    -        0, 0, 0, 0, 0, -278, 0, -278, 0, 0, 0, -278, 0, 0, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, -278, -278, -278, -278, -278, 0, 0, 0, 0, 0, -278, -278, -278, -278, -278, -278, 0, 0, 0, 0, -278, -278, -278, -278, -278, -278, 0, 0, -278, -278, -278, 0, -278, -278, -278, -278, -278, -278, -278, -278, 0, 0, 0, -278, 0, 0, 0, -278, -278, -278, -278, 0, -278, -278, -278,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 501
    -        0, 0, 0, 0, 0, -101, 0, -101, 0, 0, 0, -101, 0, 0, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -101, 0, -101, -101, -101, -101, -101, 0, 0, 0, 0, 0, -101, -101, -101, -101, -101, -101, -101, -101, 0, 0, -101, -101, -101, -101, -101, -101, 0, 0, -101, -101, -101, 0, -101, -101, -101, -101, -101, -101, -101, -101, 0, 0, 0, -101, 0, 0, 0, -101, -101, -101, -101, 0, -101, -101, -101,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 502
    -        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, -465, 0, -465, 0, 0, 0, -465, 0, 0, -465, 0, 0, 0, -465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -465, 0, -465, -465, -465, -465, -465, 0, 0, 0, 0, 0, -465, -465, -465, -465, -465, -465, 0, 0, 0, 534, -465, -465, -465, -465, -465, -465, 0, 0, -465, -465, -465, 0, -465, -465, -465, -465, -465, -465, -465, -465, 0, 0, 0, -465, 0, 0, 0, -465, -465, -465, -465, 0, -465, -465, -465,
             // State 503
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 504
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
             // State 505
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -247, 0, -247, 0, 0, 0, -247, 0, 0, -247, 0, 0, 0, -247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -247, 0, -247, -247, -247, -247, -247, 0, 0, 0, 0, 0, -247, -247, -247, -247, -247, -247, 0, -247, -247, -247, -247, -247, -247, -247, -247, -247, 0, 0, -247, -247, -247, 0, -247, -247, -247, -247, -247, -247, -247, -247, 0, 0, 0, -247, 0, 0, 0, -247, -247, -247, -247, 0, -247, -247, -247,
             // State 506
    -        0, 0, 0, 0, 0, -259, 0, -259, 0, 0, 0, -259, 0, 0, -259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -259, 0, -259, -259, -259, -259, -259, 0, 0, 0, 0, 0, -259, -259, -259, -259, -259, -259, 0, 0, 0, 0, -259, -259, -259, -259, -259, -259, 0, 0, -259, -259, -259, 0, -259, -259, -259, -259, -259, -259, -259, -259, 0, 0, 0, -259, 0, 0, 0, -259, -259, -259, -259, 0, -259, -259, -259,
    +        0, 0, 0, 0, 0, -467, 0, -467, 0, 0, 0, -467, 0, 0, -467, 0, 0, 0, -467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -467, 0, -467, -467, -467, -467, -467, 0, 0, 0, 0, 0, -467, -467, -467, -467, -467, -467, 0, 0, 0, 0, -467, -467, -467, -467, -467, -467, 0, 0, -467, -467, -467, 0, -467, -467, -467, -467, -467, -467, -467, -467, 0, 0, 0, -467, 0, 0, 0, -467, -467, -467, -467, 0, -467, -467, -467,
             // State 507
    -        0, 0, 0, 0, 0, -102, 0, -102, 0, 0, 0, -102, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, -102, -102, -102, -102, -102, 0, 0, 0, 0, 0, -102, -102, -102, -102, -102, -102, -102, -102, 0, 0, -102, -102, -102, -102, -102, -102, 0, 0, -102, -102, -102, 0, -102, -102, -102, -102, -102, -102, -102, -102, 0, 0, 0, -102, 0, 0, 0, -102, -102, -102, -102, 0, -102, -102, -102,
    +        0, 0, 0, 0, 0, -406, 0, -406, 0, 0, 0, -406, 0, 0, -406, 0, 0, 0, -406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -406, 0, -406, -406, -406, -406, 0, 0, 0, 0, 0, 0, -406, -406, -406, -406, -406, -406, 0, 0, 0, 0, -406, -406, -406, -406, -406, -406, 0, 0, -406, -406, -406, 0, -406, -406, -406, -406, -406, -406, -406, -406, 0, 0, 0, -406, 0, 0, 0, -406, -406, -406, -406, 0, -406, -406, -406,
             // State 508
    -        0, 0, 0, 0, 0, 22, 0, 73, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 307, 0, 0, 0, 0, 0, 76, 77, 0, 79, 0, 81, 0, 0, 0, 0, 0, 83, 83, 84, 0, 86, 0, 0, 87, 88, 89, 0, 90, 91, 92, 0, 0, 0, 96, 29, 0, 0, 0, 30, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36,
    +        0, 0, 0, 0, 0, -422, 0, -422, 0, 0, 0, -422, 0, 0, -422, 0, 0, 0, -422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -422, 0, -422, -422, -422, -422, -422, 0, 0, 0, 0, 0, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, 0, 0, -422, -422, -422, 0, -422, -422, -422, -422, -422, -422, -422, -422, 0, 0, 0, -422, 0, 0, 0, -422, -422, -422, -422, 0, -422, -422, -422,
             // State 509
    -        0, 0, 0, 0, 0, -426, 0, -426, 0, 0, 0, -426, 0, 0, -426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -426, 0, -426, -426, -426, -426, -426, 0, 0, 0, 0, 0, -426, -426, -426, -426, -426, -426, 0, 0, 0, 0, -426, -426, -426, -426, -426, -426, 0, 0, -426, -426, -426, 0, -426, -426, -426, -426, -426, -426, -426, -426, 0, 0, 0, -426, 0, 0, 0, -426, -426, -426, -426, 0, -426, -426, -426,
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
             // State 510
    -        0, 0, 0, 0, 0, -225, 0, -225, 0, 0, 0, -225, 0, 0, -225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -225, 0, -225, -225, -225, -225, -225, 0, 0, 0, 0, 0, -225, -225, -225, -225, -225, -225, 0, -225, -225, -225, -225, -225, -225, -225, -225, -225, 0, 0, -225, -225, -225, 0, -225, -225, -225, -225, -225, -225, -225, -225, 0, 0, 0, -225, 0, 0, 0, -225, -225, -225, -225, 0, -225, -225, -225,
    +        0, 0, 0, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -234, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 511
    -        0, 0, 0, 0, 0, -260, 0, -260, 0, 0, 0, -260, 0, 0, -260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -260, 0, -260, -260, -260, -260, -260, 0, 0, 0, 0, 0, -260, -260, -260, -260, -260, -260, 0, 0, 0, 0, -260, -260, -260, -260, -260, -260, 0, 0, -260, -260, -260, 0, -260, -260, -260, -260, -260, -260, -260, -260, 0, 0, 0, -260, 0, 0, 0, -260, -260, -260, -260, 0, -260, -260, -260,
    +        0, 0, 0, 0, 0, 0, -387, 0, 0, 0, 0, 0, 0, -387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -387, 0, 0, 0, 513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 512
    -        0, 0, 0, 0, 0, -427, 0, -427, 0, 0, 0, -427, 0, 0, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -427, 0, -427, -427, -427, -427, -427, 0, 0, 0, 0, 0, -427, -427, -427, -427, -427, -427, 0, 0, 0, 0, -427, -427, -427, -427, -427, -427, 0, 0, -427, -427, -427, 0, -427, -427, -427, -427, -427, -427, -427, -427, 0, 0, 0, -427, 0, 0, 0, -427, -427, -427, -427, 0, -427, -427, -427,
    +        0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 513
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 514
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 515
    +        0, 0, 0, 0, 0, -189, 0, -189, 0, 0, 0, -189, 0, 0, -189, 0, 0, 0, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -189, 0, -189, -189, -189, -189, -189, 0, 0, 0, 0, 0, -189, -189, -189, -189, -189, -189, 0, 0, 0, 0, -189, -189, -189, -189, -189, -189, 0, 0, -189, -189, -189, 0, -189, -189, -189, -189, -189, -189, -189, -189, 0, 0, 0, -189, 0, 0, 0, -189, -189, -189, -189, 0, -189, -189, -189,
    +        // State 516
    +        0, 0, 0, 0, 0, -286, 0, -286, 0, 0, 0, -286, 0, 0, -286, 0, 0, 0, -286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -286, 0, -286, -286, -286, -286, -286, 0, 0, 0, 0, 0, -286, -286, -286, -286, -286, -286, 0, 0, 0, 0, -286, -286, -286, -286, -286, -286, 0, 0, -286, -286, -286, 0, -286, -286, -286, -286, -286, -286, -286, -286, 0, 0, 0, -286, 0, 0, 0, -286, -286, -286, -286, 0, -286, -286, -286,
    +        // State 517
    +        0, 0, 0, 0, 0, 0, -476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 518
    +        0, 0, 0, 0, 0, 0, -472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 519
    +        0, 0, 0, 0, 0, 0, -61, 0, 0, 0, 0, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 520
    +        0, 0, 0, 0, 0, 0, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 521
    +        0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0,
    +        // State 522
    +        0, 0, 0, 0, 0, 0, -352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 523
    +        0, 0, 0, 0, 0, -285, 0, -285, 0, 0, 0, -285, 0, 0, -285, 0, 0, 0, -285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -285, 0, -285, -285, -285, -285, -285, 0, 0, 0, 0, 0, -285, -285, -285, -285, -285, -285, 0, 544, 0, 0, -285, -285, -285, -285, -285, -285, 0, 0, -285, -285, -285, 0, -285, -285, -285, -285, -285, -285, -285, -285, 0, 0, 0, -285, 0, 0, 0, -285, -285, -285, -285, 0, -285, -285, -285,
    +        // State 524
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 525
    +        0, 0, 0, 0, 0, 0, -206, 0, 0, 0, 0, 0, 0, 546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 526
    +        0, 0, 0, 0, 0, 0, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, 0,
    +        // State 527
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 528
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 529
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 530
    +        0, 0, 0, 0, 0, -300, 0, -300, 0, 0, 0, -300, 0, 0, -300, 0, 0, 0, -300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -300, 0, -300, -300, -300, -300, -300, 0, 0, 0, 0, 0, -300, -300, -300, -300, -300, -300, 0, 0, 0, 0, -300, -300, -300, -300, -300, -300, 0, 0, -300, -300, -300, 0, -300, -300, -300, -300, -300, -300, -300, -300, 0, 0, 0, -300, 0, 0, 0, -300, -300, -300, -300, 0, -300, -300, -300,
    +        // State 531
    +        0, 0, 0, 0, 0, -466, 0, -466, 0, 0, 0, -466, 0, 0, -466, 0, 0, 0, -466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -466, 0, -466, -466, -466, -466, -466, 0, 0, 0, 0, 0, -466, -466, -466, -466, -466, -466, 0, 0, 0, 550, -466, -466, -466, -466, -466, -466, 0, 0, -466, -466, -466, 0, -466, -466, -466, -466, -466, -466, -466, -466, 0, 0, 0, -466, 0, 0, 0, -466, -466, -466, -466, 0, -466, -466, -466,
    +        // State 532
    +        0, 0, 0, 0, 0, -468, 0, -468, 0, 0, 0, -468, 0, 0, -468, 0, 0, 0, -468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -468, 0, -468, -468, -468, -468, -468, 0, 0, 0, 0, 0, -468, -468, -468, -468, -468, -468, 0, 0, 0, 0, -468, -468, -468, -468, -468, -468, 0, 0, -468, -468, -468, 0, -468, -468, -468, -468, -468, -468, -468, -468, 0, 0, 0, -468, 0, 0, 0, -468, -468, -468, -468, 0, -468, -468, -468,
    +        // State 533
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 534
    +        0, 0, 0, 0, 0, -246, 0, -246, 0, 0, 0, -246, 0, 0, -246, 0, 0, 0, -246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -246, 0, -246, -246, -246, -246, -246, 0, 0, 0, 0, 0, -246, -246, -246, -246, -246, -246, 0, -246, -246, -246, -246, -246, -246, -246, -246, -246, 0, 0, -246, -246, -246, 0, -246, -246, -246, -246, -246, -246, -246, -246, 0, 0, 0, -246, 0, 0, 0, -246, -246, -246, -246, 0, -246, -246, -246,
    +        // State 535
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 536
    +        0, 0, 0, 0, 0, -504, 0, -504, 0, 0, 0, -504, 0, 0, -504, 0, 0, 0, -504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -504, 0, -504, -504, -504, -504, -504, 0, 0, 0, 0, 0, -504, -504, -504, -504, -504, -504, 0, 0, 0, 0, -504, -504, -504, -504, -504, -504, 0, 0, -504, -504, -504, 0, -504, -504, -504, -504, -504, -504, -504, -504, 0, 0, 0, -504, 0, 0, 0, -504, -504, -504, -504, 0, -504, -504, -504,
    +        // State 537
    +        0, 0, 0, 0, 0, 0, -235, 0, 0, 0, 0, 0, 0, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -235, 0, 0, 0, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 538
    +        0, 0, 0, 0, 0, 0, -231, 0, 0, 0, 0, 0, 0, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -231, 0, 0, 0, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 539
    +        0, 0, 0, 0, 0, 0, -260, 0, 0, 0, 0, 0, 0, -260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -260, 0, 0, 0, -260, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 540
    +        0, 0, 0, 0, 0, -190, 0, -190, 0, 0, 0, -190, 0, 0, -190, 0, 0, 0, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -190, 0, -190, -190, -190, -190, -190, 0, 0, 0, 0, 0, -190, -190, -190, -190, -190, -190, 0, 0, 0, 0, -190, -190, -190, -190, -190, -190, 0, 0, -190, -190, -190, 0, -190, -190, -190, -190, -190, -190, -190, -190, 0, 0, 0, -190, 0, 0, 0, -190, -190, -190, -190, 0, -190, -190, -190,
    +        // State 541
    +        0, 0, 0, 0, 0, -287, 0, -287, 0, 0, 0, -287, 0, 0, -287, 0, 0, 0, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -287, 0, -287, -287, -287, -287, -287, 0, 0, 0, 0, 0, -287, -287, -287, -287, -287, -287, 0, 0, 0, 0, -287, -287, -287, -287, -287, -287, 0, 0, -287, -287, -287, 0, -287, -287, -287, -287, -287, -287, -287, -287, 0, 0, 0, -287, 0, 0, 0, -287, -287, -287, -287, 0, -287, -287, -287,
    +        // State 542
    +        0, 0, 0, 0, 0, 0, -354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 543
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 544
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 545
    +        0, 0, 0, 0, 0, 0, -118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -118, 0,
    +        // State 546
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 547
    +        0, 0, 0, 0, 0, -301, 0, -301, 0, 0, 0, -301, 0, 0, -301, 0, 0, 0, -301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -301, 0, -301, -301, -301, -301, -301, 0, 0, 0, 0, 0, -301, -301, -301, -301, -301, -301, 0, 0, 0, 0, -301, -301, -301, -301, -301, -301, 0, 0, -301, -301, -301, 0, -301, -301, -301, -301, -301, -301, -301, -301, 0, 0, 0, -301, 0, 0, 0, -301, -301, -301, -301, 0, -301, -301, -301,
    +        // State 548
    +        0, 0, 0, 0, 0, -123, 0, -123, 0, 0, 0, -123, 0, 0, -123, 0, 0, 0, -123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -123, 0, -123, -123, -123, -123, -123, 0, 0, 0, 0, 0, -123, -123, -123, -123, -123, -123, -123, -123, 0, 0, -123, -123, -123, -123, -123, -123, 0, 0, -123, -123, -123, 0, -123, -123, -123, -123, -123, -123, -123, -123, 0, 0, 0, -123, 0, 0, 0, -123, -123, -123, -123, 0, -123, -123, -123,
    +        // State 549
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 550
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 551
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 552
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 553
    +        0, 0, 0, 0, 0, -282, 0, -282, 0, 0, 0, -282, 0, 0, -282, 0, 0, 0, -282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -282, 0, -282, -282, -282, -282, -282, 0, 0, 0, 0, 0, -282, -282, -282, -282, -282, -282, 0, 0, 0, 0, -282, -282, -282, -282, -282, -282, 0, 0, -282, -282, -282, 0, -282, -282, -282, -282, -282, -282, -282, -282, 0, 0, 0, -282, 0, 0, 0, -282, -282, -282, -282, 0, -282, -282, -282,
    +        // State 554
    +        0, 0, 0, 0, 0, -124, 0, -124, 0, 0, 0, -124, 0, 0, -124, 0, 0, 0, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, 0, -124, -124, -124, -124, -124, 0, 0, 0, 0, 0, -124, -124, -124, -124, -124, -124, -124, -124, 0, 0, -124, -124, -124, -124, -124, -124, 0, 0, -124, -124, -124, 0, -124, -124, -124, -124, -124, -124, -124, -124, 0, 0, 0, -124, 0, 0, 0, -124, -124, -124, -124, 0, -124, -124, -124,
    +        // State 555
    +        0, 0, 0, 0, 0, 22, 0, 74, 0, 0, 0, 23, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 309, 0, 0, 0, 0, 0, 77, 78, 0, 80, 0, 82, 0, 0, 0, 0, 0, 84, 84, 85, 0, 87, 0, 0, 88, 89, 90, 0, 91, 92, 93, 0, 0, 0, 97, 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, 0, 34, 0, 35, 36, 37,
    +        // State 556
    +        0, 0, 0, 0, 0, -463, 0, -463, 0, 0, 0, -463, 0, 0, -463, 0, 0, 0, -463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -463, 0, -463, -463, -463, -463, -463, 0, 0, 0, 0, 0, -463, -463, -463, -463, -463, -463, 0, 0, 0, 0, -463, -463, -463, -463, -463, -463, 0, 0, -463, -463, -463, 0, -463, -463, -463, -463, -463, -463, -463, -463, 0, 0, 0, -463, 0, 0, 0, -463, -463, -463, -463, 0, -463, -463, -463,
    +        // State 557
    +        0, 0, 0, 0, 0, -248, 0, -248, 0, 0, 0, -248, 0, 0, -248, 0, 0, 0, -248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -248, 0, -248, -248, -248, -248, -248, 0, 0, 0, 0, 0, -248, -248, -248, -248, -248, -248, 0, -248, -248, -248, -248, -248, -248, -248, -248, -248, 0, 0, -248, -248, -248, 0, -248, -248, -248, -248, -248, -248, -248, -248, 0, 0, 0, -248, 0, 0, 0, -248, -248, -248, -248, 0, -248, -248, -248,
    +        // State 558
    +        0, 0, 0, 0, 0, -283, 0, -283, 0, 0, 0, -283, 0, 0, -283, 0, 0, 0, -283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -283, 0, -283, -283, -283, -283, -283, 0, 0, 0, 0, 0, -283, -283, -283, -283, -283, -283, 0, 0, 0, 0, -283, -283, -283, -283, -283, -283, 0, 0, -283, -283, -283, 0, -283, -283, -283, -283, -283, -283, -283, -283, 0, 0, 0, -283, 0, 0, 0, -283, -283, -283, -283, 0, -283, -283, -283,
    +        // State 559
    +        0, 0, 0, 0, 0, -464, 0, -464, 0, 0, 0, -464, 0, 0, -464, 0, 0, 0, -464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -464, 0, -464, -464, -464, -464, -464, 0, 0, 0, 0, 0, -464, -464, -464, -464, -464, -464, 0, 0, 0, 0, -464, -464, -464, -464, -464, -464, 0, 0, -464, -464, -464, 0, -464, -464, -464, -464, -464, -464, -464, -464, 0, 0, 0, -464, 0, 0, 0, -464, -464, -464, -464, 0, -464, -464, -464,
         ];
         const __EOF_ACTION: &'static [i16] = &[
             // State 0
             0,
             // State 1
    -        -461,
    +        -516,
             // State 2
             0,
             // State 3
    -        -342,
    +        -375,
             // State 4
             0,
             // State 5
    -        -456,
    +        -511,
             // State 6
    -        -348,
    +        -381,
             // State 7
    -        -148,
    +        -171,
             // State 8
    -        -341,
    +        -374,
             // State 9
    -        -127,
    +        -149,
             // State 10
    -        -425,
    +        -462,
             // State 11
    -        -387,
    +        -424,
             // State 12
    -        -129,
    +        -151,
             // State 13
    -        -128,
    +        -150,
             // State 14
    -        -245,
    +        -268,
             // State 15
    -        -111,
    +        -133,
             // State 16
    -        -126,
    +        -148,
             // State 17
    -        -116,
    +        -138,
             // State 18
    -        -231,
    +        -254,
             // State 19
    -        -165,
    +        -188,
             // State 20
    -        -374,
    +        -407,
             // State 21
             0,
             // State 22
    @@ -25332,41 +28322,41 @@
             // State 23
             0,
             // State 24
    -        -146,
    +        -170,
             // State 25
    -        -147,
    +        -168,
             // State 26
    -        -145,
    +        -169,
             // State 27
    -        0,
    +        -167,
             // State 28
             0,
             // State 29
             0,
             // State 30
    -        -462,
    +        0,
             // State 31
    -        -314,
    +        -517,
             // State 32
    -        -313,
    +        -339,
             // State 33
    -        -312,
    +        -338,
             // State 34
    -        -274,
    +        -337,
             // State 35
    -        -464,
    +        -299,
             // State 36
    -        0,
    +        -519,
             // State 37
             0,
             // State 38
    -        -207,
    -        // State 39
             0,
    +        // State 39
    +        -230,
             // State 40
    -        -371,
    -        // State 41
             0,
    +        // State 41
    +        -404,
             // State 42
             0,
             // State 43
    @@ -25376,21 +28366,21 @@
             // State 45
             0,
             // State 46
    -        -250,
    +        0,
             // State 47
    -        -343,
    +        -273,
             // State 48
    -        0,
    +        -376,
             // State 49
    -        -203,
    +        0,
             // State 50
    -        -206,
    +        -226,
             // State 51
    -        0,
    +        -229,
             // State 52
    -        -201,
    -        // State 53
             0,
    +        // State 53
    +        -224,
             // State 54
             0,
             // State 55
    @@ -25402,39 +28392,39 @@
             // State 58
             0,
             // State 59
    -        -423,
    -        // State 60
             0,
    +        // State 60
    +        -460,
             // State 61
    -        -370,
    -        // State 62
             0,
    +        // State 62
    +        -403,
             // State 63
             0,
             // State 64
    -        -246,
    -        // State 65
             0,
    +        // State 65
    +        -269,
             // State 66
             0,
             // State 67
             0,
             // State 68
    -        -204,
    +        0,
             // State 69
    -        -202,
    +        -227,
             // State 70
    -        -205,
    +        -225,
             // State 71
    -        0,
    +        -228,
             // State 72
             0,
             // State 73
             0,
             // State 74
    -        -247,
    -        // State 75
             0,
    +        // State 75
    +        -270,
             // State 76
             0,
             // State 77
    @@ -25476,9 +28466,9 @@
             // State 95
             0,
             // State 96
    -        -424,
    -        // State 97
             0,
    +        // State 97
    +        -461,
             // State 98
             0,
             // State 99
    @@ -25516,29 +28506,29 @@
             // State 115
             0,
             // State 116
    -        -463,
    +        0,
             // State 117
    -        -465,
    +        -518,
             // State 118
    -        0,
    +        -520,
             // State 119
    -        -138,
    -        // State 120
             0,
    +        // State 120
    +        -160,
             // State 121
    -        -242,
    +        0,
             // State 122
    -        -243,
    +        -265,
             // State 123
    -        0,
    +        -266,
             // State 124
             0,
             // State 125
             0,
             // State 126
    -        -131,
    -        // State 127
             0,
    +        // State 127
    +        -153,
             // State 128
             0,
             // State 129
    @@ -25550,11 +28540,11 @@
             // State 132
             0,
             // State 133
    -        -141,
    +        0,
             // State 134
    -        -244,
    +        -163,
             // State 135
    -        0,
    +        -267,
             // State 136
             0,
             // State 137
    @@ -25582,17 +28572,17 @@
             // State 148
             0,
             // State 149
    -        -251,
    -        // State 150
             0,
    +        // State 150
    +        -274,
             // State 151
             0,
             // State 152
    -        -352,
    +        0,
             // State 153
    -        -351,
    +        -385,
             // State 154
    -        0,
    +        -384,
             // State 155
             0,
             // State 156
    @@ -25708,11 +28698,11 @@
             // State 211
             0,
             // State 212
    -        -110,
    +        0,
             // State 213
    -        -115,
    +        -132,
             // State 214
    -        0,
    +        -137,
             // State 215
             0,
             // State 216
    @@ -25728,47 +28718,47 @@
             // State 221
             0,
             // State 222
    -        -340,
    +        0,
             // State 223
    -        -151,
    +        -373,
             // State 224
    -        0,
    +        -174,
             // State 225
             0,
             // State 226
             0,
             // State 227
    -        -230,
    +        0,
             // State 228
    -        -347,
    +        0,
             // State 229
    -        -386,
    +        -253,
             // State 230
    -        -455,
    +        -380,
             // State 231
    -        0,
    +        -423,
             // State 232
    -        0,
    +        -510,
             // State 233
             0,
             // State 234
             0,
             // State 235
    -        -136,
    +        0,
             // State 236
             0,
             // State 237
    -        0,
    +        -158,
             // State 238
    -        -135,
    +        0,
             // State 239
    -        -130,
    +        0,
             // State 240
    -        -132,
    +        -157,
             // State 241
    -        0,
    +        -152,
             // State 242
    -        0,
    +        -154,
             // State 243
             0,
             // State 244
    @@ -25786,17 +28776,17 @@
             // State 250
             0,
             // State 251
    -        -140,
    +        0,
             // State 252
    -        -142,
    +        0,
             // State 253
    -        -143,
    +        -162,
             // State 254
    -        -144,
    +        -164,
             // State 255
    -        0,
    +        -165,
             // State 256
    -        0,
    +        -166,
             // State 257
             0,
             // State 258
    @@ -25892,13 +28882,13 @@
             // State 303
             0,
             // State 304
    -        -384,
    +        0,
             // State 305
    -        -432,
    -        // State 306
             0,
    +        // State 306
    +        -421,
             // State 307
    -        0,
    +        -469,
             // State 308
             0,
             // State 309
    @@ -25914,11 +28904,11 @@
             // State 314
             0,
             // State 315
    -        -149,
    +        0,
             // State 316
             0,
             // State 317
    -        0,
    +        -172,
             // State 318
             0,
             // State 319
    @@ -25926,7 +28916,7 @@
             // State 320
             0,
             // State 321
    -        -150,
    +        0,
             // State 322
             0,
             // State 323
    @@ -25934,27 +28924,27 @@
             // State 324
             0,
             // State 325
    -        0,
    +        -173,
             // State 326
    -        -137,
    +        0,
             // State 327
             0,
             // State 328
    -        -139,
    +        0,
             // State 329
             0,
             // State 330
    -        0,
    +        -159,
             // State 331
    -        -133,
    -        // State 332
             0,
    +        // State 332
    +        -161,
             // State 333
             0,
             // State 334
             0,
             // State 335
    -        0,
    +        -155,
             // State 336
             0,
             // State 337
    @@ -25984,7 +28974,7 @@
             // State 349
             0,
             // State 350
    -        -168,
    +        0,
             // State 351
             0,
             // State 352
    @@ -25992,7 +28982,7 @@
             // State 353
             0,
             // State 354
    -        0,
    +        -191,
             // State 355
             0,
             // State 356
    @@ -26018,7 +29008,7 @@
             // State 366
             0,
             // State 367
    -        -279,
    +        0,
             // State 368
             0,
             // State 369
    @@ -26042,7 +29032,7 @@
             // State 378
             0,
             // State 379
    -        0,
    +        -302,
             // State 380
             0,
             // State 381
    @@ -26050,9 +29040,9 @@
             // State 382
             0,
             // State 383
    -        -228,
    +        0,
             // State 384
    -        -433,
    +        0,
             // State 385
             0,
             // State 386
    @@ -26062,7 +29052,7 @@
             // State 388
             0,
             // State 389
    -        -450,
    +        0,
             // State 390
             0,
             // State 391
    @@ -26072,11 +29062,11 @@
             // State 393
             0,
             // State 394
    -        -453,
    -        // State 395
             0,
    +        // State 395
    +        -251,
             // State 396
    -        0,
    +        -470,
             // State 397
             0,
             // State 398
    @@ -26086,9 +29076,9 @@
             // State 400
             0,
             // State 401
    -        0,
    +        -505,
             // State 402
    -        -134,
    +        0,
             // State 403
             0,
             // State 404
    @@ -26096,7 +29086,7 @@
             // State 405
             0,
             // State 406
    -        -169,
    +        -508,
             // State 407
             0,
             // State 408
    @@ -26106,7 +29096,7 @@
             // State 410
             0,
             // State 411
    -        -263,
    +        0,
             // State 412
             0,
             // State 413
    @@ -26116,7 +29106,7 @@
             // State 415
             0,
             // State 416
    -        0,
    +        -156,
             // State 417
             0,
             // State 418
    @@ -26124,11 +29114,11 @@
             // State 419
             0,
             // State 420
    -        0,
    +        -192,
             // State 421
             0,
             // State 422
    -        -280,
    +        0,
             // State 423
             0,
             // State 424
    @@ -26138,7 +29128,7 @@
             // State 426
             0,
             // State 427
    -        0,
    +        -288,
             // State 428
             0,
             // State 429
    @@ -26150,7 +29140,7 @@
             // State 432
             0,
             // State 433
    -        -229,
    +        0,
             // State 434
             0,
             // State 435
    @@ -26172,15 +29162,15 @@
             // State 443
             0,
             // State 444
    -        -454,
    +        0,
             // State 445
             0,
             // State 446
    -        0,
    +        -303,
             // State 447
             0,
             // State 448
    -        -264,
    +        0,
             // State 449
             0,
             // State 450
    @@ -26188,7 +29178,7 @@
             // State 451
             0,
             // State 452
    -        -261,
    +        0,
             // State 453
             0,
             // State 454
    @@ -26198,7 +29188,7 @@
             // State 456
             0,
             // State 457
    -        0,
    +        -252,
             // State 458
             0,
             // State 459
    @@ -26214,33 +29204,33 @@
             // State 464
             0,
             // State 465
    -        -428,
    +        0,
             // State 466
             0,
             // State 467
             0,
             // State 468
    -        -224,
    +        -509,
             // State 469
    -        -430,
    +        0,
             // State 470
             0,
             // State 471
    -        -385,
    +        0,
             // State 472
             0,
             // State 473
             0,
             // State 474
    -        0,
    +        -289,
             // State 475
             0,
             // State 476
             0,
             // State 477
    -        -166,
    +        0,
             // State 478
    -        -262,
    +        0,
             // State 479
             0,
             // State 480
    @@ -26254,19 +29244,19 @@
             // State 484
             0,
             // State 485
    -        -277,
    +        0,
             // State 486
    -        -429,
    +        0,
             // State 487
    -        -431,
    +        0,
             // State 488
             0,
             // State 489
    -        -223,
    +        -284,
             // State 490
             0,
             // State 491
    -        -449,
    +        0,
             // State 492
             0,
             // State 493
    @@ -26274,7 +29264,7 @@
             // State 494
             0,
             // State 495
    -        -167,
    +        0,
             // State 496
             0,
             // State 497
    @@ -26284,1059 +29274,1247 @@
             // State 499
             0,
             // State 500
    -        -278,
    +        0,
             // State 501
    -        -101,
    -        // State 502
             0,
    +        // State 502
    +        -465,
             // State 503
             0,
             // State 504
             0,
             // State 505
    -        0,
    +        -247,
             // State 506
    -        -259,
    +        -467,
             // State 507
    -        -102,
    -        // State 508
             0,
    +        // State 508
    +        -422,
             // State 509
    -        -426,
    +        0,
             // State 510
    -        -225,
    +        0,
             // State 511
    -        -260,
    +        0,
             // State 512
    -        -427,
    +        0,
    +        // State 513
    +        0,
    +        // State 514
    +        0,
    +        // State 515
    +        -189,
    +        // State 516
    +        -286,
    +        // State 517
    +        0,
    +        // State 518
    +        0,
    +        // State 519
    +        0,
    +        // State 520
    +        0,
    +        // State 521
    +        0,
    +        // State 522
    +        0,
    +        // State 523
    +        -285,
    +        // State 524
    +        0,
    +        // State 525
    +        0,
    +        // State 526
    +        0,
    +        // State 527
    +        0,
    +        // State 528
    +        0,
    +        // State 529
    +        0,
    +        // State 530
    +        -300,
    +        // State 531
    +        -466,
    +        // State 532
    +        -468,
    +        // State 533
    +        0,
    +        // State 534
    +        -246,
    +        // State 535
    +        0,
    +        // State 536
    +        -504,
    +        // State 537
    +        0,
    +        // State 538
    +        0,
    +        // State 539
    +        0,
    +        // State 540
    +        -190,
    +        // State 541
    +        -287,
    +        // State 542
    +        0,
    +        // State 543
    +        0,
    +        // State 544
    +        0,
    +        // State 545
    +        0,
    +        // State 546
    +        0,
    +        // State 547
    +        -301,
    +        // State 548
    +        -123,
    +        // State 549
    +        0,
    +        // State 550
    +        0,
    +        // State 551
    +        0,
    +        // State 552
    +        0,
    +        // State 553
    +        -282,
    +        // State 554
    +        -124,
    +        // State 555
    +        0,
    +        // State 556
    +        -463,
    +        // State 557
    +        -248,
    +        // State 558
    +        -283,
    +        // State 559
    +        -464,
         ];
         const __GOTO: &'static [i16] = &[
             // State 0
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 1
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 2
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 3
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 39, 0, 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, 42, 0, 43, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 47, 0, 48, 49, 50, 51, 0, 0, 52, 13, 0, 53, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 60, 61, 16, 0, 62, 0, 0, 0, 0, 63, 64, 65, 0, 17, 0, 0, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 69, 0, 0, 0, 0, 0, 70, 0, 71, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 43, 0, 44, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 48, 0, 49, 50, 51, 52, 0, 0, 53, 13, 54, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 61, 62, 16, 0, 63, 0, 0, 0, 0, 64, 65, 66, 0, 17, 0, 0, 0, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 72, 19, 73, 0, 20, 21,
             // State 4
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 39, 0, 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, 42, 0, 43, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 50, 51, 0, 0, 52, 13, 0, 53, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 62, 0, 0, 0, 0, 63, 64, 97, 0, 17, 0, 0, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 69, 0, 0, 0, 0, 0, 70, 0, 71, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 43, 0, 44, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 51, 52, 0, 0, 53, 13, 54, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 63, 0, 0, 0, 0, 64, 65, 98, 0, 17, 0, 0, 0, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 72, 19, 73, 0, 20, 21,
             // State 5
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 6
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 7
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 8
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 9
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 10
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 11
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 12
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 13
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 14
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 15
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 16
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 17
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 18
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 19
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 20
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 21
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 22
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
             // State 23
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
             // State 24
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 25
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 26
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 27
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 17, 0, 0, 18, 66, 0, 0, 0, 0, 0, 0, 124, 125, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 28
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 129, 0, 130, 0, 131, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 17, 0, 0, 0, 18, 67, 0, 0, 0, 0, 0, 0, 125, 126, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 29
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 130, 0, 131, 0, 132, 0, 0, 0, 0, 0, 0, 0, 133, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 30
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
             // State 31
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 32
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 33
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 34
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 35
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 36
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 37
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 38
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 39
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 40
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 41
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 42
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 43
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 44
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 45
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 46
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 47
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 39, 0, 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, 42, 0, 43, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 150, 0, 0, 49, 50, 51, 0, 0, 52, 13, 0, 53, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 62, 0, 0, 0, 0, 63, 64, 65, 0, 17, 0, 0, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 69, 0, 0, 0, 0, 0, 70, 0, 71, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 48
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 43, 0, 44, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 151, 0, 0, 50, 51, 52, 0, 0, 53, 13, 54, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 63, 0, 0, 0, 0, 64, 65, 66, 0, 17, 0, 0, 0, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 72, 19, 73, 0, 20, 21,
             // State 49
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 50
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 51
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 52
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 53
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 54
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 55
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 56
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 57
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 58
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 59
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 60
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 61
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 62
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 63
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 64
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 65
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 66
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 67
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157, 0, 158, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 68
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, 0, 159, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 69
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 70
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 71
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 72
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 73
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 74
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 75
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 76
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 77
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 78
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 79
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 80
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, 181, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 81
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 182, 183, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 0, 182, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 82
    -        0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 183, 184, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 83
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 84
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 85
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 86
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 198, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 87
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 199, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 88
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 89
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 205, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 90
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 91
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 92
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 93
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 94
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 95
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211, 0, 19, 0, 0, 20, 21,
             // State 96
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 97
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 98
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
             // State 99
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
             // State 100
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 101
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 216, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 217, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 218, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 102
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 217, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 218, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 219, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 103
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
             // State 104
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 225, 0, 18, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 105
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 226, 227, 0, 18, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 106
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 20, 21,
             // State 107
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
             // State 108
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 109
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 110
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
             // State 111
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 112
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 113
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 114
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 115
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 116
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21,
             // State 117
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 118
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 119
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 120
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 121
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 122
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 123
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 124
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 125
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 126
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 127
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 128
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 129
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 130
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 131
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 132
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 133
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 134
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 135
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 136
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 137
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 138
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 139
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 140
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 141
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 142
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 143
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 144
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 145
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 146
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 147
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 148
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 149
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 150
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 14, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 151
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 263, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 14, 0, 0, 0, 0, 0, 264, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 152
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 265, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 153
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 154
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 155
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 17, 0, 0, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 156
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 17, 0, 0, 0, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 157
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 158
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 159
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 160
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 161
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 162
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 163
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 164
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 165
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 166
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 167
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 168
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 269, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 169
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 271, 0, 20, 21,
             // State 170
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 171
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 172
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 173
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 174
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 175
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 176
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 177
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 178
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 179
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 180
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 181
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 182
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 183
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 184
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 185
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 186
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 187
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 188
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 189
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 190
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 191
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 192
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 193
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 194
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 195
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 196
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 197
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 198
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 199
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 200
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 201
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 202
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 203
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 204
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 205
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 206
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 306, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 207
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 308, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 208
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 209
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 210
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 211
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 212
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 213
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 214
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 315, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 215
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 317, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 216
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 217
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 218
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 219
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 220
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 221
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 222
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 223
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 224
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 225
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 226
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 324, 0, 0, 0, 0, 0, 17, 0, 0, 18, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 227
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 228
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 229
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 230
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 231
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 232
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 233
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 234
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 235
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 236
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 237
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 333, 183, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 238
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 239
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 337, 184, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 240
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 241
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 242
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 243
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 17, 0, 0, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 244
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 245
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 17, 0, 0, 0, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 246
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 336, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 247
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 248
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 249
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 250
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 251
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 252
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 253
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 254
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 255
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 256
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 257
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 258
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 259
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 260
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 261
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 262
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 263
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 17, 0, 0, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 264
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 265
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 17, 0, 0, 0, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 266
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 267
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 268
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 269
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 347, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 217, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 218, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 270
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 271
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 351, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 218, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 219, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 272
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 273
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 350, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 217, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 218, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 274
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 351, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 275
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 354, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 218, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 219, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 276
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 353, 0, 198, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 355, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 277
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 278
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 361, 0, 0, 362, 0, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 279
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 280
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 281
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 282
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360, 0, 0, 361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 283
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 284
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 285
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 286
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 287
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 368, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 288
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 289
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 380, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 290
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 291
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 292
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 293
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 294
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 295
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 296
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 297
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 298
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 299
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 300
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 301
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 302
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 303
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 304
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 305
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 306
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 307
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 390, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 308
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 309
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 402, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 310
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 311
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 395, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 312
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 406, 0, 19, 0, 0, 20, 21,
             // State 313
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 407, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 314
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 315
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 316
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 317
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 318
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 319
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 320
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 321
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 322
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 398, 0, 0, 0, 0, 0, 17, 0, 0, 18, 399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 323
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 324
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 411, 0, 0, 18, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 325
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 326
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 327
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 328
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 329
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 330
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 331
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 332
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 333
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 17, 0, 0, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 334
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 405, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 335
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 336
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 17, 0, 0, 0, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 338
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 339
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 406, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 217, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 218, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 340
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 407, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 341
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 342
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 343
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 420, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 218, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 219, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 344
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 421, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 345
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 347
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 348
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 349
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 350
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 351
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 412, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 352
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 353
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 354
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 355
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 356
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 428, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 357
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 358
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 359
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 360
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 361
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 362
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 363
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 364
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 365
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 366
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 438, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 367
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 368
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 369
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 370
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 371
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 372
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 373
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 430, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 374
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 375
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 376
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 377
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 430, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 378
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 379
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 380
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 381
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 382
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 383
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 384
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 454, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 385
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 386
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 387
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 388
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 39, 0, 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, 42, 0, 43, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 50, 51, 0, 0, 52, 13, 0, 53, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 62, 0, 0, 0, 0, 63, 64, 441, 442, 17, 0, 0, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 69, 0, 0, 0, 0, 0, 70, 0, 71, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 389
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 454, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 390
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 391
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 392
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 445, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 393
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 394
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 395
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 397
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 398
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 399
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 43, 0, 44, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 51, 52, 0, 0, 53, 13, 54, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 63, 0, 0, 0, 0, 64, 65, 465, 466, 17, 0, 0, 0, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 72, 19, 73, 0, 20, 21,
             // State 401
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 402
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 403
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 14, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 0, 19, 0, 0, 20, 21,
             // State 404
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 469, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 405
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 406
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 407
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 449, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 408
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 409
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 470, 0, 0, 18, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 410
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 411
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 412
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 413
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 414
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 415
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 453, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 416
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 417
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 14, 0, 0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 418
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 419
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 420
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 421
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 422
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 475, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 423
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 424
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 425
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 426
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 427
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 428
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 429
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 430
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 431
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 430, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 432
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 433
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 434
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 435
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 436
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 466, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 437
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 438
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 469, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 439
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 470, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 490, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 440
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 441
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 39, 0, 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, 42, 0, 43, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 50, 51, 0, 0, 52, 13, 0, 53, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 62, 0, 0, 0, 0, 63, 64, 471, 0, 17, 0, 0, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 69, 0, 0, 0, 0, 0, 70, 0, 71, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 443
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 444
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 445
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 446
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, 0, 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 447
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 448
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 449
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 450
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 478, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 451
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 479, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 452
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 453
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 454
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 455
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 454, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 456
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 458
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 459
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 460
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 486, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 503, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 461
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 462
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 506, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 463
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 487, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 507, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 464
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 488, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 465
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 43, 0, 44, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 51, 52, 0, 0, 53, 13, 54, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 63, 0, 0, 0, 0, 64, 65, 508, 0, 17, 0, 0, 0, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 72, 19, 73, 0, 20, 21,
             // State 466
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 490, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 467
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 468
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 469
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 470
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 471
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 511, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 472
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 492, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 473
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 474
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 475
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 494, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 14, 0, 0, 0, 0, 0, 495, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 476
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 496, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 516, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 477
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 517, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 478
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 479
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 480
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 481
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 482
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 483
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 501, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 484
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 502, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 485
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 486
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 487
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 488
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 524, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 489
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 491
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 492
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 493
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 494
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
             // State 495
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 496
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 497
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 507, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 531, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 498
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 499
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 508, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 500
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 532, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 501
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 533, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 502
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 503
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 510, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 535, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 504
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 511, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 505
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 512, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 506
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 507
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 508
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37, 0, 7, 38, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, 0, 0, 46, 12, 0, 0, 0, 49, 0, 0, 0, 0, 52, 13, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, 0, 56, 57, 14, 0, 0, 0, 0, 0, 58, 0, 0, 59, 0, 15, 0, 61, 16, 0, 305, 0, 0, 0, 0, 63, 64, 0, 0, 17, 0, 513, 18, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 72, 0, 20, 21,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 537, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
             // State 510
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 511
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             // State 512
    -        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 0, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 539, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 14, 0, 0, 0, 0, 0, 540, 0, 0, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 21,
    +        // State 513
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 541, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
    +        // State 514
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 542, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
    +        // State 515
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 516
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 517
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 518
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 519
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 521
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 522
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 523
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 524
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 525
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 526
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 527
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 528
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 548, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
    +        // State 529
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 549, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
    +        // State 530
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 531
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 532
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 533
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 534
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 535
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 536
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 537
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 538
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 539
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 540
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 541
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 542
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 543
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 544
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 554, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
    +        // State 545
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 546
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 555, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
    +        // State 547
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 548
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 549
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 550
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 557, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
    +        // State 551
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 558, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
    +        // State 552
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 559, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
    +        // State 553
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 554
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 555
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 0, 7, 39, 0, 0, 0, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 12, 0, 0, 0, 50, 0, 0, 0, 0, 53, 13, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 57, 58, 14, 0, 0, 0, 0, 0, 59, 0, 0, 0, 60, 0, 15, 0, 62, 16, 0, 307, 0, 0, 0, 0, 64, 65, 0, 0, 17, 0, 0, 560, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 0, 20, 21,
    +        // State 556
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 557
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 558
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +        // State 559
    +        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         ];
         fn __expected_tokens(__state: usize) -> Vec<::std::string::String> {
             const __TERMINAL: &'static [&'static str] = &[
    @@ -27356,7 +30534,9 @@
                 r###"",""###,
                 r###""-""###,
                 r###""-=""###,
    +            r###""->""###,
                 r###"".""###,
    +            r###""...""###,
                 r###""/""###,
                 r###""//""###,
                 r###""//=""###,
    @@ -27431,7 +30611,7 @@
                 r###"name"###,
                 r###"string"###,
             ];
    -        __ACTION[(__state * 90)..].iter().zip(__TERMINAL).filter_map(|(&state, terminal)| {
    +        __ACTION[(__state * 92)..].iter().zip(__TERMINAL).filter_map(|(&state, terminal)| {
                 if state == 0 {
                     None
                 } else {
    @@ -27490,80 +30670,82 @@
                         lexer::Tok::Comma if true => 13,
                         lexer::Tok::Minus if true => 14,
                         lexer::Tok::MinusEqual if true => 15,
    -                    lexer::Tok::Dot if true => 16,
    -                    lexer::Tok::Slash if true => 17,
    -                    lexer::Tok::DoubleSlash if true => 18,
    -                    lexer::Tok::DoubleSlashEqual if true => 19,
    -                    lexer::Tok::SlashEqual if true => 20,
    -                    lexer::Tok::Colon if true => 21,
    -                    lexer::Tok::Semi if true => 22,
    -                    lexer::Tok::Less if true => 23,
    -                    lexer::Tok::LeftShift if true => 24,
    -                    lexer::Tok::LeftShiftEqual if true => 25,
    -                    lexer::Tok::LessEqual if true => 26,
    -                    lexer::Tok::Equal if true => 27,
    -                    lexer::Tok::EqEqual if true => 28,
    -                    lexer::Tok::Greater if true => 29,
    -                    lexer::Tok::GreaterEqual if true => 30,
    -                    lexer::Tok::RightShift if true => 31,
    -                    lexer::Tok::RightShiftEqual if true => 32,
    -                    lexer::Tok::At if true => 33,
    -                    lexer::Tok::AtEqual if true => 34,
    -                    lexer::Tok::False if true => 35,
    -                    lexer::Tok::None if true => 36,
    -                    lexer::Tok::True if true => 37,
    -                    lexer::Tok::Lsqb if true => 38,
    -                    lexer::Tok::Newline if true => 39,
    -                    lexer::Tok::Rsqb if true => 40,
    -                    lexer::Tok::CircumFlex if true => 41,
    -                    lexer::Tok::CircumflexEqual if true => 42,
    -                    lexer::Tok::And if true => 43,
    -                    lexer::Tok::As if true => 44,
    -                    lexer::Tok::Assert if true => 45,
    -                    lexer::Tok::Break if true => 46,
    -                    lexer::Tok::Class if true => 47,
    -                    lexer::Tok::Continue if true => 48,
    -                    lexer::Tok::Def if true => 49,
    -                    lexer::Tok::Del if true => 50,
    -                    lexer::Tok::Elif if true => 51,
    -                    lexer::Tok::Else if true => 52,
    -                    lexer::Tok::Except if true => 53,
    -                    lexer::Tok::Finally if true => 54,
    -                    lexer::Tok::For if true => 55,
    -                    lexer::Tok::From if true => 56,
    -                    lexer::Tok::From if true => 57,
    -                    lexer::Tok::Global if true => 58,
    -                    lexer::Tok::If if true => 59,
    -                    lexer::Tok::Import if true => 60,
    -                    lexer::Tok::In if true => 61,
    -                    lexer::Tok::Is if true => 62,
    -                    lexer::Tok::Lambda if true => 63,
    -                    lexer::Tok::Nonlocal if true => 64,
    -                    lexer::Tok::Not if true => 65,
    -                    lexer::Tok::Or if true => 66,
    -                    lexer::Tok::Pass if true => 67,
    -                    lexer::Tok::Raise if true => 68,
    -                    lexer::Tok::Return if true => 69,
    -                    lexer::Tok::Try if true => 70,
    -                    lexer::Tok::While if true => 71,
    -                    lexer::Tok::With if true => 72,
    -                    lexer::Tok::Yield if true => 73,
    -                    lexer::Tok::Lbrace if true => 74,
    -                    lexer::Tok::Vbar if true => 75,
    -                    lexer::Tok::VbarEqual if true => 76,
    -                    lexer::Tok::Rbrace if true => 77,
    -                    lexer::Tok::Tilde if true => 78,
    -                    lexer::Tok::StartExpression if true => 79,
    -                    lexer::Tok::StartProgram if true => 80,
    -                    lexer::Tok::StartStatement if true => 81,
    -                    lexer::Tok::Bytes { value: _ } if true => 82,
    -                    lexer::Tok::Complex { real: _, imag: _ } if true => 83,
    -                    lexer::Tok::Dedent if true => 84,
    -                    lexer::Tok::Float { value: _ } if true => 85,
    -                    lexer::Tok::Indent if true => 86,
    -                    lexer::Tok::Int { value: _ } if true => 87,
    -                    lexer::Tok::Name { name: _ } if true => 88,
    -                    lexer::Tok::String { value: _, is_fstring: _ } if true => 89,
    +                    lexer::Tok::Rarrow if true => 16,
    +                    lexer::Tok::Dot if true => 17,
    +                    lexer::Tok::Ellipsis if true => 18,
    +                    lexer::Tok::Slash if true => 19,
    +                    lexer::Tok::DoubleSlash if true => 20,
    +                    lexer::Tok::DoubleSlashEqual if true => 21,
    +                    lexer::Tok::SlashEqual if true => 22,
    +                    lexer::Tok::Colon if true => 23,
    +                    lexer::Tok::Semi if true => 24,
    +                    lexer::Tok::Less if true => 25,
    +                    lexer::Tok::LeftShift if true => 26,
    +                    lexer::Tok::LeftShiftEqual if true => 27,
    +                    lexer::Tok::LessEqual if true => 28,
    +                    lexer::Tok::Equal if true => 29,
    +                    lexer::Tok::EqEqual if true => 30,
    +                    lexer::Tok::Greater if true => 31,
    +                    lexer::Tok::GreaterEqual if true => 32,
    +                    lexer::Tok::RightShift if true => 33,
    +                    lexer::Tok::RightShiftEqual if true => 34,
    +                    lexer::Tok::At if true => 35,
    +                    lexer::Tok::AtEqual if true => 36,
    +                    lexer::Tok::False if true => 37,
    +                    lexer::Tok::None if true => 38,
    +                    lexer::Tok::True if true => 39,
    +                    lexer::Tok::Lsqb if true => 40,
    +                    lexer::Tok::Newline if true => 41,
    +                    lexer::Tok::Rsqb if true => 42,
    +                    lexer::Tok::CircumFlex if true => 43,
    +                    lexer::Tok::CircumflexEqual if true => 44,
    +                    lexer::Tok::And if true => 45,
    +                    lexer::Tok::As if true => 46,
    +                    lexer::Tok::Assert if true => 47,
    +                    lexer::Tok::Break if true => 48,
    +                    lexer::Tok::Class if true => 49,
    +                    lexer::Tok::Continue if true => 50,
    +                    lexer::Tok::Def if true => 51,
    +                    lexer::Tok::Del if true => 52,
    +                    lexer::Tok::Elif if true => 53,
    +                    lexer::Tok::Else if true => 54,
    +                    lexer::Tok::Except if true => 55,
    +                    lexer::Tok::Finally if true => 56,
    +                    lexer::Tok::For if true => 57,
    +                    lexer::Tok::From if true => 58,
    +                    lexer::Tok::From if true => 59,
    +                    lexer::Tok::Global if true => 60,
    +                    lexer::Tok::If if true => 61,
    +                    lexer::Tok::Import if true => 62,
    +                    lexer::Tok::In if true => 63,
    +                    lexer::Tok::Is if true => 64,
    +                    lexer::Tok::Lambda if true => 65,
    +                    lexer::Tok::Nonlocal if true => 66,
    +                    lexer::Tok::Not if true => 67,
    +                    lexer::Tok::Or if true => 68,
    +                    lexer::Tok::Pass if true => 69,
    +                    lexer::Tok::Raise if true => 70,
    +                    lexer::Tok::Return if true => 71,
    +                    lexer::Tok::Try if true => 72,
    +                    lexer::Tok::While if true => 73,
    +                    lexer::Tok::With if true => 74,
    +                    lexer::Tok::Yield if true => 75,
    +                    lexer::Tok::Lbrace if true => 76,
    +                    lexer::Tok::Vbar if true => 77,
    +                    lexer::Tok::VbarEqual if true => 78,
    +                    lexer::Tok::Rbrace if true => 79,
    +                    lexer::Tok::Tilde if true => 80,
    +                    lexer::Tok::StartExpression if true => 81,
    +                    lexer::Tok::StartProgram if true => 82,
    +                    lexer::Tok::StartStatement if true => 83,
    +                    lexer::Tok::Bytes { value: _ } if true => 84,
    +                    lexer::Tok::Complex { real: _, imag: _ } if true => 85,
    +                    lexer::Tok::Dedent if true => 86,
    +                    lexer::Tok::Float { value: _ } if true => 87,
    +                    lexer::Tok::Indent if true => 88,
    +                    lexer::Tok::Int { value: _ } if true => 89,
    +                    lexer::Tok::Name { name: _ } if true => 90,
    +                    lexer::Tok::String { value: _, is_fstring: _ } if true => 91,
                         _ => {
                             let __state = *__states.last().unwrap() as usize;
                             let __error = __lalrpop_util::ParseError::UnrecognizedToken {
    @@ -27575,7 +30757,7 @@
                     };
                     '__inner: loop {
                         let __state = *__states.last().unwrap() as usize;
    -                    let __action = __ACTION[__state * 90 + __integer];
    +                    let __action = __ACTION[__state * 92 + __integer];
                         if __action > 0 {
                             let __symbol = match __integer {
                                 0 => match __lookahead.1 {
    @@ -27643,298 +30825,306 @@
                                     _ => unreachable!(),
                                 },
                                 16 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Dot => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Rarrow => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 17 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Slash => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Dot => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 18 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::DoubleSlash => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Ellipsis => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 19 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::DoubleSlashEqual => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Slash => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 20 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::SlashEqual => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::DoubleSlash => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 21 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Colon => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::DoubleSlashEqual => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 22 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Semi => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::SlashEqual => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 23 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Less => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Colon => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 24 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::LeftShift => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Semi => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 25 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::LeftShiftEqual => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Less => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 26 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::LessEqual => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::LeftShift => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 27 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Equal => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::LeftShiftEqual => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 28 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::EqEqual => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::LessEqual => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 29 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Greater => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Equal => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 30 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::GreaterEqual => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::EqEqual => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 31 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::RightShift => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Greater => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 32 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::RightShiftEqual => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::GreaterEqual => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 33 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::At => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::RightShift => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 34 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::AtEqual => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::RightShiftEqual => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 35 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::False => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::At => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 36 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::None => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::AtEqual => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 37 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::True => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::False => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 38 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Lsqb => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::None => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 39 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Newline => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::True => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 40 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Rsqb => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Lsqb => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 41 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::CircumFlex => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Newline => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 42 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::CircumflexEqual => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Rsqb => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 43 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::And => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::CircumFlex => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 44 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::As => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::CircumflexEqual => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 45 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Assert => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::And => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 46 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Break => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::As => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 47 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Class => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Assert => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 48 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Continue => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Break => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 49 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Def => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Class => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 50 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Del => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Continue => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 51 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Elif => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Def => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 52 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Else => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Del => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 53 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Except => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Elif => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 54 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Finally => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Else => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 55 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::For => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Except => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 56 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::From => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Finally => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 57 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::From => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::For => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 58 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Global => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::From => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 59 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::If => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::From => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 60 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Import => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Global => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 61 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::In => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::If => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 62 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Is => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Import => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 63 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Lambda => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::In => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 64 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Nonlocal => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Is => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 65 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Not => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Lambda => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 66 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Or => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Nonlocal => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 67 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Pass => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Not => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 68 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Raise => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Or => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 69 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Return => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Pass => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 70 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Try => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Raise => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 71 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::While => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Return => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 72 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::With => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Try => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 73 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Yield => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::While => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 74 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Lbrace => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::With => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 75 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Vbar => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Yield => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 76 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::VbarEqual => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Lbrace => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 77 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Rbrace => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Vbar => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 78 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Tilde => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::VbarEqual => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 79 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::StartExpression => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Rbrace => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 80 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::StartProgram => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Tilde => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 81 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::StartStatement => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::StartExpression => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 82 => match __lookahead.1 {
    -                                lexer::Tok::Bytes { value: __tok0 } => __Symbol::Variant1((__tok0)),
    +                                __tok @ lexer::Tok::StartProgram => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 83 => match __lookahead.1 {
    -                                lexer::Tok::Complex { real: __tok0, imag: __tok1 } => __Symbol::Variant2((__tok0, __tok1)),
    +                                __tok @ lexer::Tok::StartStatement => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 84 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Dedent => __Symbol::Variant0((__tok)),
    +                                lexer::Tok::Bytes { value: __tok0 } => __Symbol::Variant1((__tok0)),
                                     _ => unreachable!(),
                                 },
                                 85 => match __lookahead.1 {
    -                                lexer::Tok::Float { value: __tok0 } => __Symbol::Variant3((__tok0)),
    +                                lexer::Tok::Complex { real: __tok0, imag: __tok1 } => __Symbol::Variant2((__tok0, __tok1)),
                                     _ => unreachable!(),
                                 },
                                 86 => match __lookahead.1 {
    -                                __tok @ lexer::Tok::Indent => __Symbol::Variant0((__tok)),
    +                                __tok @ lexer::Tok::Dedent => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 87 => match __lookahead.1 {
    -                                lexer::Tok::Int { value: __tok0 } => __Symbol::Variant4((__tok0)),
    +                                lexer::Tok::Float { value: __tok0 } => __Symbol::Variant3((__tok0)),
                                     _ => unreachable!(),
                                 },
                                 88 => match __lookahead.1 {
    -                                lexer::Tok::Name { name: __tok0 } => __Symbol::Variant5((__tok0)),
    +                                __tok @ lexer::Tok::Indent => __Symbol::Variant0((__tok)),
                                     _ => unreachable!(),
                                 },
                                 89 => match __lookahead.1 {
    +                                lexer::Tok::Int { value: __tok0 } => __Symbol::Variant4((__tok0)),
    +                                _ => unreachable!(),
    +                            },
    +                            90 => match __lookahead.1 {
    +                                lexer::Tok::Name { name: __tok0 } => __Symbol::Variant5((__tok0)),
    +                                _ => unreachable!(),
    +                            },
    +                            91 => match __lookahead.1 {
                                     lexer::Tok::String { value: __tok0, is_fstring: __tok1 } => __Symbol::Variant6((__tok0, __tok1)),
                                     _ => unreachable!(),
                                 },
    @@ -29112,16 +32302,7 @@
                     __reduce373(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
                 }
                 374 => {
    -                // StringGroup = string+ => ActionFn(187);
    -                let __sym0 = __pop_Variant80(__symbols);
    -                let __start = __sym0.0.clone();
    -                let __end = __sym0.2.clone();
    -                let __nt = match super::__action187::<>(__sym0) {
    -                    Ok(v) => v,
    -                    Err(e) => return Some(Err(e)),
    -                };
    -                let __symbol = (__start, __Symbol::Variant71(__nt), __end);
    -                (1, __symbol, 152)
    +                __reduce374(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
                 }
                 375 => {
                     __reduce375(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    @@ -29220,7 +32401,16 @@
                     __reduce406(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
                 }
                 407 => {
    -                __reduce407(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +                // StringGroup = string+ => ActionFn(181);
    +                let __sym0 = __pop_Variant81(__symbols);
    +                let __start = __sym0.0.clone();
    +                let __end = __sym0.2.clone();
    +                let __nt = match super::__action181::<>(__sym0) {
    +                    Ok(v) => v,
    +                    Err(e) => return Some(Err(e)),
    +                };
    +                let __symbol = (__start, __Symbol::Variant70(__nt), __end);
    +                (1, __symbol, 167)
                 }
                 408 => {
                     __reduce408(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    @@ -29382,12 +32572,7 @@
                     __reduce460(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
                 }
                 461 => {
    -                // __Top = Top => ActionFn(0);
    -                let __sym0 = __pop_Variant75(__symbols);
    -                let __start = __sym0.0.clone();
    -                let __end = __sym0.2.clone();
    -                let __nt = super::__action0::<>(__sym0);
    -                return Some(Ok(__nt));
    +                __reduce461(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
                 }
                 462 => {
                     __reduce462(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    @@ -29401,26 +32586,186 @@
                 465 => {
                     __reduce465(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
                 }
    +            466 => {
    +                __reduce466(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            467 => {
    +                __reduce467(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            468 => {
    +                __reduce468(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            469 => {
    +                __reduce469(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            470 => {
    +                __reduce470(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            471 => {
    +                __reduce471(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            472 => {
    +                __reduce472(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            473 => {
    +                __reduce473(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            474 => {
    +                __reduce474(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            475 => {
    +                __reduce475(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            476 => {
    +                __reduce476(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            477 => {
    +                __reduce477(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            478 => {
    +                __reduce478(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            479 => {
    +                __reduce479(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            480 => {
    +                __reduce480(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            481 => {
    +                __reduce481(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            482 => {
    +                __reduce482(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            483 => {
    +                __reduce483(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            484 => {
    +                __reduce484(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            485 => {
    +                __reduce485(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            486 => {
    +                __reduce486(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            487 => {
    +                __reduce487(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            488 => {
    +                __reduce488(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            489 => {
    +                __reduce489(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            490 => {
    +                __reduce490(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            491 => {
    +                __reduce491(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            492 => {
    +                __reduce492(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            493 => {
    +                __reduce493(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            494 => {
    +                __reduce494(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            495 => {
    +                __reduce495(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            496 => {
    +                __reduce496(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            497 => {
    +                __reduce497(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            498 => {
    +                __reduce498(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            499 => {
    +                __reduce499(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            500 => {
    +                __reduce500(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            501 => {
    +                __reduce501(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            502 => {
    +                __reduce502(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            503 => {
    +                __reduce503(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            504 => {
    +                __reduce504(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            505 => {
    +                __reduce505(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            506 => {
    +                __reduce506(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            507 => {
    +                __reduce507(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            508 => {
    +                __reduce508(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            509 => {
    +                __reduce509(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            510 => {
    +                __reduce510(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            511 => {
    +                __reduce511(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            512 => {
    +                __reduce512(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            513 => {
    +                __reduce513(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            514 => {
    +                __reduce514(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            515 => {
    +                __reduce515(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            516 => {
    +                // __Top = Top => ActionFn(0);
    +                let __sym0 = __pop_Variant74(__symbols);
    +                let __start = __sym0.0.clone();
    +                let __end = __sym0.2.clone();
    +                let __nt = super::__action0::<>(__sym0);
    +                return Some(Ok(__nt));
    +            }
    +            517 => {
    +                __reduce517(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            518 => {
    +                __reduce518(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            519 => {
    +                __reduce519(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
    +            520 => {
    +                __reduce520(__action, __lookahead_start, __states, __symbols, ::std::marker::PhantomData::<()>)
    +            }
                 _ => panic!("invalid action code {}", __action)
             };
             let __states_len = __states.len();
             __states.truncate(__states_len - __pop_states);
             __symbols.push(__symbol);
             let __state = *__states.last().unwrap() as usize;
    -        let __next_state = __GOTO[__state * 185 + __nonterminal] - 1;
    +        let __next_state = __GOTO[__state * 207 + __nonterminal] - 1;
             __states.push(__next_state);
             None
         }
    -    fn __pop_Variant65<
    -    >(
    -        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>), lexer::Location)
    -     {
    -        match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant65(__v), __r) => (__l, __v, __r),
    -            _ => panic!("symbol type mismatch")
    -        }
    -    }
         fn __pop_Variant31<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    @@ -29431,23 +32776,23 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant33<
    +    fn __pop_Variant64<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, (String, Option<String>), lexer::Location)
    +    ) -> (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant33(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant64(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant76<
    +    fn __pop_Variant33<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, (String, Option<ast::Expression>), lexer::Location)
    +    ) -> (lexer::Location, (String, Option<String>), lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant76(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant33(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -29461,23 +32806,23 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant77<
    +    fn __pop_Variant43<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, (Vec<String>, Vec<ast::Expression>), lexer::Location)
    +    ) -> (lexer::Location, (Vec<ast::Expression>, Vec<ast::Keyword>), lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant77(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant43(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant43<
    +    fn __pop_Variant78<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, (Vec<ast::Expression>, Vec<ast::Keyword>), lexer::Location)
    +    ) -> (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant43(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant78(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -29501,6 +32846,16 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    +    fn __pop_Variant77<
    +    >(
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    +    ) -> (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location)
    +     {
    +        match __symbols.pop().unwrap() {
    +            (__l, __Symbol::Variant77(__v), __r) => (__l, __v, __r),
    +            _ => panic!("symbol type mismatch")
    +        }
    +    }
         fn __pop_Variant2<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    @@ -29524,47 +32879,47 @@
         fn __pop_Variant20<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, (lexer::Tok, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)), lexer::Location)
    +    ) -> (lexer::Location, (lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)), lexer::Location)
          {
             match __symbols.pop().unwrap() {
                 (__l, __Symbol::Variant20(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant22<
    +    fn __pop_Variant9<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, (lexer::Tok, (String, Option<ast::Expression>)), lexer::Location)
    +    ) -> (lexer::Location, (lexer::Tok, (Vec<ast::Expression>, Vec<ast::Keyword>), lexer::Tok), lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant22(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant9(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant9<
    +    fn __pop_Variant13<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, (lexer::Tok, (Vec<ast::Expression>, Vec<ast::Keyword>), lexer::Tok), lexer::Location)
    +    ) -> (lexer::Location, (lexer::Tok, (ast::Expression, ast::Expression)), lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant9(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant13(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant13<
    +    fn __pop_Variant22<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, (lexer::Tok, (ast::Expression, ast::Expression)), lexer::Location)
    +    ) -> (lexer::Location, (lexer::Tok, (ast::Parameter, Option<ast::Expression>)), lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant13(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant22(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
         fn __pop_Variant18<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, (lexer::Tok, Option<String>), lexer::Location)
    +    ) -> (lexer::Location, (lexer::Tok, Option<ast::Parameter>), lexer::Location)
          {
             match __symbols.pop().unwrap() {
                 (__l, __Symbol::Variant18(__v), __r) => (__l, __v, __r),
    @@ -29631,23 +32986,23 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant60<
    +    fn __pop_Variant55<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, Option<String>, lexer::Location)
    +    ) -> (lexer::Location, Option<ast::LocatedStatement>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant60(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant55(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant55<
    +    fn __pop_Variant59<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, Option<ast::LocatedStatement>, lexer::Location)
    +    ) -> (lexer::Location, Option<ast::Parameter>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant55(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant59(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -29681,23 +33036,23 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant62<
    +    fn __pop_Variant61<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, Vec<(ast::Expression, ast::Expression)>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant62(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant61(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant63<
    +    fn __pop_Variant62<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, Vec<String>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant63(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant62(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -29721,23 +33076,23 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant72<
    +    fn __pop_Variant71<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, Vec<ast::LocatedStatement>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant72(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant71(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant64<
    +    fn __pop_Variant63<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, Vec<ast::WithItem>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant64(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant63(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -29761,13 +33116,13 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant67<
    +    fn __pop_Variant66<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ast::Comprehension, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant67(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant66(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -29801,13 +33156,13 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant61<
    +    fn __pop_Variant60<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ast::Number, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant61(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant60(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -29821,6 +33176,16 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    +    fn __pop_Variant75<
    +    >(
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    +    ) -> (lexer::Location, ast::Parameter, lexer::Location)
    +     {
    +        match __symbols.pop().unwrap() {
    +            (__l, __Symbol::Variant75(__v), __r) => (__l, __v, __r),
    +            _ => panic!("symbol type mismatch")
    +        }
    +    }
         fn __pop_Variant38<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    @@ -29831,43 +33196,43 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant66<
    +    fn __pop_Variant65<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ast::Program, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant66(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant65(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant71<
    +    fn __pop_Variant70<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ast::StringGroup, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant71(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant70(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant75<
    +    fn __pop_Variant74<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ast::Top, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant75(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant74(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant78<
    +    fn __pop_Variant79<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ast::WithItem, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant78(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant79(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -29911,20 +33276,20 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant59<
    +    fn __pop_Variant58<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ::std::option::Option<(String, Option<String>)>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant59(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant58(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
         fn __pop_Variant21<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, ::std::option::Option<(lexer::Tok, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>))>, lexer::Location)
    +    ) -> (lexer::Location, ::std::option::Option<(lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
                 (__l, __Symbol::Variant21(__v), __r) => (__l, __v, __r),
    @@ -29944,7 +33309,7 @@
         fn __pop_Variant19<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, ::std::option::Option<(lexer::Tok, Option<String>)>, lexer::Location)
    +    ) -> (lexer::Location, ::std::option::Option<(lexer::Tok, Option<ast::Parameter>)>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
                 (__l, __Symbol::Variant19(__v), __r) => (__l, __v, __r),
    @@ -29991,53 +33356,53 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant58<
    +    fn __pop_Variant72<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, ::std::option::Option<String>, lexer::Location)
    +    ) -> (lexer::Location, ::std::option::Option<Vec<(ast::Expression, ast::Expression)>>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant58(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant72(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant73<
    +    fn __pop_Variant49<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, ::std::option::Option<Vec<(ast::Expression, ast::Expression)>>, lexer::Location)
    +    ) -> (lexer::Location, ::std::option::Option<Vec<ast::Comprehension>>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant73(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant49(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant49<
    +    fn __pop_Variant73<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, ::std::option::Option<Vec<ast::Comprehension>>, lexer::Location)
    +    ) -> (lexer::Location, ::std::option::Option<Vec<ast::Expression>>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant49(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant73(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant74<
    +    fn __pop_Variant68<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, ::std::option::Option<Vec<ast::Expression>>, lexer::Location)
    +    ) -> (lexer::Location, ::std::option::Option<ast::Expression>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant74(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant68(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant69<
    +    fn __pop_Variant76<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, ::std::option::Option<ast::Expression>, lexer::Location)
    +    ) -> (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant69(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant76(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -30081,13 +33446,13 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant80<
    +    fn __pop_Variant81<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ::std::vec::Vec<(String, bool)>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant80(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant81(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -30101,23 +33466,23 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant23<
    +    fn __pop_Variant14<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location)
    +    ) -> (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant23(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant14(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant14<
    +    fn __pop_Variant23<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
    -    ) -> (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>, lexer::Location)
    +    ) -> (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant14(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant23(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -30161,23 +33526,23 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant79<
    +    fn __pop_Variant80<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ::std::vec::Vec<Vec<u8>>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant79(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant80(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant68<
    +    fn __pop_Variant67<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ::std::vec::Vec<ast::Comprehension>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant68(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant67(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -30201,13 +33566,13 @@
                 _ => panic!("symbol type mismatch")
             }
         }
    -    fn __pop_Variant70<
    +    fn __pop_Variant69<
         >(
             __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>
         ) -> (lexer::Location, ::std::vec::Vec<ast::LocatedStatement>, lexer::Location)
          {
             match __symbols.pop().unwrap() {
    -            (__l, __Symbol::Variant70(__v), __r) => (__l, __v, __r),
    +            (__l, __Symbol::Variant69(__v), __r) => (__l, __v, __r),
                 _ => panic!("symbol type mismatch")
             }
         }
    @@ -30331,13 +33696,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("(" ArgumentList ")") = "(", ArgumentList, ")" => ActionFn(225);
    +        // ("(" ArgumentList ")") = "(", ArgumentList, ")" => ActionFn(226);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant43(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action225::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action226::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant9(__nt), __end);
             (3, __symbol, 3)
         }
    @@ -30350,13 +33715,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("(" ArgumentList ")")? = "(", ArgumentList, ")" => ActionFn(365);
    +        // ("(" ArgumentList ")")? = "(", ArgumentList, ")" => ActionFn(403);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant43(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action365::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action403::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant10(__nt), __end);
             (3, __symbol, 4)
         }
    @@ -30369,10 +33734,10 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("(" ArgumentList ")")? =  => ActionFn(224);
    +        // ("(" ArgumentList ")")? =  => ActionFn(225);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action224::<>(&__start, &__end);
    +        let __nt = super::__action225::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant10(__nt), __end);
             (0, __symbol, 4)
         }
    @@ -30385,12 +33750,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("**" Factor) = "**", Factor => ActionFn(217);
    +        // ("**" Factor) = "**", Factor => ActionFn(214);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action217::<>(__sym0, __sym1);
    +        let __nt = super::__action214::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant11(__nt), __end);
             (2, __symbol, 5)
         }
    @@ -30403,12 +33768,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("**" Factor)? = "**", Factor => ActionFn(370);
    +        // ("**" Factor)? = "**", Factor => ActionFn(408);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action370::<>(__sym0, __sym1);
    +        let __nt = super::__action408::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant12(__nt), __end);
             (2, __symbol, 6)
         }
    @@ -30421,10 +33786,10 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("**" Factor)? =  => ActionFn(216);
    +        // ("**" Factor)? =  => ActionFn(213);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action216::<>(&__start, &__end);
    +        let __nt = super::__action213::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant12(__nt), __end);
             (0, __symbol, 6)
         }
    @@ -30437,12 +33802,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," DictEntry) = ",", DictEntry => ActionFn(327);
    +        // ("," DictEntry) = ",", DictEntry => ActionFn(341);
             let __sym1 = __pop_Variant51(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action327::<>(__sym0, __sym1);
    +        let __nt = super::__action341::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant13(__nt), __end);
             (2, __symbol, 7)
         }
    @@ -30455,10 +33820,10 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," DictEntry)* =  => ActionFn(325);
    +        // ("," DictEntry)* =  => ActionFn(339);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action325::<>(&__start, &__end);
    +        let __nt = super::__action339::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant14(__nt), __end);
             (0, __symbol, 8)
         }
    @@ -30471,11 +33836,11 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," DictEntry)* = ("," DictEntry)+ => ActionFn(326);
    +        // ("," DictEntry)* = ("," DictEntry)+ => ActionFn(340);
             let __sym0 = __pop_Variant14(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action326::<>(__sym0);
    +        let __nt = super::__action340::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant14(__nt), __end);
             (1, __symbol, 8)
         }
    @@ -30488,12 +33853,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," DictEntry)+ = ",", DictEntry => ActionFn(373);
    +        // ("," DictEntry)+ = ",", DictEntry => ActionFn(411);
             let __sym1 = __pop_Variant51(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action373::<>(__sym0, __sym1);
    +        let __nt = super::__action411::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant14(__nt), __end);
             (2, __symbol, 9)
         }
    @@ -30506,13 +33871,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," DictEntry)+ = ("," DictEntry)+, ",", DictEntry => ActionFn(374);
    +        // ("," DictEntry)+ = ("," DictEntry)+, ",", DictEntry => ActionFn(412);
             let __sym2 = __pop_Variant51(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant14(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action374::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action412::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant14(__nt), __end);
             (3, __symbol, 9)
         }
    @@ -30525,12 +33890,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Expression) = ",", Expression => ActionFn(205);
    +        // ("," Expression) = ",", Expression => ActionFn(199);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action205::<>(__sym0, __sym1);
    +        let __nt = super::__action199::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant11(__nt), __end);
             (2, __symbol, 10)
         }
    @@ -30543,10 +33908,10 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Expression)* =  => ActionFn(203);
    +        // ("," Expression)* =  => ActionFn(197);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action203::<>(&__start, &__end);
    +        let __nt = super::__action197::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (0, __symbol, 11)
         }
    @@ -30559,11 +33924,11 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Expression)* = ("," Expression)+ => ActionFn(204);
    +        // ("," Expression)* = ("," Expression)+ => ActionFn(198);
             let __sym0 = __pop_Variant15(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action204::<>(__sym0);
    +        let __nt = super::__action198::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (1, __symbol, 11)
         }
    @@ -30576,12 +33941,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Expression)+ = ",", Expression => ActionFn(377);
    +        // ("," Expression)+ = ",", Expression => ActionFn(415);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action377::<>(__sym0, __sym1);
    +        let __nt = super::__action415::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (2, __symbol, 12)
         }
    @@ -30594,13 +33959,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Expression)+ = ("," Expression)+, ",", Expression => ActionFn(378);
    +        // ("," Expression)+ = ("," Expression)+, ",", Expression => ActionFn(416);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant15(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action378::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action416::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (3, __symbol, 12)
         }
    @@ -30664,12 +34029,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Identifier)+ = ",", Identifier => ActionFn(383);
    +        // ("," Identifier)+ = ",", Identifier => ActionFn(421);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action383::<>(__sym0, __sym1);
    +        let __nt = super::__action421::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant17(__nt), __end);
             (2, __symbol, 15)
         }
    @@ -30682,13 +34047,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Identifier)+ = ("," Identifier)+, ",", Identifier => ActionFn(384);
    +        // ("," Identifier)+ = ("," Identifier)+, ",", Identifier => ActionFn(422);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant17(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action384::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action422::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant17(__nt), __end);
             (3, __symbol, 15)
         }
    @@ -30701,12 +34066,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," KwargParameter) = ",", KwargParameter => ActionFn(233);
    -        let __sym1 = __pop_Variant60(__symbols);
    +        // ("," KwargParameter<TypedParameter>) = ",", KwargParameter<TypedParameter> => ActionFn(323);
    +        let __sym1 = __pop_Variant59(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action233::<>(__sym0, __sym1);
    +        let __nt = super::__action323::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant18(__nt), __end);
             (2, __symbol, 16)
         }
    @@ -30719,12 +34084,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," KwargParameter)? = ",", KwargParameter => ActionFn(387);
    -        let __sym1 = __pop_Variant60(__symbols);
    +        // ("," KwargParameter<TypedParameter>)? = ",", KwargParameter<TypedParameter> => ActionFn(425);
    +        let __sym1 = __pop_Variant59(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action387::<>(__sym0, __sym1);
    +        let __nt = super::__action425::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant19(__nt), __end);
             (2, __symbol, 17)
         }
    @@ -30737,10 +34102,10 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," KwargParameter)? =  => ActionFn(227);
    +        // ("," KwargParameter<TypedParameter>)? =  => ActionFn(367);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action227::<>(&__start, &__end);
    +        let __nt = super::__action367::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant19(__nt), __end);
             (0, __symbol, 17)
         }
    @@ -30753,13 +34118,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," ParameterListStarArgs) = ",", ParameterListStarArgs => ActionFn(236);
    -        let __sym1 = __pop_Variant65(__symbols);
    +        // ("," KwargParameter<UntypedParameter>) = ",", KwargParameter<UntypedParameter> => ActionFn(330);
    +        let __sym1 = __pop_Variant59(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action236::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant20(__nt), __end);
    +        let __nt = super::__action330::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant18(__nt), __end);
             (2, __symbol, 18)
         }
         pub(crate) fn __reduce32<
    @@ -30771,13 +34136,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," ParameterListStarArgs)? = ",", ParameterListStarArgs => ActionFn(391);
    -        let __sym1 = __pop_Variant65(__symbols);
    +        // ("," KwargParameter<UntypedParameter>)? = ",", KwargParameter<UntypedParameter> => ActionFn(429);
    +        let __sym1 = __pop_Variant59(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action391::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant21(__nt), __end);
    +        let __nt = super::__action429::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant19(__nt), __end);
             (2, __symbol, 19)
         }
         pub(crate) fn __reduce33<
    @@ -30789,11 +34154,11 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," ParameterListStarArgs)? =  => ActionFn(235);
    +        // ("," KwargParameter<UntypedParameter>)? =  => ActionFn(358);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action235::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant21(__nt), __end);
    +        let __nt = super::__action358::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant19(__nt), __end);
             (0, __symbol, 19)
         }
         pub(crate) fn __reduce34<
    @@ -30805,13 +34170,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Test) = ",", Test => ActionFn(262);
    -        let __sym1 = __pop_Variant42(__symbols);
    +        // ("," ParameterListStarArgs<TypedParameter>) = ",", ParameterListStarArgs<TypedParameter> => ActionFn(327);
    +        let __sym1 = __pop_Variant64(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action262::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant11(__nt), __end);
    +        let __nt = super::__action327::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant20(__nt), __end);
             (2, __symbol, 20)
         }
         pub(crate) fn __reduce35<
    @@ -30823,12 +34188,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Test)* =  => ActionFn(201);
    -        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    -        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action201::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
    -        (0, __symbol, 21)
    +        // ("," ParameterListStarArgs<TypedParameter>)? = ",", ParameterListStarArgs<TypedParameter> => ActionFn(433);
    +        let __sym1 = __pop_Variant64(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action433::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant21(__nt), __end);
    +        (2, __symbol, 21)
         }
         pub(crate) fn __reduce36<
         >(
    @@ -30839,13 +34206,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Test)* = ("," Test)+ => ActionFn(202);
    -        let __sym0 = __pop_Variant15(__symbols);
    -        let __start = __sym0.0.clone();
    -        let __end = __sym0.2.clone();
    -        let __nt = super::__action202::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
    -        (1, __symbol, 21)
    +        // ("," ParameterListStarArgs<TypedParameter>)? =  => ActionFn(326);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action326::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant21(__nt), __end);
    +        (0, __symbol, 21)
         }
         pub(crate) fn __reduce37<
         >(
    @@ -30856,13 +34222,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Test)+ = ",", Test => ActionFn(394);
    -        let __sym1 = __pop_Variant42(__symbols);
    +        // ("," ParameterListStarArgs<UntypedParameter>) = ",", ParameterListStarArgs<UntypedParameter> => ActionFn(334);
    +        let __sym1 = __pop_Variant64(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action394::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
    +        let __nt = super::__action334::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant20(__nt), __end);
             (2, __symbol, 22)
         }
         pub(crate) fn __reduce38<
    @@ -30874,35 +34240,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Test)+ = ("," Test)+, ",", Test => ActionFn(395);
    -        let __sym2 = __pop_Variant42(__symbols);
    -        let __sym1 = __pop_Variant0(__symbols);
    -        let __sym0 = __pop_Variant15(__symbols);
    -        let __start = __sym0.0.clone();
    -        let __end = __sym2.2.clone();
    -        let __nt = super::__action395::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
    -        (3, __symbol, 22)
    -    }
    -    pub(crate) fn __reduce39<
    -    >(
    -        __action: i16,
    -        __lookahead_start: Option<&lexer::Location>,
    -        __states: &mut ::std::vec::Vec<i16>,
    -        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    -        _: ::std::marker::PhantomData<()>,
    -    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    -    {
    -        // ("," Test)? = ",", Test => ActionFn(396);
    -        let __sym1 = __pop_Variant42(__symbols);
    +        // ("," ParameterListStarArgs<UntypedParameter>)? = ",", ParameterListStarArgs<UntypedParameter> => ActionFn(436);
    +        let __sym1 = __pop_Variant64(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action396::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    +        let __nt = super::__action436::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant21(__nt), __end);
             (2, __symbol, 23)
         }
    -    pub(crate) fn __reduce40<
    +    pub(crate) fn __reduce39<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -30911,14 +34258,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," Test)? =  => ActionFn(261);
    +        // ("," ParameterListStarArgs<UntypedParameter>)? =  => ActionFn(333);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action261::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    +        let __nt = super::__action333::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant21(__nt), __end);
             (0, __symbol, 23)
         }
    -    pub(crate) fn __reduce41<
    +    pub(crate) fn __reduce40<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -30927,16 +34274,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," TestOrStarExpr) = ",", TestOrStarExpr => ActionFn(284);
    +        // ("," Subscript) = ",", Subscript => ActionFn(211);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action284::<>(__sym0, __sym1);
    +        let __nt = super::__action211::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant11(__nt), __end);
             (2, __symbol, 24)
         }
    -    pub(crate) fn __reduce42<
    +    pub(crate) fn __reduce41<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -30945,14 +34292,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," TestOrStarExpr)* =  => ActionFn(282);
    +        // ("," Subscript)* =  => ActionFn(209);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action282::<>(&__start, &__end);
    +        let __nt = super::__action209::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (0, __symbol, 25)
         }
    -    pub(crate) fn __reduce43<
    +    pub(crate) fn __reduce42<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -30961,15 +34308,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," TestOrStarExpr)* = ("," TestOrStarExpr)+ => ActionFn(283);
    +        // ("," Subscript)* = ("," Subscript)+ => ActionFn(210);
             let __sym0 = __pop_Variant15(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action283::<>(__sym0);
    +        let __nt = super::__action210::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (1, __symbol, 25)
         }
    -    pub(crate) fn __reduce44<
    +    pub(crate) fn __reduce43<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -30978,16 +34325,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," TestOrStarExpr)+ = ",", TestOrStarExpr => ActionFn(403);
    +        // ("," Subscript)+ = ",", Subscript => ActionFn(439);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action403::<>(__sym0, __sym1);
    +        let __nt = super::__action439::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (2, __symbol, 26)
         }
    -    pub(crate) fn __reduce45<
    +    pub(crate) fn __reduce44<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -30996,17 +34343,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," TestOrStarExpr)+ = ("," TestOrStarExpr)+, ",", TestOrStarExpr => ActionFn(404);
    +        // ("," Subscript)+ = ("," Subscript)+, ",", Subscript => ActionFn(440);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant15(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action404::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action440::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (3, __symbol, 26)
         }
    -    pub(crate) fn __reduce46<
    +    pub(crate) fn __reduce45<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31015,16 +34362,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," TypedParameterDef) = ",", TypedParameterDef => ActionFn(232);
    -        let __sym1 = __pop_Variant76(__symbols);
    +        // ("," Test) = ",", Test => ActionFn(262);
    +        let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action232::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant22(__nt), __end);
    +        let __nt = super::__action262::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant11(__nt), __end);
             (2, __symbol, 27)
         }
    -    pub(crate) fn __reduce47<
    +    pub(crate) fn __reduce46<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31033,14 +34380,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," TypedParameterDef)* =  => ActionFn(230);
    +        // ("," Test)* =  => ActionFn(195);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action230::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        let __nt = super::__action195::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (0, __symbol, 28)
         }
    -    pub(crate) fn __reduce48<
    +    pub(crate) fn __reduce47<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31049,15 +34396,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," TypedParameterDef)* = ("," TypedParameterDef)+ => ActionFn(231);
    -        let __sym0 = __pop_Variant23(__symbols);
    +        // ("," Test)* = ("," Test)+ => ActionFn(196);
    +        let __sym0 = __pop_Variant15(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action231::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        let __nt = super::__action196::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (1, __symbol, 28)
         }
    -    pub(crate) fn __reduce49<
    +    pub(crate) fn __reduce48<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31066,16 +34413,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," TypedParameterDef)+ = ",", TypedParameterDef => ActionFn(411);
    -        let __sym1 = __pop_Variant76(__symbols);
    +        // ("," Test)+ = ",", Test => ActionFn(445);
    +        let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action411::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        let __nt = super::__action445::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (2, __symbol, 29)
         }
    -    pub(crate) fn __reduce50<
    +    pub(crate) fn __reduce49<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31084,17 +34431,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," TypedParameterDef)+ = ("," TypedParameterDef)+, ",", TypedParameterDef => ActionFn(412);
    -        let __sym2 = __pop_Variant76(__symbols);
    +        // ("," Test)+ = ("," Test)+, ",", Test => ActionFn(446);
    +        let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
    -        let __sym0 = __pop_Variant23(__symbols);
    +        let __sym0 = __pop_Variant15(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action412::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        let __nt = super::__action446::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
             (3, __symbol, 29)
         }
    -    pub(crate) fn __reduce51<
    +    pub(crate) fn __reduce50<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31103,16 +34450,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," WithItem) = ",", WithItem => ActionFn(320);
    -        let __sym1 = __pop_Variant78(__symbols);
    +        // ("," Test)? = ",", Test => ActionFn(447);
    +        let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action320::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant24(__nt), __end);
    +        let __nt = super::__action447::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
             (2, __symbol, 30)
         }
    -    pub(crate) fn __reduce52<
    +    pub(crate) fn __reduce51<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31121,14 +34468,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," WithItem)* =  => ActionFn(318);
    +        // ("," Test)? =  => ActionFn(261);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action318::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant25(__nt), __end);
    -        (0, __symbol, 31)
    +        let __nt = super::__action261::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    +        (0, __symbol, 30)
         }
    -    pub(crate) fn __reduce53<
    +    pub(crate) fn __reduce52<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31137,13 +34484,30 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," WithItem)* = ("," WithItem)+ => ActionFn(319);
    -        let __sym0 = __pop_Variant25(__symbols);
    +        // ("," TestOrStarExpr) = ",", TestOrStarExpr => ActionFn(284);
    +        let __sym1 = __pop_Variant42(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym0.2.clone();
    -        let __nt = super::__action319::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant25(__nt), __end);
    -        (1, __symbol, 31)
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action284::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant11(__nt), __end);
    +        (2, __symbol, 31)
    +    }
    +    pub(crate) fn __reduce53<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("," TestOrStarExpr)* =  => ActionFn(282);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action282::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
    +        (0, __symbol, 32)
         }
         pub(crate) fn __reduce54<
         >(
    @@ -31154,14 +34518,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," WithItem)+ = ",", WithItem => ActionFn(419);
    -        let __sym1 = __pop_Variant78(__symbols);
    -        let __sym0 = __pop_Variant0(__symbols);
    +        // ("," TestOrStarExpr)* = ("," TestOrStarExpr)+ => ActionFn(283);
    +        let __sym0 = __pop_Variant15(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym1.2.clone();
    -        let __nt = super::__action419::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant25(__nt), __end);
    -        (2, __symbol, 32)
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action283::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
    +        (1, __symbol, 32)
         }
         pub(crate) fn __reduce55<
         >(
    @@ -31172,15 +34535,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("," WithItem)+ = ("," WithItem)+, ",", WithItem => ActionFn(420);
    -        let __sym2 = __pop_Variant78(__symbols);
    -        let __sym1 = __pop_Variant0(__symbols);
    -        let __sym0 = __pop_Variant25(__symbols);
    +        // ("," TestOrStarExpr)+ = ",", TestOrStarExpr => ActionFn(454);
    +        let __sym1 = __pop_Variant42(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym2.2.clone();
    -        let __nt = super::__action420::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant25(__nt), __end);
    -        (3, __symbol, 32)
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action454::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
    +        (2, __symbol, 33)
         }
         pub(crate) fn __reduce56<
         >(
    @@ -31191,14 +34553,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("." Identifier) = ".", Identifier => ActionFn(266);
    -        let __sym1 = __pop_Variant5(__symbols);
    -        let __sym0 = __pop_Variant0(__symbols);
    +        // ("," TestOrStarExpr)+ = ("," TestOrStarExpr)+, ",", TestOrStarExpr => ActionFn(455);
    +        let __sym2 = __pop_Variant42(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant15(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym1.2.clone();
    -        let __nt = super::__action266::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant16(__nt), __end);
    -        (2, __symbol, 33)
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action455::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant15(__nt), __end);
    +        (3, __symbol, 33)
         }
         pub(crate) fn __reduce57<
         >(
    @@ -31209,13 +34572,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("." Identifier)+ = ".", Identifier => ActionFn(423);
    -        let __sym1 = __pop_Variant5(__symbols);
    +        // ("," TypedParameterDef<TypedParameter>) = ",", TypedParameterDef<TypedParameter> => ActionFn(370);
    +        let __sym1 = __pop_Variant77(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action423::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant17(__nt), __end);
    +        let __nt = super::__action370::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant22(__nt), __end);
             (2, __symbol, 34)
         }
         pub(crate) fn __reduce58<
    @@ -31227,15 +34590,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("." Identifier)+ = ("." Identifier)+, ".", Identifier => ActionFn(424);
    -        let __sym2 = __pop_Variant5(__symbols);
    -        let __sym1 = __pop_Variant0(__symbols);
    -        let __sym0 = __pop_Variant17(__symbols);
    -        let __start = __sym0.0.clone();
    -        let __end = __sym2.2.clone();
    -        let __nt = super::__action424::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant17(__nt), __end);
    -        (3, __symbol, 34)
    +        // ("," TypedParameterDef<TypedParameter>)* =  => ActionFn(368);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action368::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        (0, __symbol, 35)
         }
         pub(crate) fn __reduce59<
         >(
    @@ -31246,14 +34606,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("as" Expression) = "as", Expression => ActionFn(244);
    -        let __sym1 = __pop_Variant42(__symbols);
    -        let __sym0 = __pop_Variant0(__symbols);
    +        // ("," TypedParameterDef<TypedParameter>)* = ("," TypedParameterDef<TypedParameter>)+ => ActionFn(369);
    +        let __sym0 = __pop_Variant23(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym1.2.clone();
    -        let __nt = super::__action244::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant11(__nt), __end);
    -        (2, __symbol, 35)
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action369::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        (1, __symbol, 35)
         }
         pub(crate) fn __reduce60<
         >(
    @@ -31264,13 +34623,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("as" Expression)? = "as", Expression => ActionFn(425);
    -        let __sym1 = __pop_Variant42(__symbols);
    +        // ("," TypedParameterDef<TypedParameter>)+ = ",", TypedParameterDef<TypedParameter> => ActionFn(462);
    +        let __sym1 = __pop_Variant77(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action425::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    +        let __nt = super::__action462::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
             (2, __symbol, 36)
         }
         pub(crate) fn __reduce61<
    @@ -31282,12 +34641,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("as" Expression)? =  => ActionFn(243);
    -        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    -        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action243::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    -        (0, __symbol, 36)
    +        // ("," TypedParameterDef<TypedParameter>)+ = ("," TypedParameterDef<TypedParameter>)+, ",", TypedParameterDef<TypedParameter> => ActionFn(463);
    +        let __sym2 = __pop_Variant77(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant23(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action463::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        (3, __symbol, 36)
         }
         pub(crate) fn __reduce62<
         >(
    @@ -31298,13 +34660,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("as" Identifier) = "as", Identifier => ActionFn(305);
    -        let __sym1 = __pop_Variant5(__symbols);
    +        // ("," TypedParameterDef<UntypedParameter>) = ",", TypedParameterDef<UntypedParameter> => ActionFn(361);
    +        let __sym1 = __pop_Variant77(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action305::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant16(__nt), __end);
    +        let __nt = super::__action361::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant22(__nt), __end);
             (2, __symbol, 37)
         }
         pub(crate) fn __reduce63<
    @@ -31316,14 +34678,12 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("as" Identifier)? = "as", Identifier => ActionFn(428);
    -        let __sym1 = __pop_Variant5(__symbols);
    -        let __sym0 = __pop_Variant0(__symbols);
    -        let __start = __sym0.0.clone();
    -        let __end = __sym1.2.clone();
    -        let __nt = super::__action428::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant26(__nt), __end);
    -        (2, __symbol, 38)
    +        // ("," TypedParameterDef<UntypedParameter>)* =  => ActionFn(359);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action359::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        (0, __symbol, 38)
         }
         pub(crate) fn __reduce64<
         >(
    @@ -31334,12 +34694,13 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("as" Identifier)? =  => ActionFn(304);
    -        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    -        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action304::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant26(__nt), __end);
    -        (0, __symbol, 38)
    +        // ("," TypedParameterDef<UntypedParameter>)* = ("," TypedParameterDef<UntypedParameter>)+ => ActionFn(360);
    +        let __sym0 = __pop_Variant23(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action360::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        (1, __symbol, 38)
         }
         pub(crate) fn __reduce65<
         >(
    @@ -31350,15 +34711,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("else" ":" Suite) = "else", ":", Suite => ActionFn(256);
    -        let __sym2 = __pop_Variant72(__symbols);
    -        let __sym1 = __pop_Variant0(__symbols);
    +        // ("," TypedParameterDef<UntypedParameter>)+ = ",", TypedParameterDef<UntypedParameter> => ActionFn(470);
    +        let __sym1 = __pop_Variant77(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym2.2.clone();
    -        let __nt = super::__action256::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant27(__nt), __end);
    -        (3, __symbol, 39)
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action470::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        (2, __symbol, 39)
         }
         pub(crate) fn __reduce66<
         >(
    @@ -31369,15 +34729,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("else" ":" Suite)? = "else", ":", Suite => ActionFn(433);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        // ("," TypedParameterDef<UntypedParameter>)+ = ("," TypedParameterDef<UntypedParameter>)+, ",", TypedParameterDef<UntypedParameter> => ActionFn(471);
    +        let __sym2 = __pop_Variant77(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
    -        let __sym0 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant23(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action433::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant28(__nt), __end);
    -        (3, __symbol, 40)
    +        let __nt = super::__action471::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant23(__nt), __end);
    +        (3, __symbol, 39)
         }
         pub(crate) fn __reduce67<
         >(
    @@ -31388,14 +34748,403 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("else" ":" Suite)? =  => ActionFn(255);
    -        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    -        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action255::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant28(__nt), __end);
    -        (0, __symbol, 40)
    -    }
    -    pub(crate) fn __reduce68<
    +        // ("," WithItem) = ",", WithItem => ActionFn(320);
    +        let __sym1 = __pop_Variant79(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action320::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant24(__nt), __end);
    +        (2, __symbol, 40)
    +    }
    +    pub(crate) fn __reduce68<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("," WithItem)* =  => ActionFn(318);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action318::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant25(__nt), __end);
    +        (0, __symbol, 41)
    +    }
    +    pub(crate) fn __reduce69<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("," WithItem)* = ("," WithItem)+ => ActionFn(319);
    +        let __sym0 = __pop_Variant25(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action319::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant25(__nt), __end);
    +        (1, __symbol, 41)
    +    }
    +    pub(crate) fn __reduce70<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("," WithItem)+ = ",", WithItem => ActionFn(478);
    +        let __sym1 = __pop_Variant79(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action478::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant25(__nt), __end);
    +        (2, __symbol, 42)
    +    }
    +    pub(crate) fn __reduce71<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("," WithItem)+ = ("," WithItem)+, ",", WithItem => ActionFn(479);
    +        let __sym2 = __pop_Variant79(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant25(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action479::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant25(__nt), __end);
    +        (3, __symbol, 42)
    +    }
    +    pub(crate) fn __reduce72<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("->" Test) = "->", Test => ActionFn(239);
    +        let __sym1 = __pop_Variant42(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action239::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant11(__nt), __end);
    +        (2, __symbol, 43)
    +    }
    +    pub(crate) fn __reduce73<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("->" Test)? = "->", Test => ActionFn(482);
    +        let __sym1 = __pop_Variant42(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action482::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    +        (2, __symbol, 44)
    +    }
    +    pub(crate) fn __reduce74<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("->" Test)? =  => ActionFn(238);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action238::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    +        (0, __symbol, 44)
    +    }
    +    pub(crate) fn __reduce75<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("." Identifier) = ".", Identifier => ActionFn(266);
    +        let __sym1 = __pop_Variant5(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action266::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant16(__nt), __end);
    +        (2, __symbol, 45)
    +    }
    +    pub(crate) fn __reduce76<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("." Identifier)+ = ".", Identifier => ActionFn(485);
    +        let __sym1 = __pop_Variant5(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action485::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant17(__nt), __end);
    +        (2, __symbol, 46)
    +    }
    +    pub(crate) fn __reduce77<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("." Identifier)+ = ("." Identifier)+, ".", Identifier => ActionFn(486);
    +        let __sym2 = __pop_Variant5(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant17(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action486::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant17(__nt), __end);
    +        (3, __symbol, 46)
    +    }
    +    pub(crate) fn __reduce78<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // (":" Test) = ":", Test => ActionFn(229);
    +        let __sym1 = __pop_Variant42(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action229::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant11(__nt), __end);
    +        (2, __symbol, 47)
    +    }
    +    pub(crate) fn __reduce79<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // (":" Test)? = ":", Test => ActionFn(487);
    +        let __sym1 = __pop_Variant42(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action487::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    +        (2, __symbol, 48)
    +    }
    +    pub(crate) fn __reduce80<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // (":" Test)? =  => ActionFn(228);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action228::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    +        (0, __symbol, 48)
    +    }
    +    pub(crate) fn __reduce81<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("as" Expression) = "as", Expression => ActionFn(244);
    +        let __sym1 = __pop_Variant42(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action244::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant11(__nt), __end);
    +        (2, __symbol, 49)
    +    }
    +    pub(crate) fn __reduce82<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("as" Expression)? = "as", Expression => ActionFn(490);
    +        let __sym1 = __pop_Variant42(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action490::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    +        (2, __symbol, 50)
    +    }
    +    pub(crate) fn __reduce83<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("as" Expression)? =  => ActionFn(243);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action243::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    +        (0, __symbol, 50)
    +    }
    +    pub(crate) fn __reduce84<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("as" Identifier) = "as", Identifier => ActionFn(305);
    +        let __sym1 = __pop_Variant5(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action305::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant16(__nt), __end);
    +        (2, __symbol, 51)
    +    }
    +    pub(crate) fn __reduce85<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("as" Identifier)? = "as", Identifier => ActionFn(493);
    +        let __sym1 = __pop_Variant5(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action493::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant26(__nt), __end);
    +        (2, __symbol, 52)
    +    }
    +    pub(crate) fn __reduce86<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("as" Identifier)? =  => ActionFn(304);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action304::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant26(__nt), __end);
    +        (0, __symbol, 52)
    +    }
    +    pub(crate) fn __reduce87<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("else" ":" Suite) = "else", ":", Suite => ActionFn(256);
    +        let __sym2 = __pop_Variant71(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action256::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant27(__nt), __end);
    +        (3, __symbol, 53)
    +    }
    +    pub(crate) fn __reduce88<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("else" ":" Suite)? = "else", ":", Suite => ActionFn(498);
    +        let __sym2 = __pop_Variant71(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action498::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant28(__nt), __end);
    +        (3, __symbol, 54)
    +    }
    +    pub(crate) fn __reduce89<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ("else" ":" Suite)? =  => ActionFn(255);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action255::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant28(__nt), __end);
    +        (0, __symbol, 54)
    +    }
    +    pub(crate) fn __reduce90<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31405,16 +35154,16 @@
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
             // ("finally" ":" Suite) = "finally", ":", Suite => ActionFn(251);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
             let __nt = super::__action251::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant27(__nt), __end);
    -        (3, __symbol, 41)
    +        (3, __symbol, 55)
         }
    -    pub(crate) fn __reduce69<
    +    pub(crate) fn __reduce91<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31423,17 +35172,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("finally" ":" Suite)? = "finally", ":", Suite => ActionFn(442);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        // ("finally" ":" Suite)? = "finally", ":", Suite => ActionFn(507);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action442::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action507::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant28(__nt), __end);
    -        (3, __symbol, 42)
    +        (3, __symbol, 56)
         }
    -    pub(crate) fn __reduce70<
    +    pub(crate) fn __reduce92<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31447,9 +35196,9 @@
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action250::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant28(__nt), __end);
    -        (0, __symbol, 42)
    +        (0, __symbol, 56)
         }
    -    pub(crate) fn __reduce71<
    +    pub(crate) fn __reduce93<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31465,9 +35214,9 @@
             let __end = __sym1.2.clone();
             let __nt = super::__action277::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant11(__nt), __end);
    -        (2, __symbol, 43)
    +        (2, __symbol, 57)
         }
    -    pub(crate) fn __reduce72<
    +    pub(crate) fn __reduce94<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31476,16 +35225,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("from" Test)? = "from", Test => ActionFn(447);
    +        // ("from" Test)? = "from", Test => ActionFn(512);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action447::<>(__sym0, __sym1);
    +        let __nt = super::__action512::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    -        (2, __symbol, 44)
    +        (2, __symbol, 58)
         }
    -    pub(crate) fn __reduce73<
    +    pub(crate) fn __reduce95<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31499,9 +35248,9 @@
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action276::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant12(__nt), __end);
    -        (0, __symbol, 44)
    +        (0, __symbol, 58)
         }
    -    pub(crate) fn __reduce74<
    +    pub(crate) fn __reduce96<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31510,18 +35259,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("if" OrTest "else" Test) = "if", OrTest, "else", Test => ActionFn(222);
    +        // ("if" OrTest "else" Test) = "if", OrTest, "else", Test => ActionFn(223);
             let __sym3 = __pop_Variant42(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action222::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action223::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant29(__nt), __end);
    -        (4, __symbol, 45)
    +        (4, __symbol, 59)
         }
    -    pub(crate) fn __reduce75<
    +    pub(crate) fn __reduce97<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31530,18 +35279,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("if" OrTest "else" Test)? = "if", OrTest, "else", Test => ActionFn(450);
    +        // ("if" OrTest "else" Test)? = "if", OrTest, "else", Test => ActionFn(515);
             let __sym3 = __pop_Variant42(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action450::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action515::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant30(__nt), __end);
    -        (4, __symbol, 46)
    +        (4, __symbol, 60)
         }
    -    pub(crate) fn __reduce76<
    +    pub(crate) fn __reduce98<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31550,14 +35299,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ("if" OrTest "else" Test)? =  => ActionFn(221);
    +        // ("if" OrTest "else" Test)? =  => ActionFn(222);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action221::<>(&__start, &__end);
    +        let __nt = super::__action222::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant30(__nt), __end);
    -        (0, __symbol, 46)
    +        (0, __symbol, 60)
         }
    -    pub(crate) fn __reduce77<
    +    pub(crate) fn __reduce99<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31566,16 +35315,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<FunctionArgument> ",") = FunctionArgument, "," => ActionFn(338);
    +        // (<FunctionArgument> ",") = FunctionArgument, "," => ActionFn(352);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant31(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action338::<>(__sym0, __sym1);
    +        let __nt = super::__action352::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant31(__nt), __end);
    -        (2, __symbol, 47)
    +        (2, __symbol, 61)
         }
    -    pub(crate) fn __reduce78<
    +    pub(crate) fn __reduce100<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31584,14 +35333,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<FunctionArgument> ",")* =  => ActionFn(336);
    +        // (<FunctionArgument> ",")* =  => ActionFn(350);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action336::<>(&__start, &__end);
    +        let __nt = super::__action350::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant32(__nt), __end);
    -        (0, __symbol, 48)
    +        (0, __symbol, 62)
         }
    -    pub(crate) fn __reduce79<
    +    pub(crate) fn __reduce101<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31600,15 +35349,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<FunctionArgument> ",")* = (<FunctionArgument> ",")+ => ActionFn(337);
    +        // (<FunctionArgument> ",")* = (<FunctionArgument> ",")+ => ActionFn(351);
             let __sym0 = __pop_Variant32(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action337::<>(__sym0);
    +        let __nt = super::__action351::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant32(__nt), __end);
    -        (1, __symbol, 48)
    +        (1, __symbol, 62)
         }
    -    pub(crate) fn __reduce80<
    +    pub(crate) fn __reduce102<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31617,16 +35366,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<FunctionArgument> ",")+ = FunctionArgument, "," => ActionFn(453);
    +        // (<FunctionArgument> ",")+ = FunctionArgument, "," => ActionFn(518);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant31(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action453::<>(__sym0, __sym1);
    +        let __nt = super::__action518::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant32(__nt), __end);
    -        (2, __symbol, 49)
    +        (2, __symbol, 63)
         }
    -    pub(crate) fn __reduce81<
    +    pub(crate) fn __reduce103<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31635,17 +35384,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<FunctionArgument> ",")+ = (<FunctionArgument> ",")+, FunctionArgument, "," => ActionFn(454);
    +        // (<FunctionArgument> ",")+ = (<FunctionArgument> ",")+, FunctionArgument, "," => ActionFn(519);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant31(__symbols);
             let __sym0 = __pop_Variant32(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action454::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action519::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant32(__nt), __end);
    -        (3, __symbol, 49)
    +        (3, __symbol, 63)
         }
    -    pub(crate) fn __reduce82<
    +    pub(crate) fn __reduce104<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31654,18 +35403,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<<DottedName>>> ",") = DottedName, "as", Identifier, "," => ActionFn(457);
    +        // (<ImportPart<<DottedName>>> ",") = DottedName, "as", Identifier, "," => ActionFn(522);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action457::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action522::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant33(__nt), __end);
    -        (4, __symbol, 50)
    +        (4, __symbol, 64)
         }
    -    pub(crate) fn __reduce83<
    +    pub(crate) fn __reduce105<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31674,16 +35423,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<<DottedName>>> ",") = DottedName, "," => ActionFn(458);
    +        // (<ImportPart<<DottedName>>> ",") = DottedName, "," => ActionFn(523);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action458::<>(__sym0, __sym1);
    +        let __nt = super::__action523::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant33(__nt), __end);
    -        (2, __symbol, 50)
    +        (2, __symbol, 64)
         }
    -    pub(crate) fn __reduce84<
    +    pub(crate) fn __reduce106<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31697,9 +35446,9 @@
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action300::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (0, __symbol, 51)
    +        (0, __symbol, 65)
         }
    -    pub(crate) fn __reduce85<
    +    pub(crate) fn __reduce107<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31714,9 +35463,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action301::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (1, __symbol, 51)
    +        (1, __symbol, 65)
         }
    -    pub(crate) fn __reduce86<
    +    pub(crate) fn __reduce108<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31725,18 +35474,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<<DottedName>>> ",")+ = DottedName, "as", Identifier, "," => ActionFn(461);
    +        // (<ImportPart<<DottedName>>> ",")+ = DottedName, "as", Identifier, "," => ActionFn(526);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action461::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action526::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (4, __symbol, 52)
    +        (4, __symbol, 66)
         }
    -    pub(crate) fn __reduce87<
    +    pub(crate) fn __reduce109<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31745,16 +35494,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<<DottedName>>> ",")+ = DottedName, "," => ActionFn(462);
    +        // (<ImportPart<<DottedName>>> ",")+ = DottedName, "," => ActionFn(527);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action462::<>(__sym0, __sym1);
    +        let __nt = super::__action527::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (2, __symbol, 52)
    +        (2, __symbol, 66)
         }
    -    pub(crate) fn __reduce88<
    +    pub(crate) fn __reduce110<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31763,7 +35512,7 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<<DottedName>>> ",")+ = (<ImportPart<<DottedName>>> ",")+, DottedName, "as", Identifier, "," => ActionFn(463);
    +        // (<ImportPart<<DottedName>>> ",")+ = (<ImportPart<<DottedName>>> ",")+, DottedName, "as", Identifier, "," => ActionFn(528);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant5(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
    @@ -31771,11 +35520,11 @@
             let __sym0 = __pop_Variant34(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action463::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __nt = super::__action528::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (5, __symbol, 52)
    +        (5, __symbol, 66)
         }
    -    pub(crate) fn __reduce89<
    +    pub(crate) fn __reduce111<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31784,17 +35533,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<<DottedName>>> ",")+ = (<ImportPart<<DottedName>>> ",")+, DottedName, "," => ActionFn(464);
    +        // (<ImportPart<<DottedName>>> ",")+ = (<ImportPart<<DottedName>>> ",")+, DottedName, "," => ActionFn(529);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant34(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action464::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action529::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (3, __symbol, 52)
    +        (3, __symbol, 66)
         }
    -    pub(crate) fn __reduce90<
    +    pub(crate) fn __reduce112<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31803,18 +35552,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<Identifier>> ",") = Identifier, "as", Identifier, "," => ActionFn(467);
    +        // (<ImportPart<Identifier>> ",") = Identifier, "as", Identifier, "," => ActionFn(532);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action467::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action532::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant33(__nt), __end);
    -        (4, __symbol, 53)
    +        (4, __symbol, 67)
         }
    -    pub(crate) fn __reduce91<
    +    pub(crate) fn __reduce113<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31823,16 +35572,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<Identifier>> ",") = Identifier, "," => ActionFn(468);
    +        // (<ImportPart<Identifier>> ",") = Identifier, "," => ActionFn(533);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action468::<>(__sym0, __sym1);
    +        let __nt = super::__action533::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant33(__nt), __end);
    -        (2, __symbol, 53)
    +        (2, __symbol, 67)
         }
    -    pub(crate) fn __reduce92<
    +    pub(crate) fn __reduce114<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31846,9 +35595,9 @@
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action308::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (0, __symbol, 54)
    +        (0, __symbol, 68)
         }
    -    pub(crate) fn __reduce93<
    +    pub(crate) fn __reduce115<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31863,9 +35612,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action309::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (1, __symbol, 54)
    +        (1, __symbol, 68)
         }
    -    pub(crate) fn __reduce94<
    +    pub(crate) fn __reduce116<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31874,18 +35623,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<Identifier>> ",")+ = Identifier, "as", Identifier, "," => ActionFn(471);
    +        // (<ImportPart<Identifier>> ",")+ = Identifier, "as", Identifier, "," => ActionFn(536);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action471::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action536::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (4, __symbol, 55)
    +        (4, __symbol, 69)
         }
    -    pub(crate) fn __reduce95<
    +    pub(crate) fn __reduce117<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31894,16 +35643,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<Identifier>> ",")+ = Identifier, "," => ActionFn(472);
    +        // (<ImportPart<Identifier>> ",")+ = Identifier, "," => ActionFn(537);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action472::<>(__sym0, __sym1);
    +        let __nt = super::__action537::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (2, __symbol, 55)
    +        (2, __symbol, 69)
         }
    -    pub(crate) fn __reduce96<
    +    pub(crate) fn __reduce118<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31912,7 +35661,7 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<Identifier>> ",")+ = (<ImportPart<Identifier>> ",")+, Identifier, "as", Identifier, "," => ActionFn(473);
    +        // (<ImportPart<Identifier>> ",")+ = (<ImportPart<Identifier>> ",")+, Identifier, "as", Identifier, "," => ActionFn(538);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant5(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
    @@ -31920,11 +35669,11 @@
             let __sym0 = __pop_Variant34(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action473::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __nt = super::__action538::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (5, __symbol, 55)
    +        (5, __symbol, 69)
         }
    -    pub(crate) fn __reduce97<
    +    pub(crate) fn __reduce119<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31933,17 +35682,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (<ImportPart<Identifier>> ",")+ = (<ImportPart<Identifier>> ",")+, Identifier, "," => ActionFn(474);
    +        // (<ImportPart<Identifier>> ",")+ = (<ImportPart<Identifier>> ",")+, Identifier, "," => ActionFn(539);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant34(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action474::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action539::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant34(__nt), __end);
    -        (3, __symbol, 55)
    +        (3, __symbol, 69)
         }
    -    pub(crate) fn __reduce98<
    +    pub(crate) fn __reduce120<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31952,18 +35701,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (@L "elif" Test ":" Suite) = "elif", Test, ":", Suite => ActionFn(477);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        // (@L "elif" Test ":" Suite) = "elif", Test, ":", Suite => ActionFn(542);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action477::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action542::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant35(__nt), __end);
    -        (4, __symbol, 56)
    +        (4, __symbol, 70)
         }
    -    pub(crate) fn __reduce99<
    +    pub(crate) fn __reduce121<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31977,9 +35726,9 @@
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action257::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant36(__nt), __end);
    -        (0, __symbol, 57)
    +        (0, __symbol, 71)
         }
    -    pub(crate) fn __reduce100<
    +    pub(crate) fn __reduce122<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -31994,9 +35743,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action258::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant36(__nt), __end);
    -        (1, __symbol, 57)
    +        (1, __symbol, 71)
         }
    -    pub(crate) fn __reduce101<
    +    pub(crate) fn __reduce123<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32005,18 +35754,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (@L "elif" Test ":" Suite)+ = "elif", Test, ":", Suite => ActionFn(509);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        // (@L "elif" Test ":" Suite)+ = "elif", Test, ":", Suite => ActionFn(575);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action509::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action575::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant36(__nt), __end);
    -        (4, __symbol, 58)
    +        (4, __symbol, 72)
         }
    -    pub(crate) fn __reduce102<
    +    pub(crate) fn __reduce124<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32025,19 +35774,19 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (@L "elif" Test ":" Suite)+ = (@L "elif" Test ":" Suite)+, "elif", Test, ":", Suite => ActionFn(510);
    -        let __sym4 = __pop_Variant72(__symbols);
    +        // (@L "elif" Test ":" Suite)+ = (@L "elif" Test ":" Suite)+, "elif", Test, ":", Suite => ActionFn(576);
    +        let __sym4 = __pop_Variant71(__symbols);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant36(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action510::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __nt = super::__action576::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
             let __symbol = (__start, __Symbol::Variant36(__nt), __end);
    -        (5, __symbol, 58)
    +        (5, __symbol, 72)
         }
    -    pub(crate) fn __reduce103<
    +    pub(crate) fn __reduce125<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32054,9 +35803,9 @@
             let __end = __sym2.2.clone();
             let __nt = super::__action246::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant37(__nt), __end);
    -        (3, __symbol, 59)
    +        (3, __symbol, 73)
         }
    -    pub(crate) fn __reduce104<
    +    pub(crate) fn __reduce126<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32065,15 +35814,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (TypedArgsList) = TypedArgsList => ActionFn(239);
    +        // (TypedArgsList<TypedParameter>) = TypedArgsList<TypedParameter> => ActionFn(232);
             let __sym0 = __pop_Variant38(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action239::<>(__sym0);
    +        let __nt = super::__action232::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (1, __symbol, 60)
    +        (1, __symbol, 74)
         }
    -    pub(crate) fn __reduce105<
    +    pub(crate) fn __reduce127<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32082,15 +35831,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (TypedArgsList)? = TypedArgsList => ActionFn(516);
    +        // (TypedArgsList<TypedParameter>)? = TypedArgsList<TypedParameter> => ActionFn(582);
             let __sym0 = __pop_Variant38(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action516::<>(__sym0);
    +        let __nt = super::__action582::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant39(__nt), __end);
    -        (1, __symbol, 61)
    +        (1, __symbol, 75)
         }
    -    pub(crate) fn __reduce106<
    +    pub(crate) fn __reduce128<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32099,14 +35848,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // (TypedArgsList)? =  => ActionFn(238);
    +        // (TypedArgsList<TypedParameter>)? =  => ActionFn(231);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action238::<>(&__start, &__end);
    +        let __nt = super::__action231::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant39(__nt), __end);
    -        (0, __symbol, 61)
    +        (0, __symbol, 75)
         }
    -    pub(crate) fn __reduce107<
    +    pub(crate) fn __reduce129<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32120,9 +35869,9 @@
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action287::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant40(__nt), __end);
    -        (0, __symbol, 62)
    +        (0, __symbol, 76)
         }
    -    pub(crate) fn __reduce108<
    +    pub(crate) fn __reduce130<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32131,15 +35880,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AddOp = "+" => ActionFn(128);
    +        // AddOp = "+" => ActionFn(120);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action128::<>(__sym0);
    +        let __nt = super::__action120::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 63)
    +        (1, __symbol, 77)
         }
    -    pub(crate) fn __reduce109<
    +    pub(crate) fn __reduce131<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32148,15 +35897,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AddOp = "-" => ActionFn(129);
    +        // AddOp = "-" => ActionFn(121);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action129::<>(__sym0);
    +        let __nt = super::__action121::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 63)
    +        (1, __symbol, 77)
         }
    -    pub(crate) fn __reduce110<
    +    pub(crate) fn __reduce132<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32165,17 +35914,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AndExpression = AndExpression, "&", ShiftExpression => ActionFn(120);
    +        // AndExpression = AndExpression, "&", ShiftExpression => ActionFn(112);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action120::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action112::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 64)
    +        (3, __symbol, 78)
         }
    -    pub(crate) fn __reduce111<
    +    pub(crate) fn __reduce133<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32184,15 +35933,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AndExpression = ShiftExpression => ActionFn(121);
    +        // AndExpression = ShiftExpression => ActionFn(113);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action121::<>(__sym0);
    +        let __nt = super::__action113::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 64)
    +        (1, __symbol, 78)
         }
    -    pub(crate) fn __reduce112<
    +    pub(crate) fn __reduce134<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32201,15 +35950,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AndTest = NotTest => ActionFn(100);
    +        // AndTest = NotTest => ActionFn(92);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action100::<>(__sym0);
    +        let __nt = super::__action92::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 65)
    +        (1, __symbol, 79)
         }
    -    pub(crate) fn __reduce113<
    +    pub(crate) fn __reduce135<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32218,17 +35967,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AndTest = AndTest, "and", NotTest => ActionFn(101);
    +        // AndTest = AndTest, "and", NotTest => ActionFn(93);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action101::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action93::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 65)
    +        (3, __symbol, 79)
         }
    -    pub(crate) fn __reduce114<
    +    pub(crate) fn __reduce136<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32237,15 +35986,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ArgumentList = Comma<FunctionArgument> => ActionFn(179);
    +        // ArgumentList = Comma<FunctionArgument> => ActionFn(173);
             let __sym0 = __pop_Variant46(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action179::<>(__sym0);
    +        let __nt = super::__action173::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant43(__nt), __end);
    -        (1, __symbol, 66)
    +        (1, __symbol, 80)
         }
    -    pub(crate) fn __reduce115<
    +    pub(crate) fn __reduce137<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32254,17 +36003,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ArithmaticExpression = ArithmaticExpression, AddOp, Term => ActionFn(126);
    +        // ArithmaticExpression = ArithmaticExpression, AddOp, Term => ActionFn(118);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant41(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action126::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action118::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 67)
    +        (3, __symbol, 81)
         }
    -    pub(crate) fn __reduce116<
    +    pub(crate) fn __reduce138<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32273,15 +36022,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ArithmaticExpression = Term => ActionFn(127);
    +        // ArithmaticExpression = Term => ActionFn(119);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action127::<>(__sym0);
    +        let __nt = super::__action119::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 67)
    +        (1, __symbol, 81)
         }
    -    pub(crate) fn __reduce117<
    +    pub(crate) fn __reduce139<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32290,18 +36039,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AssertStatement = "assert", Test, ",", Test => ActionFn(478);
    +        // AssertStatement = "assert", Test, ",", Test => ActionFn(543);
             let __sym3 = __pop_Variant42(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action478::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action543::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (4, __symbol, 68)
    +        (4, __symbol, 82)
         }
    -    pub(crate) fn __reduce118<
    +    pub(crate) fn __reduce140<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32310,16 +36059,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AssertStatement = "assert", Test => ActionFn(479);
    +        // AssertStatement = "assert", Test => ActionFn(544);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action479::<>(__sym0, __sym1);
    +        let __nt = super::__action544::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (2, __symbol, 68)
    +        (2, __symbol, 82)
         }
    -    pub(crate) fn __reduce119<
    +    pub(crate) fn __reduce141<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32328,16 +36077,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AssignSuffix = "=", Test => ActionFn(601);
    +        // AssignSuffix = "=", Test => ActionFn(659);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action601::<>(__sym0, __sym1);
    +        let __nt = super::__action659::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 69)
    +        (2, __symbol, 83)
         }
    -    pub(crate) fn __reduce120<
    +    pub(crate) fn __reduce142<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32346,17 +36095,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AssignSuffix = "=", Test, ("," Test)+ => ActionFn(602);
    +        // AssignSuffix = "=", Test, ("," Test)+ => ActionFn(660);
             let __sym2 = __pop_Variant15(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action602::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action660::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 69)
    +        (3, __symbol, 83)
         }
    -    pub(crate) fn __reduce121<
    +    pub(crate) fn __reduce143<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32372,9 +36121,9 @@
             let __end = __sym1.2.clone();
             let __nt = super::__action26::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 69)
    +        (2, __symbol, 83)
         }
    -    pub(crate) fn __reduce122<
    +    pub(crate) fn __reduce144<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32388,9 +36137,9 @@
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action285::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (0, __symbol, 70)
    +        (0, __symbol, 84)
         }
    -    pub(crate) fn __reduce123<
    +    pub(crate) fn __reduce145<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32405,9 +36154,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action286::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (1, __symbol, 70)
    +        (1, __symbol, 84)
         }
    -    pub(crate) fn __reduce124<
    +    pub(crate) fn __reduce146<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32422,9 +36171,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action294::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (1, __symbol, 71)
    +        (1, __symbol, 85)
         }
    -    pub(crate) fn __reduce125<
    +    pub(crate) fn __reduce147<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32440,9 +36189,9 @@
             let __end = __sym1.2.clone();
             let __nt = super::__action295::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (2, __symbol, 71)
    +        (2, __symbol, 85)
         }
    -    pub(crate) fn __reduce126<
    +    pub(crate) fn __reduce148<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32451,15 +36200,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = StringGroup => ActionFn(149);
    -        let __sym0 = __pop_Variant71(__symbols);
    +        // Atom = StringGroup => ActionFn(142);
    +        let __sym0 = __pop_Variant70(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action149::<>(__sym0);
    +        let __nt = super::__action142::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 72)
    +        (1, __symbol, 86)
         }
    -    pub(crate) fn __reduce127<
    +    pub(crate) fn __reduce149<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32468,15 +36217,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = Bytes => ActionFn(150);
    +        // Atom = Bytes => ActionFn(143);
             let __sym0 = __pop_Variant1(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action150::<>(__sym0);
    +        let __nt = super::__action143::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 72)
    +        (1, __symbol, 86)
         }
    -    pub(crate) fn __reduce128<
    +    pub(crate) fn __reduce150<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32485,15 +36234,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = Number => ActionFn(151);
    -        let __sym0 = __pop_Variant61(__symbols);
    +        // Atom = Number => ActionFn(144);
    +        let __sym0 = __pop_Variant60(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action151::<>(__sym0);
    +        let __nt = super::__action144::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 72)
    +        (1, __symbol, 86)
         }
    -    pub(crate) fn __reduce129<
    +    pub(crate) fn __reduce151<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32502,15 +36251,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = Identifier => ActionFn(152);
    +        // Atom = Identifier => ActionFn(145);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action152::<>(__sym0);
    +        let __nt = super::__action145::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 72)
    +        (1, __symbol, 86)
         }
    -    pub(crate) fn __reduce130<
    +    pub(crate) fn __reduce152<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32519,17 +36268,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "[", TestListComp, "]" => ActionFn(623);
    +        // Atom = "[", TestListComp, "]" => ActionFn(681);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant54(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action623::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action681::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 72)
    +        (3, __symbol, 86)
         }
    -    pub(crate) fn __reduce131<
    +    pub(crate) fn __reduce153<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32538,16 +36287,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "[", "]" => ActionFn(624);
    +        // Atom = "[", "]" => ActionFn(682);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action624::<>(__sym0, __sym1);
    +        let __nt = super::__action682::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 72)
    +        (2, __symbol, 86)
         }
    -    pub(crate) fn __reduce132<
    +    pub(crate) fn __reduce154<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32556,17 +36305,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "[", TestListComp2, "]" => ActionFn(154);
    +        // Atom = "[", TestListComp2, "]" => ActionFn(147);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action154::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action147::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 72)
    +        (3, __symbol, 86)
         }
    -    pub(crate) fn __reduce133<
    +    pub(crate) fn __reduce155<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32575,18 +36324,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "(", Test, ",", ")" => ActionFn(611);
    +        // Atom = "(", Test, ",", ")" => ActionFn(669);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action611::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action669::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (4, __symbol, 72)
    +        (4, __symbol, 86)
         }
    -    pub(crate) fn __reduce134<
    +    pub(crate) fn __reduce156<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32595,7 +36344,7 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "(", Test, ("," Test)+, ",", ")" => ActionFn(612);
    +        // Atom = "(", Test, ("," Test)+, ",", ")" => ActionFn(670);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant15(__symbols);
    @@ -32603,11 +36352,11 @@
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action612::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __nt = super::__action670::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (5, __symbol, 72)
    +        (5, __symbol, 86)
         }
    -    pub(crate) fn __reduce135<
    +    pub(crate) fn __reduce157<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32616,17 +36365,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "(", ",", ")" => ActionFn(613);
    +        // Atom = "(", ",", ")" => ActionFn(671);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action613::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action671::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 72)
    +        (3, __symbol, 86)
         }
    -    pub(crate) fn __reduce136<
    +    pub(crate) fn __reduce158<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32635,17 +36384,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "(", Test, ")" => ActionFn(614);
    +        // Atom = "(", Test, ")" => ActionFn(672);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action614::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action672::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 72)
    +        (3, __symbol, 86)
         }
    -    pub(crate) fn __reduce137<
    +    pub(crate) fn __reduce159<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32654,18 +36403,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "(", Test, ("," Test)+, ")" => ActionFn(615);
    +        // Atom = "(", Test, ("," Test)+, ")" => ActionFn(673);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant15(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action615::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action673::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (4, __symbol, 72)
    +        (4, __symbol, 86)
         }
    -    pub(crate) fn __reduce138<
    +    pub(crate) fn __reduce160<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32674,16 +36423,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "(", ")" => ActionFn(616);
    +        // Atom = "(", ")" => ActionFn(674);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action616::<>(__sym0, __sym1);
    +        let __nt = super::__action674::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 72)
    +        (2, __symbol, 86)
         }
    -    pub(crate) fn __reduce139<
    +    pub(crate) fn __reduce161<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32692,18 +36441,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "(", Test, CompFor, ")" => ActionFn(156);
    +        // Atom = "(", Test, CompFor, ")" => ActionFn(149);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant48(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action156::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action149::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (4, __symbol, 72)
    +        (4, __symbol, 86)
         }
    -    pub(crate) fn __reduce140<
    +    pub(crate) fn __reduce162<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32712,17 +36461,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "{", TestDict, "}" => ActionFn(599);
    +        // Atom = "{", TestDict, "}" => ActionFn(657);
             let __sym2 = __pop_Variant0(__symbols);
    -        let __sym1 = __pop_Variant62(__symbols);
    +        let __sym1 = __pop_Variant61(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action599::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action657::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 72)
    +        (3, __symbol, 86)
         }
    -    pub(crate) fn __reduce141<
    +    pub(crate) fn __reduce163<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32731,16 +36480,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "{", "}" => ActionFn(600);
    +        // Atom = "{", "}" => ActionFn(658);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action600::<>(__sym0, __sym1);
    +        let __nt = super::__action658::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 72)
    +        (2, __symbol, 86)
         }
    -    pub(crate) fn __reduce142<
    +    pub(crate) fn __reduce164<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32749,17 +36498,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "{", TestDictComp, "}" => ActionFn(158);
    +        // Atom = "{", TestDictComp, "}" => ActionFn(151);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action158::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action151::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 72)
    +        (3, __symbol, 86)
         }
    -    pub(crate) fn __reduce143<
    +    pub(crate) fn __reduce165<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32768,17 +36517,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "{", TestSet, "}" => ActionFn(159);
    +        // Atom = "{", TestSet, "}" => ActionFn(152);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant54(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action159::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action152::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 72)
    +        (3, __symbol, 86)
         }
    -    pub(crate) fn __reduce144<
    +    pub(crate) fn __reduce166<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32787,17 +36536,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "{", TestSetComp, "}" => ActionFn(160);
    +        // Atom = "{", TestSetComp, "}" => ActionFn(153);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action160::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action153::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 72)
    +        (3, __symbol, 86)
         }
    -    pub(crate) fn __reduce145<
    +    pub(crate) fn __reduce167<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32806,15 +36555,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "True" => ActionFn(161);
    +        // Atom = "True" => ActionFn(154);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action161::<>(__sym0);
    +        let __nt = super::__action154::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 72)
    +        (1, __symbol, 86)
         }
    -    pub(crate) fn __reduce146<
    +    pub(crate) fn __reduce168<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32823,15 +36572,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "False" => ActionFn(162);
    +        // Atom = "False" => ActionFn(155);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action162::<>(__sym0);
    +        let __nt = super::__action155::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 72)
    +        (1, __symbol, 86)
         }
    -    pub(crate) fn __reduce147<
    +    pub(crate) fn __reduce169<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32840,15 +36589,32 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Atom = "None" => ActionFn(163);
    +        // Atom = "None" => ActionFn(156);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action163::<>(__sym0);
    +        let __nt = super::__action156::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 72)
    +        (1, __symbol, 86)
         }
    -    pub(crate) fn __reduce148<
    +    pub(crate) fn __reduce170<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // Atom = "..." => ActionFn(157);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action157::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    +        (1, __symbol, 86)
    +    }
    +    pub(crate) fn __reduce171<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32857,15 +36623,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AtomExpr = Atom => ActionFn(142);
    +        // AtomExpr = Atom => ActionFn(134);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action142::<>(__sym0);
    +        let __nt = super::__action134::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 73)
    +        (1, __symbol, 87)
         }
    -    pub(crate) fn __reduce149<
    +    pub(crate) fn __reduce172<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32874,18 +36640,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AtomExpr = AtomExpr, "(", ArgumentList, ")" => ActionFn(143);
    +        // AtomExpr = AtomExpr, "(", ArgumentList, ")" => ActionFn(135);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant43(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action143::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action135::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (4, __symbol, 73)
    +        (4, __symbol, 87)
         }
    -    pub(crate) fn __reduce150<
    +    pub(crate) fn __reduce173<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32894,18 +36660,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AtomExpr = AtomExpr, "[", Subscript, "]" => ActionFn(144);
    +        // AtomExpr = AtomExpr, "[", SubscriptList, "]" => ActionFn(136);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action144::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action136::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (4, __symbol, 73)
    +        (4, __symbol, 87)
         }
    -    pub(crate) fn __reduce151<
    +    pub(crate) fn __reduce174<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32914,17 +36680,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // AtomExpr = AtomExpr, ".", Identifier => ActionFn(145);
    +        // AtomExpr = AtomExpr, ".", Identifier => ActionFn(137);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action145::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action137::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 73)
    +        (3, __symbol, 87)
         }
    -    pub(crate) fn __reduce152<
    +    pub(crate) fn __reduce175<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32939,9 +36705,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action30::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce153<
    +    pub(crate) fn __reduce176<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32956,9 +36722,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action31::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce154<
    +    pub(crate) fn __reduce177<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32973,9 +36739,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action32::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce155<
    +    pub(crate) fn __reduce178<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -32990,9 +36756,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action33::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce156<
    +    pub(crate) fn __reduce179<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33007,9 +36773,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action34::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce157<
    +    pub(crate) fn __reduce180<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33024,9 +36790,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action35::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce158<
    +    pub(crate) fn __reduce181<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33041,9 +36807,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action36::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce159<
    +    pub(crate) fn __reduce182<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33058,9 +36824,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action37::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce160<
    +    pub(crate) fn __reduce183<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33075,9 +36841,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action38::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce161<
    +    pub(crate) fn __reduce184<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33092,9 +36858,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action39::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce162<
    +    pub(crate) fn __reduce185<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33109,9 +36875,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action40::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce163<
    +    pub(crate) fn __reduce186<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33126,9 +36892,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action41::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce164<
    +    pub(crate) fn __reduce187<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33143,9 +36909,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action42::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 74)
    +        (1, __symbol, 88)
         }
    -    pub(crate) fn __reduce165<
    +    pub(crate) fn __reduce188<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33154,15 +36920,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Bytes = bytes+ => ActionFn(188);
    -        let __sym0 = __pop_Variant79(__symbols);
    +        // Bytes = bytes+ => ActionFn(182);
    +        let __sym0 = __pop_Variant80(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action188::<>(__sym0);
    +        let __nt = super::__action182::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant1(__nt), __end);
    -        (1, __symbol, 75)
    +        (1, __symbol, 89)
         }
    -    pub(crate) fn __reduce166<
    +    pub(crate) fn __reduce189<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33171,8 +36937,8 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ClassDef = "class", Identifier, "(", ArgumentList, ")", ":", Suite => ActionFn(525);
    -        let __sym6 = __pop_Variant72(__symbols);
    +        // ClassDef = "class", Identifier, "(", ArgumentList, ")", ":", Suite => ActionFn(591);
    +        let __sym6 = __pop_Variant71(__symbols);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant43(__symbols);
    @@ -33181,11 +36947,11 @@
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym6.2.clone();
    -        let __nt = super::__action525::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
    +        let __nt = super::__action591::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (7, __symbol, 76)
    +        (7, __symbol, 90)
         }
    -    pub(crate) fn __reduce167<
    +    pub(crate) fn __reduce190<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33194,8 +36960,8 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ClassDef = Decorator+, "class", Identifier, "(", ArgumentList, ")", ":", Suite => ActionFn(526);
    -        let __sym7 = __pop_Variant72(__symbols);
    +        // ClassDef = Decorator+, "class", Identifier, "(", ArgumentList, ")", ":", Suite => ActionFn(592);
    +        let __sym7 = __pop_Variant71(__symbols);
             let __sym6 = __pop_Variant0(__symbols);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant43(__symbols);
    @@ -33205,11 +36971,11 @@
             let __sym0 = __pop_Variant45(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym7.2.clone();
    -        let __nt = super::__action526::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
    +        let __nt = super::__action592::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (8, __symbol, 76)
    +        (8, __symbol, 90)
         }
    -    pub(crate) fn __reduce168<
    +    pub(crate) fn __reduce191<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33218,18 +36984,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ClassDef = "class", Identifier, ":", Suite => ActionFn(527);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        // ClassDef = "class", Identifier, ":", Suite => ActionFn(593);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action527::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action593::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (4, __symbol, 76)
    +        (4, __symbol, 90)
         }
    -    pub(crate) fn __reduce169<
    +    pub(crate) fn __reduce192<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33238,19 +37004,19 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ClassDef = Decorator+, "class", Identifier, ":", Suite => ActionFn(528);
    -        let __sym4 = __pop_Variant72(__symbols);
    +        // ClassDef = Decorator+, "class", Identifier, ":", Suite => ActionFn(594);
    +        let __sym4 = __pop_Variant71(__symbols);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant45(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action528::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __nt = super::__action594::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (5, __symbol, 76)
    +        (5, __symbol, 90)
         }
    -    pub(crate) fn __reduce170<
    +    pub(crate) fn __reduce193<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33259,15 +37025,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<FunctionArgument> = FunctionArgument => ActionFn(541);
    +        // Comma<FunctionArgument> = FunctionArgument => ActionFn(609);
             let __sym0 = __pop_Variant31(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action541::<>(__sym0);
    +        let __nt = super::__action609::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant46(__nt), __end);
    -        (1, __symbol, 77)
    +        (1, __symbol, 91)
         }
    -    pub(crate) fn __reduce171<
    +    pub(crate) fn __reduce194<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33276,14 +37042,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<FunctionArgument> =  => ActionFn(542);
    +        // Comma<FunctionArgument> =  => ActionFn(610);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action542::<>(&__start, &__end);
    +        let __nt = super::__action610::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant46(__nt), __end);
    -        (0, __symbol, 77)
    +        (0, __symbol, 91)
         }
    -    pub(crate) fn __reduce172<
    +    pub(crate) fn __reduce195<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33292,16 +37058,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<FunctionArgument> = (<FunctionArgument> ",")+, FunctionArgument => ActionFn(543);
    +        // Comma<FunctionArgument> = (<FunctionArgument> ",")+, FunctionArgument => ActionFn(611);
             let __sym1 = __pop_Variant31(__symbols);
             let __sym0 = __pop_Variant32(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action543::<>(__sym0, __sym1);
    +        let __nt = super::__action611::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant46(__nt), __end);
    -        (2, __symbol, 77)
    +        (2, __symbol, 91)
         }
    -    pub(crate) fn __reduce173<
    +    pub(crate) fn __reduce196<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33310,15 +37076,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<FunctionArgument> = (<FunctionArgument> ",")+ => ActionFn(544);
    +        // Comma<FunctionArgument> = (<FunctionArgument> ",")+ => ActionFn(612);
             let __sym0 = __pop_Variant32(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action544::<>(__sym0);
    +        let __nt = super::__action612::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant46(__nt), __end);
    -        (1, __symbol, 77)
    +        (1, __symbol, 91)
         }
    -    pub(crate) fn __reduce174<
    +    pub(crate) fn __reduce197<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33327,17 +37093,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<<DottedName>>> = DottedName, "as", Identifier => ActionFn(555);
    +        // Comma<ImportPart<<DottedName>>> = DottedName, "as", Identifier => ActionFn(613);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action555::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action613::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (3, __symbol, 78)
    +        (3, __symbol, 92)
         }
    -    pub(crate) fn __reduce175<
    +    pub(crate) fn __reduce198<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33346,15 +37112,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<<DottedName>>> = DottedName => ActionFn(556);
    +        // Comma<ImportPart<<DottedName>>> = DottedName => ActionFn(614);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action556::<>(__sym0);
    +        let __nt = super::__action614::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (1, __symbol, 78)
    +        (1, __symbol, 92)
         }
    -    pub(crate) fn __reduce176<
    +    pub(crate) fn __reduce199<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33363,14 +37129,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<<DottedName>>> =  => ActionFn(557);
    +        // Comma<ImportPart<<DottedName>>> =  => ActionFn(615);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action557::<>(&__start, &__end);
    +        let __nt = super::__action615::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (0, __symbol, 78)
    +        (0, __symbol, 92)
         }
    -    pub(crate) fn __reduce177<
    +    pub(crate) fn __reduce200<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33379,18 +37145,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<<DottedName>>> = (<ImportPart<<DottedName>>> ",")+, DottedName, "as", Identifier => ActionFn(558);
    +        // Comma<ImportPart<<DottedName>>> = (<ImportPart<<DottedName>>> ",")+, DottedName, "as", Identifier => ActionFn(616);
             let __sym3 = __pop_Variant5(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant34(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action558::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action616::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (4, __symbol, 78)
    +        (4, __symbol, 92)
         }
    -    pub(crate) fn __reduce178<
    +    pub(crate) fn __reduce201<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33399,16 +37165,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<<DottedName>>> = (<ImportPart<<DottedName>>> ",")+, DottedName => ActionFn(559);
    +        // Comma<ImportPart<<DottedName>>> = (<ImportPart<<DottedName>>> ",")+, DottedName => ActionFn(617);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant34(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action559::<>(__sym0, __sym1);
    +        let __nt = super::__action617::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (2, __symbol, 78)
    +        (2, __symbol, 92)
         }
    -    pub(crate) fn __reduce179<
    +    pub(crate) fn __reduce202<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33417,15 +37183,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<<DottedName>>> = (<ImportPart<<DottedName>>> ",")+ => ActionFn(560);
    +        // Comma<ImportPart<<DottedName>>> = (<ImportPart<<DottedName>>> ",")+ => ActionFn(618);
             let __sym0 = __pop_Variant34(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action560::<>(__sym0);
    +        let __nt = super::__action618::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (1, __symbol, 78)
    +        (1, __symbol, 92)
         }
    -    pub(crate) fn __reduce180<
    +    pub(crate) fn __reduce203<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33434,17 +37200,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<Identifier>> = Identifier, "as", Identifier => ActionFn(561);
    +        // Comma<ImportPart<Identifier>> = Identifier, "as", Identifier => ActionFn(619);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action561::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action619::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (3, __symbol, 79)
    +        (3, __symbol, 93)
         }
    -    pub(crate) fn __reduce181<
    +    pub(crate) fn __reduce204<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33453,15 +37219,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<Identifier>> = Identifier => ActionFn(562);
    +        // Comma<ImportPart<Identifier>> = Identifier => ActionFn(620);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action562::<>(__sym0);
    +        let __nt = super::__action620::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (1, __symbol, 79)
    +        (1, __symbol, 93)
         }
    -    pub(crate) fn __reduce182<
    +    pub(crate) fn __reduce205<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33470,14 +37236,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<Identifier>> =  => ActionFn(563);
    +        // Comma<ImportPart<Identifier>> =  => ActionFn(621);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action563::<>(&__start, &__end);
    +        let __nt = super::__action621::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (0, __symbol, 79)
    +        (0, __symbol, 93)
         }
    -    pub(crate) fn __reduce183<
    +    pub(crate) fn __reduce206<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33486,18 +37252,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<Identifier>> = (<ImportPart<Identifier>> ",")+, Identifier, "as", Identifier => ActionFn(564);
    +        // Comma<ImportPart<Identifier>> = (<ImportPart<Identifier>> ",")+, Identifier, "as", Identifier => ActionFn(622);
             let __sym3 = __pop_Variant5(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant34(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action564::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action622::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (4, __symbol, 79)
    +        (4, __symbol, 93)
         }
    -    pub(crate) fn __reduce184<
    +    pub(crate) fn __reduce207<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33506,16 +37272,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<Identifier>> = (<ImportPart<Identifier>> ",")+, Identifier => ActionFn(565);
    +        // Comma<ImportPart<Identifier>> = (<ImportPart<Identifier>> ",")+, Identifier => ActionFn(623);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant34(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action565::<>(__sym0, __sym1);
    +        let __nt = super::__action623::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (2, __symbol, 79)
    +        (2, __symbol, 93)
         }
    -    pub(crate) fn __reduce185<
    +    pub(crate) fn __reduce208<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33524,15 +37290,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comma<ImportPart<Identifier>> = (<ImportPart<Identifier>> ",")+ => ActionFn(566);
    +        // Comma<ImportPart<Identifier>> = (<ImportPart<Identifier>> ",")+ => ActionFn(624);
             let __sym0 = __pop_Variant34(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action566::<>(__sym0);
    +        let __nt = super::__action624::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (1, __symbol, 79)
    +        (1, __symbol, 93)
         }
    -    pub(crate) fn __reduce186<
    +    pub(crate) fn __reduce209<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33541,15 +37307,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompFor = SingleForComprehension+ => ActionFn(175);
    -        let __sym0 = __pop_Variant68(__symbols);
    +        // CompFor = SingleForComprehension+ => ActionFn(169);
    +        let __sym0 = __pop_Variant67(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action175::<>(__sym0);
    +        let __nt = super::__action169::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant48(__nt), __end);
    -        (1, __symbol, 80)
    +        (1, __symbol, 94)
         }
    -    pub(crate) fn __reduce187<
    +    pub(crate) fn __reduce210<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33558,15 +37324,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompFor? = CompFor => ActionFn(194);
    +        // CompFor? = CompFor => ActionFn(188);
             let __sym0 = __pop_Variant48(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action194::<>(__sym0);
    +        let __nt = super::__action188::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant49(__nt), __end);
    -        (1, __symbol, 81)
    +        (1, __symbol, 95)
         }
    -    pub(crate) fn __reduce188<
    +    pub(crate) fn __reduce211<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33575,14 +37341,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompFor? =  => ActionFn(195);
    +        // CompFor? =  => ActionFn(189);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action195::<>(&__start, &__end);
    +        let __nt = super::__action189::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant49(__nt), __end);
    -        (0, __symbol, 81)
    +        (0, __symbol, 95)
         }
    -    pub(crate) fn __reduce189<
    +    pub(crate) fn __reduce212<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33591,15 +37357,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompOp = "==" => ActionFn(106);
    +        // CompOp = "==" => ActionFn(98);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action106::<>(__sym0);
    +        let __nt = super::__action98::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant50(__nt), __end);
    -        (1, __symbol, 82)
    +        (1, __symbol, 96)
         }
    -    pub(crate) fn __reduce190<
    +    pub(crate) fn __reduce213<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33608,15 +37374,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompOp = "!=" => ActionFn(107);
    +        // CompOp = "!=" => ActionFn(99);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action107::<>(__sym0);
    +        let __nt = super::__action99::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant50(__nt), __end);
    -        (1, __symbol, 82)
    +        (1, __symbol, 96)
         }
    -    pub(crate) fn __reduce191<
    +    pub(crate) fn __reduce214<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33625,15 +37391,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompOp = "<" => ActionFn(108);
    +        // CompOp = "<" => ActionFn(100);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action108::<>(__sym0);
    +        let __nt = super::__action100::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant50(__nt), __end);
    -        (1, __symbol, 82)
    +        (1, __symbol, 96)
         }
    -    pub(crate) fn __reduce192<
    +    pub(crate) fn __reduce215<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33642,15 +37408,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompOp = "<=" => ActionFn(109);
    +        // CompOp = "<=" => ActionFn(101);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action109::<>(__sym0);
    +        let __nt = super::__action101::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant50(__nt), __end);
    -        (1, __symbol, 82)
    +        (1, __symbol, 96)
         }
    -    pub(crate) fn __reduce193<
    +    pub(crate) fn __reduce216<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33659,15 +37425,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompOp = ">" => ActionFn(110);
    +        // CompOp = ">" => ActionFn(102);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action110::<>(__sym0);
    +        let __nt = super::__action102::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant50(__nt), __end);
    -        (1, __symbol, 82)
    +        (1, __symbol, 96)
         }
    -    pub(crate) fn __reduce194<
    +    pub(crate) fn __reduce217<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33676,15 +37442,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompOp = ">=" => ActionFn(111);
    +        // CompOp = ">=" => ActionFn(103);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action111::<>(__sym0);
    +        let __nt = super::__action103::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant50(__nt), __end);
    -        (1, __symbol, 82)
    +        (1, __symbol, 96)
         }
    -    pub(crate) fn __reduce195<
    +    pub(crate) fn __reduce218<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33693,15 +37459,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompOp = "in" => ActionFn(112);
    +        // CompOp = "in" => ActionFn(104);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action112::<>(__sym0);
    +        let __nt = super::__action104::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant50(__nt), __end);
    -        (1, __symbol, 82)
    +        (1, __symbol, 96)
         }
    -    pub(crate) fn __reduce196<
    +    pub(crate) fn __reduce219<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33710,16 +37476,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompOp = "not", "in" => ActionFn(113);
    +        // CompOp = "not", "in" => ActionFn(105);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action113::<>(__sym0, __sym1);
    +        let __nt = super::__action105::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant50(__nt), __end);
    -        (2, __symbol, 82)
    +        (2, __symbol, 96)
         }
    -    pub(crate) fn __reduce197<
    +    pub(crate) fn __reduce220<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33728,15 +37494,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompOp = "is" => ActionFn(114);
    +        // CompOp = "is" => ActionFn(106);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action114::<>(__sym0);
    +        let __nt = super::__action106::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant50(__nt), __end);
    -        (1, __symbol, 82)
    +        (1, __symbol, 96)
         }
    -    pub(crate) fn __reduce198<
    +    pub(crate) fn __reduce221<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33745,16 +37511,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // CompOp = "is", "not" => ActionFn(115);
    +        // CompOp = "is", "not" => ActionFn(107);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action115::<>(__sym0, __sym1);
    +        let __nt = super::__action107::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant50(__nt), __end);
    -        (2, __symbol, 82)
    +        (2, __symbol, 96)
         }
    -    pub(crate) fn __reduce199<
    +    pub(crate) fn __reduce222<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33763,17 +37529,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comparison = Comparison, CompOp, Expression => ActionFn(104);
    +        // Comparison = Comparison, CompOp, Expression => ActionFn(96);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant50(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action104::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action96::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 83)
    +        (3, __symbol, 97)
         }
    -    pub(crate) fn __reduce200<
    +    pub(crate) fn __reduce223<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33782,15 +37548,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Comparison = Expression => ActionFn(105);
    +        // Comparison = Expression => ActionFn(97);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action105::<>(__sym0);
    +        let __nt = super::__action97::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 83)
    +        (1, __symbol, 97)
         }
    -    pub(crate) fn __reduce201<
    +    pub(crate) fn __reduce224<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33805,9 +37571,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action62::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 84)
    +        (1, __symbol, 98)
         }
    -    pub(crate) fn __reduce202<
    +    pub(crate) fn __reduce225<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33822,9 +37588,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action63::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 84)
    +        (1, __symbol, 98)
         }
    -    pub(crate) fn __reduce203<
    +    pub(crate) fn __reduce226<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33839,9 +37605,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action64::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 84)
    +        (1, __symbol, 98)
         }
    -    pub(crate) fn __reduce204<
    +    pub(crate) fn __reduce227<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33856,9 +37622,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action65::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 84)
    +        (1, __symbol, 98)
         }
    -    pub(crate) fn __reduce205<
    +    pub(crate) fn __reduce228<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33873,9 +37639,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action66::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 84)
    +        (1, __symbol, 98)
         }
    -    pub(crate) fn __reduce206<
    +    pub(crate) fn __reduce229<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33890,9 +37656,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action67::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 84)
    +        (1, __symbol, 98)
         }
    -    pub(crate) fn __reduce207<
    +    pub(crate) fn __reduce230<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33907,9 +37673,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action68::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 84)
    +        (1, __symbol, 98)
         }
    -    pub(crate) fn __reduce208<
    +    pub(crate) fn __reduce231<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33918,16 +37684,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ComprehensionIf = "if", ExpressionNoCond => ActionFn(178);
    +        // ComprehensionIf = "if", ExpressionNoCond => ActionFn(172);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action178::<>(__sym0, __sym1);
    +        let __nt = super::__action172::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 85)
    +        (2, __symbol, 99)
         }
    -    pub(crate) fn __reduce209<
    +    pub(crate) fn __reduce232<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33936,14 +37702,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ComprehensionIf* =  => ActionFn(197);
    +        // ComprehensionIf* =  => ActionFn(191);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action197::<>(&__start, &__end);
    +        let __nt = super::__action191::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (0, __symbol, 86)
    +        (0, __symbol, 100)
         }
    -    pub(crate) fn __reduce210<
    +    pub(crate) fn __reduce233<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33952,15 +37718,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ComprehensionIf* = ComprehensionIf+ => ActionFn(198);
    +        // ComprehensionIf* = ComprehensionIf+ => ActionFn(192);
             let __sym0 = __pop_Variant45(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action198::<>(__sym0);
    +        let __nt = super::__action192::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (1, __symbol, 86)
    +        (1, __symbol, 100)
         }
    -    pub(crate) fn __reduce211<
    +    pub(crate) fn __reduce234<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33969,15 +37735,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ComprehensionIf+ = ComprehensionIf => ActionFn(332);
    +        // ComprehensionIf+ = ComprehensionIf => ActionFn(346);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action332::<>(__sym0);
    +        let __nt = super::__action346::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (1, __symbol, 87)
    +        (1, __symbol, 101)
         }
    -    pub(crate) fn __reduce212<
    +    pub(crate) fn __reduce235<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -33986,16 +37752,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ComprehensionIf+ = ComprehensionIf+, ComprehensionIf => ActionFn(333);
    +        // ComprehensionIf+ = ComprehensionIf+, ComprehensionIf => ActionFn(347);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant45(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action333::<>(__sym0, __sym1);
    +        let __nt = super::__action347::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (2, __symbol, 87)
    +        (2, __symbol, 101)
         }
    -    pub(crate) fn __reduce213<
    +    pub(crate) fn __reduce236<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34004,7 +37770,7 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Decorator = "@", Path, "(", ArgumentList, ")", "\\n" => ActionFn(368);
    +        // Decorator = "@", Path, "(", ArgumentList, ")", "\\n" => ActionFn(406);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant43(__symbols);
    @@ -34013,11 +37779,11 @@
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym5.2.clone();
    -        let __nt = super::__action368::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
    +        let __nt = super::__action406::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (6, __symbol, 88)
    +        (6, __symbol, 102)
         }
    -    pub(crate) fn __reduce214<
    +    pub(crate) fn __reduce237<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34026,17 +37792,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Decorator = "@", Path, "\\n" => ActionFn(369);
    +        // Decorator = "@", Path, "\\n" => ActionFn(407);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action369::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action407::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 88)
    +        (3, __symbol, 102)
         }
    -    pub(crate) fn __reduce215<
    +    pub(crate) fn __reduce238<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34050,9 +37816,9 @@
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action240::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (0, __symbol, 89)
    +        (0, __symbol, 103)
         }
    -    pub(crate) fn __reduce216<
    +    pub(crate) fn __reduce239<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34067,9 +37833,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action241::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (1, __symbol, 89)
    +        (1, __symbol, 103)
         }
    -    pub(crate) fn __reduce217<
    +    pub(crate) fn __reduce240<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34084,9 +37850,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action321::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (1, __symbol, 90)
    +        (1, __symbol, 104)
         }
    -    pub(crate) fn __reduce218<
    +    pub(crate) fn __reduce241<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34102,9 +37868,9 @@
             let __end = __sym1.2.clone();
             let __nt = super::__action322::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant45(__nt), __end);
    -        (2, __symbol, 90)
    +        (2, __symbol, 104)
         }
    -    pub(crate) fn __reduce219<
    +    pub(crate) fn __reduce242<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34113,16 +37879,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // DelStatement = "del", ExpressionList2 => ActionFn(482);
    +        // DelStatement = "del", ExpressionList2 => ActionFn(547);
             let __sym1 = __pop_Variant54(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action482::<>(__sym0, __sym1);
    +        let __nt = super::__action547::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (2, __symbol, 91)
    +        (2, __symbol, 105)
         }
    -    pub(crate) fn __reduce220<
    +    pub(crate) fn __reduce243<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34131,17 +37897,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // DictEntry = Test, ":", Test => ActionFn(168);
    +        // DictEntry = Test, ":", Test => ActionFn(162);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action168::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action162::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant51(__nt), __end);
    -        (3, __symbol, 92)
    +        (3, __symbol, 106)
         }
    -    pub(crate) fn __reduce221<
    +    pub(crate) fn __reduce244<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34156,9 +37922,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action57::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant5(__nt), __end);
    -        (1, __symbol, 93)
    +        (1, __symbol, 107)
         }
    -    pub(crate) fn __reduce222<
    +    pub(crate) fn __reduce245<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34174,9 +37940,9 @@
             let __end = __sym1.2.clone();
             let __nt = super::__action58::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant5(__nt), __end);
    -        (2, __symbol, 93)
    +        (2, __symbol, 107)
         }
    -    pub(crate) fn __reduce223<
    +    pub(crate) fn __reduce246<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34185,18 +37951,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExceptClause = "except", Test, ":", Suite => ActionFn(587);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        // ExceptClause = "except", Test, ":", Suite => ActionFn(645);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action587::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action645::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant52(__nt), __end);
    -        (4, __symbol, 94)
    +        (4, __symbol, 108)
         }
    -    pub(crate) fn __reduce224<
    +    pub(crate) fn __reduce247<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34205,17 +37971,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExceptClause = "except", ":", Suite => ActionFn(588);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        // ExceptClause = "except", ":", Suite => ActionFn(646);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action588::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action646::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant52(__nt), __end);
    -        (3, __symbol, 94)
    +        (3, __symbol, 108)
         }
    -    pub(crate) fn __reduce225<
    +    pub(crate) fn __reduce248<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34224,8 +37990,8 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExceptClause = "except", Test, "as", Identifier, ":", Suite => ActionFn(515);
    -        let __sym5 = __pop_Variant72(__symbols);
    +        // ExceptClause = "except", Test, "as", Identifier, ":", Suite => ActionFn(581);
    +        let __sym5 = __pop_Variant71(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant5(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
    @@ -34233,11 +37999,11 @@
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym5.2.clone();
    -        let __nt = super::__action515::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
    +        let __nt = super::__action581::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
             let __symbol = (__start, __Symbol::Variant52(__nt), __end);
    -        (6, __symbol, 94)
    +        (6, __symbol, 108)
         }
    -    pub(crate) fn __reduce226<
    +    pub(crate) fn __reduce249<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34251,9 +38017,9 @@
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action252::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant53(__nt), __end);
    -        (0, __symbol, 95)
    +        (0, __symbol, 109)
         }
    -    pub(crate) fn __reduce227<
    +    pub(crate) fn __reduce250<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34268,9 +38034,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action253::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant53(__nt), __end);
    -        (1, __symbol, 95)
    +        (1, __symbol, 109)
         }
    -    pub(crate) fn __reduce228<
    +    pub(crate) fn __reduce251<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34285,9 +38051,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action316::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant53(__nt), __end);
    -        (1, __symbol, 96)
    +        (1, __symbol, 110)
         }
    -    pub(crate) fn __reduce229<
    +    pub(crate) fn __reduce252<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34303,9 +38069,9 @@
             let __end = __sym1.2.clone();
             let __nt = super::__action317::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant53(__nt), __end);
    -        (2, __symbol, 96)
    +        (2, __symbol, 110)
         }
    -    pub(crate) fn __reduce230<
    +    pub(crate) fn __reduce253<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34314,17 +38080,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Expression = Expression, "|", XorExpression => ActionFn(116);
    +        // Expression = Expression, "|", XorExpression => ActionFn(108);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action116::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action108::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 97)
    +        (3, __symbol, 111)
         }
    -    pub(crate) fn __reduce231<
    +    pub(crate) fn __reduce254<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34333,15 +38099,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Expression = XorExpression => ActionFn(117);
    +        // Expression = XorExpression => ActionFn(109);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action117::<>(__sym0);
    +        let __nt = super::__action109::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 97)
    +        (1, __symbol, 111)
         }
    -    pub(crate) fn __reduce232<
    +    pub(crate) fn __reduce255<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34350,15 +38116,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExpressionList = ExpressionList2 => ActionFn(171);
    +        // ExpressionList = ExpressionList2 => ActionFn(165);
             let __sym0 = __pop_Variant54(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action171::<>(__sym0);
    +        let __nt = super::__action165::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 98)
    +        (1, __symbol, 112)
         }
    -    pub(crate) fn __reduce233<
    +    pub(crate) fn __reduce256<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34367,16 +38133,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExpressionList2 = Expression, "," => ActionFn(379);
    +        // ExpressionList2 = Expression, "," => ActionFn(417);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action379::<>(__sym0, __sym1);
    +        let __nt = super::__action417::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (2, __symbol, 99)
    +        (2, __symbol, 113)
         }
    -    pub(crate) fn __reduce234<
    +    pub(crate) fn __reduce257<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34385,17 +38151,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExpressionList2 = Expression, ("," Expression)+, "," => ActionFn(380);
    +        // ExpressionList2 = Expression, ("," Expression)+, "," => ActionFn(418);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action380::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action418::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (3, __symbol, 99)
    +        (3, __symbol, 113)
         }
    -    pub(crate) fn __reduce235<
    +    pub(crate) fn __reduce258<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34404,15 +38170,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExpressionList2 = Expression => ActionFn(381);
    +        // ExpressionList2 = Expression => ActionFn(419);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action381::<>(__sym0);
    +        let __nt = super::__action419::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (1, __symbol, 99)
    +        (1, __symbol, 113)
         }
    -    pub(crate) fn __reduce236<
    +    pub(crate) fn __reduce259<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34421,16 +38187,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExpressionList2 = Expression, ("," Expression)+ => ActionFn(382);
    +        // ExpressionList2 = Expression, ("," Expression)+ => ActionFn(420);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action382::<>(__sym0, __sym1);
    +        let __nt = super::__action420::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (2, __symbol, 99)
    +        (2, __symbol, 113)
         }
    -    pub(crate) fn __reduce237<
    +    pub(crate) fn __reduce260<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34439,15 +38205,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExpressionNoCond = OrTest => ActionFn(177);
    +        // ExpressionNoCond = OrTest => ActionFn(171);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action177::<>(__sym0);
    +        let __nt = super::__action171::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 100)
    +        (1, __symbol, 114)
         }
    -    pub(crate) fn __reduce238<
    +    pub(crate) fn __reduce261<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34456,15 +38222,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExpressionStatement = TestOrStarExprList => ActionFn(519);
    +        // ExpressionStatement = TestOrStarExprList => ActionFn(585);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action519::<>(__sym0);
    +        let __nt = super::__action585::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 101)
    +        (1, __symbol, 115)
         }
    -    pub(crate) fn __reduce239<
    +    pub(crate) fn __reduce262<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34473,16 +38239,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExpressionStatement = TestOrStarExprList, AssignSuffix+ => ActionFn(520);
    +        // ExpressionStatement = TestOrStarExprList, AssignSuffix+ => ActionFn(586);
             let __sym1 = __pop_Variant45(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action520::<>(__sym0, __sym1);
    +        let __nt = super::__action586::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (2, __symbol, 101)
    +        (2, __symbol, 115)
         }
    -    pub(crate) fn __reduce240<
    +    pub(crate) fn __reduce263<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34491,17 +38257,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExpressionStatement = TestOrStarExprList, AugAssign, Test => ActionFn(603);
    +        // ExpressionStatement = TestOrStarExprList, AugAssign, Test => ActionFn(661);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant41(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action603::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action661::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (3, __symbol, 101)
    +        (3, __symbol, 115)
         }
    -    pub(crate) fn __reduce241<
    +    pub(crate) fn __reduce264<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34510,18 +38276,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ExpressionStatement = TestOrStarExprList, AugAssign, Test, ("," Test)+ => ActionFn(604);
    +        // ExpressionStatement = TestOrStarExprList, AugAssign, Test, ("," Test)+ => ActionFn(662);
             let __sym3 = __pop_Variant15(__symbols);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant41(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action604::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action662::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (4, __symbol, 101)
    +        (4, __symbol, 115)
         }
    -    pub(crate) fn __reduce242<
    +    pub(crate) fn __reduce265<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34530,16 +38296,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Factor = "+", Factor => ActionFn(137);
    +        // Factor = "+", Factor => ActionFn(129);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action137::<>(__sym0, __sym1);
    +        let __nt = super::__action129::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 102)
    +        (2, __symbol, 116)
         }
    -    pub(crate) fn __reduce243<
    +    pub(crate) fn __reduce266<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34548,16 +38314,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Factor = "-", Factor => ActionFn(138);
    +        // Factor = "-", Factor => ActionFn(130);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action138::<>(__sym0, __sym1);
    +        let __nt = super::__action130::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 102)
    +        (2, __symbol, 116)
         }
    -    pub(crate) fn __reduce244<
    +    pub(crate) fn __reduce267<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34566,16 +38332,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Factor = "~", Factor => ActionFn(139);
    +        // Factor = "~", Factor => ActionFn(131);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action139::<>(__sym0, __sym1);
    +        let __nt = super::__action131::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 102)
    +        (2, __symbol, 116)
         }
    -    pub(crate) fn __reduce245<
    +    pub(crate) fn __reduce268<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34584,15 +38350,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Factor = Power => ActionFn(140);
    +        // Factor = Power => ActionFn(132);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action140::<>(__sym0);
    +        let __nt = super::__action132::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 102)
    +        (1, __symbol, 116)
         }
    -    pub(crate) fn __reduce246<
    +    pub(crate) fn __reduce269<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34607,9 +38373,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action5::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant55(__nt), __end);
    -        (1, __symbol, 103)
    +        (1, __symbol, 117)
         }
    -    pub(crate) fn __reduce247<
    +    pub(crate) fn __reduce270<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34624,9 +38390,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action6::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant55(__nt), __end);
    -        (1, __symbol, 103)
    +        (1, __symbol, 117)
         }
    -    pub(crate) fn __reduce248<
    +    pub(crate) fn __reduce271<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34640,9 +38406,9 @@
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action290::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant56(__nt), __end);
    -        (0, __symbol, 104)
    +        (0, __symbol, 118)
         }
    -    pub(crate) fn __reduce249<
    +    pub(crate) fn __reduce272<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34657,9 +38423,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action291::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant56(__nt), __end);
    -        (1, __symbol, 104)
    +        (1, __symbol, 118)
         }
    -    pub(crate) fn __reduce250<
    +    pub(crate) fn __reduce273<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34674,9 +38440,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action292::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant56(__nt), __end);
    -        (1, __symbol, 105)
    +        (1, __symbol, 119)
         }
    -    pub(crate) fn __reduce251<
    +    pub(crate) fn __reduce274<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34692,9 +38458,9 @@
             let __end = __sym1.2.clone();
             let __nt = super::__action293::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant56(__nt), __end);
    -        (2, __symbol, 105)
    +        (2, __symbol, 119)
         }
    -    pub(crate) fn __reduce252<
    +    pub(crate) fn __reduce275<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34703,15 +38469,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FlowStatement = "break" => ActionFn(485);
    +        // FlowStatement = "break" => ActionFn(550);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action485::<>(__sym0);
    +        let __nt = super::__action550::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 106)
    +        (1, __symbol, 120)
         }
    -    pub(crate) fn __reduce253<
    +    pub(crate) fn __reduce276<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34720,15 +38486,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FlowStatement = "continue" => ActionFn(486);
    +        // FlowStatement = "continue" => ActionFn(551);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action486::<>(__sym0);
    +        let __nt = super::__action551::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 106)
    +        (1, __symbol, 120)
         }
    -    pub(crate) fn __reduce254<
    +    pub(crate) fn __reduce277<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34737,16 +38503,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FlowStatement = "return", Test => ActionFn(617);
    +        // FlowStatement = "return", Test => ActionFn(675);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action617::<>(__sym0, __sym1);
    +        let __nt = super::__action675::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (2, __symbol, 106)
    +        (2, __symbol, 120)
         }
    -    pub(crate) fn __reduce255<
    +    pub(crate) fn __reduce278<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34755,17 +38521,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FlowStatement = "return", Test, ("," Test)+ => ActionFn(618);
    +        // FlowStatement = "return", Test, ("," Test)+ => ActionFn(676);
             let __sym2 = __pop_Variant15(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action618::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action676::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (3, __symbol, 106)
    +        (3, __symbol, 120)
         }
    -    pub(crate) fn __reduce256<
    +    pub(crate) fn __reduce279<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34774,15 +38540,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FlowStatement = "return" => ActionFn(619);
    +        // FlowStatement = "return" => ActionFn(677);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action619::<>(__sym0);
    +        let __nt = super::__action677::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 106)
    +        (1, __symbol, 120)
         }
    -    pub(crate) fn __reduce257<
    +    pub(crate) fn __reduce280<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34791,15 +38557,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FlowStatement = YieldExpr => ActionFn(488);
    +        // FlowStatement = YieldExpr => ActionFn(553);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action488::<>(__sym0);
    +        let __nt = super::__action553::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 106)
    +        (1, __symbol, 120)
         }
    -    pub(crate) fn __reduce258<
    +    pub(crate) fn __reduce281<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34814,9 +38580,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action47::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 106)
    +        (1, __symbol, 120)
         }
    -    pub(crate) fn __reduce259<
    +    pub(crate) fn __reduce282<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34825,11 +38591,11 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ForStatement = "for", ExpressionList, "in", Test, ":", Suite, "else", ":", Suite => ActionFn(605);
    -        let __sym8 = __pop_Variant72(__symbols);
    +        // ForStatement = "for", ExpressionList, "in", Test, ":", Suite, "else", ":", Suite => ActionFn(663);
    +        let __sym8 = __pop_Variant71(__symbols);
             let __sym7 = __pop_Variant0(__symbols);
             let __sym6 = __pop_Variant0(__symbols);
    -        let __sym5 = __pop_Variant72(__symbols);
    +        let __sym5 = __pop_Variant71(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant42(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
    @@ -34837,11 +38603,11 @@
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym8.2.clone();
    -        let __nt = super::__action605::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
    +        let __nt = super::__action663::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (9, __symbol, 107)
    +        (9, __symbol, 121)
         }
    -    pub(crate) fn __reduce260<
    +    pub(crate) fn __reduce283<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34850,11 +38616,11 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ForStatement = "for", ExpressionList, "in", Test, ("," Test)+, ":", Suite, "else", ":", Suite => ActionFn(606);
    -        let __sym9 = __pop_Variant72(__symbols);
    +        // ForStatement = "for", ExpressionList, "in", Test, ("," Test)+, ":", Suite, "else", ":", Suite => ActionFn(664);
    +        let __sym9 = __pop_Variant71(__symbols);
             let __sym8 = __pop_Variant0(__symbols);
             let __sym7 = __pop_Variant0(__symbols);
    -        let __sym6 = __pop_Variant72(__symbols);
    +        let __sym6 = __pop_Variant71(__symbols);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant15(__symbols);
             let __sym3 = __pop_Variant42(__symbols);
    @@ -34863,11 +38629,11 @@
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym9.2.clone();
    -        let __nt = super::__action606::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
    +        let __nt = super::__action664::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (10, __symbol, 107)
    +        (10, __symbol, 121)
         }
    -    pub(crate) fn __reduce261<
    +    pub(crate) fn __reduce284<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34876,8 +38642,8 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ForStatement = "for", ExpressionList, "in", Test, ":", Suite => ActionFn(607);
    -        let __sym5 = __pop_Variant72(__symbols);
    +        // ForStatement = "for", ExpressionList, "in", Test, ":", Suite => ActionFn(665);
    +        let __sym5 = __pop_Variant71(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant42(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
    @@ -34885,11 +38651,11 @@
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym5.2.clone();
    -        let __nt = super::__action607::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
    +        let __nt = super::__action665::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (6, __symbol, 107)
    +        (6, __symbol, 121)
         }
    -    pub(crate) fn __reduce262<
    +    pub(crate) fn __reduce285<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34898,8 +38664,8 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ForStatement = "for", ExpressionList, "in", Test, ("," Test)+, ":", Suite => ActionFn(608);
    -        let __sym6 = __pop_Variant72(__symbols);
    +        // ForStatement = "for", ExpressionList, "in", Test, ("," Test)+, ":", Suite => ActionFn(666);
    +        let __sym6 = __pop_Variant71(__symbols);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant15(__symbols);
             let __sym3 = __pop_Variant42(__symbols);
    @@ -34908,11 +38674,58 @@
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym6.2.clone();
    -        let __nt = super::__action608::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
    +        let __nt = super::__action666::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (7, __symbol, 107)
    +        (7, __symbol, 121)
         }
    -    pub(crate) fn __reduce263<
    +    pub(crate) fn __reduce286<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // FuncDef = "def", Identifier, Parameters, "->", Test, ":", Suite => ActionFn(595);
    +        let __sym6 = __pop_Variant71(__symbols);
    +        let __sym5 = __pop_Variant0(__symbols);
    +        let __sym4 = __pop_Variant42(__symbols);
    +        let __sym3 = __pop_Variant0(__symbols);
    +        let __sym2 = __pop_Variant38(__symbols);
    +        let __sym1 = __pop_Variant5(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym6.2.clone();
    +        let __nt = super::__action595::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
    +        let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    +        (7, __symbol, 122)
    +    }
    +    pub(crate) fn __reduce287<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // FuncDef = Decorator+, "def", Identifier, Parameters, "->", Test, ":", Suite => ActionFn(596);
    +        let __sym7 = __pop_Variant71(__symbols);
    +        let __sym6 = __pop_Variant0(__symbols);
    +        let __sym5 = __pop_Variant42(__symbols);
    +        let __sym4 = __pop_Variant0(__symbols);
    +        let __sym3 = __pop_Variant38(__symbols);
    +        let __sym2 = __pop_Variant5(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant45(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym7.2.clone();
    +        let __nt = super::__action596::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
    +        let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    +        (8, __symbol, 122)
    +    }
    +    pub(crate) fn __reduce288<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34921,19 +38734,19 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FuncDef = "def", Identifier, Parameters, ":", Suite => ActionFn(529);
    -        let __sym4 = __pop_Variant72(__symbols);
    +        // FuncDef = "def", Identifier, Parameters, ":", Suite => ActionFn(597);
    +        let __sym4 = __pop_Variant71(__symbols);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant38(__symbols);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action529::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __nt = super::__action597::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (5, __symbol, 108)
    +        (5, __symbol, 122)
         }
    -    pub(crate) fn __reduce264<
    +    pub(crate) fn __reduce289<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34942,8 +38755,8 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FuncDef = Decorator+, "def", Identifier, Parameters, ":", Suite => ActionFn(530);
    -        let __sym5 = __pop_Variant72(__symbols);
    +        // FuncDef = Decorator+, "def", Identifier, Parameters, ":", Suite => ActionFn(598);
    +        let __sym5 = __pop_Variant71(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant38(__symbols);
             let __sym2 = __pop_Variant5(__symbols);
    @@ -34951,11 +38764,11 @@
             let __sym0 = __pop_Variant45(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym5.2.clone();
    -        let __nt = super::__action530::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
    +        let __nt = super::__action598::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (6, __symbol, 108)
    +        (6, __symbol, 122)
         }
    -    pub(crate) fn __reduce265<
    +    pub(crate) fn __reduce290<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34964,16 +38777,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FunctionArgument = Test, CompFor => ActionFn(521);
    +        // FunctionArgument = Test, CompFor => ActionFn(587);
             let __sym1 = __pop_Variant48(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action521::<>(__sym0, __sym1);
    +        let __nt = super::__action587::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant31(__nt), __end);
    -        (2, __symbol, 109)
    +        (2, __symbol, 123)
         }
    -    pub(crate) fn __reduce266<
    +    pub(crate) fn __reduce291<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34982,15 +38795,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FunctionArgument = Test => ActionFn(522);
    +        // FunctionArgument = Test => ActionFn(588);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action522::<>(__sym0);
    +        let __nt = super::__action588::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant31(__nt), __end);
    -        (1, __symbol, 109)
    +        (1, __symbol, 123)
         }
    -    pub(crate) fn __reduce267<
    +    pub(crate) fn __reduce292<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -34999,17 +38812,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FunctionArgument = Identifier, "=", Test => ActionFn(181);
    +        // FunctionArgument = Identifier, "=", Test => ActionFn(175);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action181::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action175::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant31(__nt), __end);
    -        (3, __symbol, 109)
    +        (3, __symbol, 123)
         }
    -    pub(crate) fn __reduce268<
    +    pub(crate) fn __reduce293<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35018,16 +38831,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FunctionArgument = "*", Test => ActionFn(182);
    +        // FunctionArgument = "*", Test => ActionFn(176);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action182::<>(__sym0, __sym1);
    +        let __nt = super::__action176::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant31(__nt), __end);
    -        (2, __symbol, 109)
    +        (2, __symbol, 123)
         }
    -    pub(crate) fn __reduce269<
    +    pub(crate) fn __reduce294<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35036,16 +38849,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FunctionArgument = "**", Test => ActionFn(183);
    +        // FunctionArgument = "**", Test => ActionFn(177);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action183::<>(__sym0, __sym1);
    +        let __nt = super::__action177::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant31(__nt), __end);
    -        (2, __symbol, 109)
    +        (2, __symbol, 123)
         }
    -    pub(crate) fn __reduce270<
    +    pub(crate) fn __reduce295<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35054,15 +38867,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FunctionArgument? = FunctionArgument => ActionFn(334);
    +        // FunctionArgument? = FunctionArgument => ActionFn(348);
             let __sym0 = __pop_Variant31(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action334::<>(__sym0);
    +        let __nt = super::__action348::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant57(__nt), __end);
    -        (1, __symbol, 110)
    +        (1, __symbol, 124)
         }
    -    pub(crate) fn __reduce271<
    +    pub(crate) fn __reduce296<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35071,14 +38884,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // FunctionArgument? =  => ActionFn(335);
    +        // FunctionArgument? =  => ActionFn(349);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action335::<>(&__start, &__end);
    +        let __nt = super::__action349::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant57(__nt), __end);
    -        (0, __symbol, 110)
    +        (0, __symbol, 124)
         }
    -    pub(crate) fn __reduce272<
    +    pub(crate) fn __reduce297<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35087,16 +38900,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // GlobalStatement = "global", Identifier => ActionFn(571);
    +        // GlobalStatement = "global", Identifier => ActionFn(629);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action571::<>(__sym0, __sym1);
    +        let __nt = super::__action629::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (2, __symbol, 111)
    +        (2, __symbol, 125)
         }
    -    pub(crate) fn __reduce273<
    +    pub(crate) fn __reduce298<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35105,17 +38918,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // GlobalStatement = "global", Identifier, ("," Identifier)+ => ActionFn(572);
    +        // GlobalStatement = "global", Identifier, ("," Identifier)+ => ActionFn(630);
             let __sym2 = __pop_Variant17(__symbols);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action572::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action630::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (3, __symbol, 111)
    +        (3, __symbol, 125)
         }
    -    pub(crate) fn __reduce274<
    +    pub(crate) fn __reduce299<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35124,48 +38937,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Identifier = name => ActionFn(189);
    +        // Identifier = name => ActionFn(183);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action189::<>(__sym0);
    +        let __nt = super::__action183::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant5(__nt), __end);
    -        (1, __symbol, 112)
    -    }
    -    pub(crate) fn __reduce275<
    -    >(
    -        __action: i16,
    -        __lookahead_start: Option<&lexer::Location>,
    -        __states: &mut ::std::vec::Vec<i16>,
    -        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    -        _: ::std::marker::PhantomData<()>,
    -    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    -    {
    -        // Identifier? = Identifier => ActionFn(228);
    -        let __sym0 = __pop_Variant5(__symbols);
    -        let __start = __sym0.0.clone();
    -        let __end = __sym0.2.clone();
    -        let __nt = super::__action228::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant58(__nt), __end);
    -        (1, __symbol, 113)
    -    }
    -    pub(crate) fn __reduce276<
    -    >(
    -        __action: i16,
    -        __lookahead_start: Option<&lexer::Location>,
    -        __states: &mut ::std::vec::Vec<i16>,
    -        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    -        _: ::std::marker::PhantomData<()>,
    -    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    -    {
    -        // Identifier? =  => ActionFn(229);
    -        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    -        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action229::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant58(__nt), __end);
    -        (0, __symbol, 113)
    +        (1, __symbol, 126)
         }
    -    pub(crate) fn __reduce277<
    +    pub(crate) fn __reduce300<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35174,21 +38954,21 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // IfStatement = "if", Test, ":", Suite, "else", ":", Suite => ActionFn(511);
    -        let __sym6 = __pop_Variant72(__symbols);
    +        // IfStatement = "if", Test, ":", Suite, "else", ":", Suite => ActionFn(577);
    +        let __sym6 = __pop_Variant71(__symbols);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym6.2.clone();
    -        let __nt = super::__action511::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
    +        let __nt = super::__action577::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (7, __symbol, 114)
    +        (7, __symbol, 127)
         }
    -    pub(crate) fn __reduce278<
    +    pub(crate) fn __reduce301<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35197,22 +38977,22 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // IfStatement = "if", Test, ":", Suite, (@L "elif" Test ":" Suite)+, "else", ":", Suite => ActionFn(512);
    -        let __sym7 = __pop_Variant72(__symbols);
    +        // IfStatement = "if", Test, ":", Suite, (@L "elif" Test ":" Suite)+, "else", ":", Suite => ActionFn(578);
    +        let __sym7 = __pop_Variant71(__symbols);
             let __sym6 = __pop_Variant0(__symbols);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant36(__symbols);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym7.2.clone();
    -        let __nt = super::__action512::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
    +        let __nt = super::__action578::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (8, __symbol, 114)
    +        (8, __symbol, 127)
         }
    -    pub(crate) fn __reduce279<
    +    pub(crate) fn __reduce302<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35221,18 +39001,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // IfStatement = "if", Test, ":", Suite => ActionFn(513);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        // IfStatement = "if", Test, ":", Suite => ActionFn(579);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action513::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action579::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (4, __symbol, 114)
    +        (4, __symbol, 127)
         }
    -    pub(crate) fn __reduce280<
    +    pub(crate) fn __reduce303<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35241,19 +39021,19 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // IfStatement = "if", Test, ":", Suite, (@L "elif" Test ":" Suite)+ => ActionFn(514);
    +        // IfStatement = "if", Test, ":", Suite, (@L "elif" Test ":" Suite)+ => ActionFn(580);
             let __sym4 = __pop_Variant36(__symbols);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action514::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __nt = super::__action580::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (5, __symbol, 114)
    +        (5, __symbol, 127)
         }
    -    pub(crate) fn __reduce281<
    +    pub(crate) fn __reduce304<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35268,9 +39048,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action54::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (1, __symbol, 115)
    +        (1, __symbol, 128)
         }
    -    pub(crate) fn __reduce282<
    +    pub(crate) fn __reduce305<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35287,9 +39067,9 @@
             let __end = __sym2.2.clone();
             let __nt = super::__action55::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (3, __symbol, 115)
    +        (3, __symbol, 128)
         }
    -    pub(crate) fn __reduce283<
    +    pub(crate) fn __reduce306<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35304,9 +39084,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action56::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant47(__nt), __end);
    -        (1, __symbol, 115)
    +        (1, __symbol, 128)
         }
    -    pub(crate) fn __reduce284<
    +    pub(crate) fn __reduce307<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35315,15 +39095,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportFromLocation = DottedName => ActionFn(363);
    +        // ImportFromLocation = DottedName => ActionFn(401);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action363::<>(__sym0);
    +        let __nt = super::__action401::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant5(__nt), __end);
    -        (1, __symbol, 116)
    +        (1, __symbol, 129)
         }
    -    pub(crate) fn __reduce285<
    +    pub(crate) fn __reduce308<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35332,16 +39112,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportFromLocation = "."+, DottedName => ActionFn(364);
    +        // ImportFromLocation = "."+, DottedName => ActionFn(402);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant8(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action364::<>(__sym0, __sym1);
    +        let __nt = super::__action402::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant5(__nt), __end);
    -        (2, __symbol, 116)
    +        (2, __symbol, 129)
         }
    -    pub(crate) fn __reduce286<
    +    pub(crate) fn __reduce309<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35356,9 +39136,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action53::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant5(__nt), __end);
    -        (1, __symbol, 116)
    +        (1, __symbol, 129)
         }
    -    pub(crate) fn __reduce287<
    +    pub(crate) fn __reduce310<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35367,17 +39147,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportPart<<DottedName>> = DottedName, "as", Identifier => ActionFn(429);
    +        // ImportPart<<DottedName>> = DottedName, "as", Identifier => ActionFn(494);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action429::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action494::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant33(__nt), __end);
    -        (3, __symbol, 117)
    +        (3, __symbol, 130)
         }
    -    pub(crate) fn __reduce288<
    +    pub(crate) fn __reduce311<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35386,15 +39166,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportPart<<DottedName>> = DottedName => ActionFn(430);
    +        // ImportPart<<DottedName>> = DottedName => ActionFn(495);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action430::<>(__sym0);
    +        let __nt = super::__action495::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant33(__nt), __end);
    -        (1, __symbol, 117)
    +        (1, __symbol, 130)
         }
    -    pub(crate) fn __reduce289<
    +    pub(crate) fn __reduce312<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35403,17 +39183,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportPart<<DottedName>>? = DottedName, "as", Identifier => ActionFn(459);
    +        // ImportPart<<DottedName>>? = DottedName, "as", Identifier => ActionFn(524);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action459::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant59(__nt), __end);
    -        (3, __symbol, 118)
    +        let __nt = super::__action524::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant58(__nt), __end);
    +        (3, __symbol, 131)
         }
    -    pub(crate) fn __reduce290<
    +    pub(crate) fn __reduce313<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35422,15 +39202,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportPart<<DottedName>>? = DottedName => ActionFn(460);
    +        // ImportPart<<DottedName>>? = DottedName => ActionFn(525);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action460::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant59(__nt), __end);
    -        (1, __symbol, 118)
    +        let __nt = super::__action525::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant58(__nt), __end);
    +        (1, __symbol, 131)
         }
    -    pub(crate) fn __reduce291<
    +    pub(crate) fn __reduce314<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35443,10 +39223,10 @@
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action299::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant59(__nt), __end);
    -        (0, __symbol, 118)
    +        let __symbol = (__start, __Symbol::Variant58(__nt), __end);
    +        (0, __symbol, 131)
         }
    -    pub(crate) fn __reduce292<
    +    pub(crate) fn __reduce315<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35455,17 +39235,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportPart<Identifier> = Identifier, "as", Identifier => ActionFn(431);
    +        // ImportPart<Identifier> = Identifier, "as", Identifier => ActionFn(496);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action431::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action496::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant33(__nt), __end);
    -        (3, __symbol, 119)
    +        (3, __symbol, 132)
         }
    -    pub(crate) fn __reduce293<
    +    pub(crate) fn __reduce316<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35474,15 +39254,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportPart<Identifier> = Identifier => ActionFn(432);
    +        // ImportPart<Identifier> = Identifier => ActionFn(497);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action432::<>(__sym0);
    +        let __nt = super::__action497::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant33(__nt), __end);
    -        (1, __symbol, 119)
    +        (1, __symbol, 132)
         }
    -    pub(crate) fn __reduce294<
    +    pub(crate) fn __reduce317<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35491,17 +39271,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportPart<Identifier>? = Identifier, "as", Identifier => ActionFn(469);
    +        // ImportPart<Identifier>? = Identifier, "as", Identifier => ActionFn(534);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action469::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant59(__nt), __end);
    -        (3, __symbol, 120)
    +        let __nt = super::__action534::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant58(__nt), __end);
    +        (3, __symbol, 133)
         }
    -    pub(crate) fn __reduce295<
    +    pub(crate) fn __reduce318<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35510,15 +39290,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportPart<Identifier>? = Identifier => ActionFn(470);
    +        // ImportPart<Identifier>? = Identifier => ActionFn(535);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action470::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant59(__nt), __end);
    -        (1, __symbol, 120)
    +        let __nt = super::__action535::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant58(__nt), __end);
    +        (1, __symbol, 133)
         }
    -    pub(crate) fn __reduce296<
    +    pub(crate) fn __reduce319<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35531,10 +39311,10 @@
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action307::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant59(__nt), __end);
    -        (0, __symbol, 120)
    +        let __symbol = (__start, __Symbol::Variant58(__nt), __end);
    +        (0, __symbol, 133)
         }
    -    pub(crate) fn __reduce297<
    +    pub(crate) fn __reduce320<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35543,16 +39323,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportStatement = "import", Comma<ImportPart<<DottedName>>> => ActionFn(495);
    +        // ImportStatement = "import", Comma<ImportPart<<DottedName>>> => ActionFn(561);
             let __sym1 = __pop_Variant47(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action495::<>(__sym0, __sym1);
    +        let __nt = super::__action561::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (2, __symbol, 121)
    +        (2, __symbol, 134)
         }
    -    pub(crate) fn __reduce298<
    +    pub(crate) fn __reduce321<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35561,18 +39341,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ImportStatement = "from", ImportFromLocation, "import", ImportAsNames => ActionFn(496);
    +        // ImportStatement = "from", ImportFromLocation, "import", ImportAsNames => ActionFn(562);
             let __sym3 = __pop_Variant47(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action496::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action562::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (4, __symbol, 121)
    +        (4, __symbol, 134)
         }
    -    pub(crate) fn __reduce299<
    +    pub(crate) fn __reduce322<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35581,16 +39361,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // KwargParameter = "**", Identifier => ActionFn(545);
    -        let __sym1 = __pop_Variant5(__symbols);
    +        // KwargParameter<TypedParameter> = "**", TypedParameter => ActionFn(685);
    +        let __sym1 = __pop_Variant75(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action545::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant60(__nt), __end);
    -        (2, __symbol, 122)
    +        let __nt = super::__action685::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant59(__nt), __end);
    +        (2, __symbol, 135)
         }
    -    pub(crate) fn __reduce300<
    +    pub(crate) fn __reduce323<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35599,15 +39379,50 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // KwargParameter = "**" => ActionFn(546);
    +        // KwargParameter<TypedParameter> = "**" => ActionFn(686);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action546::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant60(__nt), __end);
    -        (1, __symbol, 122)
    +        let __nt = super::__action686::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant59(__nt), __end);
    +        (1, __symbol, 135)
         }
    -    pub(crate) fn __reduce301<
    +    pub(crate) fn __reduce324<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // KwargParameter<UntypedParameter> = "**", UntypedParameter => ActionFn(707);
    +        let __sym1 = __pop_Variant75(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action707::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant59(__nt), __end);
    +        (2, __symbol, 136)
    +    }
    +    pub(crate) fn __reduce325<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // KwargParameter<UntypedParameter> = "**" => ActionFn(708);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action708::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant59(__nt), __end);
    +        (1, __symbol, 136)
    +    }
    +    pub(crate) fn __reduce326<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35616,18 +39431,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // LambdaDef = "lambda", TypedArgsList, ":", Test => ActionFn(625);
    +        // LambdaDef = "lambda", TypedArgsList<UntypedParameter>, ":", Test => ActionFn(683);
             let __sym3 = __pop_Variant42(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant38(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action625::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action683::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (4, __symbol, 123)
    +        (4, __symbol, 137)
         }
    -    pub(crate) fn __reduce302<
    +    pub(crate) fn __reduce327<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35636,17 +39451,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // LambdaDef = "lambda", ":", Test => ActionFn(626);
    +        // LambdaDef = "lambda", ":", Test => ActionFn(684);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action626::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action684::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 123)
    +        (3, __symbol, 137)
         }
    -    pub(crate) fn __reduce303<
    +    pub(crate) fn __reduce328<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35655,15 +39470,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // MulOp = "*" => ActionFn(132);
    +        // MulOp = "*" => ActionFn(124);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action132::<>(__sym0);
    +        let __nt = super::__action124::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 124)
    +        (1, __symbol, 138)
         }
    -    pub(crate) fn __reduce304<
    +    pub(crate) fn __reduce329<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35672,15 +39487,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // MulOp = "/" => ActionFn(133);
    +        // MulOp = "/" => ActionFn(125);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action133::<>(__sym0);
    +        let __nt = super::__action125::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 124)
    +        (1, __symbol, 138)
         }
    -    pub(crate) fn __reduce305<
    +    pub(crate) fn __reduce330<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35689,15 +39504,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // MulOp = "//" => ActionFn(134);
    +        // MulOp = "//" => ActionFn(126);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action134::<>(__sym0);
    +        let __nt = super::__action126::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 124)
    +        (1, __symbol, 138)
         }
    -    pub(crate) fn __reduce306<
    +    pub(crate) fn __reduce331<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35706,15 +39521,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // MulOp = "%" => ActionFn(135);
    +        // MulOp = "%" => ActionFn(127);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action135::<>(__sym0);
    +        let __nt = super::__action127::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 124)
    +        (1, __symbol, 138)
         }
    -    pub(crate) fn __reduce307<
    +    pub(crate) fn __reduce332<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35723,15 +39538,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // MulOp = "@" => ActionFn(136);
    +        // MulOp = "@" => ActionFn(128);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action136::<>(__sym0);
    +        let __nt = super::__action128::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 124)
    +        (1, __symbol, 138)
         }
    -    pub(crate) fn __reduce308<
    +    pub(crate) fn __reduce333<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35740,16 +39555,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // NonlocalStatement = "nonlocal", Identifier => ActionFn(573);
    +        // NonlocalStatement = "nonlocal", Identifier => ActionFn(631);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action573::<>(__sym0, __sym1);
    +        let __nt = super::__action631::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (2, __symbol, 125)
    +        (2, __symbol, 139)
         }
    -    pub(crate) fn __reduce309<
    +    pub(crate) fn __reduce334<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35758,17 +39573,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // NonlocalStatement = "nonlocal", Identifier, ("," Identifier)+ => ActionFn(574);
    +        // NonlocalStatement = "nonlocal", Identifier, ("," Identifier)+ => ActionFn(632);
             let __sym2 = __pop_Variant17(__symbols);
             let __sym1 = __pop_Variant5(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action574::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action632::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (3, __symbol, 125)
    +        (3, __symbol, 139)
         }
    -    pub(crate) fn __reduce310<
    +    pub(crate) fn __reduce335<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35777,16 +39592,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // NotTest = "not", NotTest => ActionFn(102);
    +        // NotTest = "not", NotTest => ActionFn(94);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action102::<>(__sym0, __sym1);
    +        let __nt = super::__action94::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 126)
    +        (2, __symbol, 140)
         }
    -    pub(crate) fn __reduce311<
    +    pub(crate) fn __reduce336<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35795,15 +39610,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // NotTest = Comparison => ActionFn(103);
    +        // NotTest = Comparison => ActionFn(95);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action103::<>(__sym0);
    +        let __nt = super::__action95::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 126)
    +        (1, __symbol, 140)
         }
    -    pub(crate) fn __reduce312<
    +    pub(crate) fn __reduce337<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35812,15 +39627,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Number = int => ActionFn(184);
    +        // Number = int => ActionFn(178);
             let __sym0 = __pop_Variant4(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action184::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant61(__nt), __end);
    -        (1, __symbol, 127)
    +        let __nt = super::__action178::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant60(__nt), __end);
    +        (1, __symbol, 141)
         }
    -    pub(crate) fn __reduce313<
    +    pub(crate) fn __reduce338<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35829,15 +39644,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Number = float => ActionFn(185);
    +        // Number = float => ActionFn(179);
             let __sym0 = __pop_Variant3(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action185::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant61(__nt), __end);
    -        (1, __symbol, 127)
    +        let __nt = super::__action179::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant60(__nt), __end);
    +        (1, __symbol, 141)
         }
    -    pub(crate) fn __reduce314<
    +    pub(crate) fn __reduce339<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35846,15 +39661,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Number = complex => ActionFn(186);
    +        // Number = complex => ActionFn(180);
             let __sym0 = __pop_Variant2(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action186::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant61(__nt), __end);
    -        (1, __symbol, 127)
    +        let __nt = super::__action180::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant60(__nt), __end);
    +        (1, __symbol, 141)
         }
    -    pub(crate) fn __reduce315<
    +    pub(crate) fn __reduce340<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35863,15 +39678,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OneOrMore<DictEntry> = DictEntry => ActionFn(375);
    +        // OneOrMore<DictEntry> = DictEntry => ActionFn(413);
             let __sym0 = __pop_Variant51(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action375::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant62(__nt), __end);
    -        (1, __symbol, 128)
    +        let __nt = super::__action413::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant61(__nt), __end);
    +        (1, __symbol, 142)
         }
    -    pub(crate) fn __reduce316<
    +    pub(crate) fn __reduce341<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35880,16 +39695,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OneOrMore<DictEntry> = DictEntry, ("," DictEntry)+ => ActionFn(376);
    +        // OneOrMore<DictEntry> = DictEntry, ("," DictEntry)+ => ActionFn(414);
             let __sym1 = __pop_Variant14(__symbols);
             let __sym0 = __pop_Variant51(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action376::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant62(__nt), __end);
    -        (2, __symbol, 128)
    +        let __nt = super::__action414::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant61(__nt), __end);
    +        (2, __symbol, 142)
         }
    -    pub(crate) fn __reduce317<
    +    pub(crate) fn __reduce342<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35898,15 +39713,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OneOrMore<Identifier> = Identifier => ActionFn(385);
    +        // OneOrMore<Identifier> = Identifier => ActionFn(423);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action385::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant63(__nt), __end);
    -        (1, __symbol, 129)
    +        let __nt = super::__action423::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant62(__nt), __end);
    +        (1, __symbol, 143)
         }
    -    pub(crate) fn __reduce318<
    +    pub(crate) fn __reduce343<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35915,16 +39730,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OneOrMore<Identifier> = Identifier, ("," Identifier)+ => ActionFn(386);
    +        // OneOrMore<Identifier> = Identifier, ("," Identifier)+ => ActionFn(424);
             let __sym1 = __pop_Variant17(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action386::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant63(__nt), __end);
    -        (2, __symbol, 129)
    +        let __nt = super::__action424::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant62(__nt), __end);
    +        (2, __symbol, 143)
         }
    -    pub(crate) fn __reduce319<
    +    pub(crate) fn __reduce344<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35933,15 +39748,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OneOrMore<Test> = Test => ActionFn(397);
    +        // OneOrMore<Test> = Test => ActionFn(448);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action397::<>(__sym0);
    +        let __nt = super::__action448::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (1, __symbol, 130)
    +        (1, __symbol, 144)
         }
    -    pub(crate) fn __reduce320<
    +    pub(crate) fn __reduce345<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35950,16 +39765,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OneOrMore<Test> = Test, ("," Test)+ => ActionFn(398);
    +        // OneOrMore<Test> = Test, ("," Test)+ => ActionFn(449);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action398::<>(__sym0, __sym1);
    +        let __nt = super::__action449::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (2, __symbol, 130)
    +        (2, __symbol, 144)
         }
    -    pub(crate) fn __reduce321<
    +    pub(crate) fn __reduce346<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35968,15 +39783,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OneOrMore<TestOrStarExpr> = TestOrStarExpr => ActionFn(405);
    +        // OneOrMore<TestOrStarExpr> = TestOrStarExpr => ActionFn(456);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action405::<>(__sym0);
    +        let __nt = super::__action456::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (1, __symbol, 131)
    +        (1, __symbol, 145)
         }
    -    pub(crate) fn __reduce322<
    +    pub(crate) fn __reduce347<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -35985,16 +39800,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OneOrMore<TestOrStarExpr> = TestOrStarExpr, ("," TestOrStarExpr)+ => ActionFn(406);
    +        // OneOrMore<TestOrStarExpr> = TestOrStarExpr, ("," TestOrStarExpr)+ => ActionFn(457);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action406::<>(__sym0, __sym1);
    +        let __nt = super::__action457::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (2, __symbol, 131)
    +        (2, __symbol, 145)
         }
    -    pub(crate) fn __reduce323<
    +    pub(crate) fn __reduce348<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36003,15 +39818,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OneOrMore<WithItem> = WithItem => ActionFn(421);
    -        let __sym0 = __pop_Variant78(__symbols);
    +        // OneOrMore<WithItem> = WithItem => ActionFn(480);
    +        let __sym0 = __pop_Variant79(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action421::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    -        (1, __symbol, 132)
    +        let __nt = super::__action480::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant63(__nt), __end);
    +        (1, __symbol, 146)
         }
    -    pub(crate) fn __reduce324<
    +    pub(crate) fn __reduce349<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36020,16 +39835,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OneOrMore<WithItem> = WithItem, ("," WithItem)+ => ActionFn(422);
    +        // OneOrMore<WithItem> = WithItem, ("," WithItem)+ => ActionFn(481);
             let __sym1 = __pop_Variant25(__symbols);
    -        let __sym0 = __pop_Variant78(__symbols);
    +        let __sym0 = __pop_Variant79(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action422::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    -        (2, __symbol, 132)
    +        let __nt = super::__action481::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant63(__nt), __end);
    +        (2, __symbol, 146)
         }
    -    pub(crate) fn __reduce325<
    +    pub(crate) fn __reduce350<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36038,15 +39853,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OrTest = AndTest => ActionFn(98);
    +        // OrTest = AndTest => ActionFn(90);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action98::<>(__sym0);
    +        let __nt = super::__action90::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 133)
    +        (1, __symbol, 147)
         }
    -    pub(crate) fn __reduce326<
    +    pub(crate) fn __reduce351<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36055,17 +39870,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // OrTest = OrTest, "or", AndTest => ActionFn(99);
    +        // OrTest = OrTest, "or", AndTest => ActionFn(91);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action99::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action91::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 133)
    +        (3, __symbol, 147)
         }
    -    pub(crate) fn __reduce327<
    +    pub(crate) fn __reduce352<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36074,18 +39889,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ParameterListStarArgs = "*", Identifier, ",", KwargParameter => ActionFn(547);
    -        let __sym3 = __pop_Variant60(__symbols);
    +        // ParameterListStarArgs<TypedParameter> = "*", TypedParameter, ",", KwargParameter<TypedParameter> => ActionFn(687);
    +        let __sym3 = __pop_Variant59(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
    -        let __sym1 = __pop_Variant5(__symbols);
    +        let __sym1 = __pop_Variant75(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action547::<>(__sym0, __sym1, __sym2, __sym3);
    -        let __symbol = (__start, __Symbol::Variant65(__nt), __end);
    -        (4, __symbol, 134)
    +        let __nt = super::__action687::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (4, __symbol, 148)
         }
    -    pub(crate) fn __reduce328<
    +    pub(crate) fn __reduce353<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36094,17 +39909,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ParameterListStarArgs = "*", ",", KwargParameter => ActionFn(548);
    -        let __sym2 = __pop_Variant60(__symbols);
    +        // ParameterListStarArgs<TypedParameter> = "*", ",", KwargParameter<TypedParameter> => ActionFn(688);
    +        let __sym2 = __pop_Variant59(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action548::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant65(__nt), __end);
    -        (3, __symbol, 134)
    +        let __nt = super::__action688::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (3, __symbol, 148)
         }
    -    pub(crate) fn __reduce329<
    +    pub(crate) fn __reduce354<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36113,19 +39928,19 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ParameterListStarArgs = "*", Identifier, ("," TypedParameterDef)+, ",", KwargParameter => ActionFn(549);
    -        let __sym4 = __pop_Variant60(__symbols);
    +        // ParameterListStarArgs<TypedParameter> = "*", TypedParameter, ("," TypedParameterDef<TypedParameter>)+, ",", KwargParameter<TypedParameter> => ActionFn(689);
    +        let __sym4 = __pop_Variant59(__symbols);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant23(__symbols);
    -        let __sym1 = __pop_Variant5(__symbols);
    +        let __sym1 = __pop_Variant75(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action549::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    -        let __symbol = (__start, __Symbol::Variant65(__nt), __end);
    -        (5, __symbol, 134)
    +        let __nt = super::__action689::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (5, __symbol, 148)
         }
    -    pub(crate) fn __reduce330<
    +    pub(crate) fn __reduce355<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36134,18 +39949,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ParameterListStarArgs = "*", ("," TypedParameterDef)+, ",", KwargParameter => ActionFn(550);
    -        let __sym3 = __pop_Variant60(__symbols);
    +        // ParameterListStarArgs<TypedParameter> = "*", ("," TypedParameterDef<TypedParameter>)+, ",", KwargParameter<TypedParameter> => ActionFn(690);
    +        let __sym3 = __pop_Variant59(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant23(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action550::<>(__sym0, __sym1, __sym2, __sym3);
    -        let __symbol = (__start, __Symbol::Variant65(__nt), __end);
    -        (4, __symbol, 134)
    +        let __nt = super::__action690::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (4, __symbol, 148)
         }
    -    pub(crate) fn __reduce331<
    +    pub(crate) fn __reduce356<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36154,16 +39969,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ParameterListStarArgs = "*", Identifier => ActionFn(551);
    -        let __sym1 = __pop_Variant5(__symbols);
    +        // ParameterListStarArgs<TypedParameter> = "*", TypedParameter => ActionFn(691);
    +        let __sym1 = __pop_Variant75(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action551::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant65(__nt), __end);
    -        (2, __symbol, 134)
    +        let __nt = super::__action691::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (2, __symbol, 148)
         }
    -    pub(crate) fn __reduce332<
    +    pub(crate) fn __reduce357<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36172,15 +39987,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ParameterListStarArgs = "*" => ActionFn(552);
    +        // ParameterListStarArgs<TypedParameter> = "*" => ActionFn(692);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action552::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant65(__nt), __end);
    -        (1, __symbol, 134)
    +        let __nt = super::__action692::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (1, __symbol, 148)
         }
    -    pub(crate) fn __reduce333<
    +    pub(crate) fn __reduce358<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36189,17 +40004,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ParameterListStarArgs = "*", Identifier, ("," TypedParameterDef)+ => ActionFn(553);
    +        // ParameterListStarArgs<TypedParameter> = "*", TypedParameter, ("," TypedParameterDef<TypedParameter>)+ => ActionFn(693);
             let __sym2 = __pop_Variant23(__symbols);
    -        let __sym1 = __pop_Variant5(__symbols);
    +        let __sym1 = __pop_Variant75(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action553::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant65(__nt), __end);
    -        (3, __symbol, 134)
    +        let __nt = super::__action693::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (3, __symbol, 148)
         }
    -    pub(crate) fn __reduce334<
    +    pub(crate) fn __reduce359<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36208,16 +40023,168 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ParameterListStarArgs = "*", ("," TypedParameterDef)+ => ActionFn(554);
    +        // ParameterListStarArgs<TypedParameter> = "*", ("," TypedParameterDef<TypedParameter>)+ => ActionFn(694);
             let __sym1 = __pop_Variant23(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action554::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant65(__nt), __end);
    -        (2, __symbol, 134)
    +        let __nt = super::__action694::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (2, __symbol, 148)
         }
    -    pub(crate) fn __reduce335<
    +    pub(crate) fn __reduce360<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ParameterListStarArgs<UntypedParameter> = "*", UntypedParameter, ",", KwargParameter<UntypedParameter> => ActionFn(709);
    +        let __sym3 = __pop_Variant59(__symbols);
    +        let __sym2 = __pop_Variant0(__symbols);
    +        let __sym1 = __pop_Variant75(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym3.2.clone();
    +        let __nt = super::__action709::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (4, __symbol, 149)
    +    }
    +    pub(crate) fn __reduce361<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ParameterListStarArgs<UntypedParameter> = "*", ",", KwargParameter<UntypedParameter> => ActionFn(710);
    +        let __sym2 = __pop_Variant59(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action710::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (3, __symbol, 149)
    +    }
    +    pub(crate) fn __reduce362<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ParameterListStarArgs<UntypedParameter> = "*", UntypedParameter, ("," TypedParameterDef<UntypedParameter>)+, ",", KwargParameter<UntypedParameter> => ActionFn(711);
    +        let __sym4 = __pop_Variant59(__symbols);
    +        let __sym3 = __pop_Variant0(__symbols);
    +        let __sym2 = __pop_Variant23(__symbols);
    +        let __sym1 = __pop_Variant75(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym4.2.clone();
    +        let __nt = super::__action711::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (5, __symbol, 149)
    +    }
    +    pub(crate) fn __reduce363<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ParameterListStarArgs<UntypedParameter> = "*", ("," TypedParameterDef<UntypedParameter>)+, ",", KwargParameter<UntypedParameter> => ActionFn(712);
    +        let __sym3 = __pop_Variant59(__symbols);
    +        let __sym2 = __pop_Variant0(__symbols);
    +        let __sym1 = __pop_Variant23(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym3.2.clone();
    +        let __nt = super::__action712::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (4, __symbol, 149)
    +    }
    +    pub(crate) fn __reduce364<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ParameterListStarArgs<UntypedParameter> = "*", UntypedParameter => ActionFn(713);
    +        let __sym1 = __pop_Variant75(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action713::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (2, __symbol, 149)
    +    }
    +    pub(crate) fn __reduce365<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ParameterListStarArgs<UntypedParameter> = "*" => ActionFn(714);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action714::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (1, __symbol, 149)
    +    }
    +    pub(crate) fn __reduce366<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ParameterListStarArgs<UntypedParameter> = "*", UntypedParameter, ("," TypedParameterDef<UntypedParameter>)+ => ActionFn(715);
    +        let __sym2 = __pop_Variant23(__symbols);
    +        let __sym1 = __pop_Variant75(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action715::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (3, __symbol, 149)
    +    }
    +    pub(crate) fn __reduce367<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // ParameterListStarArgs<UntypedParameter> = "*", ("," TypedParameterDef<UntypedParameter>)+ => ActionFn(716);
    +        let __sym1 = __pop_Variant23(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action716::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant64(__nt), __end);
    +        (2, __symbol, 149)
    +    }
    +    pub(crate) fn __reduce368<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36226,17 +40193,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Parameters = "(", TypedArgsList, ")" => ActionFn(517);
    +        // Parameters = "(", TypedArgsList<TypedParameter>, ")" => ActionFn(583);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant38(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action517::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action583::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (3, __symbol, 135)
    +        (3, __symbol, 150)
         }
    -    pub(crate) fn __reduce336<
    +    pub(crate) fn __reduce369<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36245,16 +40212,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Parameters = "(", ")" => ActionFn(518);
    +        // Parameters = "(", ")" => ActionFn(584);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action518::<>(__sym0, __sym1);
    +        let __nt = super::__action584::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (2, __symbol, 135)
    +        (2, __symbol, 150)
         }
    -    pub(crate) fn __reduce337<
    +    pub(crate) fn __reduce370<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36263,15 +40230,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // PassStatement = "pass" => ActionFn(498);
    +        // PassStatement = "pass" => ActionFn(564);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action498::<>(__sym0);
    +        let __nt = super::__action564::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 136)
    +        (1, __symbol, 151)
         }
    -    pub(crate) fn __reduce338<
    +    pub(crate) fn __reduce371<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36280,15 +40247,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Path = Identifier => ActionFn(90);
    +        // Path = Identifier => ActionFn(82);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action90::<>(__sym0);
    +        let __nt = super::__action82::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 137)
    +        (1, __symbol, 152)
         }
    -    pub(crate) fn __reduce339<
    +    pub(crate) fn __reduce372<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36297,17 +40264,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Path = Path, ".", name => ActionFn(91);
    +        // Path = Path, ".", name => ActionFn(83);
             let __sym2 = __pop_Variant5(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action91::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action83::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 137)
    +        (3, __symbol, 152)
         }
    -    pub(crate) fn __reduce340<
    +    pub(crate) fn __reduce373<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36316,17 +40283,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Power = AtomExpr, "**", Factor => ActionFn(371);
    +        // Power = AtomExpr, "**", Factor => ActionFn(409);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action371::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action409::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 138)
    +        (3, __symbol, 153)
         }
    -    pub(crate) fn __reduce341<
    +    pub(crate) fn __reduce374<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36335,15 +40302,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Power = AtomExpr => ActionFn(372);
    +        // Power = AtomExpr => ActionFn(410);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action372::<>(__sym0);
    +        let __nt = super::__action410::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 138)
    +        (1, __symbol, 153)
         }
    -    pub(crate) fn __reduce342<
    +    pub(crate) fn __reduce375<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36352,14 +40319,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Program =  => ActionFn(539);
    +        // Program =  => ActionFn(607);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action539::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant66(__nt), __end);
    -        (0, __symbol, 139)
    +        let __nt = super::__action607::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant65(__nt), __end);
    +        (0, __symbol, 154)
         }
    -    pub(crate) fn __reduce343<
    +    pub(crate) fn __reduce376<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36368,15 +40335,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Program = FileLine+ => ActionFn(540);
    +        // Program = FileLine+ => ActionFn(608);
             let __sym0 = __pop_Variant56(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action540::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant66(__nt), __end);
    -        (1, __symbol, 139)
    +        let __nt = super::__action608::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant65(__nt), __end);
    +        (1, __symbol, 154)
         }
    -    pub(crate) fn __reduce344<
    +    pub(crate) fn __reduce377<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36385,15 +40352,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // RaiseStatement = "raise" => ActionFn(499);
    +        // RaiseStatement = "raise" => ActionFn(565);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action499::<>(__sym0);
    +        let __nt = super::__action565::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 140)
    +        (1, __symbol, 155)
         }
    -    pub(crate) fn __reduce345<
    +    pub(crate) fn __reduce378<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36402,18 +40369,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // RaiseStatement = "raise", Test, "from", Test => ActionFn(500);
    +        // RaiseStatement = "raise", Test, "from", Test => ActionFn(566);
             let __sym3 = __pop_Variant42(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action500::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action566::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (4, __symbol, 140)
    +        (4, __symbol, 155)
         }
    -    pub(crate) fn __reduce346<
    +    pub(crate) fn __reduce379<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36422,16 +40389,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // RaiseStatement = "raise", Test => ActionFn(501);
    +        // RaiseStatement = "raise", Test => ActionFn(567);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action501::<>(__sym0, __sym1);
    +        let __nt = super::__action567::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (2, __symbol, 140)
    +        (2, __symbol, 155)
         }
    -    pub(crate) fn __reduce347<
    +    pub(crate) fn __reduce380<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36440,17 +40407,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ShiftExpression = ShiftExpression, ShiftOp, ArithmaticExpression => ActionFn(122);
    +        // ShiftExpression = ShiftExpression, ShiftOp, ArithmaticExpression => ActionFn(114);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant41(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action122::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action114::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 141)
    +        (3, __symbol, 156)
         }
    -    pub(crate) fn __reduce348<
    +    pub(crate) fn __reduce381<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36459,15 +40426,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ShiftExpression = ArithmaticExpression => ActionFn(123);
    +        // ShiftExpression = ArithmaticExpression => ActionFn(115);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action123::<>(__sym0);
    +        let __nt = super::__action115::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 141)
    +        (1, __symbol, 156)
         }
    -    pub(crate) fn __reduce349<
    +    pub(crate) fn __reduce382<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36476,15 +40443,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ShiftOp = "<<" => ActionFn(124);
    +        // ShiftOp = "<<" => ActionFn(116);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action124::<>(__sym0);
    +        let __nt = super::__action116::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 142)
    +        (1, __symbol, 157)
         }
    -    pub(crate) fn __reduce350<
    +    pub(crate) fn __reduce383<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36493,15 +40460,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // ShiftOp = ">>" => ActionFn(125);
    +        // ShiftOp = ">>" => ActionFn(117);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action125::<>(__sym0);
    +        let __nt = super::__action117::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant41(__nt), __end);
    -        (1, __symbol, 142)
    +        (1, __symbol, 157)
         }
    -    pub(crate) fn __reduce351<
    +    pub(crate) fn __reduce384<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36517,9 +40484,9 @@
             let __end = __sym1.2.clone();
             let __nt = super::__action11::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (2, __symbol, 143)
    +        (2, __symbol, 158)
         }
    -    pub(crate) fn __reduce352<
    +    pub(crate) fn __reduce385<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36535,9 +40502,9 @@
             let __end = __sym1.2.clone();
             let __nt = super::__action12::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (2, __symbol, 143)
    +        (2, __symbol, 158)
         }
    -    pub(crate) fn __reduce353<
    +    pub(crate) fn __reduce386<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36546,18 +40513,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // SingleForComprehension = "for", ExpressionList, "in", OrTest => ActionFn(523);
    +        // SingleForComprehension = "for", ExpressionList, "in", OrTest => ActionFn(589);
             let __sym3 = __pop_Variant42(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action523::<>(__sym0, __sym1, __sym2, __sym3);
    -        let __symbol = (__start, __Symbol::Variant67(__nt), __end);
    -        (4, __symbol, 144)
    +        let __nt = super::__action589::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __symbol = (__start, __Symbol::Variant66(__nt), __end);
    +        (4, __symbol, 159)
         }
    -    pub(crate) fn __reduce354<
    +    pub(crate) fn __reduce387<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36566,7 +40533,7 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // SingleForComprehension = "for", ExpressionList, "in", OrTest, ComprehensionIf+ => ActionFn(524);
    +        // SingleForComprehension = "for", ExpressionList, "in", OrTest, ComprehensionIf+ => ActionFn(590);
             let __sym4 = __pop_Variant45(__symbols);
             let __sym3 = __pop_Variant42(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
    @@ -36574,11 +40541,11 @@
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action524::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    -        let __symbol = (__start, __Symbol::Variant67(__nt), __end);
    -        (5, __symbol, 144)
    +        let __nt = super::__action590::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __symbol = (__start, __Symbol::Variant66(__nt), __end);
    +        (5, __symbol, 159)
         }
    -    pub(crate) fn __reduce355<
    +    pub(crate) fn __reduce388<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36587,15 +40554,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // SingleForComprehension+ = SingleForComprehension => ActionFn(199);
    -        let __sym0 = __pop_Variant67(__symbols);
    +        // SingleForComprehension+ = SingleForComprehension => ActionFn(193);
    +        let __sym0 = __pop_Variant66(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action199::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant68(__nt), __end);
    -        (1, __symbol, 145)
    +        let __nt = super::__action193::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant67(__nt), __end);
    +        (1, __symbol, 160)
         }
    -    pub(crate) fn __reduce356<
    +    pub(crate) fn __reduce389<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36604,16 +40571,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // SingleForComprehension+ = SingleForComprehension+, SingleForComprehension => ActionFn(200);
    -        let __sym1 = __pop_Variant67(__symbols);
    -        let __sym0 = __pop_Variant68(__symbols);
    +        // SingleForComprehension+ = SingleForComprehension+, SingleForComprehension => ActionFn(194);
    +        let __sym1 = __pop_Variant66(__symbols);
    +        let __sym0 = __pop_Variant67(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action200::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant68(__nt), __end);
    -        (2, __symbol, 145)
    +        let __nt = super::__action194::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant67(__nt), __end);
    +        (2, __symbol, 160)
         }
    -    pub(crate) fn __reduce357<
    +    pub(crate) fn __reduce390<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36622,16 +40589,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // SliceOp = ":", Test => ActionFn(589);
    +        // SliceOp = ":", Test => ActionFn(647);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action589::<>(__sym0, __sym1);
    +        let __nt = super::__action647::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 146)
    +        (2, __symbol, 161)
         }
    -    pub(crate) fn __reduce358<
    +    pub(crate) fn __reduce391<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36640,15 +40607,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // SliceOp = ":" => ActionFn(590);
    +        // SliceOp = ":" => ActionFn(648);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action590::<>(__sym0);
    +        let __nt = super::__action648::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 146)
    +        (1, __symbol, 161)
         }
    -    pub(crate) fn __reduce359<
    +    pub(crate) fn __reduce392<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36657,15 +40624,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // SliceOp? = SliceOp => ActionFn(213);
    +        // SliceOp? = SliceOp => ActionFn(207);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action213::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant69(__nt), __end);
    -        (1, __symbol, 147)
    +        let __nt = super::__action207::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant68(__nt), __end);
    +        (1, __symbol, 162)
         }
    -    pub(crate) fn __reduce360<
    +    pub(crate) fn __reduce393<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36674,14 +40641,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // SliceOp? =  => ActionFn(214);
    +        // SliceOp? =  => ActionFn(208);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action214::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant69(__nt), __end);
    -        (0, __symbol, 147)
    +        let __nt = super::__action208::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant68(__nt), __end);
    +        (0, __symbol, 162)
         }
    -    pub(crate) fn __reduce361<
    +    pub(crate) fn __reduce394<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36696,9 +40663,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action13::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 148)
    +        (1, __symbol, 163)
         }
    -    pub(crate) fn __reduce362<
    +    pub(crate) fn __reduce395<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36713,9 +40680,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action14::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 148)
    +        (1, __symbol, 163)
         }
    -    pub(crate) fn __reduce363<
    +    pub(crate) fn __reduce396<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36730,9 +40697,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action15::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 148)
    +        (1, __symbol, 163)
         }
    -    pub(crate) fn __reduce364<
    +    pub(crate) fn __reduce397<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36747,9 +40714,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action16::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 148)
    +        (1, __symbol, 163)
         }
    -    pub(crate) fn __reduce365<
    +    pub(crate) fn __reduce398<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36764,9 +40731,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action17::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 148)
    +        (1, __symbol, 163)
         }
    -    pub(crate) fn __reduce366<
    +    pub(crate) fn __reduce399<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36781,9 +40748,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action18::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 148)
    +        (1, __symbol, 163)
         }
    -    pub(crate) fn __reduce367<
    +    pub(crate) fn __reduce400<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36798,9 +40765,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action19::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 148)
    +        (1, __symbol, 163)
         }
    -    pub(crate) fn __reduce368<
    +    pub(crate) fn __reduce401<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36815,9 +40782,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action20::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 148)
    +        (1, __symbol, 163)
         }
    -    pub(crate) fn __reduce369<
    +    pub(crate) fn __reduce402<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36826,16 +40793,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // StarExpr = "*", Expression => ActionFn(174);
    +        // StarExpr = "*", Expression => ActionFn(168);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action174::<>(__sym0, __sym1);
    +        let __nt = super::__action168::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 149)
    +        (2, __symbol, 164)
         }
    -    pub(crate) fn __reduce370<
    +    pub(crate) fn __reduce403<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36850,9 +40817,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action9::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 150)
    +        (1, __symbol, 165)
         }
    -    pub(crate) fn __reduce371<
    +    pub(crate) fn __reduce404<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36867,9 +40834,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action10::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (1, __symbol, 150)
    +        (1, __symbol, 165)
         }
    -    pub(crate) fn __reduce372<
    +    pub(crate) fn __reduce405<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36883,10 +40850,10 @@
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
             let __nt = super::__action288::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant70(__nt), __end);
    -        (1, __symbol, 151)
    +        let __symbol = (__start, __Symbol::Variant69(__nt), __end);
    +        (1, __symbol, 166)
         }
    -    pub(crate) fn __reduce373<
    +    pub(crate) fn __reduce406<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36897,14 +40864,14 @@
         {
             // Statement+ = Statement+, Statement => ActionFn(289);
             let __sym1 = __pop_Variant44(__symbols);
    -        let __sym0 = __pop_Variant70(__symbols);
    +        let __sym0 = __pop_Variant69(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
             let __nt = super::__action289::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant70(__nt), __end);
    -        (2, __symbol, 151)
    +        let __symbol = (__start, __Symbol::Variant69(__nt), __end);
    +        (2, __symbol, 166)
         }
    -    pub(crate) fn __reduce375<
    +    pub(crate) fn __reduce408<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36913,15 +40880,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Subscript = Test => ActionFn(146);
    +        // Subscript = Test => ActionFn(139);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action146::<>(__sym0);
    +        let __nt = super::__action139::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 153)
    +        (1, __symbol, 168)
         }
    -    pub(crate) fn __reduce376<
    +    pub(crate) fn __reduce409<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36930,18 +40897,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Subscript = Test, ":", Test, SliceOp => ActionFn(591);
    +        // Subscript = Test, ":", Test, SliceOp => ActionFn(649);
             let __sym3 = __pop_Variant42(__symbols);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action591::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action649::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (4, __symbol, 153)
    +        (4, __symbol, 168)
         }
    -    pub(crate) fn __reduce377<
    +    pub(crate) fn __reduce410<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36950,17 +40917,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Subscript = Test, ":", SliceOp => ActionFn(592);
    +        // Subscript = Test, ":", SliceOp => ActionFn(650);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action592::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action650::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 153)
    +        (3, __symbol, 168)
         }
    -    pub(crate) fn __reduce378<
    +    pub(crate) fn __reduce411<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36969,17 +40936,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Subscript = ":", Test, SliceOp => ActionFn(593);
    +        // Subscript = ":", Test, SliceOp => ActionFn(651);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action593::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action651::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 153)
    +        (3, __symbol, 168)
         }
    -    pub(crate) fn __reduce379<
    +    pub(crate) fn __reduce412<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -36988,16 +40955,88 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Subscript = ":", SliceOp => ActionFn(594);
    +        // Subscript = ":", SliceOp => ActionFn(652);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action594::<>(__sym0, __sym1);
    +        let __nt = super::__action652::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 153)
    +        (2, __symbol, 168)
         }
    -    pub(crate) fn __reduce380<
    +    pub(crate) fn __reduce413<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // Subscript = Test, ":", Test => ActionFn(653);
    +        let __sym2 = __pop_Variant42(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant42(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action653::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    +        (3, __symbol, 168)
    +    }
    +    pub(crate) fn __reduce414<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // Subscript = Test, ":" => ActionFn(654);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant42(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action654::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    +        (2, __symbol, 168)
    +    }
    +    pub(crate) fn __reduce415<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // Subscript = ":", Test => ActionFn(655);
    +        let __sym1 = __pop_Variant42(__symbols);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action655::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    +        (2, __symbol, 168)
    +    }
    +    pub(crate) fn __reduce416<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // Subscript = ":" => ActionFn(656);
    +        let __sym0 = __pop_Variant0(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action656::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    +        (1, __symbol, 168)
    +    }
    +    pub(crate) fn __reduce417<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37006,17 +41045,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Subscript = Test, ":", Test => ActionFn(595);
    -        let __sym2 = __pop_Variant42(__symbols);
    +        // SubscriptList = Subscript, "," => ActionFn(441);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym2.2.clone();
    -        let __nt = super::__action595::<>(__sym0, __sym1, __sym2);
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action441::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 153)
    +        (2, __symbol, 169)
         }
    -    pub(crate) fn __reduce381<
    +    pub(crate) fn __reduce418<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37025,16 +41063,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Subscript = Test, ":" => ActionFn(596);
    -        let __sym1 = __pop_Variant0(__symbols);
    +        // SubscriptList = Subscript, ("," Subscript)+, "," => ActionFn(442);
    +        let __sym2 = __pop_Variant0(__symbols);
    +        let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym1.2.clone();
    -        let __nt = super::__action596::<>(__sym0, __sym1);
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action442::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 153)
    +        (3, __symbol, 169)
         }
    -    pub(crate) fn __reduce382<
    +    pub(crate) fn __reduce419<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37043,16 +41082,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Subscript = ":", Test => ActionFn(597);
    -        let __sym1 = __pop_Variant42(__symbols);
    -        let __sym0 = __pop_Variant0(__symbols);
    +        // SubscriptList = Subscript => ActionFn(443);
    +        let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym1.2.clone();
    -        let __nt = super::__action597::<>(__sym0, __sym1);
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action443::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 153)
    +        (1, __symbol, 169)
         }
    -    pub(crate) fn __reduce383<
    +    pub(crate) fn __reduce420<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37061,15 +41099,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Subscript = ":" => ActionFn(598);
    -        let __sym0 = __pop_Variant0(__symbols);
    +        // SubscriptList = Subscript, ("," Subscript)+ => ActionFn(444);
    +        let __sym1 = __pop_Variant15(__symbols);
    +        let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym0.2.clone();
    -        let __nt = super::__action598::<>(__sym0);
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action444::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 153)
    +        (2, __symbol, 169)
         }
    -    pub(crate) fn __reduce384<
    +    pub(crate) fn __reduce421<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37083,10 +41122,10 @@
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
             let __nt = super::__action7::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant72(__nt), __end);
    -        (1, __symbol, 154)
    +        let __symbol = (__start, __Symbol::Variant71(__nt), __end);
    +        (1, __symbol, 170)
         }
    -    pub(crate) fn __reduce385<
    +    pub(crate) fn __reduce422<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37097,16 +41136,16 @@
         {
             // Suite = "\\n", indent, Statement+, dedent => ActionFn(8);
             let __sym3 = __pop_Variant0(__symbols);
    -        let __sym2 = __pop_Variant70(__symbols);
    +        let __sym2 = __pop_Variant69(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
             let __nt = super::__action8::<>(__sym0, __sym1, __sym2, __sym3);
    -        let __symbol = (__start, __Symbol::Variant72(__nt), __end);
    -        (4, __symbol, 154)
    +        let __symbol = (__start, __Symbol::Variant71(__nt), __end);
    +        (4, __symbol, 170)
         }
    -    pub(crate) fn __reduce386<
    +    pub(crate) fn __reduce423<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37115,17 +41154,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Term = Term, MulOp, Factor => ActionFn(130);
    +        // Term = Term, MulOp, Factor => ActionFn(122);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant41(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action130::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action122::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 155)
    +        (3, __symbol, 171)
         }
    -    pub(crate) fn __reduce387<
    +    pub(crate) fn __reduce424<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37134,15 +41173,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Term = Factor => ActionFn(131);
    +        // Term = Factor => ActionFn(123);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action131::<>(__sym0);
    +        let __nt = super::__action123::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 155)
    +        (1, __symbol, 171)
         }
    -    pub(crate) fn __reduce388<
    +    pub(crate) fn __reduce425<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37151,7 +41190,7 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Test = OrTest, "if", OrTest, "else", Test => ActionFn(451);
    +        // Test = OrTest, "if", OrTest, "else", Test => ActionFn(516);
             let __sym4 = __pop_Variant42(__symbols);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant42(__symbols);
    @@ -37159,11 +41198,11 @@
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action451::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __nt = super::__action516::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (5, __symbol, 156)
    +        (5, __symbol, 172)
         }
    -    pub(crate) fn __reduce389<
    +    pub(crate) fn __reduce426<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37172,15 +41211,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Test = OrTest => ActionFn(452);
    +        // Test = OrTest => ActionFn(517);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action452::<>(__sym0);
    +        let __nt = super::__action517::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 156)
    +        (1, __symbol, 172)
         }
    -    pub(crate) fn __reduce390<
    +    pub(crate) fn __reduce427<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37189,15 +41228,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // Test = LambdaDef => ActionFn(96);
    +        // Test = LambdaDef => ActionFn(88);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action96::<>(__sym0);
    +        let __nt = super::__action88::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 156)
    +        (1, __symbol, 172)
         }
    -    pub(crate) fn __reduce391<
    +    pub(crate) fn __reduce428<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37211,10 +41250,10 @@
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
             let __nt = super::__action247::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant69(__nt), __end);
    -        (1, __symbol, 157)
    +        let __symbol = (__start, __Symbol::Variant68(__nt), __end);
    +        (1, __symbol, 173)
         }
    -    pub(crate) fn __reduce392<
    +    pub(crate) fn __reduce429<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37227,10 +41266,10 @@
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action248::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant69(__nt), __end);
    -        (0, __symbol, 157)
    +        let __symbol = (__start, __Symbol::Variant68(__nt), __end);
    +        (0, __symbol, 173)
         }
    -    pub(crate) fn __reduce393<
    +    pub(crate) fn __reduce430<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37239,16 +41278,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestDict = DictEntry, "," => ActionFn(567);
    +        // TestDict = DictEntry, "," => ActionFn(625);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant51(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action567::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant62(__nt), __end);
    -        (2, __symbol, 158)
    +        let __nt = super::__action625::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant61(__nt), __end);
    +        (2, __symbol, 174)
         }
    -    pub(crate) fn __reduce394<
    +    pub(crate) fn __reduce431<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37257,17 +41296,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestDict = DictEntry, ("," DictEntry)+, "," => ActionFn(568);
    +        // TestDict = DictEntry, ("," DictEntry)+, "," => ActionFn(626);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant14(__symbols);
             let __sym0 = __pop_Variant51(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action568::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant62(__nt), __end);
    -        (3, __symbol, 158)
    +        let __nt = super::__action626::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant61(__nt), __end);
    +        (3, __symbol, 174)
         }
    -    pub(crate) fn __reduce395<
    +    pub(crate) fn __reduce432<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37276,15 +41315,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestDict = DictEntry => ActionFn(569);
    +        // TestDict = DictEntry => ActionFn(627);
             let __sym0 = __pop_Variant51(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action569::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant62(__nt), __end);
    -        (1, __symbol, 158)
    +        let __nt = super::__action627::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant61(__nt), __end);
    +        (1, __symbol, 174)
         }
    -    pub(crate) fn __reduce396<
    +    pub(crate) fn __reduce433<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37293,16 +41332,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestDict = DictEntry, ("," DictEntry)+ => ActionFn(570);
    +        // TestDict = DictEntry, ("," DictEntry)+ => ActionFn(628);
             let __sym1 = __pop_Variant14(__symbols);
             let __sym0 = __pop_Variant51(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action570::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant62(__nt), __end);
    -        (2, __symbol, 158)
    +        let __nt = super::__action628::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant61(__nt), __end);
    +        (2, __symbol, 174)
         }
    -    pub(crate) fn __reduce397<
    +    pub(crate) fn __reduce434<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37311,15 +41350,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestDict? = TestDict => ActionFn(209);
    -        let __sym0 = __pop_Variant62(__symbols);
    +        // TestDict? = TestDict => ActionFn(203);
    +        let __sym0 = __pop_Variant61(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action209::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant73(__nt), __end);
    -        (1, __symbol, 159)
    +        let __nt = super::__action203::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant72(__nt), __end);
    +        (1, __symbol, 175)
         }
    -    pub(crate) fn __reduce398<
    +    pub(crate) fn __reduce435<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37328,14 +41367,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestDict? =  => ActionFn(210);
    +        // TestDict? =  => ActionFn(204);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action210::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant73(__nt), __end);
    -        (0, __symbol, 159)
    +        let __nt = super::__action204::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant72(__nt), __end);
    +        (0, __symbol, 175)
         }
    -    pub(crate) fn __reduce399<
    +    pub(crate) fn __reduce436<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37344,16 +41383,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestDictComp = DictEntry, CompFor => ActionFn(167);
    +        // TestDictComp = DictEntry, CompFor => ActionFn(161);
             let __sym1 = __pop_Variant48(__symbols);
             let __sym0 = __pop_Variant51(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action167::<>(__sym0, __sym1);
    +        let __nt = super::__action161::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 160)
    +        (2, __symbol, 176)
         }
    -    pub(crate) fn __reduce400<
    +    pub(crate) fn __reduce437<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37362,15 +41401,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestList = Test => ActionFn(399);
    +        // TestList = Test => ActionFn(450);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action399::<>(__sym0);
    +        let __nt = super::__action450::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (1, __symbol, 161)
    +        (1, __symbol, 177)
         }
    -    pub(crate) fn __reduce401<
    +    pub(crate) fn __reduce438<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37379,16 +41418,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestList = Test, ("," Test)+ => ActionFn(400);
    +        // TestList = Test, ("," Test)+ => ActionFn(451);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action400::<>(__sym0, __sym1);
    +        let __nt = super::__action451::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (2, __symbol, 161)
    +        (2, __symbol, 177)
         }
    -    pub(crate) fn __reduce402<
    +    pub(crate) fn __reduce439<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37397,15 +41436,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestList? = Test => ActionFn(609);
    +        // TestList? = Test => ActionFn(667);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action609::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant74(__nt), __end);
    -        (1, __symbol, 162)
    +        let __nt = super::__action667::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant73(__nt), __end);
    +        (1, __symbol, 178)
         }
    -    pub(crate) fn __reduce403<
    +    pub(crate) fn __reduce440<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37414,16 +41453,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestList? = Test, ("," Test)+ => ActionFn(610);
    +        // TestList? = Test, ("," Test)+ => ActionFn(668);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action610::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant74(__nt), __end);
    -        (2, __symbol, 162)
    +        let __nt = super::__action668::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant73(__nt), __end);
    +        (2, __symbol, 178)
         }
    -    pub(crate) fn __reduce404<
    +    pub(crate) fn __reduce441<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37436,10 +41475,10 @@
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
             let __nt = super::__action279::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant74(__nt), __end);
    -        (0, __symbol, 162)
    +        let __symbol = (__start, __Symbol::Variant73(__nt), __end);
    +        (0, __symbol, 178)
         }
    -    pub(crate) fn __reduce405<
    +    pub(crate) fn __reduce442<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37448,16 +41487,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestListComp = TestOrStarExpr, "," => ActionFn(579);
    +        // TestListComp = TestOrStarExpr, "," => ActionFn(637);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action579::<>(__sym0, __sym1);
    +        let __nt = super::__action637::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (2, __symbol, 163)
    +        (2, __symbol, 179)
         }
    -    pub(crate) fn __reduce406<
    +    pub(crate) fn __reduce443<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37466,17 +41505,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestListComp = TestOrStarExpr, ("," TestOrStarExpr)+, "," => ActionFn(580);
    +        // TestListComp = TestOrStarExpr, ("," TestOrStarExpr)+, "," => ActionFn(638);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action580::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action638::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (3, __symbol, 163)
    +        (3, __symbol, 179)
         }
    -    pub(crate) fn __reduce407<
    +    pub(crate) fn __reduce444<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37485,15 +41524,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestListComp = TestOrStarExpr => ActionFn(581);
    +        // TestListComp = TestOrStarExpr => ActionFn(639);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action581::<>(__sym0);
    +        let __nt = super::__action639::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (1, __symbol, 163)
    +        (1, __symbol, 179)
         }
    -    pub(crate) fn __reduce408<
    +    pub(crate) fn __reduce445<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37502,16 +41541,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestListComp = TestOrStarExpr, ("," TestOrStarExpr)+ => ActionFn(582);
    +        // TestListComp = TestOrStarExpr, ("," TestOrStarExpr)+ => ActionFn(640);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action582::<>(__sym0, __sym1);
    +        let __nt = super::__action640::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (2, __symbol, 163)
    +        (2, __symbol, 179)
         }
    -    pub(crate) fn __reduce409<
    +    pub(crate) fn __reduce446<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37520,16 +41559,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestListComp2 = TestOrStarExpr, CompFor => ActionFn(165);
    +        // TestListComp2 = TestOrStarExpr, CompFor => ActionFn(159);
             let __sym1 = __pop_Variant48(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action165::<>(__sym0, __sym1);
    +        let __nt = super::__action159::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 164)
    +        (2, __symbol, 180)
         }
    -    pub(crate) fn __reduce410<
    +    pub(crate) fn __reduce447<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37538,15 +41577,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestListComp? = TestListComp => ActionFn(211);
    +        // TestListComp? = TestListComp => ActionFn(205);
             let __sym0 = __pop_Variant54(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action211::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant74(__nt), __end);
    -        (1, __symbol, 165)
    +        let __nt = super::__action205::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant73(__nt), __end);
    +        (1, __symbol, 181)
         }
    -    pub(crate) fn __reduce411<
    +    pub(crate) fn __reduce448<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37555,14 +41594,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestListComp? =  => ActionFn(212);
    +        // TestListComp? =  => ActionFn(206);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action212::<>(&__start, &__end);
    -        let __symbol = (__start, __Symbol::Variant74(__nt), __end);
    -        (0, __symbol, 165)
    +        let __nt = super::__action206::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant73(__nt), __end);
    +        (0, __symbol, 181)
         }
    -    pub(crate) fn __reduce412<
    +    pub(crate) fn __reduce449<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37577,9 +41616,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action28::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 166)
    +        (1, __symbol, 182)
         }
    -    pub(crate) fn __reduce413<
    +    pub(crate) fn __reduce450<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37594,9 +41633,9 @@
             let __end = __sym0.2.clone();
             let __nt = super::__action29::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 166)
    +        (1, __symbol, 182)
         }
    -    pub(crate) fn __reduce414<
    +    pub(crate) fn __reduce451<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37605,16 +41644,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestOrStarExprList = TestOrStarExpr, "," => ActionFn(407);
    +        // TestOrStarExprList = TestOrStarExpr, "," => ActionFn(458);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action407::<>(__sym0, __sym1);
    +        let __nt = super::__action458::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 167)
    +        (2, __symbol, 183)
         }
    -    pub(crate) fn __reduce415<
    +    pub(crate) fn __reduce452<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37623,17 +41662,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestOrStarExprList = TestOrStarExpr, ("," TestOrStarExpr)+, "," => ActionFn(408);
    +        // TestOrStarExprList = TestOrStarExpr, ("," TestOrStarExpr)+, "," => ActionFn(459);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action408::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action459::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 167)
    +        (3, __symbol, 183)
         }
    -    pub(crate) fn __reduce416<
    +    pub(crate) fn __reduce453<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37642,15 +41681,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestOrStarExprList = TestOrStarExpr => ActionFn(409);
    +        // TestOrStarExprList = TestOrStarExpr => ActionFn(460);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action409::<>(__sym0);
    +        let __nt = super::__action460::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 167)
    +        (1, __symbol, 183)
         }
    -    pub(crate) fn __reduce417<
    +    pub(crate) fn __reduce454<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37659,16 +41698,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestOrStarExprList = TestOrStarExpr, ("," TestOrStarExpr)+ => ActionFn(410);
    +        // TestOrStarExprList = TestOrStarExpr, ("," TestOrStarExpr)+ => ActionFn(461);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action410::<>(__sym0, __sym1);
    +        let __nt = super::__action461::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 167)
    +        (2, __symbol, 183)
         }
    -    pub(crate) fn __reduce418<
    +    pub(crate) fn __reduce455<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37677,16 +41716,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestSet = Test, "," => ActionFn(575);
    +        // TestSet = Test, "," => ActionFn(633);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action575::<>(__sym0, __sym1);
    +        let __nt = super::__action633::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (2, __symbol, 168)
    +        (2, __symbol, 184)
         }
    -    pub(crate) fn __reduce419<
    +    pub(crate) fn __reduce456<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37695,17 +41734,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestSet = Test, ("," Test)+, "," => ActionFn(576);
    +        // TestSet = Test, ("," Test)+, "," => ActionFn(634);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action576::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action634::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (3, __symbol, 168)
    +        (3, __symbol, 184)
         }
    -    pub(crate) fn __reduce420<
    +    pub(crate) fn __reduce457<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37714,15 +41753,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestSet = Test => ActionFn(577);
    +        // TestSet = Test => ActionFn(635);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action577::<>(__sym0);
    +        let __nt = super::__action635::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (1, __symbol, 168)
    +        (1, __symbol, 184)
         }
    -    pub(crate) fn __reduce421<
    +    pub(crate) fn __reduce458<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37731,16 +41770,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestSet = Test, ("," Test)+ => ActionFn(578);
    +        // TestSet = Test, ("," Test)+ => ActionFn(636);
             let __sym1 = __pop_Variant15(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action578::<>(__sym0, __sym1);
    +        let __nt = super::__action636::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant54(__nt), __end);
    -        (2, __symbol, 168)
    +        (2, __symbol, 184)
         }
    -    pub(crate) fn __reduce422<
    +    pub(crate) fn __reduce459<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37749,16 +41788,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TestSetComp = Test, CompFor => ActionFn(170);
    +        // TestSetComp = Test, CompFor => ActionFn(164);
             let __sym1 = __pop_Variant48(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action170::<>(__sym0, __sym1);
    +        let __nt = super::__action164::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 169)
    +        (2, __symbol, 185)
         }
    -    pub(crate) fn __reduce423<
    +    pub(crate) fn __reduce460<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37768,15 +41807,15 @@
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
             // Top = StartProgram, Program => ActionFn(1);
    -        let __sym1 = __pop_Variant66(__symbols);
    +        let __sym1 = __pop_Variant65(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
             let __nt = super::__action1::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant75(__nt), __end);
    -        (2, __symbol, 170)
    +        let __symbol = (__start, __Symbol::Variant74(__nt), __end);
    +        (2, __symbol, 186)
         }
    -    pub(crate) fn __reduce424<
    +    pub(crate) fn __reduce461<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37791,10 +41830,10 @@
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
             let __nt = super::__action2::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant75(__nt), __end);
    -        (2, __symbol, 170)
    +        let __symbol = (__start, __Symbol::Variant74(__nt), __end);
    +        (2, __symbol, 186)
         }
    -    pub(crate) fn __reduce425<
    +    pub(crate) fn __reduce462<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37809,10 +41848,10 @@
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
             let __nt = super::__action3::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant75(__nt), __end);
    -        (2, __symbol, 170)
    +        let __symbol = (__start, __Symbol::Variant74(__nt), __end);
    +        (2, __symbol, 186)
         }
    -    pub(crate) fn __reduce426<
    +    pub(crate) fn __reduce463<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37821,23 +41860,23 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TryStatement = "try", ":", Suite, "else", ":", Suite, "finally", ":", Suite => ActionFn(531);
    -        let __sym8 = __pop_Variant72(__symbols);
    +        // TryStatement = "try", ":", Suite, "else", ":", Suite, "finally", ":", Suite => ActionFn(599);
    +        let __sym8 = __pop_Variant71(__symbols);
             let __sym7 = __pop_Variant0(__symbols);
             let __sym6 = __pop_Variant0(__symbols);
    -        let __sym5 = __pop_Variant72(__symbols);
    +        let __sym5 = __pop_Variant71(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant0(__symbols);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym8.2.clone();
    -        let __nt = super::__action531::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
    +        let __nt = super::__action599::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (9, __symbol, 171)
    +        (9, __symbol, 187)
         }
    -    pub(crate) fn __reduce427<
    +    pub(crate) fn __reduce464<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37846,24 +41885,24 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TryStatement = "try", ":", Suite, ExceptClause+, "else", ":", Suite, "finally", ":", Suite => ActionFn(532);
    -        let __sym9 = __pop_Variant72(__symbols);
    +        // TryStatement = "try", ":", Suite, ExceptClause+, "else", ":", Suite, "finally", ":", Suite => ActionFn(600);
    +        let __sym9 = __pop_Variant71(__symbols);
             let __sym8 = __pop_Variant0(__symbols);
             let __sym7 = __pop_Variant0(__symbols);
    -        let __sym6 = __pop_Variant72(__symbols);
    +        let __sym6 = __pop_Variant71(__symbols);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant53(__symbols);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym9.2.clone();
    -        let __nt = super::__action532::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
    +        let __nt = super::__action600::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (10, __symbol, 171)
    +        (10, __symbol, 187)
         }
    -    pub(crate) fn __reduce428<
    +    pub(crate) fn __reduce465<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37872,20 +41911,20 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TryStatement = "try", ":", Suite, "else", ":", Suite => ActionFn(533);
    -        let __sym5 = __pop_Variant72(__symbols);
    +        // TryStatement = "try", ":", Suite, "else", ":", Suite => ActionFn(601);
    +        let __sym5 = __pop_Variant71(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant0(__symbols);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym5.2.clone();
    -        let __nt = super::__action533::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
    +        let __nt = super::__action601::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (6, __symbol, 171)
    +        (6, __symbol, 187)
         }
    -    pub(crate) fn __reduce429<
    +    pub(crate) fn __reduce466<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37894,21 +41933,21 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TryStatement = "try", ":", Suite, ExceptClause+, "else", ":", Suite => ActionFn(534);
    -        let __sym6 = __pop_Variant72(__symbols);
    +        // TryStatement = "try", ":", Suite, ExceptClause+, "else", ":", Suite => ActionFn(602);
    +        let __sym6 = __pop_Variant71(__symbols);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant53(__symbols);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym6.2.clone();
    -        let __nt = super::__action534::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
    +        let __nt = super::__action602::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (7, __symbol, 171)
    +        (7, __symbol, 187)
         }
    -    pub(crate) fn __reduce430<
    +    pub(crate) fn __reduce467<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37917,20 +41956,20 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TryStatement = "try", ":", Suite, "finally", ":", Suite => ActionFn(535);
    -        let __sym5 = __pop_Variant72(__symbols);
    +        // TryStatement = "try", ":", Suite, "finally", ":", Suite => ActionFn(603);
    +        let __sym5 = __pop_Variant71(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant0(__symbols);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym5.2.clone();
    -        let __nt = super::__action535::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
    +        let __nt = super::__action603::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (6, __symbol, 171)
    +        (6, __symbol, 187)
         }
    -    pub(crate) fn __reduce431<
    +    pub(crate) fn __reduce468<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37939,21 +41978,21 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TryStatement = "try", ":", Suite, ExceptClause+, "finally", ":", Suite => ActionFn(536);
    -        let __sym6 = __pop_Variant72(__symbols);
    +        // TryStatement = "try", ":", Suite, ExceptClause+, "finally", ":", Suite => ActionFn(604);
    +        let __sym6 = __pop_Variant71(__symbols);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
             let __sym3 = __pop_Variant53(__symbols);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym6.2.clone();
    -        let __nt = super::__action536::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
    +        let __nt = super::__action604::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (7, __symbol, 171)
    +        (7, __symbol, 187)
         }
    -    pub(crate) fn __reduce432<
    +    pub(crate) fn __reduce469<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37962,17 +42001,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TryStatement = "try", ":", Suite => ActionFn(537);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        // TryStatement = "try", ":", Suite => ActionFn(605);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action537::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action605::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (3, __symbol, 171)
    +        (3, __symbol, 187)
         }
    -    pub(crate) fn __reduce433<
    +    pub(crate) fn __reduce470<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -37981,18 +42020,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TryStatement = "try", ":", Suite, ExceptClause+ => ActionFn(538);
    +        // TryStatement = "try", ":", Suite, ExceptClause+ => ActionFn(606);
             let __sym3 = __pop_Variant53(__symbols);
    -        let __sym2 = __pop_Variant72(__symbols);
    +        let __sym2 = __pop_Variant71(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action538::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action606::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (4, __symbol, 171)
    +        (4, __symbol, 187)
         }
    -    pub(crate) fn __reduce434<
    +    pub(crate) fn __reduce471<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38001,17 +42040,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedArgsList = TypedParameterDef, ",", ParameterListStarArgs => ActionFn(627);
    -        let __sym2 = __pop_Variant65(__symbols);
    +        // TypedArgsList<TypedParameter> = TypedParameterDef<TypedParameter>, ",", ParameterListStarArgs<TypedParameter> => ActionFn(695);
    +        let __sym2 = __pop_Variant64(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
    -        let __sym0 = __pop_Variant76(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action627::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action695::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (3, __symbol, 172)
    +        (3, __symbol, 188)
         }
    -    pub(crate) fn __reduce435<
    +    pub(crate) fn __reduce472<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38020,18 +42059,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedArgsList = TypedParameterDef, ("," TypedParameterDef)+, ",", ParameterListStarArgs => ActionFn(628);
    -        let __sym3 = __pop_Variant65(__symbols);
    +        // TypedArgsList<TypedParameter> = TypedParameterDef<TypedParameter>, ("," TypedParameterDef<TypedParameter>)+, ",", ParameterListStarArgs<TypedParameter> => ActionFn(696);
    +        let __sym3 = __pop_Variant64(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant23(__symbols);
    -        let __sym0 = __pop_Variant76(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action628::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action696::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (4, __symbol, 172)
    +        (4, __symbol, 188)
         }
    -    pub(crate) fn __reduce436<
    +    pub(crate) fn __reduce473<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38040,15 +42079,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedArgsList = TypedParameterDef => ActionFn(629);
    -        let __sym0 = __pop_Variant76(__symbols);
    +        // TypedArgsList<TypedParameter> = TypedParameterDef<TypedParameter> => ActionFn(697);
    +        let __sym0 = __pop_Variant77(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action629::<>(__sym0);
    +        let __nt = super::__action697::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (1, __symbol, 172)
    +        (1, __symbol, 188)
         }
    -    pub(crate) fn __reduce437<
    +    pub(crate) fn __reduce474<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38057,16 +42096,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedArgsList = TypedParameterDef, ("," TypedParameterDef)+ => ActionFn(630);
    +        // TypedArgsList<TypedParameter> = TypedParameterDef<TypedParameter>, ("," TypedParameterDef<TypedParameter>)+ => ActionFn(698);
             let __sym1 = __pop_Variant23(__symbols);
    -        let __sym0 = __pop_Variant76(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action630::<>(__sym0, __sym1);
    +        let __nt = super::__action698::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (2, __symbol, 172)
    +        (2, __symbol, 188)
         }
    -    pub(crate) fn __reduce438<
    +    pub(crate) fn __reduce475<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38075,17 +42114,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedArgsList = TypedParameterDef, ",", KwargParameter => ActionFn(631);
    -        let __sym2 = __pop_Variant60(__symbols);
    +        // TypedArgsList<TypedParameter> = TypedParameterDef<TypedParameter>, ",", KwargParameter<TypedParameter> => ActionFn(699);
    +        let __sym2 = __pop_Variant59(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
    -        let __sym0 = __pop_Variant76(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action631::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action699::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (3, __symbol, 172)
    +        (3, __symbol, 188)
         }
    -    pub(crate) fn __reduce439<
    +    pub(crate) fn __reduce476<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38094,18 +42133,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedArgsList = TypedParameterDef, ("," TypedParameterDef)+, ",", KwargParameter => ActionFn(632);
    -        let __sym3 = __pop_Variant60(__symbols);
    +        // TypedArgsList<TypedParameter> = TypedParameterDef<TypedParameter>, ("," TypedParameterDef<TypedParameter>)+, ",", KwargParameter<TypedParameter> => ActionFn(700);
    +        let __sym3 = __pop_Variant59(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant23(__symbols);
    -        let __sym0 = __pop_Variant76(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action632::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action700::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (4, __symbol, 172)
    +        (4, __symbol, 188)
         }
    -    pub(crate) fn __reduce440<
    +    pub(crate) fn __reduce477<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38114,15 +42153,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedArgsList = ParameterListStarArgs => ActionFn(81);
    -        let __sym0 = __pop_Variant65(__symbols);
    +        // TypedArgsList<TypedParameter> = ParameterListStarArgs<TypedParameter> => ActionFn(235);
    +        let __sym0 = __pop_Variant64(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action81::<>(__sym0);
    +        let __nt = super::__action235::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (1, __symbol, 172)
    +        (1, __symbol, 188)
         }
    -    pub(crate) fn __reduce441<
    +    pub(crate) fn __reduce478<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38131,15 +42170,162 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedArgsList = KwargParameter => ActionFn(82);
    -        let __sym0 = __pop_Variant60(__symbols);
    +        // TypedArgsList<TypedParameter> = KwargParameter<TypedParameter> => ActionFn(236);
    +        let __sym0 = __pop_Variant59(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action82::<>(__sym0);
    +        let __nt = super::__action236::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    -        (1, __symbol, 172)
    +        (1, __symbol, 188)
         }
    -    pub(crate) fn __reduce442<
    +    pub(crate) fn __reduce479<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedArgsList<UntypedParameter> = TypedParameterDef<UntypedParameter>, ",", ParameterListStarArgs<UntypedParameter> => ActionFn(701);
    +        let __sym2 = __pop_Variant64(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action701::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    +        (3, __symbol, 189)
    +    }
    +    pub(crate) fn __reduce480<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedArgsList<UntypedParameter> = TypedParameterDef<UntypedParameter>, ("," TypedParameterDef<UntypedParameter>)+, ",", ParameterListStarArgs<UntypedParameter> => ActionFn(702);
    +        let __sym3 = __pop_Variant64(__symbols);
    +        let __sym2 = __pop_Variant0(__symbols);
    +        let __sym1 = __pop_Variant23(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym3.2.clone();
    +        let __nt = super::__action702::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    +        (4, __symbol, 189)
    +    }
    +    pub(crate) fn __reduce481<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedArgsList<UntypedParameter> = TypedParameterDef<UntypedParameter> => ActionFn(703);
    +        let __sym0 = __pop_Variant77(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action703::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    +        (1, __symbol, 189)
    +    }
    +    pub(crate) fn __reduce482<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedArgsList<UntypedParameter> = TypedParameterDef<UntypedParameter>, ("," TypedParameterDef<UntypedParameter>)+ => ActionFn(704);
    +        let __sym1 = __pop_Variant23(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action704::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    +        (2, __symbol, 189)
    +    }
    +    pub(crate) fn __reduce483<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedArgsList<UntypedParameter> = TypedParameterDef<UntypedParameter>, ",", KwargParameter<UntypedParameter> => ActionFn(705);
    +        let __sym2 = __pop_Variant59(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action705::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    +        (3, __symbol, 189)
    +    }
    +    pub(crate) fn __reduce484<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedArgsList<UntypedParameter> = TypedParameterDef<UntypedParameter>, ("," TypedParameterDef<UntypedParameter>)+, ",", KwargParameter<UntypedParameter> => ActionFn(706);
    +        let __sym3 = __pop_Variant59(__symbols);
    +        let __sym2 = __pop_Variant0(__symbols);
    +        let __sym1 = __pop_Variant23(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym3.2.clone();
    +        let __nt = super::__action706::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    +        (4, __symbol, 189)
    +    }
    +    pub(crate) fn __reduce485<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedArgsList<UntypedParameter> = ParameterListStarArgs<UntypedParameter> => ActionFn(219);
    +        let __sym0 = __pop_Variant64(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action219::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    +        (1, __symbol, 189)
    +    }
    +    pub(crate) fn __reduce486<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedArgsList<UntypedParameter> = KwargParameter<UntypedParameter> => ActionFn(220);
    +        let __sym0 = __pop_Variant59(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action220::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant38(__nt), __end);
    +        (1, __symbol, 189)
    +    }
    +    pub(crate) fn __reduce487<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38148,15 +42334,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedArgsList? = TypedArgsList => ActionFn(218);
    +        // TypedArgsList<UntypedParameter>? = TypedArgsList<UntypedParameter> => ActionFn(215);
             let __sym0 = __pop_Variant38(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action218::<>(__sym0);
    +        let __nt = super::__action215::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant39(__nt), __end);
    -        (1, __symbol, 173)
    +        (1, __symbol, 190)
         }
    -    pub(crate) fn __reduce443<
    +    pub(crate) fn __reduce488<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38165,14 +42351,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedArgsList? =  => ActionFn(219);
    +        // TypedArgsList<UntypedParameter>? =  => ActionFn(216);
             let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
             let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    -        let __nt = super::__action219::<>(&__start, &__end);
    +        let __nt = super::__action216::<>(&__start, &__end);
             let __symbol = (__start, __Symbol::Variant39(__nt), __end);
    -        (0, __symbol, 173)
    +        (0, __symbol, 190)
         }
    -    pub(crate) fn __reduce444<
    +    pub(crate) fn __reduce489<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38181,15 +42367,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedParameter = Identifier => ActionFn(86);
    +        // TypedParameter = Identifier, ":", Test => ActionFn(488);
    +        let __sym2 = __pop_Variant42(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
    -        let __end = __sym0.2.clone();
    -        let __nt = super::__action86::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant5(__nt), __end);
    -        (1, __symbol, 174)
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action488::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant75(__nt), __end);
    +        (3, __symbol, 191)
         }
    -    pub(crate) fn __reduce445<
    +    pub(crate) fn __reduce490<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38198,15 +42386,65 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedParameterDef = TypedParameter => ActionFn(84);
    +        // TypedParameter = Identifier => ActionFn(489);
             let __sym0 = __pop_Variant5(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action84::<>(__sym0);
    +        let __nt = super::__action489::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant75(__nt), __end);
    +        (1, __symbol, 191)
    +    }
    +    pub(crate) fn __reduce491<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedParameter? = TypedParameter => ActionFn(373);
    +        let __sym0 = __pop_Variant75(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action373::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant76(__nt), __end);
    -        (1, __symbol, 175)
    +        (1, __symbol, 192)
         }
    -    pub(crate) fn __reduce446<
    +    pub(crate) fn __reduce492<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedParameter? =  => ActionFn(374);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action374::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant76(__nt), __end);
    +        (0, __symbol, 192)
    +    }
    +    pub(crate) fn __reduce493<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedParameterDef<TypedParameter> = TypedParameter => ActionFn(371);
    +        let __sym0 = __pop_Variant75(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action371::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant77(__nt), __end);
    +        (1, __symbol, 193)
    +    }
    +    pub(crate) fn __reduce494<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38215,17 +42453,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedParameterDef = TypedParameter, "=", Test => ActionFn(85);
    +        // TypedParameterDef<TypedParameter> = TypedParameter, "=", Test => ActionFn(372);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
    -        let __sym0 = __pop_Variant5(__symbols);
    +        let __sym0 = __pop_Variant75(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action85::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant76(__nt), __end);
    -        (3, __symbol, 175)
    +        let __nt = super::__action372::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant77(__nt), __end);
    +        (3, __symbol, 193)
         }
    -    pub(crate) fn __reduce447<
    +    pub(crate) fn __reduce495<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38234,15 +42472,51 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedParameters = TypedParameterDef => ActionFn(417);
    -        let __sym0 = __pop_Variant76(__symbols);
    +        // TypedParameterDef<UntypedParameter> = UntypedParameter => ActionFn(362);
    +        let __sym0 = __pop_Variant75(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action417::<>(__sym0);
    +        let __nt = super::__action362::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant77(__nt), __end);
    -        (1, __symbol, 176)
    +        (1, __symbol, 194)
         }
    -    pub(crate) fn __reduce448<
    +    pub(crate) fn __reduce496<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedParameterDef<UntypedParameter> = UntypedParameter, "=", Test => ActionFn(363);
    +        let __sym2 = __pop_Variant42(__symbols);
    +        let __sym1 = __pop_Variant0(__symbols);
    +        let __sym0 = __pop_Variant75(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym2.2.clone();
    +        let __nt = super::__action363::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant77(__nt), __end);
    +        (3, __symbol, 194)
    +    }
    +    pub(crate) fn __reduce497<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedParameters<TypedParameter> = TypedParameterDef<TypedParameter> => ActionFn(468);
    +        let __sym0 = __pop_Variant77(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action468::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant78(__nt), __end);
    +        (1, __symbol, 195)
    +    }
    +    pub(crate) fn __reduce498<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38251,16 +42525,68 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // TypedParameters = TypedParameterDef, ("," TypedParameterDef)+ => ActionFn(418);
    +        // TypedParameters<TypedParameter> = TypedParameterDef<TypedParameter>, ("," TypedParameterDef<TypedParameter>)+ => ActionFn(469);
             let __sym1 = __pop_Variant23(__symbols);
    -        let __sym0 = __pop_Variant76(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action418::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant77(__nt), __end);
    -        (2, __symbol, 176)
    +        let __nt = super::__action469::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant78(__nt), __end);
    +        (2, __symbol, 195)
         }
    -    pub(crate) fn __reduce449<
    +    pub(crate) fn __reduce499<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedParameters<UntypedParameter> = TypedParameterDef<UntypedParameter> => ActionFn(476);
    +        let __sym0 = __pop_Variant77(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action476::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant78(__nt), __end);
    +        (1, __symbol, 196)
    +    }
    +    pub(crate) fn __reduce500<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // TypedParameters<UntypedParameter> = TypedParameterDef<UntypedParameter>, ("," TypedParameterDef<UntypedParameter>)+ => ActionFn(477);
    +        let __sym1 = __pop_Variant23(__symbols);
    +        let __sym0 = __pop_Variant77(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym1.2.clone();
    +        let __nt = super::__action477::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant78(__nt), __end);
    +        (2, __symbol, 196)
    +    }
    +    pub(crate) fn __reduce501<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // UntypedParameter = Identifier => ActionFn(79);
    +        let __sym0 = __pop_Variant5(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action79::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant75(__nt), __end);
    +        (1, __symbol, 197)
    +    }
    +    pub(crate) fn __reduce502<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38269,21 +42595,54 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // WhileStatement = "while", Test, ":", Suite, "else", ":", Suite => ActionFn(506);
    -        let __sym6 = __pop_Variant72(__symbols);
    +        // UntypedParameter? = UntypedParameter => ActionFn(364);
    +        let __sym0 = __pop_Variant75(__symbols);
    +        let __start = __sym0.0.clone();
    +        let __end = __sym0.2.clone();
    +        let __nt = super::__action364::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant76(__nt), __end);
    +        (1, __symbol, 198)
    +    }
    +    pub(crate) fn __reduce503<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // UntypedParameter? =  => ActionFn(365);
    +        let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
    +        let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
    +        let __nt = super::__action365::<>(&__start, &__end);
    +        let __symbol = (__start, __Symbol::Variant76(__nt), __end);
    +        (0, __symbol, 198)
    +    }
    +    pub(crate) fn __reduce504<
    +    >(
    +        __action: i16,
    +        __lookahead_start: Option<&lexer::Location>,
    +        __states: &mut ::std::vec::Vec<i16>,
    +        __symbols: &mut ::std::vec::Vec<(lexer::Location,__Symbol<>,lexer::Location)>,
    +        _: ::std::marker::PhantomData<()>,
    +    ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
    +    {
    +        // WhileStatement = "while", Test, ":", Suite, "else", ":", Suite => ActionFn(572);
    +        let __sym6 = __pop_Variant71(__symbols);
             let __sym5 = __pop_Variant0(__symbols);
             let __sym4 = __pop_Variant0(__symbols);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym6.2.clone();
    -        let __nt = super::__action506::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
    +        let __nt = super::__action572::<>(__sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (7, __symbol, 177)
    +        (7, __symbol, 199)
         }
    -    pub(crate) fn __reduce450<
    +    pub(crate) fn __reduce505<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38292,18 +42651,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // WhileStatement = "while", Test, ":", Suite => ActionFn(507);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        // WhileStatement = "while", Test, ":", Suite => ActionFn(573);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action507::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action573::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (4, __symbol, 177)
    +        (4, __symbol, 199)
         }
    -    pub(crate) fn __reduce451<
    +    pub(crate) fn __reduce506<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38312,17 +42671,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // WithItem = Test, "as", Expression => ActionFn(426);
    +        // WithItem = Test, "as", Expression => ActionFn(491);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action426::<>(__sym0, __sym1, __sym2);
    -        let __symbol = (__start, __Symbol::Variant78(__nt), __end);
    -        (3, __symbol, 178)
    +        let __nt = super::__action491::<>(__sym0, __sym1, __sym2);
    +        let __symbol = (__start, __Symbol::Variant79(__nt), __end);
    +        (3, __symbol, 200)
         }
    -    pub(crate) fn __reduce452<
    +    pub(crate) fn __reduce507<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38331,15 +42690,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // WithItem = Test => ActionFn(427);
    +        // WithItem = Test => ActionFn(492);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action427::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant78(__nt), __end);
    -        (1, __symbol, 178)
    +        let __nt = super::__action492::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant79(__nt), __end);
    +        (1, __symbol, 200)
         }
    -    pub(crate) fn __reduce453<
    +    pub(crate) fn __reduce508<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38348,18 +42707,18 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // WithStatement = "with", WithItem, ":", Suite => ActionFn(583);
    -        let __sym3 = __pop_Variant72(__symbols);
    +        // WithStatement = "with", WithItem, ":", Suite => ActionFn(641);
    +        let __sym3 = __pop_Variant71(__symbols);
             let __sym2 = __pop_Variant0(__symbols);
    -        let __sym1 = __pop_Variant78(__symbols);
    +        let __sym1 = __pop_Variant79(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym3.2.clone();
    -        let __nt = super::__action583::<>(__sym0, __sym1, __sym2, __sym3);
    +        let __nt = super::__action641::<>(__sym0, __sym1, __sym2, __sym3);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (4, __symbol, 179)
    +        (4, __symbol, 201)
         }
    -    pub(crate) fn __reduce454<
    +    pub(crate) fn __reduce509<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38368,19 +42727,19 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // WithStatement = "with", WithItem, ("," WithItem)+, ":", Suite => ActionFn(584);
    -        let __sym4 = __pop_Variant72(__symbols);
    +        // WithStatement = "with", WithItem, ("," WithItem)+, ":", Suite => ActionFn(642);
    +        let __sym4 = __pop_Variant71(__symbols);
             let __sym3 = __pop_Variant0(__symbols);
             let __sym2 = __pop_Variant25(__symbols);
    -        let __sym1 = __pop_Variant78(__symbols);
    +        let __sym1 = __pop_Variant79(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym4.2.clone();
    -        let __nt = super::__action584::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
    +        let __nt = super::__action642::<>(__sym0, __sym1, __sym2, __sym3, __sym4);
             let __symbol = (__start, __Symbol::Variant44(__nt), __end);
    -        (5, __symbol, 179)
    +        (5, __symbol, 201)
         }
    -    pub(crate) fn __reduce455<
    +    pub(crate) fn __reduce510<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38389,17 +42748,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // XorExpression = XorExpression, "^", AndExpression => ActionFn(118);
    +        // XorExpression = XorExpression, "^", AndExpression => ActionFn(110);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action118::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action110::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 180)
    +        (3, __symbol, 202)
         }
    -    pub(crate) fn __reduce456<
    +    pub(crate) fn __reduce511<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38408,15 +42767,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // XorExpression = AndExpression => ActionFn(119);
    +        // XorExpression = AndExpression => ActionFn(111);
             let __sym0 = __pop_Variant42(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action119::<>(__sym0);
    +        let __nt = super::__action111::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 180)
    +        (1, __symbol, 202)
         }
    -    pub(crate) fn __reduce457<
    +    pub(crate) fn __reduce512<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38425,16 +42784,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // YieldExpr = "yield", Test => ActionFn(620);
    +        // YieldExpr = "yield", Test => ActionFn(678);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action620::<>(__sym0, __sym1);
    +        let __nt = super::__action678::<>(__sym0, __sym1);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (2, __symbol, 181)
    +        (2, __symbol, 203)
         }
    -    pub(crate) fn __reduce458<
    +    pub(crate) fn __reduce513<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38443,17 +42802,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // YieldExpr = "yield", Test, ("," Test)+ => ActionFn(621);
    +        // YieldExpr = "yield", Test, ("," Test)+ => ActionFn(679);
             let __sym2 = __pop_Variant15(__symbols);
             let __sym1 = __pop_Variant42(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action621::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action679::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 181)
    +        (3, __symbol, 203)
         }
    -    pub(crate) fn __reduce459<
    +    pub(crate) fn __reduce514<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38462,15 +42821,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // YieldExpr = "yield" => ActionFn(622);
    +        // YieldExpr = "yield" => ActionFn(680);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action622::<>(__sym0);
    +        let __nt = super::__action680::<>(__sym0);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (1, __symbol, 181)
    +        (1, __symbol, 203)
         }
    -    pub(crate) fn __reduce460<
    +    pub(crate) fn __reduce515<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38479,17 +42838,17 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // YieldExpr = "yield", "from", Test => ActionFn(94);
    +        // YieldExpr = "yield", "from", Test => ActionFn(86);
             let __sym2 = __pop_Variant42(__symbols);
             let __sym1 = __pop_Variant0(__symbols);
             let __sym0 = __pop_Variant0(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym2.2.clone();
    -        let __nt = super::__action94::<>(__sym0, __sym1, __sym2);
    +        let __nt = super::__action86::<>(__sym0, __sym1, __sym2);
             let __symbol = (__start, __Symbol::Variant42(__nt), __end);
    -        (3, __symbol, 181)
    +        (3, __symbol, 203)
         }
    -    pub(crate) fn __reduce462<
    +    pub(crate) fn __reduce517<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38498,15 +42857,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // bytes+ = bytes => ActionFn(190);
    +        // bytes+ = bytes => ActionFn(184);
             let __sym0 = __pop_Variant1(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action190::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant79(__nt), __end);
    -        (1, __symbol, 183)
    +        let __nt = super::__action184::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant80(__nt), __end);
    +        (1, __symbol, 205)
         }
    -    pub(crate) fn __reduce463<
    +    pub(crate) fn __reduce518<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38515,16 +42874,16 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // bytes+ = bytes+, bytes => ActionFn(191);
    +        // bytes+ = bytes+, bytes => ActionFn(185);
             let __sym1 = __pop_Variant1(__symbols);
    -        let __sym0 = __pop_Variant79(__symbols);
    +        let __sym0 = __pop_Variant80(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action191::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant79(__nt), __end);
    -        (2, __symbol, 183)
    +        let __nt = super::__action185::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant80(__nt), __end);
    +        (2, __symbol, 205)
         }
    -    pub(crate) fn __reduce464<
    +    pub(crate) fn __reduce519<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38533,15 +42892,15 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // string+ = string => ActionFn(192);
    +        // string+ = string => ActionFn(186);
             let __sym0 = __pop_Variant6(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym0.2.clone();
    -        let __nt = super::__action192::<>(__sym0);
    -        let __symbol = (__start, __Symbol::Variant80(__nt), __end);
    -        (1, __symbol, 184)
    +        let __nt = super::__action186::<>(__sym0);
    +        let __symbol = (__start, __Symbol::Variant81(__nt), __end);
    +        (1, __symbol, 206)
         }
    -    pub(crate) fn __reduce465<
    +    pub(crate) fn __reduce520<
         >(
             __action: i16,
             __lookahead_start: Option<&lexer::Location>,
    @@ -38550,14 +42909,14 @@
             _: ::std::marker::PhantomData<()>,
         ) -> (usize, (lexer::Location,__Symbol<>,lexer::Location), usize)
         {
    -        // string+ = string+, string => ActionFn(193);
    +        // string+ = string+, string => ActionFn(187);
             let __sym1 = __pop_Variant6(__symbols);
    -        let __sym0 = __pop_Variant80(__symbols);
    +        let __sym0 = __pop_Variant81(__symbols);
             let __start = __sym0.0.clone();
             let __end = __sym1.2.clone();
    -        let __nt = super::__action193::<>(__sym0, __sym1);
    -        let __symbol = (__start, __Symbol::Variant80(__nt), __end);
    -        (2, __symbol, 184)
    +        let __nt = super::__action187::<>(__sym0, __sym1);
    +        let __symbol = (__start, __Symbol::Variant81(__nt), __end);
    +        (2, __symbol, 206)
         }
     }
     pub use self::__parse__Top::TopParser;
    @@ -39517,6 +43876,7 @@
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, i, _): (lexer::Location, String, lexer::Location),
         (_, a, _): (lexer::Location, ast::Parameters, lexer::Location),
    +    (_, r, _): (lexer::Location, ::std::option::Option<(lexer::Tok, ast::Expression)>, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, s, _): (lexer::Location, Vec<ast::LocatedStatement>, lexer::Location),
     ) -> ast::LocatedStatement
    @@ -39529,6 +43889,7 @@
                     args: a,
                     body: s,
                     decorator_list: d,
    +                returns: r.map(|x| x.1),
                 }
             }
         }
    @@ -39551,189 +43912,25 @@
     
     fn __action79<
     >(
    -    (_, param1, _): (lexer::Location, (Vec<String>, Vec<ast::Expression>), lexer::Location),
    -    (_, args2, _): (lexer::Location, ::std::option::Option<(lexer::Tok, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>))>, lexer::Location),
    -) -> ast::Parameters
    +    (_, i, _): (lexer::Location, String, lexer::Location),
    +) -> ast::Parameter
     {
    -    {
    -        let (names, default_elements) = param1;
    -
    -        // Now gather rest of parameters:
    -        let (vararg, kwonlyargs, kw_defaults, kwarg) = match args2 {
    -            Some((_, x)) => x,
    -            None => (None, vec![], vec![], None),
    -        };
    -
    -        ast::Parameters {
    -            args: names,
    -            kwonlyargs: kwonlyargs,
    -            vararg: vararg,
    -            kwarg: kwarg,
    -            defaults: default_elements,
    -            kw_defaults: kw_defaults,
    -        }
    -    }
    +    ast::Parameter { arg: i, annotation: None }
     }
     
     fn __action80<
     >(
    -    (_, param1, _): (lexer::Location, (Vec<String>, Vec<ast::Expression>), lexer::Location),
    -    (_, kw, _): (lexer::Location, (lexer::Tok, Option<String>), lexer::Location),
    -) -> ast::Parameters
    +    (_, arg, _): (lexer::Location, String, lexer::Location),
    +    (_, a, _): (lexer::Location, ::std::option::Option<(lexer::Tok, ast::Expression)>, lexer::Location),
    +) -> ast::Parameter
     {
         {
    -        let (names, default_elements) = param1;
    -
    -        // Now gather rest of parameters:
    -        let vararg = None;
    -        let kwonlyargs = vec![];
    -        let kw_defaults = vec![];
    -        let kwarg = Some(kw.1);
    -
    -        ast::Parameters {
    -            args: names,
    -            kwonlyargs: kwonlyargs,
    -            vararg: vararg,
    -            kwarg: kwarg,
    -            defaults: default_elements,
    -            kw_defaults: kw_defaults,
    -        }
    +        let annotation = a.map(|x| Box::new(x.1));
    +        ast::Parameter { arg, annotation }
         }
     }
     
     fn __action81<
    ->(
    -    (_, params, _): (lexer::Location, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>), lexer::Location),
    -) -> ast::Parameters
    -{
    -    {
    -        let (vararg, kwonlyargs, kw_defaults, kwarg) = params;
    -        ast::Parameters {
    -            args: vec![],
    -            kwonlyargs: kwonlyargs,
    -            vararg: vararg,
    -            kwarg: kwarg,
    -            defaults: vec![],
    -            kw_defaults: kw_defaults,
    -        }
    -    }
    -}
    -
    -fn __action82<
    ->(
    -    (_, kw, _): (lexer::Location, Option<String>, lexer::Location),
    -) -> ast::Parameters
    -{
    -    {
    -        ast::Parameters {
    -            args: vec![],
    -            kwonlyargs: vec![],
    -            vararg: None,
    -            kwarg: Some(kw),
    -            defaults: vec![],
    -            kw_defaults: vec![],
    -        }
    -    }
    -}
    -
    -fn __action83<
    ->(
    -    (_, param1, _): (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    -    (_, param2, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -) -> (Vec<String>, Vec<ast::Expression>)
    -{
    -    {
    -        // Combine first parameters:
    -        let mut args = vec![param1];
    -        args.extend(param2.into_iter().map(|x| x.1));
    -
    -        let mut names = vec![];
    -        let mut default_elements = vec![];
    -
    -        for (name, default) in args.into_iter() {
    -            names.push(name.clone());
    -            if let Some(default) = default {
    -                default_elements.push(default);
    -            } else {
    -                if default_elements.len() > 0 {
    -                    // Once we have started with defaults, all remaining arguments must
    -                    // have defaults
    -                    panic!(
    -                        "non-default argument follows default argument: {}",
    -                        name
    -                    );
    -                }
    -            }
    -        }
    -
    -        (names, default_elements)
    -    }
    -}
    -
    -fn __action84<
    ->(
    -    (_, i, _): (lexer::Location, String, lexer::Location),
    -) -> (String, Option<ast::Expression>)
    -{
    -    (i, None)
    -}
    -
    -fn __action85<
    ->(
    -    (_, i, _): (lexer::Location, String, lexer::Location),
    -    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    -    (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    -) -> (String, Option<ast::Expression>)
    -{
    -    (i, Some(e))
    -}
    -
    -fn __action86<
    ->(
    -    (_, __0, _): (lexer::Location, String, lexer::Location),
    -) -> String
    -{
    -    (__0)
    -}
    -
    -fn __action87<
    ->(
    -    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    -    (_, va, _): (lexer::Location, ::std::option::Option<String>, lexer::Location),
    -    (_, kw, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -    (_, kwarg, _): (lexer::Location, ::std::option::Option<(lexer::Tok, Option<String>)>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    -{
    -    {
    -        // Extract keyword arguments:
    -        let mut kwonlyargs = vec![];
    -        let mut kw_defaults = vec![];
    -        for (name, value) in kw.into_iter().map(|x| x.1) {
    -            kwonlyargs.push(name);
    -            kw_defaults.push(value);
    -        }
    -
    -        let kwarg = match kwarg {
    -            Some((_, name)) => Some(name),
    -            None => None,
    -        };
    -
    -        (Some(va), kwonlyargs, kw_defaults, kwarg)
    -    }
    -}
    -
    -fn __action88<
    ->(
    -    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    -    (_, kwarg, _): (lexer::Location, ::std::option::Option<String>, lexer::Location),
    -) -> Option<String>
    -{
    -    {
    -        kwarg
    -    }
    -}
    -
    -fn __action89<
     >(
         (_, d, _): (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
         (_, loc, _): (lexer::Location, lexer::Location, lexer::Location),
    @@ -39762,7 +43959,7 @@
         }
     }
     
    -fn __action90<
    +fn __action82<
     >(
         (_, n, _): (lexer::Location, String, lexer::Location),
     ) -> ast::Expression
    @@ -39770,7 +43967,7 @@
         ast::Expression::Identifier { name: n }
     }
     
    -fn __action91<
    +fn __action83<
     >(
         (_, p, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -39785,7 +43982,7 @@
         }
     }
     
    -fn __action92<
    +fn __action84<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, p, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -39805,7 +44002,7 @@
         }
     }
     
    -fn __action93<
    +fn __action85<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, ex, _): (lexer::Location, ::std::option::Option<Vec<ast::Expression>>, lexer::Location),
    @@ -39824,7 +44021,7 @@
         }
     }
     
    -fn __action94<
    +fn __action86<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -39838,7 +44035,7 @@
         }
     }
     
    -fn __action95<
    +fn __action87<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, c, _): (lexer::Location, ::std::option::Option<(lexer::Tok, ast::Expression, lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -39858,7 +44055,7 @@
         }
     }
     
    -fn __action96<
    +fn __action88<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -39866,7 +44063,7 @@
         e
     }
     
    -fn __action97<
    +fn __action89<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, p, _): (lexer::Location, ::std::option::Option<ast::Parameters>, lexer::Location),
    @@ -39880,7 +44077,7 @@
            }
     }
     
    -fn __action98<
    +fn __action90<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -39888,7 +44085,7 @@
         e
     }
     
    -fn __action99<
    +fn __action91<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -39898,7 +44095,7 @@
         ast::Expression::BoolOp { a: Box::new(e1), op: ast::BooleanOperator::Or, b: Box::new(e2) }
     }
     
    -fn __action100<
    +fn __action92<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -39906,7 +44103,7 @@
         e
     }
     
    -fn __action101<
    +fn __action93<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -39916,7 +44113,7 @@
         ast::Expression::BoolOp { a: Box::new(e1), op: ast::BooleanOperator::And, b: Box::new(e2) }
     }
     
    -fn __action102<
    +fn __action94<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -39925,7 +44122,7 @@
         ast::Expression::Unop { a: Box::new(e), op: ast::UnaryOperator::Not }
     }
     
    -fn __action103<
    +fn __action95<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -39933,7 +44130,7 @@
         e
     }
     
    -fn __action104<
    +fn __action96<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, op, _): (lexer::Location, ast::Comparison, lexer::Location),
    @@ -39943,7 +44140,7 @@
         ast::Expression::Compare { a: Box::new(e1), op: op, b: Box::new(e2) }
     }
     
    -fn __action105<
    +fn __action97<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -39951,7 +44148,7 @@
         e
     }
     
    -fn __action106<
    +fn __action98<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Comparison
    @@ -39959,7 +44156,7 @@
         ast::Comparison::Equal
     }
     
    -fn __action107<
    +fn __action99<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Comparison
    @@ -39967,7 +44164,7 @@
         ast::Comparison::NotEqual
     }
     
    -fn __action108<
    +fn __action100<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Comparison
    @@ -39975,7 +44172,7 @@
         ast::Comparison::Less
     }
     
    -fn __action109<
    +fn __action101<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Comparison
    @@ -39983,7 +44180,7 @@
         ast::Comparison::LessOrEqual
     }
     
    -fn __action110<
    +fn __action102<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Comparison
    @@ -39991,7 +44188,7 @@
         ast::Comparison::Greater
     }
     
    -fn __action111<
    +fn __action103<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Comparison
    @@ -39999,7 +44196,7 @@
         ast::Comparison::GreaterOrEqual
     }
     
    -fn __action112<
    +fn __action104<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Comparison
    @@ -40007,7 +44204,7 @@
         ast::Comparison::In
     }
     
    -fn __action113<
    +fn __action105<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, __1, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40016,7 +44213,7 @@
         ast::Comparison::NotIn
     }
     
    -fn __action114<
    +fn __action106<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Comparison
    @@ -40024,7 +44221,7 @@
         ast::Comparison::Is
     }
     
    -fn __action115<
    +fn __action107<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, __1, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40033,7 +44230,7 @@
         ast::Comparison::IsNot
     }
     
    -fn __action116<
    +fn __action108<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40043,7 +44240,7 @@
         ast::Expression::Binop { a: Box::new(e1), op: ast::Operator::BitOr, b: Box::new(e2) }
     }
     
    -fn __action117<
    +fn __action109<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -40051,7 +44248,7 @@
         e
     }
     
    -fn __action118<
    +fn __action110<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40061,7 +44258,7 @@
         ast::Expression::Binop { a: Box::new(e1), op: ast::Operator::BitXor, b: Box::new(e2) }
     }
     
    -fn __action119<
    +fn __action111<
     >(
         (_, __0, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -40069,7 +44266,7 @@
         (__0)
     }
     
    -fn __action120<
    +fn __action112<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40079,7 +44276,7 @@
         ast::Expression::Binop { a: Box::new(e1), op: ast::Operator::BitAnd, b: Box::new(e2) }
     }
     
    -fn __action121<
    +fn __action113<
     >(
         (_, __0, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -40087,7 +44284,7 @@
         (__0)
     }
     
    -fn __action122<
    +fn __action114<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, op, _): (lexer::Location, ast::Operator, lexer::Location),
    @@ -40097,7 +44294,7 @@
         ast::Expression::Binop { a: Box::new(e1), op: op, b: Box::new(e2) }
     }
     
    -fn __action123<
    +fn __action115<
     >(
         (_, __0, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -40105,7 +44302,7 @@
         (__0)
     }
     
    -fn __action124<
    +fn __action116<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Operator
    @@ -40113,7 +44310,7 @@
         ast::Operator::LShift
     }
     
    -fn __action125<
    +fn __action117<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Operator
    @@ -40121,7 +44318,7 @@
         ast::Operator::RShift
     }
     
    -fn __action126<
    +fn __action118<
     >(
         (_, a, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, op, _): (lexer::Location, ast::Operator, lexer::Location),
    @@ -40131,7 +44328,7 @@
         ast::Expression::Binop { a: Box::new(a), op: op, b: Box::new(b) }
     }
     
    -fn __action127<
    +fn __action119<
     >(
         (_, __0, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -40139,7 +44336,7 @@
         (__0)
     }
     
    -fn __action128<
    +fn __action120<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Operator
    @@ -40147,7 +44344,7 @@
         ast::Operator::Add
     }
     
    -fn __action129<
    +fn __action121<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Operator
    @@ -40155,7 +44352,7 @@
         ast::Operator::Sub
     }
     
    -fn __action130<
    +fn __action122<
     >(
         (_, a, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, op, _): (lexer::Location, ast::Operator, lexer::Location),
    @@ -40165,7 +44362,7 @@
         ast::Expression::Binop { a: Box::new(a), op: op, b: Box::new(b) }
     }
     
    -fn __action131<
    +fn __action123<
     >(
         (_, __0, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -40173,7 +44370,7 @@
         (__0)
     }
     
    -fn __action132<
    +fn __action124<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Operator
    @@ -40181,7 +44378,7 @@
         ast::Operator::Mult
     }
     
    -fn __action133<
    +fn __action125<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Operator
    @@ -40189,7 +44386,7 @@
         ast::Operator::Div
     }
     
    -fn __action134<
    +fn __action126<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Operator
    @@ -40197,7 +44394,7 @@
         ast::Operator::FloorDiv
     }
     
    -fn __action135<
    +fn __action127<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Operator
    @@ -40205,7 +44402,7 @@
         ast::Operator::Mod
     }
     
    -fn __action136<
    +fn __action128<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Operator
    @@ -40213,7 +44410,7 @@
         ast::Operator::MatMult
     }
     
    -fn __action137<
    +fn __action129<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40222,7 +44419,7 @@
         ast::Expression::Unop { a: Box::new(e), op: ast::UnaryOperator::Pos }
     }
     
    -fn __action138<
    +fn __action130<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40231,7 +44428,7 @@
         ast::Expression::Unop { a: Box::new(e), op: ast::UnaryOperator::Neg }
     }
     
    -fn __action139<
    +fn __action131<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40240,7 +44437,7 @@
         ast::Expression::Unop { a: Box::new(e), op: ast::UnaryOperator::Inv }
     }
     
    -fn __action140<
    +fn __action132<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -40248,7 +44445,7 @@
         e
     }
     
    -fn __action141<
    +fn __action133<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, e2, _): (lexer::Location, ::std::option::Option<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -40262,7 +44459,7 @@
         }
     }
     
    -fn __action142<
    +fn __action134<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -40270,7 +44467,7 @@
         e
     }
     
    -fn __action143<
    +fn __action135<
     >(
         (_, f, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40281,7 +44478,7 @@
         ast::Expression::Call { function: Box::new(f), args: a.0, keywords: a.1 }
     }
     
    -fn __action144<
    +fn __action136<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40292,7 +44489,7 @@
         ast::Expression::Subscript { a: Box::new(e), b: Box::new(s) }
     }
     
    -fn __action145<
    +fn __action137<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40302,7 +44499,27 @@
         ast::Expression::Attribute { value: Box::new(e), name: n }
     }
     
    -fn __action146<
    +fn __action138<
    +>(
    +    (_, s1, _): (lexer::Location, ast::Expression, lexer::Location),
    +    (_, s2, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    +    (_, _, _): (lexer::Location, ::std::option::Option<lexer::Tok>, lexer::Location),
    +) -> ast::Expression
    +{
    +    {
    +        if s2.is_empty() {
    +            s1
    +        } else {
    +            let mut dims = vec![s1];
    +            for x in s2 {
    +                dims.push(x.1)
    +            }
    +            ast::Expression::Tuple { elements: dims }
    +        }
    +    }
    +}
    +
    +fn __action139<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -40310,7 +44527,7 @@
         e
     }
     
    -fn __action147<
    +fn __action140<
     >(
         (_, e1, _): (lexer::Location, ::std::option::Option<ast::Expression>, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40326,7 +44543,7 @@
         }
     }
     
    -fn __action148<
    +fn __action141<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ::std::option::Option<ast::Expression>, lexer::Location),
    @@ -40335,7 +44552,7 @@
         e.unwrap_or(ast::Expression::None)
     }
     
    -fn __action149<
    +fn __action142<
     >(
         (_, s, _): (lexer::Location, ast::StringGroup, lexer::Location),
     ) -> ast::Expression
    @@ -40343,7 +44560,7 @@
         ast::Expression::String { value: s }
     }
     
    -fn __action150<
    +fn __action143<
     >(
         (_, b, _): (lexer::Location, Vec<u8>, lexer::Location),
     ) -> ast::Expression
    @@ -40351,7 +44568,7 @@
         ast::Expression::Bytes { value: b }
     }
     
    -fn __action151<
    +fn __action144<
     >(
         (_, n, _): (lexer::Location, ast::Number, lexer::Location),
     ) -> ast::Expression
    @@ -40359,7 +44576,7 @@
         ast::Expression::Number { value: n }
     }
     
    -fn __action152<
    +fn __action145<
     >(
         (_, i, _): (lexer::Location, String, lexer::Location),
     ) -> ast::Expression
    @@ -40367,7 +44584,7 @@
         ast::Expression::Identifier { name: i }
     }
     
    -fn __action153<
    +fn __action146<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ::std::option::Option<Vec<ast::Expression>>, lexer::Location),
    @@ -40380,7 +44597,7 @@
         }
     }
     
    -fn __action154<
    +fn __action147<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40393,7 +44610,7 @@
         }
     }
     
    -fn __action155<
    +fn __action148<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ::std::option::Option<Vec<ast::Expression>>, lexer::Location),
    @@ -40416,7 +44633,7 @@
         }
     }
     
    -fn __action156<
    +fn __action149<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40432,7 +44649,7 @@
         }
     }
     
    -fn __action157<
    +fn __action150<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ::std::option::Option<Vec<(ast::Expression, ast::Expression)>>, lexer::Location),
    @@ -40442,7 +44659,7 @@
         ast::Expression::Dict { elements: e.unwrap_or(Vec::new()) }
     }
     
    -fn __action158<
    +fn __action151<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40452,7 +44669,7 @@
         e
     }
     
    -fn __action159<
    +fn __action152<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, Vec<ast::Expression>, lexer::Location),
    @@ -40462,7 +44679,7 @@
         ast::Expression::Set { elements: e }
     }
     
    -fn __action160<
    +fn __action153<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40472,7 +44689,7 @@
         e
     }
     
    -fn __action161<
    +fn __action154<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Expression
    @@ -40480,7 +44697,7 @@
         ast::Expression::True
     }
     
    -fn __action162<
    +fn __action155<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Expression
    @@ -40488,7 +44705,7 @@
         ast::Expression::False
     }
     
    -fn __action163<
    +fn __action156<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Expression
    @@ -40496,7 +44713,15 @@
         ast::Expression::None
     }
     
    -fn __action164<
    +fn __action157<
    +>(
    +    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    +) -> ast::Expression
    +{
    +    ast::Expression::Ellipsis
    +}
    +
    +fn __action158<
     >(
         (_, e, _): (lexer::Location, Vec<ast::Expression>, lexer::Location),
         (_, _trailing_comma, _): (lexer::Location, ::std::option::Option<lexer::Tok>, lexer::Location),
    @@ -40507,7 +44732,7 @@
         }
     }
     
    -fn __action165<
    +fn __action159<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, c, _): (lexer::Location, Vec<ast::Comprehension>, lexer::Location),
    @@ -40521,7 +44746,7 @@
         }
     }
     
    -fn __action166<
    +fn __action160<
     >(
         (_, e1, _): (lexer::Location, Vec<(ast::Expression, ast::Expression)>, lexer::Location),
         (_, _trailing_comma, _): (lexer::Location, ::std::option::Option<lexer::Tok>, lexer::Location),
    @@ -40532,7 +44757,7 @@
         }
     }
     
    -fn __action167<
    +fn __action161<
     >(
         (_, e1, _): (lexer::Location, (ast::Expression, ast::Expression), lexer::Location),
         (_, c, _): (lexer::Location, Vec<ast::Comprehension>, lexer::Location),
    @@ -40546,7 +44771,7 @@
         }
     }
     
    -fn __action168<
    +fn __action162<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40556,7 +44781,7 @@
         (e1, e2)
     }
     
    -fn __action169<
    +fn __action163<
     >(
         (_, e1, _): (lexer::Location, Vec<ast::Expression>, lexer::Location),
         (_, _, _): (lexer::Location, ::std::option::Option<lexer::Tok>, lexer::Location),
    @@ -40567,7 +44792,7 @@
         }
     }
     
    -fn __action170<
    +fn __action164<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, c, _): (lexer::Location, Vec<ast::Comprehension>, lexer::Location),
    @@ -40581,7 +44806,7 @@
         }
     }
     
    -fn __action171<
    +fn __action165<
     >(
         (_, e, _): (lexer::Location, Vec<ast::Expression>, lexer::Location),
     ) -> ast::Expression
    @@ -40595,7 +44820,7 @@
         }
     }
     
    -fn __action172<
    +fn __action166<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, e2, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -40609,7 +44834,7 @@
         }
     }
     
    -fn __action173<
    +fn __action167<
     >(
         (_, e1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, e2, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -40622,7 +44847,7 @@
       }
     }
     
    -fn __action174<
    +fn __action168<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40631,7 +44856,7 @@
         ast::Expression::Starred { value: Box::new(e) }
     }
     
    -fn __action175<
    +fn __action169<
     >(
         (_, c, _): (lexer::Location, ::std::vec::Vec<ast::Comprehension>, lexer::Location),
     ) -> Vec<ast::Comprehension>
    @@ -40639,7 +44864,7 @@
         c
     }
     
    -fn __action176<
    +fn __action170<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40657,7 +44882,7 @@
         }
     }
     
    -fn __action177<
    +fn __action171<
     >(
         (_, __0, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -40665,7 +44890,7 @@
         (__0)
     }
     
    -fn __action178<
    +fn __action172<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, c, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40674,7 +44899,7 @@
         c
     }
     
    -fn __action179<
    +fn __action173<
     >(
         (_, e, _): (lexer::Location, Vec<(Option<Option<String>>, ast::Expression)>, lexer::Location),
     ) -> (Vec<ast::Expression>, Vec<ast::Keyword>)
    @@ -40699,7 +44924,7 @@
         }
     }
     
    -fn __action180<
    +fn __action174<
     >(
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, c, _): (lexer::Location, ::std::option::Option<Vec<ast::Comprehension>>, lexer::Location),
    @@ -40717,7 +44942,7 @@
         }
     }
     
    -fn __action181<
    +fn __action175<
     >(
         (_, i, _): (lexer::Location, String, lexer::Location),
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    @@ -40727,7 +44952,7 @@
         (Some(Some(i.clone())), e)
     }
     
    -fn __action182<
    +fn __action176<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40736,7 +44961,7 @@
         (None, ast::Expression::Starred { value: Box::new(e) })
     }
     
    -fn __action183<
    +fn __action177<
     >(
         (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40745,7 +44970,7 @@
         (Some(None), e)
     }
     
    -fn __action184<
    +fn __action178<
     >(
         (_, s, _): (lexer::Location, BigInt, lexer::Location),
     ) -> ast::Number
    @@ -40753,7 +44978,7 @@
         { ast::Number::Integer { value: s } }
     }
     
    -fn __action185<
    +fn __action179<
     >(
         (_, s, _): (lexer::Location, f64, lexer::Location),
     ) -> ast::Number
    @@ -40761,7 +44986,7 @@
         { ast::Number::Float { value: s } }
     }
     
    -fn __action186<
    +fn __action180<
     >(
         (_, s, _): (lexer::Location, (f64, f64), lexer::Location),
     ) -> ast::Number
    @@ -40769,7 +44994,7 @@
         { ast::Number::Complex { real: s.0, imag: s.1 } }
     }
     
    -fn __action187<
    +fn __action181<
     >(
         (_, s, _): (lexer::Location, ::std::vec::Vec<(String, bool)>, lexer::Location),
     ) -> Result<ast::StringGroup,__lalrpop_util::ParseError<lexer::Location,lexer::Tok,lexer::LexicalError>>
    @@ -40778,7 +45003,7 @@
             let mut values = vec![];
             for (value, is_fstring) in s {
                 values.push(if is_fstring {
    -                parser::parse_fstring(&value)?
    +                parse_fstring(&value)?
                 } else {
                     ast::StringGroup::Constant { value }
                 })
    @@ -40792,7 +45017,7 @@
         }
     }
     
    -fn __action188<
    +fn __action182<
     >(
         (_, s, _): (lexer::Location, ::std::vec::Vec<Vec<u8>>, lexer::Location),
     ) -> Vec<u8>
    @@ -40802,7 +45027,7 @@
         }
     }
     
    -fn __action189<
    +fn __action183<
     >(
         (_, s, _): (lexer::Location, String, lexer::Location),
     ) -> String
    @@ -40810,7 +45035,7 @@
         s
     }
     
    -fn __action190<
    +fn __action184<
     >(
         (_, __0, _): (lexer::Location, Vec<u8>, lexer::Location),
     ) -> ::std::vec::Vec<Vec<u8>>
    @@ -40818,7 +45043,7 @@
         vec![__0]
     }
     
    -fn __action191<
    +fn __action185<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<Vec<u8>>, lexer::Location),
         (_, e, _): (lexer::Location, Vec<u8>, lexer::Location),
    @@ -40827,7 +45052,7 @@
         { let mut v = v; v.push(e); v }
     }
     
    -fn __action192<
    +fn __action186<
     >(
         (_, __0, _): (lexer::Location, (String, bool), lexer::Location),
     ) -> ::std::vec::Vec<(String, bool)>
    @@ -40835,7 +45060,7 @@
         vec![__0]
     }
     
    -fn __action193<
    +fn __action187<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<(String, bool)>, lexer::Location),
         (_, e, _): (lexer::Location, (String, bool), lexer::Location),
    @@ -40844,7 +45069,7 @@
         { let mut v = v; v.push(e); v }
     }
     
    -fn __action194<
    +fn __action188<
     >(
         (_, __0, _): (lexer::Location, Vec<ast::Comprehension>, lexer::Location),
     ) -> ::std::option::Option<Vec<ast::Comprehension>>
    @@ -40852,7 +45077,7 @@
         Some(__0)
     }
     
    -fn __action195<
    +fn __action189<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -40861,7 +45086,7 @@
         None
     }
     
    -fn __action196<
    +fn __action190<
     >(
         (_, items, _): (lexer::Location, ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>, lexer::Location),
         (_, last, _): (lexer::Location, ::std::option::Option<(Option<Option<String>>, ast::Expression)>, lexer::Location),
    @@ -40874,7 +45099,7 @@
         }
     }
     
    -fn __action197<
    +fn __action191<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -40883,7 +45108,7 @@
         vec![]
     }
     
    -fn __action198<
    +fn __action192<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
     ) -> ::std::vec::Vec<ast::Expression>
    @@ -40891,7 +45116,7 @@
         v
     }
     
    -fn __action199<
    +fn __action193<
     >(
         (_, __0, _): (lexer::Location, ast::Comprehension, lexer::Location),
     ) -> ::std::vec::Vec<ast::Comprehension>
    @@ -40899,7 +45124,7 @@
         vec![__0]
     }
     
    -fn __action200<
    +fn __action194<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<ast::Comprehension>, lexer::Location),
         (_, e, _): (lexer::Location, ast::Comprehension, lexer::Location),
    @@ -40908,7 +45133,7 @@
         { let mut v = v; v.push(e); v }
     }
     
    -fn __action201<
    +fn __action195<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -40917,7 +45142,7 @@
         vec![]
     }
     
    -fn __action202<
    +fn __action196<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
     ) -> ::std::vec::Vec<(lexer::Tok, ast::Expression)>
    @@ -40925,7 +45150,7 @@
         v
     }
     
    -fn __action203<
    +fn __action197<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -40934,7 +45159,7 @@
         vec![]
     }
     
    -fn __action204<
    +fn __action198<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
     ) -> ::std::vec::Vec<(lexer::Tok, ast::Expression)>
    @@ -40942,7 +45167,7 @@
         v
     }
     
    -fn __action205<
    +fn __action199<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, __1, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -40951,7 +45176,7 @@
         (__0, __1)
     }
     
    -fn __action206<
    +fn __action200<
     >(
         (_, i1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, i2, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -40964,7 +45189,7 @@
         }
     }
     
    -fn __action207<
    +fn __action201<
     >(
         (_, i1, _): (lexer::Location, (ast::Expression, ast::Expression), lexer::Location),
         (_, i2, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>, lexer::Location),
    @@ -40977,7 +45202,7 @@
         }
     }
     
    -fn __action208<
    +fn __action202<
     >(
         (_, i1, _): (lexer::Location, ast::Expression, lexer::Location),
         (_, i2, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -40990,7 +45215,7 @@
         }
     }
     
    -fn __action209<
    +fn __action203<
     >(
         (_, __0, _): (lexer::Location, Vec<(ast::Expression, ast::Expression)>, lexer::Location),
     ) -> ::std::option::Option<Vec<(ast::Expression, ast::Expression)>>
    @@ -40998,7 +45223,7 @@
         Some(__0)
     }
     
    -fn __action210<
    +fn __action204<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -41007,7 +45232,7 @@
         None
     }
     
    -fn __action211<
    +fn __action205<
     >(
         (_, __0, _): (lexer::Location, Vec<ast::Expression>, lexer::Location),
     ) -> ::std::option::Option<Vec<ast::Expression>>
    @@ -41015,7 +45240,7 @@
         Some(__0)
     }
     
    -fn __action212<
    +fn __action206<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -41024,7 +45249,7 @@
         None
     }
     
    -fn __action213<
    +fn __action207<
     >(
         (_, __0, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ::std::option::Option<ast::Expression>
    @@ -41032,7 +45257,7 @@
         Some(__0)
     }
     
    -fn __action214<
    +fn __action208<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -41041,7 +45266,33 @@
         None
     }
     
    -fn __action215<
    +fn __action209<
    +>(
    +    __lookbehind: &lexer::Location,
    +    __lookahead: &lexer::Location,
    +) -> ::std::vec::Vec<(lexer::Tok, ast::Expression)>
    +{
    +    vec![]
    +}
    +
    +fn __action210<
    +>(
    +    (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, ast::Expression)>
    +{
    +    v
    +}
    +
    +fn __action211<
    +>(
    +    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, __1, _): (lexer::Location, ast::Expression, lexer::Location),
    +) -> (lexer::Tok, ast::Expression)
    +{
    +    (__0, __1)
    +}
    +
    +fn __action212<
     >(
         (_, __0, _): (lexer::Location, (lexer::Tok, ast::Expression), lexer::Location),
     ) -> ::std::option::Option<(lexer::Tok, ast::Expression)>
    @@ -41049,7 +45300,7 @@
         Some(__0)
     }
     
    -fn __action216<
    +fn __action213<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -41058,7 +45309,7 @@
         None
     }
     
    -fn __action217<
    +fn __action214<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, __1, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -41067,7 +45318,7 @@
         (__0, __1)
     }
     
    -fn __action218<
    +fn __action215<
     >(
         (_, __0, _): (lexer::Location, ast::Parameters, lexer::Location),
     ) -> ::std::option::Option<ast::Parameters>
    @@ -41075,7 +45326,7 @@
         Some(__0)
     }
     
    -fn __action219<
    +fn __action216<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -41084,7 +45335,94 @@
         None
     }
     
    +fn __action217<
    +>(
    +    (_, param1, _): (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location),
    +    (_, args2, _): (lexer::Location, ::std::option::Option<(lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))>, lexer::Location),
    +) -> ast::Parameters
    +{
    +    {
    +        let (names, default_elements) = param1;
    +
    +        // Now gather rest of parameters:
    +        let (vararg, kwonlyargs, kw_defaults, kwarg) = match args2 {
    +            Some((_, x)) => x,
    +            None => (None, vec![], vec![], None),
    +        };
    +
    +        ast::Parameters {
    +            args: names,
    +            kwonlyargs: kwonlyargs,
    +            vararg: vararg.into(),
    +            kwarg: kwarg.into(),
    +            defaults: default_elements,
    +            kw_defaults: kw_defaults,
    +        }
    +    }
    +}
    +
    +fn __action218<
    +>(
    +    (_, param1, _): (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location),
    +    (_, kw, _): (lexer::Location, (lexer::Tok, Option<ast::Parameter>), lexer::Location),
    +) -> ast::Parameters
    +{
    +    {
    +        let (names, default_elements) = param1;
    +
    +        // Now gather rest of parameters:
    +        let vararg = None;
    +        let kwonlyargs = vec![];
    +        let kw_defaults = vec![];
    +        let kwarg = Some(kw.1);
    +
    +        ast::Parameters {
    +            args: names,
    +            kwonlyargs: kwonlyargs,
    +            vararg: vararg.into(),
    +            kwarg: kwarg.into(),
    +            defaults: default_elements,
    +            kw_defaults: kw_defaults,
    +        }
    +    }
    +}
    +
    +fn __action219<
    +>(
    +    (_, params, _): (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
    +) -> ast::Parameters
    +{
    +    {
    +        let (vararg, kwonlyargs, kw_defaults, kwarg) = params;
    +        ast::Parameters {
    +            args: vec![],
    +            kwonlyargs: kwonlyargs,
    +            vararg: vararg.into(),
    +            kwarg: kwarg.into(),
    +            defaults: vec![],
    +            kw_defaults: kw_defaults,
    +        }
    +    }
    +}
    +
     fn __action220<
    +>(
    +    (_, kw, _): (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> ast::Parameters
    +{
    +    {
    +        ast::Parameters {
    +            args: vec![],
    +            kwonlyargs: vec![],
    +            vararg: ast::Varargs::None,
    +            kwarg: Some(kw).into(),
    +            defaults: vec![],
    +            kw_defaults: vec![],
    +        }
    +    }
    +}
    +
    +fn __action221<
     >(
         (_, __0, _): (lexer::Location, (lexer::Tok, ast::Expression, lexer::Tok, ast::Expression), lexer::Location),
     ) -> ::std::option::Option<(lexer::Tok, ast::Expression, lexer::Tok, ast::Expression)>
    @@ -41092,7 +45430,7 @@
         Some(__0)
     }
     
    -fn __action221<
    +fn __action222<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -41101,7 +45439,7 @@
         None
     }
     
    -fn __action222<
    +fn __action223<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, __1, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -41112,7 +45450,7 @@
         (__0, __1, __2, __3)
     }
     
    -fn __action223<
    +fn __action224<
     >(
         (_, __0, _): (lexer::Location, (lexer::Tok, (Vec<ast::Expression>, Vec<ast::Keyword>), lexer::Tok), lexer::Location),
     ) -> ::std::option::Option<(lexer::Tok, (Vec<ast::Expression>, Vec<ast::Keyword>), lexer::Tok)>
    @@ -41120,7 +45458,7 @@
         Some(__0)
     }
     
    -fn __action224<
    +fn __action225<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -41129,7 +45467,7 @@
         None
     }
     
    -fn __action225<
    +fn __action226<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, __1, _): (lexer::Location, (Vec<ast::Expression>, Vec<ast::Keyword>), lexer::Location),
    @@ -41139,105 +45477,148 @@
         (__0, __1, __2)
     }
     
    -fn __action226<
    +fn __action227<
     >(
    -    (_, __0, _): (lexer::Location, (lexer::Tok, Option<String>), lexer::Location),
    -) -> ::std::option::Option<(lexer::Tok, Option<String>)>
    +    (_, __0, _): (lexer::Location, (lexer::Tok, ast::Expression), lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, ast::Expression)>
     {
         Some(__0)
     }
     
    -fn __action227<
    +fn __action228<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    -) -> ::std::option::Option<(lexer::Tok, Option<String>)>
    +) -> ::std::option::Option<(lexer::Tok, ast::Expression)>
     {
         None
     }
     
    -fn __action228<
    ->(
    -    (_, __0, _): (lexer::Location, String, lexer::Location),
    -) -> ::std::option::Option<String>
    -{
    -    Some(__0)
    -}
    -
     fn __action229<
     >(
    -    __lookbehind: &lexer::Location,
    -    __lookahead: &lexer::Location,
    -) -> ::std::option::Option<String>
    +    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, __1, _): (lexer::Location, ast::Expression, lexer::Location),
    +) -> (lexer::Tok, ast::Expression)
     {
    -    None
    +    (__0, __1)
     }
     
     fn __action230<
     >(
    -    __lookbehind: &lexer::Location,
    -    __lookahead: &lexer::Location,
    -) -> ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>
    +    (_, __0, _): (lexer::Location, ast::Parameters, lexer::Location),
    +) -> ::std::option::Option<ast::Parameters>
     {
    -    vec![]
    +    Some(__0)
     }
     
     fn __action231<
     >(
    -    (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -) -> ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>
    +    __lookbehind: &lexer::Location,
    +    __lookahead: &lexer::Location,
    +) -> ::std::option::Option<ast::Parameters>
     {
    -    v
    +    None
     }
     
     fn __action232<
     >(
    -    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    -    (_, __1, _): (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    -) -> (lexer::Tok, (String, Option<ast::Expression>))
    +    (_, __0, _): (lexer::Location, ast::Parameters, lexer::Location),
    +) -> ast::Parameters
     {
    -    (__0, __1)
    +    (__0)
     }
     
     fn __action233<
     >(
    -    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    -    (_, __1, _): (lexer::Location, Option<String>, lexer::Location),
    -) -> (lexer::Tok, Option<String>)
    +    (_, param1, _): (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location),
    +    (_, args2, _): (lexer::Location, ::std::option::Option<(lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))>, lexer::Location),
    +) -> ast::Parameters
     {
    -    (__0, __1)
    +    {
    +        let (names, default_elements) = param1;
    +
    +        // Now gather rest of parameters:
    +        let (vararg, kwonlyargs, kw_defaults, kwarg) = match args2 {
    +            Some((_, x)) => x,
    +            None => (None, vec![], vec![], None),
    +        };
    +
    +        ast::Parameters {
    +            args: names,
    +            kwonlyargs: kwonlyargs,
    +            vararg: vararg.into(),
    +            kwarg: kwarg.into(),
    +            defaults: default_elements,
    +            kw_defaults: kw_defaults,
    +        }
    +    }
     }
     
     fn __action234<
     >(
    -    (_, __0, _): (lexer::Location, (lexer::Tok, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)), lexer::Location),
    -) -> ::std::option::Option<(lexer::Tok, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>))>
    +    (_, param1, _): (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location),
    +    (_, kw, _): (lexer::Location, (lexer::Tok, Option<ast::Parameter>), lexer::Location),
    +) -> ast::Parameters
     {
    -    Some(__0)
    +    {
    +        let (names, default_elements) = param1;
    +
    +        // Now gather rest of parameters:
    +        let vararg = None;
    +        let kwonlyargs = vec![];
    +        let kw_defaults = vec![];
    +        let kwarg = Some(kw.1);
    +
    +        ast::Parameters {
    +            args: names,
    +            kwonlyargs: kwonlyargs,
    +            vararg: vararg.into(),
    +            kwarg: kwarg.into(),
    +            defaults: default_elements,
    +            kw_defaults: kw_defaults,
    +        }
    +    }
     }
     
     fn __action235<
     >(
    -    __lookbehind: &lexer::Location,
    -    __lookahead: &lexer::Location,
    -) -> ::std::option::Option<(lexer::Tok, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>))>
    +    (_, params, _): (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
    +) -> ast::Parameters
     {
    -    None
    +    {
    +        let (vararg, kwonlyargs, kw_defaults, kwarg) = params;
    +        ast::Parameters {
    +            args: vec![],
    +            kwonlyargs: kwonlyargs,
    +            vararg: vararg.into(),
    +            kwarg: kwarg.into(),
    +            defaults: vec![],
    +            kw_defaults: kw_defaults,
    +        }
    +    }
     }
     
     fn __action236<
     >(
    -    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    -    (_, __1, _): (lexer::Location, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>), lexer::Location),
    -) -> (lexer::Tok, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>))
    +    (_, kw, _): (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> ast::Parameters
     {
    -    (__0, __1)
    +    {
    +        ast::Parameters {
    +            args: vec![],
    +            kwonlyargs: vec![],
    +            vararg: ast::Varargs::None,
    +            kwarg: Some(kw).into(),
    +            defaults: vec![],
    +            kw_defaults: vec![],
    +        }
    +    }
     }
     
     fn __action237<
     >(
    -    (_, __0, _): (lexer::Location, ast::Parameters, lexer::Location),
    -) -> ::std::option::Option<ast::Parameters>
    +    (_, __0, _): (lexer::Location, (lexer::Tok, ast::Expression), lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, ast::Expression)>
     {
         Some(__0)
     }
    @@ -41246,17 +45627,18 @@
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    -) -> ::std::option::Option<ast::Parameters>
    +) -> ::std::option::Option<(lexer::Tok, ast::Expression)>
     {
         None
     }
     
     fn __action239<
     >(
    -    (_, __0, _): (lexer::Location, ast::Parameters, lexer::Location),
    -) -> ast::Parameters
    +    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, __1, _): (lexer::Location, ast::Expression, lexer::Location),
    +) -> (lexer::Tok, ast::Expression)
     {
    -    (__0)
    +    (__0, __1)
     }
     
     fn __action240<
    @@ -41999,22 +46381,234 @@
     
     fn __action323<
     >(
    -    (_, __0, _): (lexer::Location, (lexer::Tok, (String, Option<ast::Expression>)), lexer::Location),
    -) -> ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>
    +    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, __1, _): (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (lexer::Tok, Option<ast::Parameter>)
     {
    -    vec![__0]
    +    (__0, __1)
     }
     
     fn __action324<
     >(
    -    (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -    (_, e, _): (lexer::Location, (lexer::Tok, (String, Option<ast::Expression>)), lexer::Location),
    -) -> ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>
    +    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, kwarg, _): (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +) -> Option<ast::Parameter>
     {
    -    { let mut v = v; v.push(e); v }
    +    {
    +        kwarg
    +    }
     }
     
     fn __action325<
    +>(
    +    (_, __0, _): (lexer::Location, (lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)), lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))>
    +{
    +    Some(__0)
    +}
    +
    +fn __action326<
    +>(
    +    __lookbehind: &lexer::Location,
    +    __lookahead: &lexer::Location,
    +) -> ::std::option::Option<(lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))>
    +{
    +    None
    +}
    +
    +fn __action327<
    +>(
    +    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, __1, _): (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
    +) -> (lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))
    +{
    +    (__0, __1)
    +}
    +
    +fn __action328<
    +>(
    +    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, va, _): (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    (_, kw, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    (_, kwarg, _): (lexer::Location, ::std::option::Option<(lexer::Tok, Option<ast::Parameter>)>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    {
    +        // Extract keyword arguments:
    +        let mut kwonlyargs = vec![];
    +        let mut kw_defaults = vec![];
    +        for (name, value) in kw.into_iter().map(|x| x.1) {
    +            kwonlyargs.push(name);
    +            kw_defaults.push(value);
    +        }
    +
    +        let kwarg = match kwarg {
    +            Some((_, name)) => Some(name),
    +            None => None,
    +        };
    +
    +        (Some(va), kwonlyargs, kw_defaults, kwarg)
    +    }
    +}
    +
    +fn __action329<
    +>(
    +    (_, param1, _): (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    (_, param2, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Vec<ast::Parameter>, Vec<ast::Expression>)
    +{
    +    {
    +        // Combine first parameters:
    +        let mut args = vec![param1];
    +        args.extend(param2.into_iter().map(|x| x.1));
    +
    +        let mut names = vec![];
    +        let mut default_elements = vec![];
    +
    +        for (name, default) in args.into_iter() {
    +            if let Some(default) = default {
    +                default_elements.push(default);
    +            } else {
    +                if default_elements.len() > 0 {
    +                    // Once we have started with defaults, all remaining arguments must
    +                    // have defaults
    +                    panic!(
    +                        "non-default argument follows default argument: {}",
    +                        &name.arg
    +                    );
    +                }
    +            }
    +            names.push(name);
    +        }
    +
    +        (names, default_elements)
    +    }
    +}
    +
    +fn __action330<
    +>(
    +    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, __1, _): (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (lexer::Tok, Option<ast::Parameter>)
    +{
    +    (__0, __1)
    +}
    +
    +fn __action331<
    +>(
    +    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, kwarg, _): (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +) -> Option<ast::Parameter>
    +{
    +    {
    +        kwarg
    +    }
    +}
    +
    +fn __action332<
    +>(
    +    (_, __0, _): (lexer::Location, (lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)), lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))>
    +{
    +    Some(__0)
    +}
    +
    +fn __action333<
    +>(
    +    __lookbehind: &lexer::Location,
    +    __lookahead: &lexer::Location,
    +) -> ::std::option::Option<(lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))>
    +{
    +    None
    +}
    +
    +fn __action334<
    +>(
    +    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, __1, _): (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
    +) -> (lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))
    +{
    +    (__0, __1)
    +}
    +
    +fn __action335<
    +>(
    +    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, va, _): (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    (_, kw, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    (_, kwarg, _): (lexer::Location, ::std::option::Option<(lexer::Tok, Option<ast::Parameter>)>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    {
    +        // Extract keyword arguments:
    +        let mut kwonlyargs = vec![];
    +        let mut kw_defaults = vec![];
    +        for (name, value) in kw.into_iter().map(|x| x.1) {
    +            kwonlyargs.push(name);
    +            kw_defaults.push(value);
    +        }
    +
    +        let kwarg = match kwarg {
    +            Some((_, name)) => Some(name),
    +            None => None,
    +        };
    +
    +        (Some(va), kwonlyargs, kw_defaults, kwarg)
    +    }
    +}
    +
    +fn __action336<
    +>(
    +    (_, param1, _): (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    (_, param2, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Vec<ast::Parameter>, Vec<ast::Expression>)
    +{
    +    {
    +        // Combine first parameters:
    +        let mut args = vec![param1];
    +        args.extend(param2.into_iter().map(|x| x.1));
    +
    +        let mut names = vec![];
    +        let mut default_elements = vec![];
    +
    +        for (name, default) in args.into_iter() {
    +            if let Some(default) = default {
    +                default_elements.push(default);
    +            } else {
    +                if default_elements.len() > 0 {
    +                    // Once we have started with defaults, all remaining arguments must
    +                    // have defaults
    +                    panic!(
    +                        "non-default argument follows default argument: {}",
    +                        &name.arg
    +                    );
    +                }
    +            }
    +            names.push(name);
    +        }
    +
    +        (names, default_elements)
    +    }
    +}
    +
    +fn __action337<
    +>(
    +    (_, __0, _): (lexer::Location, (lexer::Tok, ast::Expression), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, ast::Expression)>
    +{
    +    vec![__0]
    +}
    +
    +fn __action338<
    +>(
    +    (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    +    (_, e, _): (lexer::Location, (lexer::Tok, ast::Expression), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, ast::Expression)>
    +{
    +    { let mut v = v; v.push(e); v }
    +}
    +
    +fn __action339<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -42023,7 +46617,7 @@
         vec![]
     }
     
    -fn __action326<
    +fn __action340<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>, lexer::Location),
     ) -> ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>
    @@ -42031,7 +46625,7 @@
         v
     }
     
    -fn __action327<
    +fn __action341<
     >(
         (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
         (_, __1, _): (lexer::Location, (ast::Expression, ast::Expression), lexer::Location),
    @@ -42040,7 +46634,7 @@
         (__0, __1)
     }
     
    -fn __action328<
    +fn __action342<
     >(
         (_, __0, _): (lexer::Location, (lexer::Tok, ast::Expression), lexer::Location),
     ) -> ::std::vec::Vec<(lexer::Tok, ast::Expression)>
    @@ -42048,7 +46642,7 @@
         vec![__0]
     }
     
    -fn __action329<
    +fn __action343<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
         (_, e, _): (lexer::Location, (lexer::Tok, ast::Expression), lexer::Location),
    @@ -42057,7 +46651,7 @@
         { let mut v = v; v.push(e); v }
     }
     
    -fn __action330<
    +fn __action344<
     >(
         (_, __0, _): (lexer::Location, (lexer::Tok, ast::Expression), lexer::Location),
     ) -> ::std::vec::Vec<(lexer::Tok, ast::Expression)>
    @@ -42065,7 +46659,7 @@
         vec![__0]
     }
     
    -fn __action331<
    +fn __action345<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
         (_, e, _): (lexer::Location, (lexer::Tok, ast::Expression), lexer::Location),
    @@ -42074,7 +46668,7 @@
         { let mut v = v; v.push(e); v }
     }
     
    -fn __action332<
    +fn __action346<
     >(
         (_, __0, _): (lexer::Location, ast::Expression, lexer::Location),
     ) -> ::std::vec::Vec<ast::Expression>
    @@ -42082,7 +46676,7 @@
         vec![__0]
     }
     
    -fn __action333<
    +fn __action347<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
         (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    @@ -42091,7 +46685,7 @@
         { let mut v = v; v.push(e); v }
     }
     
    -fn __action334<
    +fn __action348<
     >(
         (_, __0, _): (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
     ) -> ::std::option::Option<(Option<Option<String>>, ast::Expression)>
    @@ -42099,7 +46693,7 @@
         Some(__0)
     }
     
    -fn __action335<
    +fn __action349<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -42108,7 +46702,7 @@
         None
     }
     
    -fn __action336<
    +fn __action350<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -42117,58 +46711,214 @@
         vec![]
     }
     
    -fn __action337<
    +fn __action351<
    +>(
    +    (_, v, _): (lexer::Location, ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>, lexer::Location),
    +) -> ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>
    +{
    +    v
    +}
    +
    +fn __action352<
    +>(
    +    (_, __0, _): (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
    +    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    +) -> (Option<Option<String>>, ast::Expression)
    +{
    +    (__0)
    +}
    +
    +fn __action353<
    +>(
    +    (_, __0, _): (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
    +) -> ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>
    +{
    +    vec![__0]
    +}
    +
    +fn __action354<
    +>(
    +    (_, v, _): (lexer::Location, ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>, lexer::Location),
    +    (_, e, _): (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
    +) -> ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>
    +{
    +    { let mut v = v; v.push(e); v }
    +}
    +
    +fn __action355<
    +>(
    +    (_, __0, _): (lexer::Location, (lexer::Tok, (ast::Expression, ast::Expression)), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>
    +{
    +    vec![__0]
    +}
    +
    +fn __action356<
    +>(
    +    (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>, lexer::Location),
    +    (_, e, _): (lexer::Location, (lexer::Tok, (ast::Expression, ast::Expression)), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>
    +{
    +    { let mut v = v; v.push(e); v }
    +}
    +
    +fn __action357<
    +>(
    +    (_, __0, _): (lexer::Location, (lexer::Tok, Option<ast::Parameter>), lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, Option<ast::Parameter>)>
    +{
    +    Some(__0)
    +}
    +
    +fn __action358<
    +>(
    +    __lookbehind: &lexer::Location,
    +    __lookahead: &lexer::Location,
    +) -> ::std::option::Option<(lexer::Tok, Option<ast::Parameter>)>
    +{
    +    None
    +}
    +
    +fn __action359<
    +>(
    +    __lookbehind: &lexer::Location,
    +    __lookahead: &lexer::Location,
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
    +{
    +    vec![]
    +}
    +
    +fn __action360<
    +>(
    +    (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
    +{
    +    v
    +}
    +
    +fn __action361<
    +>(
    +    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, __1, _): (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +) -> (lexer::Tok, (ast::Parameter, Option<ast::Expression>))
    +{
    +    (__0, __1)
    +}
    +
    +fn __action362<
    +>(
    +    (_, i, _): (lexer::Location, ast::Parameter, lexer::Location),
    +) -> (ast::Parameter, Option<ast::Expression>)
    +{
    +    (i, None)
    +}
    +
    +fn __action363<
    +>(
    +    (_, i, _): (lexer::Location, ast::Parameter, lexer::Location),
    +    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    +) -> (ast::Parameter, Option<ast::Expression>)
    +{
    +    (i, Some(e))
    +}
    +
    +fn __action364<
    +>(
    +    (_, __0, _): (lexer::Location, ast::Parameter, lexer::Location),
    +) -> ::std::option::Option<ast::Parameter>
    +{
    +    Some(__0)
    +}
    +
    +fn __action365<
    +>(
    +    __lookbehind: &lexer::Location,
    +    __lookahead: &lexer::Location,
    +) -> ::std::option::Option<ast::Parameter>
    +{
    +    None
    +}
    +
    +fn __action366<
    +>(
    +    (_, __0, _): (lexer::Location, (lexer::Tok, Option<ast::Parameter>), lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, Option<ast::Parameter>)>
    +{
    +    Some(__0)
    +}
    +
    +fn __action367<
    +>(
    +    __lookbehind: &lexer::Location,
    +    __lookahead: &lexer::Location,
    +) -> ::std::option::Option<(lexer::Tok, Option<ast::Parameter>)>
    +{
    +    None
    +}
    +
    +fn __action368<
    +>(
    +    __lookbehind: &lexer::Location,
    +    __lookahead: &lexer::Location,
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
    +{
    +    vec![]
    +}
    +
    +fn __action369<
     >(
    -    (_, v, _): (lexer::Location, ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>, lexer::Location),
    -) -> ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>
    +    (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
     {
         v
     }
     
    -fn __action338<
    +fn __action370<
     >(
    -    (_, __0, _): (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
    -    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    -) -> (Option<Option<String>>, ast::Expression)
    +    (_, __0, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, __1, _): (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +) -> (lexer::Tok, (ast::Parameter, Option<ast::Expression>))
     {
    -    (__0)
    +    (__0, __1)
     }
     
    -fn __action339<
    +fn __action371<
     >(
    -    (_, __0, _): (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
    -) -> ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>
    +    (_, i, _): (lexer::Location, ast::Parameter, lexer::Location),
    +) -> (ast::Parameter, Option<ast::Expression>)
     {
    -    vec![__0]
    +    (i, None)
     }
     
    -fn __action340<
    +fn __action372<
     >(
    -    (_, v, _): (lexer::Location, ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>, lexer::Location),
    -    (_, e, _): (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
    -) -> ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>
    +    (_, i, _): (lexer::Location, ast::Parameter, lexer::Location),
    +    (_, _, _): (lexer::Location, lexer::Tok, lexer::Location),
    +    (_, e, _): (lexer::Location, ast::Expression, lexer::Location),
    +) -> (ast::Parameter, Option<ast::Expression>)
     {
    -    { let mut v = v; v.push(e); v }
    +    (i, Some(e))
     }
     
    -fn __action341<
    +fn __action373<
     >(
    -    (_, __0, _): (lexer::Location, (lexer::Tok, (ast::Expression, ast::Expression)), lexer::Location),
    -) -> ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>
    +    (_, __0, _): (lexer::Location, ast::Parameter, lexer::Location),
    +) -> ::std::option::Option<ast::Parameter>
     {
    -    vec![__0]
    +    Some(__0)
     }
     
    -fn __action342<
    +fn __action374<
     >(
    -    (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>, lexer::Location),
    -    (_, e, _): (lexer::Location, (lexer::Tok, (ast::Expression, ast::Expression)), lexer::Location),
    -) -> ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>
    +    __lookbehind: &lexer::Location,
    +    __lookahead: &lexer::Location,
    +) -> ::std::option::Option<ast::Parameter>
     {
    -    { let mut v = v; v.push(e); v }
    +    None
     }
     
    -fn __action343<
    +fn __action375<
     >(
         (_, __0, _): (lexer::Location, (lexer::Tok, ast::WithItem), lexer::Location),
     ) -> ::std::vec::Vec<(lexer::Tok, ast::WithItem)>
    @@ -42176,7 +46926,7 @@
         vec![__0]
     }
     
    -fn __action344<
    +fn __action376<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::WithItem)>, lexer::Location),
         (_, e, _): (lexer::Location, (lexer::Tok, ast::WithItem), lexer::Location),
    @@ -42185,7 +46935,7 @@
         { let mut v = v; v.push(e); v }
     }
     
    -fn __action345<
    +fn __action377<
     >(
         (_, __0, _): (lexer::Location, (lexer::Tok, String), lexer::Location),
     ) -> ::std::vec::Vec<(lexer::Tok, String)>
    @@ -42193,7 +46943,7 @@
         vec![__0]
     }
     
    -fn __action346<
    +fn __action378<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, String)>, lexer::Location),
         (_, e, _): (lexer::Location, (lexer::Tok, String), lexer::Location),
    @@ -42202,7 +46952,7 @@
         { let mut v = v; v.push(e); v }
     }
     
    -fn __action347<
    +fn __action379<
     >(
         (_, __0, _): (lexer::Location, (String, Option<String>), lexer::Location),
     ) -> ::std::vec::Vec<(String, Option<String>)>
    @@ -42210,7 +46960,7 @@
         vec![__0]
     }
     
    -fn __action348<
    +fn __action380<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         (_, e, _): (lexer::Location, (String, Option<String>), lexer::Location),
    @@ -42219,7 +46969,7 @@
         { let mut v = v; v.push(e); v }
     }
     
    -fn __action349<
    +fn __action381<
     >(
         (_, __0, _): (lexer::Location, (String, Option<String>), lexer::Location),
     ) -> ::std::vec::Vec<(String, Option<String>)>
    @@ -42227,7 +46977,7 @@
         vec![__0]
     }
     
    -fn __action350<
    +fn __action382<
     >(
         (_, v, _): (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         (_, e, _): (lexer::Location, (String, Option<String>), lexer::Location),
    @@ -42236,7 +46986,41 @@
         { let mut v = v; v.push(e); v }
     }
     
    -fn __action351<
    +fn __action383<
    +>(
    +    (_, __0, _): (lexer::Location, (lexer::Tok, (ast::Parameter, Option<ast::Expression>)), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
    +{
    +    vec![__0]
    +}
    +
    +fn __action384<
    +>(
    +    (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    (_, e, _): (lexer::Location, (lexer::Tok, (ast::Parameter, Option<ast::Expression>)), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
    +{
    +    { let mut v = v; v.push(e); v }
    +}
    +
    +fn __action385<
    +>(
    +    (_, __0, _): (lexer::Location, (lexer::Tok, (ast::Parameter, Option<ast::Expression>)), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
    +{
    +    vec![__0]
    +}
    +
    +fn __action386<
    +>(
    +    (_, v, _): (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    (_, e, _): (lexer::Location, (lexer::Tok, (ast::Parameter, Option<ast::Expression>)), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
    +{
    +    { let mut v = v; v.push(e); v }
    +}
    +
    +fn __action387<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ::std::option::Option<Vec<ast::Expression>>, lexer::Location),
    @@ -42250,7 +47034,7 @@
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action155(
    +    __action148(
             __0,
             __1,
             __temp0,
    @@ -42258,7 +47042,7 @@
         )
     }
     
    -fn __action352<
    +fn __action388<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ::std::option::Option<Vec<ast::Expression>>, lexer::Location),
    @@ -42272,7 +47056,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action155(
    +    __action148(
             __0,
             __1,
             __temp0,
    @@ -42280,7 +47064,7 @@
         )
     }
     
    -fn __action353<
    +fn __action389<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -42293,14 +47077,14 @@
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action172(
    +    __action166(
             __0,
             __1,
             __temp0,
         )
     }
     
    -fn __action354<
    +fn __action390<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -42313,14 +47097,54 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action172(
    +    __action166(
             __0,
             __1,
             __temp0,
         )
     }
     
    -fn __action355<
    +fn __action391<
    +>(
    +    __0: (lexer::Location, ast::Expression, lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +) -> ast::Expression
    +{
    +    let __start0 = __2.0.clone();
    +    let __end0 = __2.2.clone();
    +    let __temp0 = __action280(
    +        __2,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action138(
    +        __0,
    +        __1,
    +        __temp0,
    +    )
    +}
    +
    +fn __action392<
    +>(
    +    __0: (lexer::Location, ast::Expression, lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    +) -> ast::Expression
    +{
    +    let __start0 = __1.2.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action281(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action138(
    +        __0,
    +        __1,
    +        __temp0,
    +    )
    +}
    +
    +fn __action393<
     >(
         __0: (lexer::Location, Vec<(ast::Expression, ast::Expression)>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -42332,13 +47156,13 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action166(
    +    __action160(
             __0,
             __temp0,
         )
     }
     
    -fn __action356<
    +fn __action394<
     >(
         __0: (lexer::Location, Vec<(ast::Expression, ast::Expression)>, lexer::Location),
     ) -> Vec<(ast::Expression, ast::Expression)>
    @@ -42350,13 +47174,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action166(
    +    __action160(
             __0,
             __temp0,
         )
     }
     
    -fn __action357<
    +fn __action395<
     >(
         __0: (lexer::Location, Vec<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -42368,13 +47192,13 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action164(
    +    __action158(
             __0,
             __temp0,
         )
     }
     
    -fn __action358<
    +fn __action396<
     >(
         __0: (lexer::Location, Vec<ast::Expression>, lexer::Location),
     ) -> Vec<ast::Expression>
    @@ -42386,13 +47210,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action164(
    +    __action158(
             __0,
             __temp0,
         )
     }
     
    -fn __action359<
    +fn __action397<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -42412,7 +47236,7 @@
         )
     }
     
    -fn __action360<
    +fn __action398<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -42432,7 +47256,7 @@
         )
     }
     
    -fn __action361<
    +fn __action399<
     >(
         __0: (lexer::Location, Vec<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -42444,13 +47268,13 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action169(
    +    __action163(
             __0,
             __temp0,
         )
     }
     
    -fn __action362<
    +fn __action400<
     >(
         __0: (lexer::Location, Vec<ast::Expression>, lexer::Location),
     ) -> Vec<ast::Expression>
    @@ -42462,13 +47286,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action169(
    +    __action163(
             __0,
             __temp0,
         )
     }
     
    -fn __action363<
    +fn __action401<
     >(
         __0: (lexer::Location, String, lexer::Location),
     ) -> String
    @@ -42486,7 +47310,7 @@
         )
     }
     
    -fn __action364<
    +fn __action402<
     >(
         __0: (lexer::Location, ::std::vec::Vec<lexer::Tok>, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -42504,7 +47328,7 @@
         )
     }
     
    -fn __action365<
    +fn __action403<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, (Vec<ast::Expression>, Vec<ast::Keyword>), lexer::Location),
    @@ -42513,18 +47337,18 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action225(
    +    let __temp0 = __action226(
             __0,
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action223(
    +    __action224(
             __temp0,
         )
     }
     
    -fn __action366<
    +fn __action404<
     >(
         __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Location, lexer::Location),
    @@ -42539,13 +47363,13 @@
     {
         let __start0 = __4.0.clone();
         let __end0 = __6.2.clone();
    -    let __temp0 = __action365(
    +    let __temp0 = __action403(
             __4,
             __5,
             __6,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action89(
    +    __action81(
             __0,
             __1,
             __2,
    @@ -42556,7 +47380,7 @@
         )
     }
     
    -fn __action367<
    +fn __action405<
     >(
         __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Location, lexer::Location),
    @@ -42568,12 +47392,12 @@
     {
         let __start0 = __3.2.clone();
         let __end0 = __4.0.clone();
    -    let __temp0 = __action224(
    +    let __temp0 = __action225(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action89(
    +    __action81(
             __0,
             __1,
             __2,
    @@ -42584,7 +47408,7 @@
         )
     }
     
    -fn __action368<
    +fn __action406<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -42596,13 +47420,13 @@
     {
         let __start0 = __2.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action365(
    +    let __temp0 = __action403(
             __2,
             __3,
             __4,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action92(
    +    __action84(
             __0,
             __1,
             __temp0,
    @@ -42610,7 +47434,7 @@
         )
     }
     
    -fn __action369<
    +fn __action407<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -42619,12 +47443,12 @@
     {
         let __start0 = __1.2.clone();
         let __end0 = __2.0.clone();
    -    let __temp0 = __action224(
    +    let __temp0 = __action225(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action92(
    +    __action84(
             __0,
             __1,
             __temp0,
    @@ -42632,7 +47456,7 @@
         )
     }
     
    -fn __action370<
    +fn __action408<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -42640,17 +47464,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action217(
    +    let __temp0 = __action214(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action215(
    +    __action212(
             __temp0,
         )
     }
     
    -fn __action371<
    +fn __action409<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -42659,36 +47483,36 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action370(
    +    let __temp0 = __action408(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action141(
    +    __action133(
             __0,
             __temp0,
         )
     }
     
    -fn __action372<
    +fn __action410<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
     {
         let __start0 = __0.2.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action216(
    +    let __temp0 = __action213(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action141(
    +    __action133(
             __0,
             __temp0,
         )
     }
     
    -fn __action373<
    +fn __action411<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, (ast::Expression, ast::Expression), lexer::Location),
    @@ -42696,17 +47520,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action327(
    +    let __temp0 = __action341(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action341(
    +    __action355(
             __temp0,
         )
     }
     
    -fn __action374<
    +fn __action412<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -42715,36 +47539,36 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action327(
    +    let __temp0 = __action341(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action342(
    +    __action356(
             __0,
             __temp0,
         )
     }
     
    -fn __action375<
    +fn __action413<
     >(
         __0: (lexer::Location, (ast::Expression, ast::Expression), lexer::Location),
     ) -> Vec<(ast::Expression, ast::Expression)>
     {
         let __start0 = __0.2.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action325(
    +    let __temp0 = __action339(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action207(
    +    __action201(
             __0,
             __temp0,
         )
     }
     
    -fn __action376<
    +fn __action414<
     >(
         __0: (lexer::Location, (ast::Expression, ast::Expression), lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>, lexer::Location),
    @@ -42752,17 +47576,17 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action326(
    +    let __temp0 = __action340(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action207(
    +    __action201(
             __0,
             __temp0,
         )
     }
     
    -fn __action377<
    +fn __action415<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -42770,17 +47594,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action205(
    +    let __temp0 = __action199(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action328(
    +    __action342(
             __temp0,
         )
     }
     
    -fn __action378<
    +fn __action416<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -42789,18 +47613,18 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action205(
    +    let __temp0 = __action199(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action329(
    +    __action343(
             __0,
             __temp0,
         )
     }
     
    -fn __action379<
    +fn __action417<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -42808,19 +47632,19 @@
     {
         let __start0 = __0.2.clone();
         let __end0 = __1.0.clone();
    -    let __temp0 = __action203(
    +    let __temp0 = __action197(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action353(
    +    __action389(
             __0,
             __temp0,
             __1,
         )
     }
     
    -fn __action380<
    +fn __action418<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -42829,36 +47653,36 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action204(
    +    let __temp0 = __action198(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action353(
    +    __action389(
             __0,
             __temp0,
             __2,
         )
     }
     
    -fn __action381<
    +fn __action419<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> Vec<ast::Expression>
     {
         let __start0 = __0.2.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action203(
    +    let __temp0 = __action197(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action354(
    +    __action390(
             __0,
             __temp0,
         )
     }
     
    -fn __action382<
    +fn __action420<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -42866,17 +47690,17 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action204(
    +    let __temp0 = __action198(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action354(
    +    __action390(
             __0,
             __temp0,
         )
     }
     
    -fn __action383<
    +fn __action421<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -42889,12 +47713,12 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action345(
    +    __action377(
             __temp0,
         )
     }
     
    -fn __action384<
    +fn __action422<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, String)>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -42908,13 +47732,13 @@
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action346(
    +    __action378(
             __0,
             __temp0,
         )
     }
     
    -fn __action385<
    +fn __action423<
     >(
         __0: (lexer::Location, String, lexer::Location),
     ) -> Vec<String>
    @@ -42932,7 +47756,7 @@
         )
     }
     
    -fn __action386<
    +fn __action424<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, String)>, lexer::Location),
    @@ -42950,61 +47774,61 @@
         )
     }
     
    -fn __action387<
    +fn __action425<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, Option<String>, lexer::Location),
    -) -> ::std::option::Option<(lexer::Tok, Option<String>)>
    +    __1: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, Option<ast::Parameter>)>
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action233(
    +    let __temp0 = __action323(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action226(
    +    __action366(
             __temp0,
         )
     }
     
    -fn __action388<
    +fn __action426<
     >(
    -    __0: (lexer::Location, (Vec<String>, Vec<ast::Expression>), lexer::Location),
    +    __0: (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    -    __2: (lexer::Location, Option<String>, lexer::Location),
    +    __2: (lexer::Location, Option<ast::Parameter>, lexer::Location),
     ) -> ast::Parameters
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action233(
    +    let __temp0 = __action323(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action80(
    +    __action234(
             __0,
             __temp0,
         )
     }
     
    -fn __action389<
    +fn __action427<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, ::std::option::Option<String>, lexer::Location),
    -    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
         __3: (lexer::Location, lexer::Tok, lexer::Location),
    -    __4: (lexer::Location, Option<String>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    +    __4: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
     {
         let __start0 = __3.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action387(
    +    let __temp0 = __action425(
             __3,
             __4,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action87(
    +    __action328(
             __0,
             __1,
             __2,
    @@ -43012,21 +47836,21 @@
         )
     }
     
    -fn __action390<
    +fn __action428<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, ::std::option::Option<String>, lexer::Location),
    -    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
     {
         let __start0 = __2.2.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action227(
    +    let __temp0 = __action367(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action87(
    +    __action328(
             __0,
             __1,
             __2,
    @@ -43034,63 +47858,317 @@
         )
     }
     
    -fn __action391<
    +fn __action429<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>), lexer::Location),
    -) -> ::std::option::Option<(lexer::Tok, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>))>
    +    __1: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, Option<ast::Parameter>)>
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action236(
    +    let __temp0 = __action330(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action234(
    +    __action357(
             __temp0,
         )
     }
     
    -fn __action392<
    +fn __action430<
     >(
    -    __0: (lexer::Location, (Vec<String>, Vec<ast::Expression>), lexer::Location),
    +    __0: (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    -    __2: (lexer::Location, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>), lexer::Location),
    +    __2: (lexer::Location, Option<ast::Parameter>, lexer::Location),
     ) -> ast::Parameters
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action391(
    +    let __temp0 = __action330(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action79(
    +    __action218(
             __0,
             __temp0,
         )
     }
     
    -fn __action393<
    +fn __action431<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    __3: (lexer::Location, lexer::Tok, lexer::Location),
    +    __4: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __3.0.clone();
    +    let __end0 = __4.2.clone();
    +    let __temp0 = __action429(
    +        __3,
    +        __4,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action335(
    +        __0,
    +        __1,
    +        __2,
    +        __temp0,
    +    )
    +}
    +
    +fn __action432<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __2.2.clone();
    +    let __end0 = __2.2.clone();
    +    let __temp0 = __action358(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action335(
    +        __0,
    +        __1,
    +        __2,
    +        __temp0,
    +    )
    +}
    +
    +fn __action433<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))>
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action327(
    +        __0,
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action325(
    +        __temp0,
    +    )
    +}
    +
    +fn __action434<
    +>(
    +    __0: (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
    +) -> ast::Parameters
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __2.2.clone();
    +    let __temp0 = __action433(
    +        __1,
    +        __2,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action233(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action435<
     >(
    -    __0: (lexer::Location, (Vec<String>, Vec<ast::Expression>), lexer::Location),
    +    __0: (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location),
     ) -> ast::Parameters
     {
         let __start0 = __0.2.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action235(
    +    let __temp0 = __action326(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action79(
    +    __action233(
             __0,
             __temp0,
         )
     }
     
    -fn __action394<
    +fn __action436<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>))>
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action334(
    +        __0,
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action332(
    +        __temp0,
    +    )
    +}
    +
    +fn __action437<
    +>(
    +    __0: (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
    +) -> ast::Parameters
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __2.2.clone();
    +    let __temp0 = __action436(
    +        __1,
    +        __2,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action217(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action438<
    +>(
    +    __0: (lexer::Location, (Vec<ast::Parameter>, Vec<ast::Expression>), lexer::Location),
    +) -> ast::Parameters
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action333(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action217(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action439<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Expression, lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, ast::Expression)>
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action211(
    +        __0,
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action337(
    +        __temp0,
    +    )
    +}
    +
    +fn __action440<
    +>(
    +    __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, ast::Expression, lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, ast::Expression)>
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __2.2.clone();
    +    let __temp0 = __action211(
    +        __1,
    +        __2,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action338(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action441<
    +>(
    +    __0: (lexer::Location, ast::Expression, lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +) -> ast::Expression
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __1.0.clone();
    +    let __temp0 = __action209(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action391(
    +        __0,
    +        __temp0,
    +        __1,
    +    )
    +}
    +
    +fn __action442<
    +>(
    +    __0: (lexer::Location, ast::Expression, lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +) -> ast::Expression
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action210(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action391(
    +        __0,
    +        __temp0,
    +        __2,
    +    )
    +}
    +
    +fn __action443<
    +>(
    +    __0: (lexer::Location, ast::Expression, lexer::Location),
    +) -> ast::Expression
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action209(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action392(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action444<
    +>(
    +    __0: (lexer::Location, ast::Expression, lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    +) -> ast::Expression
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action210(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action392(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action445<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -43103,12 +48181,12 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action330(
    +    __action344(
             __temp0,
         )
     }
     
    -fn __action395<
    +fn __action446<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43122,13 +48200,13 @@
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action331(
    +    __action345(
             __0,
             __temp0,
         )
     }
     
    -fn __action396<
    +fn __action447<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -43146,25 +48224,25 @@
         )
     }
     
    -fn __action397<
    +fn __action448<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> Vec<ast::Expression>
     {
         let __start0 = __0.2.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action201(
    +    let __temp0 = __action195(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action206(
    +    __action200(
             __0,
             __temp0,
         )
     }
     
    -fn __action398<
    +fn __action449<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -43172,35 +48250,35 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action202(
    +    let __temp0 = __action196(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action206(
    +    __action200(
             __0,
             __temp0,
         )
     }
     
    -fn __action399<
    +fn __action450<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> Vec<ast::Expression>
     {
         let __start0 = __0.2.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action201(
    +    let __temp0 = __action195(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action173(
    +    __action167(
             __0,
             __temp0,
         )
     }
     
    -fn __action400<
    +fn __action451<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -43208,17 +48286,17 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action202(
    +    let __temp0 = __action196(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action173(
    +    __action167(
             __0,
             __temp0,
         )
     }
     
    -fn __action401<
    +fn __action452<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43229,7 +48307,7 @@
     {
         let __start0 = __3.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action396(
    +    let __temp0 = __action447(
             __3,
             __4,
         );
    @@ -43242,7 +48320,7 @@
         )
     }
     
    -fn __action402<
    +fn __action453<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43264,7 +48342,7 @@
         )
     }
     
    -fn __action403<
    +fn __action454<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -43282,7 +48360,7 @@
         )
     }
     
    -fn __action404<
    +fn __action455<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43302,7 +48380,7 @@
         )
     }
     
    -fn __action405<
    +fn __action456<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> Vec<ast::Expression>
    @@ -43314,13 +48392,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action208(
    +    __action202(
             __0,
             __temp0,
         )
     }
     
    -fn __action406<
    +fn __action457<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -43332,13 +48410,13 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action208(
    +    __action202(
             __0,
             __temp0,
         )
     }
     
    -fn __action407<
    +fn __action458<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43351,14 +48429,14 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action359(
    +    __action397(
             __0,
             __temp0,
             __1,
         )
     }
     
    -fn __action408<
    +fn __action459<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -43371,14 +48449,14 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action359(
    +    __action397(
             __0,
             __temp0,
             __2,
         )
     }
     
    -fn __action409<
    +fn __action460<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
    @@ -43390,13 +48468,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action360(
    +    __action398(
             __0,
             __temp0,
         )
     }
     
    -fn __action410<
    +fn __action461<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -43408,66 +48486,66 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action360(
    +    __action398(
             __0,
             __temp0,
         )
     }
     
    -fn __action411<
    +fn __action462<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    -) -> ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>
    +    __1: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action232(
    +    let __temp0 = __action370(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action323(
    +    __action383(
             __temp0,
         )
     }
     
    -fn __action412<
    +fn __action463<
     >(
    -    __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    +    __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    -    __2: (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    -) -> ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>
    +    __2: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action232(
    +    let __temp0 = __action370(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action324(
    +    __action384(
             __0,
             __temp0,
         )
     }
     
    -fn __action413<
    +fn __action464<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, ::std::option::Option<String>, lexer::Location),
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
         __2: (lexer::Location, lexer::Tok, lexer::Location),
    -    __3: (lexer::Location, Option<String>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    +    __3: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
     {
         let __start0 = __1.2.clone();
         let __end0 = __2.0.clone();
    -    let __temp0 = __action230(
    +    let __temp0 = __action368(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action389(
    +    __action427(
             __0,
             __1,
             __temp0,
    @@ -43476,22 +48554,22 @@
         )
     }
     
    -fn __action414<
    +fn __action465<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, ::std::option::Option<String>, lexer::Location),
    -    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
         __3: (lexer::Location, lexer::Tok, lexer::Location),
    -    __4: (lexer::Location, Option<String>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    +    __4: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
     {
         let __start0 = __2.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action231(
    +    let __temp0 = __action369(
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action389(
    +    __action427(
             __0,
             __1,
             __temp0,
    @@ -43500,83 +48578,245 @@
         )
     }
     
    -fn __action415<
    +fn __action466<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, ::std::option::Option<String>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
     {
         let __start0 = __1.2.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action230(
    +    let __temp0 = __action368(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action390(
    +    __action428(
             __0,
             __1,
             __temp0,
         )
     }
     
    -fn __action416<
    +fn __action467<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, ::std::option::Option<String>, lexer::Location),
    -    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
     {
         let __start0 = __2.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action231(
    +    let __temp0 = __action369(
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action390(
    +    __action428(
             __0,
             __1,
             __temp0,
         )
     }
     
    -fn __action417<
    +fn __action468<
     >(
    -    __0: (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    -) -> (Vec<String>, Vec<ast::Expression>)
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +) -> (Vec<ast::Parameter>, Vec<ast::Expression>)
     {
         let __start0 = __0.2.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action230(
    +    let __temp0 = __action368(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action83(
    +    __action329(
             __0,
             __temp0,
         )
     }
     
    -fn __action418<
    +fn __action469<
     >(
    -    __0: (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    -    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -) -> (Vec<String>, Vec<ast::Expression>)
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Vec<ast::Parameter>, Vec<ast::Expression>)
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action231(
    +    let __temp0 = __action369(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action83(
    +    __action329(
             __0,
             __temp0,
         )
     }
     
    -fn __action419<
    +fn __action470<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action361(
    +        __0,
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action385(
    +        __temp0,
    +    )
    +}
    +
    +fn __action471<
    +>(
    +    __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +) -> ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __2.2.clone();
    +    let __temp0 = __action361(
    +        __1,
    +        __2,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action386(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action472<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +    __3: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __1.2.clone();
    +    let __end0 = __2.0.clone();
    +    let __temp0 = __action359(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action431(
    +        __0,
    +        __1,
    +        __temp0,
    +        __2,
    +        __3,
    +    )
    +}
    +
    +fn __action473<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    __3: (lexer::Location, lexer::Tok, lexer::Location),
    +    __4: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __2.0.clone();
    +    let __end0 = __2.2.clone();
    +    let __temp0 = __action360(
    +        __2,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action431(
    +        __0,
    +        __1,
    +        __temp0,
    +        __3,
    +        __4,
    +    )
    +}
    +
    +fn __action474<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __1.2.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action359(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action432(
    +        __0,
    +        __1,
    +        __temp0,
    +    )
    +}
    +
    +fn __action475<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ::std::option::Option<ast::Parameter>, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __2.0.clone();
    +    let __end0 = __2.2.clone();
    +    let __temp0 = __action360(
    +        __2,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action432(
    +        __0,
    +        __1,
    +        __temp0,
    +    )
    +}
    +
    +fn __action476<
    +>(
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +) -> (Vec<ast::Parameter>, Vec<ast::Expression>)
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action359(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action336(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action477<
    +>(
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Vec<ast::Parameter>, Vec<ast::Expression>)
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action360(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action336(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action478<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::WithItem, lexer::Location),
    @@ -43589,12 +48829,12 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action343(
    +    __action375(
             __temp0,
         )
     }
     
    -fn __action420<
    +fn __action479<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::WithItem)>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43608,13 +48848,13 @@
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action344(
    +    __action376(
             __0,
             __temp0,
         )
     }
     
    -fn __action421<
    +fn __action480<
     >(
         __0: (lexer::Location, ast::WithItem, lexer::Location),
     ) -> Vec<ast::WithItem>
    @@ -43632,7 +48872,7 @@
         )
     }
     
    -fn __action422<
    +fn __action481<
     >(
         __0: (lexer::Location, ast::WithItem, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::WithItem)>, lexer::Location),
    @@ -43650,7 +48890,87 @@
         )
     }
     
    -fn __action423<
    +fn __action482<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Expression, lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, ast::Expression)>
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action239(
    +        __0,
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action237(
    +        __temp0,
    +    )
    +}
    +
    +fn __action483<
    +>(
    +    __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
    +    __1: (lexer::Location, lexer::Location, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +    __3: (lexer::Location, String, lexer::Location),
    +    __4: (lexer::Location, ast::Parameters, lexer::Location),
    +    __5: (lexer::Location, lexer::Tok, lexer::Location),
    +    __6: (lexer::Location, ast::Expression, lexer::Location),
    +    __7: (lexer::Location, lexer::Tok, lexer::Location),
    +    __8: (lexer::Location, Vec<ast::LocatedStatement>, lexer::Location),
    +) -> ast::LocatedStatement
    +{
    +    let __start0 = __5.0.clone();
    +    let __end0 = __6.2.clone();
    +    let __temp0 = __action482(
    +        __5,
    +        __6,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action77(
    +        __0,
    +        __1,
    +        __2,
    +        __3,
    +        __4,
    +        __temp0,
    +        __7,
    +        __8,
    +    )
    +}
    +
    +fn __action484<
    +>(
    +    __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
    +    __1: (lexer::Location, lexer::Location, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +    __3: (lexer::Location, String, lexer::Location),
    +    __4: (lexer::Location, ast::Parameters, lexer::Location),
    +    __5: (lexer::Location, lexer::Tok, lexer::Location),
    +    __6: (lexer::Location, Vec<ast::LocatedStatement>, lexer::Location),
    +) -> ast::LocatedStatement
    +{
    +    let __start0 = __4.2.clone();
    +    let __end0 = __5.0.clone();
    +    let __temp0 = __action238(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action77(
    +        __0,
    +        __1,
    +        __2,
    +        __3,
    +        __4,
    +        __temp0,
    +        __5,
    +        __6,
    +    )
    +}
    +
    +fn __action485<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -43668,7 +48988,7 @@
         )
     }
     
    -fn __action424<
    +fn __action486<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(lexer::Tok, String)>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43688,7 +49008,63 @@
         )
     }
     
    -fn __action425<
    +fn __action487<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Expression, lexer::Location),
    +) -> ::std::option::Option<(lexer::Tok, ast::Expression)>
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action229(
    +        __0,
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action227(
    +        __temp0,
    +    )
    +}
    +
    +fn __action488<
    +>(
    +    __0: (lexer::Location, String, lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, ast::Expression, lexer::Location),
    +) -> ast::Parameter
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __2.2.clone();
    +    let __temp0 = __action487(
    +        __1,
    +        __2,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action80(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action489<
    +>(
    +    __0: (lexer::Location, String, lexer::Location),
    +) -> ast::Parameter
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action228(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action80(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action490<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -43706,7 +49082,7 @@
         )
     }
     
    -fn __action426<
    +fn __action491<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43715,7 +49091,7 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action425(
    +    let __temp0 = __action490(
             __1,
             __2,
         );
    @@ -43726,7 +49102,7 @@
         )
     }
     
    -fn __action427<
    +fn __action492<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::WithItem
    @@ -43744,7 +49120,7 @@
         )
     }
     
    -fn __action428<
    +fn __action493<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -43762,7 +49138,7 @@
         )
     }
     
    -fn __action429<
    +fn __action494<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43771,7 +49147,7 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action428(
    +    let __temp0 = __action493(
             __1,
             __2,
         );
    @@ -43782,7 +49158,7 @@
         )
     }
     
    -fn __action430<
    +fn __action495<
     >(
         __0: (lexer::Location, String, lexer::Location),
     ) -> (String, Option<String>)
    @@ -43800,7 +49176,7 @@
         )
     }
     
    -fn __action431<
    +fn __action496<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43809,7 +49185,7 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action428(
    +    let __temp0 = __action493(
             __1,
             __2,
         );
    @@ -43820,7 +49196,7 @@
         )
     }
     
    -fn __action432<
    +fn __action497<
     >(
         __0: (lexer::Location, String, lexer::Location),
     ) -> (String, Option<String>)
    @@ -43838,7 +49214,7 @@
         )
     }
     
    -fn __action433<
    +fn __action498<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43858,7 +49234,7 @@
         )
     }
     
    -fn __action434<
    +fn __action499<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43874,7 +49250,7 @@
     {
         let __start0 = __7.0.clone();
         let __end0 = __9.2.clone();
    -    let __temp0 = __action433(
    +    let __temp0 = __action498(
             __7,
             __8,
             __9,
    @@ -43892,7 +49268,7 @@
         )
     }
     
    -fn __action435<
    +fn __action500<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43922,7 +49298,7 @@
         )
     }
     
    -fn __action436<
    +fn __action501<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43937,7 +49313,7 @@
     {
         let __start0 = __6.0.clone();
         let __end0 = __8.2.clone();
    -    let __temp0 = __action433(
    +    let __temp0 = __action498(
             __6,
             __7,
             __8,
    @@ -43954,7 +49330,7 @@
         )
     }
     
    -fn __action437<
    +fn __action502<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43982,7 +49358,7 @@
         )
     }
     
    -fn __action438<
    +fn __action503<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -43997,7 +49373,7 @@
     {
         let __start0 = __5.0.clone();
         let __end0 = __7.2.clone();
    -    let __temp0 = __action433(
    +    let __temp0 = __action498(
             __5,
             __6,
             __7,
    @@ -44014,7 +49390,7 @@
         )
     }
     
    -fn __action439<
    +fn __action504<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44042,7 +49418,7 @@
         )
     }
     
    -fn __action440<
    +fn __action505<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44056,7 +49432,7 @@
     {
         let __start0 = __5.0.clone();
         let __end0 = __7.2.clone();
    -    let __temp0 = __action433(
    +    let __temp0 = __action498(
             __5,
             __6,
             __7,
    @@ -44072,7 +49448,7 @@
         )
     }
     
    -fn __action441<
    +fn __action506<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44098,7 +49474,7 @@
         )
     }
     
    -fn __action442<
    +fn __action507<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44118,7 +49494,7 @@
         )
     }
     
    -fn __action443<
    +fn __action508<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44135,13 +49511,13 @@
     {
         let __start0 = __8.0.clone();
         let __end0 = __10.2.clone();
    -    let __temp0 = __action442(
    +    let __temp0 = __action507(
             __8,
             __9,
             __10,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action438(
    +    __action503(
             __0,
             __1,
             __2,
    @@ -44154,7 +49530,7 @@
         )
     }
     
    -fn __action444<
    +fn __action509<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44173,7 +49549,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action438(
    +    __action503(
             __0,
             __1,
             __2,
    @@ -44186,7 +49562,7 @@
         )
     }
     
    -fn __action445<
    +fn __action510<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44200,13 +49576,13 @@
     {
         let __start0 = __5.0.clone();
         let __end0 = __7.2.clone();
    -    let __temp0 = __action442(
    +    let __temp0 = __action507(
             __5,
             __6,
             __7,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action439(
    +    __action504(
             __0,
             __1,
             __2,
    @@ -44216,7 +49592,7 @@
         )
     }
     
    -fn __action446<
    +fn __action511<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44232,7 +49608,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action439(
    +    __action504(
             __0,
             __1,
             __2,
    @@ -44242,7 +49618,7 @@
         )
     }
     
    -fn __action447<
    +fn __action512<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -44260,7 +49636,7 @@
         )
     }
     
    -fn __action448<
    +fn __action513<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44271,7 +49647,7 @@
     {
         let __start0 = __3.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action447(
    +    let __temp0 = __action512(
             __3,
             __4,
         );
    @@ -44284,7 +49660,7 @@
         )
     }
     
    -fn __action449<
    +fn __action514<
     >(
         __0: (lexer::Location, lexer::Location, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44306,7 +49682,7 @@
         )
     }
     
    -fn __action450<
    +fn __action515<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -44316,19 +49692,19 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action222(
    +    let __temp0 = __action223(
             __0,
             __1,
             __2,
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action220(
    +    __action221(
             __temp0,
         )
     }
     
    -fn __action451<
    +fn __action516<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44339,38 +49715,38 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action450(
    +    let __temp0 = __action515(
             __1,
             __2,
             __3,
             __4,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action95(
    +    __action87(
             __0,
             __temp0,
         )
     }
     
    -fn __action452<
    +fn __action517<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::Expression
     {
         let __start0 = __0.2.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action221(
    +    let __temp0 = __action222(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action95(
    +    __action87(
             __0,
             __temp0,
         )
     }
     
    -fn __action453<
    +fn __action518<
     >(
         __0: (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44378,17 +49754,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action338(
    +    let __temp0 = __action352(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action339(
    +    __action353(
             __temp0,
         )
     }
     
    -fn __action454<
    +fn __action519<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>, lexer::Location),
         __1: (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
    @@ -44397,36 +49773,36 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action338(
    +    let __temp0 = __action352(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action340(
    +    __action354(
             __0,
             __temp0,
         )
     }
     
    -fn __action455<
    +fn __action520<
     >(
         __0: (lexer::Location, ::std::option::Option<(Option<Option<String>>, ast::Expression)>, lexer::Location),
     ) -> Vec<(Option<Option<String>>, ast::Expression)>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.0.clone();
    -    let __temp0 = __action336(
    +    let __temp0 = __action350(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action196(
    +    __action190(
             __temp0,
             __0,
         )
     }
     
    -fn __action456<
    +fn __action521<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>, lexer::Location),
         __1: (lexer::Location, ::std::option::Option<(Option<Option<String>>, ast::Expression)>, lexer::Location),
    @@ -44434,17 +49810,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action337(
    +    let __temp0 = __action351(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action196(
    +    __action190(
             __temp0,
             __1,
         )
     }
     
    -fn __action457<
    +fn __action522<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44454,7 +49830,7 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action429(
    +    let __temp0 = __action494(
             __0,
             __1,
             __2,
    @@ -44466,7 +49842,7 @@
         )
     }
     
    -fn __action458<
    +fn __action523<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44474,7 +49850,7 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action430(
    +    let __temp0 = __action495(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    @@ -44484,7 +49860,7 @@
         )
     }
     
    -fn __action459<
    +fn __action524<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44493,7 +49869,7 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action429(
    +    let __temp0 = __action494(
             __0,
             __1,
             __2,
    @@ -44504,14 +49880,14 @@
         )
     }
     
    -fn __action460<
    +fn __action525<
     >(
         __0: (lexer::Location, String, lexer::Location),
     ) -> ::std::option::Option<(String, Option<String>)>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action430(
    +    let __temp0 = __action495(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    @@ -44520,7 +49896,7 @@
         )
     }
     
    -fn __action461<
    +fn __action526<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44530,19 +49906,19 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action457(
    +    let __temp0 = __action522(
             __0,
             __1,
             __2,
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action349(
    +    __action381(
             __temp0,
         )
     }
     
    -fn __action462<
    +fn __action527<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44550,17 +49926,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action458(
    +    let __temp0 = __action523(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action349(
    +    __action381(
             __temp0,
         )
     }
     
    -fn __action463<
    +fn __action528<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -44571,20 +49947,20 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action457(
    +    let __temp0 = __action522(
             __1,
             __2,
             __3,
             __4,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action350(
    +    __action382(
             __0,
             __temp0,
         )
     }
     
    -fn __action464<
    +fn __action529<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -44593,18 +49969,18 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action458(
    +    let __temp0 = __action523(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action350(
    +    __action382(
             __0,
             __temp0,
         )
     }
     
    -fn __action465<
    +fn __action530<
     >(
         __0: (lexer::Location, ::std::option::Option<(String, Option<String>)>, lexer::Location),
     ) -> Vec<(String, Option<String>)>
    @@ -44622,7 +49998,7 @@
         )
     }
     
    -fn __action466<
    +fn __action531<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         __1: (lexer::Location, ::std::option::Option<(String, Option<String>)>, lexer::Location),
    @@ -44640,7 +50016,7 @@
         )
     }
     
    -fn __action467<
    +fn __action532<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44650,7 +50026,7 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action431(
    +    let __temp0 = __action496(
             __0,
             __1,
             __2,
    @@ -44662,7 +50038,7 @@
         )
     }
     
    -fn __action468<
    +fn __action533<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44670,7 +50046,7 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action432(
    +    let __temp0 = __action497(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    @@ -44680,7 +50056,7 @@
         )
     }
     
    -fn __action469<
    +fn __action534<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44689,7 +50065,7 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action431(
    +    let __temp0 = __action496(
             __0,
             __1,
             __2,
    @@ -44700,14 +50076,14 @@
         )
     }
     
    -fn __action470<
    +fn __action535<
     >(
         __0: (lexer::Location, String, lexer::Location),
     ) -> ::std::option::Option<(String, Option<String>)>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action432(
    +    let __temp0 = __action497(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    @@ -44716,7 +50092,7 @@
         )
     }
     
    -fn __action471<
    +fn __action536<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44726,19 +50102,19 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action467(
    +    let __temp0 = __action532(
             __0,
             __1,
             __2,
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action347(
    +    __action379(
             __temp0,
         )
     }
     
    -fn __action472<
    +fn __action537<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44746,17 +50122,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action468(
    +    let __temp0 = __action533(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action347(
    +    __action379(
             __temp0,
         )
     }
     
    -fn __action473<
    +fn __action538<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -44767,20 +50143,20 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action467(
    +    let __temp0 = __action532(
             __1,
             __2,
             __3,
             __4,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action348(
    +    __action380(
             __0,
             __temp0,
         )
     }
     
    -fn __action474<
    +fn __action539<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -44789,18 +50165,18 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action468(
    +    let __temp0 = __action533(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action348(
    +    __action380(
             __0,
             __temp0,
         )
     }
     
    -fn __action475<
    +fn __action540<
     >(
         __0: (lexer::Location, ::std::option::Option<(String, Option<String>)>, lexer::Location),
     ) -> Vec<(String, Option<String>)>
    @@ -44818,7 +50194,7 @@
         )
     }
     
    -fn __action476<
    +fn __action541<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         __1: (lexer::Location, ::std::option::Option<(String, Option<String>)>, lexer::Location),
    @@ -44836,7 +50212,7 @@
         )
     }
     
    -fn __action477<
    +fn __action542<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -44860,7 +50236,7 @@
         )
     }
     
    -fn __action478<
    +fn __action543<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -44875,7 +50251,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action401(
    +    __action452(
             __temp0,
             __0,
             __1,
    @@ -44884,7 +50260,7 @@
         )
     }
     
    -fn __action479<
    +fn __action544<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -44897,14 +50273,14 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action402(
    +    __action453(
             __temp0,
             __0,
             __1,
         )
     }
     
    -fn __action480<
    +fn __action545<
     >(
         __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44923,7 +50299,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action366(
    +    __action404(
             __0,
             __temp0,
             __1,
    @@ -44936,7 +50312,7 @@
         )
     }
     
    -fn __action481<
    +fn __action546<
     >(
         __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -44952,7 +50328,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action367(
    +    __action405(
             __0,
             __temp0,
             __1,
    @@ -44962,7 +50338,7 @@
         )
     }
     
    -fn __action482<
    +fn __action547<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, Vec<ast::Expression>, lexer::Location),
    @@ -44982,7 +50358,7 @@
         )
     }
     
    -fn __action483<
    +fn __action548<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
    @@ -45002,7 +50378,7 @@
         )
     }
     
    -fn __action484<
    +fn __action549<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ast::Operator, lexer::Location),
    @@ -45024,7 +50400,7 @@
         )
     }
     
    -fn __action485<
    +fn __action550<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::LocatedStatement
    @@ -45042,7 +50418,7 @@
         )
     }
     
    -fn __action486<
    +fn __action551<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::LocatedStatement
    @@ -45060,7 +50436,7 @@
         )
     }
     
    -fn __action487<
    +fn __action552<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ::std::option::Option<Vec<ast::Expression>>, lexer::Location),
    @@ -45080,7 +50456,7 @@
         )
     }
     
    -fn __action488<
    +fn __action553<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::LocatedStatement
    @@ -45098,7 +50474,7 @@
         )
     }
     
    -fn __action489<
    +fn __action554<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45118,7 +50494,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action434(
    +    __action499(
             __temp0,
             __0,
             __1,
    @@ -45132,7 +50508,7 @@
         )
     }
     
    -fn __action490<
    +fn __action555<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45149,7 +50525,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action435(
    +    __action500(
             __temp0,
             __0,
             __1,
    @@ -45160,7 +50536,39 @@
         )
     }
     
    -fn __action491<
    +fn __action556<
    +>(
    +    __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, String, lexer::Location),
    +    __3: (lexer::Location, ast::Parameters, lexer::Location),
    +    __4: (lexer::Location, lexer::Tok, lexer::Location),
    +    __5: (lexer::Location, ast::Expression, lexer::Location),
    +    __6: (lexer::Location, lexer::Tok, lexer::Location),
    +    __7: (lexer::Location, Vec<ast::LocatedStatement>, lexer::Location),
    +) -> ast::LocatedStatement
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __1.0.clone();
    +    let __temp0 = __action287(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action483(
    +        __0,
    +        __temp0,
    +        __1,
    +        __2,
    +        __3,
    +        __4,
    +        __5,
    +        __6,
    +        __7,
    +    )
    +}
    +
    +fn __action557<
     >(
         __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -45177,7 +50585,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action77(
    +    __action484(
             __0,
             __temp0,
             __1,
    @@ -45188,7 +50596,7 @@
         )
     }
     
    -fn __action492<
    +fn __action558<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, Vec<String>, lexer::Location),
    @@ -45208,7 +50616,7 @@
         )
     }
     
    -fn __action493<
    +fn __action559<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45227,7 +50635,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action436(
    +    __action501(
             __temp0,
             __0,
             __1,
    @@ -45240,7 +50648,7 @@
         )
     }
     
    -fn __action494<
    +fn __action560<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45256,7 +50664,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action437(
    +    __action502(
             __temp0,
             __0,
             __1,
    @@ -45266,7 +50674,7 @@
         )
     }
     
    -fn __action495<
    +fn __action561<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, Vec<(String, Option<String>)>, lexer::Location),
    @@ -45286,7 +50694,7 @@
         )
     }
     
    -fn __action496<
    +fn __action562<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -45310,7 +50718,7 @@
         )
     }
     
    -fn __action497<
    +fn __action563<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, Vec<String>, lexer::Location),
    @@ -45330,7 +50738,7 @@
         )
     }
     
    -fn __action498<
    +fn __action564<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::LocatedStatement
    @@ -45348,7 +50756,7 @@
         )
     }
     
    -fn __action499<
    +fn __action565<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::LocatedStatement
    @@ -45366,7 +50774,7 @@
         )
     }
     
    -fn __action500<
    +fn __action566<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45381,7 +50789,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action448(
    +    __action513(
             __temp0,
             __0,
             __1,
    @@ -45390,7 +50798,7 @@
         )
     }
     
    -fn __action501<
    +fn __action567<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45403,14 +50811,14 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action449(
    +    __action514(
             __temp0,
             __0,
             __1,
         )
     }
     
    -fn __action502<
    +fn __action568<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -45431,7 +50839,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action443(
    +    __action508(
             __temp0,
             __0,
             __1,
    @@ -45446,7 +50854,7 @@
         )
     }
     
    -fn __action503<
    +fn __action569<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -45464,7 +50872,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action444(
    +    __action509(
             __temp0,
             __0,
             __1,
    @@ -45476,7 +50884,7 @@
         )
     }
     
    -fn __action504<
    +fn __action570<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -45494,7 +50902,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action445(
    +    __action510(
             __temp0,
             __0,
             __1,
    @@ -45506,7 +50914,7 @@
         )
     }
     
    -fn __action505<
    +fn __action571<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -45521,7 +50929,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action446(
    +    __action511(
             __temp0,
             __0,
             __1,
    @@ -45530,7 +50938,7 @@
         )
     }
     
    -fn __action506<
    +fn __action572<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45548,7 +50956,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action440(
    +    __action505(
             __temp0,
             __0,
             __1,
    @@ -45560,7 +50968,7 @@
         )
     }
     
    -fn __action507<
    +fn __action573<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45575,7 +50983,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action441(
    +    __action506(
             __temp0,
             __0,
             __1,
    @@ -45584,7 +50992,7 @@
         )
     }
     
    -fn __action508<
    +fn __action574<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, Vec<ast::WithItem>, lexer::Location),
    @@ -45608,7 +51016,7 @@
         )
     }
     
    -fn __action509<
    +fn __action575<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45618,7 +51026,7 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action477(
    +    let __temp0 = __action542(
             __0,
             __1,
             __2,
    @@ -45630,7 +51038,7 @@
         )
     }
     
    -fn __action510<
    +fn __action576<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(lexer::Location, lexer::Tok, ast::Expression, lexer::Tok, Vec<ast::LocatedStatement>)>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -45641,7 +51049,7 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action477(
    +    let __temp0 = __action542(
             __1,
             __2,
             __3,
    @@ -45654,7 +51062,7 @@
         )
     }
     
    -fn __action511<
    +fn __action577<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45672,7 +51080,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action493(
    +    __action559(
             __0,
             __1,
             __2,
    @@ -45684,7 +51092,7 @@
         )
     }
     
    -fn __action512<
    +fn __action578<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45702,7 +51110,7 @@
             __4,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action493(
    +    __action559(
             __0,
             __1,
             __2,
    @@ -45714,7 +51122,7 @@
         )
     }
     
    -fn __action513<
    +fn __action579<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45729,7 +51137,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action494(
    +    __action560(
             __0,
             __1,
             __2,
    @@ -45738,7 +51146,7 @@
         )
     }
     
    -fn __action514<
    +fn __action580<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45753,7 +51161,7 @@
             __4,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action494(
    +    __action560(
             __0,
             __1,
             __2,
    @@ -45762,7 +51170,7 @@
         )
     }
     
    -fn __action515<
    +fn __action581<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45788,23 +51196,23 @@
         )
     }
     
    -fn __action516<
    +fn __action582<
     >(
         __0: (lexer::Location, ast::Parameters, lexer::Location),
     ) -> ::std::option::Option<ast::Parameters>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action239(
    +    let __temp0 = __action232(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action237(
    +    __action230(
             __temp0,
         )
     }
     
    -fn __action517<
    +fn __action583<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Parameters, lexer::Location),
    @@ -45813,7 +51221,7 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action516(
    +    let __temp0 = __action582(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    @@ -45824,7 +51232,7 @@
         )
     }
     
    -fn __action518<
    +fn __action584<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -45832,7 +51240,7 @@
     {
         let __start0 = __0.2.clone();
         let __end0 = __1.0.clone();
    -    let __temp0 = __action238(
    +    let __temp0 = __action231(
             &__start0,
             &__end0,
         );
    @@ -45844,7 +51252,7 @@
         )
     }
     
    -fn __action519<
    +fn __action585<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> ast::LocatedStatement
    @@ -45856,13 +51264,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action483(
    +    __action548(
             __0,
             __temp0,
         )
     }
     
    -fn __action520<
    +fn __action586<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
    @@ -45874,13 +51282,13 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action483(
    +    __action548(
             __0,
             __temp0,
         )
     }
     
    -fn __action521<
    +fn __action587<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, Vec<ast::Comprehension>, lexer::Location),
    @@ -45888,35 +51296,35 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action194(
    +    let __temp0 = __action188(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action180(
    +    __action174(
             __0,
             __temp0,
         )
     }
     
    -fn __action522<
    +fn __action588<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> (Option<Option<String>>, ast::Expression)
     {
         let __start0 = __0.2.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action195(
    +    let __temp0 = __action189(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action180(
    +    __action174(
             __0,
             __temp0,
         )
     }
     
    -fn __action523<
    +fn __action589<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45926,12 +51334,12 @@
     {
         let __start0 = __3.2.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action197(
    +    let __temp0 = __action191(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action176(
    +    __action170(
             __0,
             __1,
             __2,
    @@ -45940,7 +51348,7 @@
         )
     }
     
    -fn __action524<
    +fn __action590<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -45951,11 +51359,11 @@
     {
         let __start0 = __4.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action198(
    +    let __temp0 = __action192(
             __4,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action176(
    +    __action170(
             __0,
             __1,
             __2,
    @@ -45964,7 +51372,7 @@
         )
     }
     
    -fn __action525<
    +fn __action591<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -45982,7 +51390,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action480(
    +    __action545(
             __temp0,
             __0,
             __1,
    @@ -45994,7 +51402,7 @@
         )
     }
     
    -fn __action526<
    +fn __action592<
     >(
         __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46012,7 +51420,7 @@
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action480(
    +    __action545(
             __temp0,
             __1,
             __2,
    @@ -46024,7 +51432,7 @@
         )
     }
     
    -fn __action527<
    +fn __action593<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -46039,7 +51447,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action481(
    +    __action546(
             __temp0,
             __0,
             __1,
    @@ -46048,7 +51456,7 @@
         )
     }
     
    -fn __action528<
    +fn __action594<
     >(
         __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46063,7 +51471,7 @@
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action481(
    +    __action546(
             __temp0,
             __1,
             __2,
    @@ -46072,7 +51480,67 @@
         )
     }
     
    -fn __action529<
    +fn __action595<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, String, lexer::Location),
    +    __2: (lexer::Location, ast::Parameters, lexer::Location),
    +    __3: (lexer::Location, lexer::Tok, lexer::Location),
    +    __4: (lexer::Location, ast::Expression, lexer::Location),
    +    __5: (lexer::Location, lexer::Tok, lexer::Location),
    +    __6: (lexer::Location, Vec<ast::LocatedStatement>, lexer::Location),
    +) -> ast::LocatedStatement
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __0.0.clone();
    +    let __temp0 = __action240(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action556(
    +        __temp0,
    +        __0,
    +        __1,
    +        __2,
    +        __3,
    +        __4,
    +        __5,
    +        __6,
    +    )
    +}
    +
    +fn __action596<
    +>(
    +    __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, String, lexer::Location),
    +    __3: (lexer::Location, ast::Parameters, lexer::Location),
    +    __4: (lexer::Location, lexer::Tok, lexer::Location),
    +    __5: (lexer::Location, ast::Expression, lexer::Location),
    +    __6: (lexer::Location, lexer::Tok, lexer::Location),
    +    __7: (lexer::Location, Vec<ast::LocatedStatement>, lexer::Location),
    +) -> ast::LocatedStatement
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action241(
    +        __0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action556(
    +        __temp0,
    +        __1,
    +        __2,
    +        __3,
    +        __4,
    +        __5,
    +        __6,
    +        __7,
    +    )
    +}
    +
    +fn __action597<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -46088,7 +51556,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action491(
    +    __action557(
             __temp0,
             __0,
             __1,
    @@ -46098,7 +51566,7 @@
         )
     }
     
    -fn __action530<
    +fn __action598<
     >(
         __0: (lexer::Location, ::std::vec::Vec<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46114,7 +51582,7 @@
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action491(
    +    __action557(
             __temp0,
             __1,
             __2,
    @@ -46124,7 +51592,7 @@
         )
     }
     
    -fn __action531<
    +fn __action599<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46144,7 +51612,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action502(
    +    __action568(
             __0,
             __1,
             __2,
    @@ -46158,7 +51626,7 @@
         )
     }
     
    -fn __action532<
    +fn __action600<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46178,7 +51646,7 @@
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action502(
    +    __action568(
             __0,
             __1,
             __2,
    @@ -46192,7 +51660,7 @@
         )
     }
     
    -fn __action533<
    +fn __action601<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46209,7 +51677,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action503(
    +    __action569(
             __0,
             __1,
             __2,
    @@ -46220,7 +51688,7 @@
         )
     }
     
    -fn __action534<
    +fn __action602<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46237,7 +51705,7 @@
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action503(
    +    __action569(
             __0,
             __1,
             __2,
    @@ -46248,7 +51716,7 @@
         )
     }
     
    -fn __action535<
    +fn __action603<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46265,7 +51733,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action504(
    +    __action570(
             __0,
             __1,
             __2,
    @@ -46276,7 +51744,7 @@
         )
     }
     
    -fn __action536<
    +fn __action604<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46293,7 +51761,7 @@
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action504(
    +    __action570(
             __0,
             __1,
             __2,
    @@ -46304,7 +51772,7 @@
         )
     }
     
    -fn __action537<
    +fn __action605<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46318,7 +51786,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action505(
    +    __action571(
             __0,
             __1,
             __2,
    @@ -46326,7 +51794,7 @@
         )
     }
     
    -fn __action538<
    +fn __action606<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46340,7 +51808,7 @@
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action505(
    +    __action571(
             __0,
             __1,
             __2,
    @@ -46348,7 +51816,7 @@
         )
     }
     
    -fn __action539<
    +fn __action607<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -46366,7 +51834,7 @@
         )
     }
     
    -fn __action540<
    +fn __action608<
     >(
         __0: (lexer::Location, ::std::vec::Vec<Option<ast::LocatedStatement>>, lexer::Location),
     ) -> ast::Program
    @@ -46382,23 +51850,23 @@
         )
     }
     
    -fn __action541<
    +fn __action609<
     >(
         __0: (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
     ) -> Vec<(Option<Option<String>>, ast::Expression)>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action334(
    +    let __temp0 = __action348(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action455(
    +    __action520(
             __temp0,
         )
     }
     
    -fn __action542<
    +fn __action610<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -46406,17 +51874,17 @@
     {
         let __start0 = __lookbehind.clone();
         let __end0 = __lookahead.clone();
    -    let __temp0 = __action335(
    +    let __temp0 = __action349(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action455(
    +    __action520(
             __temp0,
         )
     }
     
    -fn __action543<
    +fn __action611<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>, lexer::Location),
         __1: (lexer::Location, (Option<Option<String>>, ast::Expression), lexer::Location),
    @@ -46424,239 +51892,35 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action334(
    +    let __temp0 = __action348(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action456(
    +    __action521(
             __0,
             __temp0,
         )
     }
     
    -fn __action544<
    +fn __action612<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(Option<Option<String>>, ast::Expression)>, lexer::Location),
     ) -> Vec<(Option<Option<String>>, ast::Expression)>
     {
         let __start0 = __0.2.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action335(
    -        &__start0,
    -        &__end0,
    -    );
    -    let __temp0 = (__start0, __temp0, __end0);
    -    __action456(
    -        __0,
    -        __temp0,
    -    )
    -}
    -
    -fn __action545<
    ->(
    -    __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, String, lexer::Location),
    -) -> Option<String>
    -{
    -    let __start0 = __1.0.clone();
    -    let __end0 = __1.2.clone();
    -    let __temp0 = __action228(
    -        __1,
    -    );
    -    let __temp0 = (__start0, __temp0, __end0);
    -    __action88(
    -        __0,
    -        __temp0,
    -    )
    -}
    -
    -fn __action546<
    ->(
    -    __0: (lexer::Location, lexer::Tok, lexer::Location),
    -) -> Option<String>
    -{
    -    let __start0 = __0.2.clone();
    -    let __end0 = __0.2.clone();
    -    let __temp0 = __action229(
    +    let __temp0 = __action349(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action88(
    +    __action521(
             __0,
             __temp0,
         )
     }
     
    -fn __action547<
    ->(
    -    __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, String, lexer::Location),
    -    __2: (lexer::Location, lexer::Tok, lexer::Location),
    -    __3: (lexer::Location, Option<String>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    -{
    -    let __start0 = __1.0.clone();
    -    let __end0 = __1.2.clone();
    -    let __temp0 = __action228(
    -        __1,
    -    );
    -    let __temp0 = (__start0, __temp0, __end0);
    -    __action413(
    -        __0,
    -        __temp0,
    -        __2,
    -        __3,
    -    )
    -}
    -
    -fn __action548<
    ->(
    -    __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, lexer::Tok, lexer::Location),
    -    __2: (lexer::Location, Option<String>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    -{
    -    let __start0 = __0.2.clone();
    -    let __end0 = __1.0.clone();
    -    let __temp0 = __action229(
    -        &__start0,
    -        &__end0,
    -    );
    -    let __temp0 = (__start0, __temp0, __end0);
    -    __action413(
    -        __0,
    -        __temp0,
    -        __1,
    -        __2,
    -    )
    -}
    -
    -fn __action549<
    ->(
    -    __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, String, lexer::Location),
    -    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -    __3: (lexer::Location, lexer::Tok, lexer::Location),
    -    __4: (lexer::Location, Option<String>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    -{
    -    let __start0 = __1.0.clone();
    -    let __end0 = __1.2.clone();
    -    let __temp0 = __action228(
    -        __1,
    -    );
    -    let __temp0 = (__start0, __temp0, __end0);
    -    __action414(
    -        __0,
    -        __temp0,
    -        __2,
    -        __3,
    -        __4,
    -    )
    -}
    -
    -fn __action550<
    ->(
    -    __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -    __2: (lexer::Location, lexer::Tok, lexer::Location),
    -    __3: (lexer::Location, Option<String>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    -{
    -    let __start0 = __0.2.clone();
    -    let __end0 = __1.0.clone();
    -    let __temp0 = __action229(
    -        &__start0,
    -        &__end0,
    -    );
    -    let __temp0 = (__start0, __temp0, __end0);
    -    __action414(
    -        __0,
    -        __temp0,
    -        __1,
    -        __2,
    -        __3,
    -    )
    -}
    -
    -fn __action551<
    ->(
    -    __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, String, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    -{
    -    let __start0 = __1.0.clone();
    -    let __end0 = __1.2.clone();
    -    let __temp0 = __action228(
    -        __1,
    -    );
    -    let __temp0 = (__start0, __temp0, __end0);
    -    __action415(
    -        __0,
    -        __temp0,
    -    )
    -}
    -
    -fn __action552<
    ->(
    -    __0: (lexer::Location, lexer::Tok, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    -{
    -    let __start0 = __0.2.clone();
    -    let __end0 = __0.2.clone();
    -    let __temp0 = __action229(
    -        &__start0,
    -        &__end0,
    -    );
    -    let __temp0 = (__start0, __temp0, __end0);
    -    __action415(
    -        __0,
    -        __temp0,
    -    )
    -}
    -
    -fn __action553<
    ->(
    -    __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, String, lexer::Location),
    -    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    -{
    -    let __start0 = __1.0.clone();
    -    let __end0 = __1.2.clone();
    -    let __temp0 = __action228(
    -        __1,
    -    );
    -    let __temp0 = (__start0, __temp0, __end0);
    -    __action416(
    -        __0,
    -        __temp0,
    -        __2,
    -    )
    -}
    -
    -fn __action554<
    ->(
    -    __0: (lexer::Location, lexer::Tok, lexer::Location),
    -    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    -) -> (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>)
    -{
    -    let __start0 = __0.2.clone();
    -    let __end0 = __1.0.clone();
    -    let __temp0 = __action229(
    -        &__start0,
    -        &__end0,
    -    );
    -    let __temp0 = (__start0, __temp0, __end0);
    -    __action416(
    -        __0,
    -        __temp0,
    -        __1,
    -    )
    -}
    -
    -fn __action555<
    +fn __action613<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46665,34 +51929,34 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action459(
    +    let __temp0 = __action524(
             __0,
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action465(
    +    __action530(
             __temp0,
         )
     }
     
    -fn __action556<
    +fn __action614<
     >(
         __0: (lexer::Location, String, lexer::Location),
     ) -> Vec<(String, Option<String>)>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action460(
    +    let __temp0 = __action525(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action465(
    +    __action530(
             __temp0,
         )
     }
     
    -fn __action557<
    +fn __action615<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -46705,12 +51969,12 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action465(
    +    __action530(
             __temp0,
         )
     }
     
    -fn __action558<
    +fn __action616<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -46720,19 +51984,19 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action459(
    +    let __temp0 = __action524(
             __1,
             __2,
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action466(
    +    __action531(
             __0,
             __temp0,
         )
     }
     
    -fn __action559<
    +fn __action617<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -46740,17 +52004,17 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action460(
    +    let __temp0 = __action525(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action466(
    +    __action531(
             __0,
             __temp0,
         )
     }
     
    -fn __action560<
    +fn __action618<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
     ) -> Vec<(String, Option<String>)>
    @@ -46762,13 +52026,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action466(
    +    __action531(
             __0,
             __temp0,
         )
     }
     
    -fn __action561<
    +fn __action619<
     >(
         __0: (lexer::Location, String, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46777,34 +52041,34 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action469(
    +    let __temp0 = __action534(
             __0,
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action475(
    +    __action540(
             __temp0,
         )
     }
     
    -fn __action562<
    +fn __action620<
     >(
         __0: (lexer::Location, String, lexer::Location),
     ) -> Vec<(String, Option<String>)>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action470(
    +    let __temp0 = __action535(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action475(
    +    __action540(
             __temp0,
         )
     }
     
    -fn __action563<
    +fn __action621<
     >(
         __lookbehind: &lexer::Location,
         __lookahead: &lexer::Location,
    @@ -46817,12 +52081,12 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action475(
    +    __action540(
             __temp0,
         )
     }
     
    -fn __action564<
    +fn __action622<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -46832,19 +52096,19 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action469(
    +    let __temp0 = __action534(
             __1,
             __2,
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action476(
    +    __action541(
             __0,
             __temp0,
         )
     }
     
    -fn __action565<
    +fn __action623<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -46852,17 +52116,17 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action470(
    +    let __temp0 = __action535(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action476(
    +    __action541(
             __0,
             __temp0,
         )
     }
     
    -fn __action566<
    +fn __action624<
     >(
         __0: (lexer::Location, ::std::vec::Vec<(String, Option<String>)>, lexer::Location),
     ) -> Vec<(String, Option<String>)>
    @@ -46874,13 +52138,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action476(
    +    __action541(
             __0,
             __temp0,
         )
     }
     
    -fn __action567<
    +fn __action625<
     >(
         __0: (lexer::Location, (ast::Expression, ast::Expression), lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -46888,17 +52152,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action375(
    +    let __temp0 = __action413(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action355(
    +    __action393(
             __temp0,
             __1,
         )
     }
     
    -fn __action568<
    +fn __action626<
     >(
         __0: (lexer::Location, (ast::Expression, ast::Expression), lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>, lexer::Location),
    @@ -46907,34 +52171,34 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action376(
    +    let __temp0 = __action414(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action355(
    +    __action393(
             __temp0,
             __2,
         )
     }
     
    -fn __action569<
    +fn __action627<
     >(
         __0: (lexer::Location, (ast::Expression, ast::Expression), lexer::Location),
     ) -> Vec<(ast::Expression, ast::Expression)>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action375(
    +    let __temp0 = __action413(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action356(
    +    __action394(
             __temp0,
         )
     }
     
    -fn __action570<
    +fn __action628<
     >(
         __0: (lexer::Location, (ast::Expression, ast::Expression), lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Expression, ast::Expression))>, lexer::Location),
    @@ -46942,17 +52206,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action376(
    +    let __temp0 = __action414(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action356(
    +    __action394(
             __temp0,
         )
     }
     
    -fn __action571<
    +fn __action629<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -46960,17 +52224,17 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action385(
    +    let __temp0 = __action423(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action492(
    +    __action558(
             __0,
             __temp0,
         )
     }
     
    -fn __action572<
    +fn __action630<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -46979,18 +52243,18 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action386(
    +    let __temp0 = __action424(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action492(
    +    __action558(
             __0,
             __temp0,
         )
     }
     
    -fn __action573<
    +fn __action631<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -46998,17 +52262,17 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action385(
    +    let __temp0 = __action423(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action497(
    +    __action563(
             __0,
             __temp0,
         )
     }
     
    -fn __action574<
    +fn __action632<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, String, lexer::Location),
    @@ -47017,18 +52281,18 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action386(
    +    let __temp0 = __action424(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action497(
    +    __action563(
             __0,
             __temp0,
         )
     }
     
    -fn __action575<
    +fn __action633<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47036,17 +52300,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action397(
    +    let __temp0 = __action448(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action361(
    +    __action399(
             __temp0,
             __1,
         )
     }
     
    -fn __action576<
    +fn __action634<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -47055,34 +52319,34 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action398(
    +    let __temp0 = __action449(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action361(
    +    __action399(
             __temp0,
             __2,
         )
     }
     
    -fn __action577<
    +fn __action635<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> Vec<ast::Expression>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action397(
    +    let __temp0 = __action448(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action362(
    +    __action400(
             __temp0,
         )
     }
     
    -fn __action578<
    +fn __action636<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -47090,17 +52354,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action398(
    +    let __temp0 = __action449(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action362(
    +    __action400(
             __temp0,
         )
     }
     
    -fn __action579<
    +fn __action637<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47108,17 +52372,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action405(
    +    let __temp0 = __action456(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action357(
    +    __action395(
             __temp0,
             __1,
         )
     }
     
    -fn __action580<
    +fn __action638<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -47127,34 +52391,34 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action406(
    +    let __temp0 = __action457(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action357(
    +    __action395(
             __temp0,
             __2,
         )
     }
     
    -fn __action581<
    +fn __action639<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> Vec<ast::Expression>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action405(
    +    let __temp0 = __action456(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action358(
    +    __action396(
             __temp0,
         )
     }
     
    -fn __action582<
    +fn __action640<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -47162,17 +52426,17 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action406(
    +    let __temp0 = __action457(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action358(
    +    __action396(
             __temp0,
         )
     }
     
    -fn __action583<
    +fn __action641<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::WithItem, lexer::Location),
    @@ -47182,11 +52446,11 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action421(
    +    let __temp0 = __action480(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action508(
    +    __action574(
             __0,
             __temp0,
             __2,
    @@ -47194,7 +52458,7 @@
         )
     }
     
    -fn __action584<
    +fn __action642<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::WithItem, lexer::Location),
    @@ -47205,12 +52469,12 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action422(
    +    let __temp0 = __action481(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action508(
    +    __action574(
             __0,
             __temp0,
             __3,
    @@ -47218,7 +52482,7 @@
         )
     }
     
    -fn __action585<
    +fn __action643<
     >(
         __0: (lexer::Location, ::std::option::Option<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47228,11 +52492,11 @@
     {
         let __start0 = __3.0.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action213(
    +    let __temp0 = __action207(
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action147(
    +    __action140(
             __0,
             __1,
             __2,
    @@ -47240,7 +52504,7 @@
         )
     }
     
    -fn __action586<
    +fn __action644<
     >(
         __0: (lexer::Location, ::std::option::Option<ast::Expression>, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47249,12 +52513,12 @@
     {
         let __start0 = __2.2.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action214(
    +    let __temp0 = __action208(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action147(
    +    __action140(
             __0,
             __1,
             __2,
    @@ -47262,7 +52526,7 @@
         )
     }
     
    -fn __action587<
    +fn __action645<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47284,7 +52548,7 @@
         )
     }
     
    -fn __action588<
    +fn __action646<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47306,7 +52570,7 @@
         )
     }
     
    -fn __action589<
    +fn __action647<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47318,13 +52582,13 @@
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action148(
    +    __action141(
             __0,
             __temp0,
         )
     }
     
    -fn __action590<
    +fn __action648<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Expression
    @@ -47336,13 +52600,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action148(
    +    __action141(
             __0,
             __temp0,
         )
     }
     
    -fn __action591<
    +fn __action649<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47362,7 +52626,7 @@
             __2,
         );
         let __temp1 = (__start1, __temp1, __end1);
    -    __action585(
    +    __action643(
             __temp0,
             __1,
             __temp1,
    @@ -47370,7 +52634,7 @@
         )
     }
     
    -fn __action592<
    +fn __action650<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47390,7 +52654,7 @@
             &__end1,
         );
         let __temp1 = (__start1, __temp1, __end1);
    -    __action585(
    +    __action643(
             __temp0,
             __1,
             __temp1,
    @@ -47398,7 +52662,7 @@
         )
     }
     
    -fn __action593<
    +fn __action651<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47418,7 +52682,7 @@
             __1,
         );
         let __temp1 = (__start1, __temp1, __end1);
    -    __action585(
    +    __action643(
             __temp0,
             __0,
             __temp1,
    @@ -47426,7 +52690,7 @@
         )
     }
     
    -fn __action594<
    +fn __action652<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47446,7 +52710,7 @@
             &__end1,
         );
         let __temp1 = (__start1, __temp1, __end1);
    -    __action585(
    +    __action643(
             __temp0,
             __0,
             __temp1,
    @@ -47454,7 +52718,7 @@
         )
     }
     
    -fn __action595<
    +fn __action653<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47473,14 +52737,14 @@
             __2,
         );
         let __temp1 = (__start1, __temp1, __end1);
    -    __action586(
    +    __action644(
             __temp0,
             __1,
             __temp1,
         )
     }
     
    -fn __action596<
    +fn __action654<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47499,14 +52763,14 @@
             &__end1,
         );
         let __temp1 = (__start1, __temp1, __end1);
    -    __action586(
    +    __action644(
             __temp0,
             __1,
             __temp1,
         )
     }
     
    -fn __action597<
    +fn __action655<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47525,14 +52789,14 @@
             __1,
         );
         let __temp1 = (__start1, __temp1, __end1);
    -    __action586(
    +    __action644(
             __temp0,
             __0,
             __temp1,
         )
     }
     
    -fn __action598<
    +fn __action656<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Expression
    @@ -47551,14 +52815,14 @@
             &__end1,
         );
         let __temp1 = (__start1, __temp1, __end1);
    -    __action586(
    +    __action644(
             __temp0,
             __0,
             __temp1,
         )
     }
     
    -fn __action599<
    +fn __action657<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, Vec<(ast::Expression, ast::Expression)>, lexer::Location),
    @@ -47567,18 +52831,18 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action209(
    +    let __temp0 = __action203(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action157(
    +    __action150(
             __0,
             __temp0,
             __2,
         )
     }
     
    -fn __action600<
    +fn __action658<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47586,19 +52850,19 @@
     {
         let __start0 = __0.2.clone();
         let __end0 = __1.0.clone();
    -    let __temp0 = __action210(
    +    let __temp0 = __action204(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action157(
    +    __action150(
             __0,
             __temp0,
             __1,
         )
     }
     
    -fn __action601<
    +fn __action659<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47606,7 +52870,7 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action399(
    +    let __temp0 = __action450(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    @@ -47616,7 +52880,7 @@
         )
     }
     
    -fn __action602<
    +fn __action660<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47625,7 +52889,7 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action400(
    +    let __temp0 = __action451(
             __1,
             __2,
         );
    @@ -47636,7 +52900,7 @@
         )
     }
     
    -fn __action603<
    +fn __action661<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ast::Operator, lexer::Location),
    @@ -47645,18 +52909,18 @@
     {
         let __start0 = __2.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action399(
    +    let __temp0 = __action450(
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action484(
    +    __action549(
             __0,
             __1,
             __temp0,
         )
     }
     
    -fn __action604<
    +fn __action662<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ast::Operator, lexer::Location),
    @@ -47666,19 +52930,19 @@
     {
         let __start0 = __2.0.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action400(
    +    let __temp0 = __action451(
             __2,
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action484(
    +    __action549(
             __0,
             __1,
             __temp0,
         )
     }
     
    -fn __action605<
    +fn __action663<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47693,11 +52957,11 @@
     {
         let __start0 = __3.0.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action399(
    +    let __temp0 = __action450(
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action489(
    +    __action554(
             __0,
             __1,
             __2,
    @@ -47710,7 +52974,7 @@
         )
     }
     
    -fn __action606<
    +fn __action664<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47726,12 +52990,12 @@
     {
         let __start0 = __3.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action400(
    +    let __temp0 = __action451(
             __3,
             __4,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action489(
    +    __action554(
             __0,
             __1,
             __2,
    @@ -47744,7 +53008,7 @@
         )
     }
     
    -fn __action607<
    +fn __action665<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47756,11 +53020,11 @@
     {
         let __start0 = __3.0.clone();
         let __end0 = __3.2.clone();
    -    let __temp0 = __action399(
    +    let __temp0 = __action450(
             __3,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action490(
    +    __action555(
             __0,
             __1,
             __2,
    @@ -47770,7 +53034,7 @@
         )
     }
     
    -fn __action608<
    +fn __action666<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47783,12 +53047,12 @@
     {
         let __start0 = __3.0.clone();
         let __end0 = __4.2.clone();
    -    let __temp0 = __action400(
    +    let __temp0 = __action451(
             __3,
             __4,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action490(
    +    __action555(
             __0,
             __1,
             __2,
    @@ -47798,14 +53062,14 @@
         )
     }
     
    -fn __action609<
    +fn __action667<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
     ) -> ::std::option::Option<Vec<ast::Expression>>
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action399(
    +    let __temp0 = __action450(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    @@ -47814,7 +53078,7 @@
         )
     }
     
    -fn __action610<
    +fn __action668<
     >(
         __0: (lexer::Location, ast::Expression, lexer::Location),
         __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, ast::Expression)>, lexer::Location),
    @@ -47822,7 +53086,7 @@
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action400(
    +    let __temp0 = __action451(
             __0,
             __1,
         );
    @@ -47832,7 +53096,7 @@
         )
     }
     
    -fn __action611<
    +fn __action669<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47842,11 +53106,11 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action609(
    +    let __temp0 = __action667(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action351(
    +    __action387(
             __0,
             __temp0,
             __2,
    @@ -47854,7 +53118,7 @@
         )
     }
     
    -fn __action612<
    +fn __action670<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47865,12 +53129,12 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action610(
    +    let __temp0 = __action668(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action351(
    +    __action387(
             __0,
             __temp0,
             __3,
    @@ -47878,7 +53142,7 @@
         )
     }
     
    -fn __action613<
    +fn __action671<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47892,7 +53156,7 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action351(
    +    __action387(
             __0,
             __temp0,
             __1,
    @@ -47900,7 +53164,7 @@
         )
     }
     
    -fn __action614<
    +fn __action672<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47909,18 +53173,18 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action609(
    +    let __temp0 = __action667(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action352(
    +    __action388(
             __0,
             __temp0,
             __2,
         )
     }
     
    -fn __action615<
    +fn __action673<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47930,19 +53194,19 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action610(
    +    let __temp0 = __action668(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action352(
    +    __action388(
             __0,
             __temp0,
             __3,
         )
     }
     
    -fn __action616<
    +fn __action674<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -47955,14 +53219,14 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action352(
    +    __action388(
             __0,
             __temp0,
             __1,
         )
     }
     
    -fn __action617<
    +fn __action675<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47970,17 +53234,17 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action609(
    +    let __temp0 = __action667(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action487(
    +    __action552(
             __0,
             __temp0,
         )
     }
     
    -fn __action618<
    +fn __action676<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -47989,18 +53253,18 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action610(
    +    let __temp0 = __action668(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action487(
    +    __action552(
             __0,
             __temp0,
         )
     }
     
    -fn __action619<
    +fn __action677<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::LocatedStatement
    @@ -48012,13 +53276,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action487(
    +    __action552(
             __0,
             __temp0,
         )
     }
     
    -fn __action620<
    +fn __action678<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -48026,17 +53290,17 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action609(
    +    let __temp0 = __action667(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action93(
    +    __action85(
             __0,
             __temp0,
         )
     }
     
    -fn __action621<
    +fn __action679<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Expression, lexer::Location),
    @@ -48045,18 +53309,18 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __2.2.clone();
    -    let __temp0 = __action610(
    +    let __temp0 = __action668(
             __1,
             __2,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action93(
    +    __action85(
             __0,
             __temp0,
         )
     }
     
    -fn __action622<
    +fn __action680<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
     ) -> ast::Expression
    @@ -48068,13 +53332,13 @@
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action93(
    +    __action85(
             __0,
             __temp0,
         )
     }
     
    -fn __action623<
    +fn __action681<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, Vec<ast::Expression>, lexer::Location),
    @@ -48083,18 +53347,18 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action211(
    +    let __temp0 = __action205(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action153(
    +    __action146(
             __0,
             __temp0,
             __2,
         )
     }
     
    -fn __action624<
    +fn __action682<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -48102,19 +53366,19 @@
     {
         let __start0 = __0.2.clone();
         let __end0 = __1.0.clone();
    -    let __temp0 = __action212(
    +    let __temp0 = __action206(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action153(
    +    __action146(
             __0,
             __temp0,
             __1,
         )
     }
     
    -fn __action625<
    +fn __action683<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, ast::Parameters, lexer::Location),
    @@ -48124,11 +53388,11 @@
     {
         let __start0 = __1.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action218(
    +    let __temp0 = __action215(
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action97(
    +    __action89(
             __0,
             __temp0,
             __2,
    @@ -48136,7 +53400,7 @@
         )
     }
     
    -fn __action626<
    +fn __action684<
     >(
         __0: (lexer::Location, lexer::Tok, lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    @@ -48145,12 +53409,12 @@
     {
         let __start0 = __0.2.clone();
         let __end0 = __1.0.clone();
    -    let __temp0 = __action219(
    +    let __temp0 = __action216(
             &__start0,
             &__end0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action97(
    +    __action89(
             __0,
             __temp0,
             __1,
    @@ -48158,124 +53422,650 @@
         )
     }
     
    -fn __action627<
    +fn __action685<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Parameter, lexer::Location),
    +) -> Option<ast::Parameter>
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action373(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action324(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action686<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +) -> Option<ast::Parameter>
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action374(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action324(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action687<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Parameter, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +    __3: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action373(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action464(
    +        __0,
    +        __temp0,
    +        __2,
    +        __3,
    +    )
    +}
    +
    +fn __action688<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __1.0.clone();
    +    let __temp0 = __action374(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action464(
    +        __0,
    +        __temp0,
    +        __1,
    +        __2,
    +    )
    +}
    +
    +fn __action689<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Parameter, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    __3: (lexer::Location, lexer::Tok, lexer::Location),
    +    __4: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action373(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action465(
    +        __0,
    +        __temp0,
    +        __2,
    +        __3,
    +        __4,
    +    )
    +}
    +
    +fn __action690<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +    __3: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __1.0.clone();
    +    let __temp0 = __action374(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action465(
    +        __0,
    +        __temp0,
    +        __1,
    +        __2,
    +        __3,
    +    )
    +}
    +
    +fn __action691<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Parameter, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action373(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action466(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action692<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action374(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action466(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action693<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Parameter, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action373(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action467(
    +        __0,
    +        __temp0,
    +        __2,
    +    )
    +}
    +
    +fn __action694<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __1.0.clone();
    +    let __temp0 = __action374(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action467(
    +        __0,
    +        __temp0,
    +        __1,
    +    )
    +}
    +
    +fn __action695<
     >(
    -    __0: (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    -    __2: (lexer::Location, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>), lexer::Location),
    +    __2: (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
     ) -> ast::Parameters
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action417(
    +    let __temp0 = __action468(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action392(
    +    __action434(
             __temp0,
             __1,
             __2,
         )
     }
     
    -fn __action628<
    +fn __action696<
     >(
    -    __0: (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    -    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
         __2: (lexer::Location, lexer::Tok, lexer::Location),
    -    __3: (lexer::Location, (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>), lexer::Location),
    +    __3: (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
     ) -> ast::Parameters
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action418(
    +    let __temp0 = __action469(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action392(
    +    __action434(
             __temp0,
             __2,
             __3,
         )
     }
     
    -fn __action629<
    +fn __action697<
     >(
    -    __0: (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
     ) -> ast::Parameters
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action417(
    +    let __temp0 = __action468(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action393(
    +    __action435(
             __temp0,
         )
     }
     
    -fn __action630<
    +fn __action698<
     >(
    -    __0: (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    -    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
     ) -> ast::Parameters
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action418(
    +    let __temp0 = __action469(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action393(
    +    __action435(
             __temp0,
         )
     }
     
    -fn __action631<
    +fn __action699<
     >(
    -    __0: (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
         __1: (lexer::Location, lexer::Tok, lexer::Location),
    -    __2: (lexer::Location, Option<String>, lexer::Location),
    +    __2: (lexer::Location, Option<ast::Parameter>, lexer::Location),
     ) -> ast::Parameters
     {
         let __start0 = __0.0.clone();
         let __end0 = __0.2.clone();
    -    let __temp0 = __action417(
    +    let __temp0 = __action468(
             __0,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action388(
    +    __action426(
             __temp0,
             __1,
             __2,
         )
     }
     
    -fn __action632<
    +fn __action700<
     >(
    -    __0: (lexer::Location, (String, Option<ast::Expression>), lexer::Location),
    -    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (String, Option<ast::Expression>))>, lexer::Location),
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
         __2: (lexer::Location, lexer::Tok, lexer::Location),
    -    __3: (lexer::Location, Option<String>, lexer::Location),
    +    __3: (lexer::Location, Option<ast::Parameter>, lexer::Location),
     ) -> ast::Parameters
     {
         let __start0 = __0.0.clone();
         let __end0 = __1.2.clone();
    -    let __temp0 = __action418(
    +    let __temp0 = __action469(
             __0,
             __1,
         );
         let __temp0 = (__start0, __temp0, __end0);
    -    __action388(
    +    __action426(
    +        __temp0,
    +        __2,
    +        __3,
    +    )
    +}
    +
    +fn __action701<
    +>(
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
    +) -> ast::Parameters
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action476(
    +        __0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action437(
    +        __temp0,
    +        __1,
    +        __2,
    +    )
    +}
    +
    +fn __action702<
    +>(
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +    __3: (lexer::Location, (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>), lexer::Location),
    +) -> ast::Parameters
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action477(
    +        __0,
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action437(
    +        __temp0,
    +        __2,
    +        __3,
    +    )
    +}
    +
    +fn __action703<
    +>(
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +) -> ast::Parameters
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action476(
    +        __0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action438(
    +        __temp0,
    +    )
    +}
    +
    +fn __action704<
    +>(
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> ast::Parameters
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action477(
    +        __0,
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action438(
    +        __temp0,
    +    )
    +}
    +
    +fn __action705<
    +>(
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> ast::Parameters
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action476(
    +        __0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action430(
    +        __temp0,
    +        __1,
    +        __2,
    +    )
    +}
    +
    +fn __action706<
    +>(
    +    __0: (lexer::Location, (ast::Parameter, Option<ast::Expression>), lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +    __3: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> ast::Parameters
    +{
    +    let __start0 = __0.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action477(
    +        __0,
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action430(
    +        __temp0,
    +        __2,
    +        __3,
    +    )
    +}
    +
    +fn __action707<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Parameter, lexer::Location),
    +) -> Option<ast::Parameter>
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action364(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action331(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action708<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +) -> Option<ast::Parameter>
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action365(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action331(
    +        __0,
             __temp0,
    +    )
    +}
    +
    +fn __action709<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Parameter, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +    __3: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action364(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action472(
    +        __0,
    +        __temp0,
    +        __2,
    +        __3,
    +    )
    +}
    +
    +fn __action710<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, lexer::Tok, lexer::Location),
    +    __2: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __1.0.clone();
    +    let __temp0 = __action365(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action472(
    +        __0,
    +        __temp0,
    +        __1,
    +        __2,
    +    )
    +}
    +
    +fn __action711<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Parameter, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    __3: (lexer::Location, lexer::Tok, lexer::Location),
    +    __4: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action364(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action473(
    +        __0,
    +        __temp0,
    +        __2,
    +        __3,
    +        __4,
    +    )
    +}
    +
    +fn __action712<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +    __2: (lexer::Location, lexer::Tok, lexer::Location),
    +    __3: (lexer::Location, Option<ast::Parameter>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __1.0.clone();
    +    let __temp0 = __action365(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action473(
    +        __0,
    +        __temp0,
    +        __1,
             __2,
             __3,
         )
     }
     
    +fn __action713<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Parameter, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action364(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action474(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action714<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __0.2.clone();
    +    let __temp0 = __action365(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action474(
    +        __0,
    +        __temp0,
    +    )
    +}
    +
    +fn __action715<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ast::Parameter, lexer::Location),
    +    __2: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __1.0.clone();
    +    let __end0 = __1.2.clone();
    +    let __temp0 = __action364(
    +        __1,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action475(
    +        __0,
    +        __temp0,
    +        __2,
    +    )
    +}
    +
    +fn __action716<
    +>(
    +    __0: (lexer::Location, lexer::Tok, lexer::Location),
    +    __1: (lexer::Location, ::std::vec::Vec<(lexer::Tok, (ast::Parameter, Option<ast::Expression>))>, lexer::Location),
    +) -> (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>)
    +{
    +    let __start0 = __0.2.clone();
    +    let __end0 = __1.0.clone();
    +    let __temp0 = __action365(
    +        &__start0,
    +        &__end0,
    +    );
    +    let __temp0 = (__start0, __temp0, __end0);
    +    __action475(
    +        __0,
    +        __temp0,
    +        __1,
    +    )
    +}
    +
     pub trait __ToTriple<> {
         type Error;
         fn to_triple(value: Self) -> Result<(lexer::Location,lexer::Tok,lexer::Location),Self::Error>;
    @@ -48294,4 +54084,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_parser/token.rs.html b/src/rustpython_parser/token.rs.html index 58dc096..d7592dc 100644 --- a/src/rustpython_parser/token.rs.html +++ b/src/rustpython_parser/token.rs.html @@ -1,4 +1,4 @@ -token.rs.html -- source
      1
    +token.rs.html -- source
      1
       2
       3
       4
    @@ -204,4 +204,4 @@
         Yield,
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/builtins.rs.html b/src/rustpython_vm/builtins.rs.html index a9bbcb6..0ff89f4 100644 --- a/src/rustpython_vm/builtins.rs.html +++ b/src/rustpython_vm/builtins.rs.html @@ -1,4 +1,4 @@ -builtins.rs.html -- source
      1
    +builtins.rs.html -- source
      1
       2
       3
       4
    @@ -835,35 +835,40 @@
     835
     836
     837
    +838
    +839
    +840
     
     //! Builtin function definitions.
     //!
     //! Implements functions listed here: https://docs.python.org/3/library/builtins.html
     
    -// use std::ops::Deref;
     use std::char;
     use std::io::{self, Write};
    +use std::path::PathBuf;
    +
    +use num_traits::{Signed, ToPrimitive};
     
     use crate::compile;
    +use crate::import::import_module;
     use crate::obj::objbool;
     use crate::obj::objdict;
     use crate::obj::objint;
     use crate::obj::objiter;
    -use crate::obj::objstr;
    +use crate::obj::objstr::{self, PyStringRef};
     use crate::obj::objtype;
     
    +use crate::frame::Scope;
    +use crate::function::{Args, OptionalArg, PyFuncArgs};
     use crate::pyobject::{
    -    AttributeProtocol, IdProtocol, PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef,
    -    PyResult, Scope, TypeProtocol,
    +    AttributeProtocol, DictProtocol, IdProtocol, PyContext, PyObjectRef, PyResult, TypeProtocol,
     };
    +use crate::vm::VirtualMachine;
     
     #[cfg(not(target_arch = "wasm32"))]
     use crate::stdlib::io::io_open;
     
    -use crate::vm::VirtualMachine;
    -use num_traits::{Signed, ToPrimitive};
    -
    -fn get_locals(vm: &mut VirtualMachine) -> PyObjectRef {
    +fn get_locals(vm: &VirtualMachine) -> PyObjectRef {
         let d = vm.new_dict();
         // TODO: implement dict_iter_items?
         let locals = vm.get_locals();
    @@ -874,23 +879,11 @@
         d
     }
     
    -fn dir_locals(vm: &mut VirtualMachine) -> PyObjectRef {
    +fn dir_locals(vm: &VirtualMachine) -> PyObjectRef {
         get_locals(vm)
     }
     
    -fn dir_object(vm: &mut VirtualMachine, obj: &PyObjectRef) -> PyObjectRef {
    -    // Gather all members here:
    -    let attributes = objtype::get_attributes(obj);
    -    let mut members: Vec<String> = attributes.into_iter().map(|(n, _o)| n).collect();
    -
    -    // Sort members:
    -    members.sort();
    -
    -    let members_pystr = members.into_iter().map(|m| vm.ctx.new_str(m)).collect();
    -    vm.ctx.new_list(members_pystr)
    -}
    -
    -fn builtin_abs(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_abs(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(x, None)]);
         match vm.get_method(x.clone(), "__abs__") {
             Ok(attrib) => vm.invoke(attrib, PyFuncArgs::new(vec![], vec![])),
    @@ -898,7 +891,7 @@
         }
     }
     
    -fn builtin_all(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_all(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(iterable, None)]);
         let items = vm.extract_elements(iterable)?;
         for item in items {
    @@ -910,21 +903,23 @@
         Ok(vm.new_bool(true))
     }
     
    -fn builtin_any(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_any(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(iterable, None)]);
    -    let items = vm.extract_elements(iterable)?;
    -    for item in items {
    +    let iterator = objiter::get_iter(vm, iterable)?;
    +
    +    while let Some(item) = objiter::get_next_object(vm, &iterator)? {
             let result = objbool::boolval(vm, item)?;
             if result {
                 return Ok(vm.new_bool(true));
             }
         }
    +
         Ok(vm.new_bool(false))
     }
     
     // builtin_ascii
     
    -fn builtin_bin(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_bin(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(number, Some(vm.ctx.int_type()))]);
     
         let n = objint::get_value(number);
    @@ -939,13 +934,13 @@
     
     // builtin_breakpoint
     
    -fn builtin_callable(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_callable(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, None)]);
         let is_callable = obj.typ().has_attr("__call__");
         Ok(vm.new_bool(is_callable))
     }
     
    -fn builtin_chr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_chr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(i, Some(vm.ctx.int_type()))]);
     
         let code_point = objint::get_value(i).to_u32().unwrap();
    @@ -958,7 +953,7 @@
         Ok(vm.new_str(txt))
     }
     
    -fn builtin_compile(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_compile(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -995,7 +990,7 @@
         })
     }
     
    -fn builtin_delattr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_delattr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -1004,36 +999,37 @@
         vm.del_attr(obj, attr.clone())
     }
     
    -fn builtin_dir(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_dir(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         if args.args.is_empty() {
             Ok(dir_locals(vm))
         } else {
             let obj = args.args.into_iter().next().unwrap();
    -        Ok(dir_object(vm, &obj))
    +        let seq = vm.call_method(&obj, "__dir__", vec![])?;
    +        let sorted = builtin_sorted(vm, PyFuncArgs::new(vec![seq], vec![]))?;
    +        Ok(sorted)
         }
     }
     
    -fn builtin_divmod(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_divmod(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(x, None), (y, None)]);
         match vm.get_method(x.clone(), "__divmod__") {
    -        Ok(attrib) => vm.invoke(attrib, PyFuncArgs::new(vec![y.clone()], vec![])),
    +        Ok(attrib) => vm.invoke(attrib, vec![y.clone()]),
             Err(..) => Err(vm.new_type_error("unsupported operand type(s) for divmod".to_string())),
         }
     }
     
     /// Implements `eval`.
     /// See also: https://docs.python.org/3/library/functions.html#eval
    -fn builtin_eval(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_eval(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
             required = [(source, None)],
    -        optional = [
    -            (_globals, Some(vm.ctx.dict_type())),
    -            (locals, Some(vm.ctx.dict_type()))
    -        ]
    +        optional = [(globals, None), (locals, Some(vm.ctx.dict_type()))]
         );
     
    +    let scope = make_scope(vm, globals, locals)?;
    +
         // Determine code object:
         let code_obj = if objtype::isinstance(source, &vm.ctx.code_type()) {
             source.clone()
    @@ -1052,25 +1048,22 @@
             return Err(vm.new_type_error("code argument must be str or code object".to_string()));
         };
     
    -    let scope = make_scope(vm, locals);
    -
         // Run the source:
         vm.run_code_obj(code_obj.clone(), scope)
     }
     
     /// Implements `exec`
     /// https://docs.python.org/3/library/functions.html#exec
    -fn builtin_exec(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_exec(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
             required = [(source, None)],
    -        optional = [
    -            (_globals, Some(vm.ctx.dict_type())),
    -            (locals, Some(vm.ctx.dict_type()))
    -        ]
    +        optional = [(globals, None), (locals, Some(vm.ctx.dict_type()))]
         );
     
    +    let scope = make_scope(vm, globals, locals)?;
    +
         // Determine code object:
         let code_obj = if objtype::isinstance(source, &vm.ctx.str_type()) {
             let mode = compile::Mode::Exec;
    @@ -1089,35 +1082,49 @@
             return Err(vm.new_type_error("source argument must be str or code object".to_string()));
         };
     
    -    let scope = make_scope(vm, locals);
    -
         // Run the code:
         vm.run_code_obj(code_obj, scope)
     }
     
    -fn make_scope(vm: &mut VirtualMachine, locals: Option<&PyObjectRef>) -> PyObjectRef {
    -    // handle optional global and locals
    -    let locals = if let Some(locals) = locals {
    -        locals.clone()
    -    } else {
    -        vm.new_dict()
    +fn make_scope(
    +    vm: &VirtualMachine,
    +    globals: Option<&PyObjectRef>,
    +    locals: Option<&PyObjectRef>,
    +) -> PyResult<Scope> {
    +    let dict_type = vm.ctx.dict_type();
    +    let globals = match globals {
    +        Some(arg) => {
    +            if arg.is(&vm.get_none()) {
    +                None
    +            } else if vm.isinstance(arg, &dict_type)? {
    +                Some(arg)
    +            } else {
    +                let arg_typ = arg.typ();
    +                let actual_type = vm.to_pystr(&arg_typ)?;
    +                let expected_type_name = vm.to_pystr(&dict_type)?;
    +                return Err(vm.new_type_error(format!(
    +                    "globals must be a {}, not {}",
    +                    expected_type_name, actual_type
    +                )));
    +            }
    +        }
    +        None => None,
         };
     
    -    // TODO: handle optional globals
    -    // Construct new scope:
    -    let scope_inner = Scope {
    -        locals,
    -        parent: None,
    +    let current_scope = vm.current_scope();
    +    let globals = match globals {
    +        Some(dict) => dict.clone(),
    +        None => current_scope.globals.clone(),
    +    };
    +    let locals = match locals {
    +        Some(dict) => Some(dict.clone()),
    +        None => current_scope.get_only_locals(),
         };
     
    -    PyObject {
    -        payload: PyObjectPayload::Scope { scope: scope_inner },
    -        typ: None,
    -    }
    -    .into_ref()
    +    Ok(Scope::new(locals, globals))
     }
     
    -fn builtin_format(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_format(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -1130,31 +1137,41 @@
         vm.call_method(obj, "__format__", vec![format_spec])
     }
     
    -fn builtin_getattr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(obj, None), (attr, Some(vm.ctx.str_type()))]
    -    );
    -    vm.get_attribute(obj.clone(), attr.clone())
    +fn catch_attr_exception<T>(ex: PyObjectRef, default: T, vm: &VirtualMachine) -> PyResult<T> {
    +    if objtype::isinstance(&ex, &vm.ctx.exceptions.attribute_error) {
    +        Ok(default)
    +    } else {
    +        Err(ex)
    +    }
     }
     
    -// builtin_globals
    +fn builtin_getattr(
    +    obj: PyObjectRef,
    +    attr: PyStringRef,
    +    default: OptionalArg<PyObjectRef>,
    +    vm: &VirtualMachine,
    +) -> PyResult {
    +    let ret = vm.get_attribute(obj.clone(), attr);
    +    if let OptionalArg::Present(default) = default {
    +        ret.or_else(|ex| catch_attr_exception(ex, default, vm))
    +    } else {
    +        ret
    +    }
    +}
     
    -fn builtin_hasattr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(obj, None), (attr, Some(vm.ctx.str_type()))]
    -    );
    -    let has_attr = match vm.get_attribute(obj.clone(), attr.clone()) {
    -        Ok(..) => true,
    -        Err(..) => false,
    -    };
    -    Ok(vm.context().new_bool(has_attr))
    +fn builtin_globals(vm: &VirtualMachine, _args: PyFuncArgs) -> PyResult {
    +    Ok(vm.current_scope().globals.clone())
     }
     
    -fn builtin_hash(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_hasattr(obj: PyObjectRef, attr: PyStringRef, vm: &VirtualMachine) -> PyResult<bool> {
    +    if let Err(ex) = vm.get_attribute(obj.clone(), attr) {
    +        catch_attr_exception(ex, false, vm)
    +    } else {
    +        Ok(true)
    +    }
    +}
    +
    +fn builtin_hash(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, None)]);
     
         vm.call_method(obj, "__hash__", vec![])
    @@ -1162,7 +1179,7 @@
     
     // builtin_help
     
    -fn builtin_hex(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_hex(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(number, Some(vm.ctx.int_type()))]);
     
         let n = objint::get_value(number);
    @@ -1175,7 +1192,7 @@
         Ok(vm.new_str(s))
     }
     
    -fn builtin_id(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_id(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, None)]);
     
         Ok(vm.context().new_int(obj.get_id()))
    @@ -1183,30 +1200,34 @@
     
     // builtin_input
     
    -fn builtin_isinstance(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(obj, None), (typ, None)]);
    +fn builtin_isinstance(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(obj, None), (typ, Some(vm.get_type()))]
    +    );
     
    -    let isinstance = objtype::isinstance(obj, typ);
    -    Ok(vm.context().new_bool(isinstance))
    +    let isinstance = vm.isinstance(obj, typ)?;
    +    Ok(vm.new_bool(isinstance))
     }
     
    -fn builtin_issubclass(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    if args.args.len() != 2 {
    -        panic!("issubclass expects exactly two parameters");
    -    }
    -
    -    let cls1 = &args.args[0];
    -    let cls2 = &args.args[1];
    +fn builtin_issubclass(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(subclass, Some(vm.get_type())), (cls, Some(vm.get_type()))]
    +    );
     
    -    Ok(vm.context().new_bool(objtype::issubclass(cls1, cls2)))
    +    let issubclass = vm.issubclass(subclass, cls)?;
    +    Ok(vm.context().new_bool(issubclass))
     }
     
    -fn builtin_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_iter(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(iter_target, None)]);
         objiter::get_iter(vm, iter_target)
     }
     
    -fn builtin_len(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_len(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, None)]);
         let len_method_name = "__len__";
         match vm.get_method(obj.clone(), len_method_name) {
    @@ -1219,12 +1240,12 @@
         }
     }
     
    -fn builtin_locals(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_locals(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args);
         Ok(vm.get_locals())
     }
     
    -fn builtin_max(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_max(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         let candidates = if args.args.len() > 1 {
             args.args.clone()
         } else if args.args.len() == 1 {
    @@ -1251,16 +1272,14 @@
         // TODO: this key function looks pretty duplicate. Maybe we can create
         // a local function?
         let mut x_key = if let Some(f) = &key_func {
    -        let args = PyFuncArgs::new(vec![x.clone()], vec![]);
    -        vm.invoke(f.clone(), args)?
    +        vm.invoke(f.clone(), vec![x.clone()])?
         } else {
             x.clone()
         };
     
         for y in candidates_iter {
             let y_key = if let Some(f) = &key_func {
    -            let args = PyFuncArgs::new(vec![y.clone()], vec![]);
    -            vm.invoke(f.clone(), args)?
    +            vm.invoke(f.clone(), vec![y.clone()])?
             } else {
                 y.clone()
             };
    @@ -1275,7 +1294,7 @@
         Ok(x)
     }
     
    -fn builtin_min(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_min(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         let candidates = if args.args.len() > 1 {
             args.args.clone()
         } else if args.args.len() == 1 {
    @@ -1301,16 +1320,14 @@
         // TODO: this key function looks pretty duplicate. Maybe we can create
         // a local function?
         let mut x_key = if let Some(f) = &key_func {
    -        let args = PyFuncArgs::new(vec![x.clone()], vec![]);
    -        vm.invoke(f.clone(), args)?
    +        vm.invoke(f.clone(), vec![x.clone()])?
         } else {
             x.clone()
         };
     
         for y in candidates_iter {
             let y_key = if let Some(f) = &key_func {
    -            let args = PyFuncArgs::new(vec![y.clone()], vec![]);
    -            vm.invoke(f.clone(), args)?
    +            vm.invoke(f.clone(), vec![y.clone()])?
             } else {
                 y.clone()
             };
    @@ -1325,7 +1342,7 @@
         Ok(x)
     }
     
    -fn builtin_next(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_next(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -1348,7 +1365,7 @@
         }
     }
     
    -fn builtin_oct(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_oct(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(number, Some(vm.ctx.int_type()))]);
     
         let n = objint::get_value(number);
    @@ -1361,7 +1378,7 @@
         Ok(vm.new_str(s))
     }
     
    -fn builtin_ord(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_ord(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(string, Some(vm.ctx.str_type()))]);
         let string = objstr::get_value(string);
         let string_len = string.chars().count();
    @@ -1379,7 +1396,7 @@
         }
     }
     
    -fn builtin_pow(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_pow(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -1388,7 +1405,7 @@
         );
         let pow_method_name = "__pow__";
         let result = match vm.get_method(x.clone(), pow_method_name) {
    -        Ok(attrib) => vm.invoke(attrib, PyFuncArgs::new(vec![y.clone()], vec![])),
    +        Ok(attrib) => vm.invoke(attrib, vec![y.clone()]),
             Err(..) => Err(vm.new_type_error("unsupported operand type(s) for pow".to_string())),
         };
         //Check if the 3rd argument is defined and perform modulus on the result
    @@ -1398,7 +1415,7 @@
             Some(mod_value) => {
                 let mod_method_name = "__mod__";
                 match vm.get_method(result.expect("result not defined").clone(), mod_method_name) {
    -                Ok(value) => vm.invoke(value, PyFuncArgs::new(vec![mod_value.clone()], vec![])),
    +                Ok(value) => vm.invoke(value, vec![mod_value.clone()]),
                     Err(..) => {
                         Err(vm.new_type_error("unsupported operand type(s) for mod".to_string()))
                     }
    @@ -1408,79 +1425,47 @@
         }
     }
     
    -pub fn builtin_print(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("print called with {:?}", args);
    -
    -    // Handle 'sep' kwarg:
    -    let sep_arg = args
    -        .get_optional_kwarg("sep")
    -        .filter(|obj| !obj.is(&vm.get_none()));
    -    if let Some(ref obj) = sep_arg {
    -        if !objtype::isinstance(obj, &vm.ctx.str_type()) {
    -            return Err(vm.new_type_error(format!(
    -                "sep must be None or a string, not {}",
    -                objtype::get_type_name(&obj.typ())
    -            )));
    -        }
    -    }
    -    let sep_str = sep_arg.as_ref().map(|obj| objstr::borrow_value(obj));
    -
    -    // Handle 'end' kwarg:
    -    let end_arg = args
    -        .get_optional_kwarg("end")
    -        .filter(|obj| !obj.is(&vm.get_none()));
    -    if let Some(ref obj) = end_arg {
    -        if !objtype::isinstance(obj, &vm.ctx.str_type()) {
    -            return Err(vm.new_type_error(format!(
    -                "end must be None or a string, not {}",
    -                objtype::get_type_name(&obj.typ())
    -            )));
    -        }
    -    }
    -    let end_str = end_arg.as_ref().map(|obj| objstr::borrow_value(obj));
    -
    -    // Handle 'flush' kwarg:
    -    let flush = if let Some(flush) = &args.get_optional_kwarg("flush") {
    -        objbool::boolval(vm, flush.clone()).unwrap()
    -    } else {
    -        false
    -    };
    +#[derive(Debug, FromArgs)]
    +pub struct PrintOptions {
    +    sep: Option<PyStringRef>,
    +    end: Option<PyStringRef>,
    +    flush: bool,
    +}
     
    +pub fn builtin_print(objects: Args, options: PrintOptions, vm: &VirtualMachine) -> PyResult<()> {
         let stdout = io::stdout();
         let mut stdout_lock = stdout.lock();
         let mut first = true;
    -    for a in &args.args {
    +    for object in objects {
             if first {
                 first = false;
    -        } else if let Some(ref sep_str) = sep_str {
    -            write!(stdout_lock, "{}", sep_str).unwrap();
    +        } else if let Some(ref sep) = options.sep {
    +            write!(stdout_lock, "{}", sep.value).unwrap();
             } else {
                 write!(stdout_lock, " ").unwrap();
             }
    -        let v = vm.to_str(&a)?;
    -        let s = objstr::borrow_value(&v);
    +        let s = &vm.to_str(&object)?.value;
             write!(stdout_lock, "{}", s).unwrap();
         }
     
    -    if let Some(end_str) = end_str {
    -        write!(stdout_lock, "{}", end_str).unwrap();
    +    if let Some(end) = options.end {
    +        write!(stdout_lock, "{}", end.value).unwrap();
         } else {
             writeln!(stdout_lock).unwrap();
         }
     
    -    if flush {
    +    if options.flush {
             stdout_lock.flush().unwrap();
         }
     
    -    Ok(vm.get_none())
    +    Ok(())
     }
     
    -fn builtin_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(obj, None)]);
    -    vm.to_repr(obj)
    +fn builtin_repr(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult<PyStringRef> {
    +    vm.to_repr(&obj)
     }
     
    -fn builtin_reversed(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_reversed(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, None)]);
     
         match vm.get_method(obj.clone(), "__reversed__") {
    @@ -1494,7 +1479,7 @@
     }
     // builtin_reversed
     
    -fn builtin_round(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_round(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -1508,25 +1493,33 @@
         } else {
             // without a parameter, the result type is coerced to int
             let rounded = &vm.call_method(number, "__round__", vec![])?;
    -        Ok(vm.ctx.new_int(objint::get_value(rounded)))
    +        Ok(vm.ctx.new_int(objint::get_value(rounded).clone()))
         }
     }
     
    -fn builtin_setattr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(obj, None), (attr, Some(vm.ctx.str_type())), (value, None)]
    -    );
    -    let name = objstr::get_value(attr);
    -    vm.ctx.set_attr(obj, &name, value.clone());
    -    Ok(vm.get_none())
    +fn builtin_setattr(
    +    obj: PyObjectRef,
    +    attr: PyStringRef,
    +    value: PyObjectRef,
    +    vm: &VirtualMachine,
    +) -> PyResult<()> {
    +    vm.set_attr(&obj, attr.into_object(), value)?;
    +    Ok(())
     }
     
     // builtin_slice
    -// builtin_sorted
     
    -fn builtin_sum(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn builtin_sorted(vm: &VirtualMachine, mut args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(iterable, None)]);
    +    let items = vm.extract_elements(iterable)?;
    +    let lst = vm.ctx.new_list(items);
    +
    +    args.shift();
    +    vm.call_method(&lst, "sort", args)?;
    +    Ok(lst)
    +}
    +
    +fn builtin_sum(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(iterable, None)]);
         let items = vm.extract_elements(iterable)?;
     
    @@ -1538,8 +1531,27 @@
         Ok(sum)
     }
     
    +// Should be renamed to builtin___import__?
    +fn builtin_import(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(name, Some(vm.ctx.str_type()))],
    +        optional = [
    +            (_globals, Some(vm.ctx.dict_type())),
    +            (_locals, Some(vm.ctx.dict_type()))
    +        ]
    +    );
    +    let current_path = {
    +        let mut source_pathbuf = PathBuf::from(&vm.current_frame().code.source_path);
    +        source_pathbuf.pop();
    +        source_pathbuf
    +    };
    +
    +    import_module(vm, current_path, &objstr::get_value(name))
    +}
    +
     // builtin_vars
    -// builtin___import__
     
     pub fn make_module(ctx: &PyContext) -> PyObjectRef {
         let py_mod = py_module!(ctx, "__builtins__", {
    @@ -1570,6 +1582,7 @@
             "filter" => ctx.filter_type(),
             "format" => ctx.new_rustfunc(builtin_format),
             "getattr" => ctx.new_rustfunc(builtin_getattr),
    +        "globals" => ctx.new_rustfunc(builtin_globals),
             "hasattr" => ctx.new_rustfunc(builtin_hasattr),
             "hash" => ctx.new_rustfunc(builtin_hash),
             "hex" => ctx.new_rustfunc(builtin_hex),
    @@ -1598,6 +1611,7 @@
             "round" => ctx.new_rustfunc(builtin_round),
             "set" => ctx.set_type(),
             "setattr" => ctx.new_rustfunc(builtin_setattr),
    +        "sorted" => ctx.new_rustfunc(builtin_sorted),
             "slice" => ctx.slice_type(),
             "staticmethod" => ctx.staticmethod_type(),
             "str" => ctx.str_type(),
    @@ -1606,6 +1620,7 @@
             "tuple" => ctx.tuple_type(),
             "type" => ctx.type_type(),
             "zip" => ctx.zip_type(),
    +        "__import__" => ctx.new_rustfunc(builtin_import),
     
             // Constants
             "NotImplemented" => ctx.not_implemented.clone(),
    @@ -1628,6 +1643,7 @@
             "StopIteration" => ctx.exceptions.stop_iteration.clone(),
             "ZeroDivisionError" => ctx.exceptions.zero_division_error.clone(),
             "KeyError" => ctx.exceptions.key_error.clone(),
    +        "OSError" => ctx.exceptions.os_error.clone(),
         });
     
         #[cfg(not(target_arch = "wasm32"))]
    @@ -1636,7 +1652,7 @@
         py_mod
     }
     
    -pub fn builtin_build_class_(vm: &mut VirtualMachine, mut args: PyFuncArgs) -> PyResult {
    +pub fn builtin_build_class_(vm: &VirtualMachine, mut args: PyFuncArgs) -> PyResult {
         let function = args.shift();
         let name_arg = args.shift();
         let bases = args.args.clone();
    @@ -1653,25 +1669,15 @@
         let bases = vm.context().new_tuple(bases);
     
         // Prepare uses full __getattribute__ resolution chain.
    -    let prepare_name = vm.new_str("__prepare__".to_string());
    -    let prepare = vm.get_attribute(metaclass.clone(), prepare_name)?;
    -    let namespace = vm.invoke(
    -        prepare,
    -        PyFuncArgs {
    -            args: vec![name_arg.clone(), bases.clone()],
    -            kwargs: vec![],
    -        },
    -    )?;
    -
    -    vm.invoke(
    -        function,
    -        PyFuncArgs {
    -            args: vec![namespace.clone()],
    -            kwargs: vec![],
    -        },
    -    )?;
    -
    -    vm.call_method(&metaclass, "__call__", vec![name_arg, bases, namespace])
    +    let prepare = vm.get_attribute(metaclass.clone(), "__prepare__")?;
    +    let namespace = vm.invoke(prepare, vec![name_arg.clone(), bases.clone()])?;
    +
    +    let cells = vm.new_dict();
    +
    +    vm.invoke_with_locals(function, cells.clone(), namespace.clone())?;
    +    let class = vm.call_method(&metaclass, "__call__", vec![name_arg, bases, namespace])?;
    +    cells.set_item(&vm.ctx, "__class__", class.clone());
    +    Ok(class)
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/bytecode.rs.html b/src/rustpython_vm/bytecode.rs.html index b699f13..b542f38 100644 --- a/src/rustpython_vm/bytecode.rs.html +++ b/src/rustpython_vm/bytecode.rs.html @@ -1,4 +1,4 @@ -bytecode.rs.html -- source
      1
    +bytecode.rs.html -- source
      1
       2
       3
       4
    @@ -399,6 +399,35 @@
     399
     400
     401
    +402
    +403
    +404
    +405
    +406
    +407
    +408
    +409
    +410
    +411
    +412
    +413
    +414
    +415
    +416
    +417
    +418
    +419
    +420
    +421
    +422
    +423
    +424
    +425
    +426
    +427
    +428
    +429
    +430
     
     //! Implement python as a virtual machine with bytecodes. This module
     //! implements bytecode structure.
    @@ -420,10 +449,10 @@
         pub instructions: Vec<Instruction>,
         pub label_map: HashMap<Label, usize>,
         pub locations: Vec<ast::Location>,
    -    pub arg_names: Vec<String>,          // Names of positional arguments
    -    pub varargs: Option<Option<String>>, // *args or *
    +    pub arg_names: Vec<String>, // Names of positional arguments
    +    pub varargs: Varargs,       // *args or *
         pub kwonlyarg_names: Vec<String>,
    -    pub varkeywords: Option<Option<String>>, // **kwargs or **
    +    pub varkeywords: Varargs, // **kwargs or **
         pub source_path: String,
         pub first_line_number: usize,
         pub obj_name: String, // Name of the object that created this code object
    @@ -433,6 +462,7 @@
     bitflags! {
         pub struct FunctionOpArg: u8 {
             const HAS_DEFAULTS = 0x01;
    +        const HAS_ANNOTATIONS = 0x04;
         }
     }
     
    @@ -561,7 +591,6 @@
         },
         PrintExpr,
         LoadBuildClass,
    -    StoreLocals,
         UnpackSequence {
             size: usize,
         },
    @@ -571,6 +600,7 @@
         },
         Unpack,
         FormatValue {
    +        conversion: Option<ast::ConversionFlag>,
             spec: String,
         },
     }
    @@ -592,9 +622,10 @@
         Boolean { value: bool },
         String { value: String },
         Bytes { value: Vec<u8> },
    -    Code { code: CodeObject },
    +    Code { code: Box<CodeObject> },
         Tuple { elements: Vec<Constant> },
         None,
    +    Ellipsis,
     }
     
     #[derive(Debug, Clone, PartialEq)]
    @@ -637,6 +668,13 @@
         Plus,
     }
     
    +#[derive(Debug, Clone, PartialEq)]
    +pub enum Varargs {
    +    None,
    +    Unnamed,
    +    Named(String),
    +}
    +
     /*
     Maintain a stack of blocks on the VM.
     pub enum BlockType {
    @@ -648,9 +686,9 @@
     impl CodeObject {
         pub fn new(
             arg_names: Vec<String>,
    -        varargs: Option<Option<String>>,
    +        varargs: Varargs,
             kwonlyarg_names: Vec<String>,
    -        varkeywords: Option<Option<String>>,
    +        varkeywords: Varargs,
             source_path: String,
             first_line_number: usize,
             obj_name: String,
    @@ -670,7 +708,7 @@
             }
         }
     
    -    pub fn get_constants<'a>(&'a self) -> impl Iterator<Item = &'a Constant> {
    +    pub fn get_constants(&self) -> impl Iterator<Item = &Constant> {
             self.instructions.iter().filter_map(|x| {
                 if let Instruction::LoadConst { value } = x {
                     Some(value)
    @@ -759,11 +797,10 @@
                 MapAdd { i } => w!(MapAdd, i),
                 PrintExpr => w!(PrintExpr),
                 LoadBuildClass => w!(LoadBuildClass),
    -            StoreLocals => w!(StoreLocals),
                 UnpackSequence { size } => w!(UnpackSequence, size),
                 UnpackEx { before, after } => w!(UnpackEx, before, after),
                 Unpack => w!(Unpack),
    -            FormatValue { spec } => w!(FormatValue, spec),
    +            FormatValue { spec, .. } => w!(FormatValue, spec), // TODO: write conversion
             }
         }
     }
    @@ -788,6 +825,7 @@
                         .join(", ")
                 ),
                 Constant::None => write!(f, "None"),
    +            Constant::Ellipsis => write!(f, "Ellipsis"),
             }
         }
     }
    @@ -801,5 +839,25 @@
             )
         }
     }
    +
    +impl From<ast::Varargs> for Varargs {
    +    fn from(varargs: ast::Varargs) -> Varargs {
    +        match varargs {
    +            ast::Varargs::None => Varargs::None,
    +            ast::Varargs::Unnamed => Varargs::Unnamed,
    +            ast::Varargs::Named(param) => Varargs::Named(param.arg),
    +        }
    +    }
    +}
    +
    +impl<'a> From<&'a ast::Varargs> for Varargs {
    +    fn from(varargs: &'a ast::Varargs) -> Varargs {
    +        match varargs {
    +            ast::Varargs::None => Varargs::None,
    +            ast::Varargs::Unnamed => Varargs::Unnamed,
    +            ast::Varargs::Named(ref param) => Varargs::Named(param.arg.clone()),
    +        }
    +    }
    +}
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/compile.rs.html b/src/rustpython_vm/compile.rs.html index f0e3136..6428da7 100644 --- a/src/rustpython_vm/compile.rs.html +++ b/src/rustpython_vm/compile.rs.html @@ -1,4 +1,4 @@ -compile.rs.html -- source
       1
    +compile.rs.html -- source
       1
        2
        3
        4
    @@ -1494,6 +1494,117 @@
     1494
     1495
     1496
    +1497
    +1498
    +1499
    +1500
    +1501
    +1502
    +1503
    +1504
    +1505
    +1506
    +1507
    +1508
    +1509
    +1510
    +1511
    +1512
    +1513
    +1514
    +1515
    +1516
    +1517
    +1518
    +1519
    +1520
    +1521
    +1522
    +1523
    +1524
    +1525
    +1526
    +1527
    +1528
    +1529
    +1530
    +1531
    +1532
    +1533
    +1534
    +1535
    +1536
    +1537
    +1538
    +1539
    +1540
    +1541
    +1542
    +1543
    +1544
    +1545
    +1546
    +1547
    +1548
    +1549
    +1550
    +1551
    +1552
    +1553
    +1554
    +1555
    +1556
    +1557
    +1558
    +1559
    +1560
    +1561
    +1562
    +1563
    +1564
    +1565
    +1566
    +1567
    +1568
    +1569
    +1570
    +1571
    +1572
    +1573
    +1574
    +1575
    +1576
    +1577
    +1578
    +1579
    +1580
    +1581
    +1582
    +1583
    +1584
    +1585
    +1586
    +1587
    +1588
    +1589
    +1590
    +1591
    +1592
    +1593
    +1594
    +1595
    +1596
    +1597
    +1598
    +1599
    +1600
    +1601
    +1602
    +1603
    +1604
    +1605
    +1606
    +1607
     
     //!
     //! Take an AST and transform it into bytecode
    @@ -1502,9 +1613,10 @@
     //!   https://github.com/python/cpython/blob/master/Python/compile.c
     //!   https://github.com/micropython/micropython/blob/master/py/compile.c
     
    -use crate::bytecode::{self, CallType, CodeObject, Instruction};
    +use crate::bytecode::{self, CallType, CodeObject, Instruction, Varargs};
     use crate::error::CompileError;
    -use crate::pyobject::{PyObject, PyObjectPayload, PyObjectRef};
    +use crate::obj::objcode;
    +use crate::pyobject::{PyObject, PyObjectRef};
     use num_complex::Complex64;
     use rustpython_parser::{ast, parser};
     
    @@ -1514,6 +1626,7 @@
         source_path: Option<String>,
         current_source_location: ast::Location,
         in_loop: bool,
    +    in_function_def: bool,
     }
     
     /// Compile a given sourcecode into a bytecode object.
    @@ -1544,10 +1657,7 @@
     
         let code = compiler.pop_code_object();
         trace!("Compilation completed: {:?}", code);
    -    Ok(PyObject::new(
    -        PyObjectPayload::Code { code: code },
    -        code_type,
    -    ))
    +    Ok(PyObject::new(objcode::PyCode::new(code), code_type))
     }
     
     pub enum Mode {
    @@ -1572,6 +1682,7 @@
                 source_path: None,
                 current_source_location: ast::Location::default(),
                 in_loop: false,
    +            in_function_def: false,
             }
         }
     
    @@ -1579,9 +1690,9 @@
             let line_number = self.get_source_line_number();
             self.code_object_stack.push(CodeObject::new(
                 Vec::new(),
    -            None,
    +            Varargs::None,
                 Vec::new(),
    -            None,
    +            Varargs::None,
                 self.source_path.clone().unwrap(),
                 line_number,
                 obj_name,
    @@ -1729,9 +1840,10 @@
     
                     self.compile_test(test, None, Some(else_label), EvalContext::Statement)?;
     
    +                let was_in_loop = self.in_loop;
                     self.in_loop = true;
                     self.compile_statements(body)?;
    -                self.in_loop = false;
    +                self.in_loop = was_in_loop;
                     self.emit(Instruction::Jump {
                         target: start_label,
                     });
    @@ -1768,45 +1880,7 @@
                     iter,
                     body,
                     orelse,
    -            } => {
    -                // Start loop
    -                let start_label = self.new_label();
    -                let else_label = self.new_label();
    -                let end_label = self.new_label();
    -                self.emit(Instruction::SetupLoop {
    -                    start: start_label,
    -                    end: end_label,
    -                });
    -
    -                // The thing iterated:
    -                for i in iter {
    -                    self.compile_expression(i)?;
    -                }
    -
    -                // Retrieve Iterator
    -                self.emit(Instruction::GetIter);
    -
    -                self.set_label(start_label);
    -                self.emit(Instruction::ForIter { target: else_label });
    -
    -                // Start of loop iteration, set targets:
    -                self.compile_store(target)?;
    -
    -                // Body of loop:
    -                self.in_loop = true;
    -                self.compile_statements(body)?;
    -                self.in_loop = false;
    -
    -                self.emit(Instruction::Jump {
    -                    target: start_label,
    -                });
    -                self.set_label(else_label);
    -                self.emit(Instruction::PopBlock);
    -                if let Some(orelse) = orelse {
    -                    self.compile_statements(orelse)?;
    -                }
    -                self.set_label(end_label);
    -            }
    +            } => self.compile_for(target, iter, body, orelse)?,
                 ast::Statement::Raise { exception, cause } => match exception {
                     Some(value) => {
                         self.compile_expression(value)?;
    @@ -1829,221 +1903,21 @@
                     handlers,
                     orelse,
                     finalbody,
    -            } => {
    -                let mut handler_label = self.new_label();
    -                let finally_label = self.new_label();
    -                let else_label = self.new_label();
    -                // try:
    -                self.emit(Instruction::SetupExcept {
    -                    handler: handler_label,
    -                });
    -                self.compile_statements(body)?;
    -                self.emit(Instruction::PopBlock);
    -                self.emit(Instruction::Jump { target: else_label });
    -
    -                // except handlers:
    -                self.set_label(handler_label);
    -                // Exception is on top of stack now
    -                handler_label = self.new_label();
    -                for handler in handlers {
    -                    // If we gave a typ,
    -                    // check if this handler can handle the exception:
    -                    if let Some(exc_type) = &handler.typ {
    -                        // Duplicate exception for test:
    -                        self.emit(Instruction::Duplicate);
    -
    -                        // Check exception type:
    -                        self.emit(Instruction::LoadName {
    -                            name: String::from("isinstance"),
    -                        });
    -                        self.emit(Instruction::Rotate { amount: 2 });
    -                        self.compile_expression(exc_type)?;
    -                        self.emit(Instruction::CallFunction {
    -                            typ: CallType::Positional(2),
    -                        });
    -
    -                        // We cannot handle this exception type:
    -                        self.emit(Instruction::JumpIfFalse {
    -                            target: handler_label,
    -                        });
    -
    -                        // We have a match, store in name (except x as y)
    -                        if let Some(alias) = &handler.name {
    -                            self.emit(Instruction::StoreName {
    -                                name: alias.clone(),
    -                            });
    -                        } else {
    -                            // Drop exception from top of stack:
    -                            self.emit(Instruction::Pop);
    -                        }
    -                    } else {
    -                        // Catch all!
    -                        // Drop exception from top of stack:
    -                        self.emit(Instruction::Pop);
    -                    }
    -
    -                    // Handler code:
    -                    self.compile_statements(&handler.body)?;
    -                    self.emit(Instruction::Jump {
    -                        target: finally_label,
    -                    });
    -
    -                    // Emit a new label for the next handler
    -                    self.set_label(handler_label);
    -                    handler_label = self.new_label();
    -                }
    -                self.emit(Instruction::Jump {
    -                    target: handler_label,
    -                });
    -                self.set_label(handler_label);
    -                // If code flows here, we have an unhandled exception,
    -                // emit finally code and raise again!
    -                // Duplicate finally code here:
    -                // TODO: this bytecode is now duplicate, could this be
    -                // improved?
    -                if let Some(statements) = finalbody {
    -                    self.compile_statements(statements)?;
    -                }
    -                self.emit(Instruction::Raise { argc: 1 });
    -
    -                // We successfully ran the try block:
    -                // else:
    -                self.set_label(else_label);
    -                if let Some(statements) = orelse {
    -                    self.compile_statements(statements)?;
    -                }
    -
    -                // finally:
    -                self.set_label(finally_label);
    -                if let Some(statements) = finalbody {
    -                    self.compile_statements(statements)?;
    -                }
    -
    -                // unimplemented!();
    -            }
    +            } => self.compile_try_statement(body, handlers, orelse, finalbody)?,
                 ast::Statement::FunctionDef {
                     name,
                     args,
                     body,
                     decorator_list,
    -            } => {
    -                // Create bytecode for this function:
    -                let flags = self.enter_function(name, args)?;
    -                self.compile_statements(body)?;
    -
    -                // Emit None at end:
    -                self.emit(Instruction::LoadConst {
    -                    value: bytecode::Constant::None,
    -                });
    -                self.emit(Instruction::ReturnValue);
    -                let code = self.pop_code_object();
    -
    -                self.prepare_decorators(decorator_list)?;
    -                self.emit(Instruction::LoadConst {
    -                    value: bytecode::Constant::Code { code },
    -                });
    -                self.emit(Instruction::LoadConst {
    -                    value: bytecode::Constant::String {
    -                        value: name.clone(),
    -                    },
    -                });
    -
    -                // Turn code object into function object:
    -                self.emit(Instruction::MakeFunction { flags });
    -                self.apply_decorators(decorator_list);
    -
    -                self.emit(Instruction::StoreName {
    -                    name: name.to_string(),
    -                });
    -            }
    +                returns,
    +            } => self.compile_function_def(name, args, body, decorator_list, returns)?,
                 ast::Statement::ClassDef {
                     name,
                     body,
                     bases,
                     keywords,
                     decorator_list,
    -            } => {
    -                self.prepare_decorators(decorator_list)?;
    -                self.emit(Instruction::LoadBuildClass);
    -                let line_number = self.get_source_line_number();
    -                self.code_object_stack.push(CodeObject::new(
    -                    vec![String::from("__locals__")],
    -                    None,
    -                    vec![],
    -                    None,
    -                    self.source_path.clone().unwrap(),
    -                    line_number,
    -                    name.clone(),
    -                ));
    -                self.emit(Instruction::LoadName {
    -                    name: String::from("__locals__"),
    -                });
    -                self.emit(Instruction::StoreLocals);
    -                self.compile_statements(body)?;
    -                self.emit(Instruction::LoadConst {
    -                    value: bytecode::Constant::None,
    -                });
    -                self.emit(Instruction::ReturnValue);
    -
    -                let code = self.pop_code_object();
    -                self.emit(Instruction::LoadConst {
    -                    value: bytecode::Constant::Code { code },
    -                });
    -                self.emit(Instruction::LoadConst {
    -                    value: bytecode::Constant::String {
    -                        value: name.clone(),
    -                    },
    -                });
    -
    -                // Turn code object into function object:
    -                self.emit(Instruction::MakeFunction {
    -                    flags: bytecode::FunctionOpArg::empty(),
    -                });
    -
    -                self.emit(Instruction::LoadConst {
    -                    value: bytecode::Constant::String {
    -                        value: name.clone(),
    -                    },
    -                });
    -
    -                for base in bases {
    -                    self.compile_expression(base)?;
    -                }
    -
    -                if !keywords.is_empty() {
    -                    let mut kwarg_names = vec![];
    -                    for keyword in keywords {
    -                        if let Some(name) = &keyword.name {
    -                            kwarg_names.push(bytecode::Constant::String {
    -                                value: name.to_string(),
    -                            });
    -                        } else {
    -                            // This means **kwargs!
    -                            panic!("name must be set");
    -                        }
    -                        self.compile_expression(&keyword.value)?;
    -                    }
    -
    -                    self.emit(Instruction::LoadConst {
    -                        value: bytecode::Constant::Tuple {
    -                            elements: kwarg_names,
    -                        },
    -                    });
    -                    self.emit(Instruction::CallFunction {
    -                        typ: CallType::Keyword(2 + keywords.len() + bases.len()),
    -                    });
    -                } else {
    -                    self.emit(Instruction::CallFunction {
    -                        typ: CallType::Positional(2 + bases.len()),
    -                    });
    -                }
    -
    -                self.apply_decorators(decorator_list);
    -
    -                self.emit(Instruction::StoreName {
    -                    name: name.to_string(),
    -                });
    -            }
    +            } => self.compile_class_def(name, body, bases, keywords, decorator_list)?,
                 ast::Statement::Assert { test, msg } => {
                     // TODO: if some flag, ignore all assert statements!
     
    @@ -2081,6 +1955,9 @@
                     self.emit(Instruction::Continue);
                 }
                 ast::Statement::Return { value } => {
    +                if !self.in_function_def {
    +                    return Err(CompileError::InvalidReturn);
    +                }
                     match value {
                         Some(e) => {
                             let size = e.len();
    @@ -2160,7 +2037,6 @@
             name: &str,
             args: &ast::Parameters,
         ) -> Result<bytecode::FunctionOpArg, CompileError> {
    -        self.in_loop = false;
             let have_kwargs = !args.defaults.is_empty();
             if have_kwargs {
                 // Construct a tuple:
    @@ -2176,10 +2052,10 @@
     
             let line_number = self.get_source_line_number();
             self.code_object_stack.push(CodeObject::new(
    -            args.args.clone(),
    -            args.vararg.clone(),
    -            args.kwonlyargs.clone(),
    -            args.kwarg.clone(),
    +            args.args.iter().map(|a| a.arg.clone()).collect(),
    +            Varargs::from(&args.vararg),
    +            args.kwonlyargs.iter().map(|a| a.arg.clone()).collect(),
    +            Varargs::from(&args.kwarg),
                 self.source_path.clone().unwrap(),
                 line_number,
                 name.to_string(),
    @@ -2212,6 +2088,330 @@
             }
         }
     
    +    fn compile_try_statement(
    +        &mut self,
    +        body: &[ast::LocatedStatement],
    +        handlers: &[ast::ExceptHandler],
    +        orelse: &Option<Vec<ast::LocatedStatement>>,
    +        finalbody: &Option<Vec<ast::LocatedStatement>>,
    +    ) -> Result<(), CompileError> {
    +        let mut handler_label = self.new_label();
    +        let finally_label = self.new_label();
    +        let else_label = self.new_label();
    +        // try:
    +        self.emit(Instruction::SetupExcept {
    +            handler: handler_label,
    +        });
    +        self.compile_statements(body)?;
    +        self.emit(Instruction::PopBlock);
    +        self.emit(Instruction::Jump { target: else_label });
    +
    +        // except handlers:
    +        self.set_label(handler_label);
    +        // Exception is on top of stack now
    +        handler_label = self.new_label();
    +        for handler in handlers {
    +            // If we gave a typ,
    +            // check if this handler can handle the exception:
    +            if let Some(exc_type) = &handler.typ {
    +                // Duplicate exception for test:
    +                self.emit(Instruction::Duplicate);
    +
    +                // Check exception type:
    +                self.emit(Instruction::LoadName {
    +                    name: String::from("isinstance"),
    +                });
    +                self.emit(Instruction::Rotate { amount: 2 });
    +                self.compile_expression(exc_type)?;
    +                self.emit(Instruction::CallFunction {
    +                    typ: CallType::Positional(2),
    +                });
    +
    +                // We cannot handle this exception type:
    +                self.emit(Instruction::JumpIfFalse {
    +                    target: handler_label,
    +                });
    +
    +                // We have a match, store in name (except x as y)
    +                if let Some(alias) = &handler.name {
    +                    self.emit(Instruction::StoreName {
    +                        name: alias.clone(),
    +                    });
    +                } else {
    +                    // Drop exception from top of stack:
    +                    self.emit(Instruction::Pop);
    +                }
    +            } else {
    +                // Catch all!
    +                // Drop exception from top of stack:
    +                self.emit(Instruction::Pop);
    +            }
    +
    +            // Handler code:
    +            self.compile_statements(&handler.body)?;
    +            self.emit(Instruction::Jump {
    +                target: finally_label,
    +            });
    +
    +            // Emit a new label for the next handler
    +            self.set_label(handler_label);
    +            handler_label = self.new_label();
    +        }
    +        self.emit(Instruction::Jump {
    +            target: handler_label,
    +        });
    +        self.set_label(handler_label);
    +        // If code flows here, we have an unhandled exception,
    +        // emit finally code and raise again!
    +        // Duplicate finally code here:
    +        // TODO: this bytecode is now duplicate, could this be
    +        // improved?
    +        if let Some(statements) = finalbody {
    +            self.compile_statements(statements)?;
    +        }
    +        self.emit(Instruction::Raise { argc: 1 });
    +
    +        // We successfully ran the try block:
    +        // else:
    +        self.set_label(else_label);
    +        if let Some(statements) = orelse {
    +            self.compile_statements(statements)?;
    +        }
    +
    +        // finally:
    +        self.set_label(finally_label);
    +        if let Some(statements) = finalbody {
    +            self.compile_statements(statements)?;
    +        }
    +
    +        // unimplemented!();
    +        Ok(())
    +    }
    +
    +    fn compile_function_def(
    +        &mut self,
    +        name: &str,
    +        args: &ast::Parameters,
    +        body: &[ast::LocatedStatement],
    +        decorator_list: &[ast::Expression],
    +        returns: &Option<ast::Expression>, // TODO: use type hint somehow..
    +    ) -> Result<(), CompileError> {
    +        // Create bytecode for this function:
    +        // remember to restore self.in_loop to the original after the function is compiled
    +        let was_in_loop = self.in_loop;
    +        let was_in_function_def = self.in_function_def;
    +        self.in_loop = false;
    +        self.in_function_def = true;
    +        let mut flags = self.enter_function(name, args)?;
    +        self.compile_statements(body)?;
    +
    +        // Emit None at end:
    +        self.emit(Instruction::LoadConst {
    +            value: bytecode::Constant::None,
    +        });
    +        self.emit(Instruction::ReturnValue);
    +        let code = self.pop_code_object();
    +
    +        self.prepare_decorators(decorator_list)?;
    +
    +        // Prepare type annotations:
    +        let mut num_annotations = 0;
    +
    +        // Return annotation:
    +        if let Some(annotation) = returns {
    +            // key:
    +            self.emit(Instruction::LoadConst {
    +                value: bytecode::Constant::String {
    +                    value: "return".to_string(),
    +                },
    +            });
    +            // value:
    +            self.compile_expression(annotation)?;
    +            num_annotations += 1;
    +        }
    +
    +        for arg in args.args.iter() {
    +            if let Some(annotation) = &arg.annotation {
    +                self.emit(Instruction::LoadConst {
    +                    value: bytecode::Constant::String {
    +                        value: arg.arg.to_string(),
    +                    },
    +                });
    +                self.compile_expression(&annotation)?;
    +                num_annotations += 1;
    +            }
    +        }
    +
    +        if num_annotations > 0 {
    +            flags |= bytecode::FunctionOpArg::HAS_ANNOTATIONS;
    +            self.emit(Instruction::BuildMap {
    +                size: num_annotations,
    +                unpack: false,
    +            });
    +        }
    +
    +        self.emit(Instruction::LoadConst {
    +            value: bytecode::Constant::Code {
    +                code: Box::new(code),
    +            },
    +        });
    +        self.emit(Instruction::LoadConst {
    +            value: bytecode::Constant::String {
    +                value: name.to_string(),
    +            },
    +        });
    +
    +        // Turn code object into function object:
    +        self.emit(Instruction::MakeFunction { flags });
    +        self.apply_decorators(decorator_list);
    +
    +        self.emit(Instruction::StoreName {
    +            name: name.to_string(),
    +        });
    +        self.in_loop = was_in_loop;
    +        self.in_function_def = was_in_function_def;
    +        Ok(())
    +    }
    +
    +    fn compile_class_def(
    +        &mut self,
    +        name: &str,
    +        body: &[ast::LocatedStatement],
    +        bases: &[ast::Expression],
    +        keywords: &[ast::Keyword],
    +        decorator_list: &[ast::Expression],
    +    ) -> Result<(), CompileError> {
    +        let was_in_loop = self.in_loop;
    +        self.in_loop = false;
    +        self.prepare_decorators(decorator_list)?;
    +        self.emit(Instruction::LoadBuildClass);
    +        let line_number = self.get_source_line_number();
    +        self.code_object_stack.push(CodeObject::new(
    +            vec![],
    +            Varargs::None,
    +            vec![],
    +            Varargs::None,
    +            self.source_path.clone().unwrap(),
    +            line_number,
    +            name.to_string(),
    +        ));
    +        self.compile_statements(body)?;
    +        self.emit(Instruction::LoadConst {
    +            value: bytecode::Constant::None,
    +        });
    +        self.emit(Instruction::ReturnValue);
    +
    +        let code = self.pop_code_object();
    +        self.emit(Instruction::LoadConst {
    +            value: bytecode::Constant::Code {
    +                code: Box::new(code),
    +            },
    +        });
    +        self.emit(Instruction::LoadConst {
    +            value: bytecode::Constant::String {
    +                value: name.to_string(),
    +            },
    +        });
    +
    +        // Turn code object into function object:
    +        self.emit(Instruction::MakeFunction {
    +            flags: bytecode::FunctionOpArg::empty(),
    +        });
    +
    +        self.emit(Instruction::LoadConst {
    +            value: bytecode::Constant::String {
    +                value: name.to_string(),
    +            },
    +        });
    +
    +        for base in bases {
    +            self.compile_expression(base)?;
    +        }
    +
    +        if !keywords.is_empty() {
    +            let mut kwarg_names = vec![];
    +            for keyword in keywords {
    +                if let Some(name) = &keyword.name {
    +                    kwarg_names.push(bytecode::Constant::String {
    +                        value: name.to_string(),
    +                    });
    +                } else {
    +                    // This means **kwargs!
    +                    panic!("name must be set");
    +                }
    +                self.compile_expression(&keyword.value)?;
    +            }
    +
    +            self.emit(Instruction::LoadConst {
    +                value: bytecode::Constant::Tuple {
    +                    elements: kwarg_names,
    +                },
    +            });
    +            self.emit(Instruction::CallFunction {
    +                typ: CallType::Keyword(2 + keywords.len() + bases.len()),
    +            });
    +        } else {
    +            self.emit(Instruction::CallFunction {
    +                typ: CallType::Positional(2 + bases.len()),
    +            });
    +        }
    +
    +        self.apply_decorators(decorator_list);
    +
    +        self.emit(Instruction::StoreName {
    +            name: name.to_string(),
    +        });
    +        self.in_loop = was_in_loop;
    +        Ok(())
    +    }
    +
    +    fn compile_for(
    +        &mut self,
    +        target: &ast::Expression,
    +        iter: &[ast::Expression],
    +        body: &[ast::LocatedStatement],
    +        orelse: &Option<Vec<ast::LocatedStatement>>,
    +    ) -> Result<(), CompileError> {
    +        // Start loop
    +        let start_label = self.new_label();
    +        let else_label = self.new_label();
    +        let end_label = self.new_label();
    +        self.emit(Instruction::SetupLoop {
    +            start: start_label,
    +            end: end_label,
    +        });
    +
    +        // The thing iterated:
    +        for i in iter {
    +            self.compile_expression(i)?;
    +        }
    +
    +        // Retrieve Iterator
    +        self.emit(Instruction::GetIter);
    +
    +        self.set_label(start_label);
    +        self.emit(Instruction::ForIter { target: else_label });
    +
    +        // Start of loop iteration, set targets:
    +        self.compile_store(target)?;
    +
    +        let was_in_loop = self.in_loop;
    +        self.in_loop = true;
    +        self.compile_statements(body)?;
    +        self.in_loop = was_in_loop;
    +
    +        self.emit(Instruction::Jump {
    +            target: start_label,
    +        });
    +        self.set_label(else_label);
    +        self.emit(Instruction::PopBlock);
    +        if let Some(orelse) = orelse {
    +            self.compile_statements(orelse)?;
    +        }
    +        self.set_label(end_label);
    +        Ok(())
    +    }
    +
         fn compile_store(&mut self, target: &ast::Expression) -> Result<(), CompileError> {
             match target {
                 ast::Expression::Identifier { name } => {
    @@ -2468,6 +2668,9 @@
                     self.emit(Instruction::BuildSlice { size });
                 }
                 ast::Expression::Yield { value } => {
    +                if !self.in_function_def {
    +                    return Err(CompileError::InvalidYield);
    +                }
                     self.mark_generator();
                     match value {
                         Some(expression) => self.compile_expression(expression)?,
    @@ -2501,6 +2704,11 @@
                         value: bytecode::Constant::None,
                     });
                 }
    +            ast::Expression::Ellipsis => {
    +                self.emit(Instruction::LoadConst {
    +                    value: bytecode::Constant::Ellipsis,
    +                });
    +            }
                 ast::Expression::String { value } => {
                     self.compile_string(value)?;
                 }
    @@ -2518,12 +2726,15 @@
                 }
                 ast::Expression::Lambda { args, body } => {
                     let name = "<lambda>".to_string();
    +                // no need to worry about the self.loop_depth because there are no loops in lambda expressions
                     let flags = self.enter_function(&name, args)?;
                     self.compile_expression(body)?;
                     self.emit(Instruction::ReturnValue);
                     let code = self.pop_code_object();
                     self.emit(Instruction::LoadConst {
    -                    value: bytecode::Constant::Code { code },
    +                    value: bytecode::Constant::Code {
    +                        code: Box::new(code),
    +                    },
                     });
                     self.emit(Instruction::LoadConst {
                         value: bytecode::Constant::String { value: name },
    @@ -2690,9 +2901,9 @@
             // Create magnificent function <listcomp>:
             self.code_object_stack.push(CodeObject::new(
                 vec![".0".to_string()],
    -            None,
    +            Varargs::None,
                 vec![],
    -            None,
    +            Varargs::None,
                 self.source_path.clone().unwrap(),
                 line_number,
                 name.clone(),
    @@ -2808,7 +3019,9 @@
     
             // List comprehension code:
             self.emit(Instruction::LoadConst {
    -            value: bytecode::Constant::Code { code },
    +            value: bytecode::Constant::Code {
    +                code: Box::new(code),
    +            },
             });
     
             // List comprehension function name:
    @@ -2849,9 +3062,16 @@
                         },
                     });
                 }
    -            ast::StringGroup::FormattedValue { value, spec } => {
    +            ast::StringGroup::FormattedValue {
    +                value,
    +                conversion,
    +                spec,
    +            } => {
                     self.compile_expression(value)?;
    -                self.emit(Instruction::FormatValue { spec: spec.clone() });
    +                self.emit(Instruction::FormatValue {
    +                    conversion: *conversion,
    +                    spec: spec.clone(),
    +                });
                 }
             }
             Ok(())
    @@ -2859,10 +3079,11 @@
     
         // Low level helper functions:
         fn emit(&mut self, instruction: Instruction) {
    -        self.current_code_object().instructions.push(instruction);
    -        // TODO: insert source filename
             let location = self.current_source_location.clone();
    -        self.current_code_object().locations.push(location);
    +        let cur_code_obj = self.current_code_object();
    +        cur_code_obj.instructions.push(instruction);
    +        cur_code_obj.locations.push(location);
    +        // TODO: insert source filename
         }
     
         fn current_code_object(&mut self) -> &mut CodeObject {
    @@ -2903,6 +3124,7 @@
         use crate::bytecode::Constant::*;
         use crate::bytecode::Instruction::*;
         use rustpython_parser::parser;
    +
         fn compile_exec(source: &str) -> CodeObject {
             let mut compiler = Compiler::new();
             compiler.source_path = Some("source_path".to_string());
    @@ -2992,4 +3214,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/error.rs.html b/src/rustpython_vm/error.rs.html index 5adefc9..649309e 100644 --- a/src/rustpython_vm/error.rs.html +++ b/src/rustpython_vm/error.rs.html @@ -1,4 +1,4 @@ -error.rs.html -- source
     1
    +error.rs.html -- source
     1
      2
      3
      4
    @@ -40,6 +40,10 @@
     40
     41
     42
    +43
    +44
    +45
    +46
     
     use rustpython_parser::error::ParseError;
     
    @@ -62,6 +66,8 @@
         InvalidBreak,
         /// Continue statement outside of loop.
         InvalidContinue,
    +    InvalidReturn,
    +    InvalidYield,
     }
     
     impl fmt::Display for CompileError {
    @@ -72,8 +78,10 @@
                 CompileError::ExpectExpr => write!(f, "Expecting expression, got statement"),
                 CompileError::Parse(err) => write!(f, "{}", err),
                 CompileError::StarArgs => write!(f, "Two starred expressions in assignment"),
    -            CompileError::InvalidBreak => write!(f, "break outside loop"),
    -            CompileError::InvalidContinue => write!(f, "continue outside loop"),
    +            CompileError::InvalidBreak => write!(f, "'break' outside loop"),
    +            CompileError::InvalidContinue => write!(f, "'continue' outside loop"),
    +            CompileError::InvalidReturn => write!(f, "'return' outside function"),
    +            CompileError::InvalidYield => write!(f, "'yield' outside function"),
             }
         }
     }
    @@ -84,4 +92,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/eval.rs.html b/src/rustpython_vm/eval.rs.html index d41c682..ca94c09 100644 --- a/src/rustpython_vm/eval.rs.html +++ b/src/rustpython_vm/eval.rs.html @@ -1,4 +1,4 @@ -eval.rs.html -- source
     1
    +eval.rs.html -- source
     1
      2
      3
      4
    @@ -43,25 +43,17 @@
     43
     44
     45
    -46
    -47
    -48
    -49
     
     extern crate rustpython_parser;
     
     use std::error::Error;
     
     use crate::compile;
    -use crate::pyobject::{PyObjectRef, PyResult};
    +use crate::frame::Scope;
    +use crate::pyobject::PyResult;
     use crate::vm::VirtualMachine;
     
    -pub fn eval(
    -    vm: &mut VirtualMachine,
    -    source: &str,
    -    scope: PyObjectRef,
    -    source_path: &str,
    -) -> PyResult {
    +pub fn eval(vm: &VirtualMachine, source: &str, scope: Scope, source_path: &str) -> PyResult {
         match compile::compile(
             source,
             &compile::Mode::Eval,
    @@ -88,7 +80,7 @@
         fn test_print_42() {
             let source = String::from("print('Hello world')\n");
             let mut vm = VirtualMachine::new();
    -        let vars = vm.context().new_scope(None);
    +        let vars = vm.ctx.new_scope();
             let _result = eval(&mut vm, &source, vars, "<unittest>");
     
             // TODO: check result?
    @@ -98,4 +90,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/exceptions.rs.html b/src/rustpython_vm/exceptions.rs.html index 05ad10c..3ed3102 100644 --- a/src/rustpython_vm/exceptions.rs.html +++ b/src/rustpython_vm/exceptions.rs.html @@ -1,4 +1,4 @@ -exceptions.rs.html -- source
      1
    +exceptions.rs.html -- source
      1
       2
       3
       4
    @@ -170,45 +170,14 @@
     170
     171
     172
    -173
    -174
    -175
    -176
    -177
    -178
    -179
    -180
    -181
    -182
    -183
    -184
    -185
    -186
    -187
    -188
    -189
    -190
    -191
    -192
    -193
    -194
    -195
    -196
    -197
    -198
    -199
    -200
    -201
     
    +use crate::function::PyFuncArgs;
     use crate::obj::objsequence;
    -use crate::obj::objstr;
     use crate::obj::objtype;
    -use crate::pyobject::{
    -    create_type, AttributeProtocol, PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol,
    -};
    +use crate::pyobject::{create_type, PyContext, PyObjectRef, PyResult, TypeProtocol};
     use crate::vm::VirtualMachine;
     
    -fn exception_init(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn exception_init(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         let zelf = args.args[0].clone();
         let msg = if args.args.len() > 1 {
             args.args[1].clone()
    @@ -222,8 +191,8 @@
     }
     
     // Print exception including traceback:
    -pub fn print_exception(vm: &mut VirtualMachine, exc: &PyObjectRef) {
    -    if let Some(tb) = exc.get_attr("__traceback__") {
    +pub fn print_exception(vm: &VirtualMachine, exc: &PyObjectRef) {
    +    if let Ok(tb) = vm.get_attribute(exc.clone(), "__traceback__") {
             println!("Traceback (most recent call last):");
             if objtype::isinstance(&tb, &vm.ctx.list_type()) {
                 let mut elements = objsequence::get_elements(&tb).to_vec();
    @@ -232,19 +201,19 @@
                     if objtype::isinstance(&element, &vm.ctx.tuple_type()) {
                         let element = objsequence::get_elements(&element);
                         let filename = if let Ok(x) = vm.to_str(&element[0]) {
    -                        objstr::get_value(&x)
    +                        x.value.clone()
                         } else {
                             "<error>".to_string()
                         };
     
                         let lineno = if let Ok(x) = vm.to_str(&element[1]) {
    -                        objstr::get_value(&x)
    +                        x.value.clone()
                         } else {
                             "<error>".to_string()
                         };
     
                         let obj_name = if let Ok(x) = vm.to_str(&element[2]) {
    -                        objstr::get_value(&x)
    +                        x.value.clone()
                         } else {
                             "<error>".to_string()
                         };
    @@ -260,19 +229,19 @@
         }
     
         match vm.to_str(exc) {
    -        Ok(txt) => println!("{}", objstr::get_value(&txt)),
    +        Ok(txt) => println!("{}", txt.value),
             Err(err) => println!("Error during error {:?}", err),
         }
     }
     
    -fn exception_str(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn exception_str(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
             required = [(exc, Some(vm.ctx.exceptions.exception_type.clone()))]
         );
         let type_name = objtype::get_type_name(&exc.typ());
    -    let msg = if let Some(m) = exc.get_attr("msg") {
    +    let msg = if let Ok(m) = vm.get_attribute(exc.clone(), "msg") {
             match vm.to_pystr(&m) {
                 Ok(msg) => msg,
                 _ => "<exception str() failed>".to_string(),
    @@ -310,56 +279,29 @@
     }
     
     impl ExceptionZoo {
    -    pub fn new(
    -        type_type: &PyObjectRef,
    -        object_type: &PyObjectRef,
    -        dict_type: &PyObjectRef,
    -    ) -> Self {
    +    pub fn new(type_type: &PyObjectRef, object_type: &PyObjectRef) -> Self {
             // Sorted By Hierarchy then alphabetized.
    -        let base_exception_type =
    -            create_type("BaseException", &type_type, &object_type, &dict_type);
    -
    -        let exception_type = create_type("Exception", &type_type, &base_exception_type, &dict_type);
    -
    -        let arithmetic_error =
    -            create_type("ArithmeticError", &type_type, &exception_type, &dict_type);
    -        let assertion_error =
    -            create_type("AssertionError", &type_type, &exception_type, &dict_type);
    -        let attribute_error =
    -            create_type("AttributeError", &type_type, &exception_type, &dict_type);
    -        let import_error = create_type("ImportError", &type_type, &exception_type, &dict_type);
    -        let index_error = create_type("IndexError", &type_type, &exception_type, &dict_type);
    -        let key_error = create_type("KeyError", &type_type, &exception_type, &dict_type);
    -        let name_error = create_type("NameError", &type_type, &exception_type, &dict_type);
    -        let os_error = create_type("OSError", &type_type, &exception_type, &dict_type);
    -        let runtime_error = create_type("RuntimeError", &type_type, &exception_type, &dict_type);
    -        let stop_iteration = create_type("StopIteration", &type_type, &exception_type, &dict_type);
    -        let syntax_error = create_type("SyntaxError", &type_type, &exception_type, &dict_type);
    -        let type_error = create_type("TypeError", &type_type, &exception_type, &dict_type);
    -        let value_error = create_type("ValueError", &type_type, &exception_type, &dict_type);
    -
    -        let overflow_error =
    -            create_type("OverflowError", &type_type, &arithmetic_error, &dict_type);
    -        let zero_division_error = create_type(
    -            "ZeroDivisionError",
    -            &type_type,
    -            &arithmetic_error,
    -            &dict_type,
    -        );
    -
    -        let module_not_found_error =
    -            create_type("ModuleNotFoundError", &type_type, &import_error, &dict_type);
    -
    -        let not_implemented_error = create_type(
    -            "NotImplementedError",
    -            &type_type,
    -            &runtime_error,
    -            &dict_type,
    -        );
    -
    -        let file_not_found_error =
    -            create_type("FileNotFoundError", &type_type, &os_error, &dict_type);
    -        let permission_error = create_type("PermissionError", &type_type, &os_error, &dict_type);
    +        let base_exception_type = create_type("BaseException", &type_type, &object_type);
    +        let exception_type = create_type("Exception", &type_type, &base_exception_type);
    +        let arithmetic_error = create_type("ArithmeticError", &type_type, &exception_type);
    +        let assertion_error = create_type("AssertionError", &type_type, &exception_type);
    +        let attribute_error = create_type("AttributeError", &type_type, &exception_type);
    +        let import_error = create_type("ImportError", &type_type, &exception_type);
    +        let index_error = create_type("IndexError", &type_type, &exception_type);
    +        let key_error = create_type("KeyError", &type_type, &exception_type);
    +        let name_error = create_type("NameError", &type_type, &exception_type);
    +        let os_error = create_type("OSError", &type_type, &exception_type);
    +        let runtime_error = create_type("RuntimeError", &type_type, &exception_type);
    +        let stop_iteration = create_type("StopIteration", &type_type, &exception_type);
    +        let syntax_error = create_type("SyntaxError", &type_type, &exception_type);
    +        let type_error = create_type("TypeError", &type_type, &exception_type);
    +        let value_error = create_type("ValueError", &type_type, &exception_type);
    +        let overflow_error = create_type("OverflowError", &type_type, &arithmetic_error);
    +        let zero_division_error = create_type("ZeroDivisionError", &type_type, &arithmetic_error);
    +        let module_not_found_error = create_type("ModuleNotFoundError", &type_type, &import_error);
    +        let not_implemented_error = create_type("NotImplementedError", &type_type, &runtime_error);
    +        let file_not_found_error = create_type("FileNotFoundError", &type_type, &os_error);
    +        let permission_error = create_type("PermissionError", &type_type, &os_error);
     
             ExceptionZoo {
                 arithmetic_error,
    @@ -402,4 +344,4 @@
         );
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/format.rs.html b/src/rustpython_vm/format.rs.html index e5129e0..6925a75 100644 --- a/src/rustpython_vm/format.rs.html +++ b/src/rustpython_vm/format.rs.html @@ -1,4 +1,4 @@ -format.rs.html -- source
      1
    +format.rs.html -- source
      1
       2
       3
       4
    @@ -1324,4 +1324,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/frame.rs.html b/src/rustpython_vm/frame.rs.html index 08ee656..3eea3d1 100644 --- a/src/rustpython_vm/frame.rs.html +++ b/src/rustpython_vm/frame.rs.html @@ -1,4 +1,4 @@ -frame.rs.html -- source
       1
    +frame.rs.html -- source
       1
        2
        3
        4
    @@ -1152,30 +1152,254 @@
     1152
     1153
     1154
    +1155
    +1156
    +1157
    +1158
    +1159
    +1160
    +1161
    +1162
    +1163
    +1164
    +1165
    +1166
    +1167
    +1168
    +1169
    +1170
    +1171
    +1172
    +1173
    +1174
    +1175
    +1176
    +1177
    +1178
    +1179
    +1180
    +1181
    +1182
    +1183
    +1184
    +1185
    +1186
    +1187
    +1188
    +1189
    +1190
    +1191
    +1192
    +1193
    +1194
    +1195
    +1196
    +1197
    +1198
    +1199
    +1200
    +1201
    +1202
    +1203
    +1204
    +1205
    +1206
    +1207
    +1208
    +1209
    +1210
    +1211
    +1212
    +1213
    +1214
    +1215
    +1216
    +1217
    +1218
    +1219
    +1220
    +1221
    +1222
    +1223
    +1224
    +1225
    +1226
    +1227
    +1228
    +1229
    +1230
    +1231
    +1232
    +1233
    +1234
    +1235
    +1236
    +1237
    +1238
     
    -extern crate rustpython_parser;
    -
    -use self::rustpython_parser::ast;
    +use std::cell::RefCell;
     use std::fmt;
    -use std::mem;
    -use std::path::PathBuf;
    +use std::rc::Rc;
    +
    +use num_bigint::BigInt;
    +
    +use rustpython_parser::ast;
     
     use crate::builtins;
     use crate::bytecode;
    -use crate::import::{import, import_module};
    +use crate::function::PyFuncArgs;
     use crate::obj::objbool;
    +use crate::obj::objbuiltinfunc::PyBuiltinFunction;
     use crate::obj::objcode;
     use crate::obj::objdict;
    +use crate::obj::objdict::PyDict;
    +use crate::obj::objint::PyInt;
     use crate::obj::objiter;
     use crate::obj::objlist;
    +use crate::obj::objslice::PySlice;
     use crate::obj::objstr;
     use crate::obj::objtype;
     use crate::pyobject::{
    -    DictProtocol, IdProtocol, ParentProtocol, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef,
    -    PyResult, TypeProtocol,
    +    DictProtocol, IdProtocol, PyContext, PyObjectRef, PyResult, PyValue, TryFromObject,
    +    TypeProtocol,
     };
     use crate::vm::VirtualMachine;
    -use num_bigint::BigInt;
    +
    +/*
    + * So a scope is a linked list of scopes.
    + * When a name is looked up, it is check in its scope.
    + */
    +#[derive(Debug)]
    +struct RcListNode<T> {
    +    elem: T,
    +    next: Option<Rc<RcListNode<T>>>,
    +}
    +
    +#[derive(Debug, Clone)]
    +struct RcList<T> {
    +    head: Option<Rc<RcListNode<T>>>,
    +}
    +
    +struct Iter<'a, T: 'a> {
    +    next: Option<&'a RcListNode<T>>,
    +}
    +
    +impl<T> RcList<T> {
    +    pub fn new() -> Self {
    +        RcList { head: None }
    +    }
    +
    +    pub fn insert(self, elem: T) -> Self {
    +        RcList {
    +            head: Some(Rc::new(RcListNode {
    +                elem,
    +                next: self.head,
    +            })),
    +        }
    +    }
    +
    +    pub fn iter(&self) -> Iter<T> {
    +        Iter {
    +            next: self.head.as_ref().map(|node| &**node),
    +        }
    +    }
    +}
    +
    +impl<'a, T> Iterator for Iter<'a, T> {
    +    type Item = &'a T;
    +
    +    fn next(&mut self) -> Option<Self::Item> {
    +        self.next.map(|node| {
    +            self.next = node.next.as_ref().map(|node| &**node);
    +            &node.elem
    +        })
    +    }
    +}
    +
    +#[derive(Clone)]
    +pub struct Scope {
    +    locals: RcList<PyObjectRef>,
    +    pub globals: PyObjectRef,
    +}
    +
    +impl fmt::Debug for Scope {
    +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    +        // TODO: have a more informative Debug impl that DOESN'T recurse and cause a stack overflow
    +        f.write_str("Scope")
    +    }
    +}
    +
    +impl Scope {
    +    pub fn new(locals: Option<PyObjectRef>, globals: PyObjectRef) -> Scope {
    +        let locals = match locals {
    +            Some(dict) => RcList::new().insert(dict),
    +            None => RcList::new(),
    +        };
    +        Scope { locals, globals }
    +    }
    +
    +    pub fn get_locals(&self) -> PyObjectRef {
    +        match self.locals.iter().next() {
    +            Some(dict) => dict.clone(),
    +            None => self.globals.clone(),
    +        }
    +    }
    +
    +    pub fn get_only_locals(&self) -> Option<PyObjectRef> {
    +        self.locals.iter().next().cloned()
    +    }
    +
    +    pub fn child_scope_with_locals(&self, locals: PyObjectRef) -> Scope {
    +        Scope {
    +            locals: self.locals.clone().insert(locals),
    +            globals: self.globals.clone(),
    +        }
    +    }
    +
    +    pub fn child_scope(&self, ctx: &PyContext) -> Scope {
    +        self.child_scope_with_locals(ctx.new_dict())
    +    }
    +}
    +
    +pub trait NameProtocol {
    +    fn load_name(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>;
    +    fn store_name(&self, vm: &VirtualMachine, name: &str, value: PyObjectRef);
    +    fn delete_name(&self, vm: &VirtualMachine, name: &str);
    +    fn load_cell(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>;
    +}
    +
    +impl NameProtocol for Scope {
    +    fn load_name(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef> {
    +        for dict in self.locals.iter() {
    +            if let Some(value) = dict.get_item(name) {
    +                return Some(value);
    +            }
    +        }
    +
    +        if let Some(value) = self.globals.get_item(name) {
    +            return Some(value);
    +        }
    +
    +        vm.builtins.get_item(name)
    +    }
    +
    +    fn load_cell(&self, _vm: &VirtualMachine, name: &str) -> Option<PyObjectRef> {
    +        for dict in self.locals.iter().skip(1) {
    +            if let Some(value) = dict.get_item(name) {
    +                return Some(value);
    +            }
    +        }
    +        None
    +    }
    +
    +    fn store_name(&self, vm: &VirtualMachine, key: &str, value: PyObjectRef) {
    +        self.get_locals().set_item(&vm.ctx, key, value)
    +    }
    +
    +    fn delete_name(&self, _vm: &VirtualMachine, key: &str) {
    +        self.get_locals().del_item(key)
    +    }
    +}
     
     #[derive(Clone, Debug)]
     struct Block {
    @@ -1200,14 +1424,19 @@
         },
     }
     
    -#[derive(Clone)]
     pub struct Frame {
         pub code: bytecode::CodeObject,
         // We need 1 stack per frame
    -    stack: Vec<PyObjectRef>, // The main data frame of the stack machine
    -    blocks: Vec<Block>,      // Block frames, for controlling loops and exceptions
    -    pub locals: PyObjectRef, // Variables
    -    pub lasti: usize,        // index of last instruction ran
    +    stack: RefCell<Vec<PyObjectRef>>, // The main data frame of the stack machine
    +    blocks: RefCell<Vec<Block>>,      // Block frames, for controlling loops and exceptions
    +    pub scope: Scope,                 // Variables
    +    pub lasti: RefCell<usize>,        // index of last instruction ran
    +}
    +
    +impl PyValue for Frame {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.frame_type()
    +    }
     }
     
     // Running a frame can result in one of the below:
    @@ -1220,7 +1449,7 @@
     pub type FrameResult = Result<Option<ExecutionResult>, PyObjectRef>;
     
     impl Frame {
    -    pub fn new(code: PyObjectRef, globals: PyObjectRef) -> Frame {
    +    pub fn new(code: PyObjectRef, scope: Scope) -> Frame {
             //populate the globals and locals
             //TODO: This is wrong, check https://github.com/nedbat/byterun/blob/31e6c4a8212c35b5157919abff43a7daa0f377c6/byterun/pyvm2.py#L95
             /*
    @@ -1229,37 +1458,28 @@
                 None => HashMap::new(),
             };
             */
    -        let locals = globals;
    +        // let locals = globals;
             // locals.extend(callargs);
     
             Frame {
                 code: objcode::get_value(&code),
    -            stack: vec![],
    -            blocks: vec![],
    +            stack: RefCell::new(vec![]),
    +            blocks: RefCell::new(vec![]),
                 // save the callargs as locals
                 // globals: locals.clone(),
    -            locals,
    -            lasti: 0,
    -        }
    -    }
    -
    -    pub fn run_frame_full(&mut self, vm: &mut VirtualMachine) -> PyResult {
    -        match self.run_frame(vm)? {
    -            ExecutionResult::Return(value) => Ok(value),
    -            _ => panic!("Got unexpected result from function"),
    +            scope,
    +            lasti: RefCell::new(0),
             }
         }
     
    -    pub fn run_frame(&mut self, vm: &mut VirtualMachine) -> Result<ExecutionResult, PyObjectRef> {
    +    pub fn run(&self, vm: &VirtualMachine) -> Result<ExecutionResult, PyObjectRef> {
             let filename = &self.code.source_path.to_string();
     
    -        let prev_frame = mem::replace(&mut vm.current_frame, Some(vm.ctx.new_frame(self.clone())));
    -
             // This is the name of the object being run:
             let run_obj_name = &self.code.obj_name.to_string();
     
             // Execute until return or exception:
    -        let value = loop {
    +        loop {
                 let lineno = self.get_lineno();
                 let result = self.execute_instruction(vm);
                 match result {
    @@ -1274,22 +1494,16 @@
                             &exception,
                             &vm.ctx.exceptions.base_exception_type
                         ));
    -                    let traceback_name = vm.new_str("__traceback__".to_string());
    -                    let traceback = vm.get_attribute(exception.clone(), traceback_name).unwrap();
    +                    let traceback = vm
    +                        .get_attribute(exception.clone(), "__traceback__")
    +                        .unwrap();
                         trace!("Adding to traceback: {:?} {:?}", traceback, lineno);
                         let pos = vm.ctx.new_tuple(vec![
                             vm.ctx.new_str(filename.clone()),
                             vm.ctx.new_int(lineno.get_row()),
                             vm.ctx.new_str(run_obj_name.clone()),
                         ]);
    -                    objlist::list_append(
    -                        vm,
    -                        PyFuncArgs {
    -                            args: vec![traceback, pos],
    -                            kwargs: vec![],
    -                        },
    -                    )
    -                    .unwrap();
    +                    objlist::PyListRef::try_from_object(vm, traceback)?.append(pos, vm);
                         // exception.__trace
                         match self.unwind_exception(vm, exception) {
                             None => {}
    @@ -1301,22 +1515,17 @@
                         }
                     }
                 }
    -        };
    -
    -        vm.current_frame = prev_frame;
    -        value
    +        }
         }
     
    -    pub fn fetch_instruction(&mut self) -> bytecode::Instruction {
    -        // TODO: an immutable reference is enough, we should not
    -        // clone the instruction.
    -        let ins2 = self.code.instructions[self.lasti].clone();
    -        self.lasti += 1;
    +    pub fn fetch_instruction(&self) -> &bytecode::Instruction {
    +        let ins2 = &self.code.instructions[*self.lasti.borrow()];
    +        *self.lasti.borrow_mut() += 1;
             ins2
         }
     
         // Execute a single instruction:
    -    fn execute_instruction(&mut self, vm: &mut VirtualMachine) -> FrameResult {
    +    fn execute_instruction(&self, vm: &VirtualMachine) -> FrameResult {
             let instruction = self.fetch_instruction();
             {
                 trace!("=======");
    @@ -1436,10 +1645,14 @@
     
                     let mut out: Vec<Option<BigInt>> = elements
                         .into_iter()
    -                    .map(|x| match x.borrow().payload {
    -                        PyObjectPayload::Integer { ref value } => Some(value.clone()),
    -                        PyObjectPayload::None => None,
    -                        _ => panic!("Expect Int or None as BUILD_SLICE arguments, got {:?}", x),
    +                    .map(|x| {
    +                        if x.is(&vm.ctx.none()) {
    +                            None
    +                        } else if let Some(i) = x.payload::<PyInt>() {
    +                            Some(i.value.clone())
    +                        } else {
    +                            panic!("Expect Int or None as BUILD_SLICE arguments")
    +                        }
                         })
                         .collect();
     
    @@ -1447,23 +1660,14 @@
                     let stop = out[1].take();
                     let step = if out.len() == 3 { out[2].take() } else { None };
     
    -                let obj = PyObject::new(
    -                    PyObjectPayload::Slice { start, stop, step },
    -                    vm.ctx.slice_type(),
    -                );
    -                self.push_value(obj);
    +                let obj = PySlice { start, stop, step }.into_ref(vm);
    +                self.push_value(obj.into_object());
                     Ok(None)
                 }
                 bytecode::Instruction::ListAppend { i } => {
                     let list_obj = self.nth_value(*i);
                     let item = self.pop_value();
    -                objlist::list_append(
    -                    vm,
    -                    PyFuncArgs {
    -                        args: vec![list_obj.clone(), item],
    -                        kwargs: vec![],
    -                    },
    -                )?;
    +                objlist::PyListRef::try_from_object(vm, list_obj)?.append(item, vm);
                     Ok(None)
                 }
                 bytecode::Instruction::SetAdd { i } => {
    @@ -1509,7 +1713,7 @@
                     match next_obj {
                         Some(value) => {
                             // Set back program counter:
    -                        self.lasti -= 1;
    +                        *self.lasti.borrow_mut() -= 1;
                             Ok(Some(ExecutionResult::Yield(value)))
                         }
                         None => {
    @@ -1597,15 +1801,26 @@
                 bytecode::Instruction::MakeFunction { flags } => {
                     let _qualified_name = self.pop_value();
                     let code_obj = self.pop_value();
    +
    +                let annotations = if flags.contains(bytecode::FunctionOpArg::HAS_ANNOTATIONS) {
    +                    self.pop_value()
    +                } else {
    +                    vm.new_dict()
    +                };
    +
                     let defaults = if flags.contains(bytecode::FunctionOpArg::HAS_DEFAULTS) {
                         self.pop_value()
                     } else {
                         vm.get_none()
                     };
    +
                     // pop argc arguments
                     // argument: name, args, globals
    -                let scope = self.locals.clone();
    +                let scope = self.scope.clone();
                     let obj = vm.ctx.new_function(code_obj, scope, defaults);
    +
    +                vm.ctx.set_attr(&obj, "__annotations__", annotations);
    +
                     self.push_value(obj);
                     Ok(None)
                 }
    @@ -1683,10 +1898,16 @@
                     if objtype::isinstance(&exception, &vm.ctx.exceptions.base_exception_type) {
                         info!("Exception raised: {:?}", exception);
                         Err(exception)
    +                } else if objtype::isinstance(&exception, &vm.ctx.type_type())
    +                    && objtype::issubclass(&exception, &vm.ctx.exceptions.base_exception_type)
    +                {
    +                    let exception = vm.new_empty_exception(exception)?;
    +                    info!("Exception raised: {:?}", exception);
    +                    Err(exception)
                     } else {
                         let msg = format!(
                             "Can only raise BaseException derived types, not {}",
    -                        exception.borrow()
    +                        exception
                         );
                         let type_error_type = vm.ctx.exceptions.type_error.clone();
                         let type_error = vm.new_exception(type_error_type, msg);
    @@ -1719,39 +1940,19 @@
                 }
                 bytecode::Instruction::PrintExpr => {
                     let expr = self.pop_value();
    -                match expr.borrow().payload {
    -                    PyObjectPayload::None => (),
    -                    _ => {
    -                        let repr = vm.to_repr(&expr)?;
    -                        builtins::builtin_print(
    -                            vm,
    -                            PyFuncArgs {
    -                                args: vec![repr],
    -                                kwargs: vec![],
    -                            },
    -                        )?;
    +                if !expr.is(&vm.get_none()) {
    +                    let repr = vm.to_repr(&expr)?;
    +                    // TODO: implement sys.displayhook
    +                    if let Some(print) = vm.ctx.get_attr(&vm.builtins, "print") {
    +                        vm.invoke(print, vec![repr.into_object()])?;
                         }
                     }
                     Ok(None)
                 }
                 bytecode::Instruction::LoadBuildClass => {
    -                let rustfunc = PyObject::new(
    -                    PyObjectPayload::RustFunction {
    -                        function: Box::new(builtins::builtin_build_class_),
    -                    },
    -                    vm.ctx.type_type(),
    -                );
    -                self.push_value(rustfunc);
    -                Ok(None)
    -            }
    -            bytecode::Instruction::StoreLocals => {
    -                let locals = self.pop_value();
    -                match self.locals.borrow_mut().payload {
    -                    PyObjectPayload::Scope { ref mut scope } => {
    -                        scope.locals = locals;
    -                    }
    -                    _ => panic!("We really expect our scope to be a scope!"),
    -                }
    +                let rustfunc =
    +                    PyBuiltinFunction::new(Box::new(builtins::builtin_build_class_)).into_ref(vm);
    +                self.push_value(rustfunc.into_object());
                     Ok(None)
                 }
                 bytecode::Instruction::UnpackSequence { size } => {
    @@ -1809,8 +2010,15 @@
                     }
                     Ok(None)
                 }
    -            bytecode::Instruction::FormatValue { spec } => {
    -                let value = self.pop_value();
    +            bytecode::Instruction::FormatValue { conversion, spec } => {
    +                use ast::ConversionFlag::*;
    +                let value = match conversion {
    +                    Some(Str) => vm.to_str(&self.pop_value())?.into_object(),
    +                    Some(Repr) => vm.to_repr(&self.pop_value())?.into_object(),
    +                    Some(Ascii) => self.pop_value(), // TODO
    +                    None => self.pop_value(),
    +                };
    +
                     let spec = vm.new_str(spec.clone());
                     let formatted = vm.call_method(&value, "__format__", vec![spec])?;
                     self.push_value(formatted);
    @@ -1820,8 +2028,8 @@
         }
     
         fn get_elements(
    -        &mut self,
    -        vm: &mut VirtualMachine,
    +        &self,
    +        vm: &VirtualMachine,
             size: usize,
             unpack: bool,
         ) -> Result<Vec<PyObjectRef>, PyObjectRef> {
    @@ -1840,44 +2048,36 @@
             }
         }
     
    -    fn import(
    -        &mut self,
    -        vm: &mut VirtualMachine,
    -        module: &str,
    -        symbol: &Option<String>,
    -    ) -> FrameResult {
    -        let current_path = {
    -            let mut source_pathbuf = PathBuf::from(&self.code.source_path);
    -            source_pathbuf.pop();
    -            source_pathbuf
    +    fn import(&self, vm: &VirtualMachine, module: &str, symbol: &Option<String>) -> FrameResult {
    +        let module = vm.import(module)?;
    +
    +        // If we're importing a symbol, look it up and use it, otherwise construct a module and return
    +        // that
    +        let obj = match symbol {
    +            Some(symbol) => vm.get_attribute(module, symbol.as_str()).map_err(|_| {
    +                let import_error = vm.context().exceptions.import_error.clone();
    +                vm.new_exception(import_error, format!("cannot import name '{}'", symbol))
    +            }),
    +            None => Ok(module),
             };
     
    -        let obj = import(vm, current_path, module, symbol)?;
    -
             // Push module on stack:
    -        self.push_value(obj);
    +        self.push_value(obj?);
             Ok(None)
         }
     
    -    fn import_star(&mut self, vm: &mut VirtualMachine, module: &str) -> FrameResult {
    -        let current_path = {
    -            let mut source_pathbuf = PathBuf::from(&self.code.source_path);
    -            source_pathbuf.pop();
    -            source_pathbuf
    -        };
    +    fn import_star(&self, vm: &VirtualMachine, module: &str) -> FrameResult {
    +        let module = vm.import(module)?;
     
             // Grab all the names from the module and put them in the context
    -        let obj = import_module(vm, current_path, module)?;
    -
    -        for (k, v) in obj.get_key_value_pairs().iter() {
    -            vm.ctx
    -                .set_attr(&self.locals, &objstr::get_value(k), v.clone());
    +        for (k, v) in module.get_key_value_pairs().iter() {
    +            self.scope.store_name(&vm, &objstr::get_value(k), v.clone());
             }
             Ok(None)
         }
     
         // Unwind all blocks:
    -    fn unwind_blocks(&mut self, vm: &mut VirtualMachine) -> Option<PyObjectRef> {
    +    fn unwind_blocks(&self, vm: &VirtualMachine) -> Option<PyObjectRef> {
             while let Some(block) = self.pop_block() {
                 match block.typ {
                     BlockType::Loop { .. } => {}
    @@ -1901,9 +2101,9 @@
             None
         }
     
    -    fn unwind_loop(&mut self, vm: &mut VirtualMachine) -> Block {
    +    fn unwind_loop(&self, vm: &VirtualMachine) -> Block {
             loop {
    -            let block = self.current_block().cloned().expect("not in a loop");
    +            let block = self.current_block().expect("not in a loop");
                 match block.typ {
                     BlockType::Loop { .. } => break block,
                     BlockType::TryExcept { .. } => {
    @@ -1923,11 +2123,7 @@
             }
         }
     
    -    fn unwind_exception(
    -        &mut self,
    -        vm: &mut VirtualMachine,
    -        exc: PyObjectRef,
    -    ) -> Option<PyObjectRef> {
    +    fn unwind_exception(&self, vm: &VirtualMachine, exc: PyObjectRef) -> Option<PyObjectRef> {
             // unwind block stack on exception and find any handlers:
             while let Some(block) = self.pop_block() {
                 match block.typ {
    @@ -1972,7 +2168,7 @@
     
         fn with_exit(
             &self,
    -        vm: &mut VirtualMachine,
    +        vm: &VirtualMachine,
             context_manager: &PyObjectRef,
             exc: Option<PyObjectRef>,
         ) -> PyResult {
    @@ -1995,48 +2191,37 @@
             vm.call_method(context_manager, "__exit__", args)
         }
     
    -    fn store_name(&mut self, vm: &mut VirtualMachine, name: &str) -> FrameResult {
    +    fn store_name(&self, vm: &VirtualMachine, name: &str) -> FrameResult {
             let obj = self.pop_value();
    -        vm.ctx.set_attr(&self.locals, name, obj);
    +        self.scope.store_name(&vm, name, obj);
             Ok(None)
         }
     
    -    fn delete_name(&mut self, vm: &mut VirtualMachine, name: &str) -> FrameResult {
    -        let locals = match self.locals.borrow().payload {
    -            PyObjectPayload::Scope { ref scope } => scope.locals.clone(),
    -            _ => panic!("We really expect our scope to be a scope!"),
    -        };
    -
    -        // Assume here that locals is a dict
    -        let name = vm.ctx.new_str(name.to_string());
    -        vm.call_method(&locals, "__delitem__", vec![name])?;
    +    fn delete_name(&self, vm: &VirtualMachine, name: &str) -> FrameResult {
    +        self.scope.delete_name(vm, name);
             Ok(None)
         }
     
    -    fn load_name(&mut self, vm: &mut VirtualMachine, name: &str) -> FrameResult {
    -        // Lookup name in scope and put it onto the stack!
    -        let mut scope = self.locals.clone();
    -        loop {
    -            if scope.contains_key(name) {
    -                let obj = scope.get_item(name).unwrap();
    -                self.push_value(obj);
    -                break Ok(None);
    -            } else if scope.has_parent() {
    -                scope = scope.get_parent();
    -            } else {
    +    fn load_name(&self, vm: &VirtualMachine, name: &str) -> FrameResult {
    +        match self.scope.load_name(&vm, name) {
    +            Some(value) => {
    +                self.push_value(value);
    +                Ok(None)
    +            }
    +            None => {
                     let name_error_type = vm.ctx.exceptions.name_error.clone();
                     let msg = format!("name '{}' is not defined", name);
                     let name_error = vm.new_exception(name_error_type, msg);
    -                break Err(name_error);
    +                Err(name_error)
                 }
             }
         }
     
    -    fn subscript(&mut self, vm: &mut VirtualMachine, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    fn subscript(&self, vm: &VirtualMachine, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             vm.call_method(&a, "__getitem__", vec![b])
         }
     
    -    fn execute_store_subscript(&mut self, vm: &mut VirtualMachine) -> FrameResult {
    +    fn execute_store_subscript(&self, vm: &VirtualMachine) -> FrameResult {
             let idx = self.pop_value();
             let obj = self.pop_value();
             let value = self.pop_value();
    @@ -2044,22 +2229,22 @@
             Ok(None)
         }
     
    -    fn execute_delete_subscript(&mut self, vm: &mut VirtualMachine) -> FrameResult {
    +    fn execute_delete_subscript(&self, vm: &VirtualMachine) -> FrameResult {
             let idx = self.pop_value();
             let obj = self.pop_value();
             vm.call_method(&obj, "__delitem__", vec![idx])?;
             Ok(None)
         }
     
    -    fn jump(&mut self, label: bytecode::Label) {
    +    fn jump(&self, label: bytecode::Label) {
             let target_pc = self.code.label_map[&label];
             trace!("program counter from {:?} to {:?}", self.lasti, target_pc);
    -        self.lasti = target_pc;
    +        *self.lasti.borrow_mut() = target_pc;
         }
     
         fn execute_binop(
    -        &mut self,
    -        vm: &mut VirtualMachine,
    +        &self,
    +        vm: &VirtualMachine,
             op: &bytecode::BinaryOperator,
             inplace: bool,
         ) -> FrameResult {
    @@ -2101,11 +2286,7 @@
             Ok(None)
         }
     
    -    fn execute_unop(
    -        &mut self,
    -        vm: &mut VirtualMachine,
    -        op: &bytecode::UnaryOperator,
    -    ) -> FrameResult {
    +    fn execute_unop(&self, vm: &VirtualMachine, op: &bytecode::UnaryOperator) -> FrameResult {
             let a = self.pop_value();
             let value = match *op {
                 bytecode::UnaryOperator::Minus => vm.call_method(&a, "__neg__", vec![])?,
    @@ -2126,8 +2307,8 @@
     
         // https://docs.python.org/3/reference/expressions.html#membership-test-operations
         fn _membership(
    -        &mut self,
    -        vm: &mut VirtualMachine,
    +        &self,
    +        vm: &VirtualMachine,
             needle: PyObjectRef,
             haystack: &PyObjectRef,
         ) -> PyResult {
    @@ -2136,12 +2317,7 @@
             // not implemented.
         }
     
    -    fn _in(
    -        &mut self,
    -        vm: &mut VirtualMachine,
    -        needle: PyObjectRef,
    -        haystack: PyObjectRef,
    -    ) -> PyResult {
    +    fn _in(&self, vm: &VirtualMachine, needle: PyObjectRef, haystack: PyObjectRef) -> PyResult {
             match self._membership(vm, needle, &haystack) {
                 Ok(found) => Ok(found),
                 Err(_) => Err(vm.new_type_error(format!(
    @@ -2151,12 +2327,7 @@
             }
         }
     
    -    fn _not_in(
    -        &mut self,
    -        vm: &mut VirtualMachine,
    -        needle: PyObjectRef,
    -        haystack: PyObjectRef,
    -    ) -> PyResult {
    +    fn _not_in(&self, vm: &VirtualMachine, needle: PyObjectRef, haystack: PyObjectRef) -> PyResult {
             match self._membership(vm, needle, &haystack) {
                 Ok(found) => Ok(vm.ctx.new_bool(!objbool::get_value(&found))),
                 Err(_) => Err(vm.new_type_error(format!(
    @@ -2178,8 +2349,8 @@
         }
     
         fn execute_compare(
    -        &mut self,
    -        vm: &mut VirtualMachine,
    +        &self,
    +        vm: &VirtualMachine,
             op: &bytecode::ComparisonOperator,
         ) -> FrameResult {
             let b = self.pop_value();
    @@ -2201,22 +2372,21 @@
             Ok(None)
         }
     
    -    fn load_attr(&mut self, vm: &mut VirtualMachine, attr_name: &str) -> FrameResult {
    +    fn load_attr(&self, vm: &VirtualMachine, attr_name: &str) -> FrameResult {
             let parent = self.pop_value();
    -        let attr_name = vm.new_str(attr_name.to_string());
             let obj = vm.get_attribute(parent, attr_name)?;
             self.push_value(obj);
             Ok(None)
         }
     
    -    fn store_attr(&mut self, vm: &mut VirtualMachine, attr_name: &str) -> FrameResult {
    +    fn store_attr(&self, vm: &VirtualMachine, attr_name: &str) -> FrameResult {
             let parent = self.pop_value();
             let value = self.pop_value();
    -        vm.ctx.set_attr(&parent, attr_name, value);
    +        vm.set_attr(&parent, vm.new_str(attr_name.to_string()), value)?;
             Ok(None)
         }
     
    -    fn delete_attr(&mut self, vm: &mut VirtualMachine, attr_name: &str) -> FrameResult {
    +    fn delete_attr(&self, vm: &VirtualMachine, attr_name: &str) -> FrameResult {
             let parent = self.pop_value();
             let name = vm.ctx.new_str(attr_name.to_string());
             vm.del_attr(&parent, name)?;
    @@ -2224,49 +2394,50 @@
         }
     
         pub fn get_lineno(&self) -> ast::Location {
    -        self.code.locations[self.lasti].clone()
    +        self.code.locations[*self.lasti.borrow()].clone()
         }
     
    -    fn push_block(&mut self, typ: BlockType) {
    -        self.blocks.push(Block {
    +    fn push_block(&self, typ: BlockType) {
    +        self.blocks.borrow_mut().push(Block {
                 typ,
    -            level: self.stack.len(),
    +            level: self.stack.borrow().len(),
             });
         }
     
    -    fn pop_block(&mut self) -> Option<Block> {
    -        let block = self.blocks.pop()?;
    -        self.stack.truncate(block.level);
    +    fn pop_block(&self) -> Option<Block> {
    +        let block = self.blocks.borrow_mut().pop()?;
    +        self.stack.borrow_mut().truncate(block.level);
             Some(block)
         }
     
    -    fn current_block(&self) -> Option<&Block> {
    -        self.blocks.last()
    +    fn current_block(&self) -> Option<Block> {
    +        self.blocks.borrow().last().cloned()
         }
     
    -    pub fn push_value(&mut self, obj: PyObjectRef) {
    -        self.stack.push(obj);
    +    pub fn push_value(&self, obj: PyObjectRef) {
    +        self.stack.borrow_mut().push(obj);
         }
     
    -    fn pop_value(&mut self) -> PyObjectRef {
    -        self.stack.pop().unwrap()
    +    fn pop_value(&self) -> PyObjectRef {
    +        self.stack.borrow_mut().pop().unwrap()
         }
     
    -    fn pop_multiple(&mut self, count: usize) -> Vec<PyObjectRef> {
    +    fn pop_multiple(&self, count: usize) -> Vec<PyObjectRef> {
             let mut objs: Vec<PyObjectRef> = Vec::new();
             for _x in 0..count {
    -            objs.push(self.stack.pop().unwrap());
    +            objs.push(self.pop_value());
             }
             objs.reverse();
             objs
         }
     
         fn last_value(&self) -> PyObjectRef {
    -        self.stack.last().unwrap().clone()
    +        self.stack.borrow().last().unwrap().clone()
         }
     
         fn nth_value(&self, depth: usize) -> PyObjectRef {
    -        self.stack[self.stack.len() - depth - 1].clone()
    +        let stack = self.stack.borrow_mut();
    +        stack[stack.len() - depth - 1].clone()
         }
     }
     
    @@ -2274,31 +2445,28 @@
         fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
             let stack_str = self
                 .stack
    +            .borrow()
                 .iter()
    -            .map(|elem| format!("\n  > {:?}", elem.borrow()))
    -            .collect::<Vec<_>>()
    -            .join("");
    +            .map(|elem| {
    +                if elem.payload.as_any().is::<Frame>() {
    +                    "\n  > {frame}".to_string()
    +                } else {
    +                    format!("\n  > {:?}", elem)
    +                }
    +            })
    +            .collect::<String>();
             let block_str = self
                 .blocks
    +            .borrow()
                 .iter()
                 .map(|elem| format!("\n  > {:?}", elem))
    -            .collect::<Vec<_>>()
    -            .join("");
    -        let local_str = match self.locals.borrow().payload {
    -            PyObjectPayload::Scope { ref scope } => match scope.locals.borrow().payload {
    -                PyObjectPayload::Dict { ref elements } => {
    -                    objdict::get_key_value_pairs_from_content(elements)
    -                        .iter()
    -                        .map(|elem| format!("\n  {:?} = {:?}", elem.0.borrow(), elem.1.borrow()))
    -                        .collect::<Vec<_>>()
    -                        .join("")
    -                }
    -                ref unexpected => panic!(
    -                    "locals unexpectedly not wrapping a dict! instead: {:?}",
    -                    unexpected
    -                ),
    -            },
    -            ref unexpected => panic!("locals unexpectedly not a scope! instead: {:?}", unexpected),
    +            .collect::<String>();
    +        let local_str = match self.scope.get_locals().payload::<PyDict>() {
    +            Some(dict) => objdict::get_key_value_pairs_from_content(&dict.entries.borrow())
    +                .iter()
    +                .map(|elem| format!("\n  {:?} = {:?}", elem.0, elem.1))
    +                .collect::<String>(),
    +            None => panic!("locals unexpectedly not wrapping a dict!",),
             };
             write!(
                 f,
    @@ -2308,4 +2476,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/function.rs.html b/src/rustpython_vm/function.rs.html new file mode 100644 index 0000000..1998987 --- /dev/null +++ b/src/rustpython_vm/function.rs.html @@ -0,0 +1,869 @@ +function.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    +175
    +176
    +177
    +178
    +179
    +180
    +181
    +182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    +217
    +218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +246
    +247
    +248
    +249
    +250
    +251
    +252
    +253
    +254
    +255
    +256
    +257
    +258
    +259
    +260
    +261
    +262
    +263
    +264
    +265
    +266
    +267
    +268
    +269
    +270
    +271
    +272
    +273
    +274
    +275
    +276
    +277
    +278
    +279
    +280
    +281
    +282
    +283
    +284
    +285
    +286
    +287
    +288
    +289
    +290
    +291
    +292
    +293
    +294
    +295
    +296
    +297
    +298
    +299
    +300
    +301
    +302
    +303
    +304
    +305
    +306
    +307
    +308
    +309
    +310
    +311
    +312
    +313
    +314
    +315
    +316
    +317
    +318
    +319
    +320
    +321
    +322
    +323
    +324
    +325
    +326
    +327
    +328
    +329
    +330
    +331
    +332
    +333
    +334
    +335
    +336
    +337
    +338
    +339
    +340
    +341
    +342
    +343
    +344
    +345
    +346
    +347
    +348
    +349
    +350
    +351
    +352
    +353
    +354
    +355
    +356
    +357
    +358
    +359
    +360
    +361
    +362
    +363
    +364
    +365
    +366
    +367
    +368
    +369
    +370
    +371
    +372
    +373
    +374
    +375
    +376
    +377
    +378
    +379
    +380
    +381
    +382
    +383
    +384
    +385
    +386
    +387
    +388
    +389
    +390
    +391
    +392
    +393
    +394
    +395
    +396
    +397
    +398
    +399
    +400
    +401
    +402
    +403
    +404
    +405
    +406
    +407
    +408
    +409
    +410
    +411
    +412
    +413
    +414
    +415
    +416
    +417
    +418
    +419
    +420
    +421
    +422
    +423
    +424
    +425
    +426
    +427
    +428
    +429
    +430
    +431
    +432
    +433
    +
    +use std::collections::HashMap;
    +use std::ops::RangeInclusive;
    +
    +use crate::obj::objtype;
    +use crate::pyobject::{IntoPyObject, PyObjectRef, PyResult, TryFromObject, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
    +use self::OptionalArg::*;
    +
    +/// The `PyFuncArgs` struct is one of the most used structs then creating
    +/// a rust function that can be called from python. It holds both positional
    +/// arguments, as well as keyword arguments passed to the function.
    +#[derive(Debug, Default, Clone)]
    +pub struct PyFuncArgs {
    +    pub args: Vec<PyObjectRef>,
    +    pub kwargs: Vec<(String, PyObjectRef)>,
    +}
    +
    +/// Conversion from vector of python objects to function arguments.
    +impl From<Vec<PyObjectRef>> for PyFuncArgs {
    +    fn from(args: Vec<PyObjectRef>) -> Self {
    +        PyFuncArgs {
    +            args,
    +            kwargs: vec![],
    +        }
    +    }
    +}
    +
    +impl From<PyObjectRef> for PyFuncArgs {
    +    fn from(arg: PyObjectRef) -> Self {
    +        PyFuncArgs {
    +            args: vec![arg],
    +            kwargs: vec![],
    +        }
    +    }
    +}
    +
    +impl PyFuncArgs {
    +    pub fn new(mut args: Vec<PyObjectRef>, kwarg_names: Vec<String>) -> PyFuncArgs {
    +        let mut kwargs = vec![];
    +        for name in kwarg_names.iter().rev() {
    +            kwargs.push((name.clone(), args.pop().unwrap()));
    +        }
    +        PyFuncArgs { args, kwargs }
    +    }
    +
    +    pub fn insert(&self, item: PyObjectRef) -> PyFuncArgs {
    +        let mut args = PyFuncArgs {
    +            args: self.args.clone(),
    +            kwargs: self.kwargs.clone(),
    +        };
    +        args.args.insert(0, item);
    +        args
    +    }
    +
    +    pub fn shift(&mut self) -> PyObjectRef {
    +        self.args.remove(0)
    +    }
    +
    +    pub fn get_kwarg(&self, key: &str, default: PyObjectRef) -> PyObjectRef {
    +        for (arg_name, arg_value) in self.kwargs.iter() {
    +            if arg_name == key {
    +                return arg_value.clone();
    +            }
    +        }
    +        default.clone()
    +    }
    +
    +    pub fn get_optional_kwarg(&self, key: &str) -> Option<PyObjectRef> {
    +        for (arg_name, arg_value) in self.kwargs.iter() {
    +            if arg_name == key {
    +                return Some(arg_value.clone());
    +            }
    +        }
    +        None
    +    }
    +
    +    pub fn get_optional_kwarg_with_type(
    +        &self,
    +        key: &str,
    +        ty: PyObjectRef,
    +        vm: &VirtualMachine,
    +    ) -> Result<Option<PyObjectRef>, PyObjectRef> {
    +        match self.get_optional_kwarg(key) {
    +            Some(kwarg) => {
    +                if objtype::isinstance(&kwarg, &ty) {
    +                    Ok(Some(kwarg))
    +                } else {
    +                    let expected_ty_name = vm.to_pystr(&ty)?;
    +                    let actual_ty_name = vm.to_pystr(&kwarg.typ())?;
    +                    Err(vm.new_type_error(format!(
    +                        "argument of type {} is required for named parameter `{}` (got: {})",
    +                        expected_ty_name, key, actual_ty_name
    +                    )))
    +                }
    +            }
    +            None => Ok(None),
    +        }
    +    }
    +
    +    pub fn next_positional(&mut self) -> Option<PyObjectRef> {
    +        if self.args.is_empty() {
    +            None
    +        } else {
    +            Some(self.args.remove(0))
    +        }
    +    }
    +
    +    pub fn take_keyword(&mut self, name: &str) -> Option<PyObjectRef> {
    +        // TODO: change kwarg representation so this scan isn't necessary
    +        if let Some(index) = self
    +            .kwargs
    +            .iter()
    +            .position(|(arg_name, _)| arg_name == name)
    +        {
    +            Some(self.kwargs.remove(index).1)
    +        } else {
    +            None
    +        }
    +    }
    +
    +    pub fn remaining_keyword<'a>(&'a mut self) -> impl Iterator<Item = (String, PyObjectRef)> + 'a {
    +        self.kwargs.drain(..)
    +    }
    +
    +    /// Binds these arguments to their respective values.
    +    ///
    +    /// If there is an insufficient number of arguments, there are leftover
    +    /// arguments after performing the binding, or if an argument is not of
    +    /// the expected type, a TypeError is raised.
    +    ///
    +    /// If the given `FromArgs` includes any conversions, exceptions raised
    +    /// during the conversion will halt the binding and return the error.
    +    fn bind<T: FromArgs>(mut self, vm: &VirtualMachine) -> PyResult<T> {
    +        let given_args = self.args.len();
    +        let bound = match T::from_args(vm, &mut self) {
    +            Ok(args) => args,
    +            Err(ArgumentError::TooFewArgs) => {
    +                return Err(vm.new_type_error(format!(
    +                    "Expected at least {} arguments ({} given)",
    +                    T::arity().start(),
    +                    given_args,
    +                )));
    +            }
    +            Err(ArgumentError::TooManyArgs) => {
    +                return Err(vm.new_type_error(format!(
    +                    "Expected at most {} arguments ({} given)",
    +                    T::arity().end(),
    +                    given_args,
    +                )));
    +            }
    +            Err(ArgumentError::InvalidKeywordArgument(name)) => {
    +                return Err(vm.new_type_error(format!("{} is an invalid keyword argument", name)));
    +            }
    +            Err(ArgumentError::Exception(ex)) => {
    +                return Err(ex);
    +            }
    +        };
    +
    +        if !self.args.is_empty() {
    +            Err(vm.new_type_error(format!(
    +                "Expected at most {} arguments ({} given)",
    +                T::arity().end(),
    +                given_args,
    +            )))
    +        } else if !self.kwargs.is_empty() {
    +            Err(vm.new_type_error(format!("Unexpected keyword argument {}", self.kwargs[0].0)))
    +        } else {
    +            Ok(bound)
    +        }
    +    }
    +}
    +
    +/// An error encountered while binding arguments to the parameters of a Python
    +/// function call.
    +pub enum ArgumentError {
    +    /// The call provided fewer positional arguments than the function requires.
    +    TooFewArgs,
    +    /// The call provided more positional arguments than the function accepts.
    +    TooManyArgs,
    +    /// The function doesn't accept a keyword argument with the given name.
    +    InvalidKeywordArgument(String),
    +    /// An exception was raised while binding arguments to the function
    +    /// parameters.
    +    Exception(PyObjectRef),
    +}
    +
    +impl From<PyObjectRef> for ArgumentError {
    +    fn from(ex: PyObjectRef) -> Self {
    +        ArgumentError::Exception(ex)
    +    }
    +}
    +
    +/// Implemented by any type that can be accepted as a parameter to a built-in
    +/// function.
    +///
    +pub trait FromArgs: Sized {
    +    /// The range of positional arguments permitted by the function signature.
    +    ///
    +    /// Returns an empty range if not applicable.
    +    fn arity() -> RangeInclusive<usize> {
    +        0..=0
    +    }
    +
    +    /// Extracts this item from the next argument(s).
    +    fn from_args(vm: &VirtualMachine, args: &mut PyFuncArgs) -> Result<Self, ArgumentError>;
    +}
    +
    +/// A map of keyword arguments to their values.
    +///
    +/// A built-in function with a `KwArgs` parameter is analagous to a Python
    +/// function with `**kwargs`. All remaining keyword arguments are extracted
    +/// (and hence the function will permit an arbitrary number of them).
    +///
    +/// `KwArgs` optionally accepts a generic type parameter to allow type checks
    +/// or conversions of each argument.
    +///
    +/// Note:
    +///
    +/// KwArgs is only for functions that accept arbitrary keyword arguments. For
    +/// functions that accept only *specific* named arguments, a rust struct with
    +/// an appropriate FromArgs implementation must be created.
    +pub struct KwArgs<T = PyObjectRef>(HashMap<String, T>);
    +
    +impl<T> FromArgs for KwArgs<T>
    +where
    +    T: TryFromObject,
    +{
    +    fn from_args(vm: &VirtualMachine, args: &mut PyFuncArgs) -> Result<Self, ArgumentError> {
    +        let mut kwargs = HashMap::new();
    +        for (name, value) in args.remaining_keyword() {
    +            kwargs.insert(name, T::try_from_object(vm, value)?);
    +        }
    +        Ok(KwArgs(kwargs))
    +    }
    +}
    +
    +/// A list of positional argument values.
    +///
    +/// A built-in function with a `Args` parameter is analagous to a Python
    +/// function with `*args`. All remaining positional arguments are extracted
    +/// (and hence the function will permit an arbitrary number of them).
    +///
    +/// `Args` optionally accepts a generic type parameter to allow type checks
    +/// or conversions of each argument.
    +pub struct Args<T = PyObjectRef>(Vec<T>);
    +
    +impl<T> FromArgs for Args<T>
    +where
    +    T: TryFromObject,
    +{
    +    fn from_args(vm: &VirtualMachine, args: &mut PyFuncArgs) -> Result<Self, ArgumentError> {
    +        let mut varargs = Vec::new();
    +        while let Some(value) = args.next_positional() {
    +            varargs.push(T::try_from_object(vm, value)?);
    +        }
    +        Ok(Args(varargs))
    +    }
    +}
    +
    +impl<T> IntoIterator for Args<T> {
    +    type Item = T;
    +    type IntoIter = std::vec::IntoIter<T>;
    +
    +    fn into_iter(self) -> Self::IntoIter {
    +        self.0.into_iter()
    +    }
    +}
    +
    +impl<T> FromArgs for T
    +where
    +    T: TryFromObject,
    +{
    +    fn arity() -> RangeInclusive<usize> {
    +        1..=1
    +    }
    +
    +    fn from_args(vm: &VirtualMachine, args: &mut PyFuncArgs) -> Result<Self, ArgumentError> {
    +        if let Some(value) = args.next_positional() {
    +            Ok(T::try_from_object(vm, value)?)
    +        } else {
    +            Err(ArgumentError::TooFewArgs)
    +        }
    +    }
    +}
    +
    +/// An argument that may or may not be provided by the caller.
    +///
    +/// This style of argument is not possible in pure Python.
    +pub enum OptionalArg<T> {
    +    Present(T),
    +    Missing,
    +}
    +
    +impl<T> OptionalArg<T> {
    +    pub fn into_option(self) -> Option<T> {
    +        match self {
    +            Present(value) => Some(value),
    +            Missing => None,
    +        }
    +    }
    +}
    +
    +impl<T> FromArgs for OptionalArg<T>
    +where
    +    T: TryFromObject,
    +{
    +    fn arity() -> RangeInclusive<usize> {
    +        0..=1
    +    }
    +
    +    fn from_args(vm: &VirtualMachine, args: &mut PyFuncArgs) -> Result<Self, ArgumentError> {
    +        if let Some(value) = args.next_positional() {
    +            Ok(Present(T::try_from_object(vm, value)?))
    +        } else {
    +            Ok(Missing)
    +        }
    +    }
    +}
    +
    +// For functions that accept no arguments. Implemented explicitly instead of via
    +// macro below to avoid unused warnings.
    +impl FromArgs for () {
    +    fn from_args(_vm: &VirtualMachine, _args: &mut PyFuncArgs) -> Result<Self, ArgumentError> {
    +        Ok(())
    +    }
    +}
    +
    +// A tuple of types that each implement `FromArgs` represents a sequence of
    +// arguments that can be bound and passed to a built-in function.
    +//
    +// Technically, a tuple can contain tuples, which can contain tuples, and so on,
    +// so this actually represents a tree of values to be bound from arguments, but
    +// in practice this is only used for the top-level parameters.
    +macro_rules! tuple_from_py_func_args {
    +    ($($T:ident),+) => {
    +        impl<$($T),+> FromArgs for ($($T,)+)
    +        where
    +            $($T: FromArgs),+
    +        {
    +            fn arity() -> RangeInclusive<usize> {
    +                let mut min = 0;
    +                let mut max = 0;
    +                $(
    +                    let (start, end) = $T::arity().into_inner();
    +                    min += start;
    +                    max += end;
    +                )+
    +                min..=max
    +            }
    +
    +            fn from_args(vm: &VirtualMachine, args: &mut PyFuncArgs) -> Result<Self, ArgumentError> {
    +                Ok(($($T::from_args(vm, args)?,)+))
    +            }
    +        }
    +    };
    +}
    +
    +// Implement `FromArgs` for up to 5-tuples, allowing built-in functions to bind
    +// up to 5 top-level parameters (note that `Args`, `KwArgs`, nested tuples, etc.
    +// count as 1, so this should actually be more than enough).
    +tuple_from_py_func_args!(A);
    +tuple_from_py_func_args!(A, B);
    +tuple_from_py_func_args!(A, B, C);
    +tuple_from_py_func_args!(A, B, C, D);
    +tuple_from_py_func_args!(A, B, C, D, E);
    +
    +/// A built-in Python function.
    +pub type PyNativeFunc = Box<dyn Fn(&VirtualMachine, PyFuncArgs) -> PyResult + 'static>;
    +
    +/// Implemented by types that are or can generate built-in functions.
    +///
    +/// For example, any function that:
    +///
    +/// - Accepts a sequence of types that implement `FromArgs`, followed by a
    +///   `&VirtualMachine`
    +/// - Returns some type that implements `IntoPyObject`
    +///
    +/// will generate a `PyNativeFunc` that performs the appropriate type and arity
    +/// checking, any requested conversions, and then if successful call the function
    +/// with the bound values.
    +///
    +/// A bare `PyNativeFunc` also implements this trait, allowing the above to be
    +/// done manually, for rare situations that don't fit into this model.
    +pub trait IntoPyNativeFunc<T, R> {
    +    fn into_func(self) -> PyNativeFunc;
    +}
    +
    +impl<F> IntoPyNativeFunc<PyFuncArgs, PyResult> for F
    +where
    +    F: Fn(&VirtualMachine, PyFuncArgs) -> PyResult + 'static,
    +{
    +    fn into_func(self) -> PyNativeFunc {
    +        Box::new(self)
    +    }
    +}
    +
    +impl IntoPyNativeFunc<PyFuncArgs, PyResult> for PyNativeFunc {
    +    fn into_func(self) -> PyNativeFunc {
    +        self
    +    }
    +}
    +
    +// This is the "magic" that allows rust functions of varying signatures to
    +// generate native python functions.
    +//
    +// Note that this could be done without a macro - it is simply to avoid repetition.
    +macro_rules! into_py_native_func_tuple {
    +    ($(($n:tt, $T:ident)),*) => {
    +        impl<F, $($T,)* R> IntoPyNativeFunc<($($T,)*), R> for F
    +        where
    +            F: Fn($($T,)* &VirtualMachine) -> R + 'static,
    +            $($T: FromArgs,)*
    +            ($($T,)*): FromArgs,
    +            R: IntoPyObject,
    +        {
    +            fn into_func(self) -> PyNativeFunc {
    +                Box::new(move |vm, args| {
    +                    let ($($n,)*) = args.bind::<($($T,)*)>(vm)?;
    +
    +                    (self)($($n,)* vm).into_pyobject(vm)
    +                })
    +            }
    +        }
    +    };
    +}
    +
    +into_py_native_func_tuple!();
    +into_py_native_func_tuple!((a, A));
    +into_py_native_func_tuple!((a, A), (b, B));
    +into_py_native_func_tuple!((a, A), (b, B), (c, C));
    +into_py_native_func_tuple!((a, A), (b, B), (c, C), (d, D));
    +into_py_native_func_tuple!((a, A), (b, B), (c, C), (d, D), (e, E));
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_vm/import.rs.html b/src/rustpython_vm/import.rs.html index 86f8080..24a0477 100644 --- a/src/rustpython_vm/import.rs.html +++ b/src/rustpython_vm/import.rs.html @@ -1,115 +1,84 @@ -import.rs.html -- source
      1
    -  2
    -  3
    -  4
    -  5
    -  6
    -  7
    -  8
    -  9
    - 10
    - 11
    - 12
    - 13
    - 14
    - 15
    - 16
    - 17
    - 18
    - 19
    - 20
    - 21
    - 22
    - 23
    - 24
    - 25
    - 26
    - 27
    - 28
    - 29
    - 30
    - 31
    - 32
    - 33
    - 34
    - 35
    - 36
    - 37
    - 38
    - 39
    - 40
    - 41
    - 42
    - 43
    - 44
    - 45
    - 46
    - 47
    - 48
    - 49
    - 50
    - 51
    - 52
    - 53
    - 54
    - 55
    - 56
    - 57
    - 58
    - 59
    - 60
    - 61
    - 62
    - 63
    - 64
    - 65
    - 66
    - 67
    - 68
    - 69
    - 70
    - 71
    - 72
    - 73
    - 74
    - 75
    - 76
    - 77
    - 78
    - 79
    - 80
    - 81
    - 82
    - 83
    - 84
    - 85
    - 86
    - 87
    - 88
    - 89
    - 90
    - 91
    - 92
    - 93
    - 94
    - 95
    - 96
    - 97
    - 98
    - 99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    +import.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    +62
    +63
    +64
    +65
    +66
    +67
    +68
    +69
    +70
    +71
    +72
    +73
    +74
    +75
    +76
    +77
    +78
    +79
    +80
    +81
     
     /*
      * Import mechanics
    @@ -119,18 +88,15 @@
     use std::path::PathBuf;
     
     use crate::compile;
    +use crate::frame::Scope;
     use crate::obj::{objsequence, objstr};
    -use crate::pyobject::{AttributeProtocol, DictProtocol, PyResult};
    +use crate::pyobject::{DictProtocol, PyResult};
     use crate::util;
     use crate::vm::VirtualMachine;
     
    -fn import_uncached_module(
    -    vm: &mut VirtualMachine,
    -    current_path: PathBuf,
    -    module: &str,
    -) -> PyResult {
    +fn import_uncached_module(vm: &VirtualMachine, current_path: PathBuf, module: &str) -> PyResult {
         // Check for Rust-native modules
    -    if let Some(module) = vm.stdlib_inits.get(module) {
    +    if let Some(module) = vm.stdlib_inits.borrow().get(module) {
             return Ok(module(&vm.ctx).clone());
         }
     
    @@ -154,53 +120,25 @@
         })?;
         // trace!("Code object: {:?}", code_obj);
     
    -    let builtins = vm.get_builtin_scope();
    -    let scope = vm.ctx.new_scope(Some(builtins));
    -    vm.ctx
    -        .set_attr(&scope, "__name__", vm.new_str(module.to_string()));
    -    vm.run_code_obj(code_obj, scope.clone())?;
    -    Ok(vm.ctx.new_module(module, scope))
    +    let attrs = vm.ctx.new_dict();
    +    attrs.set_item(&vm.ctx, "__name__", vm.new_str(module.to_string()));
    +    vm.run_code_obj(code_obj, Scope::new(None, attrs.clone()))?;
    +    Ok(vm.ctx.new_module(module, attrs))
     }
     
    -pub fn import_module(
    -    vm: &mut VirtualMachine,
    -    current_path: PathBuf,
    -    module_name: &str,
    -) -> PyResult {
    +pub fn import_module(vm: &VirtualMachine, current_path: PathBuf, module_name: &str) -> PyResult {
         // First, see if we already loaded the module:
    -    let sys_modules = vm.sys_module.get_attr("modules").unwrap();
    +    let sys_modules = vm.get_attribute(vm.sys_module.clone(), "modules")?;
         if let Some(module) = sys_modules.get_item(module_name) {
             return Ok(module);
         }
         let module = import_uncached_module(vm, current_path, module_name)?;
    -    vm.ctx.set_item(&sys_modules, module_name, module.clone());
    +    sys_modules.set_item(&vm.ctx, module_name, module.clone());
         Ok(module)
     }
     
    -pub fn import(
    -    vm: &mut VirtualMachine,
    -    current_path: PathBuf,
    -    module_name: &str,
    -    symbol: &Option<String>,
    -) -> PyResult {
    -    let module = import_module(vm, current_path, module_name)?;
    -    // If we're importing a symbol, look it up and use it, otherwise construct a module and return
    -    // that
    -    if let Some(symbol) = symbol {
    -        module.get_attr(symbol).map_or_else(
    -            || {
    -                let import_error = vm.context().exceptions.import_error.clone();
    -                Err(vm.new_exception(import_error, format!("cannot import name '{}'", symbol)))
    -            },
    -            Ok,
    -        )
    -    } else {
    -        Ok(module)
    -    }
    -}
    -
     fn find_source(vm: &VirtualMachine, current_path: PathBuf, name: &str) -> Result<PathBuf, String> {
    -    let sys_path = vm.sys_module.get_attr("path").unwrap();
    +    let sys_path = vm.get_attribute(vm.sys_module.clone(), "path").unwrap();
         let mut paths: Vec<PathBuf> = objsequence::get_elements(&sys_path)
             .iter()
             .map(|item| PathBuf::from(objstr::get_value(item)))
    @@ -218,10 +156,10 @@
             }
         }
     
    -    match file_paths.iter().filter(|p| p.exists()).next() {
    +    match file_paths.iter().find(|p| p.exists()) {
             Some(path) => Ok(path.to_path_buf()),
             None => Err(format!("No module named '{}'", name)),
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/lib.rs.html b/src/rustpython_vm/lib.rs.html index ebff815..9714bc4 100644 --- a/src/rustpython_vm/lib.rs.html +++ b/src/rustpython_vm/lib.rs.html @@ -1,4 +1,4 @@ -lib.rs.html -- source
     1
    +lib.rs.html -- source
     1
      2
      3
      4
    @@ -50,6 +50,16 @@
     50
     51
     52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    +62
     
     //! This crate contains most python logic.
     //!
    @@ -58,6 +68,13 @@
     //! - Import mechanics
     //! - Base objects
     
    +// for methods like vm.to_str(), not the typical use of 'to' as a method prefix
    +#![allow(
    +    clippy::wrong_self_convention,
    +    clippy::let_and_return,
    +    clippy::implicit_hasher
    +)]
    +
     #[macro_use]
     extern crate bitflags;
     #[macro_use]
    @@ -75,6 +92,8 @@
     extern crate statrs;
     
     extern crate rustpython_parser;
    +#[macro_use]
    +extern crate rustpython_derive;
     
     //extern crate eval; use eval::eval::*;
     // use py_code_object::{Function, NativeType, PyCodeObject};
    @@ -90,7 +109,8 @@
     pub mod eval;
     mod exceptions;
     pub mod format;
    -mod frame;
    +pub mod frame;
    +pub mod function;
     pub mod import;
     pub mod obj;
     pub mod pyobject;
    @@ -104,4 +124,4 @@
     pub use self::exceptions::print_exception;
     pub use self::vm::VirtualMachine;
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/macros.rs.html b/src/rustpython_vm/macros.rs.html index bf4e4ee..c54e9bc 100644 --- a/src/rustpython_vm/macros.rs.html +++ b/src/rustpython_vm/macros.rs.html @@ -1,4 +1,4 @@ -macros.rs.html -- source
      1
    +macros.rs.html -- source
      1
       2
       3
       4
    @@ -122,6 +122,31 @@
     122
     123
     124
    +125
    +126
    +127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
     
     // count number of tokens given as arguments.
     // see: https://danielkeep.github.io/tlborm/book/blk-counting.html
    @@ -143,6 +168,7 @@
             // None indicates that we have no type requirement (i.e. we accept any type)
             if let Some(expected_type) = $arg_type {
                 let arg = &$args.args[$arg_count];
    +
                 if !$crate::obj::objtype::isinstance(arg, &expected_type) {
                     let arg_typ = arg.typ();
                     let expected_type_name = $vm.to_pystr(&expected_type)?;
    @@ -236,16 +262,40 @@
         };
     }
     
    +#[macro_export]
     macro_rules! py_module {
         ( $ctx:expr, $module_name:expr, { $($name:expr => $value:expr),* $(,)* }) => {
             {
    -            let py_mod = $ctx.new_module($module_name, $ctx.new_scope(None));
    +            let py_mod = $ctx.new_module($module_name, $ctx.new_dict());
    +            $(
    +                $ctx.set_attr(&py_mod, $name, $value);
    +            )*
    +            py_mod
    +        }
    +    }
    +}
    +
    +#[macro_export]
    +macro_rules! py_class {
    +    ( $ctx:expr, $class_name:expr, $class_base:expr, { $($name:expr => $value:expr),* $(,)* }) => {
    +        {
    +            let py_class = $ctx.new_class($class_name, $class_base);
    +            $(
    +                $ctx.set_attr(&py_class, $name, $value);
    +            )*
    +            py_class
    +        }
    +    }
    +}
    +
    +#[macro_export]
    +macro_rules! extend_class {
    +    ( $ctx:expr, $class:expr, { $($name:expr => $value:expr),* $(,)* }) => {
    +        let class = $class;
             $(
    -            $ctx.set_attr(&py_mod, $name, $value);
    +            $ctx.set_attr(&class, $name, $value);
             )*
    -        py_mod
    -        }
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/mod.rs.html b/src/rustpython_vm/obj/mod.rs.html index 5159425..c357f2d 100644 --- a/src/rustpython_vm/obj/mod.rs.html +++ b/src/rustpython_vm/obj/mod.rs.html @@ -1,4 +1,4 @@ -mod.rs.html -- source
     1
    +mod.rs.html -- source
     1
      2
      3
      4
    @@ -29,15 +29,24 @@
     29
     30
     31
    +32
    +33
    +34
    +35
    +36
    +37
     
     //! This package contains the python basic/builtin types
     
     pub mod objbool;
    +pub mod objbuiltinfunc;
     pub mod objbytearray;
     pub mod objbytes;
    +pub mod objclassmethod;
     pub mod objcode;
     pub mod objcomplex;
     pub mod objdict;
    +pub mod objellipsis;
     pub mod objenumerate;
     pub mod objfilter;
     pub mod objfloat;
    @@ -49,6 +58,7 @@
     pub mod objlist;
     pub mod objmap;
     pub mod objmemory;
    +pub mod objmodule;
     pub mod objnone;
     pub mod objobject;
     pub mod objproperty;
    @@ -56,10 +66,12 @@
     pub mod objsequence;
     pub mod objset;
     pub mod objslice;
    +pub mod objstaticmethod;
     pub mod objstr;
     pub mod objsuper;
     pub mod objtuple;
     pub mod objtype;
    +pub mod objweakref;
     pub mod objzip;
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objbool.rs.html b/src/rustpython_vm/obj/objbool.rs.html index 5ba01ae..4b764c0 100644 --- a/src/rustpython_vm/obj/objbool.rs.html +++ b/src/rustpython_vm/obj/objbool.rs.html @@ -1,123 +1,173 @@ -objbool.rs.html -- source
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    -87
    -88
    -89
    +objbool.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
     
    -use super::objtype;
    +use num_traits::Zero;
    +
    +use crate::function::PyFuncArgs;
     use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    +    IntoPyObject, PyContext, PyObjectRef, PyResult, TryFromObject, TypeProtocol,
     };
     use crate::vm::VirtualMachine;
    -use num_traits::Zero;
     
    -pub fn boolval(vm: &mut VirtualMachine, obj: PyObjectRef) -> Result<bool, PyObjectRef> {
    -    let result = match obj.borrow().payload {
    -        PyObjectPayload::Integer { ref value } => !value.is_zero(),
    -        PyObjectPayload::Float { value } => value != 0.0,
    -        PyObjectPayload::Sequence { ref elements } => !elements.is_empty(),
    -        PyObjectPayload::Dict { ref elements } => !elements.is_empty(),
    -        PyObjectPayload::String { ref value } => !value.is_empty(),
    -        PyObjectPayload::None { .. } => false,
    -        _ => {
    -            if let Ok(f) = vm.get_method(obj.clone(), "__bool__") {
    -                let bool_res = vm.invoke(f, PyFuncArgs::default())?;
    -                let v = match bool_res.borrow().payload {
    -                    PyObjectPayload::Integer { ref value } => !value.is_zero(),
    -                    _ => return Err(vm.new_type_error(String::from("TypeError"))),
    -                };
    +use super::objdict::PyDict;
    +use super::objfloat::PyFloat;
    +use super::objint::PyInt;
    +use super::objlist::PyList;
    +use super::objstr::PyString;
    +use super::objtuple::PyTuple;
    +use super::objtype;
    +
    +impl IntoPyObject for bool {
    +    fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
    +        Ok(vm.ctx.new_bool(self))
    +    }
    +}
    +
    +impl TryFromObject for bool {
    +    fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<bool> {
    +        boolval(vm, obj)
    +    }
    +}
     
    -                v
    -            } else {
    -                true
    -            }
    +pub fn boolval(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<bool> {
    +    if let Some(s) = obj.payload::<PyString>() {
    +        return Ok(!s.value.is_empty());
    +    }
    +    if let Some(value) = obj.payload::<PyFloat>() {
    +        return Ok(*value != PyFloat::from(0.0));
    +    }
    +    if let Some(dict) = obj.payload::<PyDict>() {
    +        return Ok(!dict.entries.borrow().is_empty());
    +    }
    +    if let Some(i) = obj.payload::<PyInt>() {
    +        return Ok(!i.value.is_zero());
    +    }
    +    if let Some(list) = obj.payload::<PyList>() {
    +        return Ok(!list.elements.borrow().is_empty());
    +    }
    +    if let Some(tuple) = obj.payload::<PyTuple>() {
    +        return Ok(!tuple.elements.borrow().is_empty());
    +    }
    +
    +    Ok(if let Ok(f) = vm.get_method(obj.clone(), "__bool__") {
    +        let bool_res = vm.invoke(f, PyFuncArgs::default())?;
    +        match bool_res.payload::<PyInt>() {
    +            Some(i) => !i.value.is_zero(),
    +            None => return Err(vm.new_type_error(String::from("TypeError"))),
             }
    -    };
    -    Ok(result)
    +    } else {
    +        true
    +    })
     }
     
     pub fn init(context: &PyContext) {
    @@ -133,7 +183,7 @@
         context.set_attr(&bool_type, "__doc__", context.new_str(bool_doc.to_string()));
     }
     
    -pub fn not(vm: &mut VirtualMachine, obj: &PyObjectRef) -> PyResult {
    +pub fn not(vm: &VirtualMachine, obj: &PyObjectRef) -> PyResult {
         if objtype::isinstance(obj, &vm.ctx.bool_type()) {
             let value = get_value(obj);
             Ok(vm.ctx.new_bool(!value))
    @@ -144,14 +194,10 @@
     
     // Retrieve inner int value:
     pub fn get_value(obj: &PyObjectRef) -> bool {
    -    if let PyObjectPayload::Integer { value } = &obj.borrow().payload {
    -        !value.is_zero()
    -    } else {
    -        panic!("Inner error getting inner boolean");
    -    }
    +    !obj.payload::<PyInt>().unwrap().value.is_zero()
     }
     
    -fn bool_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> Result<PyObjectRef, PyObjectRef> {
    +fn bool_repr(vm: &VirtualMachine, args: PyFuncArgs) -> Result<PyObjectRef, PyObjectRef> {
         arg_check!(vm, args, required = [(obj, Some(vm.ctx.bool_type()))]);
         let v = get_value(obj);
         let s = if v {
    @@ -162,7 +208,7 @@
         Ok(vm.new_str(s))
     }
     
    -fn bool_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bool_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -178,4 +224,4 @@
         })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objbuiltinfunc.rs.html b/src/rustpython_vm/obj/objbuiltinfunc.rs.html new file mode 100644 index 0000000..04deb49 --- /dev/null +++ b/src/rustpython_vm/obj/objbuiltinfunc.rs.html @@ -0,0 +1,59 @@ +objbuiltinfunc.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +
    +use std::fmt;
    +
    +use crate::function::PyNativeFunc;
    +use crate::pyobject::{PyObjectRef, PyValue};
    +use crate::vm::VirtualMachine;
    +
    +pub struct PyBuiltinFunction {
    +    // TODO: shouldn't be public
    +    pub value: PyNativeFunc,
    +}
    +
    +impl PyValue for PyBuiltinFunction {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.builtin_function_or_method_type()
    +    }
    +}
    +
    +impl fmt::Debug for PyBuiltinFunction {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +        write!(f, "builtin function")
    +    }
    +}
    +
    +impl PyBuiltinFunction {
    +    pub fn new(value: PyNativeFunc) -> Self {
    +        Self { value }
    +    }
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objbytearray.rs.html b/src/rustpython_vm/obj/objbytearray.rs.html index bbfb6ac..fc61e9f 100644 --- a/src/rustpython_vm/obj/objbytearray.rs.html +++ b/src/rustpython_vm/obj/objbytearray.rs.html @@ -1,4 +1,4 @@ -objbytearray.rs.html -- source
      1
    +objbytearray.rs.html -- source
      1
       2
       3
       4
    @@ -321,18 +321,83 @@
     321
     322
     323
    +324
    +325
    +326
    +327
    +328
    +329
    +330
    +331
    +332
    +333
    +334
    +335
    +336
    +337
    +338
    +339
    +340
    +341
    +342
    +343
    +344
    +345
    +346
    +347
    +348
    +349
    +350
    +351
    +352
    +353
    +354
    +355
    +356
     
     //! Implementation of the python bytearray object.
     
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyResult, TypeProtocol};
    +use std::cell::RefCell;
    +use std::fmt::Write;
    +use std::ops::{Deref, DerefMut};
     
    -use super::objint;
    +use num_traits::ToPrimitive;
     
    -use super::objbytes::get_mut_value;
    -use super::objbytes::get_value;
    -use super::objtype;
    +use crate::function::{OptionalArg, PyFuncArgs};
    +use crate::pyobject::{PyContext, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol};
     use crate::vm::VirtualMachine;
    -use num_traits::ToPrimitive;
    +
    +use super::objint;
    +use super::objtype::{self, PyClassRef};
    +
    +#[derive(Debug)]
    +pub struct PyByteArray {
    +    // TODO: shouldn't be public
    +    pub value: RefCell<Vec<u8>>,
    +}
    +type PyByteArrayRef = PyRef<PyByteArray>;
    +
    +impl PyByteArray {
    +    pub fn new(data: Vec<u8>) -> Self {
    +        PyByteArray {
    +            value: RefCell::new(data),
    +        }
    +    }
    +}
    +
    +impl PyValue for PyByteArray {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.bytearray_type()
    +    }
    +}
    +
    +pub fn get_value<'a>(obj: &'a PyObjectRef) -> impl Deref<Target = Vec<u8>> + 'a {
    +    obj.payload::<PyByteArray>().unwrap().value.borrow()
    +}
    +
    +pub fn get_mut_value<'a>(obj: &'a PyObjectRef) -> impl DerefMut<Target = Vec<u8>> + 'a {
    +    obj.payload::<PyByteArray>().unwrap().value.borrow_mut()
    +}
     
     // Binary data support
     
    @@ -436,20 +501,14 @@
         );
     }
     
    -fn bytearray_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(cls, None)],
    -        optional = [(val_option, None)]
    -    );
    -    if !objtype::issubclass(cls, &vm.ctx.bytearray_type()) {
    -        return Err(vm.new_type_error(format!("{:?} is not a subtype of bytearray", cls)));
    -    }
    -
    +fn bytearray_new(
    +    cls: PyClassRef,
    +    val_option: OptionalArg<PyObjectRef>,
    +    vm: &VirtualMachine,
    +) -> PyResult<PyByteArrayRef> {
         // Create bytes data:
    -    let value = if let Some(ival) = val_option {
    -        let elements = vm.extract_elements(ival)?;
    +    let value = if let OptionalArg::Present(ival) = val_option {
    +        let elements = vm.extract_elements(&ival)?;
             let mut data_bytes = vec![];
             for elem in elements.iter() {
                 let v = objint::to_int(vm, elem, 10)?;
    @@ -464,17 +523,17 @@
         } else {
             vec![]
         };
    -    Ok(PyObject::new(PyObjectPayload::Bytes { value }, cls.clone()))
    +    PyByteArray::new(value).into_ref_with_type(vm, cls.clone())
     }
     
    -fn bytesarray_len(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytesarray_len(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(a, Some(vm.ctx.bytearray_type()))]);
     
         let byte_vec = get_value(a).to_vec();
         Ok(vm.ctx.new_int(byte_vec.len()))
     }
     
    -fn bytearray_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_eq(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -489,31 +548,31 @@
         Ok(vm.ctx.new_bool(result))
     }
     
    -fn bytearray_isalnum(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_isalnum(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.bytearray_type()))]);
         let bytes = get_value(zelf);
         Ok(vm.new_bool(!bytes.is_empty() && bytes.iter().all(|x| char::from(*x).is_alphanumeric())))
     }
     
    -fn bytearray_isalpha(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_isalpha(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.bytearray_type()))]);
         let bytes = get_value(zelf);
         Ok(vm.new_bool(!bytes.is_empty() && bytes.iter().all(|x| char::from(*x).is_alphabetic())))
     }
     
    -fn bytearray_isascii(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_isascii(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.bytearray_type()))]);
         let bytes = get_value(zelf);
         Ok(vm.new_bool(!bytes.is_empty() && bytes.iter().all(|x| char::from(*x).is_ascii())))
     }
     
    -fn bytearray_isdigit(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_isdigit(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.bytearray_type()))]);
         let bytes = get_value(zelf);
         Ok(vm.new_bool(!bytes.is_empty() && bytes.iter().all(|x| char::from(*x).is_digit(10))))
     }
     
    -fn bytearray_islower(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_islower(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.bytearray_type()))]);
         let bytes = get_value(zelf);
         Ok(vm.new_bool(
    @@ -525,13 +584,13 @@
         ))
     }
     
    -fn bytearray_isspace(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_isspace(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.bytearray_type()))]);
         let bytes = get_value(zelf);
         Ok(vm.new_bool(!bytes.is_empty() && bytes.iter().all(|x| char::from(*x).is_whitespace())))
     }
     
    -fn bytearray_isupper(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_isupper(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.bytearray_type()))]);
         let bytes = get_value(zelf);
         Ok(vm.new_bool(
    @@ -543,7 +602,7 @@
         ))
     }
     
    -fn bytearray_istitle(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_istitle(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.bytearray_type()))]);
         let bytes = get_value(zelf);
     
    @@ -582,7 +641,7 @@
     }
     
     /*
    -fn bytearray_getitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_getitem(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -598,26 +657,29 @@
     }
     */
     
    -fn bytearray_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +/// Return a lowercase hex representation of a bytearray
    +fn bytearray_to_hex(bytearray: &[u8]) -> String {
    +    bytearray.iter().fold(String::new(), |mut s, b| {
    +        let _ = write!(s, "\\x{:02x}", b);
    +        s
    +    })
    +}
    +
    +fn bytearray_repr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, Some(vm.ctx.bytearray_type()))]);
         let value = get_value(obj);
    -    let data = String::from_utf8(value.to_vec()).unwrap();
    +    let data =
    +        String::from_utf8(value.to_vec()).unwrap_or_else(|_| bytearray_to_hex(&value.to_vec()));
         Ok(vm.new_str(format!("bytearray(b'{}')", data)))
     }
     
    -fn bytearray_clear(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_clear(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.bytearray_type()))]);
    -    let mut mut_obj = zelf.borrow_mut();
    -    match mut_obj.payload {
    -        PyObjectPayload::Bytes { ref mut value } => {
    -            value.clear();
    -            Ok(vm.get_none())
    -        }
    -        _ => panic!("Bytearray has incorrect payload."),
    -    }
    +    get_mut_value(zelf).clear();
    +    Ok(vm.get_none())
     }
     
    -fn bytearray_pop(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_pop(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, Some(vm.ctx.bytearray_type()))]);
         let mut value = get_mut_value(obj);
     
    @@ -628,22 +690,26 @@
         }
     }
     
    -fn bytearray_lower(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_lower(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, Some(vm.ctx.bytearray_type()))]);
         let value = get_value(obj).to_vec().to_ascii_lowercase();
    -    Ok(PyObject::new(
    -        PyObjectPayload::Bytes { value },
    -        vm.ctx.bytearray_type(),
    -    ))
    +    Ok(vm.ctx.new_bytearray(value))
     }
     
    -fn bytearray_upper(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytearray_upper(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, Some(vm.ctx.bytearray_type()))]);
         let value = get_value(obj).to_vec().to_ascii_uppercase();
    -    Ok(PyObject::new(
    -        PyObjectPayload::Bytes { value },
    -        vm.ctx.bytearray_type(),
    -    ))
    +    Ok(vm.ctx.new_bytearray(value))
    +}
    +
    +#[cfg(test)]
    +mod tests {
    +    use super::*;
    +
    +    #[test]
    +    fn bytearray_to_hex_formatting() {
    +        assert_eq!(&bytearray_to_hex(&[11u8, 222u8]), "\\x0b\\xde");
    +    }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objbytes.rs.html b/src/rustpython_vm/obj/objbytes.rs.html index 5a596bf..366eb7b 100644 --- a/src/rustpython_vm/obj/objbytes.rs.html +++ b/src/rustpython_vm/obj/objbytes.rs.html @@ -1,4 +1,4 @@ -objbytes.rs.html -- source
      1
    +objbytes.rs.html -- source
      1
       2
       3
       4
    @@ -203,36 +203,47 @@
     203
     204
     205
    -206
    -207
    -208
    -209
    -210
    -211
    -212
    -213
    -214
    -215
    -216
    -217
    -218
    -219
    -220
    -221
    -222
     
    -use super::objint;
    -use super::objtype;
    +use std::cell::Cell;
    +use std::hash::{Hash, Hasher};
    +use std::ops::Deref;
    +
    +use num_traits::ToPrimitive;
    +
    +use crate::function::{OptionalArg, PyFuncArgs};
     use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    +    PyContext, PyIteratorValue, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol,
     };
     use crate::vm::VirtualMachine;
    -use num_traits::ToPrimitive;
    -use std::cell::Ref;
    -use std::cell::RefMut;
    -use std::hash::{Hash, Hasher};
    -use std::ops::Deref;
    -use std::ops::DerefMut;
    +
    +use super::objint;
    +use super::objtype::{self, PyClassRef};
    +
    +#[derive(Debug)]
    +pub struct PyBytes {
    +    value: Vec<u8>,
    +}
    +type PyBytesRef = PyRef<PyBytes>;
    +
    +impl PyBytes {
    +    pub fn new(data: Vec<u8>) -> Self {
    +        PyBytes { value: data }
    +    }
    +}
    +
    +impl Deref for PyBytes {
    +    type Target = [u8];
    +
    +    fn deref(&self) -> &[u8] {
    +        &self.value
    +    }
    +}
    +
    +impl PyValue for PyBytes {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.bytes_type()
    +    }
    +}
     
     // Binary data support
     
    @@ -268,20 +279,14 @@
         );
     }
     
    -fn bytes_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(cls, None)],
    -        optional = [(val_option, None)]
    -    );
    -    if !objtype::issubclass(cls, &vm.ctx.bytes_type()) {
    -        return Err(vm.new_type_error(format!("{:?} is not a subtype of bytes", cls)));
    -    }
    -
    +fn bytes_new(
    +    cls: PyClassRef,
    +    val_option: OptionalArg<PyObjectRef>,
    +    vm: &VirtualMachine,
    +) -> PyResult<PyBytesRef> {
         // Create bytes data:
    -    let value = if let Some(ival) = val_option {
    -        let elements = vm.extract_elements(ival)?;
    +    let value = if let OptionalArg::Present(ival) = val_option {
    +        let elements = vm.extract_elements(&ival)?;
             let mut data_bytes = vec![];
             for elem in elements.iter() {
                 let v = objint::to_int(vm, elem, 10)?;
    @@ -293,10 +298,10 @@
             vec![]
         };
     
    -    Ok(PyObject::new(PyObjectPayload::Bytes { value }, cls.clone()))
    +    PyBytes::new(value).into_ref_with_type(vm, cls)
     }
     
    -fn bytes_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytes_eq(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -311,7 +316,7 @@
         Ok(vm.ctx.new_bool(result))
     }
     
    -fn bytes_ge(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytes_ge(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -321,16 +326,12 @@
         let result = if objtype::isinstance(b, &vm.ctx.bytes_type()) {
             get_value(a).to_vec() >= get_value(b).to_vec()
         } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '>'",
    -            a.borrow(),
    -            b.borrow()
    -        )));
    +        return Err(vm.new_type_error(format!("Cannot compare {} and {} using '>'", a, b)));
         };
         Ok(vm.ctx.new_bool(result))
     }
     
    -fn bytes_gt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytes_gt(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -340,16 +341,12 @@
         let result = if objtype::isinstance(b, &vm.ctx.bytes_type()) {
             get_value(a).to_vec() > get_value(b).to_vec()
         } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '>='",
    -            a.borrow(),
    -            b.borrow()
    -        )));
    +        return Err(vm.new_type_error(format!("Cannot compare {} and {} using '>='", a, b)));
         };
         Ok(vm.ctx.new_bool(result))
     }
     
    -fn bytes_le(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytes_le(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -359,16 +356,12 @@
         let result = if objtype::isinstance(b, &vm.ctx.bytes_type()) {
             get_value(a).to_vec() <= get_value(b).to_vec()
         } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '<'",
    -            a.borrow(),
    -            b.borrow()
    -        )));
    +        return Err(vm.new_type_error(format!("Cannot compare {} and {} using '<'", a, b)));
         };
         Ok(vm.ctx.new_bool(result))
     }
     
    -fn bytes_lt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytes_lt(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -378,23 +371,19 @@
         let result = if objtype::isinstance(b, &vm.ctx.bytes_type()) {
             get_value(a).to_vec() < get_value(b).to_vec()
         } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '<='",
    -            a.borrow(),
    -            b.borrow()
    -        )));
    +        return Err(vm.new_type_error(format!("Cannot compare {} and {} using '<='", a, b)));
         };
         Ok(vm.ctx.new_bool(result))
     }
     
    -fn bytes_len(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytes_len(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(a, Some(vm.ctx.bytes_type()))]);
     
         let byte_vec = get_value(a).to_vec();
         Ok(vm.ctx.new_int(byte_vec.len()))
     }
     
    -fn bytes_hash(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytes_hash(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.bytes_type()))]);
         let data = get_value(zelf);
         let mut hasher = std::collections::hash_map::DefaultHasher::new();
    @@ -404,44 +393,21 @@
     }
     
     pub fn get_value<'a>(obj: &'a PyObjectRef) -> impl Deref<Target = Vec<u8>> + 'a {
    -    Ref::map(obj.borrow(), |py_obj| {
    -        if let PyObjectPayload::Bytes { ref value } = py_obj.payload {
    -            value
    -        } else {
    -            panic!("Inner error getting bytearray {:?}", obj);
    -        }
    -    })
    +    &obj.payload::<PyBytes>().unwrap().value
     }
     
    -pub fn get_mut_value<'a>(obj: &'a PyObjectRef) -> impl DerefMut<Target = Vec<u8>> + 'a {
    -    RefMut::map(obj.borrow_mut(), |py_obj| {
    -        if let PyObjectPayload::Bytes { ref mut value } = py_obj.payload {
    -            value
    -        } else {
    -            panic!("Inner error getting bytearray {:?}", obj);
    -        }
    -    })
    -}
    -
    -fn bytes_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytes_repr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, Some(vm.ctx.bytes_type()))]);
         let value = get_value(obj);
         let data = String::from_utf8(value.to_vec()).unwrap();
         Ok(vm.new_str(format!("b'{}'", data)))
     }
     
    -fn bytes_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(obj, Some(vm.ctx.bytes_type()))]);
    -
    -    let iter_obj = PyObject::new(
    -        PyObjectPayload::Iterator {
    -            position: 0,
    -            iterated_obj: obj.clone(),
    -        },
    -        vm.ctx.iter_type(),
    -    );
    -
    -    Ok(iter_obj)
    +fn bytes_iter(obj: PyBytesRef, _vm: &VirtualMachine) -> PyIteratorValue {
    +    PyIteratorValue {
    +        position: Cell::new(0),
    +        iterated_obj: obj.into_object(),
    +    }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objclassmethod.rs.html b/src/rustpython_vm/obj/objclassmethod.rs.html new file mode 100644 index 0000000..3858497 --- /dev/null +++ b/src/rustpython_vm/obj/objclassmethod.rs.html @@ -0,0 +1,87 @@ +objclassmethod.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +
    +use super::objtype::PyClassRef;
    +use crate::pyobject::{PyContext, PyObjectRef, PyRef, PyResult, PyValue};
    +use crate::vm::VirtualMachine;
    +
    +#[derive(Clone, Debug)]
    +pub struct PyClassMethod {
    +    pub callable: PyObjectRef,
    +}
    +pub type PyClassMethodRef = PyRef<PyClassMethod>;
    +
    +impl PyValue for PyClassMethod {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.classmethod_type()
    +    }
    +}
    +
    +impl PyClassMethodRef {
    +    fn new(
    +        cls: PyClassRef,
    +        callable: PyObjectRef,
    +        vm: &VirtualMachine,
    +    ) -> PyResult<PyClassMethodRef> {
    +        PyClassMethod {
    +            callable: callable.clone(),
    +        }
    +        .into_ref_with_type(vm, cls)
    +    }
    +
    +    fn get(self, _inst: PyObjectRef, owner: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        Ok(vm
    +            .ctx
    +            .new_bound_method(self.callable.clone(), owner.clone()))
    +    }
    +}
    +
    +pub fn init(context: &PyContext) {
    +    let classmethod_type = &context.classmethod_type;
    +    extend_class!(context, classmethod_type, {
    +        "__get__" => context.new_rustfunc(PyClassMethodRef::get),
    +        "__new__" => context.new_rustfunc(PyClassMethodRef::new)
    +    });
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objcode.rs.html b/src/rustpython_vm/obj/objcode.rs.html index 6676776..8862d0c 100644 --- a/src/rustpython_vm/obj/objcode.rs.html +++ b/src/rustpython_vm/obj/objcode.rs.html @@ -1,4 +1,4 @@ -objcode.rs.html -- source
      1
    +objcode.rs.html -- source
      1
       2
       3
       4
    @@ -104,17 +104,53 @@
     104
     105
     106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
     
     /*! Infamous code object. The python class `code`
     
     */
     
    +use std::fmt;
    +
     use crate::bytecode;
    -use crate::pyobject::{
    -    IdProtocol, PyContext, PyFuncArgs, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    -};
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{IdProtocol, PyContext, PyObjectRef, PyResult, PyValue, TypeProtocol};
     use crate::vm::VirtualMachine;
     
    +pub struct PyCode {
    +    code: bytecode::CodeObject,
    +}
    +
    +impl PyCode {
    +    pub fn new(code: bytecode::CodeObject) -> PyCode {
    +        PyCode { code }
    +    }
    +}
    +
    +impl fmt::Debug for PyCode {
    +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    +        write!(f, "code: {:?}", self.code)
    +    }
    +}
    +
    +impl PyValue for PyCode {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.code_type()
    +    }
    +}
    +
     pub fn init(context: &PyContext) {
         let code_type = &context.code_type;
         context.set_attr(code_type, "__new__", context.new_rustfunc(code_new));
    @@ -123,7 +159,7 @@
         for (name, f) in &[
             (
                 "co_argcount",
    -            code_co_argcount as fn(&mut VirtualMachine, PyFuncArgs) -> PyResult,
    +            code_co_argcount as fn(&VirtualMachine, PyFuncArgs) -> PyResult,
             ),
             ("co_consts", code_co_consts),
             ("co_filename", code_co_filename),
    @@ -131,24 +167,24 @@
             ("co_kwonlyargcount", code_co_kwonlyargcount),
             ("co_name", code_co_name),
         ] {
    -        context.set_attr(code_type, name, context.new_member_descriptor(f))
    +        context.set_attr(code_type, name, context.new_property(f))
         }
     }
     
     pub fn get_value(obj: &PyObjectRef) -> bytecode::CodeObject {
    -    if let PyObjectPayload::Code { code } = &obj.borrow().payload {
    -        code.clone()
    +    if let Some(code) = obj.payload::<PyCode>() {
    +        code.code.clone()
         } else {
             panic!("Inner error getting code {:?}", obj)
         }
     }
     
    -fn code_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn code_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(_cls, None)]);
         Err(vm.new_type_error("Cannot directly create code object".to_string()))
     }
     
    -fn code_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn code_repr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(o, Some(vm.ctx.code_type()))]);
     
         let code = get_value(o);
    @@ -162,43 +198,33 @@
         Ok(vm.new_str(repr))
     }
     
    -fn member_code_obj(
    -    vm: &mut VirtualMachine,
    -    args: PyFuncArgs,
    -) -> Result<bytecode::CodeObject, PyObjectRef> {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (zelf, Some(vm.ctx.code_type())),
    -            (_cls, Some(vm.ctx.type_type()))
    -        ]
    -    );
    +fn member_code_obj(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult<bytecode::CodeObject> {
    +    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.code_type()))]);
         Ok(get_value(zelf))
     }
     
    -fn code_co_argcount(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn code_co_argcount(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         let code_obj = member_code_obj(vm, args)?;
         Ok(vm.ctx.new_int(code_obj.arg_names.len()))
     }
     
    -fn code_co_filename(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn code_co_filename(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         let code_obj = member_code_obj(vm, args)?;
         let source_path = code_obj.source_path;
         Ok(vm.new_str(source_path))
     }
     
    -fn code_co_firstlineno(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn code_co_firstlineno(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         let code_obj = member_code_obj(vm, args)?;
         Ok(vm.ctx.new_int(code_obj.first_line_number))
     }
     
    -fn code_co_kwonlyargcount(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn code_co_kwonlyargcount(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         let code_obj = member_code_obj(vm, args)?;
         Ok(vm.ctx.new_int(code_obj.kwonlyarg_names.len()))
     }
     
    -fn code_co_consts(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn code_co_consts(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         let code_obj = member_code_obj(vm, args)?;
         let consts = code_obj
             .get_constants()
    @@ -207,9 +233,9 @@
         Ok(vm.ctx.new_tuple(consts))
     }
     
    -fn code_co_name(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn code_co_name(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         let code_obj = member_code_obj(vm, args)?;
         Ok(vm.new_str(code_obj.obj_name))
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objcomplex.rs.html b/src/rustpython_vm/obj/objcomplex.rs.html index 080eb8a..0316b76 100644 --- a/src/rustpython_vm/obj/objcomplex.rs.html +++ b/src/rustpython_vm/obj/objcomplex.rs.html @@ -1,4 +1,4 @@ -objcomplex.rs.html -- source
      1
    +objcomplex.rs.html -- source
      1
       2
       3
       4
    @@ -187,17 +187,41 @@
     187
     188
     189
    +190
    +191
    +192
    +193
    +194
     
    -use super::objfloat;
    -use super::objint;
    -use super::objtype;
    -use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    -};
    -use crate::vm::VirtualMachine;
     use num_complex::Complex64;
     use num_traits::ToPrimitive;
     
    +use crate::function::{OptionalArg, PyFuncArgs};
    +use crate::pyobject::{PyContext, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
    +use super::objfloat;
    +use super::objint;
    +use super::objtype::{self, PyClassRef};
    +
    +#[derive(Debug, Copy, Clone, PartialEq)]
    +pub struct PyComplex {
    +    value: Complex64,
    +}
    +type PyComplexRef = PyRef<PyComplex>;
    +
    +impl PyValue for PyComplex {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.complex_type()
    +    }
    +}
    +
    +impl From<Complex64> for PyComplex {
    +    fn from(value: Complex64) -> Self {
    +        PyComplex { value }
    +    }
    +}
    +
     pub fn init(context: &PyContext) {
         let complex_type = &context.complex_type;
     
    @@ -235,63 +259,49 @@
     }
     
     pub fn get_value(obj: &PyObjectRef) -> Complex64 {
    -    if let PyObjectPayload::Complex { value } = &obj.borrow().payload {
    -        *value
    -    } else {
    -        panic!("Inner error getting complex");
    -    }
    +    obj.payload::<PyComplex>().unwrap().value
     }
     
    -fn complex_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(cls, None)],
    -        optional = [(real, None), (imag, None)]
    -    );
    -
    -    if !objtype::issubclass(cls, &vm.ctx.complex_type()) {
    -        return Err(vm.new_type_error(format!("{:?} is not a subtype of complex", cls)));
    -    }
    -
    +fn complex_new(
    +    cls: PyClassRef,
    +    real: OptionalArg<PyObjectRef>,
    +    imag: OptionalArg<PyObjectRef>,
    +    vm: &VirtualMachine,
    +) -> PyResult<PyComplexRef> {
         let real = match real {
    -        None => 0.0,
    -        Some(value) => objfloat::make_float(vm, value)?,
    +        OptionalArg::Missing => 0.0,
    +        OptionalArg::Present(ref value) => objfloat::make_float(vm, value)?,
         };
     
         let imag = match imag {
    -        None => 0.0,
    -        Some(value) => objfloat::make_float(vm, value)?,
    +        OptionalArg::Missing => 0.0,
    +        OptionalArg::Present(ref value) => objfloat::make_float(vm, value)?,
         };
     
         let value = Complex64::new(real, imag);
    -
    -    Ok(PyObject::new(
    -        PyObjectPayload::Complex { value },
    -        cls.clone(),
    -    ))
    +    PyComplex { value }.into_ref_with_type(vm, cls)
     }
     
    -fn complex_real(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn complex_real(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.complex_type()))]);
    -    let Complex64 { re, im: _ } = get_value(zelf);
    +    let Complex64 { re, .. } = get_value(zelf);
         Ok(vm.ctx.new_float(re))
     }
     
    -fn complex_imag(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn complex_imag(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.complex_type()))]);
    -    let Complex64 { re: _, im } = get_value(zelf);
    +    let Complex64 { im, .. } = get_value(zelf);
         Ok(vm.ctx.new_float(im))
     }
     
    -fn complex_abs(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn complex_abs(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.complex_type()))]);
     
         let Complex64 { re, im } = get_value(zelf);
         Ok(vm.ctx.new_float(re.hypot(im)))
     }
     
    -fn complex_add(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn complex_add(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -307,11 +317,11 @@
                 v1.im,
             )))
         } else {
    -        Err(vm.new_type_error(format!("Cannot add {} and {}", i.borrow(), i2.borrow())))
    +        Err(vm.new_type_error(format!("Cannot add {} and {}", i, i2)))
         }
     }
     
    -fn complex_radd(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn complex_radd(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -326,18 +336,18 @@
                 v1.im,
             )))
         } else {
    -        Err(vm.new_type_error(format!("Cannot add {} and {}", i.borrow(), i2.borrow())))
    +        Err(vm.new_type_error(format!("Cannot add {} and {}", i, i2)))
         }
     }
     
    -fn complex_conjugate(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn complex_conjugate(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(i, Some(vm.ctx.complex_type()))]);
     
         let v1 = get_value(i);
         Ok(vm.ctx.new_complex(v1.conj()))
     }
     
    -fn complex_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn complex_eq(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -362,12 +372,12 @@
         Ok(vm.ctx.new_bool(result))
     }
     
    -fn complex_neg(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn complex_neg(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.complex_type()))]);
         Ok(vm.ctx.new_complex(-get_value(zelf)))
     }
     
    -fn complex_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn complex_repr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, Some(vm.ctx.complex_type()))]);
         let v = get_value(obj);
         let repr = if v.re == 0. {
    @@ -378,4 +388,4 @@
         Ok(vm.new_str(repr))
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objdict.rs.html b/src/rustpython_vm/obj/objdict.rs.html index f374ca2..7fc7135 100644 --- a/src/rustpython_vm/obj/objdict.rs.html +++ b/src/rustpython_vm/obj/objdict.rs.html @@ -1,4 +1,4 @@ -objdict.rs.html -- source
      1
    +objdict.rs.html -- source
      1
       2
       3
       4
    @@ -314,88 +314,55 @@
     314
     315
     316
    -317
    -318
    -319
    -320
    -321
    -322
    -323
    -324
    -325
    -326
    -327
    -328
    -329
    -330
    -331
    -332
    -333
    -334
    -335
    -336
    -337
    -338
    -339
    -340
    -341
    -342
    -343
    -344
    -345
    -346
    -347
     
    -use super::objiter;
    -use super::objstr;
    -use super::objtype;
    +use std::cell::{Cell, RefCell};
    +use std::collections::HashMap;
    +use std::fmt;
    +use std::ops::{Deref, DerefMut};
    +
    +use crate::function::{OptionalArg, PyFuncArgs};
     use crate::pyobject::{
    -    PyAttributes, PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyResult,
    -    TypeProtocol,
    +    PyAttributes, PyContext, PyIteratorValue, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol,
     };
     use crate::vm::{ReprGuard, VirtualMachine};
    -use std::cell::{Ref, RefCell, RefMut};
    -use std::collections::HashMap;
    -use std::ops::{Deref, DerefMut};
     
    -// This typedef abstracts the actual dict type used.
    -// pub type DictContentType = HashMap<usize, Vec<(PyObjectRef, PyObjectRef)>>;
    -// pub type DictContentType = HashMap<String, PyObjectRef>;
    +use super::objiter;
    +use super::objstr::{self, PyStringRef};
    +use super::objtype;
    +
     pub type DictContentType = HashMap<String, (PyObjectRef, PyObjectRef)>;
    -// pub type DictContentType = HashMap<String, Vec<(PyObjectRef, PyObjectRef)>>;
    -
    -pub fn new(dict_type: PyObjectRef) -> PyObjectRef {
    -    PyObject::new(
    -        PyObjectPayload::Dict {
    -            elements: HashMap::new(),
    -        },
    -        dict_type.clone(),
    -    )
    +
    +#[derive(Default)]
    +pub struct PyDict {
    +    // TODO: should be private
    +    pub entries: RefCell<DictContentType>,
    +}
    +pub type PyDictRef = PyRef<PyDict>;
    +
    +impl fmt::Debug for PyDict {
    +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    +        // TODO: implement more detailed, non-recursive Debug formatter
    +        f.write_str("dict")
    +    }
    +}
    +
    +impl PyValue for PyDict {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.dict_type()
    +    }
     }
     
     pub fn get_elements<'a>(obj: &'a PyObjectRef) -> impl Deref<Target = DictContentType> + 'a {
    -    Ref::map(obj.borrow(), |py_obj| {
    -        if let PyObjectPayload::Dict { ref elements } = py_obj.payload {
    -            elements
    -        } else {
    -            panic!("Cannot extract dict elements");
    -        }
    -    })
    +    obj.payload::<PyDict>().unwrap().entries.borrow()
     }
     
    -fn get_mut_elements<'a>(obj: &'a PyObjectRef) -> impl DerefMut<Target = DictContentType> + 'a {
    -    RefMut::map(obj.borrow_mut(), |py_obj| {
    -        if let PyObjectPayload::Dict { ref mut elements } = py_obj.payload {
    -            elements
    -        } else {
    -            panic!("Cannot extract dict elements");
    -        }
    -    })
    +pub fn get_mut_elements<'a>(obj: &'a PyObjectRef) -> impl DerefMut<Target = DictContentType> + 'a {
    +    obj.payload::<PyDict>().unwrap().entries.borrow_mut()
     }
     
     pub fn set_item(
         dict: &PyObjectRef,
    -    _vm: &mut VirtualMachine,
    +    _vm: &VirtualMachine,
         needle: &PyObjectRef,
         value: &PyObjectRef,
     ) {
    @@ -473,7 +440,7 @@
         attrs
     }
     
    -pub fn attributes_to_py_dict(vm: &mut VirtualMachine, attributes: PyAttributes) -> PyResult {
    +pub fn attributes_to_py_dict(vm: &VirtualMachine, attributes: PyAttributes) -> PyResult {
         let dict = vm.ctx.new_dict();
         for (key, value) in attributes {
             let key = vm.ctx.new_str(key);
    @@ -483,8 +450,7 @@
     }
     
     // Python dict methods:
    -
    -fn dict_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn dict_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -500,7 +466,7 @@
             } else {
                 let iter = objiter::get_iter(vm, dict_obj)?;
                 loop {
    -                fn err(vm: &mut VirtualMachine) -> PyObjectRef {
    +                fn err(vm: &VirtualMachine) -> PyObjectRef {
                         vm.new_type_error("Iterator must have exactly two elements".to_string())
                     }
                     let element = match objiter::get_next_object(vm, &iter)? {
    @@ -524,174 +490,146 @@
         Ok(dict)
     }
     
    -fn dict_len(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(dict_obj, Some(vm.ctx.dict_type()))]);
    -    let elements = get_elements(dict_obj);
    -    Ok(vm.ctx.new_int(elements.len()))
    -}
    +impl PyDictRef {
    +    fn len(self, _vm: &VirtualMachine) -> usize {
    +        self.entries.borrow().len()
    +    }
     
    -fn dict_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(dict_obj, Some(vm.ctx.dict_type()))]);
    -
    -    let s = if let Some(_guard) = ReprGuard::enter(dict_obj) {
    -        let elements = get_key_value_pairs(dict_obj);
    -        let mut str_parts = vec![];
    -        for (key, value) in elements {
    -            let key_repr = vm.to_repr(&key)?;
    -            let value_repr = vm.to_repr(&value)?;
    -            let key_str = objstr::get_value(&key_repr);
    -            let value_str = objstr::get_value(&value_repr);
    -            str_parts.push(format!("{}: {}", key_str, value_str));
    -        }
    +    fn repr(self, vm: &VirtualMachine) -> PyResult {
    +        let s = if let Some(_guard) = ReprGuard::enter(self.as_object()) {
    +            let elements = get_key_value_pairs(self.as_object());
    +            let mut str_parts = vec![];
    +            for (key, value) in elements {
    +                let key_repr = vm.to_repr(&key)?;
    +                let value_repr = vm.to_repr(&value)?;
    +                str_parts.push(format!("{}: {}", key_repr.value, value_repr.value));
    +            }
     
    -        format!("{{{}}}", str_parts.join(", "))
    -    } else {
    -        "{...}".to_string()
    -    };
    -    Ok(vm.new_str(s))
    -}
    +            format!("{{{}}}", str_parts.join(", "))
    +        } else {
    +            "{...}".to_string()
    +        };
    +        Ok(vm.new_str(s))
    +    }
     
    -pub fn dict_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (dict, Some(vm.ctx.dict_type())),
    -            (needle, Some(vm.ctx.str_type()))
    -        ]
    -    );
    +    fn contains(self, key: PyStringRef, _vm: &VirtualMachine) -> bool {
    +        self.entries.borrow().contains_key(&key.value)
    +    }
     
    -    let needle = objstr::get_value(&needle);
    -    for element in get_elements(dict).iter() {
    -        if &needle == element.0 {
    -            return Ok(vm.new_bool(true));
    +    fn delitem(self, key: PyStringRef, vm: &VirtualMachine) -> PyResult<()> {
    +        let key = &key.value;
    +        // Delete the item:
    +        let mut elements = self.entries.borrow_mut();
    +        match elements.remove(key) {
    +            Some(_) => Ok(()),
    +            None => Err(vm.new_value_error(format!("Key not found: {}", key))),
             }
         }
     
    -    Ok(vm.new_bool(false))
    -}
    -
    -fn dict_delitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (dict, Some(vm.ctx.dict_type())),
    -            (needle, Some(vm.ctx.str_type()))
    -        ]
    -    );
    -
    -    // What we are looking for:
    -    let needle = objstr::get_value(&needle);
    -
    -    // Delete the item:
    -    let mut elements = get_mut_elements(dict);
    -    match elements.remove(&needle) {
    -        Some(_) => Ok(vm.get_none()),
    -        None => Err(vm.new_value_error(format!("Key not found: {}", needle))),
    +    fn clear(self, _vm: &VirtualMachine) {
    +        self.entries.borrow_mut().clear()
         }
    -}
    -
    -fn dict_clear(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(dict, Some(vm.ctx.dict_type()))]);
    -    get_mut_elements(dict).clear();
    -    Ok(vm.get_none())
    -}
    -
    -/// When iterating over a dictionary, we iterate over the keys of it.
    -fn dict_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(dict, Some(vm.ctx.dict_type()))]);
    -
    -    let keys = get_elements(dict)
    -        .keys()
    -        .map(|k| vm.ctx.new_str(k.to_string()))
    -        .collect();
    -    let key_list = vm.ctx.new_list(keys);
     
    -    let iter_obj = PyObject::new(
    -        PyObjectPayload::Iterator {
    -            position: 0,
    +    /// When iterating over a dictionary, we iterate over the keys of it.
    +    fn iter(self, vm: &VirtualMachine) -> PyIteratorValue {
    +        let keys = self
    +            .entries
    +            .borrow()
    +            .values()
    +            .map(|(k, _v)| k.clone())
    +            .collect();
    +        let key_list = vm.ctx.new_list(keys);
    +
    +        PyIteratorValue {
    +            position: Cell::new(0),
                 iterated_obj: key_list,
    -        },
    -        vm.ctx.iter_type(),
    -    );
    -
    -    Ok(iter_obj)
    -}
    -
    -fn dict_setitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (dict, Some(vm.ctx.dict_type())),
    -            (needle, Some(vm.ctx.str_type())),
    -            (value, None)
    -        ]
    -    );
    +        }
    +    }
     
    -    set_item(dict, vm, needle, value);
    +    fn values(self, vm: &VirtualMachine) -> PyIteratorValue {
    +        let values = self
    +            .entries
    +            .borrow()
    +            .values()
    +            .map(|(_k, v)| v.clone())
    +            .collect();
    +        let values_list = vm.ctx.new_list(values);
    +
    +        PyIteratorValue {
    +            position: Cell::new(0),
    +            iterated_obj: values_list,
    +        }
    +    }
     
    -    Ok(vm.get_none())
    -}
    +    fn items(self, vm: &VirtualMachine) -> PyIteratorValue {
    +        let items = self
    +            .entries
    +            .borrow()
    +            .values()
    +            .map(|(k, v)| vm.ctx.new_tuple(vec![k.clone(), v.clone()]))
    +            .collect();
    +        let items_list = vm.ctx.new_list(items);
    +
    +        PyIteratorValue {
    +            position: Cell::new(0),
    +            iterated_obj: items_list,
    +        }
    +    }
     
    -fn dict_getitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (dict, Some(vm.ctx.dict_type())),
    -            (needle, Some(vm.ctx.str_type()))
    -        ]
    -    );
    +    fn setitem(self, needle: PyObjectRef, value: PyObjectRef, _vm: &VirtualMachine) {
    +        let mut elements = self.entries.borrow_mut();
    +        set_item_in_content(&mut elements, &needle, &value)
    +    }
     
    -    // What we are looking for:
    -    let needle = objstr::get_value(&needle);
    +    fn getitem(self, key: PyStringRef, vm: &VirtualMachine) -> PyResult {
    +        let key = &key.value;
     
    -    let elements = get_elements(dict);
    -    if elements.contains_key(&needle) {
    -        Ok(elements[&needle].1.clone())
    -    } else {
    -        Err(vm.new_value_error(format!("Key not found: {}", needle)))
    +        // What we are looking for:
    +        let elements = self.entries.borrow();
    +        if elements.contains_key(key) {
    +            Ok(elements[key].1.clone())
    +        } else {
    +            Err(vm.new_value_error(format!("Key not found: {}", key)))
    +        }
         }
    -}
     
    -pub fn create_type(type_type: PyObjectRef, object_type: PyObjectRef, dict_type: PyObjectRef) {
    -    (*dict_type.borrow_mut()).payload = PyObjectPayload::Class {
    -        name: String::from("dict"),
    -        dict: RefCell::new(HashMap::new()),
    -        mro: vec![object_type],
    -    };
    -    (*dict_type.borrow_mut()).typ = Some(type_type.clone());
    +    fn get(
    +        self,
    +        key: PyStringRef,
    +        default: OptionalArg<PyObjectRef>,
    +        vm: &VirtualMachine,
    +    ) -> PyObjectRef {
    +        // What we are looking for:
    +        let key = &key.value;
    +
    +        let elements = self.entries.borrow();
    +        if elements.contains_key(key) {
    +            elements[key].1.clone()
    +        } else {
    +            match default {
    +                OptionalArg::Present(value) => value,
    +                OptionalArg::Missing => vm.ctx.none(),
    +            }
    +        }
    +    }
     }
     
     pub fn init(context: &PyContext) {
    -    let dict_type = &context.dict_type;
    -    context.set_attr(&dict_type, "__len__", context.new_rustfunc(dict_len));
    -    context.set_attr(
    -        &dict_type,
    -        "__contains__",
    -        context.new_rustfunc(dict_contains),
    -    );
    -    context.set_attr(
    -        &dict_type,
    -        "__delitem__",
    -        context.new_rustfunc(dict_delitem),
    -    );
    -    context.set_attr(
    -        &dict_type,
    -        "__getitem__",
    -        context.new_rustfunc(dict_getitem),
    -    );
    -    context.set_attr(&dict_type, "__iter__", context.new_rustfunc(dict_iter));
    -    context.set_attr(&dict_type, "__new__", context.new_rustfunc(dict_new));
    -    context.set_attr(&dict_type, "__repr__", context.new_rustfunc(dict_repr));
    -    context.set_attr(
    -        &dict_type,
    -        "__setitem__",
    -        context.new_rustfunc(dict_setitem),
    -    );
    -    context.set_attr(&dict_type, "clear", context.new_rustfunc(dict_clear));
    +    extend_class!(context, &context.dict_type, {
    +        "__len__" => context.new_rustfunc(PyDictRef::len),
    +        "__contains__" => context.new_rustfunc(PyDictRef::contains),
    +        "__delitem__" => context.new_rustfunc(PyDictRef::delitem),
    +        "__getitem__" => context.new_rustfunc(PyDictRef::getitem),
    +        "__iter__" => context.new_rustfunc(PyDictRef::iter),
    +        "__new__" => context.new_rustfunc(dict_new),
    +        "__repr__" => context.new_rustfunc(PyDictRef::repr),
    +        "__setitem__" => context.new_rustfunc(PyDictRef::setitem),
    +        "clear" => context.new_rustfunc(PyDictRef::clear),
    +        "values" => context.new_rustfunc(PyDictRef::values),
    +        "items" => context.new_rustfunc(PyDictRef::items),
    +        "keys" => context.new_rustfunc(PyDictRef::iter),
    +        "get" => context.new_rustfunc(PyDictRef::get),
    +    });
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objellipsis.rs.html b/src/rustpython_vm/obj/objellipsis.rs.html new file mode 100644 index 0000000..cf51849 --- /dev/null +++ b/src/rustpython_vm/obj/objellipsis.rs.html @@ -0,0 +1,49 @@ +objellipsis.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{PyContext, PyResult, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
    +pub fn init(context: &PyContext) {
    +    let ellipsis_type = &context.ellipsis_type;
    +    context.set_attr(ellipsis_type, "__new__", context.new_rustfunc(ellipsis_new));
    +    context.set_attr(
    +        ellipsis_type,
    +        "__repr__",
    +        context.new_rustfunc(ellipsis_repr),
    +    );
    +}
    +
    +fn ellipsis_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(_cls, None)]);
    +    Ok(vm.ctx.ellipsis())
    +}
    +
    +fn ellipsis_repr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(_cls, None)]);
    +    Ok(vm.new_str("Ellipsis".to_string()))
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objenumerate.rs.html b/src/rustpython_vm/obj/objenumerate.rs.html index d847839..8c2e04e 100644 --- a/src/rustpython_vm/obj/objenumerate.rs.html +++ b/src/rustpython_vm/obj/objenumerate.rs.html @@ -1,4 +1,4 @@ -objenumerate.rs.html -- source
     1
    +objenumerate.rs.html -- source
     1
      2
      3
      4
    @@ -64,52 +64,90 @@
     64
     65
     66
    +67
    +68
    +69
    +70
    +71
    +72
    +73
    +74
    +75
    +76
    +77
    +78
    +79
    +80
    +81
    +82
    +83
    +84
    +85
     
    -use super::objint;
    -use super::objiter;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyResult, TypeProtocol};
    -use crate::vm::VirtualMachine;
    +use std::cell::RefCell;
    +use std::ops::AddAssign;
    +
     use num_bigint::BigInt;
     use num_traits::Zero;
    -use std::ops::AddAssign;
     
    -fn enumerate_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(cls, Some(vm.ctx.type_type())), (iterable, None)],
    -        optional = [(start, Some(vm.ctx.int_type()))]
    -    );
    -    let counter = if let Some(x) = start {
    -        objint::get_value(x)
    -    } else {
    -        BigInt::zero()
    +use crate::function::{OptionalArg, PyFuncArgs};
    +use crate::pyobject::{PyContext, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
    +use super::objint::PyIntRef;
    +use super::objiter;
    +use super::objtype::PyClassRef;
    +
    +#[derive(Debug)]
    +pub struct PyEnumerate {
    +    counter: RefCell<BigInt>,
    +    iterator: PyObjectRef,
    +}
    +type PyEnumerateRef = PyRef<PyEnumerate>;
    +
    +impl PyValue for PyEnumerate {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.enumerate_type()
    +    }
    +}
    +
    +fn enumerate_new(
    +    cls: PyClassRef,
    +    iterable: PyObjectRef,
    +    start: OptionalArg<PyIntRef>,
    +    vm: &VirtualMachine,
    +) -> PyResult<PyEnumerateRef> {
    +    let counter = match start {
    +        OptionalArg::Present(start) => start.value.clone(),
    +        OptionalArg::Missing => BigInt::zero(),
         };
    -    let iterator = objiter::get_iter(vm, iterable)?;
    -    Ok(PyObject::new(
    -        PyObjectPayload::EnumerateIterator { counter, iterator },
    -        cls.clone(),
    -    ))
    +
    +    let iterator = objiter::get_iter(vm, &iterable)?;
    +    PyEnumerate {
    +        counter: RefCell::new(counter.clone()),
    +        iterator,
    +    }
    +    .into_ref_with_type(vm, cls)
     }
     
    -fn enumerate_next(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn enumerate_next(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
             required = [(enumerate, Some(vm.ctx.enumerate_type()))]
         );
     
    -    if let PyObjectPayload::EnumerateIterator {
    -        ref mut counter,
    -        ref mut iterator,
    -    } = enumerate.borrow_mut().payload
    +    if let Some(PyEnumerate {
    +        ref counter,
    +        ref iterator,
    +    }) = enumerate.payload()
         {
             let next_obj = objiter::call_next(vm, iterator)?;
             let result = vm
                 .ctx
    -            .new_tuple(vec![vm.ctx.new_int(counter.clone()), next_obj]);
    +            .new_tuple(vec![vm.ctx.new_int(counter.borrow().clone()), next_obj]);
     
    -        AddAssign::add_assign(counter, 1);
    +        AddAssign::add_assign(&mut counter.borrow_mut() as &mut BigInt, 1);
     
             Ok(result)
         } else {
    @@ -132,4 +170,4 @@
         );
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objfilter.rs.html b/src/rustpython_vm/obj/objfilter.rs.html index d4ebdf6..1ffffe6 100644 --- a/src/rustpython_vm/obj/objfilter.rs.html +++ b/src/rustpython_vm/obj/objfilter.rs.html @@ -1,4 +1,4 @@ -objfilter.rs.html -- source
     1
    +objfilter.rs.html -- source
     1
      2
      3
      4
    @@ -71,15 +71,35 @@
     71
     72
     73
    +74
    +75
    +76
    +77
    +78
    +79
     
    -use super::objbool;
    -use super::objiter;
    +use crate::function::PyFuncArgs;
     use crate::pyobject::{
    -    IdProtocol, PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyResult, TypeProtocol,
    +    IdProtocol, PyContext, PyObject, PyObjectRef, PyResult, PyValue, TypeProtocol,
     };
     use crate::vm::VirtualMachine; // Required for arg_check! to use isinstance
     
    -fn filter_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +use super::objbool;
    +use super::objiter;
    +
    +#[derive(Debug)]
    +pub struct PyFilter {
    +    predicate: PyObjectRef,
    +    iterator: PyObjectRef,
    +}
    +
    +impl PyValue for PyFilter {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.filter_type()
    +    }
    +}
    +
    +fn filter_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -87,7 +107,7 @@
         );
         let iterator = objiter::get_iter(vm, iterable)?;
         Ok(PyObject::new(
    -        PyObjectPayload::FilterIterator {
    +        PyFilter {
                 predicate: function.clone(),
                 iterator,
             },
    @@ -95,13 +115,13 @@
         ))
     }
     
    -fn filter_next(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn filter_next(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(filter, Some(vm.ctx.filter_type()))]);
     
    -    if let PyObjectPayload::FilterIterator {
    -        ref mut predicate,
    -        ref mut iterator,
    -    } = filter.borrow_mut().payload
    +    if let Some(PyFilter {
    +        ref predicate,
    +        ref iterator,
    +    }) = filter.payload()
         {
             loop {
                 let next_obj = objiter::call_next(vm, iterator)?;
    @@ -110,13 +130,7 @@
                 } else {
                     // the predicate itself can raise StopIteration which does stop the filter
                     // iteration
    -                vm.invoke(
    -                    predicate.clone(),
    -                    PyFuncArgs {
    -                        args: vec![next_obj.clone()],
    -                        kwargs: vec![],
    -                    },
    -                )?
    +                vm.invoke(predicate.clone(), vec![next_obj.clone()])?
                 };
                 if objbool::boolval(vm, predicate_value)? {
                     return Ok(next_obj);
    @@ -137,13 +151,11 @@
              Return an iterator yielding those items of iterable for which function(item)\n\
              is true. If function is None, return the items that are true.";
     
    -    context.set_attr(&filter_type, "__new__", context.new_rustfunc(filter_new));
    -    context.set_attr(
    -        &filter_type,
    -        "__doc__",
    -        context.new_str(filter_doc.to_string()),
    -    );
    -    context.set_attr(&filter_type, "__next__", context.new_rustfunc(filter_next));
    +    extend_class!(context, filter_type, {
    +        "__new__" => context.new_rustfunc(filter_new),
    +        "__doc__" => context.new_str(filter_doc.to_string()),
    +        "__next__" => context.new_rustfunc(filter_next)
    +    });
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objfloat.rs.html b/src/rustpython_vm/obj/objfloat.rs.html index cf525c5..f9f1853 100644 --- a/src/rustpython_vm/obj/objfloat.rs.html +++ b/src/rustpython_vm/obj/objfloat.rs.html @@ -1,4 +1,4 @@ -objfloat.rs.html -- source
      1
    +objfloat.rs.html -- source
      1
       2
       3
       4
    @@ -382,596 +382,390 @@
     382
     383
     384
    -385
    -386
    -387
    -388
    -389
    -390
    -391
    -392
    -393
    -394
    -395
    -396
    -397
    -398
    -399
    -400
    -401
    -402
    -403
    -404
    -405
    -406
    -407
    -408
    -409
    -410
    -411
    -412
    -413
    -414
    -415
    -416
    -417
    -418
    -419
    -420
    -421
    -422
    -423
    -424
    -425
    -426
    -427
    -428
    -429
    -430
    -431
    -432
    -433
    -434
    -435
    -436
    -437
    -438
    -439
    -440
    -441
    -442
    -443
    -444
    -445
    -446
    -447
    -448
    -449
    -450
    -451
    -452
    -453
    -454
    -455
    -456
    -457
    -458
    -459
    -460
    -461
    -462
    -463
    -464
    -465
    -466
    -467
    -468
    -469
    -470
    -471
    -472
    -473
    -474
    -475
    -476
    -477
    -478
    -479
    -480
    -481
    -482
    -483
    -484
    -485
    -486
    -487
     
     use super::objbytes;
     use super::objint;
     use super::objstr;
     use super::objtype;
     use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    +    IntoPyObject, PyContext, PyObject, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol,
     };
     use crate::vm::VirtualMachine;
     use num_bigint::ToBigInt;
    +use num_rational::Ratio;
     use num_traits::ToPrimitive;
     
    -fn float_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(float, Some(vm.ctx.float_type()))]);
    -    let v = get_value(float);
    -    Ok(vm.new_str(v.to_string()))
    +#[derive(Debug, Copy, Clone, PartialEq)]
    +pub struct PyFloat {
    +    value: f64,
     }
     
    -// __init__()
    -fn float_init(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.float_type())), (arg, None)]
    -    );
    -    let val = if objtype::isinstance(arg, &vm.ctx.float_type()) {
    -        get_value(arg)
    -    } else if objtype::isinstance(arg, &vm.ctx.int_type()) {
    -        match objint::get_value(arg).to_f64() {
    -            Some(f) => f,
    -            None => {
    -                return Err(vm.new_overflow_error("int too large to convert to float".to_string()));
    -            }
    -        }
    -    } else if objtype::isinstance(arg, &vm.ctx.str_type()) {
    -        match lexical::try_parse(objstr::get_value(arg)) {
    -            Ok(f) => f,
    -            Err(_) => {
    -                let arg_repr = vm.to_pystr(arg)?;
    -                return Err(
    -                    vm.new_value_error(format!("could not convert string to float: {}", arg_repr))
    -                );
    -            }
    -        }
    -    } else if objtype::isinstance(arg, &vm.ctx.bytes_type()) {
    -        match lexical::try_parse(objbytes::get_value(arg).as_slice()) {
    -            Ok(f) => f,
    -            Err(_) => {
    -                let arg_repr = vm.to_pystr(arg)?;
    -                return Err(
    -                    vm.new_value_error(format!("could not convert string to float: {}", arg_repr))
    -                );
    -            }
    -        }
    -    } else {
    -        let type_name = objtype::get_type_name(&arg.typ());
    -        return Err(vm.new_type_error(format!("can't convert {} to float", type_name)));
    -    };
    -    set_value(zelf, val);
    -    Ok(vm.get_none())
    +impl PyValue for PyFloat {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.float_type()
    +    }
     }
     
    -// Retrieve inner float value:
    -pub fn get_value(obj: &PyObjectRef) -> f64 {
    -    if let PyObjectPayload::Float { value } = &obj.borrow().payload {
    -        *value
    -    } else {
    -        panic!("Inner error getting float");
    +impl IntoPyObject for f64 {
    +    fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
    +        Ok(vm.ctx.new_float(self))
         }
     }
     
    -pub fn make_float(vm: &mut VirtualMachine, obj: &PyObjectRef) -> Result<f64, PyObjectRef> {
    -    if objtype::isinstance(obj, &vm.ctx.float_type()) {
    -        Ok(get_value(obj))
    -    } else if let Ok(method) = vm.get_method(obj.clone(), "__float__") {
    -        let res = vm.invoke(
    -            method,
    -            PyFuncArgs {
    -                args: vec![],
    -                kwargs: vec![],
    -            },
    -        )?;
    -        Ok(get_value(&res))
    -    } else {
    -        Err(vm.new_type_error(format!("Cannot cast {} to float", obj.borrow())))
    +impl From<f64> for PyFloat {
    +    fn from(value: f64) -> Self {
    +        PyFloat { value }
         }
     }
     
    -fn set_value(obj: &PyObjectRef, value: f64) {
    -    obj.borrow_mut().payload = PyObjectPayload::Float { value };
    -}
    +pub type PyFloatRef = PyRef<PyFloat>;
    +
    +impl PyFloatRef {
    +    fn eq(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        let value = self.value;
    +        let result = if objtype::isinstance(&other, &vm.ctx.float_type()) {
    +            let other = get_value(&other);
    +            value == other
    +        } else if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            let other_int = objint::get_value(&other);
    +
    +            if let (Some(self_int), Some(other_float)) = (value.to_bigint(), other_int.to_f64()) {
    +                value == other_float && self_int == *other_int
    +            } else {
    +                false
    +            }
    +        } else {
    +            return vm.ctx.not_implemented();
    +        };
    +        vm.ctx.new_bool(result)
    +    }
     
    -fn float_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.float_type())), (other, None)]
    -    );
    -    let zelf = get_value(zelf);
    -    let result = if objtype::isinstance(other, &vm.ctx.float_type()) {
    -        let other = get_value(other);
    -        zelf == other
    -    } else if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        let other_int = objint::get_value(other);
    -
    -        if let (Some(zelf_int), Some(other_float)) = (zelf.to_bigint(), other_int.to_f64()) {
    -            zelf == other_float && zelf_int == other_int
    +    fn lt(self, i2: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        let v1 = self.value;
    +        if objtype::isinstance(&i2, &vm.ctx.float_type()) {
    +            vm.ctx.new_bool(v1 < get_value(&i2))
    +        } else if objtype::isinstance(&i2, &vm.ctx.int_type()) {
    +            vm.ctx
    +                .new_bool(v1 < objint::get_value(&i2).to_f64().unwrap())
             } else {
    -            false
    +            vm.ctx.not_implemented()
             }
    -    } else {
    -        return Ok(vm.ctx.not_implemented());
    -    };
    -    Ok(vm.ctx.new_bool(result))
    -}
    +    }
     
    -fn float_lt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.float_type())), (i2, None)]
    -    );
    -
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.float_type()) {
    -        Ok(vm.ctx.new_bool(v1 < get_value(i2)))
    -    } else if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        Ok(vm
    -            .ctx
    -            .new_bool(v1 < objint::get_value(i2).to_f64().unwrap()))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn le(self, i2: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        let v1 = self.value;
    +        if objtype::isinstance(&i2, &vm.ctx.float_type()) {
    +            vm.ctx.new_bool(v1 <= get_value(&i2))
    +        } else if objtype::isinstance(&i2, &vm.ctx.int_type()) {
    +            vm.ctx
    +                .new_bool(v1 <= objint::get_value(&i2).to_f64().unwrap())
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
         }
    -}
     
    -fn float_le(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.float_type())), (i2, None)]
    -    );
    -
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.float_type()) {
    -        Ok(vm.ctx.new_bool(v1 <= get_value(i2)))
    -    } else if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        Ok(vm
    -            .ctx
    -            .new_bool(v1 <= objint::get_value(i2).to_f64().unwrap()))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn gt(self, i2: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        let v1 = self.value;
    +        if objtype::isinstance(&i2, &vm.ctx.float_type()) {
    +            vm.ctx.new_bool(v1 > get_value(&i2))
    +        } else if objtype::isinstance(&i2, &vm.ctx.int_type()) {
    +            vm.ctx
    +                .new_bool(v1 > objint::get_value(&i2).to_f64().unwrap())
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
         }
    -}
     
    -fn float_gt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.float_type())), (i2, None)]
    -    );
    -
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.float_type()) {
    -        Ok(vm.ctx.new_bool(v1 > get_value(i2)))
    -    } else if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        Ok(vm
    -            .ctx
    -            .new_bool(v1 > objint::get_value(i2).to_f64().unwrap()))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn ge(self, i2: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        let v1 = self.value;
    +        if objtype::isinstance(&i2, &vm.ctx.float_type()) {
    +            vm.ctx.new_bool(v1 >= get_value(&i2))
    +        } else if objtype::isinstance(&i2, &vm.ctx.int_type()) {
    +            vm.ctx
    +                .new_bool(v1 >= objint::get_value(&i2).to_f64().unwrap())
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
         }
    -}
     
    -fn float_ge(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.float_type())), (i2, None)]
    -    );
    -
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.float_type()) {
    -        Ok(vm.ctx.new_bool(v1 >= get_value(i2)))
    -    } else if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        Ok(vm
    -            .ctx
    -            .new_bool(v1 >= objint::get_value(i2).to_f64().unwrap()))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn abs(self, _vm: &VirtualMachine) -> f64 {
    +        self.value.abs()
         }
    -}
     
    -fn float_abs(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.float_type()))]);
    -    Ok(vm.ctx.new_float(get_value(i).abs()))
    -}
    +    fn add(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        let v1 = self.value;
    +        if objtype::isinstance(&other, &vm.ctx.float_type()) {
    +            vm.ctx.new_float(v1 + get_value(&other))
    +        } else if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx
    +                .new_float(v1 + objint::get_value(&other).to_f64().unwrap())
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
    +    }
     
    -fn float_add(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.float_type())), (other, None)]
    -    );
    -
    -    let v1 = get_value(zelf);
    -    if objtype::isinstance(other, &vm.ctx.float_type()) {
    -        Ok(vm.ctx.new_float(v1 + get_value(other)))
    -    } else if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        Ok(vm
    -            .ctx
    -            .new_float(v1 + objint::get_value(other).to_f64().unwrap()))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn divmod(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.float_type())
    +            || objtype::isinstance(&other, &vm.ctx.int_type())
    +        {
    +            let r1 = PyFloatRef::floordiv(self.clone(), other.clone(), vm)?;
    +            let r2 = PyFloatRef::mod_(self, other, vm)?;
    +            Ok(vm.ctx.new_tuple(vec![r1, r2]))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
         }
    -}
     
    -fn float_radd(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    float_add(vm, args)
    -}
    +    fn floordiv(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        let v1 = self.value;
    +        let v2 = if objtype::isinstance(&other, &vm.ctx.float_type) {
    +            get_value(&other)
    +        } else if objtype::isinstance(&other, &vm.ctx.int_type) {
    +            objint::get_value(&other).to_f64().ok_or_else(|| {
    +                vm.new_overflow_error("int too large to convert to float".to_string())
    +            })?
    +        } else {
    +            return Ok(vm.ctx.not_implemented());
    +        };
     
    -fn float_divmod(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.float_type())), (i2, None)]
    -    );
    -    let args = PyFuncArgs::new(vec![i.clone(), i2.clone()], vec![]);
    -    if objtype::isinstance(i2, &vm.ctx.float_type()) || objtype::isinstance(i2, &vm.ctx.int_type())
    -    {
    -        let r1 = float_floordiv(vm, args.clone())?;
    -        let r2 = float_mod(vm, args.clone())?;
    -        Ok(vm.ctx.new_tuple(vec![r1, r2]))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +        if v2 != 0.0 {
    +            Ok(vm.ctx.new_float((v1 / v2).floor()))
    +        } else {
    +            Err(vm.new_zero_division_error("float floordiv by zero".to_string()))
    +        }
         }
    -}
     
    -fn float_floordiv(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.float_type())), (i2, None)]
    -    );
    -
    -    let v1 = get_value(i);
    -    let v2 = if objtype::isinstance(i2, &vm.ctx.float_type) {
    -        get_value(i2)
    -    } else if objtype::isinstance(i2, &vm.ctx.int_type) {
    -        objint::get_value(i2)
    -            .to_f64()
    -            .ok_or_else(|| vm.new_overflow_error("int too large to convert to float".to_string()))?
    -    } else {
    -        return Ok(vm.ctx.not_implemented());
    -    };
    +    fn new_float(cls: PyObjectRef, arg: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        let value = if objtype::isinstance(&arg, &vm.ctx.float_type()) {
    +            get_value(&arg)
    +        } else if objtype::isinstance(&arg, &vm.ctx.int_type()) {
    +            match objint::get_value(&arg).to_f64() {
    +                Some(f) => f,
    +                None => {
    +                    return Err(
    +                        vm.new_overflow_error("int too large to convert to float".to_string())
    +                    );
    +                }
    +            }
    +        } else if objtype::isinstance(&arg, &vm.ctx.str_type()) {
    +            match lexical::try_parse(objstr::get_value(&arg)) {
    +                Ok(f) => f,
    +                Err(_) => {
    +                    let arg_repr = vm.to_pystr(&arg)?;
    +                    return Err(vm.new_value_error(format!(
    +                        "could not convert string to float: {}",
    +                        arg_repr
    +                    )));
    +                }
    +            }
    +        } else if objtype::isinstance(&arg, &vm.ctx.bytes_type()) {
    +            match lexical::try_parse(objbytes::get_value(&arg).as_slice()) {
    +                Ok(f) => f,
    +                Err(_) => {
    +                    let arg_repr = vm.to_pystr(&arg)?;
    +                    return Err(vm.new_value_error(format!(
    +                        "could not convert string to float: {}",
    +                        arg_repr
    +                    )));
    +                }
    +            }
    +        } else {
    +            let type_name = objtype::get_type_name(&arg.typ());
    +            return Err(vm.new_type_error(format!("can't convert {} to float", type_name)));
    +        };
    +        Ok(PyObject::new(PyFloat { value }, cls.clone()))
    +    }
     
    -    if v2 != 0.0 {
    -        Ok(vm.ctx.new_float((v1 / v2).floor()))
    -    } else {
    -        Err(vm.new_zero_division_error("float floordiv by zero".to_string()))
    +    fn mod_(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        let v1 = self.value;
    +        let v2 = if objtype::isinstance(&other, &vm.ctx.float_type) {
    +            get_value(&other)
    +        } else if objtype::isinstance(&other, &vm.ctx.int_type) {
    +            objint::get_value(&other).to_f64().ok_or_else(|| {
    +                vm.new_overflow_error("int too large to convert to float".to_string())
    +            })?
    +        } else {
    +            return Ok(vm.ctx.not_implemented());
    +        };
    +
    +        if v2 != 0.0 {
    +            Ok(vm.ctx.new_float(v1 % v2))
    +        } else {
    +            Err(vm.new_zero_division_error("float mod by zero".to_string()))
    +        }
         }
    -}
     
    -fn float_sub(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.float_type())), (other, None)]
    -    );
    -    let v1 = get_value(zelf);
    -    if objtype::isinstance(other, &vm.ctx.float_type()) {
    -        Ok(vm.ctx.new_float(v1 - get_value(other)))
    -    } else if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        Ok(vm
    -            .ctx
    -            .new_float(v1 - objint::get_value(other).to_f64().unwrap()))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn neg(self, _vm: &VirtualMachine) -> f64 {
    +        -self.value
         }
    -}
     
    -fn float_rsub(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.float_type())), (other, None)]
    -    );
    -    let v1 = get_value(zelf);
    -    if objtype::isinstance(other, &vm.ctx.float_type()) {
    -        Ok(vm.ctx.new_float(get_value(other) - v1))
    -    } else if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        Ok(vm
    -            .ctx
    -            .new_float(objint::get_value(other).to_f64().unwrap() - v1))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn pow(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        let v1 = self.value;
    +        if objtype::isinstance(&other, &vm.ctx.float_type()) {
    +            vm.ctx.new_float(v1.powf(get_value(&other)))
    +        } else if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            let result = v1.powf(objint::get_value(&other).to_f64().unwrap());
    +            vm.ctx.new_float(result)
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
         }
    -}
     
    -fn float_mod(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.float_type())), (i2, None)]
    -    );
    -
    -    let v1 = get_value(i);
    -    let v2 = if objtype::isinstance(i2, &vm.ctx.float_type) {
    -        get_value(i2)
    -    } else if objtype::isinstance(i2, &vm.ctx.int_type) {
    -        objint::get_value(i2)
    -            .to_f64()
    -            .ok_or_else(|| vm.new_overflow_error("int too large to convert to float".to_string()))?
    -    } else {
    -        return Ok(vm.ctx.not_implemented());
    -    };
    +    fn sub(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        let v1 = self.value;
    +        if objtype::isinstance(&other, &vm.ctx.float_type()) {
    +            Ok(vm.ctx.new_float(v1 - get_value(&other)))
    +        } else if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            Ok(vm
    +                .ctx
    +                .new_float(v1 - objint::get_value(&other).to_f64().unwrap()))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -    if v2 != 0.0 {
    -        Ok(vm.ctx.new_float(v1 % v2))
    -    } else {
    -        Err(vm.new_zero_division_error("float mod by zero".to_string()))
    +    fn rsub(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        let v1 = self.value;
    +        if objtype::isinstance(&other, &vm.ctx.float_type()) {
    +            Ok(vm.ctx.new_float(get_value(&other) - v1))
    +        } else if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            Ok(vm
    +                .ctx
    +                .new_float(objint::get_value(&other).to_f64().unwrap() - v1))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
         }
    -}
     
    -fn float_neg(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.float_type()))]);
    +    fn repr(self, _vm: &VirtualMachine) -> String {
    +        self.value.to_string()
    +    }
     
    -    let v1 = get_value(i);
    -    Ok(vm.ctx.new_float(-v1))
    -}
    +    fn truediv(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        let v1 = self.value;
    +        let v2 = if objtype::isinstance(&other, &vm.ctx.float_type) {
    +            get_value(&other)
    +        } else if objtype::isinstance(&other, &vm.ctx.int_type) {
    +            objint::get_value(&other).to_f64().ok_or_else(|| {
    +                vm.new_overflow_error("int too large to convert to float".to_string())
    +            })?
    +        } else {
    +            return Ok(vm.ctx.not_implemented());
    +        };
     
    -fn float_pow(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.float_type())), (i2, None)]
    -    );
    -
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.float_type()) {
    -        let result = v1.powf(get_value(i2));
    -        Ok(vm.ctx.new_float(result))
    -    } else if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        let result = v1.powf(objint::get_value(i2).to_f64().unwrap());
    -        Ok(vm.ctx.new_float(result))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +        if v2 != 0.0 {
    +            Ok(vm.ctx.new_float(v1 / v2))
    +        } else {
    +            Err(vm.new_zero_division_error("float division by zero".to_string()))
    +        }
         }
    -}
     
    -fn float_truediv(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.float_type())), (other, None)]
    -    );
    -
    -    let v1 = get_value(zelf);
    -    let v2 = if objtype::isinstance(other, &vm.ctx.float_type) {
    -        get_value(other)
    -    } else if objtype::isinstance(other, &vm.ctx.int_type) {
    -        objint::get_value(other)
    -            .to_f64()
    -            .ok_or_else(|| vm.new_overflow_error("int too large to convert to float".to_string()))?
    -    } else {
    -        return Ok(vm.ctx.not_implemented());
    -    };
    +    fn rtruediv(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        let v1 = self.value;
    +        let v2 = if objtype::isinstance(&other, &vm.ctx.float_type) {
    +            get_value(&other)
    +        } else if objtype::isinstance(&other, &vm.ctx.int_type) {
    +            objint::get_value(&other).to_f64().ok_or_else(|| {
    +                vm.new_overflow_error("int too large to convert to float".to_string())
    +            })?
    +        } else {
    +            return Ok(vm.ctx.not_implemented());
    +        };
     
    -    if v2 != 0.0 {
    -        Ok(vm.ctx.new_float(v1 / v2))
    -    } else {
    -        Err(vm.new_zero_division_error("float division by zero".to_string()))
    +        if v1 != 0.0 {
    +            Ok(vm.ctx.new_float(v2 / v1))
    +        } else {
    +            Err(vm.new_zero_division_error("float division by zero".to_string()))
    +        }
         }
    -}
     
    -fn float_rtruediv(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.float_type())), (other, None)]
    -    );
    -
    -    let v1 = get_value(zelf);
    -    let v2 = if objtype::isinstance(other, &vm.ctx.float_type) {
    -        get_value(other)
    -    } else if objtype::isinstance(other, &vm.ctx.int_type) {
    -        objint::get_value(other)
    -            .to_f64()
    -            .ok_or_else(|| vm.new_overflow_error("int too large to convert to float".to_string()))?
    -    } else {
    -        return Ok(vm.ctx.not_implemented());
    -    };
    +    fn mul(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        let v1 = self.value;
    +        if objtype::isinstance(&other, &vm.ctx.float_type) {
    +            Ok(vm.ctx.new_float(v1 * get_value(&other)))
    +        } else if objtype::isinstance(&other, &vm.ctx.int_type) {
    +            Ok(vm
    +                .ctx
    +                .new_float(v1 * objint::get_value(&other).to_f64().unwrap()))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -    if v1 != 0.0 {
    -        Ok(vm.ctx.new_float(v2 / v1))
    -    } else {
    -        Err(vm.new_zero_division_error("float division by zero".to_string()))
    +    fn is_integer(self, _vm: &VirtualMachine) -> bool {
    +        let v = self.value;
    +        (v - v.round()).abs() < std::f64::EPSILON
         }
    -}
     
    -fn float_mul(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.float_type())), (other, None)]
    -    );
    -    let v1 = get_value(zelf);
    -    if objtype::isinstance(other, &vm.ctx.float_type) {
    -        Ok(vm.ctx.new_float(v1 * get_value(other)))
    -    } else if objtype::isinstance(other, &vm.ctx.int_type) {
    -        Ok(vm
    -            .ctx
    -            .new_float(v1 * objint::get_value(other).to_f64().unwrap()))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn real(self, _vm: &VirtualMachine) -> Self {
    +        self
         }
    -}
     
    -fn float_rmul(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    float_mul(vm, args)
    +    fn as_integer_ratio(self, vm: &VirtualMachine) -> PyResult {
    +        let value = self.value;
    +        if value.is_infinite() {
    +            return Err(
    +                vm.new_overflow_error("cannot convert Infinity to integer ratio".to_string())
    +            );
    +        }
    +        if value.is_nan() {
    +            return Err(vm.new_value_error("cannot convert NaN to integer ratio".to_string()));
    +        }
    +
    +        let ratio = Ratio::from_float(value).unwrap();
    +        let numer = vm.ctx.new_int(ratio.numer().clone());
    +        let denom = vm.ctx.new_int(ratio.denom().clone());
    +        Ok(vm.ctx.new_tuple(vec![numer, denom]))
    +    }
     }
     
    -fn float_real(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.float_type()))]);
    -    let v = get_value(i);
    -    Ok(vm.ctx.new_float(v))
    +// Retrieve inner float value:
    +pub fn get_value(obj: &PyObjectRef) -> f64 {
    +    obj.payload::<PyFloat>().unwrap().value
     }
     
    -fn float_is_integer(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.float_type()))]);
    -    let v = get_value(i);
    -    let result = v == v.round();
    -    Ok(vm.ctx.new_bool(result))
    +pub fn make_float(vm: &VirtualMachine, obj: &PyObjectRef) -> PyResult<f64> {
    +    if objtype::isinstance(obj, &vm.ctx.float_type()) {
    +        Ok(get_value(obj))
    +    } else if let Ok(method) = vm.get_method(obj.clone(), "__float__") {
    +        let res = vm.invoke(method, vec![])?;
    +        Ok(get_value(&res))
    +    } else {
    +        Err(vm.new_type_error(format!("Cannot cast {} to float", obj)))
    +    }
     }
     
    +#[rustfmt::skip] // to avoid line splitting
     pub fn init(context: &PyContext) {
         let float_type = &context.float_type;
     
         let float_doc = "Convert a string or number to a floating point number, if possible.";
     
    -    context.set_attr(&float_type, "__eq__", context.new_rustfunc(float_eq));
    -    context.set_attr(&float_type, "__lt__", context.new_rustfunc(float_lt));
    -    context.set_attr(&float_type, "__le__", context.new_rustfunc(float_le));
    -    context.set_attr(&float_type, "__gt__", context.new_rustfunc(float_gt));
    -    context.set_attr(&float_type, "__ge__", context.new_rustfunc(float_ge));
    -    context.set_attr(&float_type, "__abs__", context.new_rustfunc(float_abs));
    -    context.set_attr(&float_type, "__add__", context.new_rustfunc(float_add));
    -    context.set_attr(&float_type, "__radd__", context.new_rustfunc(float_radd));
    -    context.set_attr(
    -        &float_type,
    -        "__divmod__",
    -        context.new_rustfunc(float_divmod),
    -    );
    -    context.set_attr(
    -        &float_type,
    -        "__floordiv__",
    -        context.new_rustfunc(float_floordiv),
    -    );
    -    context.set_attr(&float_type, "__init__", context.new_rustfunc(float_init));
    -    context.set_attr(&float_type, "__mod__", context.new_rustfunc(float_mod));
    -    context.set_attr(&float_type, "__neg__", context.new_rustfunc(float_neg));
    -    context.set_attr(&float_type, "__pow__", context.new_rustfunc(float_pow));
    -    context.set_attr(&float_type, "__sub__", context.new_rustfunc(float_sub));
    -    context.set_attr(&float_type, "__rsub__", context.new_rustfunc(float_rsub));
    -    context.set_attr(&float_type, "__repr__", context.new_rustfunc(float_repr));
    -    context.set_attr(
    -        &float_type,
    -        "__doc__",
    -        context.new_str(float_doc.to_string()),
    -    );
    -    context.set_attr(
    -        &float_type,
    -        "__truediv__",
    -        context.new_rustfunc(float_truediv),
    -    );
    -    context.set_attr(
    -        &float_type,
    -        "__rtruediv__",
    -        context.new_rustfunc(float_rtruediv),
    -    );
    -    context.set_attr(&float_type, "__mul__", context.new_rustfunc(float_mul));
    -    context.set_attr(&float_type, "__rmul__", context.new_rustfunc(float_rmul));
    -    context.set_attr(&float_type, "real", context.new_property(float_real));
    -    context.set_attr(
    -        &float_type,
    -        "is_integer",
    -        context.new_rustfunc(float_is_integer),
    -    );
    +    context.set_attr(&float_type, "__eq__", context.new_rustfunc(PyFloatRef::eq));
    +    context.set_attr(&float_type, "__lt__", context.new_rustfunc(PyFloatRef::lt));
    +    context.set_attr(&float_type, "__le__", context.new_rustfunc(PyFloatRef::le));
    +    context.set_attr(&float_type, "__gt__", context.new_rustfunc(PyFloatRef::gt));
    +    context.set_attr(&float_type, "__ge__", context.new_rustfunc(PyFloatRef::ge));
    +    context.set_attr(&float_type, "__abs__", context.new_rustfunc(PyFloatRef::abs));
    +    context.set_attr(&float_type, "__add__", context.new_rustfunc(PyFloatRef::add));
    +    context.set_attr(&float_type, "__radd__", context.new_rustfunc(PyFloatRef::add));
    +    context.set_attr(&float_type, "__divmod__", context.new_rustfunc(PyFloatRef::divmod));
    +    context.set_attr(&float_type, "__floordiv__", context.new_rustfunc(PyFloatRef::floordiv));
    +    context.set_attr(&float_type, "__new__", context.new_rustfunc(PyFloatRef::new_float));
    +    context.set_attr(&float_type, "__mod__", context.new_rustfunc(PyFloatRef::mod_));
    +    context.set_attr(&float_type, "__neg__", context.new_rustfunc(PyFloatRef::neg));
    +    context.set_attr(&float_type, "__pow__", context.new_rustfunc(PyFloatRef::pow));
    +    context.set_attr(&float_type, "__sub__", context.new_rustfunc(PyFloatRef::sub));
    +    context.set_attr(&float_type, "__rsub__", context.new_rustfunc(PyFloatRef::rsub));
    +    context.set_attr(&float_type, "__repr__", context.new_rustfunc(PyFloatRef::repr));
    +    context.set_attr(&float_type, "__doc__", context.new_str(float_doc.to_string()));
    +    context.set_attr(&float_type, "__truediv__", context.new_rustfunc(PyFloatRef::truediv));
    +    context.set_attr(&float_type, "__rtruediv__", context.new_rustfunc(PyFloatRef::rtruediv));
    +    context.set_attr(&float_type, "__mul__", context.new_rustfunc(PyFloatRef::mul));
    +    context.set_attr(&float_type, "__rmul__", context.new_rustfunc(PyFloatRef::mul));
    +    context.set_attr(&float_type, "real", context.new_property(PyFloatRef::real));
    +    context.set_attr(&float_type, "is_integer", context.new_rustfunc(PyFloatRef::is_integer));
    +    context.set_attr(&float_type, "as_integer_ratio", context.new_rustfunc(PyFloatRef::as_integer_ratio));
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objframe.rs.html b/src/rustpython_vm/obj/objframe.rs.html index 7a3c991..288f1bf 100644 --- a/src/rustpython_vm/obj/objframe.rs.html +++ b/src/rustpython_vm/obj/objframe.rs.html @@ -1,4 +1,4 @@ -objframe.rs.html -- source
     1
    +objframe.rs.html -- source
     1
      2
      3
      4
    @@ -40,27 +40,14 @@
     40
     41
     42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
     
     /*! The python `frame` type.
     
     */
     
     use crate::frame::Frame;
    -use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    -};
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
     use crate::vm::VirtualMachine;
     
     pub fn init(context: &PyContext) {
    @@ -71,41 +58,30 @@
         context.set_attr(&frame_type, "f_code", context.new_property(frame_fcode));
     }
     
    -fn frame_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn frame_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(_cls, None)]);
         Err(vm.new_type_error("Cannot directly create frame object".to_string()))
     }
     
    -fn frame_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn frame_repr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(_frame, Some(vm.ctx.frame_type()))]);
         let repr = "<frame object at .. >".to_string();
         Ok(vm.new_str(repr))
     }
     
    -fn frame_flocals(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn frame_flocals(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(frame, Some(vm.ctx.frame_type()))]);
         let frame = get_value(frame);
    -    let py_scope = frame.locals.clone();
    -    let py_scope = py_scope.borrow();
    -
    -    if let PyObjectPayload::Scope { scope } = &py_scope.payload {
    -        Ok(scope.locals.clone())
    -    } else {
    -        panic!("The scope isn't a scope!");
    -    }
    +    Ok(frame.scope.get_locals().clone())
     }
     
    -fn frame_fcode(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn frame_fcode(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(frame, Some(vm.ctx.frame_type()))]);
    -    Ok(vm.ctx.new_code_object(get_value(frame).code))
    +    Ok(vm.ctx.new_code_object(get_value(frame).code.clone()))
     }
     
    -pub fn get_value(obj: &PyObjectRef) -> Frame {
    -    if let PyObjectPayload::Frame { frame } = &obj.borrow().payload {
    -        frame.clone()
    -    } else {
    -        panic!("Inner error getting int {:?}", obj);
    -    }
    +pub fn get_value(obj: &PyObjectRef) -> &Frame {
    +    &obj.payload::<Frame>().unwrap()
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objfunction.rs.html b/src/rustpython_vm/obj/objfunction.rs.html index 310e92a..e6eb02c 100644 --- a/src/rustpython_vm/obj/objfunction.rs.html +++ b/src/rustpython_vm/obj/objfunction.rs.html @@ -1,311 +1,165 @@ -objfunction.rs.html -- source
      1
    -  2
    -  3
    -  4
    -  5
    -  6
    -  7
    -  8
    -  9
    - 10
    - 11
    - 12
    - 13
    - 14
    - 15
    - 16
    - 17
    - 18
    - 19
    - 20
    - 21
    - 22
    - 23
    - 24
    - 25
    - 26
    - 27
    - 28
    - 29
    - 30
    - 31
    - 32
    - 33
    - 34
    - 35
    - 36
    - 37
    - 38
    - 39
    - 40
    - 41
    - 42
    - 43
    - 44
    - 45
    - 46
    - 47
    - 48
    - 49
    - 50
    - 51
    - 52
    - 53
    - 54
    - 55
    - 56
    - 57
    - 58
    - 59
    - 60
    - 61
    - 62
    - 63
    - 64
    - 65
    - 66
    - 67
    - 68
    - 69
    - 70
    - 71
    - 72
    - 73
    - 74
    - 75
    - 76
    - 77
    - 78
    - 79
    - 80
    - 81
    - 82
    - 83
    - 84
    - 85
    - 86
    - 87
    - 88
    - 89
    - 90
    - 91
    - 92
    - 93
    - 94
    - 95
    - 96
    - 97
    - 98
    - 99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    -116
    -117
    -118
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    -137
    -138
    -139
    -140
    -141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    -149
    -150
    -151
    -152
    -153
    -154
    +objfunction.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    +62
    +63
    +64
    +65
    +66
    +67
    +68
    +69
    +70
    +71
    +72
    +73
    +74
    +75
    +76
    +77
    +78
    +79
    +80
    +81
     
    -use crate::pyobject::{
    -    AttributeProtocol, IdProtocol, PyContext, PyFuncArgs, PyObjectPayload, PyResult, TypeProtocol,
    -};
    +use crate::frame::Scope;
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{IdProtocol, PyContext, PyObjectRef, PyResult, PyValue, TypeProtocol};
     use crate::vm::VirtualMachine;
     
    -pub fn init(context: &PyContext) {
    -    let function_type = &context.function_type;
    -    context.set_attr(&function_type, "__get__", context.new_rustfunc(bind_method));
    -
    -    context.set_attr(
    -        &function_type,
    -        "__code__",
    -        context.new_member_descriptor(function_code),
    -    );
    -
    -    let builtin_function_or_method_type = &context.builtin_function_or_method_type;
    -    context.set_attr(
    -        &builtin_function_or_method_type,
    -        "__get__",
    -        context.new_rustfunc(bind_method),
    -    );
    -
    -    let member_descriptor_type = &context.member_descriptor_type;
    -    context.set_attr(
    -        &member_descriptor_type,
    -        "__get__",
    -        context.new_rustfunc(member_get),
    -    );
    -
    -    let classmethod_type = &context.classmethod_type;
    -    context.set_attr(
    -        &classmethod_type,
    -        "__get__",
    -        context.new_rustfunc(classmethod_get),
    -    );
    -    context.set_attr(
    -        &classmethod_type,
    -        "__new__",
    -        context.new_rustfunc(classmethod_new),
    -    );
    -
    -    let staticmethod_type = &context.staticmethod_type;
    -    context.set_attr(
    -        staticmethod_type,
    -        "__get__",
    -        context.new_rustfunc(staticmethod_get),
    -    );
    -    context.set_attr(
    -        staticmethod_type,
    -        "__new__",
    -        context.new_rustfunc(staticmethod_new),
    -    );
    +#[derive(Debug)]
    +pub struct PyFunction {
    +    // TODO: these shouldn't be public
    +    pub code: PyObjectRef,
    +    pub scope: Scope,
    +    pub defaults: PyObjectRef,
     }
     
    -fn bind_method(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(function, None), (obj, None), (cls, None)]
    -    );
    -
    -    if obj.is(&vm.get_none()) && !cls.is(&obj.typ()) {
    -        Ok(function.clone())
    -    } else {
    -        Ok(vm.ctx.new_bound_method(function.clone(), obj.clone()))
    +impl PyFunction {
    +    pub fn new(code: PyObjectRef, scope: Scope, defaults: PyObjectRef) -> Self {
    +        PyFunction {
    +            code,
    +            scope,
    +            defaults,
    +        }
         }
     }
     
    -fn function_code(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    match args.args[0].borrow().payload {
    -        PyObjectPayload::Function { ref code, .. } => Ok(code.clone()),
    -        _ => Err(vm.new_type_error("no code".to_string())),
    +impl PyValue for PyFunction {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.function_type()
         }
     }
     
    -fn member_get(vm: &mut VirtualMachine, mut args: PyFuncArgs) -> PyResult {
    -    match args.shift().get_attr("function") {
    -        Some(function) => vm.invoke(function, args),
    -        None => {
    -            let attribute_error = vm.context().exceptions.attribute_error.clone();
    -            Err(vm.new_exception(attribute_error, String::from("Attribute Error")))
    -        }
    +#[derive(Debug)]
    +pub struct PyMethod {
    +    // TODO: these shouldn't be public
    +    pub object: PyObjectRef,
    +    pub function: PyObjectRef,
    +}
    +
    +impl PyMethod {
    +    pub fn new(object: PyObjectRef, function: PyObjectRef) -> Self {
    +        PyMethod { object, function }
         }
     }
     
    -// Classmethod type methods:
    -fn classmethod_get(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("classmethod.__get__ {:?}", args.args);
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (cls, Some(vm.ctx.classmethod_type())),
    -            (_inst, None),
    -            (owner, None)
    -        ]
    -    );
    -    match cls.get_attr("function") {
    -        Some(function) => {
    -            let py_obj = owner.clone();
    -            let py_method = vm.ctx.new_bound_method(function, py_obj);
    -            Ok(py_method)
    -        }
    -        None => {
    -            let attribute_error = vm.context().exceptions.attribute_error.clone();
    -            Err(vm.new_exception(
    -                attribute_error,
    -                String::from("Attribute Error: classmethod must have 'function' attribute"),
    -            ))
    -        }
    +impl PyValue for PyMethod {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.bound_method_type()
         }
     }
     
    -fn classmethod_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("classmethod.__new__ {:?}", args.args);
    -    arg_check!(vm, args, required = [(cls, None), (callable, None)]);
    +pub fn init(context: &PyContext) {
    +    let function_type = &context.function_type;
    +    extend_class!(context, function_type, {
    +        "__get__" => context.new_rustfunc(bind_method),
    +        "__code__" => context.new_property(function_code)
    +    });
     
    -    let py_obj = vm.ctx.new_instance(cls.clone(), None);
    -    vm.ctx.set_attr(&py_obj, "function", callable.clone());
    -    Ok(py_obj)
    +    let builtin_function_or_method_type = &context.builtin_function_or_method_type;
    +    extend_class!(context, builtin_function_or_method_type, {
    +        "__get__" => context.new_rustfunc(bind_method)
    +    });
     }
     
    -// `staticmethod` methods.
    -fn staticmethod_get(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("staticmethod.__get__ {:?}", args.args);
    +fn bind_method(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    -        required = [
    -            (cls, Some(vm.ctx.staticmethod_type())),
    -            (_inst, None),
    -            (_owner, None)
    -        ]
    +        required = [(function, None), (obj, None), (cls, None)]
         );
    -    match cls.get_attr("function") {
    -        Some(function) => Ok(function),
    -        None => {
    -            let attribute_error = vm.context().exceptions.attribute_error.clone();
    -            Err(vm.new_exception(
    -                attribute_error,
    -                String::from("Attribute Error: staticmethod must have 'function' attribute"),
    -            ))
    -        }
    +
    +    if obj.is(&vm.get_none()) && !cls.is(&obj.typ()) {
    +        Ok(function.clone())
    +    } else {
    +        Ok(vm.ctx.new_bound_method(function.clone(), obj.clone()))
         }
     }
     
    -fn staticmethod_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("staticmethod.__new__ {:?}", args.args);
    -    arg_check!(vm, args, required = [(cls, None), (callable, None)]);
    -
    -    let py_obj = vm.ctx.new_instance(cls.clone(), None);
    -    vm.ctx.set_attr(&py_obj, "function", callable.clone());
    -    Ok(py_obj)
    +fn function_code(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    match args.args[0].payload() {
    +        Some(PyFunction { ref code, .. }) => Ok(code.clone()),
    +        None => Err(vm.new_type_error("no code".to_string())),
    +    }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objgenerator.rs.html b/src/rustpython_vm/obj/objgenerator.rs.html index 9aa1b83..50675b5 100644 --- a/src/rustpython_vm/obj/objgenerator.rs.html +++ b/src/rustpython_vm/obj/objgenerator.rs.html @@ -1,4 +1,4 @@ -objgenerator.rs.html -- source
     1
    +objgenerator.rs.html -- source
     1
      2
      3
      4
    @@ -70,17 +70,40 @@
     70
     71
     72
    +73
    +74
    +75
    +76
    +77
    +78
    +79
    +80
    +81
    +82
    +83
    +84
     
     /*
      * The mythical generator.
      */
     
     use crate::frame::{ExecutionResult, Frame};
    -use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    -};
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{PyContext, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol};
     use crate::vm::VirtualMachine;
     
    +#[derive(Debug)]
    +pub struct PyGenerator {
    +    frame: PyObjectRef,
    +}
    +type PyGeneratorRef = PyRef<PyGenerator>;
    +
    +impl PyValue for PyGenerator {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.generator_type()
    +    }
    +}
    +
     pub fn init(context: &PyContext) {
         let generator_type = &context.generator_type;
         context.set_attr(
    @@ -100,26 +123,22 @@
         );
     }
     
    -pub fn new_generator(vm: &mut VirtualMachine, frame: Frame) -> PyResult {
    -    let g = PyObject::new(
    -        PyObjectPayload::Generator { frame },
    -        vm.ctx.generator_type.clone(),
    -    );
    -    Ok(g)
    +pub fn new_generator(frame: PyObjectRef, vm: &VirtualMachine) -> PyGeneratorRef {
    +    PyGenerator { frame }.into_ref(vm)
     }
     
    -fn generator_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn generator_iter(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(o, Some(vm.ctx.generator_type()))]);
         Ok(o.clone())
     }
     
    -fn generator_next(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn generator_next(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(o, Some(vm.ctx.generator_type()))]);
         let value = vm.get_none();
         send(vm, o, &value)
     }
     
    -fn generator_send(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn generator_send(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -128,10 +147,15 @@
         send(vm, o, value)
     }
     
    -fn send(vm: &mut VirtualMachine, gen: &PyObjectRef, value: &PyObjectRef) -> PyResult {
    -    if let PyObjectPayload::Generator { ref mut frame } = gen.borrow_mut().payload {
    -        frame.push_value(value.clone());
    -        match frame.run_frame(vm)? {
    +fn send(vm: &VirtualMachine, gen: &PyObjectRef, value: &PyObjectRef) -> PyResult {
    +    if let Some(PyGenerator { ref frame }) = gen.payload() {
    +        if let Some(frame) = frame.payload::<Frame>() {
    +            frame.push_value(value.clone());
    +        } else {
    +            panic!("Generator frame isn't a frame.");
    +        }
    +
    +        match vm.run_frame(frame.clone())? {
                 ExecutionResult::Yield(value) => Ok(value),
                 ExecutionResult::Return(_value) => {
                     // Stop iteration!
    @@ -144,4 +168,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objint.rs.html b/src/rustpython_vm/obj/objint.rs.html index 2948540..7179c01 100644 --- a/src/rustpython_vm/obj/objint.rs.html +++ b/src/rustpython_vm/obj/objint.rs.html @@ -1,4 +1,4 @@ -objint.rs.html -- source
      1
    +objint.rs.html -- source
      1
       2
       3
       4
    @@ -521,612 +521,436 @@
     521
     522
     523
    -524
    -525
    -526
    -527
    -528
    -529
    -530
    -531
    -532
    -533
    -534
    -535
    -536
    -537
    -538
    -539
    -540
    -541
    -542
    -543
    -544
    -545
    -546
    -547
    -548
    -549
    -550
    -551
    -552
    -553
    -554
    -555
    -556
    -557
    -558
    -559
    -560
    -561
    -562
    -563
    -564
    -565
    -566
    -567
    -568
    -569
    -570
    -571
    -572
    -573
    -574
    -575
    -576
    -577
    -578
    -579
    -580
    -581
    -582
    -583
    -584
    -585
    -586
    -587
    -588
    -589
    -590
    -591
    -592
    -593
    -594
    -595
    -596
    -597
    -598
    -599
    -600
    -601
    -602
    -603
    -604
    -605
    -606
    -607
    -608
    -609
    -610
    -611
    -612
    -613
    -614
    -615
    -616
    -617
    -618
    -619
    -620
    -621
    -622
    -623
    -624
    -625
    -626
    -627
    -628
    -629
    -630
    -631
    -632
    -633
    -634
    -635
    -636
    -637
    -638
    -639
    -640
    -641
    -642
    -643
    -644
    -645
    -646
    -647
    -648
    -649
    -650
    -651
    -652
    -653
    -654
    -655
    -656
    -657
    -658
    -659
    -660
    -661
    -662
    -663
    -664
    -665
    -666
    -667
    -668
    -669
    -670
    -671
    -672
    -673
    -674
    -675
    -676
    -677
    -678
    -679
    -680
    -681
    -682
    -683
    -684
    -685
    -686
    -687
    -688
    -689
    -690
    -691
    -692
    -693
    -694
    -695
    -696
    -697
     
    -use super::objfloat;
    -use super::objstr;
    -use super::objtype;
    +use std::hash::{Hash, Hasher};
    +
    +use num_bigint::{BigInt, ToBigInt};
    +use num_integer::Integer;
    +use num_traits::{Pow, Signed, ToPrimitive, Zero};
    +
     use crate::format::FormatSpec;
    +use crate::function::{OptionalArg, PyFuncArgs};
     use crate::pyobject::{
    -    FromPyObjectRef, PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyResult,
    +    IntoPyObject, PyContext, PyObject, PyObjectRef, PyRef, PyResult, PyValue, TryFromObject,
         TypeProtocol,
     };
     use crate::vm::VirtualMachine;
    -use num_bigint::{BigInt, ToBigInt};
    -use num_integer::Integer;
    -use num_traits::{Pow, Signed, ToPrimitive, Zero};
    -use std::hash::{Hash, Hasher};
     
    -// This proxy allows for easy switching between types.
    -type IntType = BigInt;
    +use super::objfloat;
    +use super::objstr;
    +use super::objtype;
     
    -fn int_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(int, Some(vm.ctx.int_type()))]);
    -    let v = get_value(int);
    -    Ok(vm.new_str(v.to_string()))
    +#[derive(Debug)]
    +pub struct PyInt {
    +    // TODO: shouldn't be public
    +    pub value: BigInt,
     }
     
    -fn int_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(cls, None)],
    -        optional = [(val_option, None)]
    -    );
    -    if !objtype::issubclass(cls, &vm.ctx.int_type()) {
    -        return Err(vm.new_type_error(format!("{:?} is not a subtype of int", cls)));
    -    }
    +pub type PyIntRef = PyRef<PyInt>;
     
    -    // TODO: extract kwargs:
    -    let base = 10;
    -    let val = match val_option {
    -        Some(val) => to_int(vm, val, base)?,
    -        None => Zero::zero(),
    -    };
    -    Ok(PyObject::new(
    -        PyObjectPayload::Integer { value: val },
    -        cls.clone(),
    -    ))
    -}
    -
    -// Casting function:
    -pub fn to_int(
    -    vm: &mut VirtualMachine,
    -    obj: &PyObjectRef,
    -    base: u32,
    -) -> Result<IntType, PyObjectRef> {
    -    let val = if objtype::isinstance(obj, &vm.ctx.int_type()) {
    -        get_value(obj)
    -    } else if objtype::isinstance(obj, &vm.ctx.float_type()) {
    -        objfloat::get_value(obj).to_bigint().unwrap()
    -    } else if objtype::isinstance(obj, &vm.ctx.str_type()) {
    -        let s = objstr::get_value(obj);
    -        match i32::from_str_radix(&s, base) {
    -            Ok(v) => v.to_bigint().unwrap(),
    -            Err(err) => {
    -                trace!("Error occurred during int conversion {:?}", err);
    -                return Err(vm.new_value_error(format!(
    -                    "invalid literal for int() with base {}: '{}'",
    -                    base, s
    -                )));
    -            }
    -        }
    -    } else {
    -        let type_name = objtype::get_type_name(&obj.typ());
    -        return Err(vm.new_type_error(format!(
    -            "int() argument must be a string or a number, not '{}'",
    -            type_name
    -        )));
    -    };
    -    Ok(val)
    +impl PyInt {
    +    pub fn new<T: Into<BigInt>>(i: T) -> Self {
    +        PyInt { value: i.into() }
    +    }
     }
     
    -// Retrieve inner int value:
    -pub fn get_value(obj: &PyObjectRef) -> IntType {
    -    if let PyObjectPayload::Integer { value } = &obj.borrow().payload {
    -        value.clone()
    -    } else {
    -        panic!("Inner error getting int {:?}", obj);
    +impl IntoPyObject for BigInt {
    +    fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
    +        Ok(vm.ctx.new_int(self))
         }
     }
     
    -impl FromPyObjectRef for BigInt {
    -    fn from_pyobj(obj: &PyObjectRef) -> BigInt {
    -        get_value(obj)
    +impl PyValue for PyInt {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.int_type()
         }
     }
     
    -fn int_bool(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.int_type()))]);
    -    let result = !BigInt::from_pyobj(zelf).is_zero();
    -    Ok(vm.ctx.new_bool(result))
    +macro_rules! impl_into_pyobject_int {
    +    ($($t:ty)*) => {$(
    +        impl IntoPyObject for $t {
    +            fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
    +                Ok(vm.ctx.new_int(self))
    +            }
    +        }
    +    )*};
     }
     
    -fn int_invert(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.int_type()))]);
    +impl_into_pyobject_int!(isize i8 i16 i32 i64 usize u8 u16 u32 u64) ;
    +
    +macro_rules! impl_try_from_object_int {
    +    ($(($t:ty, $to_prim:ident),)*) => {$(
    +        impl TryFromObject for $t {
    +            fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self> {
    +                match PyRef::<PyInt>::try_from_object(vm, obj)?.value.$to_prim() {
    +                    Some(value) => Ok(value),
    +                    None => Err(
    +                        vm.new_overflow_error(concat!(
    +                            "Int value cannot fit into Rust ",
    +                            stringify!($t)
    +                        ).to_string())
    +                    ),
    +                }
    +            }
    +        }
    +    )*};
    +}
     
    -    let result = !BigInt::from_pyobj(zelf);
    +impl_try_from_object_int!(
    +    (isize, to_isize),
    +    (i8, to_i8),
    +    (i16, to_i16),
    +    (i32, to_i32),
    +    (i64, to_i64),
    +    (usize, to_usize),
    +    (u8, to_u8),
    +    (u16, to_u16),
    +    (u32, to_u32),
    +    (u64, to_u64),
    +);
    +
    +impl PyIntRef {
    +    fn pass_value(self, _vm: &VirtualMachine) -> Self {
    +        self
    +    }
     
    -    Ok(vm.ctx.new_int(result))
    -}
    +    fn eq(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_bool(self.value == *get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
    +    }
     
    -fn int_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    +    fn ne(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_bool(self.value != *get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
    +    }
     
    -    let zelf = BigInt::from_pyobj(zelf);
    -    let result = if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        let other = BigInt::from_pyobj(other);
    -        zelf == other
    -    } else {
    -        return Ok(vm.ctx.not_implemented());
    -    };
    -    Ok(vm.ctx.new_bool(result))
    -}
    +    fn lt(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_bool(self.value < *get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
    +    }
     
    -fn int_ne(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    +    fn le(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_bool(self.value <= *get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
    +    }
     
    -    let zelf = BigInt::from_pyobj(zelf);
    -    let result = if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        let other = BigInt::from_pyobj(other);
    -        zelf != other
    -    } else {
    -        return Ok(vm.ctx.not_implemented());
    -    };
    -    Ok(vm.ctx.new_bool(result))
    -}
    +    fn gt(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_bool(self.value > *get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
    +    }
     
    -fn int_lt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    +    fn ge(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_bool(self.value >= *get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
    +    }
     
    -    if !objtype::isinstance(other, &vm.ctx.int_type()) {
    -        return Ok(vm.ctx.not_implemented());
    +    fn add(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_int((&self.value) + get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
         }
     
    -    let zelf = BigInt::from_pyobj(zelf);
    -    let other = BigInt::from_pyobj(other);
    -    let result = zelf < other;
    -    Ok(vm.ctx.new_bool(result))
    -}
    +    fn sub(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_int((&self.value) - get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
    +    }
     
    -fn int_le(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    +    fn rsub(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_int(get_value(&other) - (&self.value))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
    +    }
     
    -    if !objtype::isinstance(other, &vm.ctx.int_type()) {
    -        return Ok(vm.ctx.not_implemented());
    +    fn mul(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_int((&self.value) * get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
         }
     
    -    let zelf = BigInt::from_pyobj(zelf);
    -    let other = BigInt::from_pyobj(other);
    -    let result = zelf <= other;
    -    Ok(vm.ctx.new_bool(result))
    -}
    +    fn truediv(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            div_ints(vm, &self.value, &get_value(&other))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -fn int_gt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    +    fn rtruediv(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            div_ints(vm, &get_value(&other), &self.value)
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -    if !objtype::isinstance(other, &vm.ctx.int_type()) {
    -        return Ok(vm.ctx.not_implemented());
    +    fn floordiv(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            let v2 = get_value(&other);
    +            if *v2 != BigInt::zero() {
    +                Ok(vm.ctx.new_int((&self.value) / v2))
    +            } else {
    +                Err(vm.new_zero_division_error("integer floordiv by zero".to_string()))
    +            }
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
         }
     
    -    let zelf = BigInt::from_pyobj(zelf);
    -    let other = BigInt::from_pyobj(other);
    -    let result = zelf > other;
    -    Ok(vm.ctx.new_bool(result))
    -}
    +    fn lshift(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if !objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            return Err(vm.new_type_error(format!(
    +                "unsupported operand type(s) for << '{}' and '{}'",
    +                objtype::get_type_name(&self.as_object().typ()),
    +                objtype::get_type_name(&other.typ())
    +            )));
    +        }
     
    -fn int_ge(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    +        if let Some(n_bits) = get_value(&other).to_usize() {
    +            return Ok(vm.ctx.new_int((&self.value) << n_bits));
    +        }
     
    -    if !objtype::isinstance(other, &vm.ctx.int_type()) {
    -        return Ok(vm.ctx.not_implemented());
    +        // i2 failed `to_usize()` conversion
    +        match get_value(&other) {
    +            v if *v < BigInt::zero() => Err(vm.new_value_error("negative shift count".to_string())),
    +            v if *v > BigInt::from(usize::max_value()) => {
    +                Err(vm.new_overflow_error("the number is too large to convert to int".to_string()))
    +            }
    +            _ => panic!("Failed converting {} to rust usize", get_value(&other)),
    +        }
         }
     
    -    let zelf = BigInt::from_pyobj(zelf);
    -    let other = BigInt::from_pyobj(other);
    -    let result = zelf >= other;
    -    Ok(vm.ctx.new_bool(result))
    -}
    +    fn rshift(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if !objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            return Err(vm.new_type_error(format!(
    +                "unsupported operand type(s) for >> '{}' and '{}'",
    +                objtype::get_type_name(&self.as_object().typ()),
    +                objtype::get_type_name(&other.typ())
    +            )));
    +        }
     
    -fn int_lshift(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type())), (i2, None)]
    -    );
    +        if let Some(n_bits) = get_value(&other).to_usize() {
    +            return Ok(vm.ctx.new_int((&self.value) >> n_bits));
    +        }
     
    -    if !objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        return Err(vm.new_type_error(format!(
    -            "unsupported operand type(s) for << '{}' and '{}'",
    -            objtype::get_type_name(&i.typ()),
    -            objtype::get_type_name(&i2.typ())
    -        )));
    +        // i2 failed `to_usize()` conversion
    +        match get_value(&other) {
    +            v if *v < BigInt::zero() => Err(vm.new_value_error("negative shift count".to_string())),
    +            v if *v > BigInt::from(usize::max_value()) => {
    +                Err(vm.new_overflow_error("the number is too large to convert to int".to_string()))
    +            }
    +            _ => panic!("Failed converting {} to rust usize", get_value(&other)),
    +        }
         }
     
    -    if let Some(n_bits) = get_value(i2).to_usize() {
    -        return Ok(vm.ctx.new_int(get_value(i) << n_bits));
    +    fn xor(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_int((&self.value) ^ get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
         }
     
    -    // i2 failed `to_usize()` conversion
    -    match get_value(i2) {
    -        ref v if *v < BigInt::zero() => Err(vm.new_value_error("negative shift count".to_string())),
    -        ref v if *v > BigInt::from(usize::max_value()) => {
    -            // TODO: raise OverflowError
    -            panic!("Failed converting {} to rust usize", get_value(i2));
    +    fn rxor(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_int(get_value(&other) ^ (&self.value))
    +        } else {
    +            vm.ctx.not_implemented()
             }
    -        _ => panic!("Failed converting {} to rust usize", get_value(i2)),
         }
    -}
     
    -fn int_rshift(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type())), (i2, None)]
    -    );
    +    fn or(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            vm.ctx.new_int((&self.value) | get_value(&other))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
    +    }
     
    -    if !objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        return Err(vm.new_type_error(format!(
    -            "unsupported operand type(s) for >> '{}' and '{}'",
    -            objtype::get_type_name(&i.typ()),
    -            objtype::get_type_name(&i2.typ())
    -        )));
    +    fn and(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            let v2 = get_value(&other);
    +            vm.ctx.new_int((&self.value) & v2)
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
         }
     
    -    if let Some(n_bits) = get_value(i2).to_usize() {
    -        return Ok(vm.ctx.new_int(get_value(i) >> n_bits));
    +    fn pow(self, other: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            let v2 = get_value(&other).to_u32().unwrap();
    +            vm.ctx.new_int(self.value.pow(v2))
    +        } else if objtype::isinstance(&other, &vm.ctx.float_type()) {
    +            let v2 = objfloat::get_value(&other);
    +            vm.ctx.new_float((self.value.to_f64().unwrap()).powf(v2))
    +        } else {
    +            vm.ctx.not_implemented()
    +        }
         }
     
    -    // i2 failed `to_usize()` conversion
    -    match get_value(i2) {
    -        ref v if *v < BigInt::zero() => Err(vm.new_value_error("negative shift count".to_string())),
    -        ref v if *v > BigInt::from(usize::max_value()) => {
    -            // TODO: raise OverflowError
    -            panic!("Failed converting {} to rust usize", get_value(i2));
    +    fn mod_(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            let v2 = get_value(&other);
    +            if *v2 != BigInt::zero() {
    +                Ok(vm.ctx.new_int((&self.value) % v2))
    +            } else {
    +                Err(vm.new_zero_division_error("integer modulo by zero".to_string()))
    +            }
    +        } else {
    +            Ok(vm.ctx.not_implemented())
             }
    -        _ => panic!("Failed converting {} to rust usize", get_value(i2)),
         }
    -}
     
    -fn int_hash(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.int_type()))]);
    -    let value = BigInt::from_pyobj(zelf);
    -    let mut hasher = std::collections::hash_map::DefaultHasher::new();
    -    value.hash(&mut hasher);
    -    let hash = hasher.finish();
    -    Ok(vm.ctx.new_int(hash))
    -}
    +    fn divmod(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.int_type()) {
    +            let v2 = get_value(&other);
    +            if *v2 != BigInt::zero() {
    +                let (r1, r2) = self.value.div_rem(v2);
    +                Ok(vm
    +                    .ctx
    +                    .new_tuple(vec![vm.ctx.new_int(r1), vm.ctx.new_int(r2)]))
    +            } else {
    +                Err(vm.new_zero_division_error("integer divmod by zero".to_string()))
    +            }
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -fn int_abs(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.int_type()))]);
    -    Ok(vm.ctx.new_int(get_value(i).abs()))
    -}
    +    fn neg(self, _vm: &VirtualMachine) -> BigInt {
    +        -(&self.value)
    +    }
     
    -fn int_add(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    -    if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        Ok(vm.ctx.new_int(get_value(zelf) + get_value(other)))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn hash(self, _vm: &VirtualMachine) -> u64 {
    +        let mut hasher = std::collections::hash_map::DefaultHasher::new();
    +        self.value.hash(&mut hasher);
    +        hasher.finish()
         }
    -}
     
    -fn int_radd(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    int_add(vm, args)
    -}
    +    fn abs(self, _vm: &VirtualMachine) -> BigInt {
    +        self.value.abs()
    +    }
     
    -fn int_float(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.int_type()))]);
    -    let i = get_value(i);
    -    Ok(vm.ctx.new_float(i.to_f64().unwrap()))
    -}
    +    fn round(self, _precision: OptionalArg<PyObjectRef>, _vm: &VirtualMachine) -> Self {
    +        self
    +    }
     
    -fn int_floordiv(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type())), (i2, None)]
    -    );
    -    if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        let (v1, v2) = (get_value(i), get_value(i2));
    +    fn float(self, _vm: &VirtualMachine) -> f64 {
    +        self.value.to_f64().unwrap()
    +    }
     
    -        if v2 != BigInt::zero() {
    -            Ok(vm.ctx.new_int(v1 / v2))
    -        } else {
    -            Err(vm.new_zero_division_error("integer floordiv by zero".to_string()))
    -        }
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn invert(self, _vm: &VirtualMachine) -> BigInt {
    +        !(&self.value)
         }
    -}
     
    -fn int_round(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type()))],
    -        optional = [(_precision, None)]
    -    );
    -    Ok(vm.ctx.new_int(get_value(i)))
    -}
    +    fn repr(self, _vm: &VirtualMachine) -> String {
    +        self.value.to_string()
    +    }
     
    -fn int_pass_value(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.int_type()))]);
    -    Ok(vm.ctx.new_int(get_value(i)))
    -}
    +    fn format(self, spec: PyRef<objstr::PyString>, vm: &VirtualMachine) -> PyResult<String> {
    +        let format_spec = FormatSpec::parse(&spec.value);
    +        match format_spec.format_int(&self.value) {
    +            Ok(string) => Ok(string),
    +            Err(err) => Err(vm.new_value_error(err.to_string())),
    +        }
    +    }
     
    -fn int_format(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (i, Some(vm.ctx.int_type())),
    -            (format_spec, Some(vm.ctx.str_type()))
    -        ]
    -    );
    -    let string_value = objstr::get_value(format_spec);
    -    let format_spec = FormatSpec::parse(&string_value);
    -    let int_value = get_value(i);
    -    match format_spec.format_int(&int_value) {
    -        Ok(string) => Ok(vm.ctx.new_str(string)),
    -        Err(err) => Err(vm.new_value_error(err.to_string())),
    +    fn bool(self, _vm: &VirtualMachine) -> bool {
    +        !self.value.is_zero()
         }
    -}
     
    -fn int_sub(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    -    if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        Ok(vm.ctx.new_int(get_value(zelf) - get_value(other)))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn bit_length(self, _vm: &VirtualMachine) -> usize {
    +        self.value.bits()
         }
    -}
     
    -fn int_rsub(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    -    if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        Ok(vm.ctx.new_int(get_value(other) - get_value(zelf)))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn imag(self, _vm: &VirtualMachine) -> usize {
    +        0
         }
     }
     
    -fn int_mul(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn int_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    +        required = [(cls, None)],
    +        optional = [(val_option, None)]
         );
    -    if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        Ok(vm.ctx.new_int(get_value(zelf) * get_value(other)))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    if !objtype::issubclass(cls, &vm.ctx.int_type()) {
    +        return Err(vm.new_type_error(format!("{:?} is not a subtype of int", cls)));
         }
    -}
     
    -fn int_rmul(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    int_mul(vm, args)
    +    let base = match args.get_optional_kwarg("base") {
    +        Some(argument) => get_value(&argument).to_u32().unwrap(),
    +        None => 10,
    +    };
    +    let val = match val_option {
    +        Some(val) => to_int(vm, val, base)?,
    +        None => Zero::zero(),
    +    };
    +    Ok(PyObject::new(PyInt::new(val), cls.clone()))
     }
     
    -fn int_truediv(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    -
    -    if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        div_ints(vm, &get_value(zelf), &get_value(other))
    +// Casting function:
    +pub fn to_int(vm: &VirtualMachine, obj: &PyObjectRef, base: u32) -> PyResult<BigInt> {
    +    let val = if objtype::isinstance(obj, &vm.ctx.int_type()) {
    +        get_value(obj).clone()
    +    } else if objtype::isinstance(obj, &vm.ctx.float_type()) {
    +        objfloat::get_value(obj).to_bigint().unwrap()
    +    } else if objtype::isinstance(obj, &vm.ctx.str_type()) {
    +        let s = objstr::get_value(obj);
    +        match i32::from_str_radix(&s, base) {
    +            Ok(v) => v.to_bigint().unwrap(),
    +            Err(err) => {
    +                trace!("Error occurred during int conversion {:?}", err);
    +                return Err(vm.new_value_error(format!(
    +                    "invalid literal for int() with base {}: '{}'",
    +                    base, s
    +                )));
    +            }
    +        }
         } else {
    -        Ok(vm.ctx.not_implemented())
    -    }
    +        let type_name = objtype::get_type_name(&obj.typ());
    +        return Err(vm.new_type_error(format!(
    +            "int() argument must be a string or a number, not '{}'",
    +            type_name
    +        )));
    +    };
    +    Ok(val)
     }
     
    -fn int_rtruediv(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.int_type())), (other, None)]
    -    );
    -
    -    if objtype::isinstance(other, &vm.ctx.int_type()) {
    -        div_ints(vm, &get_value(other), &get_value(zelf))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    -    }
    +// Retrieve inner int value:
    +pub fn get_value(obj: &PyObjectRef) -> &BigInt {
    +    &obj.payload::<PyInt>().unwrap().value
     }
     
     #[inline]
    -fn div_ints(vm: &mut VirtualMachine, i1: &BigInt, i2: &BigInt) -> PyResult {
    +fn div_ints(vm: &VirtualMachine, i1: &BigInt, i2: &BigInt) -> PyResult {
         if i2.is_zero() {
             return Err(vm.new_zero_division_error("integer division by zero".to_string()));
         }
    @@ -1157,167 +981,7 @@
         }
     }
     
    -fn int_mod(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type())), (i2, None)]
    -    );
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        let v2 = get_value(i2);
    -
    -        if v2 != BigInt::zero() {
    -            Ok(vm.ctx.new_int(v1 % get_value(i2)))
    -        } else {
    -            Err(vm.new_zero_division_error("integer modulo by zero".to_string()))
    -        }
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    -    }
    -}
    -
    -fn int_neg(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.int_type()))]);
    -    let i = BigInt::from_pyobj(i);
    -    Ok(vm.ctx.new_int(-i))
    -}
    -
    -fn int_pos(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.int_type()))]);
    -    Ok(i.clone())
    -}
    -
    -fn int_pow(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type())), (i2, None)]
    -    );
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        let v2 = get_value(i2).to_u32().unwrap();
    -        Ok(vm.ctx.new_int(v1.pow(v2)))
    -    } else if objtype::isinstance(i2, &vm.ctx.float_type()) {
    -        let v2 = objfloat::get_value(i2);
    -        Ok(vm.ctx.new_float((v1.to_f64().unwrap()).powf(v2)))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    -    }
    -}
    -
    -fn int_divmod(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type())), (i2, None)]
    -    );
    -
    -    if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        let v1 = get_value(i);
    -        let v2 = get_value(i2);
    -
    -        if v2 != BigInt::zero() {
    -            let (r1, r2) = v1.div_rem(&v2);
    -
    -            Ok(vm
    -                .ctx
    -                .new_tuple(vec![vm.ctx.new_int(r1), vm.ctx.new_int(r2)]))
    -        } else {
    -            Err(vm.new_zero_division_error("integer divmod by zero".to_string()))
    -        }
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    -    }
    -}
    -
    -fn int_xor(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type())), (i2, None)]
    -    );
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        let v2 = get_value(i2);
    -        Ok(vm.ctx.new_int(v1 ^ v2))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    -    }
    -}
    -
    -fn int_rxor(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type())), (i2, None)]
    -    );
    -
    -    if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        let right_val = get_value(i);
    -        let left_val = get_value(i2);
    -
    -        Ok(vm.ctx.new_int(left_val ^ right_val))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    -    }
    -}
    -
    -fn int_or(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type())), (i2, None)]
    -    );
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        let v2 = get_value(i2);
    -        Ok(vm.ctx.new_int(v1 | v2))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    -    }
    -}
    -
    -fn int_and(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.int_type())), (i2, None)]
    -    );
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.int_type()) {
    -        let v2 = get_value(i2);
    -        Ok(vm.ctx.new_int(v1 & v2))
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    -    }
    -}
    -
    -fn int_bit_length(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.int_type()))]);
    -    let v = get_value(i);
    -    let bits = v.bits();
    -    Ok(vm.ctx.new_int(bits))
    -}
    -
    -fn int_conjugate(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(i, Some(vm.ctx.int_type()))]);
    -    let v = get_value(i);
    -    Ok(vm.ctx.new_int(v))
    -}
    -
    -fn int_real(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.int_type()))]);
    -    let value = BigInt::from_pyobj(zelf);
    -    Ok(vm.ctx.new_int(value))
    -}
    -
    -fn int_imag(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(_zelf, Some(vm.ctx.int_type()))]);
    -    let value = BigInt::from(0);
    -    Ok(vm.ctx.new_int(value))
    -}
    -
    +#[rustfmt::skip] // to avoid line splitting
     pub fn init(context: &PyContext) {
         let int_doc = "int(x=0) -> integer
     int(x, base=10) -> integer
    @@ -1335,63 +999,51 @@
     4";
         let int_type = &context.int_type;
     
    -    context.set_attr(&int_type, "__eq__", context.new_rustfunc(int_eq));
    -    context.set_attr(&int_type, "__ne__", context.new_rustfunc(int_ne));
    -    context.set_attr(&int_type, "__lt__", context.new_rustfunc(int_lt));
    -    context.set_attr(&int_type, "__le__", context.new_rustfunc(int_le));
    -    context.set_attr(&int_type, "__gt__", context.new_rustfunc(int_gt));
    -    context.set_attr(&int_type, "__ge__", context.new_rustfunc(int_ge));
    -    context.set_attr(&int_type, "__abs__", context.new_rustfunc(int_abs));
    -    context.set_attr(&int_type, "__add__", context.new_rustfunc(int_add));
    -    context.set_attr(&int_type, "__radd__", context.new_rustfunc(int_radd));
    -    context.set_attr(&int_type, "__and__", context.new_rustfunc(int_and));
    -    context.set_attr(&int_type, "__divmod__", context.new_rustfunc(int_divmod));
    -    context.set_attr(&int_type, "__float__", context.new_rustfunc(int_float));
    -    context.set_attr(&int_type, "__round__", context.new_rustfunc(int_round));
    -    context.set_attr(&int_type, "__ceil__", context.new_rustfunc(int_pass_value));
    -    context.set_attr(&int_type, "__floor__", context.new_rustfunc(int_pass_value));
    -    context.set_attr(&int_type, "__index__", context.new_rustfunc(int_pass_value));
    -    context.set_attr(&int_type, "__trunc__", context.new_rustfunc(int_pass_value));
    -    context.set_attr(&int_type, "__int__", context.new_rustfunc(int_pass_value));
    -    context.set_attr(
    -        &int_type,
    -        "__floordiv__",
    -        context.new_rustfunc(int_floordiv),
    -    );
    -    context.set_attr(&int_type, "__hash__", context.new_rustfunc(int_hash));
    -    context.set_attr(&int_type, "__lshift__", context.new_rustfunc(int_lshift));
    -    context.set_attr(&int_type, "__rshift__", context.new_rustfunc(int_rshift));
    -    context.set_attr(&int_type, "__new__", context.new_rustfunc(int_new));
    -    context.set_attr(&int_type, "__mod__", context.new_rustfunc(int_mod));
    -    context.set_attr(&int_type, "__mul__", context.new_rustfunc(int_mul));
    -    context.set_attr(&int_type, "__rmul__", context.new_rustfunc(int_rmul));
    -    context.set_attr(&int_type, "__neg__", context.new_rustfunc(int_neg));
    -    context.set_attr(&int_type, "__or__", context.new_rustfunc(int_or));
    -    context.set_attr(&int_type, "__pos__", context.new_rustfunc(int_pos));
    -    context.set_attr(&int_type, "__pow__", context.new_rustfunc(int_pow));
    -    context.set_attr(&int_type, "__repr__", context.new_rustfunc(int_repr));
    -    context.set_attr(&int_type, "__sub__", context.new_rustfunc(int_sub));
    -    context.set_attr(&int_type, "__rsub__", context.new_rustfunc(int_rsub));
    -    context.set_attr(&int_type, "__format__", context.new_rustfunc(int_format));
    -    context.set_attr(&int_type, "__truediv__", context.new_rustfunc(int_truediv));
    -    context.set_attr(
    -        &int_type,
    -        "__rtruediv__",
    -        context.new_rustfunc(int_rtruediv),
    -    );
    -    context.set_attr(&int_type, "__xor__", context.new_rustfunc(int_xor));
    -    context.set_attr(&int_type, "__rxor__", context.new_rustfunc(int_rxor));
    -    context.set_attr(&int_type, "__bool__", context.new_rustfunc(int_bool));
    -    context.set_attr(&int_type, "__invert__", context.new_rustfunc(int_invert));
    -    context.set_attr(
    -        &int_type,
    -        "bit_length",
    -        context.new_rustfunc(int_bit_length),
    -    );
         context.set_attr(&int_type, "__doc__", context.new_str(int_doc.to_string()));
    -    context.set_attr(&int_type, "conjugate", context.new_rustfunc(int_conjugate));
    -    context.set_attr(&int_type, "real", context.new_property(int_real));
    -    context.set_attr(&int_type, "imag", context.new_property(int_imag));
    +    context.set_attr(&int_type, "__eq__", context.new_rustfunc(PyIntRef::eq));
    +    context.set_attr(&int_type, "__ne__", context.new_rustfunc(PyIntRef::ne));
    +    context.set_attr(&int_type, "__lt__", context.new_rustfunc(PyIntRef::lt));
    +    context.set_attr(&int_type, "__le__", context.new_rustfunc(PyIntRef::le));
    +    context.set_attr(&int_type, "__gt__", context.new_rustfunc(PyIntRef::gt));
    +    context.set_attr(&int_type, "__ge__", context.new_rustfunc(PyIntRef::ge));
    +    context.set_attr(&int_type, "__abs__", context.new_rustfunc(PyIntRef::abs));
    +    context.set_attr(&int_type, "__add__", context.new_rustfunc(PyIntRef::add));
    +    context.set_attr(&int_type, "__radd__", context.new_rustfunc(PyIntRef::add));
    +    context.set_attr(&int_type, "__and__", context.new_rustfunc(PyIntRef::and));
    +    context.set_attr(&int_type, "__divmod__", context.new_rustfunc(PyIntRef::divmod));
    +    context.set_attr(&int_type, "__float__", context.new_rustfunc(PyIntRef::float));
    +    context.set_attr(&int_type, "__round__", context.new_rustfunc(PyIntRef::round));
    +    context.set_attr(&int_type, "__ceil__", context.new_rustfunc(PyIntRef::pass_value));
    +    context.set_attr(&int_type, "__floor__", context.new_rustfunc(PyIntRef::pass_value));
    +    context.set_attr(&int_type, "__index__", context.new_rustfunc(PyIntRef::pass_value));
    +    context.set_attr(&int_type, "__trunc__", context.new_rustfunc(PyIntRef::pass_value));
    +    context.set_attr(&int_type, "__int__", context.new_rustfunc(PyIntRef::pass_value));
    +    context.set_attr(&int_type, "__floordiv__", context.new_rustfunc(PyIntRef::floordiv));
    +    context.set_attr(&int_type, "__hash__", context.new_rustfunc(PyIntRef::hash));
    +    context.set_attr(&int_type, "__lshift__", context.new_rustfunc(PyIntRef::lshift));
    +    context.set_attr(&int_type, "__rshift__", context.new_rustfunc(PyIntRef::rshift));
    +    context.set_attr(&int_type, "__new__", context.new_rustfunc(int_new));
    +    context.set_attr(&int_type, "__mod__", context.new_rustfunc(PyIntRef::mod_));
    +    context.set_attr(&int_type, "__mul__", context.new_rustfunc(PyIntRef::mul));
    +    context.set_attr(&int_type, "__rmul__", context.new_rustfunc(PyIntRef::mul));
    +    context.set_attr(&int_type, "__or__", context.new_rustfunc(PyIntRef::or));
    +    context.set_attr(&int_type, "__neg__", context.new_rustfunc(PyIntRef::neg));
    +    context.set_attr(&int_type, "__pos__", context.new_rustfunc(PyIntRef::pass_value));
    +    context.set_attr(&int_type, "__pow__", context.new_rustfunc(PyIntRef::pow));
    +    context.set_attr(&int_type, "__repr__", context.new_rustfunc(PyIntRef::repr));
    +    context.set_attr(&int_type, "__sub__", context.new_rustfunc(PyIntRef::sub));
    +    context.set_attr(&int_type, "__rsub__", context.new_rustfunc(PyIntRef::rsub));
    +    context.set_attr(&int_type, "__format__", context.new_rustfunc(PyIntRef::format));
    +    context.set_attr(&int_type, "__truediv__", context.new_rustfunc(PyIntRef::truediv));
    +    context.set_attr(&int_type, "__rtruediv__", context.new_rustfunc(PyIntRef::rtruediv));
    +    context.set_attr(&int_type, "__xor__", context.new_rustfunc(PyIntRef::xor));
    +    context.set_attr(&int_type, "__rxor__", context.new_rustfunc(PyIntRef::rxor));
    +    context.set_attr(&int_type, "__bool__", context.new_rustfunc(PyIntRef::bool));
    +    context.set_attr(&int_type, "__invert__", context.new_rustfunc(PyIntRef::invert));
    +    context.set_attr(&int_type, "bit_length", context.new_rustfunc(PyIntRef::bit_length));
    +    context.set_attr(&int_type, "conjugate", context.new_rustfunc(PyIntRef::pass_value));
    +    context.set_attr(&int_type, "real", context.new_property(PyIntRef::pass_value));
    +    context.set_attr(&int_type, "imag", context.new_property(PyIntRef::imag));
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objiter.rs.html b/src/rustpython_vm/obj/objiter.rs.html index 656673e..fe91c6c 100644 --- a/src/rustpython_vm/obj/objiter.rs.html +++ b/src/rustpython_vm/obj/objiter.rs.html @@ -1,4 +1,4 @@ -objiter.rs.html -- source
      1
    +objiter.rs.html -- source
      1
       2
       3
       4
    @@ -182,36 +182,35 @@
     182
     183
     184
    -185
    -186
    -187
    -188
     
     /*
      * Various types to support iteration.
      */
     
    -use super::objbool;
    -use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    -};
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{PyContext, PyIteratorValue, PyObjectRef, PyResult, TypeProtocol};
     use crate::vm::VirtualMachine;
    -// use super::objstr;
    -use super::objtype; // Required for arg_check! to use isinstance
    +
    +use super::objbool;
    +use super::objbytearray::PyByteArray;
    +use super::objbytes::PyBytes;
    +use super::objrange::PyRange;
    +use super::objsequence;
    +use super::objtype;
     
     /*
      * This helper function is called at multiple places. First, it is called
      * in the vm when a for loop is entered. Next, it is used when the builtin
      * function 'iter' is called.
      */
    -pub fn get_iter(vm: &mut VirtualMachine, iter_target: &PyObjectRef) -> PyResult {
    +pub fn get_iter(vm: &VirtualMachine, iter_target: &PyObjectRef) -> PyResult {
         vm.call_method(iter_target, "__iter__", vec![])
         // let type_str = objstr::get_value(&vm.to_str(iter_target.typ()).unwrap());
         // let type_error = vm.new_type_error(format!("Cannot iterate over {}", type_str));
         // return Err(type_error);
     }
     
    -pub fn call_next(vm: &mut VirtualMachine, iter_obj: &PyObjectRef) -> PyResult {
    +pub fn call_next(vm: &VirtualMachine, iter_obj: &PyObjectRef) -> PyResult {
         vm.call_method(iter_obj, "__next__", vec![])
     }
     
    @@ -219,9 +218,9 @@
      * Helper function to retrieve the next object (or none) from an iterator.
      */
     pub fn get_next_object(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         iter_obj: &PyObjectRef,
    -) -> Result<Option<PyObjectRef>, PyObjectRef> {
    +) -> PyResult<Option<PyObjectRef>> {
         let next_obj: PyResult = call_next(vm, iter_obj);
     
         match next_obj {
    @@ -238,10 +237,7 @@
     }
     
     /* Retrieve all elements from an iterator */
    -pub fn get_all(
    -    vm: &mut VirtualMachine,
    -    iter_obj: &PyObjectRef,
    -) -> Result<Vec<PyObjectRef>, PyObjectRef> {
    +pub fn get_all(vm: &VirtualMachine, iter_obj: &PyObjectRef) -> PyResult<Vec<PyObjectRef>> {
         let mut elements = vec![];
         loop {
             let element = get_next_object(vm, iter_obj)?;
    @@ -253,12 +249,12 @@
         Ok(elements)
     }
     
    -pub fn new_stop_iteration(vm: &mut VirtualMachine) -> PyObjectRef {
    +pub fn new_stop_iteration(vm: &VirtualMachine) -> PyObjectRef {
         let stop_iteration_type = vm.ctx.exceptions.stop_iteration.clone();
         vm.new_exception(stop_iteration_type, "End of iterator".to_string())
     }
     
    -fn contains(vm: &mut VirtualMachine, args: PyFuncArgs, iter_type: PyObjectRef) -> PyResult {
    +fn contains(vm: &VirtualMachine, args: PyFuncArgs, iter_type: PyObjectRef) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -282,9 +278,7 @@
     pub fn iter_type_init(context: &PyContext, iter_type: &PyObjectRef) {
         let contains_func = {
             let cloned_iter_type = iter_type.clone();
    -        move |vm: &mut VirtualMachine, args: PyFuncArgs| {
    -            contains(vm, args, cloned_iter_type.clone())
    -        }
    +        move |vm: &VirtualMachine, args: PyFuncArgs| contains(vm, args, cloned_iter_type.clone())
         };
         context.set_attr(
             &iter_type,
    @@ -293,7 +287,7 @@
         );
         let iter_func = {
             let cloned_iter_type = iter_type.clone();
    -        move |vm: &mut VirtualMachine, args: PyFuncArgs| {
    +        move |vm: &VirtualMachine, args: PyFuncArgs| {
                 arg_check!(
                     vm,
                     args,
    @@ -307,53 +301,51 @@
     }
     
     // Sequence iterator:
    -fn iter_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn iter_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(iter_target, None)]);
     
         get_iter(vm, iter_target)
     }
     
    -fn iter_next(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn iter_next(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(iter, Some(vm.ctx.iter_type()))]);
     
    -    if let PyObjectPayload::Iterator {
    -        ref mut position,
    -        iterated_obj: ref mut iterated_obj_ref,
    -    } = iter.borrow_mut().payload
    +    if let Some(PyIteratorValue {
    +        ref position,
    +        iterated_obj: ref iterated_obj_ref,
    +    }) = iter.payload()
         {
    -        let iterated_obj = iterated_obj_ref.borrow_mut();
    -        match iterated_obj.payload {
    -            PyObjectPayload::Sequence { ref elements } => {
    -                if *position < elements.len() {
    -                    let obj_ref = elements[*position].clone();
    -                    *position += 1;
    -                    Ok(obj_ref)
    -                } else {
    -                    Err(new_stop_iteration(vm))
    -                }
    +        if let Some(range) = iterated_obj_ref.payload::<PyRange>() {
    +            if let Some(int) = range.get(position.get()) {
    +                position.set(position.get() + 1);
    +                Ok(vm.ctx.new_int(int))
    +            } else {
    +                Err(new_stop_iteration(vm))
                 }
    -
    -            PyObjectPayload::Range { ref range } => {
    -                if let Some(int) = range.get(*position) {
    -                    *position += 1;
    -                    Ok(vm.ctx.new_int(int))
    -                } else {
    -                    Err(new_stop_iteration(vm))
    -                }
    +        } else if let Some(bytes) = iterated_obj_ref.payload::<PyBytes>() {
    +            if position.get() < bytes.len() {
    +                let obj_ref = vm.ctx.new_int(bytes[position.get()]);
    +                position.set(position.get() + 1);
    +                Ok(obj_ref)
    +            } else {
    +                Err(new_stop_iteration(vm))
                 }
    -
    -            PyObjectPayload::Bytes { ref value } => {
    -                if *position < value.len() {
    -                    let obj_ref = vm.ctx.new_int(value[*position]);
    -                    *position += 1;
    -                    Ok(obj_ref)
    -                } else {
    -                    Err(new_stop_iteration(vm))
    -                }
    +        } else if let Some(bytes) = iterated_obj_ref.payload::<PyByteArray>() {
    +            if position.get() < bytes.value.borrow().len() {
    +                let obj_ref = vm.ctx.new_int(bytes.value.borrow()[position.get()]);
    +                position.set(position.get() + 1);
    +                Ok(obj_ref)
    +            } else {
    +                Err(new_stop_iteration(vm))
                 }
    -
    -            _ => {
    -                panic!("NOT IMPL");
    +        } else {
    +            let elements = objsequence::get_elements(iterated_obj_ref);
    +            if position.get() < elements.len() {
    +                let obj_ref = elements[position.get()].clone();
    +                position.set(position.get() + 1);
    +                Ok(obj_ref)
    +            } else {
    +                Err(new_stop_iteration(vm))
                 }
             }
         } else {
    @@ -376,4 +368,4 @@
         context.set_attr(&iter_type, "__doc__", context.new_str(iter_doc.to_string()));
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objlist.rs.html b/src/rustpython_vm/obj/objlist.rs.html index 3c89282..21fe12c 100644 --- a/src/rustpython_vm/obj/objlist.rs.html +++ b/src/rustpython_vm/obj/objlist.rs.html @@ -1,4 +1,4 @@ -objlist.rs.html -- source
      1
    +objlist.rs.html -- source
      1
       2
       3
       4
    @@ -448,546 +448,422 @@
     448
     449
     450
    -451
    -452
    -453
    -454
    -455
    -456
    -457
    -458
    -459
    -460
    -461
    -462
    -463
    -464
    -465
    -466
    -467
    -468
    -469
    -470
    -471
    -472
    -473
    -474
    -475
    -476
    -477
    -478
    -479
    -480
    -481
    -482
    -483
    -484
    -485
    -486
    -487
    -488
    -489
    -490
    -491
    -492
    -493
    -494
    -495
    -496
    -497
    -498
    -499
    -500
    -501
    -502
    -503
    -504
    -505
    -506
    -507
    -508
    -509
    -510
    -511
    -512
    -513
    -514
    -515
    -516
    -517
    -518
     
    +use std::cell::{Cell, RefCell};
    +use std::fmt;
    +
    +use num_traits::ToPrimitive;
    +
    +use crate::function::{OptionalArg, PyFuncArgs};
    +use crate::pyobject::{
    +    IdProtocol, PyContext, PyIteratorValue, PyObject, PyObjectRef, PyRef, PyResult, PyValue,
    +    TypeProtocol,
    +};
    +use crate::vm::{ReprGuard, VirtualMachine};
    +
     use super::objbool;
     use super::objint;
     use super::objsequence::{
    -    get_elements, get_item, get_mut_elements, seq_equal, seq_ge, seq_gt, seq_le, seq_lt, seq_mul,
    +    get_elements, get_elements_cell, get_item, seq_equal, seq_ge, seq_gt, seq_le, seq_lt, seq_mul,
         PySliceableSequence,
     };
    -use super::objstr;
     use super::objtype;
    -use crate::pyobject::{
    -    IdProtocol, PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyResult,
    -    TypeProtocol,
    -};
    -use crate::vm::{ReprGuard, VirtualMachine};
    -use num_traits::ToPrimitive;
     
    -// set_item:
    -fn set_item(
    -    vm: &mut VirtualMachine,
    -    l: &mut Vec<PyObjectRef>,
    -    idx: PyObjectRef,
    -    obj: PyObjectRef,
    -) -> PyResult {
    -    if objtype::isinstance(&idx, &vm.ctx.int_type()) {
    -        let value = objint::get_value(&idx).to_i32().unwrap();
    -        if let Some(pos_index) = l.get_pos(value) {
    -            l[pos_index] = obj;
    -            Ok(vm.get_none())
    -        } else {
    -            Err(vm.new_index_error("list index out of range".to_string()))
    -        }
    -    } else {
    -        panic!(
    -            "TypeError: indexing type {:?} with index {:?} is not supported (yet?)",
    -            l, idx
    -        )
    -    }
    +#[derive(Default)]
    +pub struct PyList {
    +    // TODO: shouldn't be public
    +    pub elements: RefCell<Vec<PyObjectRef>>,
     }
     
    -fn list_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(cls, None)],
    -        optional = [(iterable, None)]
    -    );
    -
    -    if !objtype::issubclass(cls, &vm.ctx.list_type()) {
    -        return Err(vm.new_type_error(format!("{:?} is not a subtype of list", cls)));
    +impl fmt::Debug for PyList {
    +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    +        // TODO: implement more detailed, non-recursive Debug formatter
    +        f.write_str("list")
         }
    -
    -    let elements = if let Some(iterable) = iterable {
    -        vm.extract_elements(iterable)?
    -    } else {
    -        vec![]
    -    };
    -
    -    Ok(PyObject::new(
    -        PyObjectPayload::Sequence { elements },
    -        cls.clone(),
    -    ))
     }
     
    -fn list_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.list_type())), (other, None)]
    -    );
    -
    -    if zelf.is(&other) {
    -        return Ok(vm.ctx.new_bool(true));
    +impl From<Vec<PyObjectRef>> for PyList {
    +    fn from(elements: Vec<PyObjectRef>) -> Self {
    +        PyList {
    +            elements: RefCell::new(elements),
    +        }
         }
    -
    -    let result = if objtype::isinstance(other, &vm.ctx.list_type()) {
    -        let zelf = get_elements(zelf);
    -        let other = get_elements(other);
    -        seq_equal(vm, &zelf, &other)?
    -    } else {
    -        false
    -    };
    -    Ok(vm.ctx.new_bool(result))
     }
     
    -fn list_lt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.list_type())), (other, None)]
    -    );
    -
    -    let result = if objtype::isinstance(other, &vm.ctx.list_type()) {
    -        let zelf = get_elements(zelf);
    -        let other = get_elements(other);
    -        seq_lt(vm, &zelf, &other)?
    -    } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '<'",
    -            zelf.borrow(),
    -            other.borrow()
    -        )));
    -    };
    -
    -    Ok(vm.ctx.new_bool(result))
    -}
    -
    -fn list_gt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.list_type())), (other, None)]
    -    );
    -
    -    let result = if objtype::isinstance(other, &vm.ctx.list_type()) {
    -        let zelf = get_elements(zelf);
    -        let other = get_elements(other);
    -        seq_gt(vm, &zelf, &other)?
    -    } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '>'",
    -            zelf.borrow(),
    -            other.borrow()
    -        )));
    -    };
    -
    -    Ok(vm.ctx.new_bool(result))
    +impl PyValue for PyList {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.list_type()
    +    }
     }
     
    -fn list_ge(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.list_type())), (other, None)]
    -    );
    +pub type PyListRef = PyRef<PyList>;
     
    -    let result = if objtype::isinstance(other, &vm.ctx.list_type()) {
    -        let zelf = get_elements(zelf);
    -        let other = get_elements(other);
    -        seq_ge(vm, &zelf, &other)?
    -    } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '>='",
    -            zelf.borrow(),
    -            other.borrow()
    -        )));
    -    };
    +impl PyListRef {
    +    pub fn append(self, x: PyObjectRef, _vm: &VirtualMachine) {
    +        self.elements.borrow_mut().push(x);
    +    }
     
    -    Ok(vm.ctx.new_bool(result))
    -}
    +    fn extend(self, x: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
    +        let mut new_elements = vm.extract_elements(&x)?;
    +        self.elements.borrow_mut().append(&mut new_elements);
    +        Ok(())
    +    }
     
    -fn list_le(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.list_type())), (other, None)]
    -    );
    +    fn insert(self, position: isize, element: PyObjectRef, _vm: &VirtualMachine) {
    +        let mut vec = self.elements.borrow_mut();
    +        let vec_len = vec.len().to_isize().unwrap();
    +        // This unbounded position can be < 0 or > vec.len()
    +        let unbounded_position = if position < 0 {
    +            vec_len + position
    +        } else {
    +            position
    +        };
    +        // Bound it by [0, vec.len()]
    +        let position = unbounded_position.max(0).min(vec_len).to_usize().unwrap();
    +        vec.insert(position, element.clone());
    +    }
     
    -    let result = if objtype::isinstance(other, &vm.ctx.list_type()) {
    -        let zelf = get_elements(zelf);
    -        let other = get_elements(other);
    -        seq_le(vm, &zelf, &other)?
    -    } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '<='",
    -            zelf.borrow(),
    -            other.borrow()
    -        )));
    -    };
    +    fn add(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.list_type()) {
    +            let e1 = self.elements.borrow();
    +            let e2 = get_elements(&other);
    +            let elements = e1.iter().chain(e2.iter()).cloned().collect();
    +            Ok(vm.ctx.new_list(elements))
    +        } else {
    +            Err(vm.new_type_error(format!("Cannot add {} and {}", self.as_object(), other)))
    +        }
    +    }
     
    -    Ok(vm.ctx.new_bool(result))
    -}
    +    fn iadd(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.list_type()) {
    +            self.elements
    +                .borrow_mut()
    +                .extend_from_slice(&get_elements(&other));
    +            Ok(self.into_object())
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -fn list_add(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(o, Some(vm.ctx.list_type())), (o2, None)]
    -    );
    +    fn clear(self, _vm: &VirtualMachine) {
    +        self.elements.borrow_mut().clear();
    +    }
     
    -    if objtype::isinstance(o2, &vm.ctx.list_type()) {
    -        let e1 = get_elements(o);
    -        let e2 = get_elements(o2);
    -        let elements = e1.iter().chain(e2.iter()).cloned().collect();
    -        Ok(vm.ctx.new_list(elements))
    -    } else {
    -        Err(vm.new_type_error(format!("Cannot add {} and {}", o.borrow(), o2.borrow())))
    +    fn copy(self, vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.new_list(self.elements.borrow().clone())
         }
    -}
     
    -fn list_iadd(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.list_type())), (other, None)]
    -    );
    +    fn len(self, _vm: &VirtualMachine) -> usize {
    +        self.elements.borrow().len()
    +    }
     
    -    if objtype::isinstance(other, &vm.ctx.list_type()) {
    -        get_mut_elements(zelf).extend_from_slice(&get_elements(other));
    -        Ok(zelf.clone())
    -    } else {
    -        Ok(vm.ctx.not_implemented())
    +    fn reverse(self, _vm: &VirtualMachine) {
    +        self.elements.borrow_mut().reverse();
         }
    -}
     
    -fn list_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(o, Some(vm.ctx.list_type()))]);
    +    fn getitem(self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        get_item(
    +            vm,
    +            self.as_object(),
    +            &self.elements.borrow(),
    +            needle.clone(),
    +        )
    +    }
     
    -    let s = if let Some(_guard) = ReprGuard::enter(o) {
    -        let elements = get_elements(o);
    -        let mut str_parts = vec![];
    -        for elem in elements.iter() {
    -            let s = vm.to_repr(elem)?;
    -            str_parts.push(objstr::get_value(&s));
    +    fn iter(self, _vm: &VirtualMachine) -> PyIteratorValue {
    +        PyIteratorValue {
    +            position: Cell::new(0),
    +            iterated_obj: self.into_object(),
             }
    -        format!("[{}]", str_parts.join(", "))
    -    } else {
    -        "[...]".to_string()
    -    };
    +    }
     
    -    Ok(vm.new_str(s))
    -}
    +    fn setitem(self, key: PyObjectRef, value: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        let mut elements = self.elements.borrow_mut();
     
    -pub fn list_append(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("list.append called with: {:?}", args);
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(list, Some(vm.ctx.list_type())), (x, None)]
    -    );
    -    let mut elements = get_mut_elements(list);
    -    elements.push(x.clone());
    -    Ok(vm.get_none())
    -}
    +        if objtype::isinstance(&key, &vm.ctx.int_type()) {
    +            let idx = objint::get_value(&key).to_i32().unwrap();
    +            if let Some(pos_index) = elements.get_pos(idx) {
    +                elements[pos_index] = value;
    +                Ok(vm.get_none())
    +            } else {
    +                Err(vm.new_index_error("list index out of range".to_string()))
    +            }
    +        } else {
    +            panic!(
    +                "TypeError: indexing type {:?} with index {:?} is not supported (yet?)",
    +                elements, key
    +            )
    +        }
    +    }
     
    -fn list_clear(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("list.clear called with: {:?}", args);
    -    arg_check!(vm, args, required = [(list, Some(vm.ctx.list_type()))]);
    -    let mut elements = get_mut_elements(list);
    -    elements.clear();
    -    Ok(vm.get_none())
    -}
    +    fn repr(self, vm: &VirtualMachine) -> PyResult<String> {
    +        let s = if let Some(_guard) = ReprGuard::enter(self.as_object()) {
    +            let mut str_parts = vec![];
    +            for elem in self.elements.borrow().iter() {
    +                let s = vm.to_repr(elem)?;
    +                str_parts.push(s.value.clone());
    +            }
    +            format!("[{}]", str_parts.join(", "))
    +        } else {
    +            "[...]".to_string()
    +        };
    +        Ok(s)
    +    }
     
    -fn list_copy(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.list_type()))]);
    -    let elements = get_elements(zelf);
    -    Ok(vm.ctx.new_list(elements.clone()))
    -}
    +    fn mul(self, counter: isize, vm: &VirtualMachine) -> PyObjectRef {
    +        let new_elements = seq_mul(&self.elements.borrow(), counter);
    +        vm.ctx.new_list(new_elements)
    +    }
     
    -fn list_count(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.list_type())), (value, None)]
    -    );
    -    let elements = get_elements(zelf);
    -    let mut count: usize = 0;
    -    for element in elements.iter() {
    -        if value.is(&element) {
    -            count += 1;
    -        } else {
    -            let is_eq = vm._eq(element.clone(), value.clone())?;
    -            if objbool::boolval(vm, is_eq)? {
    +    fn count(self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<usize> {
    +        let mut count: usize = 0;
    +        for element in self.elements.borrow().iter() {
    +            if needle.is(element) {
                     count += 1;
    +            } else {
    +                let py_equal = vm._eq(element.clone(), needle.clone())?;
    +                if objbool::boolval(vm, py_equal)? {
    +                    count += 1;
    +                }
                 }
             }
    +        Ok(count)
         }
    -    Ok(vm.context().new_int(count))
    -}
     
    -pub fn list_extend(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(list, Some(vm.ctx.list_type())), (x, None)]
    -    );
    -    let mut new_elements = vm.extract_elements(x)?;
    -    let mut elements = get_mut_elements(list);
    -    elements.append(&mut new_elements);
    -    Ok(vm.get_none())
    -}
    +    fn contains(self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<bool> {
    +        for element in self.elements.borrow().iter() {
    +            if needle.is(element) {
    +                return Ok(true);
    +            }
    +            let py_equal = vm._eq(element.clone(), needle.clone())?;
    +            if objbool::boolval(vm, py_equal)? {
    +                return Ok(true);
    +            }
    +        }
    +
    +        Ok(false)
    +    }
    +
    +    fn index(self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<usize> {
    +        for (index, element) in self.elements.borrow().iter().enumerate() {
    +            if needle.is(element) {
    +                return Ok(index);
    +            }
    +            let py_equal = vm._eq(needle.clone(), element.clone())?;
    +            if objbool::boolval(vm, py_equal)? {
    +                return Ok(index);
    +            }
    +        }
    +        let needle_str = &vm.to_str(&needle)?.value;
    +        Err(vm.new_value_error(format!("'{}' is not in list", needle_str)))
    +    }
     
    -fn list_index(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("list.index called with: {:?}", args);
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(list, Some(vm.ctx.list_type())), (needle, None)]
    -    );
    -    for (index, element) in get_elements(list).iter().enumerate() {
    -        if needle.is(&element) {
    -            return Ok(vm.context().new_int(index));
    +    fn pop(self, i: OptionalArg<isize>, vm: &VirtualMachine) -> PyResult {
    +        let mut i = i.into_option().unwrap_or(-1);
    +        let mut elements = self.elements.borrow_mut();
    +        if i < 0 {
    +            i += elements.len() as isize;
             }
    -        let py_equal = vm._eq(needle.clone(), element.clone())?;
    -        if objbool::get_value(&py_equal) {
    -            return Ok(vm.context().new_int(index));
    +        if elements.is_empty() {
    +            Err(vm.new_index_error("pop from empty list".to_string()))
    +        } else if i < 0 || i as usize >= elements.len() {
    +            Err(vm.new_index_error("pop index out of range".to_string()))
    +        } else {
    +            Ok(elements.remove(i as usize))
             }
         }
    -    let needle_str = objstr::get_value(&vm.to_str(needle).unwrap());
    -    Err(vm.new_value_error(format!("'{}' is not in list", needle_str)))
    -}
     
    -fn list_insert(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("list.insert called with: {:?}", args);
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (list, Some(vm.ctx.list_type())),
    -            (insert_position, Some(vm.ctx.int_type())),
    -            (element, None)
    -        ]
    -    );
    -    let int_position = match objint::get_value(insert_position).to_isize() {
    -        Some(i) => i,
    -        None => {
    -            return Err(
    -                vm.new_overflow_error("Python int too large to convert to Rust isize".to_string())
    -            );
    +    fn remove(self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
    +        let mut ri: Option<usize> = None;
    +        for (index, element) in self.elements.borrow().iter().enumerate() {
    +            if needle.is(element) {
    +                ri = Some(index);
    +                break;
    +            }
    +            let py_equal = vm._eq(needle.clone(), element.clone())?;
    +            if objbool::get_value(&py_equal) {
    +                ri = Some(index);
    +                break;
    +            }
             }
    -    };
    -    let mut vec = get_mut_elements(list);
    -    let vec_len = vec.len().to_isize().unwrap();
    -    // This unbounded position can be < 0 or > vec.len()
    -    let unbounded_position = if int_position < 0 {
    -        vec_len + int_position
    -    } else {
    -        int_position
    -    };
    -    // Bound it by [0, vec.len()]
    -    let position = unbounded_position.max(0).min(vec_len).to_usize().unwrap();
    -    vec.insert(position, element.clone());
    -    Ok(vm.get_none())
    -}
     
    -fn list_len(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("list.len called with: {:?}", args);
    -    arg_check!(vm, args, required = [(list, Some(vm.ctx.list_type()))]);
    -    let elements = get_elements(list);
    -    Ok(vm.context().new_int(elements.len()))
    -}
    +        if let Some(index) = ri {
    +            self.elements.borrow_mut().remove(index);
    +            Ok(())
    +        } else {
    +            let needle_str = &vm.to_str(&needle)?.value;
    +            Err(vm.new_value_error(format!("'{}' is not in list", needle_str)))
    +        }
    +    }
     
    -fn list_reverse(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("list.reverse called with: {:?}", args);
    -    arg_check!(vm, args, required = [(list, Some(vm.ctx.list_type()))]);
    -    let mut elements = get_mut_elements(list);
    -    elements.reverse();
    -    Ok(vm.get_none())
    -}
    +    fn eq(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if self.as_object().is(&other) {
    +            return Ok(vm.new_bool(true));
    +        }
     
    -fn list_sort(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(list, Some(vm.ctx.list_type()))]);
    -    let mut _elements = get_mut_elements(list);
    -    unimplemented!("TODO: figure out how to invoke `sort_by` on a Vec");
    -    // elements.sort_by();
    -    // Ok(vm.get_none())
    -}
    +        if objtype::isinstance(&other, &vm.ctx.list_type()) {
    +            let zelf = self.elements.borrow();
    +            let other = get_elements(&other);
    +            let res = seq_equal(vm, &zelf, &other)?;
    +            Ok(vm.new_bool(res))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -fn list_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("list.contains called with: {:?}", args);
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(list, Some(vm.ctx.list_type())), (needle, None)]
    -    );
    -    for element in get_elements(list).iter() {
    -        if needle.is(&element) {
    -            return Ok(vm.new_bool(true));
    +    fn lt(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.list_type()) {
    +            let zelf = self.elements.borrow();
    +            let other = get_elements(&other);
    +            let res = seq_lt(vm, &zelf, &other)?;
    +            Ok(vm.new_bool(res))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
             }
    -        match vm._eq(needle.clone(), element.clone()) {
    -            Ok(value) => {
    -                if objbool::get_value(&value) {
    -                    return Ok(vm.new_bool(true));
    -                }
    -            }
    -            Err(_) => return Err(vm.new_type_error("".to_string())),
    +    }
    +
    +    fn gt(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.list_type()) {
    +            let zelf = self.elements.borrow();
    +            let other = get_elements(&other);
    +            let res = seq_gt(vm, &zelf, &other)?;
    +            Ok(vm.new_bool(res))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
             }
         }
     
    -    Ok(vm.new_bool(false))
    -}
    +    fn ge(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.list_type()) {
    +            let zelf = self.elements.borrow();
    +            let other = get_elements(&other);
    +            let res = seq_ge(vm, &zelf, &other)?;
    +            Ok(vm.new_bool(res))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -fn list_getitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("list.getitem called with: {:?}", args);
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(list, Some(vm.ctx.list_type())), (needle, None)]
    -    );
    -    get_item(vm, list, &get_elements(list), needle.clone())
    +    fn le(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.list_type()) {
    +            let zelf = self.elements.borrow();
    +            let other = get_elements(&other);
    +            let res = seq_le(vm, &zelf, &other)?;
    +            Ok(vm.new_bool(res))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     }
     
    -fn list_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(list, Some(vm.ctx.list_type()))]);
    +fn list_new(
    +    cls: PyRef<objtype::PyClass>,
    +    iterable: OptionalArg<PyObjectRef>,
    +    vm: &VirtualMachine,
    +) -> PyResult {
    +    if !objtype::issubclass(cls.as_object(), &vm.ctx.list_type()) {
    +        return Err(vm.new_type_error(format!("{} is not a subtype of list", cls)));
    +    }
     
    -    let iter_obj = PyObject::new(
    -        PyObjectPayload::Iterator {
    -            position: 0,
    -            iterated_obj: list.clone(),
    -        },
    -        vm.ctx.iter_type(),
    -    );
    +    let elements = if let OptionalArg::Present(iterable) = iterable {
    +        vm.extract_elements(&iterable)?
    +    } else {
    +        vec![]
    +    };
     
    -    // We are all good here:
    -    Ok(iter_obj)
    +    Ok(PyObject::new(PyList::from(elements), cls.into_object()))
     }
     
    -fn list_setitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(list, Some(vm.ctx.list_type())), (key, None), (value, None)]
    -    );
    -    let mut elements = get_mut_elements(list);
    -    set_item(vm, &mut elements, key.clone(), value.clone())
    +fn quicksort(
    +    vm: &VirtualMachine,
    +    keys: &mut [PyObjectRef],
    +    values: &mut [PyObjectRef],
    +) -> PyResult<()> {
    +    let len = values.len();
    +    if len >= 2 {
    +        let pivot = partition(vm, keys, values)?;
    +        quicksort(vm, &mut keys[0..pivot], &mut values[0..pivot])?;
    +        quicksort(vm, &mut keys[pivot + 1..len], &mut values[pivot + 1..len])?;
    +    }
    +    Ok(())
     }
     
    -fn list_mul(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (list, Some(vm.ctx.list_type())),
    -            (product, Some(vm.ctx.int_type()))
    -        ]
    -    );
    -
    -    let new_elements = seq_mul(&get_elements(list), product);
    +fn partition(
    +    vm: &VirtualMachine,
    +    keys: &mut [PyObjectRef],
    +    values: &mut [PyObjectRef],
    +) -> PyResult<usize> {
    +    let len = values.len();
    +    let pivot = len / 2;
    +
    +    values.swap(pivot, len - 1);
    +    keys.swap(pivot, len - 1);
    +
    +    let mut store_idx = 0;
    +    for i in 0..len - 1 {
    +        let result = vm._lt(keys[i].clone(), keys[len - 1].clone())?;
    +        let boolval = objbool::boolval(vm, result)?;
    +        if boolval {
    +            values.swap(i, store_idx);
    +            keys.swap(i, store_idx);
    +            store_idx += 1;
    +        }
    +    }
     
    -    Ok(vm.ctx.new_list(new_elements))
    +    values.swap(store_idx, len - 1);
    +    keys.swap(store_idx, len - 1);
    +    Ok(store_idx)
     }
     
    -fn list_pop(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.list_type()))]);
    +fn do_sort(
    +    vm: &VirtualMachine,
    +    values: &mut Vec<PyObjectRef>,
    +    key_func: Option<PyObjectRef>,
    +    reverse: bool,
    +) -> PyResult<()> {
    +    // build a list of keys. If no keyfunc is provided, it's a copy of the list.
    +    let mut keys: Vec<PyObjectRef> = vec![];
    +    for x in values.iter() {
    +        keys.push(match &key_func {
    +            None => x.clone(),
    +            Some(ref func) => vm.invoke((*func).clone(), vec![x.clone()])?,
    +        });
    +    }
     
    -    let mut elements = get_mut_elements(zelf);
    -    if let Some(result) = elements.pop() {
    -        Ok(result)
    -    } else {
    -        Err(vm.new_index_error("pop from empty list".to_string()))
    +    quicksort(vm, &mut keys, values)?;
    +
    +    if reverse {
    +        values.reverse();
         }
    +
    +    Ok(())
     }
     
    -fn list_remove(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(list, Some(vm.ctx.list_type())), (needle, None)]
    -    );
    +fn list_sort(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(list, Some(vm.ctx.list_type()))]);
    +    let key_func = args.get_optional_kwarg("key");
    +    let reverse = args.get_optional_kwarg("reverse");
    +    let reverse = match reverse {
    +        None => false,
    +        Some(val) => objbool::boolval(vm, val)?,
    +    };
     
    -    let mut ri: Option<usize> = None;
    -    for (index, element) in get_elements(list).iter().enumerate() {
    -        if needle.is(&element) {
    -            ri = Some(index);
    -            break;
    -        }
    -        let py_equal = vm._eq(needle.clone(), element.clone())?;
    -        if objbool::get_value(&py_equal) {
    -            ri = Some(index);
    -            break;
    -        }
    -    }
    +    let elements_cell = get_elements_cell(list);
    +    // replace list contents with [] for duration of sort.
    +    // this prevents keyfunc from messing with the list and makes it easy to
    +    // check if it tries to append elements to it.
    +    let mut elements = elements_cell.replace(vec![]);
    +    do_sort(vm, &mut elements, key_func, reverse)?;
    +    let temp_elements = elements_cell.replace(elements);
     
    -    if let Some(index) = ri {
    -        let mut elements = get_mut_elements(list);
    -        elements.remove(index);
    -        Ok(vm.get_none())
    -    } else {
    -        let needle_str = objstr::get_value(&vm.to_str(needle)?);
    -        Err(vm.new_value_error(format!("'{}' is not in list", needle_str)))
    +    if !temp_elements.is_empty() {
    +        return Err(vm.new_value_error("list modified during sort".to_string()));
         }
    +
    +    Ok(vm.get_none())
     }
     
    +#[rustfmt::skip] // to avoid line splitting
     pub fn init(context: &PyContext) {
         let list_type = &context.list_type;
     
    @@ -995,45 +871,33 @@
                         If no argument is given, the constructor creates a new empty list.\n\
                         The argument must be an iterable if specified.";
     
    -    context.set_attr(&list_type, "__add__", context.new_rustfunc(list_add));
    -    context.set_attr(&list_type, "__iadd__", context.new_rustfunc(list_iadd));
    -    context.set_attr(
    -        &list_type,
    -        "__contains__",
    -        context.new_rustfunc(list_contains),
    -    );
    -    context.set_attr(&list_type, "__eq__", context.new_rustfunc(list_eq));
    -    context.set_attr(&list_type, "__lt__", context.new_rustfunc(list_lt));
    -    context.set_attr(&list_type, "__gt__", context.new_rustfunc(list_gt));
    -    context.set_attr(&list_type, "__le__", context.new_rustfunc(list_le));
    -    context.set_attr(&list_type, "__ge__", context.new_rustfunc(list_ge));
    -    context.set_attr(
    -        &list_type,
    -        "__getitem__",
    -        context.new_rustfunc(list_getitem),
    -    );
    -    context.set_attr(&list_type, "__iter__", context.new_rustfunc(list_iter));
    -    context.set_attr(
    -        &list_type,
    -        "__setitem__",
    -        context.new_rustfunc(list_setitem),
    -    );
    -    context.set_attr(&list_type, "__mul__", context.new_rustfunc(list_mul));
    -    context.set_attr(&list_type, "__len__", context.new_rustfunc(list_len));
    +    context.set_attr(&list_type, "__add__", context.new_rustfunc(PyListRef::add));
    +    context.set_attr(&list_type, "__iadd__", context.new_rustfunc(PyListRef::iadd));
    +    context.set_attr(&list_type, "__contains__", context.new_rustfunc(PyListRef::contains));
    +    context.set_attr(&list_type, "__eq__", context.new_rustfunc(PyListRef::eq));
    +    context.set_attr(&list_type, "__lt__", context.new_rustfunc(PyListRef::lt));
    +    context.set_attr(&list_type, "__gt__", context.new_rustfunc(PyListRef::gt));
    +    context.set_attr(&list_type, "__le__", context.new_rustfunc(PyListRef::le));
    +    context.set_attr(&list_type, "__ge__", context.new_rustfunc(PyListRef::ge));
    +    context.set_attr(&list_type, "__getitem__", context.new_rustfunc(PyListRef::getitem));
    +    context.set_attr(&list_type, "__iter__", context.new_rustfunc(PyListRef::iter));
    +    context.set_attr(&list_type, "__setitem__", context.new_rustfunc(PyListRef::setitem));
    +    context.set_attr(&list_type, "__mul__", context.new_rustfunc(PyListRef::mul));
    +    context.set_attr(&list_type, "__len__", context.new_rustfunc(PyListRef::len));
         context.set_attr(&list_type, "__new__", context.new_rustfunc(list_new));
    -    context.set_attr(&list_type, "__repr__", context.new_rustfunc(list_repr));
    +    context.set_attr(&list_type, "__repr__", context.new_rustfunc(PyListRef::repr));
         context.set_attr(&list_type, "__doc__", context.new_str(list_doc.to_string()));
    -    context.set_attr(&list_type, "append", context.new_rustfunc(list_append));
    -    context.set_attr(&list_type, "clear", context.new_rustfunc(list_clear));
    -    context.set_attr(&list_type, "copy", context.new_rustfunc(list_copy));
    -    context.set_attr(&list_type, "count", context.new_rustfunc(list_count));
    -    context.set_attr(&list_type, "extend", context.new_rustfunc(list_extend));
    -    context.set_attr(&list_type, "index", context.new_rustfunc(list_index));
    -    context.set_attr(&list_type, "insert", context.new_rustfunc(list_insert));
    -    context.set_attr(&list_type, "reverse", context.new_rustfunc(list_reverse));
    +    context.set_attr(&list_type, "append", context.new_rustfunc(PyListRef::append));
    +    context.set_attr(&list_type, "clear", context.new_rustfunc(PyListRef::clear));
    +    context.set_attr(&list_type, "copy", context.new_rustfunc(PyListRef::copy));
    +    context.set_attr(&list_type, "count", context.new_rustfunc(PyListRef::count));
    +    context.set_attr(&list_type, "extend", context.new_rustfunc(PyListRef::extend));
    +    context.set_attr(&list_type, "index", context.new_rustfunc(PyListRef::index));
    +    context.set_attr(&list_type, "insert", context.new_rustfunc(PyListRef::insert));
    +    context.set_attr(&list_type, "reverse", context.new_rustfunc(PyListRef::reverse));
         context.set_attr(&list_type, "sort", context.new_rustfunc(list_sort));
    -    context.set_attr(&list_type, "pop", context.new_rustfunc(list_pop));
    -    context.set_attr(&list_type, "remove", context.new_rustfunc(list_remove));
    +    context.set_attr(&list_type, "pop", context.new_rustfunc(PyListRef::pop));
    +    context.set_attr(&list_type, "remove", context.new_rustfunc(PyListRef::remove));
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objmap.rs.html b/src/rustpython_vm/obj/objmap.rs.html index 2efa2e9..4d5edec 100644 --- a/src/rustpython_vm/obj/objmap.rs.html +++ b/src/rustpython_vm/obj/objmap.rs.html @@ -1,4 +1,4 @@ -objmap.rs.html -- source
     1
    +objmap.rs.html -- source
     1
      2
      3
      4
    @@ -62,40 +62,56 @@
     62
     63
     64
    +65
    +66
    +67
    +68
    +69
     
    +use crate::function::{Args, PyFuncArgs};
    +use crate::pyobject::{PyContext, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
     use super::objiter;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyResult, TypeProtocol};
    -use crate::vm::VirtualMachine; // Required for arg_check! to use isinstance
    +use super::objtype::PyClassRef;
     
    -fn map_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    no_kwargs!(vm, args);
    -    let cls = &args.args[0];
    -    if args.args.len() < 3 {
    -        Err(vm.new_type_error("map() must have at least two arguments.".to_owned()))
    -    } else {
    -        let function = &args.args[1];
    -        let iterables = &args.args[2..];
    -        let iterators = iterables
    -            .iter()
    -            .map(|iterable| objiter::get_iter(vm, iterable))
    -            .collect::<Result<Vec<_>, _>>()?;
    -        Ok(PyObject::new(
    -            PyObjectPayload::MapIterator {
    -                mapper: function.clone(),
    -                iterators,
    -            },
    -            cls.clone(),
    -        ))
    +#[derive(Debug)]
    +pub struct PyMap {
    +    mapper: PyObjectRef,
    +    iterators: Vec<PyObjectRef>,
    +}
    +type PyMapRef = PyRef<PyMap>;
    +
    +impl PyValue for PyMap {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.map_type()
    +    }
    +}
    +
    +fn map_new(
    +    cls: PyClassRef,
    +    function: PyObjectRef,
    +    iterables: Args,
    +    vm: &VirtualMachine,
    +) -> PyResult<PyMapRef> {
    +    let iterators = iterables
    +        .into_iter()
    +        .map(|iterable| objiter::get_iter(vm, &iterable))
    +        .collect::<Result<Vec<_>, _>>()?;
    +    PyMap {
    +        mapper: function.clone(),
    +        iterators,
         }
    +    .into_ref_with_type(vm, cls.clone())
     }
     
    -fn map_next(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn map_next(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(map, Some(vm.ctx.map_type()))]);
     
    -    if let PyObjectPayload::MapIterator {
    -        ref mut mapper,
    -        ref mut iterators,
    -    } = map.borrow_mut().payload
    +    if let Some(PyMap {
    +        ref mapper,
    +        ref iterators,
    +    }) = map.payload()
         {
             let next_objs = iterators
                 .iter()
    @@ -103,13 +119,7 @@
                 .collect::<Result<Vec<_>, _>>()?;
     
             // the mapper itself can raise StopIteration which does stop the map iteration
    -        vm.invoke(
    -            mapper.clone(),
    -            PyFuncArgs {
    -                args: next_objs,
    -                kwargs: vec![],
    -            },
    -        )
    +        vm.invoke(mapper.clone(), next_objs)
         } else {
             panic!("map doesn't have correct payload");
         }
    @@ -128,4 +138,4 @@
         context.set_attr(&map_type, "__doc__", context.new_str(map_doc.to_string()));
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objmemory.rs.html b/src/rustpython_vm/obj/objmemory.rs.html index e12e873..2237ad1 100644 --- a/src/rustpython_vm/obj/objmemory.rs.html +++ b/src/rustpython_vm/obj/objmemory.rs.html @@ -1,4 +1,4 @@ -objmemory.rs.html -- source
     1
    +objmemory.rs.html -- source
     1
      2
      3
      4
    @@ -20,15 +20,39 @@
     20
     21
     22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
     
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyResult, TypeProtocol};
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{PyContext, PyObject, PyObjectRef, PyResult, PyValue, TypeProtocol};
     use crate::vm::VirtualMachine;
     
    -pub fn new_memory_view(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +#[derive(Debug)]
    +pub struct PyMemoryView {
    +    obj: PyObjectRef,
    +}
    +
    +impl PyValue for PyMemoryView {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.memoryview_type()
    +    }
    +}
    +
    +pub fn new_memory_view(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(cls, None), (bytes_object, None)]);
         vm.ctx.set_attr(&cls, "obj", bytes_object.clone());
         Ok(PyObject::new(
    -        PyObjectPayload::MemoryView {
    +        PyMemoryView {
                 obj: bytes_object.clone(),
             },
             cls.clone(),
    @@ -44,4 +68,4 @@
         );
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objmodule.rs.html b/src/rustpython_vm/obj/objmodule.rs.html new file mode 100644 index 0000000..297e132 --- /dev/null +++ b/src/rustpython_vm/obj/objmodule.rs.html @@ -0,0 +1,81 @@ +objmodule.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +
    +use crate::obj::objstr::PyStringRef;
    +use crate::pyobject::{DictProtocol, PyContext, PyObjectRef, PyRef, PyResult, PyValue};
    +use crate::vm::VirtualMachine;
    +
    +#[derive(Clone, Debug)]
    +pub struct PyModule {
    +    pub name: String,
    +    pub dict: PyObjectRef,
    +}
    +pub type PyModuleRef = PyRef<PyModule>;
    +
    +impl PyValue for PyModule {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.module_type()
    +    }
    +}
    +
    +impl PyModuleRef {
    +    fn dir(self: PyModuleRef, vm: &VirtualMachine) -> PyResult {
    +        let keys = self
    +            .dict
    +            .get_key_value_pairs()
    +            .iter()
    +            .map(|(k, _v)| k.clone())
    +            .collect();
    +        Ok(vm.ctx.new_list(keys))
    +    }
    +
    +    fn set_attr(self, attr: PyStringRef, value: PyObjectRef, vm: &VirtualMachine) {
    +        self.dict.set_item(&vm.ctx, &attr.value, value)
    +    }
    +}
    +
    +pub fn init(context: &PyContext) {
    +    extend_class!(&context, &context.module_type, {
    +        "__dir__" => context.new_rustfunc(PyModuleRef::dir),
    +        "__setattr__" => context.new_rustfunc(PyModuleRef::set_attr)
    +    });
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objnone.rs.html b/src/rustpython_vm/obj/objnone.rs.html index 9802025..87e900f 100644 --- a/src/rustpython_vm/obj/objnone.rs.html +++ b/src/rustpython_vm/obj/objnone.rs.html @@ -1,36 +1,216 @@ -objnone.rs.html -- source
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    +objnone.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
     
    -use crate::pyobject::{PyContext, PyFuncArgs, PyResult, TypeProtocol};
    +use crate::function::PyFuncArgs;
    +use crate::obj::objproperty::PyPropertyRef;
    +use crate::obj::objstr::PyStringRef;
    +use crate::pyobject::{
    +    AttributeProtocol, IntoPyObject, PyContext, PyObjectRef, PyRef, PyResult, PyValue,
    +    TryFromObject, TypeProtocol,
    +};
     use crate::vm::VirtualMachine;
     
    -pub fn init(context: &PyContext) {
    -    let none_type = &context.none.typ();
    -    context.set_attr(&none_type, "__new__", context.new_rustfunc(none_new));
    -    context.set_attr(&none_type, "__repr__", context.new_rustfunc(none_repr));
    +#[derive(Clone, Debug)]
    +pub struct PyNone;
    +pub type PyNoneRef = PyRef<PyNone>;
    +
    +impl PyValue for PyNone {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.none().typ()
    +    }
    +}
    +
    +// This allows a built-in function to not return a value, mapping to
    +// Python's behavior of returning `None` in this situation.
    +impl IntoPyObject for () {
    +    fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
    +        Ok(vm.ctx.none())
    +    }
    +}
    +
    +impl<T: IntoPyObject> IntoPyObject for Option<T> {
    +    fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
    +        match self {
    +            Some(x) => x.into_pyobject(vm),
    +            None => Ok(vm.ctx.none()),
    +        }
    +    }
    +}
    +
    +impl PyNoneRef {
    +    fn repr(self, _vm: &VirtualMachine) -> PyResult<String> {
    +        Ok("None".to_string())
    +    }
    +
    +    fn bool(self, _vm: &VirtualMachine) -> PyResult<bool> {
    +        Ok(false)
    +    }
    +
    +    fn get_attribute(self, name: PyStringRef, vm: &VirtualMachine) -> PyResult {
    +        trace!("None.__getattribute__({:?}, {:?})", self, name);
    +        let cls = self.typ().into_object();
    +
    +        // Properties use a comparision with None to determine if they are either invoked by am
    +        // instance binding or a class binding. But if the object itself is None then this detection
    +        // won't work. Instead we call a special function on property that bypasses this check, as
    +        // we are invoking it as a instance binding.
    +        //
    +        // In CPython they instead call the slot tp_descr_get with NULL to indicates it's an
    +        // instance binding.
    +        // https://github.com/python/cpython/blob/master/Objects/typeobject.c#L3281
    +        fn call_descriptor(
    +            descriptor: PyObjectRef,
    +            get_func: PyObjectRef,
    +            obj: PyObjectRef,
    +            cls: PyObjectRef,
    +            vm: &VirtualMachine,
    +        ) -> PyResult {
    +            if let Ok(property) = PyPropertyRef::try_from_object(vm, descriptor.clone()) {
    +                property.instance_binding_get(obj, vm)
    +            } else {
    +                vm.invoke(get_func, vec![descriptor, obj, cls])
    +            }
    +        }
    +
    +        if let Some(attr) = cls.get_attr(&name.value) {
    +            let attr_class = attr.typ();
    +            if attr_class.has_attr("__set__") {
    +                if let Some(get_func) = attr_class.get_attr("__get__") {
    +                    return call_descriptor(attr, get_func, self.into_object(), cls.clone(), vm);
    +                }
    +            }
    +        }
    +
    +        if let Some(obj_attr) = self.as_object().get_attr(&name.value) {
    +            Ok(obj_attr)
    +        } else if let Some(attr) = cls.get_attr(&name.value) {
    +            let attr_class = attr.typ();
    +            if let Some(get_func) = attr_class.get_attr("__get__") {
    +                call_descriptor(attr, get_func, self.into_object(), cls.clone(), vm)
    +            } else {
    +                Ok(attr)
    +            }
    +        } else if let Some(getter) = cls.get_attr("__getattr__") {
    +            vm.invoke(getter, vec![self.into_object(), name.into_object()])
    +        } else {
    +            Err(vm.new_attribute_error(format!("{} has no attribute '{}'", self.as_object(), name)))
    +        }
    +    }
     }
     
    -fn none_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn none_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -39,9 +219,13 @@
         Ok(vm.get_none())
     }
     
    -fn none_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(_zelf, Some(vm.ctx.none().typ()))]);
    -    Ok(vm.ctx.new_str("None".to_string()))
    +pub fn init(context: &PyContext) {
    +    extend_class!(context, &context.none.typ(), {
    +        "__new__" => context.new_rustfunc(none_new),
    +        "__repr__" => context.new_rustfunc(PyNoneRef::repr),
    +        "__bool__" => context.new_rustfunc(PyNoneRef::bool),
    +        "__getattribute__" => context.new_rustfunc(PyNoneRef::get_attribute)
    +    });
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objobject.rs.html b/src/rustpython_vm/obj/objobject.rs.html index 9b7d0cc..2cae664 100644 --- a/src/rustpython_vm/obj/objobject.rs.html +++ b/src/rustpython_vm/obj/objobject.rs.html @@ -1,4 +1,4 @@ -objobject.rs.html -- source
      1
    +objobject.rs.html -- source
      1
       2
       3
       4
    @@ -234,34 +234,100 @@
     234
     235
     236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +246
    +247
    +248
    +249
    +250
    +251
    +252
    +253
    +254
    +255
    +256
    +257
    +258
    +259
    +260
    +261
    +262
    +263
    +264
    +265
    +266
    +267
    +268
    +269
    +270
    +271
    +272
    +273
    +274
    +275
    +276
    +277
    +278
    +279
    +280
    +281
    +282
    +283
    +284
    +285
    +286
    +287
    +288
    +289
    +290
    +291
    +292
    +293
    +294
    +295
    +296
     
    -use super::objstr;
    +use super::objlist::PyList;
    +use super::objstr::{self, PyStringRef};
     use super::objtype;
    +use crate::function::PyFuncArgs;
    +use crate::obj::objproperty::PropertyBuilder;
     use crate::pyobject::{
    -    AttributeProtocol, IdProtocol, PyContext, PyFuncArgs, PyObjectPayload, PyObjectRef, PyResult,
    -    TypeProtocol,
    +    AttributeProtocol, DictProtocol, IdProtocol, PyAttributes, PyContext, PyObject, PyObjectRef,
    +    PyRef, PyResult, PyValue, TypeProtocol,
     };
     use crate::vm::VirtualMachine;
    -use std::cell::RefCell;
    -use std::collections::HashMap;
     
    -pub fn new_instance(vm: &mut VirtualMachine, mut args: PyFuncArgs) -> PyResult {
    -    // more or less __new__ operator
    -    let type_ref = args.shift();
    -    let obj = vm.ctx.new_instance(type_ref.clone(), None);
    -    Ok(obj)
    +#[derive(Clone, Debug)]
    +pub struct PyInstance;
    +
    +impl PyValue for PyInstance {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.object()
    +    }
     }
     
    -pub fn create_object(type_type: PyObjectRef, object_type: PyObjectRef, _dict_type: PyObjectRef) {
    -    (*object_type.borrow_mut()).payload = PyObjectPayload::Class {
    -        name: String::from("object"),
    -        dict: RefCell::new(HashMap::new()),
    -        mro: vec![],
    -    };
    -    (*object_type.borrow_mut()).typ = Some(type_type.clone());
    +pub type PyInstanceRef = PyRef<PyInstance>;
    +
    +pub fn new_instance(vm: &VirtualMachine, mut args: PyFuncArgs) -> PyResult {
    +    // more or less __new__ operator
    +    let cls = args.shift();
    +    Ok(if cls.is(&vm.ctx.object) {
    +        PyObject::new_without_dict(PyInstance, cls)
    +    } else {
    +        PyObject::new(PyInstance, cls)
    +    })
     }
     
    -fn object_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn object_eq(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -270,7 +336,7 @@
         Ok(vm.ctx.not_implemented())
     }
     
    -fn object_ne(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn object_ne(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -280,7 +346,7 @@
         Ok(vm.ctx.not_implemented())
     }
     
    -fn object_lt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn object_lt(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -290,7 +356,7 @@
         Ok(vm.ctx.not_implemented())
     }
     
    -fn object_le(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn object_le(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -300,7 +366,7 @@
         Ok(vm.ctx.not_implemented())
     }
     
    -fn object_gt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn object_gt(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -310,7 +376,7 @@
         Ok(vm.ctx.not_implemented())
     }
     
    -fn object_ge(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn object_ge(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -320,57 +386,95 @@
         Ok(vm.ctx.not_implemented())
     }
     
    -fn object_hash(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn object_hash(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(_zelf, Some(vm.ctx.object()))]);
     
         // For now default to non hashable
         Err(vm.new_type_error("unhashable type".to_string()))
     }
     
    -// TODO: is object the right place for delattr?
    -fn object_delattr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (zelf, Some(vm.ctx.object())),
    -            (attr, Some(vm.ctx.str_type()))
    -        ]
    -    );
    +fn object_setattr(
    +    obj: PyInstanceRef,
    +    attr_name: PyStringRef,
    +    value: PyObjectRef,
    +    vm: &VirtualMachine,
    +) -> PyResult<()> {
    +    trace!("object.__setattr__({:?}, {}, {:?})", obj, attr_name, value);
    +    let cls = obj.as_object().typ();
    +
    +    if let Some(attr) = cls.get_attr(&attr_name.value) {
    +        let attr_class = attr.typ();
    +        if let Some(descriptor) = attr_class.get_attr("__set__") {
    +            return vm
    +                .invoke(descriptor, vec![attr, obj.into_object(), value])
    +                .map(|_| ());
    +        }
    +    }
    +
    +    if let Some(ref dict) = obj.as_object().dict {
    +        dict.borrow_mut().insert(attr_name.value.clone(), value);
    +        Ok(())
    +    } else {
    +        let type_name = objtype::get_type_name(&obj.as_object().typ());
    +        Err(vm.new_attribute_error(format!(
    +            "'{}' object has no attribute '{}'",
    +            type_name, &attr_name.value
    +        )))
    +    }
    +}
     
    -    match zelf.borrow().payload {
    -        PyObjectPayload::Class { ref dict, .. } | PyObjectPayload::Instance { ref dict, .. } => {
    -            let attr_name = objstr::get_value(attr);
    -            dict.borrow_mut().remove(&attr_name);
    -            Ok(vm.get_none())
    +fn object_delattr(obj: PyInstanceRef, attr_name: PyStringRef, vm: &VirtualMachine) -> PyResult<()> {
    +    let cls = obj.as_object().typ();
    +
    +    if let Some(attr) = cls.get_attr(&attr_name.value) {
    +        let attr_class = attr.typ();
    +        if let Some(descriptor) = attr_class.get_attr("__delete__") {
    +            return vm
    +                .invoke(descriptor, vec![attr, obj.into_object()])
    +                .map(|_| ());
             }
    -        _ => Err(vm.new_type_error("TypeError: no dictionary.".to_string())),
    +    }
    +
    +    if let Some(ref dict) = obj.as_object().dict {
    +        dict.borrow_mut().remove(&attr_name.value);
    +        Ok(())
    +    } else {
    +        let type_name = objtype::get_type_name(&obj.as_object().typ());
    +        Err(vm.new_attribute_error(format!(
    +            "'{}' object has no attribute '{}'",
    +            type_name, &attr_name.value
    +        )))
         }
     }
     
    -fn object_str(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn object_str(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.object()))]);
         vm.call_method(zelf, "__repr__", vec![])
     }
     
    -fn object_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn object_repr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(obj, Some(vm.ctx.object()))]);
         let type_name = objtype::get_type_name(&obj.typ());
         let address = obj.get_id();
         Ok(vm.new_str(format!("<{} object at 0x{:x}>", type_name, address)))
     }
     
    -fn object_format(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (obj, Some(vm.ctx.object())),
    -            (format_spec, Some(vm.ctx.str_type()))
    -        ]
    -    );
    -    if objstr::get_value(format_spec).is_empty() {
    -        vm.to_str(obj)
    +pub fn object_dir(obj: PyObjectRef, vm: &VirtualMachine) -> PyList {
    +    let attributes = get_attributes(&obj);
    +    let attributes: Vec<PyObjectRef> = attributes
    +        .keys()
    +        .map(|k| vm.ctx.new_str(k.to_string()))
    +        .collect();
    +    PyList::from(attributes)
    +}
    +
    +fn object_format(
    +    obj: PyObjectRef,
    +    format_spec: PyStringRef,
    +    vm: &VirtualMachine,
    +) -> PyResult<PyStringRef> {
    +    if format_spec.value.is_empty() {
    +        vm.to_str(&obj)
         } else {
             Err(vm.new_type_error("unsupported format string passed to object.__format__".to_string()))
         }
    @@ -382,18 +486,24 @@
     
         context.set_attr(&object, "__new__", context.new_rustfunc(new_instance));
         context.set_attr(&object, "__init__", context.new_rustfunc(object_init));
    +    context.set_attr(
    +        &object,
    +        "__class__",
    +        PropertyBuilder::new(context)
    +            .add_getter(object_class)
    +            .add_setter(object_class_setter)
    +            .create(),
    +    );
         context.set_attr(&object, "__eq__", context.new_rustfunc(object_eq));
         context.set_attr(&object, "__ne__", context.new_rustfunc(object_ne));
         context.set_attr(&object, "__lt__", context.new_rustfunc(object_lt));
         context.set_attr(&object, "__le__", context.new_rustfunc(object_le));
         context.set_attr(&object, "__gt__", context.new_rustfunc(object_gt));
         context.set_attr(&object, "__ge__", context.new_rustfunc(object_ge));
    +    context.set_attr(&object, "__setattr__", context.new_rustfunc(object_setattr));
         context.set_attr(&object, "__delattr__", context.new_rustfunc(object_delattr));
    -    context.set_attr(
    -        &object,
    -        "__dict__",
    -        context.new_member_descriptor(object_dict),
    -    );
    +    context.set_attr(&object, "__dict__", context.new_property(object_dict));
    +    context.set_attr(&object, "__dir__", context.new_rustfunc(object_dir));
         context.set_attr(&object, "__hash__", context.new_rustfunc(object_hash));
         context.set_attr(&object, "__str__", context.new_rustfunc(object_str));
         context.set_attr(&object, "__repr__", context.new_rustfunc(object_repr));
    @@ -406,24 +516,36 @@
         context.set_attr(&object, "__doc__", context.new_str(object_doc.to_string()));
     }
     
    -fn object_init(vm: &mut VirtualMachine, _args: PyFuncArgs) -> PyResult {
    +fn object_init(vm: &VirtualMachine, _args: PyFuncArgs) -> PyResult {
         Ok(vm.ctx.none())
     }
     
    -fn object_dict(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    match args.args[0].borrow().payload {
    -        PyObjectPayload::Class { ref dict, .. } | PyObjectPayload::Instance { ref dict, .. } => {
    -            let new_dict = vm.new_dict();
    -            for (attr, value) in dict.borrow().iter() {
    -                vm.ctx.set_item(&new_dict, &attr, value.clone());
    -            }
    -            Ok(new_dict)
    +fn object_class(obj: PyObjectRef, _vm: &VirtualMachine) -> PyObjectRef {
    +    obj.typ()
    +}
    +
    +fn object_class_setter(
    +    instance: PyObjectRef,
    +    _value: PyObjectRef,
    +    vm: &VirtualMachine,
    +) -> PyResult {
    +    let type_repr = vm.to_pystr(&instance.typ())?;
    +    Err(vm.new_type_error(format!("can't change class of type '{}'", type_repr)))
    +}
    +
    +fn object_dict(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    if let Some(ref dict) = args.args[0].dict {
    +        let new_dict = vm.new_dict();
    +        for (attr, value) in dict.borrow().iter() {
    +            new_dict.set_item(&vm.ctx, &attr, value.clone());
             }
    -        _ => Err(vm.new_type_error("TypeError: no dictionary.".to_string())),
    +        Ok(new_dict)
    +    } else {
    +        Err(vm.new_type_error("TypeError: no dictionary.".to_string()))
         }
     }
     
    -fn object_getattribute(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn object_getattribute(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -440,13 +562,7 @@
             let attr_class = attr.typ();
             if attr_class.has_attr("__set__") {
                 if let Some(descriptor) = attr_class.get_attr("__get__") {
    -                return vm.invoke(
    -                    descriptor,
    -                    PyFuncArgs {
    -                        args: vec![attr, obj.clone(), cls],
    -                        kwargs: vec![],
    -                    },
    -                );
    +                return vm.invoke(descriptor, vec![attr, obj.clone(), cls]);
                 }
             }
         }
    @@ -456,20 +572,24 @@
         } else if let Some(attr) = cls.get_attr(&name) {
             vm.call_get_descriptor(attr, obj.clone())
         } else if let Some(getter) = cls.get_attr("__getattr__") {
    -        vm.invoke(
    -            getter,
    -            PyFuncArgs {
    -                args: vec![cls, name_str.clone()],
    -                kwargs: vec![],
    -            },
    -        )
    +        vm.invoke(getter, vec![obj.clone(), name_str.clone()])
         } else {
    -        let attribute_error = vm.context().exceptions.attribute_error.clone();
    -        Err(vm.new_exception(
    -            attribute_error,
    -            format!("{} has no attribute '{}'", obj.borrow(), name),
    -        ))
    +        Err(vm.new_attribute_error(format!("{} has no attribute '{}'", obj, name)))
         }
     }
    +
    +pub fn get_attributes(obj: &PyObjectRef) -> PyAttributes {
    +    // Get class attributes:
    +    let mut attributes = objtype::get_attributes(obj.type_pyref());
    +
    +    // Get instance attributes:
    +    if let Some(dict) = &obj.dict {
    +        for (name, value) in dict.borrow().iter() {
    +            attributes.insert(name.to_string(), value.clone());
    +        }
    +    }
    +
    +    attributes
    +}
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objproperty.rs.html b/src/rustpython_vm/obj/objproperty.rs.html index fccdfca..d28e9f3 100644 --- a/src/rustpython_vm/obj/objproperty.rs.html +++ b/src/rustpython_vm/obj/objproperty.rs.html @@ -1,105 +1,488 @@ -objproperty.rs.html -- source
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    -87
    -88
    -89
    -90
    -91
    -92
    +objproperty.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    +175
    +176
    +177
    +178
    +179
    +180
    +181
    +182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    +217
    +218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +246
    +247
    +248
    +249
    +250
    +251
    +252
    +253
    +254
    +255
    +256
    +257
    +258
    +259
    +260
    +261
    +262
    +263
    +264
    +265
     
     /*! Python `property` descriptor class.
     
     */
     
    -use crate::pyobject::{PyContext, PyFuncArgs, PyResult, TypeProtocol};
    +use crate::function::IntoPyNativeFunc;
    +use crate::function::OptionalArg;
    +use crate::obj::objstr::PyStringRef;
    +use crate::obj::objtype::PyClassRef;
    +use crate::pyobject::{IdProtocol, PyContext, PyObject, PyObjectRef, PyRef, PyResult, PyValue};
     use crate::vm::VirtualMachine;
     
    +/// Read-only property, doesn't have __set__ or __delete__
    +#[derive(Debug)]
    +pub struct PyReadOnlyProperty {
    +    getter: PyObjectRef,
    +}
    +
    +impl PyValue for PyReadOnlyProperty {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.readonly_property_type()
    +    }
    +}
    +
    +pub type PyReadOnlyPropertyRef = PyRef<PyReadOnlyProperty>;
    +
    +impl PyReadOnlyPropertyRef {
    +    fn get(
    +        self,
    +        obj: PyObjectRef,
    +        _owner: OptionalArg<PyClassRef>,
    +        vm: &VirtualMachine,
    +    ) -> PyResult {
    +        if obj.is(&vm.ctx.none) {
    +            Ok(self.into_object())
    +        } else {
    +            vm.invoke(self.getter.clone(), obj)
    +        }
    +    }
    +}
    +
    +/// Fully fledged property
    +#[derive(Debug)]
    +pub struct PyProperty {
    +    getter: Option<PyObjectRef>,
    +    setter: Option<PyObjectRef>,
    +    deleter: Option<PyObjectRef>,
    +}
    +
    +impl PyValue for PyProperty {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.property_type()
    +    }
    +}
    +
    +pub type PyPropertyRef = PyRef<PyProperty>;
    +
    +impl PyPropertyRef {
    +    fn new_property(
    +        cls: PyClassRef,
    +        fget: OptionalArg<PyObjectRef>,
    +        fset: OptionalArg<PyObjectRef>,
    +        fdel: OptionalArg<PyObjectRef>,
    +        _doc: OptionalArg<PyStringRef>,
    +        vm: &VirtualMachine,
    +    ) -> PyResult<PyPropertyRef> {
    +        PyProperty {
    +            getter: fget.into_option(),
    +            setter: fset.into_option(),
    +            deleter: fdel.into_option(),
    +        }
    +        .into_ref_with_type(vm, cls)
    +    }
    +
    +    // Descriptor methods
    +
    +    // specialised version that doesn't check for None
    +    pub(crate) fn instance_binding_get(self, obj: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if let Some(getter) = self.getter.as_ref() {
    +            vm.invoke(getter.clone(), obj)
    +        } else {
    +            Err(vm.new_attribute_error("unreadable attribute".to_string()))
    +        }
    +    }
    +
    +    fn get(
    +        self,
    +        obj: PyObjectRef,
    +        _owner: OptionalArg<PyClassRef>,
    +        vm: &VirtualMachine,
    +    ) -> PyResult {
    +        if let Some(getter) = self.getter.as_ref() {
    +            if obj.is(&vm.ctx.none) {
    +                Ok(self.into_object())
    +            } else {
    +                vm.invoke(getter.clone(), obj)
    +            }
    +        } else {
    +            Err(vm.new_attribute_error("unreadable attribute".to_string()))
    +        }
    +    }
    +
    +    fn set(self, obj: PyObjectRef, value: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if let Some(setter) = self.setter.as_ref() {
    +            vm.invoke(setter.clone(), vec![obj, value])
    +        } else {
    +            Err(vm.new_attribute_error("can't set attribute".to_string()))
    +        }
    +    }
    +
    +    fn delete(self, obj: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if let Some(deleter) = self.deleter.as_ref() {
    +            vm.invoke(deleter.clone(), obj)
    +        } else {
    +            Err(vm.new_attribute_error("can't delete attribute".to_string()))
    +        }
    +    }
    +
    +    // Access functions
    +
    +    fn fget(self, _vm: &VirtualMachine) -> Option<PyObjectRef> {
    +        self.getter.clone()
    +    }
    +
    +    fn fset(self, _vm: &VirtualMachine) -> Option<PyObjectRef> {
    +        self.setter.clone()
    +    }
    +
    +    fn fdel(self, _vm: &VirtualMachine) -> Option<PyObjectRef> {
    +        self.deleter.clone()
    +    }
    +
    +    // Python builder functions
    +
    +    fn getter(self, getter: Option<PyObjectRef>, vm: &VirtualMachine) -> PyResult<Self> {
    +        PyProperty {
    +            getter: getter.or_else(|| self.getter.clone()),
    +            setter: self.setter.clone(),
    +            deleter: self.deleter.clone(),
    +        }
    +        .into_ref_with_type(vm, self.typ())
    +    }
    +
    +    fn setter(self, setter: Option<PyObjectRef>, vm: &VirtualMachine) -> PyResult<Self> {
    +        PyProperty {
    +            getter: self.getter.clone(),
    +            setter: setter.or_else(|| self.setter.clone()),
    +            deleter: self.deleter.clone(),
    +        }
    +        .into_ref_with_type(vm, self.typ())
    +    }
    +
    +    fn deleter(self, deleter: Option<PyObjectRef>, vm: &VirtualMachine) -> PyResult<Self> {
    +        PyProperty {
    +            getter: self.getter.clone(),
    +            setter: self.setter.clone(),
    +            deleter: deleter.or_else(|| self.deleter.clone()),
    +        }
    +        .into_ref_with_type(vm, self.typ())
    +    }
    +}
    +
    +pub struct PropertyBuilder<'a> {
    +    ctx: &'a PyContext,
    +    getter: Option<PyObjectRef>,
    +    setter: Option<PyObjectRef>,
    +}
    +
    +impl<'a> PropertyBuilder<'a> {
    +    pub fn new(ctx: &'a PyContext) -> Self {
    +        Self {
    +            ctx,
    +            getter: None,
    +            setter: None,
    +        }
    +    }
    +
    +    pub fn add_getter<I, V, F: IntoPyNativeFunc<I, V>>(self, func: F) -> Self {
    +        let func = self.ctx.new_rustfunc(func);
    +        Self {
    +            ctx: self.ctx,
    +            getter: Some(func),
    +            setter: self.setter,
    +        }
    +    }
    +
    +    pub fn add_setter<I, V, F: IntoPyNativeFunc<(I, V), PyResult>>(self, func: F) -> Self {
    +        let func = self.ctx.new_rustfunc(func);
    +        Self {
    +            ctx: self.ctx,
    +            getter: self.getter,
    +            setter: Some(func),
    +        }
    +    }
    +
    +    pub fn create(self) -> PyObjectRef {
    +        if self.setter.is_some() {
    +            let payload = PyProperty {
    +                getter: self.getter.clone(),
    +                setter: self.setter.clone(),
    +                deleter: None,
    +            };
    +
    +            PyObject::new(payload, self.ctx.property_type())
    +        } else {
    +            let payload = PyReadOnlyProperty {
    +                getter: self.getter.expect(
    +                    "One of add_getter/add_setter must be called when constructing a property",
    +                ),
    +            };
    +
    +            PyObject::new(payload, self.ctx.readonly_property_type())
    +        }
    +    }
    +}
    +
     pub fn init(context: &PyContext) {
    -    let property_type = &context.property_type;
    +    extend_class!(context, &context.readonly_property_type, {
    +        "__get__" => context.new_rustfunc(PyReadOnlyPropertyRef::get),
    +    });
     
         let property_doc =
             "Property attribute.\n\n  \
    @@ -129,59 +512,22 @@
              def x(self):\n        \
              del self._x";
     
    -    context.set_attr(
    -        &property_type,
    -        "__get__",
    -        context.new_rustfunc(property_get),
    -    );
    -    context.set_attr(
    -        &property_type,
    -        "__new__",
    -        context.new_rustfunc(property_new),
    -    );
    -    context.set_attr(
    -        &property_type,
    -        "__doc__",
    -        context.new_str(property_doc.to_string()),
    -    );
    -    // TODO: how to handle __set__ ?
    -}
    +    extend_class!(context, &context.property_type, {
    +        "__new__" => context.new_rustfunc(PyPropertyRef::new_property),
    +        "__doc__" => context.new_str(property_doc.to_string()),
     
    -// `property` methods.
    -fn property_get(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("property.__get__ {:?}", args.args);
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (cls, Some(vm.ctx.property_type())),
    -            (inst, None),
    -            (_owner, None)
    -        ]
    -    );
    -
    -    match vm.ctx.get_attr(&cls, "fget") {
    -        Some(getter) => {
    -            let py_method = vm.ctx.new_bound_method(getter, inst.clone());
    -            vm.invoke(py_method, PyFuncArgs::default())
    -        }
    -        None => {
    -            let attribute_error = vm.context().exceptions.attribute_error.clone();
    -            Err(vm.new_exception(
    -                attribute_error,
    -                String::from("Attribute Error: property must have 'fget' attribute"),
    -            ))
    -        }
    -    }
    -}
    +        "__get__" => context.new_rustfunc(PyPropertyRef::get),
    +        "__set__" => context.new_rustfunc(PyPropertyRef::set),
    +        "__delete__" => context.new_rustfunc(PyPropertyRef::delete),
     
    -fn property_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("property.__new__ {:?}", args.args);
    -    arg_check!(vm, args, required = [(cls, None), (fget, None)]);
    +        "fget" => context.new_property(PyPropertyRef::fget),
    +        "fset" => context.new_property(PyPropertyRef::fset),
    +        "fdel" => context.new_property(PyPropertyRef::fdel),
     
    -    let py_obj = vm.ctx.new_instance(cls.clone(), None);
    -    vm.ctx.set_attr(&py_obj, "fget", fget.clone());
    -    Ok(py_obj)
    +        "getter" => context.new_rustfunc(PyPropertyRef::getter),
    +        "setter" => context.new_rustfunc(PyPropertyRef::setter),
    +        "deleter" => context.new_rustfunc(PyPropertyRef::deleter),
    +    });
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objrange.rs.html b/src/rustpython_vm/obj/objrange.rs.html index 66ce966..93965d7 100644 --- a/src/rustpython_vm/obj/objrange.rs.html +++ b/src/rustpython_vm/obj/objrange.rs.html @@ -1,4 +1,4 @@ -objrange.rs.html -- source
      1
    +objrange.rs.html -- source
      1
       2
       3
       4
    @@ -413,21 +413,26 @@
     413
     414
     415
    -416
     
    -use super::objint;
    -use super::objtype;
    -use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    -};
    -use crate::vm::VirtualMachine;
    +use std::cell::Cell;
    +use std::ops::Mul;
    +
     use num_bigint::{BigInt, Sign};
     use num_integer::Integer;
     use num_traits::{One, Signed, ToPrimitive, Zero};
    -use std::ops::Mul;
    +
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{
    +    PyContext, PyIteratorValue, PyObject, PyObjectRef, PyResult, PyValue, TypeProtocol,
    +};
    +use crate::vm::VirtualMachine;
    +
    +use super::objint::{self, PyInt};
    +use super::objslice::PySlice;
    +use super::objtype;
     
     #[derive(Debug, Clone)]
    -pub struct RangeType {
    +pub struct PyRange {
         // Unfortunately Rust's built in range type doesn't support things like indexing
         // or ranges where start > end so we need to roll our own.
         pub start: BigInt,
    @@ -435,7 +440,13 @@
         pub step: BigInt,
     }
     
    -impl RangeType {
    +impl PyValue for PyRange {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.range_type()
    +    }
    +}
    +
    +impl PyRange {
         #[inline]
         pub fn try_len(&self) -> Option<usize> {
             match self.step.sign() {
    @@ -531,12 +542,12 @@
             };
     
             match self.step.sign() {
    -            Sign::Plus => RangeType {
    +            Sign::Plus => PyRange {
                     start,
                     end: &self.start - 1,
                     step: -&self.step,
                 },
    -            Sign::Minus => RangeType {
    +            Sign::Minus => PyRange {
                     start,
                     end: &self.start + 1,
                     step: -&self.step,
    @@ -554,12 +565,8 @@
         }
     }
     
    -pub fn get_value(obj: &PyObjectRef) -> RangeType {
    -    if let PyObjectPayload::Range { range } = &obj.borrow().payload {
    -        range.clone()
    -    } else {
    -        panic!("Inner error getting range {:?}", obj);
    -    }
    +pub fn get_value(obj: &PyObjectRef) -> PyRange {
    +    obj.payload::<PyRange>().unwrap().clone()
     }
     
     pub fn init(context: &PyContext) {
    @@ -605,7 +612,7 @@
         context.set_attr(&range_type, "step", context.new_property(range_step));
     }
     
    -fn range_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -617,19 +624,19 @@
         );
     
         let start = if second.is_some() {
    -        objint::get_value(first)
    +        objint::get_value(first).clone()
         } else {
             BigInt::zero()
         };
     
         let end = if let Some(pyint) = second {
    -        objint::get_value(pyint)
    +        objint::get_value(pyint).clone()
         } else {
    -        objint::get_value(first)
    +        objint::get_value(first).clone()
         };
     
         let step = if let Some(pyint) = step {
    -        objint::get_value(pyint)
    +        objint::get_value(pyint).clone()
         } else {
             BigInt::one()
         };
    @@ -637,42 +644,37 @@
         if step.is_zero() {
             Err(vm.new_value_error("range with 0 step size".to_string()))
         } else {
    -        Ok(PyObject::new(
    -            PyObjectPayload::Range {
    -                range: RangeType { start, end, step },
    -            },
    -            cls.clone(),
    -        ))
    +        Ok(PyObject::new(PyRange { start, end, step }, cls.clone()))
         }
     }
     
    -fn range_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_iter(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(range, Some(vm.ctx.range_type()))]);
     
         Ok(PyObject::new(
    -        PyObjectPayload::Iterator {
    -            position: 0,
    +        PyIteratorValue {
    +            position: Cell::new(0),
                 iterated_obj: range.clone(),
             },
             vm.ctx.iter_type(),
         ))
     }
     
    -fn range_reversed(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_reversed(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.range_type()))]);
     
         let range = get_value(zelf).reversed();
     
         Ok(PyObject::new(
    -        PyObjectPayload::Iterator {
    -            position: 0,
    -            iterated_obj: PyObject::new(PyObjectPayload::Range { range }, vm.ctx.range_type()),
    +        PyIteratorValue {
    +            position: Cell::new(0),
    +            iterated_obj: PyObject::new(range, vm.ctx.range_type()),
             },
             vm.ctx.iter_type(),
         ))
     }
     
    -fn range_len(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_len(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.range_type()))]);
     
         if let Some(len) = get_value(zelf).try_len() {
    @@ -682,7 +684,7 @@
         }
     }
     
    -fn range_getitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_getitem(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -691,62 +693,58 @@
     
         let range = get_value(zelf);
     
    -    match subscript.borrow().payload {
    -        PyObjectPayload::Integer { ref value } => {
    -            if let Some(int) = range.get(value) {
    -                Ok(vm.ctx.new_int(int))
    -            } else {
    -                Err(vm.new_index_error("range object index out of range".to_string()))
    -            }
    +    if let Some(i) = subscript.payload::<PyInt>() {
    +        if let Some(int) = range.get(i.value.clone()) {
    +            Ok(vm.ctx.new_int(int))
    +        } else {
    +            Err(vm.new_index_error("range object index out of range".to_string()))
             }
    -        PyObjectPayload::Slice {
    -            ref start,
    -            ref stop,
    -            ref step,
    -        } => {
    -            let new_start = if let Some(int) = start {
    -                if let Some(i) = range.get(int) {
    -                    i
    -                } else {
    -                    range.start.clone()
    -                }
    +    } else if let Some(PySlice {
    +        ref start,
    +        ref stop,
    +        ref step,
    +    }) = subscript.payload()
    +    {
    +        let new_start = if let Some(int) = start {
    +            if let Some(i) = range.get(int) {
    +                i
                 } else {
                     range.start.clone()
    -            };
    -
    -            let new_end = if let Some(int) = stop {
    -                if let Some(i) = range.get(int) {
    -                    i
    -                } else {
    -                    range.end
    -                }
    +            }
    +        } else {
    +            range.start.clone()
    +        };
    +
    +        let new_end = if let Some(int) = stop {
    +            if let Some(i) = range.get(int) {
    +                i
                 } else {
                     range.end
    -            };
    +            }
    +        } else {
    +            range.end
    +        };
     
    -            let new_step = if let Some(int) = step {
    -                int * range.step
    -            } else {
    -                range.step
    -            };
    -
    -            Ok(PyObject::new(
    -                PyObjectPayload::Range {
    -                    range: RangeType {
    -                        start: new_start,
    -                        end: new_end,
    -                        step: new_step,
    -                    },
    -                },
    -                vm.ctx.range_type(),
    -            ))
    -        }
    +        let new_step = if let Some(int) = step {
    +            int * range.step
    +        } else {
    +            range.step
    +        };
     
    -        _ => Err(vm.new_type_error("range indices must be integer or slice".to_string())),
    +        Ok(PyObject::new(
    +            PyRange {
    +                start: new_start,
    +                end: new_end,
    +                step: new_step,
    +            },
    +            vm.ctx.range_type(),
    +        ))
    +    } else {
    +        Err(vm.new_type_error("range indices must be integer or slice".to_string()))
         }
     }
     
    -fn range_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_repr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.range_type()))]);
     
         let repr = get_value(zelf).repr();
    @@ -754,7 +752,7 @@
         Ok(vm.ctx.new_str(repr))
     }
     
    -fn range_bool(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_bool(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.range_type()))]);
     
         let len = get_value(zelf).len();
    @@ -762,7 +760,7 @@
         Ok(vm.ctx.new_bool(len > 0))
     }
     
    -fn range_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_contains(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -780,7 +778,7 @@
         Ok(vm.ctx.new_bool(result))
     }
     
    -fn range_index(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_index(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -801,7 +799,7 @@
         }
     }
     
    -fn range_count(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_count(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -817,19 +815,19 @@
         }
     }
     
    -fn range_start(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_start(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.range_type()))]);
         Ok(vm.ctx.new_int(get_value(zelf).start))
     }
     
    -fn range_stop(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_stop(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.range_type()))]);
         Ok(vm.ctx.new_int(get_value(zelf).end))
     }
     
    -fn range_step(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn range_step(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zelf, Some(vm.ctx.range_type()))]);
         Ok(vm.ctx.new_int(get_value(zelf).step))
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objsequence.rs.html b/src/rustpython_vm/obj/objsequence.rs.html index eb658c8..63efb1d 100644 --- a/src/rustpython_vm/obj/objsequence.rs.html +++ b/src/rustpython_vm/obj/objsequence.rs.html @@ -1,4 +1,4 @@ -objsequence.rs.html -- source
      1
    +objsequence.rs.html -- source
      1
       2
       3
       4
    @@ -322,17 +322,39 @@
     322
     323
     324
    +325
    +326
    +327
    +328
    +329
    +330
    +331
    +332
    +333
    +334
    +335
    +336
    +337
    +338
    +339
    +340
     
    -use super::objbool;
    -use super::objint;
    -use crate::pyobject::{IdProtocol, PyObject, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol};
    -use crate::vm::VirtualMachine;
    -use num_bigint::BigInt;
    -use num_traits::{One, Signed, ToPrimitive, Zero};
    -use std::cell::{Ref, RefMut};
    +use std::cell::RefCell;
     use std::marker::Sized;
     use std::ops::{Deref, DerefMut, Range};
     
    +use num_bigint::BigInt;
    +use num_traits::{One, Signed, ToPrimitive, Zero};
    +
    +use crate::pyobject::{IdProtocol, PyObject, PyObjectRef, PyResult, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
    +use super::objbool;
    +use super::objint::PyInt;
    +use super::objlist::PyList;
    +use super::objslice::PySlice;
    +use super::objtuple::PyTuple;
    +
     pub trait PySliceableSequence {
         fn do_slice(&self, range: Range<usize>) -> Self;
         fn do_slice_reverse(&self, range: Range<usize>) -> Self;
    @@ -380,23 +402,20 @@
             start..stop
         }
     
    -    fn get_slice_items(
    -        &self,
    -        vm: &mut VirtualMachine,
    -        slice: &PyObjectRef,
    -    ) -> Result<Self, PyObjectRef>
    +    fn get_slice_items(&self, vm: &VirtualMachine, slice: &PyObjectRef) -> Result<Self, PyObjectRef>
         where
             Self: Sized,
         {
             // TODO: we could potentially avoid this copy and use slice
    -        match &(slice.borrow()).payload {
    -            PyObjectPayload::Slice { start, stop, step } => {
    +        match slice.payload() {
    +            Some(PySlice { start, stop, step }) => {
                     let step = step.clone().unwrap_or_else(BigInt::one);
                     if step.is_zero() {
                         Err(vm.new_value_error("slice step cannot be zero".to_string()))
                     } else if step.is_positive() {
                         let range = self.get_slice_range(start, stop);
                         if range.start < range.end {
    +                        #[allow(clippy::range_plus_one)]
                             match step.to_i32() {
                                 Some(1) => Ok(self.do_slice(range)),
                                 Some(num) => Ok(self.do_stepped_slice(range, num as usize)),
    @@ -460,13 +479,13 @@
     }
     
     pub fn get_item(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         sequence: &PyObjectRef,
         elements: &[PyObjectRef],
         subscript: PyObjectRef,
     ) -> PyResult {
    -    match &(subscript.borrow()).payload {
    -        PyObjectPayload::Integer { value } => match value.to_i32() {
    +    if let Some(i) = subscript.payload::<PyInt>() {
    +        return match i.value.to_i32() {
                 Some(value) => {
                     if let Some(pos_index) = elements.to_vec().get_pos(value) {
                         let obj = elements[pos_index].clone();
    @@ -478,32 +497,39 @@
                 None => {
                     Err(vm.new_index_error("cannot fit 'int' into an index-sized integer".to_string()))
                 }
    -        },
    -
    -        PyObjectPayload::Slice { .. } => Ok(PyObject::new(
    -            match &(sequence.borrow()).payload {
    -                PyObjectPayload::Sequence { .. } => PyObjectPayload::Sequence {
    -                    elements: elements.to_vec().get_slice_items(vm, &subscript)?,
    -                },
    -                ref payload => panic!("sequence get_item called for non-sequence: {:?}", payload),
    -            },
    -            sequence.typ(),
    -        )),
    -        _ => Err(vm.new_type_error(format!(
    +        };
    +    }
    +
    +    if subscript.payload::<PySlice>().is_some() {
    +        if sequence.payload::<PyList>().is_some() {
    +            Ok(PyObject::new(
    +                PyList::from(elements.to_vec().get_slice_items(vm, &subscript)?),
    +                sequence.typ(),
    +            ))
    +        } else if sequence.payload::<PyTuple>().is_some() {
    +            Ok(PyObject::new(
    +                PyTuple::from(elements.to_vec().get_slice_items(vm, &subscript)?),
    +                sequence.typ(),
    +            ))
    +        } else {
    +            panic!("sequence get_item called for non-sequence")
    +        }
    +    } else {
    +        Err(vm.new_type_error(format!(
                 "TypeError: indexing type {:?} with index {:?} is not supported (yet?)",
                 sequence, subscript
    -        ))),
    +        )))
         }
     }
     
     pub fn seq_equal(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         zelf: &[PyObjectRef],
         other: &[PyObjectRef],
     ) -> Result<bool, PyObjectRef> {
         if zelf.len() == other.len() {
             for (a, b) in Iterator::zip(zelf.iter(), other.iter()) {
    -            if !a.is(&b) {
    +            if !a.is(b) {
                     let eq = vm._eq(a.clone(), b.clone())?;
                     let value = objbool::boolval(vm, eq)?;
                     if !value {
    @@ -518,7 +544,7 @@
     }
     
     pub fn seq_lt(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         zelf: &[PyObjectRef],
         other: &[PyObjectRef],
     ) -> Result<bool, PyObjectRef> {
    @@ -558,7 +584,7 @@
     }
     
     pub fn seq_gt(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         zelf: &[PyObjectRef],
         other: &[PyObjectRef],
     ) -> Result<bool, PyObjectRef> {
    @@ -597,7 +623,7 @@
     }
     
     pub fn seq_ge(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         zelf: &[PyObjectRef],
         other: &[PyObjectRef],
     ) -> Result<bool, PyObjectRef> {
    @@ -605,16 +631,14 @@
     }
     
     pub fn seq_le(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         zelf: &[PyObjectRef],
         other: &[PyObjectRef],
     ) -> Result<bool, PyObjectRef> {
         Ok(seq_lt(vm, zelf, other)? || seq_equal(vm, zelf, other)?)
     }
     
    -pub fn seq_mul(elements: &[PyObjectRef], product: &PyObjectRef) -> Vec<PyObjectRef> {
    -    let counter = objint::get_value(&product).to_isize().unwrap();
    -
    +pub fn seq_mul(elements: &[PyObjectRef], counter: isize) -> Vec<PyObjectRef> {
         let current_len = elements.len();
         let new_len = counter.max(0) as usize * current_len;
         let mut new_elements = Vec::with_capacity(new_len);
    @@ -626,26 +650,34 @@
         new_elements
     }
     
    +pub fn get_elements_cell<'a>(obj: &'a PyObjectRef) -> &'a RefCell<Vec<PyObjectRef>> {
    +    if let Some(list) = obj.payload::<PyList>() {
    +        return &list.elements;
    +    }
    +    if let Some(tuple) = obj.payload::<PyTuple>() {
    +        return &tuple.elements;
    +    }
    +    panic!("Cannot extract elements from non-sequence");
    +}
    +
     pub fn get_elements<'a>(obj: &'a PyObjectRef) -> impl Deref<Target = Vec<PyObjectRef>> + 'a {
    -    Ref::map(obj.borrow(), |x| {
    -        if let PyObjectPayload::Sequence { ref elements } = x.payload {
    -            elements
    -        } else {
    -            panic!("Cannot extract elements from non-sequence");
    -        }
    -    })
    +    if let Some(list) = obj.payload::<PyList>() {
    +        return list.elements.borrow();
    +    }
    +    if let Some(tuple) = obj.payload::<PyTuple>() {
    +        return tuple.elements.borrow();
    +    }
    +    panic!("Cannot extract elements from non-sequence");
     }
     
     pub fn get_mut_elements<'a>(obj: &'a PyObjectRef) -> impl DerefMut<Target = Vec<PyObjectRef>> + 'a {
    -    RefMut::map(obj.borrow_mut(), |x| {
    -        if let PyObjectPayload::Sequence { ref mut elements } = x.payload {
    -            elements
    -        } else {
    -            panic!("Cannot extract list elements from non-sequence");
    -            // TODO: raise proper error?
    -            // Err(vm.new_type_error("list.append is called with no list".to_string()))
    -        }
    -    })
    +    if let Some(list) = obj.payload::<PyList>() {
    +        return list.elements.borrow_mut();
    +    }
    +    if let Some(tuple) = obj.payload::<PyTuple>() {
    +        return tuple.elements.borrow_mut();
    +    }
    +    panic!("Cannot extract elements from non-sequence");
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objset.rs.html b/src/rustpython_vm/obj/objset.rs.html index d32b0de..ed58ad6 100644 --- a/src/rustpython_vm/obj/objset.rs.html +++ b/src/rustpython_vm/obj/objset.rs.html @@ -1,4 +1,4 @@ -objset.rs.html -- source
      1
    +objset.rs.html -- source
      1
       2
       3
       4
    @@ -643,67 +643,55 @@
     643
     644
     645
    -646
    -647
    -648
    -649
    -650
    -651
    -652
    -653
    -654
    -655
    -656
    -657
    -658
    -659
    -660
    -661
    -662
    -663
    -664
    -665
    -666
    -667
    -668
    -669
    -670
    -671
    -672
    -673
    -674
    -675
     
     /*
      * Builtin set type with a sequence of unique items.
      */
     
    -use super::objbool;
    -use super::objint;
    -use super::objiter;
    -use super::objstr;
    -use super::objtype;
    +use std::cell::{Cell, RefCell};
    +use std::collections::{hash_map::DefaultHasher, HashMap};
    +use std::fmt;
    +use std::hash::{Hash, Hasher};
    +
    +use crate::function::{OptionalArg, PyFuncArgs};
     use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    +    PyContext, PyIteratorValue, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol,
     };
     use crate::vm::{ReprGuard, VirtualMachine};
    -use std::collections::hash_map::DefaultHasher;
    -use std::collections::HashMap;
    -use std::hash::{Hash, Hasher};
     
    -pub fn get_elements(obj: &PyObjectRef) -> HashMap<u64, PyObjectRef> {
    -    if let PyObjectPayload::Set { elements } = &obj.borrow().payload {
    -        elements.clone()
    -    } else {
    -        panic!("Cannot extract set elements from non-set");
    +use super::objbool;
    +use super::objint;
    +use super::objiter;
    +use super::objtype::{self, PyClassRef};
    +
    +#[derive(Default)]
    +pub struct PySet {
    +    elements: RefCell<HashMap<u64, PyObjectRef>>,
    +}
    +pub type PySetRef = PyRef<PySet>;
    +
    +impl fmt::Debug for PySet {
    +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    +        // TODO: implement more detailed, non-recursive Debug formatter
    +        f.write_str("set")
         }
     }
     
    +impl PyValue for PySet {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.set_type()
    +    }
    +}
    +
    +pub fn get_elements(obj: &PyObjectRef) -> HashMap<u64, PyObjectRef> {
    +    obj.payload::<PySet>().unwrap().elements.borrow().clone()
    +}
    +
     fn perform_action_with_hash(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         elements: &mut HashMap<u64, PyObjectRef>,
         item: &PyObjectRef,
    -    f: &Fn(&mut VirtualMachine, &mut HashMap<u64, PyObjectRef>, u64, &PyObjectRef) -> PyResult,
    +    f: &Fn(&VirtualMachine, &mut HashMap<u64, PyObjectRef>, u64, &PyObjectRef) -> PyResult,
     ) -> PyResult {
         let hash: PyObjectRef = vm.call_method(item, "__hash__", vec![])?;
     
    @@ -715,12 +703,12 @@
     }
     
     fn insert_into_set(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         elements: &mut HashMap<u64, PyObjectRef>,
         item: &PyObjectRef,
     ) -> PyResult {
         fn insert(
    -        vm: &mut VirtualMachine,
    +        vm: &VirtualMachine,
             elements: &mut HashMap<u64, PyObjectRef>,
             key: u64,
             value: &PyObjectRef,
    @@ -731,65 +719,59 @@
         perform_action_with_hash(vm, elements, item, &insert)
     }
     
    -fn set_add(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_add(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         trace!("set.add called with: {:?}", args);
         arg_check!(
             vm,
             args,
    -        required = [(s, Some(vm.ctx.set_type())), (item, None)]
    +        required = [(zelf, Some(vm.ctx.set_type())), (item, None)]
         );
    -    let mut mut_obj = s.borrow_mut();
    -
    -    match mut_obj.payload {
    -        PyObjectPayload::Set { ref mut elements } => insert_into_set(vm, elements, item),
    +    match zelf.payload::<PySet>() {
    +        Some(set) => insert_into_set(vm, &mut set.elements.borrow_mut(), item),
             _ => Err(vm.new_type_error("set.add is called with no item".to_string())),
         }
     }
     
    -fn set_remove(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_remove(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         trace!("set.remove called with: {:?}", args);
         arg_check!(
             vm,
             args,
             required = [(s, Some(vm.ctx.set_type())), (item, None)]
         );
    -    let mut mut_obj = s.borrow_mut();
    -
    -    match mut_obj.payload {
    -        PyObjectPayload::Set { ref mut elements } => {
    +    match s.payload::<PySet>() {
    +        Some(set) => {
                 fn remove(
    -                vm: &mut VirtualMachine,
    +                vm: &VirtualMachine,
                     elements: &mut HashMap<u64, PyObjectRef>,
                     key: u64,
                     value: &PyObjectRef,
                 ) -> PyResult {
                     match elements.remove(&key) {
                         None => {
    -                        let item_str = format!("{:?}", value.borrow());
    +                        let item_str = format!("{:?}", value);
                             Err(vm.new_key_error(item_str))
                         }
                         Some(_) => Ok(vm.get_none()),
                     }
                 }
    -            perform_action_with_hash(vm, elements, item, &remove)
    +            perform_action_with_hash(vm, &mut set.elements.borrow_mut(), item, &remove)
             }
             _ => Err(vm.new_type_error("set.remove is called with no item".to_string())),
         }
     }
     
    -fn set_discard(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_discard(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         trace!("set.discard called with: {:?}", args);
         arg_check!(
             vm,
             args,
             required = [(s, Some(vm.ctx.set_type())), (item, None)]
         );
    -    let mut mut_obj = s.borrow_mut();
    -
    -    match mut_obj.payload {
    -        PyObjectPayload::Set { ref mut elements } => {
    +    match s.payload::<PySet>() {
    +        Some(set) => {
                 fn discard(
    -                vm: &mut VirtualMachine,
    +                vm: &VirtualMachine,
                     elements: &mut HashMap<u64, PyObjectRef>,
                     key: u64,
                     _value: &PyObjectRef,
    @@ -797,43 +779,39 @@
                     elements.remove(&key);
                     Ok(vm.get_none())
                 }
    -            perform_action_with_hash(vm, elements, item, &discard)
    +            perform_action_with_hash(vm, &mut set.elements.borrow_mut(), item, &discard)
             }
    -        _ => Err(vm.new_type_error("set.discard is called with no item".to_string())),
    +        None => Err(vm.new_type_error("set.discard is called with no item".to_string())),
         }
     }
     
    -fn set_clear(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_clear(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         trace!("set.clear called");
         arg_check!(vm, args, required = [(s, Some(vm.ctx.set_type()))]);
    -    let mut mut_obj = s.borrow_mut();
    -    match mut_obj.payload {
    -        PyObjectPayload::Set { ref mut elements } => {
    -            elements.clear();
    +    match s.payload::<PySet>() {
    +        Some(set) => {
    +            set.elements.borrow_mut().clear();
                 Ok(vm.get_none())
             }
    -        _ => Err(vm.new_type_error("".to_string())),
    +        None => Err(vm.new_type_error("".to_string())),
         }
     }
     
     /* Create a new object of sub-type of set */
    -fn set_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(cls, None)],
    -        optional = [(iterable, None)]
    -    );
    -
    -    if !objtype::issubclass(cls, &vm.ctx.set_type()) {
    -        return Err(vm.new_type_error(format!("{} is not a subtype of set", cls.borrow())));
    +fn set_new(
    +    cls: PyClassRef,
    +    iterable: OptionalArg<PyObjectRef>,
    +    vm: &VirtualMachine,
    +) -> PyResult<PySetRef> {
    +    if !objtype::issubclass(cls.as_object(), &vm.ctx.set_type()) {
    +        return Err(vm.new_type_error(format!("{} is not a subtype of set", cls)));
         }
     
         let elements: HashMap<u64, PyObjectRef> = match iterable {
    -        None => HashMap::new(),
    -        Some(iterable) => {
    +        OptionalArg::Missing => HashMap::new(),
    +        OptionalArg::Present(iterable) => {
                 let mut elements = HashMap::new();
    -            let iterator = objiter::get_iter(vm, iterable)?;
    +            let iterator = objiter::get_iter(vm, &iterable)?;
                 while let Ok(v) = vm.call_method(&iterator, "__next__", vec![]) {
                     insert_into_set(vm, &mut elements, &v)?;
                 }
    @@ -841,30 +819,28 @@
             }
         };
     
    -    Ok(PyObject::new(
    -        PyObjectPayload::Set { elements },
    -        cls.clone(),
    -    ))
    +    PySet {
    +        elements: RefCell::new(elements),
    +    }
    +    .into_ref_with_type(vm, cls)
     }
     
    -fn set_len(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_len(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         trace!("set.len called with: {:?}", args);
         arg_check!(vm, args, required = [(s, Some(vm.ctx.set_type()))]);
         let elements = get_elements(s);
         Ok(vm.context().new_int(elements.len()))
     }
     
    -fn set_copy(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("set.copy called with: {:?}", args);
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.set_type()))]);
    -    let elements = get_elements(s);
    -    Ok(PyObject::new(
    -        PyObjectPayload::Set { elements },
    -        vm.ctx.set_type(),
    -    ))
    +fn set_copy(obj: PySetRef, _vm: &VirtualMachine) -> PySet {
    +    trace!("set.copy called with: {:?}", obj);
    +    let elements = obj.elements.borrow().clone();
    +    PySet {
    +        elements: RefCell::new(elements),
    +    }
     }
     
    -fn set_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_repr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(o, Some(vm.ctx.set_type()))]);
     
         let elements = get_elements(o);
    @@ -874,7 +850,7 @@
             let mut str_parts = vec![];
             for elem in elements.values() {
                 let part = vm.to_repr(elem)?;
    -            str_parts.push(objstr::get_value(&part));
    +            str_parts.push(part.value.clone());
             }
     
             format!("{{{}}}", str_parts.join(", "))
    @@ -884,7 +860,7 @@
         Ok(vm.new_str(s))
     }
     
    -pub fn set_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +pub fn set_contains(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -904,7 +880,7 @@
         Ok(vm.new_bool(false))
     }
     
    -fn set_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_eq(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_compare_inner(
             vm,
             args,
    @@ -913,7 +889,7 @@
         )
     }
     
    -fn set_ge(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_ge(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_compare_inner(
             vm,
             args,
    @@ -922,7 +898,7 @@
         )
     }
     
    -fn set_gt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_gt(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_compare_inner(
             vm,
             args,
    @@ -931,7 +907,7 @@
         )
     }
     
    -fn set_le(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_le(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_compare_inner(
             vm,
             args,
    @@ -940,7 +916,7 @@
         )
     }
     
    -fn set_lt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_lt(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_compare_inner(
             vm,
             args,
    @@ -950,7 +926,7 @@
     }
     
     fn set_compare_inner(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         args: PyFuncArgs,
         size_func: &Fn(usize, usize) -> bool,
         swap: bool,
    @@ -997,63 +973,47 @@
         Ok(vm.new_bool(true))
     }
     
    -fn set_union(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (zelf, Some(vm.ctx.set_type())),
    -            (other, Some(vm.ctx.set_type()))
    -        ]
    -    );
    -
    -    let mut elements = get_elements(zelf).clone();
    -    elements.extend(get_elements(other).clone());
    +fn set_union(zelf: PySetRef, other: PySetRef, _vm: &VirtualMachine) -> PySet {
    +    let mut elements = zelf.elements.borrow().clone();
    +    elements.extend(other.elements.borrow().clone());
     
    -    Ok(PyObject::new(
    -        PyObjectPayload::Set { elements },
    -        vm.ctx.set_type(),
    -    ))
    +    PySet {
    +        elements: RefCell::new(elements),
    +    }
     }
     
    -fn set_intersection(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    set_combine_inner(vm, args, SetCombineOperation::Intersection)
    +fn set_intersection(zelf: PySetRef, other: PySetRef, vm: &VirtualMachine) -> PyResult<PySet> {
    +    set_combine_inner(zelf, other, vm, SetCombineOperation::Intersection)
     }
     
    -fn set_difference(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    set_combine_inner(vm, args, SetCombineOperation::Difference)
    +fn set_difference(zelf: PySetRef, other: PySetRef, vm: &VirtualMachine) -> PyResult<PySet> {
    +    set_combine_inner(zelf, other, vm, SetCombineOperation::Difference)
     }
     
    -fn set_symmetric_difference(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (zelf, Some(vm.ctx.set_type())),
    -            (other, Some(vm.ctx.set_type()))
    -        ]
    -    );
    -
    +fn set_symmetric_difference(
    +    zelf: PySetRef,
    +    other: PySetRef,
    +    vm: &VirtualMachine,
    +) -> PyResult<PySet> {
         let mut elements = HashMap::new();
     
    -    for element in get_elements(zelf).iter() {
    -        let value = vm.call_method(other, "__contains__", vec![element.1.clone()])?;
    +    for element in zelf.elements.borrow().iter() {
    +        let value = vm.call_method(other.as_object(), "__contains__", vec![element.1.clone()])?;
             if !objbool::get_value(&value) {
                 elements.insert(element.0.clone(), element.1.clone());
             }
         }
     
    -    for element in get_elements(other).iter() {
    -        let value = vm.call_method(zelf, "__contains__", vec![element.1.clone()])?;
    +    for element in other.elements.borrow().iter() {
    +        let value = vm.call_method(zelf.as_object(), "__contains__", vec![element.1.clone()])?;
             if !objbool::get_value(&value) {
                 elements.insert(element.0.clone(), element.1.clone());
             }
         }
     
    -    Ok(PyObject::new(
    -        PyObjectPayload::Set { elements },
    -        vm.ctx.set_type(),
    -    ))
    +    Ok(PySet {
    +        elements: RefCell::new(elements),
    +    })
     }
     
     enum SetCombineOperation {
    @@ -1062,23 +1022,15 @@
     }
     
     fn set_combine_inner(
    -    vm: &mut VirtualMachine,
    -    args: PyFuncArgs,
    +    zelf: PySetRef,
    +    other: PySetRef,
    +    vm: &VirtualMachine,
         op: SetCombineOperation,
    -) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (zelf, Some(vm.ctx.set_type())),
    -            (other, Some(vm.ctx.set_type()))
    -        ]
    -    );
    -
    +) -> PyResult<PySet> {
         let mut elements = HashMap::new();
     
    -    for element in get_elements(zelf).iter() {
    -        let value = vm.call_method(other, "__contains__", vec![element.1.clone()])?;
    +    for element in zelf.elements.borrow().iter() {
    +        let value = vm.call_method(other.as_object(), "__contains__", vec![element.1.clone()])?;
             let should_add = match op {
                 SetCombineOperation::Intersection => objbool::get_value(&value),
                 SetCombineOperation::Difference => !objbool::get_value(&value),
    @@ -1088,45 +1040,43 @@
             }
         }
     
    -    Ok(PyObject::new(
    -        PyObjectPayload::Set { elements },
    -        vm.ctx.set_type(),
    -    ))
    +    Ok(PySet {
    +        elements: RefCell::new(elements),
    +    })
     }
     
    -fn set_pop(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_pop(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(s, Some(vm.ctx.set_type()))]);
     
    -    let mut mut_obj = s.borrow_mut();
    -
    -    match mut_obj.payload {
    -        PyObjectPayload::Set { ref mut elements } => match elements.clone().keys().next() {
    -            Some(key) => Ok(elements.remove(key).unwrap()),
    -            None => Err(vm.new_key_error("pop from an empty set".to_string())),
    -        },
    +    match s.payload::<PySet>() {
    +        Some(set) => {
    +            let mut elements = set.elements.borrow_mut();
    +            match elements.clone().keys().next() {
    +                Some(key) => Ok(elements.remove(key).unwrap()),
    +                None => Err(vm.new_key_error("pop from an empty set".to_string())),
    +            }
    +        }
             _ => Err(vm.new_type_error("".to_string())),
         }
     }
     
    -fn set_update(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_update(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_ior(vm, args)?;
         Ok(vm.get_none())
     }
     
    -fn set_ior(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_ior(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
             required = [(zelf, Some(vm.ctx.set_type())), (iterable, None)]
         );
     
    -    let mut mut_obj = zelf.borrow_mut();
    -
    -    match mut_obj.payload {
    -        PyObjectPayload::Set { ref mut elements } => {
    +    match zelf.payload::<PySet>() {
    +        Some(set) => {
                 let iterator = objiter::get_iter(vm, iterable)?;
                 while let Ok(v) = vm.call_method(&iterator, "__next__", vec![]) {
    -                insert_into_set(vm, elements, &v)?;
    +                insert_into_set(vm, &mut set.elements.borrow_mut(), &v)?;
                 }
             }
             _ => return Err(vm.new_type_error("set.update is called with no other".to_string())),
    @@ -1134,26 +1084,26 @@
         Ok(zelf.clone())
     }
     
    -fn set_intersection_update(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_intersection_update(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_combine_update_inner(vm, args, SetCombineOperation::Intersection)?;
         Ok(vm.get_none())
     }
     
    -fn set_iand(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_iand(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_combine_update_inner(vm, args, SetCombineOperation::Intersection)
     }
     
    -fn set_difference_update(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_difference_update(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_combine_update_inner(vm, args, SetCombineOperation::Difference)?;
         Ok(vm.get_none())
     }
     
    -fn set_isub(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_isub(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_combine_update_inner(vm, args, SetCombineOperation::Difference)
     }
     
     fn set_combine_update_inner(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         args: PyFuncArgs,
         op: SetCombineOperation,
     ) -> PyResult {
    @@ -1163,10 +1113,9 @@
             required = [(zelf, Some(vm.ctx.set_type())), (iterable, None)]
         );
     
    -    let mut mut_obj = zelf.borrow_mut();
    -
    -    match mut_obj.payload {
    -        PyObjectPayload::Set { ref mut elements } => {
    +    match zelf.payload::<PySet>() {
    +        Some(set) => {
    +            let mut elements = set.elements.borrow_mut();
                 for element in elements.clone().iter() {
                     let value = vm.call_method(iterable, "__contains__", vec![element.1.clone()])?;
                     let should_remove = match op {
    @@ -1183,31 +1132,29 @@
         Ok(zelf.clone())
     }
     
    -fn set_symmetric_difference_update(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_symmetric_difference_update(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         set_ixor(vm, args)?;
         Ok(vm.get_none())
     }
     
    -fn set_ixor(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn set_ixor(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
             required = [(zelf, Some(vm.ctx.set_type())), (iterable, None)]
         );
     
    -    let mut mut_obj = zelf.borrow_mut();
    -
    -    match mut_obj.payload {
    -        PyObjectPayload::Set { ref mut elements } => {
    -            let elements_original = elements.clone();
    +    match zelf.payload::<PySet>() {
    +        Some(set) => {
    +            let elements_original = set.elements.borrow().clone();
                 let iterator = objiter::get_iter(vm, iterable)?;
                 while let Ok(v) = vm.call_method(&iterator, "__next__", vec![]) {
    -                insert_into_set(vm, elements, &v)?;
    +                insert_into_set(vm, &mut set.elements.borrow_mut(), &v)?;
                 }
                 for element in elements_original.iter() {
                     let value = vm.call_method(iterable, "__contains__", vec![element.1.clone()])?;
                     if objbool::get_value(&value) {
    -                    elements.remove(&element.0.clone());
    +                    set.elements.borrow_mut().remove(&element.0.clone());
                     }
                 }
             }
    @@ -1217,23 +1164,16 @@
         Ok(zelf.clone())
     }
     
    -fn set_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.set_type()))]);
    -
    -    let items = get_elements(zelf).values().map(|x| x.clone()).collect();
    +fn set_iter(zelf: PySetRef, vm: &VirtualMachine) -> PyIteratorValue {
    +    let items = zelf.elements.borrow().values().cloned().collect();
         let set_list = vm.ctx.new_list(items);
    -    let iter_obj = PyObject::new(
    -        PyObjectPayload::Iterator {
    -            position: 0,
    -            iterated_obj: set_list,
    -        },
    -        vm.ctx.iter_type(),
    -    );
    -
    -    Ok(iter_obj)
    +    PyIteratorValue {
    +        position: Cell::new(0),
    +        iterated_obj: set_list,
    +    }
     }
     
    -fn frozenset_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn frozenset_repr(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(o, Some(vm.ctx.frozenset_type()))]);
     
         let elements = get_elements(o);
    @@ -1243,7 +1183,7 @@
             let mut str_parts = vec![];
             for elem in elements.values() {
                 let part = vm.to_repr(elem)?;
    -            str_parts.push(objstr::get_value(&part));
    +            str_parts.push(part.value.clone());
             }
     
             format!("frozenset({{{}}})", str_parts.join(", "))
    @@ -1350,4 +1290,4 @@
         );
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objslice.rs.html b/src/rustpython_vm/obj/objslice.rs.html index e795eb4..b4b46e1 100644 --- a/src/rustpython_vm/obj/objslice.rs.html +++ b/src/rustpython_vm/obj/objslice.rs.html @@ -1,106 +1,136 @@ -objslice.rs.html -- source
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    -87
    -88
    -89
    -90
    -91
    -92
    -93
    -94
    +objslice.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
     
    -use super::objint;
    -use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    -};
    -use crate::vm::VirtualMachine;
     use num_bigint::BigInt;
     
    -fn slice_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{PyContext, PyObject, PyObjectRef, PyResult, PyValue, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
    +use super::objint;
    +
    +#[derive(Debug)]
    +pub struct PySlice {
    +    // TODO: should be private
    +    pub start: Option<BigInt>,
    +    pub stop: Option<BigInt>,
    +    pub step: Option<BigInt>,
    +}
    +
    +impl PyValue for PySlice {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.slice_type()
    +    }
    +}
    +
    +fn slice_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         no_kwargs!(vm, args);
         let (cls, start, stop, step): (
             &PyObjectRef,
    @@ -135,16 +165,16 @@
             }
         }?;
         Ok(PyObject::new(
    -        PyObjectPayload::Slice {
    -            start: start.map(|x| objint::get_value(x)),
    -            stop: stop.map(|x| objint::get_value(x)),
    -            step: step.map(|x| objint::get_value(x)),
    +        PySlice {
    +            start: start.map(|x| objint::get_value(x).clone()),
    +            stop: stop.map(|x| objint::get_value(x).clone()),
    +            step: step.map(|x| objint::get_value(x).clone()),
             },
             cls.clone(),
         ))
     }
     
    -fn get_property_value(vm: &mut VirtualMachine, value: &Option<BigInt>) -> PyResult {
    +fn get_property_value(vm: &VirtualMachine, value: &Option<BigInt>) -> PyResult {
         if let Some(value) = value {
             Ok(vm.ctx.new_int(value.clone()))
         } else {
    @@ -152,27 +182,27 @@
         }
     }
     
    -fn slice_start(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn slice_start(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(slice, Some(vm.ctx.slice_type()))]);
    -    if let PyObjectPayload::Slice { start, .. } = &slice.borrow().payload {
    +    if let Some(PySlice { start, .. }) = &slice.payload() {
             get_property_value(vm, start)
         } else {
             panic!("Slice has incorrect payload.");
         }
     }
     
    -fn slice_stop(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn slice_stop(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(slice, Some(vm.ctx.slice_type()))]);
    -    if let PyObjectPayload::Slice { stop, .. } = &slice.borrow().payload {
    +    if let Some(PySlice { stop, .. }) = &slice.payload() {
             get_property_value(vm, stop)
         } else {
             panic!("Slice has incorrect payload.");
         }
     }
     
    -fn slice_step(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn slice_step(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(slice, Some(vm.ctx.slice_type()))]);
    -    if let PyObjectPayload::Slice { step, .. } = &slice.borrow().payload {
    +    if let Some(PySlice { step, .. }) = &slice.payload() {
             get_property_value(vm, step)
         } else {
             panic!("Slice has incorrect payload.");
    @@ -188,4 +218,4 @@
         context.set_attr(zip_type, "step", context.new_property(slice_step));
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objstaticmethod.rs.html b/src/rustpython_vm/obj/objstaticmethod.rs.html new file mode 100644 index 0000000..b43a70d --- /dev/null +++ b/src/rustpython_vm/obj/objstaticmethod.rs.html @@ -0,0 +1,83 @@ +objstaticmethod.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +
    +use super::objtype::PyClassRef;
    +use crate::pyobject::{PyContext, PyObjectRef, PyRef, PyResult, PyValue};
    +use crate::vm::VirtualMachine;
    +
    +#[derive(Clone, Debug)]
    +pub struct PyStaticMethod {
    +    pub callable: PyObjectRef,
    +}
    +pub type PyStaticMethodRef = PyRef<PyStaticMethod>;
    +
    +impl PyValue for PyStaticMethod {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.staticmethod_type()
    +    }
    +}
    +
    +impl PyStaticMethodRef {
    +    fn new(
    +        cls: PyClassRef,
    +        callable: PyObjectRef,
    +        vm: &VirtualMachine,
    +    ) -> PyResult<PyStaticMethodRef> {
    +        PyStaticMethod {
    +            callable: callable.clone(),
    +        }
    +        .into_ref_with_type(vm, cls)
    +    }
    +
    +    fn get(self, _inst: PyObjectRef, _owner: PyObjectRef, _vm: &VirtualMachine) -> PyResult {
    +        Ok(self.callable.clone())
    +    }
    +}
    +
    +pub fn init(context: &PyContext) {
    +    let staticmethod_type = &context.staticmethod_type;
    +    extend_class!(context, staticmethod_type, {
    +        "__get__" => context.new_rustfunc(PyStaticMethodRef::get),
    +        "__new__" => context.new_rustfunc(PyStaticMethodRef::new),
    +    });
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objstr.rs.html b/src/rustpython_vm/obj/objstr.rs.html index 6356a00..f75003e 100644 --- a/src/rustpython_vm/obj/objstr.rs.html +++ b/src/rustpython_vm/obj/objstr.rs.html @@ -1,1424 +1,1652 @@ -objstr.rs.html -- source
       1
    -   2
    -   3
    -   4
    -   5
    -   6
    -   7
    -   8
    -   9
    -  10
    -  11
    -  12
    -  13
    -  14
    -  15
    -  16
    -  17
    -  18
    -  19
    -  20
    -  21
    -  22
    -  23
    -  24
    -  25
    -  26
    -  27
    -  28
    -  29
    -  30
    -  31
    -  32
    -  33
    -  34
    -  35
    -  36
    -  37
    -  38
    -  39
    -  40
    -  41
    -  42
    -  43
    -  44
    -  45
    -  46
    -  47
    -  48
    -  49
    -  50
    -  51
    -  52
    -  53
    -  54
    -  55
    -  56
    -  57
    -  58
    -  59
    -  60
    -  61
    -  62
    -  63
    -  64
    -  65
    -  66
    -  67
    -  68
    -  69
    -  70
    -  71
    -  72
    -  73
    -  74
    -  75
    -  76
    -  77
    -  78
    -  79
    -  80
    -  81
    -  82
    -  83
    -  84
    -  85
    -  86
    -  87
    -  88
    -  89
    -  90
    -  91
    -  92
    -  93
    -  94
    -  95
    -  96
    -  97
    -  98
    -  99
    - 100
    - 101
    - 102
    - 103
    - 104
    - 105
    - 106
    - 107
    - 108
    - 109
    - 110
    - 111
    - 112
    - 113
    - 114
    - 115
    - 116
    - 117
    - 118
    - 119
    - 120
    - 121
    - 122
    - 123
    - 124
    - 125
    - 126
    - 127
    - 128
    - 129
    - 130
    - 131
    - 132
    - 133
    - 134
    - 135
    - 136
    - 137
    - 138
    - 139
    - 140
    - 141
    - 142
    - 143
    - 144
    - 145
    - 146
    - 147
    - 148
    - 149
    - 150
    - 151
    - 152
    - 153
    - 154
    - 155
    - 156
    - 157
    - 158
    - 159
    - 160
    - 161
    - 162
    - 163
    - 164
    - 165
    - 166
    - 167
    - 168
    - 169
    - 170
    - 171
    - 172
    - 173
    - 174
    - 175
    - 176
    - 177
    - 178
    - 179
    - 180
    - 181
    - 182
    - 183
    - 184
    - 185
    - 186
    - 187
    - 188
    - 189
    - 190
    - 191
    - 192
    - 193
    - 194
    - 195
    - 196
    - 197
    - 198
    - 199
    - 200
    - 201
    - 202
    - 203
    - 204
    - 205
    - 206
    - 207
    - 208
    - 209
    - 210
    - 211
    - 212
    - 213
    - 214
    - 215
    - 216
    - 217
    - 218
    - 219
    - 220
    - 221
    - 222
    - 223
    - 224
    - 225
    - 226
    - 227
    - 228
    - 229
    - 230
    - 231
    - 232
    - 233
    - 234
    - 235
    - 236
    - 237
    - 238
    - 239
    - 240
    - 241
    - 242
    - 243
    - 244
    - 245
    - 246
    - 247
    - 248
    - 249
    - 250
    - 251
    - 252
    - 253
    - 254
    - 255
    - 256
    - 257
    - 258
    - 259
    - 260
    - 261
    - 262
    - 263
    - 264
    - 265
    - 266
    - 267
    - 268
    - 269
    - 270
    - 271
    - 272
    - 273
    - 274
    - 275
    - 276
    - 277
    - 278
    - 279
    - 280
    - 281
    - 282
    - 283
    - 284
    - 285
    - 286
    - 287
    - 288
    - 289
    - 290
    - 291
    - 292
    - 293
    - 294
    - 295
    - 296
    - 297
    - 298
    - 299
    - 300
    - 301
    - 302
    - 303
    - 304
    - 305
    - 306
    - 307
    - 308
    - 309
    - 310
    - 311
    - 312
    - 313
    - 314
    - 315
    - 316
    - 317
    - 318
    - 319
    - 320
    - 321
    - 322
    - 323
    - 324
    - 325
    - 326
    - 327
    - 328
    - 329
    - 330
    - 331
    - 332
    - 333
    - 334
    - 335
    - 336
    - 337
    - 338
    - 339
    - 340
    - 341
    - 342
    - 343
    - 344
    - 345
    - 346
    - 347
    - 348
    - 349
    - 350
    - 351
    - 352
    - 353
    - 354
    - 355
    - 356
    - 357
    - 358
    - 359
    - 360
    - 361
    - 362
    - 363
    - 364
    - 365
    - 366
    - 367
    - 368
    - 369
    - 370
    - 371
    - 372
    - 373
    - 374
    - 375
    - 376
    - 377
    - 378
    - 379
    - 380
    - 381
    - 382
    - 383
    - 384
    - 385
    - 386
    - 387
    - 388
    - 389
    - 390
    - 391
    - 392
    - 393
    - 394
    - 395
    - 396
    - 397
    - 398
    - 399
    - 400
    - 401
    - 402
    - 403
    - 404
    - 405
    - 406
    - 407
    - 408
    - 409
    - 410
    - 411
    - 412
    - 413
    - 414
    - 415
    - 416
    - 417
    - 418
    - 419
    - 420
    - 421
    - 422
    - 423
    - 424
    - 425
    - 426
    - 427
    - 428
    - 429
    - 430
    - 431
    - 432
    - 433
    - 434
    - 435
    - 436
    - 437
    - 438
    - 439
    - 440
    - 441
    - 442
    - 443
    - 444
    - 445
    - 446
    - 447
    - 448
    - 449
    - 450
    - 451
    - 452
    - 453
    - 454
    - 455
    - 456
    - 457
    - 458
    - 459
    - 460
    - 461
    - 462
    - 463
    - 464
    - 465
    - 466
    - 467
    - 468
    - 469
    - 470
    - 471
    - 472
    - 473
    - 474
    - 475
    - 476
    - 477
    - 478
    - 479
    - 480
    - 481
    - 482
    - 483
    - 484
    - 485
    - 486
    - 487
    - 488
    - 489
    - 490
    - 491
    - 492
    - 493
    - 494
    - 495
    - 496
    - 497
    - 498
    - 499
    - 500
    - 501
    - 502
    - 503
    - 504
    - 505
    - 506
    - 507
    - 508
    - 509
    - 510
    - 511
    - 512
    - 513
    - 514
    - 515
    - 516
    - 517
    - 518
    - 519
    - 520
    - 521
    - 522
    - 523
    - 524
    - 525
    - 526
    - 527
    - 528
    - 529
    - 530
    - 531
    - 532
    - 533
    - 534
    - 535
    - 536
    - 537
    - 538
    - 539
    - 540
    - 541
    - 542
    - 543
    - 544
    - 545
    - 546
    - 547
    - 548
    - 549
    - 550
    - 551
    - 552
    - 553
    - 554
    - 555
    - 556
    - 557
    - 558
    - 559
    - 560
    - 561
    - 562
    - 563
    - 564
    - 565
    - 566
    - 567
    - 568
    - 569
    - 570
    - 571
    - 572
    - 573
    - 574
    - 575
    - 576
    - 577
    - 578
    - 579
    - 580
    - 581
    - 582
    - 583
    - 584
    - 585
    - 586
    - 587
    - 588
    - 589
    - 590
    - 591
    - 592
    - 593
    - 594
    - 595
    - 596
    - 597
    - 598
    - 599
    - 600
    - 601
    - 602
    - 603
    - 604
    - 605
    - 606
    - 607
    - 608
    - 609
    - 610
    - 611
    - 612
    - 613
    - 614
    - 615
    - 616
    - 617
    - 618
    - 619
    - 620
    - 621
    - 622
    - 623
    - 624
    - 625
    - 626
    - 627
    - 628
    - 629
    - 630
    - 631
    - 632
    - 633
    - 634
    - 635
    - 636
    - 637
    - 638
    - 639
    - 640
    - 641
    - 642
    - 643
    - 644
    - 645
    - 646
    - 647
    - 648
    - 649
    - 650
    - 651
    - 652
    - 653
    - 654
    - 655
    - 656
    - 657
    - 658
    - 659
    - 660
    - 661
    - 662
    - 663
    - 664
    - 665
    - 666
    - 667
    - 668
    - 669
    - 670
    - 671
    - 672
    - 673
    - 674
    - 675
    - 676
    - 677
    - 678
    - 679
    - 680
    - 681
    - 682
    - 683
    - 684
    - 685
    - 686
    - 687
    - 688
    - 689
    - 690
    - 691
    - 692
    - 693
    - 694
    - 695
    - 696
    - 697
    - 698
    - 699
    - 700
    - 701
    - 702
    - 703
    - 704
    - 705
    - 706
    - 707
    - 708
    - 709
    - 710
    - 711
    - 712
    - 713
    - 714
    - 715
    - 716
    - 717
    - 718
    - 719
    - 720
    - 721
    - 722
    - 723
    - 724
    - 725
    - 726
    - 727
    - 728
    - 729
    - 730
    - 731
    - 732
    - 733
    - 734
    - 735
    - 736
    - 737
    - 738
    - 739
    - 740
    - 741
    - 742
    - 743
    - 744
    - 745
    - 746
    - 747
    - 748
    - 749
    - 750
    - 751
    - 752
    - 753
    - 754
    - 755
    - 756
    - 757
    - 758
    - 759
    - 760
    - 761
    - 762
    - 763
    - 764
    - 765
    - 766
    - 767
    - 768
    - 769
    - 770
    - 771
    - 772
    - 773
    - 774
    - 775
    - 776
    - 777
    - 778
    - 779
    - 780
    - 781
    - 782
    - 783
    - 784
    - 785
    - 786
    - 787
    - 788
    - 789
    - 790
    - 791
    - 792
    - 793
    - 794
    - 795
    - 796
    - 797
    - 798
    - 799
    - 800
    - 801
    - 802
    - 803
    - 804
    - 805
    - 806
    - 807
    - 808
    - 809
    - 810
    - 811
    - 812
    - 813
    - 814
    - 815
    - 816
    - 817
    - 818
    - 819
    - 820
    - 821
    - 822
    - 823
    - 824
    - 825
    - 826
    - 827
    - 828
    - 829
    - 830
    - 831
    - 832
    - 833
    - 834
    - 835
    - 836
    - 837
    - 838
    - 839
    - 840
    - 841
    - 842
    - 843
    - 844
    - 845
    - 846
    - 847
    - 848
    - 849
    - 850
    - 851
    - 852
    - 853
    - 854
    - 855
    - 856
    - 857
    - 858
    - 859
    - 860
    - 861
    - 862
    - 863
    - 864
    - 865
    - 866
    - 867
    - 868
    - 869
    - 870
    - 871
    - 872
    - 873
    - 874
    - 875
    - 876
    - 877
    - 878
    - 879
    - 880
    - 881
    - 882
    - 883
    - 884
    - 885
    - 886
    - 887
    - 888
    - 889
    - 890
    - 891
    - 892
    - 893
    - 894
    - 895
    - 896
    - 897
    - 898
    - 899
    - 900
    - 901
    - 902
    - 903
    - 904
    - 905
    - 906
    - 907
    - 908
    - 909
    - 910
    - 911
    - 912
    - 913
    - 914
    - 915
    - 916
    - 917
    - 918
    - 919
    - 920
    - 921
    - 922
    - 923
    - 924
    - 925
    - 926
    - 927
    - 928
    - 929
    - 930
    - 931
    - 932
    - 933
    - 934
    - 935
    - 936
    - 937
    - 938
    - 939
    - 940
    - 941
    - 942
    - 943
    - 944
    - 945
    - 946
    - 947
    - 948
    - 949
    - 950
    - 951
    - 952
    - 953
    - 954
    - 955
    - 956
    - 957
    - 958
    - 959
    - 960
    - 961
    - 962
    - 963
    - 964
    - 965
    - 966
    - 967
    - 968
    - 969
    - 970
    - 971
    - 972
    - 973
    - 974
    - 975
    - 976
    - 977
    - 978
    - 979
    - 980
    - 981
    - 982
    - 983
    - 984
    - 985
    - 986
    - 987
    - 988
    - 989
    - 990
    - 991
    - 992
    - 993
    - 994
    - 995
    - 996
    - 997
    - 998
    - 999
    -1000
    -1001
    -1002
    -1003
    -1004
    -1005
    -1006
    -1007
    -1008
    -1009
    -1010
    -1011
    -1012
    -1013
    -1014
    -1015
    -1016
    -1017
    -1018
    -1019
    -1020
    -1021
    -1022
    -1023
    -1024
    -1025
    -1026
    -1027
    -1028
    -1029
    -1030
    -1031
    -1032
    -1033
    -1034
    -1035
    -1036
    -1037
    -1038
    -1039
    -1040
    -1041
    -1042
    -1043
    -1044
    -1045
    -1046
    -1047
    -1048
    -1049
    -1050
    -1051
    -1052
    -1053
    -1054
    -1055
    -1056
    -1057
    -1058
    -1059
    -1060
    -1061
    -1062
    -1063
    -1064
    -1065
    -1066
    -1067
    -1068
    -1069
    -1070
    -1071
    -1072
    -1073
    -1074
    -1075
    -1076
    -1077
    -1078
    -1079
    -1080
    -1081
    -1082
    -1083
    -1084
    -1085
    -1086
    -1087
    -1088
    -1089
    -1090
    -1091
    -1092
    -1093
    -1094
    -1095
    -1096
    -1097
    -1098
    -1099
    -1100
    -1101
    -1102
    -1103
    -1104
    -1105
    -1106
    -1107
    -1108
    -1109
    -1110
    -1111
    -1112
    -1113
    -1114
    -1115
    -1116
    -1117
    -1118
    -1119
    -1120
    -1121
    -1122
    -1123
    -1124
    -1125
    -1126
    -1127
    -1128
    -1129
    -1130
    -1131
    -1132
    -1133
    -1134
    -1135
    -1136
    -1137
    -1138
    -1139
    -1140
    -1141
    -1142
    -1143
    -1144
    -1145
    -1146
    -1147
    -1148
    -1149
    -1150
    -1151
    -1152
    -1153
    -1154
    -1155
    -1156
    -1157
    -1158
    -1159
    -1160
    -1161
    -1162
    -1163
    -1164
    -1165
    -1166
    +objstr.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    +175
    +176
    +177
    +178
    +179
    +180
    +181
    +182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    +217
    +218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +246
    +247
    +248
    +249
    +250
    +251
    +252
    +253
    +254
    +255
    +256
    +257
    +258
    +259
    +260
    +261
    +262
    +263
    +264
    +265
    +266
    +267
    +268
    +269
    +270
    +271
    +272
    +273
    +274
    +275
    +276
    +277
    +278
    +279
    +280
    +281
    +282
    +283
    +284
    +285
    +286
    +287
    +288
    +289
    +290
    +291
    +292
    +293
    +294
    +295
    +296
    +297
    +298
    +299
    +300
    +301
    +302
    +303
    +304
    +305
    +306
    +307
    +308
    +309
    +310
    +311
    +312
    +313
    +314
    +315
    +316
    +317
    +318
    +319
    +320
    +321
    +322
    +323
    +324
    +325
    +326
    +327
    +328
    +329
    +330
    +331
    +332
    +333
    +334
    +335
    +336
    +337
    +338
    +339
    +340
    +341
    +342
    +343
    +344
    +345
    +346
    +347
    +348
    +349
    +350
    +351
    +352
    +353
    +354
    +355
    +356
    +357
    +358
    +359
    +360
    +361
    +362
    +363
    +364
    +365
    +366
    +367
    +368
    +369
    +370
    +371
    +372
    +373
    +374
    +375
    +376
    +377
    +378
    +379
    +380
    +381
    +382
    +383
    +384
    +385
    +386
    +387
    +388
    +389
    +390
    +391
    +392
    +393
    +394
    +395
    +396
    +397
    +398
    +399
    +400
    +401
    +402
    +403
    +404
    +405
    +406
    +407
    +408
    +409
    +410
    +411
    +412
    +413
    +414
    +415
    +416
    +417
    +418
    +419
    +420
    +421
    +422
    +423
    +424
    +425
    +426
    +427
    +428
    +429
    +430
    +431
    +432
    +433
    +434
    +435
    +436
    +437
    +438
    +439
    +440
    +441
    +442
    +443
    +444
    +445
    +446
    +447
    +448
    +449
    +450
    +451
    +452
    +453
    +454
    +455
    +456
    +457
    +458
    +459
    +460
    +461
    +462
    +463
    +464
    +465
    +466
    +467
    +468
    +469
    +470
    +471
    +472
    +473
    +474
    +475
    +476
    +477
    +478
    +479
    +480
    +481
    +482
    +483
    +484
    +485
    +486
    +487
    +488
    +489
    +490
    +491
    +492
    +493
    +494
    +495
    +496
    +497
    +498
    +499
    +500
    +501
    +502
    +503
    +504
    +505
    +506
    +507
    +508
    +509
    +510
    +511
    +512
    +513
    +514
    +515
    +516
    +517
    +518
    +519
    +520
    +521
    +522
    +523
    +524
    +525
    +526
    +527
    +528
    +529
    +530
    +531
    +532
    +533
    +534
    +535
    +536
    +537
    +538
    +539
    +540
    +541
    +542
    +543
    +544
    +545
    +546
    +547
    +548
    +549
    +550
    +551
    +552
    +553
    +554
    +555
    +556
    +557
    +558
    +559
    +560
    +561
    +562
    +563
    +564
    +565
    +566
    +567
    +568
    +569
    +570
    +571
    +572
    +573
    +574
    +575
    +576
    +577
    +578
    +579
    +580
    +581
    +582
    +583
    +584
    +585
    +586
    +587
    +588
    +589
    +590
    +591
    +592
    +593
    +594
    +595
    +596
    +597
    +598
    +599
    +600
    +601
    +602
    +603
    +604
    +605
    +606
    +607
    +608
    +609
    +610
    +611
    +612
    +613
    +614
    +615
    +616
    +617
    +618
    +619
    +620
    +621
    +622
    +623
    +624
    +625
    +626
    +627
    +628
    +629
    +630
    +631
    +632
    +633
    +634
    +635
    +636
    +637
    +638
    +639
    +640
    +641
    +642
    +643
    +644
    +645
    +646
    +647
    +648
    +649
    +650
    +651
    +652
    +653
    +654
    +655
    +656
    +657
    +658
    +659
    +660
    +661
    +662
    +663
    +664
    +665
    +666
    +667
    +668
    +669
    +670
    +671
    +672
    +673
    +674
    +675
    +676
    +677
    +678
    +679
    +680
    +681
    +682
    +683
    +684
    +685
    +686
    +687
    +688
    +689
    +690
    +691
    +692
    +693
    +694
    +695
    +696
    +697
    +698
    +699
    +700
    +701
    +702
    +703
    +704
    +705
    +706
    +707
    +708
    +709
    +710
    +711
    +712
    +713
    +714
    +715
    +716
    +717
    +718
    +719
    +720
    +721
    +722
    +723
    +724
    +725
    +726
    +727
    +728
    +729
    +730
    +731
    +732
    +733
    +734
    +735
    +736
    +737
    +738
    +739
    +740
    +741
    +742
    +743
    +744
    +745
    +746
    +747
    +748
    +749
    +750
    +751
    +752
    +753
    +754
    +755
    +756
    +757
    +758
    +759
    +760
    +761
    +762
    +763
    +764
    +765
    +766
    +767
    +768
    +769
    +770
    +771
    +772
    +773
    +774
    +775
    +776
    +777
    +778
    +779
    +780
    +781
    +782
    +783
    +784
    +785
    +786
    +787
    +788
    +789
    +790
    +791
    +792
    +793
    +794
    +795
    +796
    +797
    +798
    +799
    +800
    +801
    +802
    +803
    +804
    +805
    +806
    +807
    +808
    +809
    +810
    +811
    +812
    +813
    +814
    +815
    +816
    +817
    +818
    +819
    +820
    +821
    +822
    +823
    +824
    +825
    +826
    +827
    +828
    +829
    +830
    +831
    +832
    +833
    +834
    +835
    +836
    +837
    +838
    +839
    +840
    +841
    +842
    +843
    +844
    +845
    +846
    +847
    +848
    +849
    +850
    +851
    +852
    +853
    +854
    +855
    +856
    +857
    +858
    +859
    +860
    +861
    +862
    +863
    +864
    +865
    +866
    +867
    +868
    +869
    +870
    +871
    +872
    +873
    +874
    +875
    +876
    +877
    +878
    +879
    +880
    +881
    +882
    +883
    +884
    +885
    +886
    +887
    +888
    +889
    +890
    +891
    +892
    +893
    +894
    +895
    +896
    +897
    +898
    +899
    +900
    +901
    +902
    +903
    +904
    +905
    +906
    +907
    +908
    +909
    +910
    +911
    +912
    +913
    +914
    +915
    +916
    +917
    +918
    +919
    +920
    +921
    +922
    +923
    +924
    +925
    +926
    +927
    +928
    +929
    +930
    +931
    +932
    +933
    +934
    +935
    +936
    +937
    +938
    +939
    +940
    +941
    +942
    +943
    +944
    +945
    +946
    +947
     
    -use super::objint;
    -use super::objsequence::PySliceableSequence;
    -use super::objtype;
    +use std::fmt;
    +use std::hash::{Hash, Hasher};
    +use std::ops::Range;
    +use std::str::FromStr;
    +use std::string::ToString;
    +
    +use num_traits::ToPrimitive;
    +use unicode_segmentation::UnicodeSegmentation;
    +
     use crate::format::{FormatParseError, FormatPart, FormatString};
    +use crate::function::{OptionalArg, PyFuncArgs};
     use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyResult, TypeProtocol,
    +    IdProtocol, IntoPyObject, PyContext, PyIterable, PyObjectRef, PyRef, PyResult, PyValue,
    +    TryFromObject, TryIntoRef, TypeProtocol,
     };
     use crate::vm::VirtualMachine;
    -use num_traits::ToPrimitive;
    -use std::cell::Ref;
    -use std::hash::{Hash, Hasher};
    -use std::ops::Range;
    -use std::str::FromStr;
    -// rust's builtin to_lowercase isn't sufficient for casefold
    -extern crate caseless;
    -extern crate unicode_segmentation;
     
    -use self::unicode_segmentation::UnicodeSegmentation;
    +use super::objint;
    +use super::objsequence::PySliceableSequence;
    +use super::objslice::PySlice;
    +use super::objtype::{self, PyClassRef};
     
    -pub fn init(context: &PyContext) {
    -    let str_type = &context.str_type;
    -    context.set_attr(&str_type, "__add__", context.new_rustfunc(str_add));
    -    context.set_attr(&str_type, "__eq__", context.new_rustfunc(str_eq));
    -    context.set_attr(
    -        &str_type,
    -        "__contains__",
    -        context.new_rustfunc(str_contains),
    -    );
    -    context.set_attr(&str_type, "__getitem__", context.new_rustfunc(str_getitem));
    -    context.set_attr(&str_type, "__gt__", context.new_rustfunc(str_gt));
    -    context.set_attr(&str_type, "__ge__", context.new_rustfunc(str_ge));
    -    context.set_attr(&str_type, "__lt__", context.new_rustfunc(str_lt));
    -    context.set_attr(&str_type, "__le__", context.new_rustfunc(str_le));
    -    context.set_attr(&str_type, "__hash__", context.new_rustfunc(str_hash));
    -    context.set_attr(&str_type, "__len__", context.new_rustfunc(str_len));
    -    context.set_attr(&str_type, "__mul__", context.new_rustfunc(str_mul));
    -    context.set_attr(&str_type, "__new__", context.new_rustfunc(str_new));
    -    context.set_attr(&str_type, "__str__", context.new_rustfunc(str_str));
    -    context.set_attr(&str_type, "__repr__", context.new_rustfunc(str_repr));
    -    context.set_attr(&str_type, "format", context.new_rustfunc(str_format));
    -    context.set_attr(&str_type, "lower", context.new_rustfunc(str_lower));
    -    context.set_attr(&str_type, "casefold", context.new_rustfunc(str_casefold));
    -    context.set_attr(&str_type, "upper", context.new_rustfunc(str_upper));
    -    context.set_attr(
    -        &str_type,
    -        "capitalize",
    -        context.new_rustfunc(str_capitalize),
    -    );
    -    context.set_attr(&str_type, "split", context.new_rustfunc(str_split));
    -    context.set_attr(&str_type, "rsplit", context.new_rustfunc(str_rsplit));
    -    context.set_attr(&str_type, "strip", context.new_rustfunc(str_strip));
    -    context.set_attr(&str_type, "lstrip", context.new_rustfunc(str_lstrip));
    -    context.set_attr(&str_type, "rstrip", context.new_rustfunc(str_rstrip));
    -    context.set_attr(&str_type, "endswith", context.new_rustfunc(str_endswith));
    -    context.set_attr(
    -        &str_type,
    -        "startswith",
    -        context.new_rustfunc(str_startswith),
    -    );
    -    context.set_attr(&str_type, "isalnum", context.new_rustfunc(str_isalnum));
    -    context.set_attr(&str_type, "isnumeric", context.new_rustfunc(str_isnumeric));
    -    context.set_attr(&str_type, "isdigit", context.new_rustfunc(str_isdigit));
    -    context.set_attr(&str_type, "isdecimal", context.new_rustfunc(str_isdecimal));
    -    context.set_attr(&str_type, "title", context.new_rustfunc(str_title));
    -    context.set_attr(&str_type, "swapcase", context.new_rustfunc(str_swapcase));
    -    context.set_attr(&str_type, "isalpha", context.new_rustfunc(str_isalpha));
    -    context.set_attr(&str_type, "replace", context.new_rustfunc(str_replace));
    -    context.set_attr(&str_type, "center", context.new_rustfunc(str_center));
    -    context.set_attr(&str_type, "isspace", context.new_rustfunc(str_isspace));
    -    context.set_attr(&str_type, "isupper", context.new_rustfunc(str_isupper));
    -    context.set_attr(&str_type, "islower", context.new_rustfunc(str_islower));
    -    context.set_attr(&str_type, "isascii", context.new_rustfunc(str_isascii));
    -    context.set_attr(
    -        &str_type,
    -        "splitlines",
    -        context.new_rustfunc(str_splitlines),
    -    );
    -    context.set_attr(&str_type, "join", context.new_rustfunc(str_join));
    -    context.set_attr(&str_type, "find", context.new_rustfunc(str_find));
    -    context.set_attr(&str_type, "rfind", context.new_rustfunc(str_rfind));
    -    context.set_attr(&str_type, "index", context.new_rustfunc(str_index));
    -    context.set_attr(&str_type, "rindex", context.new_rustfunc(str_rindex));
    -    context.set_attr(&str_type, "partition", context.new_rustfunc(str_partition));
    -    context.set_attr(
    -        &str_type,
    -        "rpartition",
    -        context.new_rustfunc(str_rpartition),
    -    );
    -    context.set_attr(&str_type, "istitle", context.new_rustfunc(str_istitle));
    -    context.set_attr(&str_type, "count", context.new_rustfunc(str_count));
    -    context.set_attr(&str_type, "zfill", context.new_rustfunc(str_zfill));
    -    context.set_attr(&str_type, "ljust", context.new_rustfunc(str_ljust));
    -    context.set_attr(&str_type, "rjust", context.new_rustfunc(str_rjust));
    -    context.set_attr(
    -        &str_type,
    -        "expandtabs",
    -        context.new_rustfunc(str_expandtabs),
    -    );
    -    context.set_attr(
    -        &str_type,
    -        "isidentifier",
    -        context.new_rustfunc(str_isidentifier),
    -    );
    +#[derive(Clone, Debug)]
    +pub struct PyString {
    +    // TODO: shouldn't be public
    +    pub value: String,
     }
    +pub type PyStringRef = PyRef<PyString>;
     
    -pub fn get_value(obj: &PyObjectRef) -> String {
    -    if let PyObjectPayload::String { value } = &obj.borrow().payload {
    -        value.to_string()
    -    } else {
    -        panic!("Inner error getting str");
    +impl fmt::Display for PyString {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +        fmt::Display::fmt(&self.value, f)
         }
     }
     
    -pub fn borrow_value(obj: &PyObjectRef) -> Ref<str> {
    -    Ref::map(obj.borrow(), |py_obj| {
    -        if let PyObjectPayload::String { value } = &py_obj.payload {
    -            value.as_ref()
    -        } else {
    -            panic!("Inner error getting str");
    +impl TryIntoRef<PyString> for String {
    +    fn try_into_ref(self, vm: &VirtualMachine) -> PyResult<PyRef<PyString>> {
    +        Ok(PyString { value: self }.into_ref(vm))
    +    }
    +}
    +
    +impl TryIntoRef<PyString> for &str {
    +    fn try_into_ref(self, vm: &VirtualMachine) -> PyResult<PyRef<PyString>> {
    +        Ok(PyString {
    +            value: self.to_string(),
             }
    -    })
    +        .into_ref(vm))
    +    }
     }
     
    -fn str_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(a, Some(vm.ctx.str_type())), (b, None)]
    -    );
    +impl PyStringRef {
    +    fn add(self, rhs: PyObjectRef, vm: &VirtualMachine) -> PyResult<String> {
    +        if objtype::isinstance(&rhs, &vm.ctx.str_type()) {
    +            Ok(format!("{}{}", self.value, get_value(&rhs)))
    +        } else {
    +            Err(vm.new_type_error(format!("Cannot add {} and {}", self, rhs)))
    +        }
    +    }
     
    -    let result = if objtype::isinstance(b, &vm.ctx.str_type()) {
    -        get_value(a) == get_value(b)
    -    } else {
    -        false
    -    };
    -    Ok(vm.ctx.new_bool(result))
    -}
    +    fn eq(self, rhs: PyObjectRef, vm: &VirtualMachine) -> bool {
    +        if objtype::isinstance(&rhs, &vm.ctx.str_type()) {
    +            self.value == get_value(&rhs)
    +        } else {
    +            false
    +        }
    +    }
     
    -fn str_gt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.str_type())), (i2, None)]
    -    );
    +    fn contains(self, needle: PyStringRef, _vm: &VirtualMachine) -> bool {
    +        self.value.contains(&needle.value)
    +    }
     
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.str_type()) {
    -        Ok(vm.ctx.new_bool(v1 > get_value(i2)))
    -    } else {
    -        Err(vm.new_type_error(format!("Cannot compare {} and {}", i.borrow(), i2.borrow())))
    +    fn getitem(self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        subscript(vm, &self.value, needle)
         }
    -}
     
    -fn str_ge(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.str_type())), (i2, None)]
    -    );
    +    fn gt(self, rhs: PyObjectRef, vm: &VirtualMachine) -> PyResult<bool> {
    +        if objtype::isinstance(&rhs, &vm.ctx.str_type()) {
    +            Ok(self.value > get_value(&rhs))
    +        } else {
    +            Err(vm.new_type_error(format!("Cannot compare {} and {}", self, rhs)))
    +        }
    +    }
     
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.str_type()) {
    -        Ok(vm.ctx.new_bool(v1 >= get_value(i2)))
    -    } else {
    -        Err(vm.new_type_error(format!("Cannot compare {} and {}", i.borrow(), i2.borrow())))
    +    fn ge(self, rhs: PyObjectRef, vm: &VirtualMachine) -> PyResult<bool> {
    +        if objtype::isinstance(&rhs, &vm.ctx.str_type()) {
    +            Ok(self.value >= get_value(&rhs))
    +        } else {
    +            Err(vm.new_type_error(format!("Cannot compare {} and {}", self, rhs)))
    +        }
         }
    -}
     
    -fn str_lt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.str_type())), (i2, None)]
    -    );
    +    fn lt(self, rhs: PyObjectRef, vm: &VirtualMachine) -> PyResult<bool> {
    +        if objtype::isinstance(&rhs, &vm.ctx.str_type()) {
    +            Ok(self.value < get_value(&rhs))
    +        } else {
    +            Err(vm.new_type_error(format!("Cannot compare {} and {}", self, rhs)))
    +        }
    +    }
     
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.str_type()) {
    -        Ok(vm.ctx.new_bool(v1 < get_value(i2)))
    -    } else {
    -        Err(vm.new_type_error(format!("Cannot compare {} and {}", i.borrow(), i2.borrow())))
    +    fn le(self, rhs: PyObjectRef, vm: &VirtualMachine) -> PyResult<bool> {
    +        if objtype::isinstance(&rhs, &vm.ctx.str_type()) {
    +            Ok(self.value <= get_value(&rhs))
    +        } else {
    +            Err(vm.new_type_error(format!("Cannot compare {} and {}", self, rhs)))
    +        }
         }
    -}
     
    -fn str_le(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(i, Some(vm.ctx.str_type())), (i2, None)]
    -    );
    +    fn hash(self, _vm: &VirtualMachine) -> usize {
    +        let mut hasher = std::collections::hash_map::DefaultHasher::new();
    +        self.value.hash(&mut hasher);
    +        hasher.finish() as usize
    +    }
     
    -    let v1 = get_value(i);
    -    if objtype::isinstance(i2, &vm.ctx.str_type()) {
    -        Ok(vm.ctx.new_bool(v1 <= get_value(i2)))
    -    } else {
    -        Err(vm.new_type_error(format!("Cannot compare {} and {}", i.borrow(), i2.borrow())))
    +    fn len(self, _vm: &VirtualMachine) -> usize {
    +        self.value.chars().count()
         }
    -}
     
    -fn str_str(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    Ok(s.clone())
    -}
    +    fn mul(self, val: PyObjectRef, vm: &VirtualMachine) -> PyResult<String> {
    +        if objtype::isinstance(&val, &vm.ctx.int_type()) {
    +            let value = &self.value;
    +            let multiplier = objint::get_value(&val).to_i32().unwrap();
    +            let mut result = String::new();
    +            for _x in 0..multiplier {
    +                result.push_str(value.as_str());
    +            }
    +            Ok(result)
    +        } else {
    +            Err(vm.new_type_error(format!("Cannot multiply {} and {}", self, val)))
    +        }
    +    }
     
    -fn count_char(s: &str, c: char) -> usize {
    -    s.chars().filter(|x| *x == c).count()
    -}
    +    fn str(self, _vm: &VirtualMachine) -> PyStringRef {
    +        self
    +    }
     
    -fn str_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(s);
    -    let quote_char = if count_char(&value, '\'') > count_char(&value, '"') {
    -        '"'
    -    } else {
    -        '\''
    -    };
    -    let mut formatted = String::new();
    -    formatted.push(quote_char);
    -    for c in value.chars() {
    -        if c == quote_char || c == '\\' {
    -            formatted.push('\\');
    -            formatted.push(c);
    -        } else if c == '\n' {
    -            formatted.push('\\');
    -            formatted.push('n');
    -        } else if c == '\t' {
    -            formatted.push('\\');
    -            formatted.push('t');
    -        } else if c == '\r' {
    -            formatted.push('\\');
    -            formatted.push('r');
    +    fn repr(self, _vm: &VirtualMachine) -> String {
    +        let value = &self.value;
    +        let quote_char = if count_char(value, '\'') > count_char(value, '"') {
    +            '"'
    +        } else {
    +            '\''
    +        };
    +        let mut formatted = String::new();
    +        formatted.push(quote_char);
    +        for c in value.chars() {
    +            if c == quote_char || c == '\\' {
    +                formatted.push('\\');
    +                formatted.push(c);
    +            } else if c == '\n' {
    +                formatted.push('\\');
    +                formatted.push('n');
    +            } else if c == '\t' {
    +                formatted.push('\\');
    +                formatted.push('t');
    +            } else if c == '\r' {
    +                formatted.push('\\');
    +                formatted.push('r');
    +            } else {
    +                formatted.push(c);
    +            }
    +        }
    +        formatted.push(quote_char);
    +        formatted
    +    }
    +
    +    fn lower(self, _vm: &VirtualMachine) -> String {
    +        self.value.to_lowercase()
    +    }
    +
    +    // casefold is much more aggressive than lower
    +    fn casefold(self, _vm: &VirtualMachine) -> String {
    +        caseless::default_case_fold_str(&self.value)
    +    }
    +
    +    fn upper(self, _vm: &VirtualMachine) -> String {
    +        self.value.to_uppercase()
    +    }
    +
    +    fn capitalize(self, _vm: &VirtualMachine) -> String {
    +        let (first_part, lower_str) = self.value.split_at(1);
    +        format!("{}{}", first_part.to_uppercase(), lower_str)
    +    }
    +
    +    fn split(
    +        self,
    +        pattern: OptionalArg<Self>,
    +        num: OptionalArg<usize>,
    +        vm: &VirtualMachine,
    +    ) -> PyObjectRef {
    +        let value = &self.value;
    +        let pattern = match pattern {
    +            OptionalArg::Present(ref s) => &s.value,
    +            OptionalArg::Missing => " ",
    +        };
    +        let num_splits = num
    +            .into_option()
    +            .unwrap_or_else(|| value.split(pattern).count());
    +        let elements = value
    +            .splitn(num_splits + 1, pattern)
    +            .map(|o| vm.ctx.new_str(o.to_string()))
    +            .collect();
    +        vm.ctx.new_list(elements)
    +    }
    +
    +    fn rsplit(
    +        self,
    +        pattern: OptionalArg<Self>,
    +        num: OptionalArg<usize>,
    +        vm: &VirtualMachine,
    +    ) -> PyObjectRef {
    +        let value = &self.value;
    +        let pattern = match pattern {
    +            OptionalArg::Present(ref s) => &s.value,
    +            OptionalArg::Missing => " ",
    +        };
    +        let num_splits = num
    +            .into_option()
    +            .unwrap_or_else(|| value.split(pattern).count());
    +        let elements = value
    +            .rsplitn(num_splits + 1, pattern)
    +            .map(|o| vm.ctx.new_str(o.to_string()))
    +            .collect();
    +        vm.ctx.new_list(elements)
    +    }
    +
    +    fn strip(self, _vm: &VirtualMachine) -> String {
    +        self.value.trim().to_string()
    +    }
    +
    +    fn lstrip(self, _vm: &VirtualMachine) -> String {
    +        self.value.trim_start().to_string()
    +    }
    +
    +    fn rstrip(self, _vm: &VirtualMachine) -> String {
    +        self.value.trim_end().to_string()
    +    }
    +
    +    fn endswith(
    +        self,
    +        suffix: PyStringRef,
    +        start: OptionalArg<isize>,
    +        end: OptionalArg<isize>,
    +        _vm: &VirtualMachine,
    +    ) -> bool {
    +        if let Some((start, end)) = adjust_indices(start, end, self.value.len()) {
    +            self.value[start..end].ends_with(&suffix.value)
    +        } else {
    +            false
    +        }
    +    }
    +
    +    fn startswith(
    +        self,
    +        prefix: PyStringRef,
    +        start: OptionalArg<isize>,
    +        end: OptionalArg<isize>,
    +        _vm: &VirtualMachine,
    +    ) -> bool {
    +        if let Some((start, end)) = adjust_indices(start, end, self.value.len()) {
    +            self.value[start..end].starts_with(&prefix.value)
             } else {
    -            formatted.push(c);
    +            false
    +        }
    +    }
    +
    +    fn isalnum(self, _vm: &VirtualMachine) -> bool {
    +        !self.value.is_empty() && self.value.chars().all(char::is_alphanumeric)
    +    }
    +
    +    fn isnumeric(self, _vm: &VirtualMachine) -> bool {
    +        !self.value.is_empty() && self.value.chars().all(char::is_numeric)
    +    }
    +
    +    fn isdigit(self, _vm: &VirtualMachine) -> bool {
    +        // python's isdigit also checks if exponents are digits, these are the unicodes for exponents
    +        let valid_unicodes: [u16; 10] = [
    +            0x2070, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,
    +        ];
    +
    +        if self.value.is_empty() {
    +            false
    +        } else {
    +            self.value
    +                .chars()
    +                .filter(|c| !c.is_digit(10))
    +                .all(|c| valid_unicodes.contains(&(c as u16)))
    +        }
    +    }
    +
    +    fn isdecimal(self, _vm: &VirtualMachine) -> bool {
    +        if self.value.is_empty() {
    +            false
    +        } else {
    +            self.value.chars().all(|c| c.is_ascii_digit())
    +        }
    +    }
    +
    +    fn title(self, _vm: &VirtualMachine) -> String {
    +        make_title(&self.value)
    +    }
    +
    +    fn swapcase(self, _vm: &VirtualMachine) -> String {
    +        let mut swapped_str = String::with_capacity(self.value.len());
    +        for c in self.value.chars() {
    +            // to_uppercase returns an iterator, to_ascii_uppercase returns the char
    +            if c.is_lowercase() {
    +                swapped_str.push(c.to_ascii_uppercase());
    +            } else if c.is_uppercase() {
    +                swapped_str.push(c.to_ascii_lowercase());
    +            } else {
    +                swapped_str.push(c);
    +            }
    +        }
    +        swapped_str
    +    }
    +
    +    fn isalpha(self, _vm: &VirtualMachine) -> bool {
    +        !self.value.is_empty() && self.value.chars().all(char::is_alphanumeric)
    +    }
    +
    +    fn replace(
    +        self,
    +        old: Self,
    +        new: Self,
    +        num: OptionalArg<usize>,
    +        _vm: &VirtualMachine,
    +    ) -> String {
    +        match num.into_option() {
    +            Some(num) => self.value.replacen(&old.value, &new.value, num),
    +            None => self.value.replace(&old.value, &new.value),
    +        }
    +    }
    +
    +    // cpython's isspace ignores whitespace, including \t and \n, etc, unless the whole string is empty
    +    // which is why isspace is using is_ascii_whitespace. Same for isupper & islower
    +    fn isspace(self, _vm: &VirtualMachine) -> bool {
    +        !self.value.is_empty() && self.value.chars().all(|c| c.is_ascii_whitespace())
    +    }
    +
    +    fn isupper(self, _vm: &VirtualMachine) -> bool {
    +        !self.value.is_empty()
    +            && self
    +                .value
    +                .chars()
    +                .filter(|x| !x.is_ascii_whitespace())
    +                .all(char::is_uppercase)
    +    }
    +
    +    fn islower(self, _vm: &VirtualMachine) -> bool {
    +        !self.value.is_empty()
    +            && self
    +                .value
    +                .chars()
    +                .filter(|x| !x.is_ascii_whitespace())
    +                .all(char::is_lowercase)
    +    }
    +
    +    fn isascii(self, _vm: &VirtualMachine) -> bool {
    +        !self.value.is_empty() && self.value.chars().all(|c| c.is_ascii())
    +    }
    +
    +    // doesn't implement keep new line delimiter just yet
    +    fn splitlines(self, vm: &VirtualMachine) -> PyObjectRef {
    +        let elements = self
    +            .value
    +            .split('\n')
    +            .map(|e| vm.ctx.new_str(e.to_string()))
    +            .collect();
    +        vm.ctx.new_list(elements)
    +    }
    +
    +    fn join(self, iterable: PyIterable<PyStringRef>, vm: &VirtualMachine) -> PyResult<String> {
    +        let mut joined = String::new();
    +
    +        for (idx, elem) in iterable.iter(vm)?.enumerate() {
    +            let elem = elem?;
    +            if idx != 0 {
    +                joined.push_str(&self.value);
    +            }
    +            joined.push_str(&elem.value)
    +        }
    +
    +        Ok(joined)
    +    }
    +
    +    fn find(
    +        self,
    +        sub: Self,
    +        start: OptionalArg<isize>,
    +        end: OptionalArg<isize>,
    +        _vm: &VirtualMachine,
    +    ) -> isize {
    +        let value = &self.value;
    +        if let Some((start, end)) = adjust_indices(start, end, value.len()) {
    +            match value[start..end].find(&sub.value) {
    +                Some(num) => (start + num) as isize,
    +                None => -1 as isize,
    +            }
    +        } else {
    +            -1 as isize
    +        }
    +    }
    +
    +    fn rfind(
    +        self,
    +        sub: Self,
    +        start: OptionalArg<isize>,
    +        end: OptionalArg<isize>,
    +        _vm: &VirtualMachine,
    +    ) -> isize {
    +        let value = &self.value;
    +        if let Some((start, end)) = adjust_indices(start, end, value.len()) {
    +            match value[start..end].rfind(&sub.value) {
    +                Some(num) => (start + num) as isize,
    +                None => -1 as isize,
    +            }
    +        } else {
    +            -1 as isize
    +        }
    +    }
    +
    +    fn index(
    +        self,
    +        sub: Self,
    +        start: OptionalArg<isize>,
    +        end: OptionalArg<isize>,
    +        vm: &VirtualMachine,
    +    ) -> PyResult<usize> {
    +        let value = &self.value;
    +        if let Some((start, end)) = adjust_indices(start, end, value.len()) {
    +            match value[start..end].find(&sub.value) {
    +                Some(num) => Ok(start + num),
    +                None => Err(vm.new_value_error("substring not found".to_string())),
    +            }
    +        } else {
    +            Err(vm.new_value_error("substring not found".to_string()))
    +        }
    +    }
    +
    +    fn rindex(
    +        self,
    +        sub: Self,
    +        start: OptionalArg<isize>,
    +        end: OptionalArg<isize>,
    +        vm: &VirtualMachine,
    +    ) -> PyResult<usize> {
    +        let value = &self.value;
    +        if let Some((start, end)) = adjust_indices(start, end, value.len()) {
    +            match value[start..end].rfind(&sub.value) {
    +                Some(num) => Ok(start + num),
    +                None => Err(vm.new_value_error("substring not found".to_string())),
    +            }
    +        } else {
    +            Err(vm.new_value_error("substring not found".to_string()))
    +        }
    +    }
    +
    +    fn partition(self, sub: PyStringRef, vm: &VirtualMachine) -> PyObjectRef {
    +        let value = &self.value;
    +        let sub = &sub.value;
    +        let mut new_tup = Vec::new();
    +        if value.contains(sub) {
    +            new_tup = value
    +                .splitn(2, sub)
    +                .map(|s| vm.ctx.new_str(s.to_string()))
    +                .collect();
    +            new_tup.insert(1, vm.ctx.new_str(sub.clone()));
    +        } else {
    +            new_tup.push(vm.ctx.new_str(value.clone()));
    +            new_tup.push(vm.ctx.new_str("".to_string()));
    +            new_tup.push(vm.ctx.new_str("".to_string()));
    +        }
    +        vm.ctx.new_tuple(new_tup)
    +    }
    +
    +    fn rpartition(self, sub: PyStringRef, vm: &VirtualMachine) -> PyObjectRef {
    +        let value = &self.value;
    +        let sub = &sub.value;
    +        let mut new_tup = Vec::new();
    +        if value.contains(sub) {
    +            new_tup = value
    +                .rsplitn(2, sub)
    +                .map(|s| vm.ctx.new_str(s.to_string()))
    +                .collect();
    +            new_tup.swap(0, 1); // so it's in the right order
    +            new_tup.insert(1, vm.ctx.new_str(sub.clone()));
    +        } else {
    +            new_tup.push(vm.ctx.new_str(value.clone()));
    +            new_tup.push(vm.ctx.new_str("".to_string()));
    +            new_tup.push(vm.ctx.new_str("".to_string()));
    +        }
    +        vm.ctx.new_tuple(new_tup)
    +    }
    +
    +    fn istitle(self, _vm: &VirtualMachine) -> bool {
    +        if self.value.is_empty() {
    +            false
    +        } else {
    +            self.value.split(' ').all(|word| word == make_title(word))
    +        }
    +    }
    +
    +    fn count(
    +        self,
    +        sub: Self,
    +        start: OptionalArg<isize>,
    +        end: OptionalArg<isize>,
    +        _vm: &VirtualMachine,
    +    ) -> usize {
    +        let value = &self.value;
    +        if let Some((start, end)) = adjust_indices(start, end, value.len()) {
    +            self.value[start..end].matches(&sub.value).count()
    +        } else {
    +            0
    +        }
    +    }
    +
    +    fn zfill(self, len: usize, _vm: &VirtualMachine) -> String {
    +        let value = &self.value;
    +        if len <= value.len() {
    +            value.to_string()
    +        } else {
    +            format!("{}{}", "0".repeat(len - value.len()), value)
    +        }
    +    }
    +
    +    fn get_fill_char<'a>(rep: &'a OptionalArg<Self>, vm: &VirtualMachine) -> PyResult<&'a str> {
    +        let rep_str = match rep {
    +            OptionalArg::Present(ref st) => &st.value,
    +            OptionalArg::Missing => " ",
    +        };
    +        if rep_str.len() == 1 {
    +            Ok(rep_str)
    +        } else {
    +            Err(vm.new_type_error(
    +                "The fill character must be exactly one character long".to_string(),
    +            ))
    +        }
    +    }
    +
    +    fn ljust(self, len: usize, rep: OptionalArg<Self>, vm: &VirtualMachine) -> PyResult<String> {
    +        let value = &self.value;
    +        let rep_char = PyStringRef::get_fill_char(&rep, vm)?;
    +        Ok(format!("{}{}", value, rep_char.repeat(len)))
    +    }
    +
    +    fn rjust(self, len: usize, rep: OptionalArg<Self>, vm: &VirtualMachine) -> PyResult<String> {
    +        let value = &self.value;
    +        let rep_char = PyStringRef::get_fill_char(&rep, vm)?;
    +        Ok(format!("{}{}", rep_char.repeat(len), value))
    +    }
    +
    +    fn center(self, len: usize, rep: OptionalArg<Self>, vm: &VirtualMachine) -> PyResult<String> {
    +        let value = &self.value;
    +        let rep_char = PyStringRef::get_fill_char(&rep, vm)?;
    +        let left_buff: usize = (len - value.len()) / 2;
    +        let right_buff = len - value.len() - left_buff;
    +        Ok(format!(
    +            "{}{}{}",
    +            rep_char.repeat(left_buff),
    +            value,
    +            rep_char.repeat(right_buff)
    +        ))
    +    }
    +
    +    fn expandtabs(self, tab_stop: OptionalArg<usize>, _vm: &VirtualMachine) -> String {
    +        let tab_stop = tab_stop.into_option().unwrap_or(8 as usize);
    +        let mut expanded_str = String::new();
    +        let mut tab_size = tab_stop;
    +        let mut col_count = 0 as usize;
    +        for ch in self.value.chars() {
    +            // 0x0009 is tab
    +            if ch == 0x0009 as char {
    +                let num_spaces = tab_size - col_count;
    +                col_count += num_spaces;
    +                let expand = " ".repeat(num_spaces);
    +                expanded_str.push_str(&expand);
    +            } else {
    +                expanded_str.push(ch);
    +                col_count += 1;
    +            }
    +            if col_count >= tab_size {
    +                tab_size += tab_stop;
    +            }
    +        }
    +        expanded_str
    +    }
    +
    +    fn isidentifier(self, _vm: &VirtualMachine) -> bool {
    +        let value = &self.value;
    +        // a string is not an identifier if it has whitespace or starts with a number
    +        if !value.chars().any(|c| c.is_ascii_whitespace())
    +            && !value.chars().nth(0).unwrap().is_digit(10)
    +        {
    +            for c in value.chars() {
    +                if c != "_".chars().nth(0).unwrap() && !c.is_digit(10) && !c.is_alphabetic() {
    +                    return false;
    +                }
    +            }
    +            true
    +        } else {
    +            false
             }
         }
    -    formatted.push(quote_char);
    -    Ok(vm.ctx.new_str(formatted))
     }
     
    -fn str_add(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (s2, None)]
    -    );
    -    if objtype::isinstance(s2, &vm.ctx.str_type()) {
    -        Ok(vm
    -            .ctx
    -            .new_str(format!("{}{}", get_value(&s), get_value(&s2))))
    -    } else {
    -        Err(vm.new_type_error(format!("Cannot add {} and {}", s.borrow(), s2.borrow())))
    +impl PyValue for PyString {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.str_type()
         }
     }
     
    -fn str_format(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +impl IntoPyObject for String {
    +    fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
    +        Ok(vm.ctx.new_str(self))
    +    }
    +}
    +
    +#[rustfmt::skip] // to avoid line splitting
    +pub fn init(context: &PyContext) {
    +    let str_type = &context.str_type;
    +    let str_doc = "str(object='') -> str\n\
    +                   str(bytes_or_buffer[, encoding[, errors]]) -> str\n\
    +                   \n\
    +                   Create a new string object from the given object. If encoding or\n\
    +                   errors is specified, then the object must expose a data buffer\n\
    +                   that will be decoded using the given encoding and error handler.\n\
    +                   Otherwise, returns the result of object.__str__() (if defined)\n\
    +                   or repr(object).\n\
    +                   encoding defaults to sys.getdefaultencoding().\n\
    +                   errors defaults to 'strict'.";
    +    context.set_attr(&str_type, "__add__", context.new_rustfunc(PyStringRef::add));
    +    context.set_attr(&str_type, "__eq__", context.new_rustfunc(PyStringRef::eq));
    +    context.set_attr(&str_type, "__contains__", context.new_rustfunc(PyStringRef::contains));
    +    context.set_attr(&str_type, "__getitem__", context.new_rustfunc(PyStringRef::getitem));
    +    context.set_attr(&str_type, "__gt__", context.new_rustfunc(PyStringRef::gt));
    +    context.set_attr(&str_type, "__ge__", context.new_rustfunc(PyStringRef::ge));
    +    context.set_attr(&str_type, "__lt__", context.new_rustfunc(PyStringRef::lt));
    +    context.set_attr(&str_type, "__le__", context.new_rustfunc(PyStringRef::le));
    +    context.set_attr(&str_type, "__hash__", context.new_rustfunc(PyStringRef::hash));
    +    context.set_attr(&str_type, "__len__", context.new_rustfunc(PyStringRef::len));
    +    context.set_attr(&str_type, "__mul__", context.new_rustfunc(PyStringRef::mul));
    +    context.set_attr(&str_type, "__new__", context.new_rustfunc(str_new));
    +    context.set_attr(&str_type, "__str__", context.new_rustfunc(PyStringRef::str));
    +    context.set_attr(&str_type, "__repr__", context.new_rustfunc(PyStringRef::repr));
    +    context.set_attr(&str_type, "format", context.new_rustfunc(str_format));
    +    context.set_attr(&str_type, "lower", context.new_rustfunc(PyStringRef::lower));
    +    context.set_attr(&str_type, "casefold", context.new_rustfunc(PyStringRef::casefold));
    +    context.set_attr(&str_type, "upper", context.new_rustfunc(PyStringRef::upper));
    +    context.set_attr(&str_type, "capitalize", context.new_rustfunc(PyStringRef::capitalize));
    +    context.set_attr(&str_type, "split", context.new_rustfunc(PyStringRef::split));
    +    context.set_attr(&str_type, "rsplit", context.new_rustfunc(PyStringRef::rsplit));
    +    context.set_attr(&str_type, "strip", context.new_rustfunc(PyStringRef::strip));
    +    context.set_attr(&str_type, "lstrip", context.new_rustfunc(PyStringRef::lstrip));
    +    context.set_attr(&str_type, "rstrip", context.new_rustfunc(PyStringRef::rstrip));
    +    context.set_attr(&str_type, "endswith", context.new_rustfunc(PyStringRef::endswith));
    +    context.set_attr(&str_type, "startswith", context.new_rustfunc(PyStringRef::startswith));
    +    context.set_attr(&str_type, "isalnum", context.new_rustfunc(PyStringRef::isalnum));
    +    context.set_attr(&str_type, "isnumeric", context.new_rustfunc(PyStringRef::isnumeric));
    +    context.set_attr(&str_type, "isdigit", context.new_rustfunc(PyStringRef::isdigit));
    +    context.set_attr(&str_type, "isdecimal", context.new_rustfunc(PyStringRef::isdecimal));
    +    context.set_attr(&str_type, "title", context.new_rustfunc(PyStringRef::title));
    +    context.set_attr(&str_type, "swapcase", context.new_rustfunc(PyStringRef::swapcase));
    +    context.set_attr(&str_type, "isalpha", context.new_rustfunc(PyStringRef::isalpha));
    +    context.set_attr(&str_type, "replace", context.new_rustfunc(PyStringRef::replace));
    +    context.set_attr(&str_type, "isspace", context.new_rustfunc(PyStringRef::isspace));
    +    context.set_attr(&str_type, "isupper", context.new_rustfunc(PyStringRef::isupper));
    +    context.set_attr(&str_type, "islower", context.new_rustfunc(PyStringRef::islower));
    +    context.set_attr(&str_type, "isascii", context.new_rustfunc(PyStringRef::isascii));
    +    context.set_attr(&str_type, "splitlines", context.new_rustfunc(PyStringRef::splitlines));
    +    context.set_attr(&str_type, "join", context.new_rustfunc(PyStringRef::join));
    +    context.set_attr(&str_type, "find", context.new_rustfunc(PyStringRef::find));
    +    context.set_attr(&str_type, "rfind", context.new_rustfunc(PyStringRef::rfind));
    +    context.set_attr(&str_type, "index", context.new_rustfunc(PyStringRef::index));
    +    context.set_attr(&str_type, "rindex", context.new_rustfunc(PyStringRef::rindex));
    +    context.set_attr(&str_type, "partition", context.new_rustfunc(PyStringRef::partition));
    +    context.set_attr(&str_type, "rpartition", context.new_rustfunc(PyStringRef::rpartition));
    +    context.set_attr(&str_type, "istitle", context.new_rustfunc(PyStringRef::istitle));
    +    context.set_attr(&str_type, "count", context.new_rustfunc(PyStringRef::count));
    +    context.set_attr(&str_type, "zfill", context.new_rustfunc(PyStringRef::zfill));
    +    context.set_attr(&str_type, "ljust", context.new_rustfunc(PyStringRef::ljust));
    +    context.set_attr(&str_type, "rjust", context.new_rustfunc(PyStringRef::rjust));
    +    context.set_attr(&str_type, "center", context.new_rustfunc(PyStringRef::center));
    +    context.set_attr(&str_type, "expandtabs", context.new_rustfunc(PyStringRef::expandtabs));
    +    context.set_attr(&str_type, "isidentifier", context.new_rustfunc(PyStringRef::isidentifier));
    +    context.set_attr(&str_type, "__doc__", context.new_str(str_doc.to_string()));
    +}
    +
    +pub fn get_value(obj: &PyObjectRef) -> String {
    +    obj.payload::<PyString>().unwrap().value.clone()
    +}
    +
    +pub fn borrow_value(obj: &PyObjectRef) -> &str {
    +    &obj.payload::<PyString>().unwrap().value
    +}
    +
    +fn count_char(s: &str, c: char) -> usize {
    +    s.chars().filter(|x| *x == c).count()
    +}
    +
    +fn str_format(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         if args.args.is_empty() {
             return Err(
                 vm.new_type_error("descriptor 'format' of 'str' object needs an argument".to_string())
    @@ -1446,11 +1674,7 @@
         }
     }
     
    -fn call_object_format(
    -    vm: &mut VirtualMachine,
    -    argument: PyObjectRef,
    -    format_spec: &str,
    -) -> PyResult {
    +fn call_object_format(vm: &VirtualMachine, argument: PyObjectRef, format_spec: &str) -> PyResult {
         let returned_type = vm.ctx.new_str(format_spec.to_string());
         let result = vm.call_method(&argument, "__format__", vec![returned_type])?;
         if !objtype::isinstance(&result, &vm.ctx.str_type()) {
    @@ -1462,7 +1686,7 @@
     }
     
     fn perform_format(
    -    vm: &mut VirtualMachine,
    +    vm: &VirtualMachine,
         format_string: &FormatString,
         arguments: &PyFuncArgs,
     ) -> PyResult {
    @@ -1513,691 +1737,24 @@
         Ok(vm.ctx.new_str(final_string))
     }
     
    -fn str_hash(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.str_type()))]);
    -    let value = get_value(zelf);
    -    let mut hasher = std::collections::hash_map::DefaultHasher::new();
    -    value.hash(&mut hasher);
    -    let hash = hasher.finish();
    -    Ok(vm.ctx.new_int(hash))
    -}
    -
    -fn str_len(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let sv = get_value(s);
    -    Ok(vm.ctx.new_int(sv.chars().count()))
    -}
    -
    -fn str_mul(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (s2, None)]
    -    );
    -    if objtype::isinstance(s2, &vm.ctx.int_type()) {
    -        let value1 = get_value(&s);
    -        let value2 = objint::get_value(s2).to_i32().unwrap();
    -        let mut result = String::new();
    -        for _x in 0..value2 {
    -            result.push_str(value1.as_str());
    -        }
    -        Ok(vm.ctx.new_str(result))
    -    } else {
    -        Err(vm.new_type_error(format!(
    -            "Cannot multiply {} and {}",
    -            s.borrow(),
    -            s2.borrow()
    -        )))
    -    }
    -}
    -
    -fn str_upper(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s).to_uppercase();
    -    Ok(vm.ctx.new_str(value))
    -}
    -
    -fn str_lower(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s).to_lowercase();
    -    Ok(vm.ctx.new_str(value))
    -}
    -
    -fn str_capitalize(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    let (first_part, lower_str) = value.split_at(1);
    -    let capitalized = format!("{}{}", first_part.to_uppercase(), lower_str);
    -    Ok(vm.ctx.new_str(capitalized))
    -}
    -
    -fn str_rsplit(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type()))],
    -        optional = [
    -            (pat, Some(vm.ctx.str_type())),
    -            (num, Some(vm.ctx.int_type()))
    -        ]
    -    );
    -    let value = get_value(&s);
    -    let pat = match pat {
    -        Some(s) => get_value(&s),
    -        None => " ".to_string(),
    -    };
    -    let num_splits = match num {
    -        Some(n) => objint::get_value(&n).to_usize().unwrap(),
    -        None => value.split(&pat).count(),
    -    };
    -    let elements = value
    -        .rsplitn(num_splits + 1, &pat)
    -        .map(|o| vm.ctx.new_str(o.to_string()))
    -        .collect();
    -    Ok(vm.ctx.new_list(elements))
    -}
    -
    -fn str_split(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type()))],
    -        optional = [
    -            (pat, Some(vm.ctx.str_type())),
    -            (num, Some(vm.ctx.int_type()))
    -        ]
    -    );
    -    let value = get_value(&s);
    -    let pat = match pat {
    -        Some(s) => get_value(&s),
    -        None => " ".to_string(),
    -    };
    -    let num_splits = match num {
    -        Some(n) => objint::get_value(&n).to_usize().unwrap(),
    -        None => value.split(&pat).count(),
    -    };
    -    let elements = value
    -        .splitn(num_splits + 1, &pat)
    -        .map(|o| vm.ctx.new_str(o.to_string()))
    -        .collect();
    -    Ok(vm.ctx.new_list(elements))
    -}
    -
    -fn str_strip(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s).trim().to_string();
    -    Ok(vm.ctx.new_str(value))
    -}
    -
    -fn str_lstrip(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s).trim_start().to_string();
    -    Ok(vm.ctx.new_str(value))
    -}
    -
    -fn str_rstrip(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s).trim_end().to_string();
    -    Ok(vm.ctx.new_str(value))
    -}
    -
    -fn str_endswith(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (pat, Some(vm.ctx.str_type()))]
    -    );
    -    let value = get_value(&s);
    -    let pat = get_value(&pat);
    -    Ok(vm.ctx.new_bool(value.ends_with(pat.as_str())))
    -}
    -
    -fn str_isidentifier(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    let mut is_identifier: bool = true;
    -    // a string is not an identifier if it has whitespace or starts with a number
    -    if !value.chars().any(|c| c.is_ascii_whitespace())
    -        && !value.chars().nth(0).unwrap().is_digit(10)
    -    {
    -        for c in value.chars() {
    -            if c != "_".chars().nth(0).unwrap() && !c.is_digit(10) && !c.is_alphabetic() {
    -                is_identifier = false;
    -            }
    -        }
    -    } else {
    -        is_identifier = false;
    -    }
    -    Ok(vm.ctx.new_bool(is_identifier))
    -}
    -
    -// cpython's isspace ignores whitespace, including \t and \n, etc, unless the whole string is empty
    -// which is why isspace is using is_ascii_whitespace. Same for isupper & islower
    -fn str_isspace(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    Ok(vm
    -        .ctx
    -        .new_bool(!value.is_empty() && value.chars().all(|c| c.is_ascii_whitespace())))
    -}
    -
    -fn str_isupper(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    Ok(vm.ctx.new_bool(
    -        !value.is_empty()
    -            && value
    -                .chars()
    -                .filter(|x| !x.is_ascii_whitespace())
    -                .all(|c| c.is_uppercase()),
    -    ))
    -}
    -
    -fn str_islower(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    Ok(vm.ctx.new_bool(
    -        !value.is_empty()
    -            && value
    -                .chars()
    -                .filter(|x| !x.is_ascii_whitespace())
    -                .all(|c| c.is_lowercase()),
    -    ))
    -}
    -
    -// doesn't implement keep new line delimiter just yet
    -fn str_splitlines(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let elements = get_value(&s)
    -        .split('\n')
    -        .map(|e| vm.ctx.new_str(e.to_string()))
    -        .collect();
    -    Ok(vm.ctx.new_list(elements))
    -}
    -
    -fn str_zfill(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (len, Some(vm.ctx.int_type()))]
    -    );
    -    let value = get_value(&s);
    -    let len = objint::get_value(&len).to_usize().unwrap();
    -    let new_str = if len <= value.len() {
    -        value
    -    } else {
    -        format!("{}{}", "0".repeat(len - value.len()), value)
    -    };
    -    Ok(vm.ctx.new_str(new_str))
    -}
    -
    -fn str_join(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (iterable, None)]
    -    );
    -    let value = get_value(&s);
    -    let elements: Vec<String> = vm
    -        .extract_elements(iterable)?
    -        .iter()
    -        .map(|w| get_value(&w))
    -        .collect();
    -    let joined = elements.join(&value);
    -    Ok(vm.ctx.new_str(joined))
    -}
    -
    -fn str_count(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (sub, Some(vm.ctx.str_type()))],
    -        optional = [
    -            (start, Some(vm.ctx.int_type())),
    -            (end, Some(vm.ctx.int_type()))
    -        ]
    -    );
    -    let value = get_value(&s);
    -    let sub = get_value(&sub);
    -    let (start, end) = match get_slice(start, end, value.len()) {
    -        Ok((start, end)) => (start, end),
    -        Err(e) => return Err(vm.new_index_error(e)),
    -    };
    -    let num_occur: usize = value[start..end].matches(&sub).count();
    -    Ok(vm.ctx.new_int(num_occur))
    -}
    -
    -fn str_index(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (sub, Some(vm.ctx.str_type()))],
    -        optional = [
    -            (start, Some(vm.ctx.int_type())),
    -            (end, Some(vm.ctx.int_type()))
    -        ]
    -    );
    -    let value = get_value(&s);
    -    let sub = get_value(&sub);
    -    let (start, end) = match get_slice(start, end, value.len()) {
    -        Ok((start, end)) => (start, end),
    -        Err(e) => return Err(vm.new_index_error(e)),
    -    };
    -    let ind: usize = match value[start..=end].find(&sub) {
    -        Some(num) => num,
    -        None => {
    -            return Err(vm.new_value_error("substring not found".to_string()));
    -        }
    -    };
    -    Ok(vm.ctx.new_int(ind))
    -}
    -
    -fn str_find(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (sub, Some(vm.ctx.str_type()))],
    -        optional = [
    -            (start, Some(vm.ctx.int_type())),
    -            (end, Some(vm.ctx.int_type()))
    -        ]
    -    );
    -    let value = get_value(&s);
    -    let sub = get_value(&sub);
    -    let (start, end) = match get_slice(start, end, value.len()) {
    -        Ok((start, end)) => (start, end),
    -        Err(e) => return Err(vm.new_index_error(e)),
    -    };
    -    let ind: i128 = match value[start..=end].find(&sub) {
    -        Some(num) => num as i128,
    -        None => -1 as i128,
    -    };
    -    Ok(vm.ctx.new_int(ind))
    -}
    -
    -// casefold is much more aggressive than lower
    -fn str_casefold(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    let folded_str: String = caseless::default_case_fold_str(&value);
    -    Ok(vm.ctx.new_str(folded_str))
    -}
    -
    -fn str_swapcase(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    let mut swapped_str = String::with_capacity(value.len());
    -    for c in value.chars() {
    -        // to_uppercase returns an iterator, to_ascii_uppercase returns the char
    -        if c.is_lowercase() {
    -            swapped_str.push(c.to_ascii_uppercase());
    -        } else if c.is_uppercase() {
    -            swapped_str.push(c.to_ascii_lowercase());
    -        } else {
    -            swapped_str.push(c);
    -        }
    -    }
    -    Ok(vm.ctx.new_str(swapped_str))
    -}
    -
    -fn str_replace(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (s, Some(vm.ctx.str_type())),
    -            (old, Some(vm.ctx.str_type())),
    -            (rep, Some(vm.ctx.str_type()))
    -        ],
    -        optional = [(n, Some(vm.ctx.int_type()))]
    -    );
    -    let s = get_value(&s);
    -    let old_str = get_value(&old);
    -    let rep_str = get_value(&rep);
    -    let num_rep: usize = match n {
    -        Some(num) => objint::get_value(&num).to_usize().unwrap(),
    -        None => 1,
    -    };
    -    let new_str = s.replacen(&old_str, &rep_str, num_rep);
    -    Ok(vm.ctx.new_str(new_str))
    -}
    -
    -fn str_expandtabs(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type()))],
    -        optional = [(size, Some(vm.ctx.int_type()))]
    -    );
    -    let value = get_value(&s);
    -    let tab_stop = match size {
    -        Some(num) => objint::get_value(&num).to_usize().unwrap(),
    -        None => 8 as usize,
    -    };
    -    let mut expanded_str = String::new();
    -    let mut tab_size = tab_stop;
    -    let mut col_count = 0 as usize;
    -    for ch in value.chars() {
    -        // 0x0009 is tab
    -        if ch == 0x0009 as char {
    -            let num_spaces = tab_size - col_count;
    -            col_count += num_spaces;
    -            let expand = " ".repeat(num_spaces);
    -            expanded_str.push_str(&expand);
    -        } else {
    -            expanded_str.push(ch);
    -            col_count += 1;
    -        }
    -        if col_count >= tab_size {
    -            tab_size += tab_stop;
    -        }
    -    }
    -    Ok(vm.ctx.new_str(expanded_str))
    -}
    -
    -fn str_rpartition(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (sub, Some(vm.ctx.str_type()))]
    -    );
    -    let value = get_value(&s);
    -    let sub = get_value(&sub);
    -    let mut new_tup = Vec::new();
    -    if value.contains(&sub) {
    -        new_tup = value
    -            .rsplitn(2, &sub)
    -            .map(|s| vm.ctx.new_str(s.to_string()))
    -            .collect();
    -        new_tup.swap(0, 1); // so it's in the right order
    -        new_tup.insert(1, vm.ctx.new_str(sub));
    -    } else {
    -        new_tup.push(vm.ctx.new_str(value));
    -        new_tup.push(vm.ctx.new_str("".to_string()));
    -        new_tup.push(vm.ctx.new_str("".to_string()));
    -    }
    -    Ok(vm.ctx.new_tuple(new_tup))
    -}
    -
    -fn str_partition(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (sub, Some(vm.ctx.str_type()))]
    -    );
    -    let value = get_value(&s);
    -    let sub = get_value(&sub);
    -    let mut new_tup = Vec::new();
    -    if value.contains(&sub) {
    -        new_tup = value
    -            .splitn(2, &sub)
    -            .map(|s| vm.ctx.new_str(s.to_string()))
    -            .collect();
    -        new_tup.insert(1, vm.ctx.new_str(sub));
    -    } else {
    -        new_tup.push(vm.ctx.new_str(value));
    -        new_tup.push(vm.ctx.new_str("".to_string()));
    -        new_tup.push(vm.ctx.new_str("".to_string()));
    -    }
    -    Ok(vm.ctx.new_tuple(new_tup))
    -}
    -
    -fn str_title(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    Ok(vm.ctx.new_str(make_title(&get_value(&s))))
    -}
    -
    -fn str_rjust(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (num, Some(vm.ctx.int_type()))],
    -        optional = [(rep, Some(vm.ctx.str_type()))]
    -    );
    -    let value = get_value(&s);
    -    let num = objint::get_value(&num).to_usize().unwrap();
    -    let rep = match rep {
    -        Some(st) => {
    -            let rep_str = get_value(&st);
    -            if rep_str.len() == 1 {
    -                rep_str
    -            } else {
    -                return Err(vm.new_type_error(
    -                    "The fill character must be exactly one character long".to_string(),
    -                ));
    -            }
    -        }
    -        None => " ".to_string(),
    -    };
    -    let new_str = format!("{}{}", rep.repeat(num), value);
    -    Ok(vm.ctx.new_str(new_str))
    -}
    -
    -fn str_ljust(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (num, Some(vm.ctx.int_type()))],
    -        optional = [(rep, Some(vm.ctx.str_type()))]
    -    );
    -    let value = get_value(&s);
    -    let num = objint::get_value(&num).to_usize().unwrap();
    -    let rep = match rep {
    -        Some(st) => {
    -            let rep_str = get_value(&st);
    -            if rep_str.len() == 1 {
    -                rep_str
    -            } else {
    -                return Err(vm.new_type_error(
    -                    "The fill character must be exactly one character long".to_string(),
    -                ));
    -            }
    -        }
    -        None => " ".to_string(),
    -    };
    -    let new_str = format!("{}{}", value, rep.repeat(num));
    -    Ok(vm.ctx.new_str(new_str))
    -}
    -
    -fn str_istitle(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -
    -    let is_titled = if value.is_empty() {
    -        false
    -    } else {
    -        value.split(' ').all(|word| word == make_title(word))
    -    };
    -
    -    Ok(vm.ctx.new_bool(is_titled))
    -}
    -
    -fn str_center(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (len, Some(vm.ctx.int_type()))],
    -        optional = [(chars, Some(vm.ctx.str_type()))]
    -    );
    -    let value = get_value(&s);
    -    let len = objint::get_value(&len).to_usize().unwrap();
    -    let rep_char = match chars {
    -        Some(c) => get_value(&c),
    -        None => " ".to_string(),
    -    };
    -    let left_buff: usize = (len - value.len()) / 2;
    -    let right_buff = len - value.len() - left_buff;
    -    let new_str = format!(
    -        "{}{}{}",
    -        rep_char.repeat(left_buff),
    -        value,
    -        rep_char.repeat(right_buff)
    -    );
    -    Ok(vm.ctx.new_str(new_str))
    -}
    -
    -fn str_startswith(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (pat, Some(vm.ctx.str_type()))]
    -    );
    -    let value = get_value(&s);
    -    let pat = get_value(&pat);
    -    Ok(vm.ctx.new_bool(value.starts_with(pat.as_str())))
    -}
    -
    -fn str_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (s, Some(vm.ctx.str_type())),
    -            (needle, Some(vm.ctx.str_type()))
    -        ]
    -    );
    -    let value = get_value(&s);
    -    let needle = get_value(&needle);
    -    Ok(vm.ctx.new_bool(value.contains(needle.as_str())))
    -}
    -
    -fn str_isalnum(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    Ok(vm
    -        .ctx
    -        .new_bool(!value.is_empty() && value.chars().all(|c| c.is_alphanumeric())))
    -}
    -
    -fn str_isascii(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    Ok(vm
    -        .ctx
    -        .new_bool(!value.is_empty() && value.chars().all(|c| c.is_ascii())))
    -}
    -
    -fn str_rindex(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (sub, Some(vm.ctx.str_type()))],
    -        optional = [
    -            (start, Some(vm.ctx.int_type())),
    -            (end, Some(vm.ctx.int_type()))
    -        ]
    -    );
    -    let value = get_value(&s);
    -    let sub = get_value(&sub);
    -    let (start, end) = match get_slice(start, end, value.len()) {
    -        Ok((start, end)) => (start, end),
    -        Err(e) => return Err(vm.new_index_error(e)),
    -    };
    -    let ind: i64 = match value[start..=end].rfind(&sub) {
    -        Some(num) => num as i64,
    -        None => {
    -            return Err(vm.new_value_error("substring not found".to_string()));
    -        }
    -    };
    -    Ok(vm.ctx.new_int(ind))
    -}
    -
    -fn str_rfind(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (sub, Some(vm.ctx.str_type()))],
    -        optional = [
    -            (start, Some(vm.ctx.int_type())),
    -            (end, Some(vm.ctx.int_type()))
    -        ]
    -    );
    -    let value = get_value(&s);
    -    let sub = get_value(&sub);
    -    let (start, end) = match get_slice(start, end, value.len()) {
    -        Ok((start, end)) => (start, end),
    -        Err(e) => return Err(vm.new_index_error(e)),
    -    };
    -    let ind = match value[start..=end].rfind(&sub) {
    -        Some(num) => num as i128,
    -        None => -1 as i128,
    -    };
    -    Ok(vm.ctx.new_int(ind))
    -}
    -
    -fn str_isnumeric(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    Ok(vm
    -        .ctx
    -        .new_bool(!value.is_empty() && value.chars().all(|c| c.is_numeric())))
    -}
    -
    -fn str_isalpha(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    Ok(vm
    -        .ctx
    -        .new_bool(!value.is_empty() && value.chars().all(|c| c.is_alphanumeric())))
    -}
    -
    -fn str_isdigit(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -    let value = get_value(&s);
    -    // python's isdigit also checks if exponents are digits, these are the unicodes for exponents
    -    let valid_unicodes: [u16; 10] = [
    -        0x2070, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,
    -    ];
    -
    -    let is_digit = if value.is_empty() {
    -        false
    -    } else {
    -        value
    -            .chars()
    -            .filter(|c| !c.is_digit(10))
    -            .all(|c| valid_unicodes.contains(&(c as u16)))
    -    };
    -
    -    Ok(vm.ctx.new_bool(is_digit))
    -}
    -
    -fn str_isdecimal(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    -
    -    let value = get_value(&s);
    -
    -    let is_decimal = if !value.is_empty() {
    -        value.chars().all(|c| c.is_ascii_digit())
    -    } else {
    -        false
    -    };
    -
    -    Ok(vm.ctx.new_bool(is_decimal))
    -}
    -
    -fn str_getitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(s, Some(vm.ctx.str_type())), (needle, None)]
    -    );
    -    let value = get_value(&s);
    -    subscript(vm, &value, needle.clone())
    -}
    -
     // TODO: should with following format
     // class str(object='')
     // class str(object=b'', encoding='utf-8', errors='strict')
    -fn str_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    if args.args.len() == 1 {
    -        return Ok(vm.new_str("".to_string()));
    -    }
    -
    -    if args.args.len() > 2 {
    -        panic!("str expects exactly one parameter");
    +fn str_new(
    +    cls: PyClassRef,
    +    object: OptionalArg<PyObjectRef>,
    +    vm: &VirtualMachine,
    +) -> PyResult<PyStringRef> {
    +    let string = match object {
    +        OptionalArg::Present(ref input) => vm.to_str(input)?.into_object(),
    +        OptionalArg::Missing => vm.new_str("".to_string()),
         };
    -
    -    vm.to_str(&args.args[1])
    +    if string.typ().is(&cls) {
    +        TryFromObject::try_from_object(vm, string)
    +    } else {
    +        let payload = string.payload::<PyString>().unwrap();
    +        payload.clone().into_ref_with_type(vm, cls)
    +    }
     }
     
     impl PySliceableSequence for String {
    @@ -2262,7 +1819,7 @@
             .collect()
     }
     
    -pub fn subscript(vm: &mut VirtualMachine, value: &str, b: PyObjectRef) -> PyResult {
    +pub fn subscript(vm: &VirtualMachine, value: &str, b: PyObjectRef) -> PyResult {
         if objtype::isinstance(&b, &vm.ctx.int_type()) {
             match objint::get_value(&b).to_i32() {
                 Some(pos) => {
    @@ -2277,38 +1834,43 @@
                     Err(vm.new_index_error("cannot fit 'int' into an index-sized integer".to_string()))
                 }
             }
    +    } else if b.payload::<PySlice>().is_some() {
    +        let string = value.to_string().get_slice_items(vm, &b)?;
    +        Ok(vm.new_str(string))
         } else {
    -        match (*b.borrow()).payload {
    -            PyObjectPayload::Slice { .. } => {
    -                let string = value.to_string().get_slice_items(vm, &b)?;
    -                Ok(vm.new_str(string))
    -            }
    -            _ => panic!(
    -                "TypeError: indexing type {:?} with index {:?} is not supported (yet?)",
    -                value, b
    -            ),
    -        }
    +        panic!(
    +            "TypeError: indexing type {:?} with index {:?} is not supported (yet?)",
    +            value, b
    +        )
         }
     }
     
     // help get optional string indices
    -fn get_slice(
    -    start: Option<&std::rc::Rc<std::cell::RefCell<PyObject>>>,
    -    end: Option<&std::rc::Rc<std::cell::RefCell<PyObject>>>,
    +fn adjust_indices(
    +    start: OptionalArg<isize>,
    +    end: OptionalArg<isize>,
         len: usize,
    -) -> Result<(usize, usize), String> {
    -    let start_idx = match start {
    -        Some(int) => objint::get_value(&int).to_usize().unwrap(),
    -        None => 0 as usize,
    -    };
    -    let end_idx = match end {
    -        Some(int) => objint::get_value(&int).to_usize().unwrap(),
    -        None => len - 1,
    -    };
    -    if start_idx >= usize::min_value() && start_idx < end_idx && end_idx < len {
    -        Ok((start_idx, end_idx))
    +) -> Option<(usize, usize)> {
    +    let mut start = start.into_option().unwrap_or(0);
    +    let mut end = end.into_option().unwrap_or(len as isize);
    +    if end > len as isize {
    +        end = len as isize;
    +    } else if end < 0 {
    +        end += len as isize;
    +        if end < 0 {
    +            end = 0;
    +        }
    +    }
    +    if start < 0 {
    +        start += len as isize;
    +        if start < 0 {
    +            start = 0;
    +        }
    +    }
    +    if start > end {
    +        None
         } else {
    -        Err("provided index is not valid".to_string())
    +        Some((start as usize, end as usize))
         }
     }
     
    @@ -2332,4 +1894,4 @@
         titled_str
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objsuper.rs.html b/src/rustpython_vm/obj/objsuper.rs.html index d6183e4..3b6bda5 100644 --- a/src/rustpython_vm/obj/objsuper.rs.html +++ b/src/rustpython_vm/obj/objsuper.rs.html @@ -1,89 +1,165 @@ -objsuper.rs.html -- source
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    +objsuper.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
     
     /*! Python `super` class.
     
    @@ -93,10 +169,29 @@
     
     */
     
    -use super::objtype;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyResult, TypeProtocol};
    +use crate::frame::NameProtocol;
    +use crate::function::PyFuncArgs;
    +use crate::obj::objstr;
    +use crate::obj::objtype::PyClass;
    +use crate::pyobject::{
    +    DictProtocol, PyContext, PyObject, PyObjectRef, PyResult, PyValue, TypeProtocol,
    +};
     use crate::vm::VirtualMachine;
     
    +use super::objtype;
    +
    +#[derive(Debug)]
    +pub struct PySuper {
    +    obj: PyObjectRef,
    +    typ: PyObjectRef,
    +}
    +
    +impl PyValue for PySuper {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.super_type()
    +    }
    +}
    +
     pub fn init(context: &PyContext) {
         let super_type = &context.super_type;
     
    @@ -114,7 +209,12 @@
                          def cmeth(cls, arg):\n        \
                          super().cmeth(arg)\n";
     
    -    context.set_attr(&super_type, "__init__", context.new_rustfunc(super_init));
    +    context.set_attr(&super_type, "__new__", context.new_rustfunc(super_new));
    +    context.set_attr(
    +        &super_type,
    +        "__getattribute__",
    +        context.new_rustfunc(super_getattribute),
    +    );
         context.set_attr(
             &super_type,
             "__doc__",
    @@ -122,24 +222,61 @@
         );
     }
     
    -fn super_init(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    trace!("super.__init__ {:?}", args.args);
    +fn super_getattribute(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    -        required = [(inst, None)],
    +        required = [
    +            (super_obj, Some(vm.ctx.super_type())),
    +            (name_str, Some(vm.ctx.str_type()))
    +        ]
    +    );
    +
    +    let inst = super_obj.payload::<PySuper>().unwrap().obj.clone();
    +    let typ = super_obj.payload::<PySuper>().unwrap().typ.clone();
    +
    +    match typ.payload::<PyClass>() {
    +        Some(PyClass { ref mro, .. }) => {
    +            for class in mro {
    +                if let Ok(item) = vm.get_attribute(class.as_object().clone(), name_str.clone()) {
    +                    return Ok(vm.ctx.new_bound_method(item, inst.clone()));
    +                }
    +            }
    +            Err(vm.new_attribute_error(format!(
    +                "{} has no attribute '{}'",
    +                inst,
    +                objstr::get_value(name_str)
    +            )))
    +        }
    +        _ => panic!("not Class"),
    +    }
    +}
    +
    +fn super_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    trace!("super.__new__ {:?}", args.args);
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(cls, None)],
             optional = [(py_type, None), (py_obj, None)]
         );
     
    +    if !objtype::issubclass(cls, &vm.ctx.super_type()) {
    +        return Err(vm.new_type_error(format!("{:?} is not a subtype of super", cls)));
    +    }
    +
         // Get the type:
         let py_type = if let Some(ty) = py_type {
             ty.clone()
         } else {
    -        // TODO: implement complex logic here....
    -        unimplemented!("TODO: get frame and determine instance and class?");
    -        // let frame = vm.get_current_frame();
    -        //
    -        // vm.get_none()
    +        match vm.current_scope().load_cell(vm, "__class__") {
    +            Some(obj) => obj.clone(),
    +            _ => {
    +                return Err(vm.new_type_error(
    +                    "super must be called with 1 argument or from inside class method".to_string(),
    +                ));
    +            }
    +        }
         };
     
         // Check type argument:
    @@ -155,7 +292,20 @@
         let py_obj = if let Some(obj) = py_obj {
             obj.clone()
         } else {
    -        vm.get_none()
    +        let frame = vm.current_frame();
    +        if let Some(first_arg) = frame.code.arg_names.get(0) {
    +            match vm.get_locals().get_item(first_arg) {
    +                Some(obj) => obj.clone(),
    +                _ => {
    +                    return Err(vm
    +                        .new_type_error(format!("super arguement {} was not supplied", first_arg)));
    +                }
    +            }
    +        } else {
    +            return Err(vm.new_type_error(
    +                "super must be called with 1 argument or from inside class method".to_string(),
    +            ));
    +        }
         };
     
         // Check obj type:
    @@ -165,11 +315,13 @@
             ));
         }
     
    -    // TODO: how to store those types?
    -    vm.ctx.set_attr(inst, "type", py_type);
    -    vm.ctx.set_attr(inst, "obj", py_obj);
    -
    -    Ok(vm.get_none())
    +    Ok(PyObject::new(
    +        PySuper {
    +            obj: py_obj,
    +            typ: py_type,
    +        },
    +        cls.clone(),
    +    ))
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objtuple.rs.html b/src/rustpython_vm/obj/objtuple.rs.html index 20b6193..f1db533 100644 --- a/src/rustpython_vm/obj/objtuple.rs.html +++ b/src/rustpython_vm/obj/objtuple.rs.html @@ -1,4 +1,4 @@ -objtuple.rs.html -- source
      1
    +objtuple.rs.html -- source
      1
       2
       3
       4
    @@ -251,409 +251,259 @@
     251
     252
     253
    -254
    -255
    -256
    -257
    -258
    -259
    -260
    -261
    -262
    -263
    -264
    -265
    -266
    -267
    -268
    -269
    -270
    -271
    -272
    -273
    -274
    -275
    -276
    -277
    -278
    -279
    -280
    -281
    -282
    -283
    -284
    -285
    -286
    -287
    -288
    -289
    -290
    -291
    -292
    -293
    -294
    -295
    -296
    -297
    -298
    -299
    -300
    -301
    -302
    -303
    -304
    -305
    -306
    -307
    -308
    -309
    -310
    -311
    -312
    -313
    -314
    -315
    -316
    -317
    -318
    -319
    -320
    -321
    -322
    -323
    -324
    -325
    -326
    -327
    -328
     
    +use std::cell::{Cell, RefCell};
    +use std::fmt;
    +use std::hash::{Hash, Hasher};
    +
    +use crate::function::OptionalArg;
    +use crate::pyobject::{
    +    IdProtocol, PyContext, PyIteratorValue, PyObjectRef, PyRef, PyResult, PyValue,
    +};
    +use crate::vm::{ReprGuard, VirtualMachine};
    +
     use super::objbool;
     use super::objint;
     use super::objsequence::{
         get_elements, get_item, seq_equal, seq_ge, seq_gt, seq_le, seq_lt, seq_mul,
     };
    -use super::objstr;
    -use super::objtype;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyResult, TypeProtocol};
    -use crate::vm::{ReprGuard, VirtualMachine};
    -use std::hash::{Hash, Hasher};
    -
    -fn tuple_lt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.tuple_type())), (other, None)]
    -    );
    -
    -    let result = if objtype::isinstance(other, &vm.ctx.tuple_type()) {
    -        let zelf = get_elements(zelf);
    -        let other = get_elements(other);
    -        seq_lt(vm, &zelf, &other)?
    -    } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '<'",
    -            zelf.borrow(),
    -            other.borrow()
    -        )));
    -    };
    -
    -    Ok(vm.ctx.new_bool(result))
    -}
    -
    -fn tuple_gt(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.tuple_type())), (other, None)]
    -    );
    -
    -    let result = if objtype::isinstance(other, &vm.ctx.tuple_type()) {
    -        let zelf = get_elements(zelf);
    -        let other = get_elements(other);
    -        seq_gt(vm, &zelf, &other)?
    -    } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '>'",
    -            zelf.borrow(),
    -            other.borrow()
    -        )));
    -    };
    -
    -    Ok(vm.ctx.new_bool(result))
    -}
    -
    -fn tuple_ge(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.tuple_type())), (other, None)]
    -    );
    -
    -    let result = if objtype::isinstance(other, &vm.ctx.tuple_type()) {
    -        let zelf = get_elements(zelf);
    -        let other = get_elements(other);
    -        seq_ge(vm, &zelf, &other)?
    -    } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '>='",
    -            zelf.borrow(),
    -            other.borrow()
    -        )));
    -    };
    +use super::objtype::{self, PyClassRef};
     
    -    Ok(vm.ctx.new_bool(result))
    +#[derive(Default)]
    +pub struct PyTuple {
    +    // TODO: shouldn't be public
    +    // TODO: tuples are immutable, remove this RefCell
    +    pub elements: RefCell<Vec<PyObjectRef>>,
     }
     
    -fn tuple_le(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.tuple_type())), (other, None)]
    -    );
    -
    -    let result = if objtype::isinstance(other, &vm.ctx.tuple_type()) {
    -        let zelf = get_elements(zelf);
    -        let other = get_elements(other);
    -        seq_le(vm, &zelf, &other)?
    -    } else {
    -        return Err(vm.new_type_error(format!(
    -            "Cannot compare {} and {} using '<='",
    -            zelf.borrow(),
    -            other.borrow()
    -        )));
    -    };
    -
    -    Ok(vm.ctx.new_bool(result))
    -}
    -
    -fn tuple_add(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.tuple_type())), (other, None)]
    -    );
    -
    -    if objtype::isinstance(other, &vm.ctx.tuple_type()) {
    -        let e1 = get_elements(zelf);
    -        let e2 = get_elements(other);
    -        let elements = e1.iter().chain(e2.iter()).cloned().collect();
    -        Ok(vm.ctx.new_tuple(elements))
    -    } else {
    -        Err(vm.new_type_error(format!(
    -            "Cannot add {} and {}",
    -            zelf.borrow(),
    -            other.borrow()
    -        )))
    +impl fmt::Debug for PyTuple {
    +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    +        // TODO: implement more informational, non-recursive Debug formatter
    +        f.write_str("tuple")
         }
     }
     
    -fn tuple_count(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.tuple_type())), (value, None)]
    -    );
    -    let elements = get_elements(zelf);
    -    let mut count: usize = 0;
    -    for element in elements.iter() {
    -        let is_eq = vm._eq(element.clone(), value.clone())?;
    -        if objbool::boolval(vm, is_eq)? {
    -            count += 1;
    +impl From<Vec<PyObjectRef>> for PyTuple {
    +    fn from(elements: Vec<PyObjectRef>) -> Self {
    +        PyTuple {
    +            elements: RefCell::new(elements),
             }
         }
    -    Ok(vm.context().new_int(count))
    -}
    -
    -fn tuple_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(zelf, Some(vm.ctx.tuple_type())), (other, None)]
    -    );
    -
    -    let result = if objtype::isinstance(other, &vm.ctx.tuple_type()) {
    -        let zelf = get_elements(zelf);
    -        let other = get_elements(other);
    -        seq_equal(vm, &zelf, &other)?
    -    } else {
    -        false
    -    };
    -    Ok(vm.ctx.new_bool(result))
     }
     
    -fn tuple_hash(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.tuple_type()))]);
    -    let elements = get_elements(zelf);
    -    let mut hasher = std::collections::hash_map::DefaultHasher::new();
    -    for element in elements.iter() {
    -        let element_hash = objint::get_value(&vm.call_method(element, "__hash__", vec![])?);
    -        element_hash.hash(&mut hasher);
    +impl PyValue for PyTuple {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.tuple_type()
         }
    -    let hash = hasher.finish();
    -    Ok(vm.ctx.new_int(hash))
     }
     
    -fn tuple_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(tuple, Some(vm.ctx.tuple_type()))]);
    +pub type PyTupleRef = PyRef<PyTuple>;
     
    -    let iter_obj = PyObject::new(
    -        PyObjectPayload::Iterator {
    -            position: 0,
    -            iterated_obj: tuple.clone(),
    -        },
    -        vm.ctx.iter_type(),
    -    );
    -
    -    Ok(iter_obj)
    -}
    -
    -fn tuple_len(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.tuple_type()))]);
    -    let elements = get_elements(zelf);
    -    Ok(vm.context().new_int(elements.len()))
    -}
    +impl PyTupleRef {
    +    fn lt(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.tuple_type()) {
    +            let zelf = self.elements.borrow();
    +            let other = get_elements(&other);
    +            let res = seq_lt(vm, &zelf, &other)?;
    +            Ok(vm.new_bool(res))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -fn tuple_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(cls, None)],
    -        optional = [(iterable, None)]
    -    );
    +    fn gt(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.tuple_type()) {
    +            let zelf = self.elements.borrow();
    +            let other = get_elements(&other);
    +            let res = seq_gt(vm, &zelf, &other)?;
    +            Ok(vm.new_bool(res))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -    if !objtype::issubclass(cls, &vm.ctx.tuple_type()) {
    -        return Err(vm.new_type_error(format!("{} is not a subtype of tuple", cls.borrow())));
    +    fn ge(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.tuple_type()) {
    +            let zelf = self.elements.borrow();
    +            let other = get_elements(&other);
    +            let res = seq_ge(vm, &zelf, &other)?;
    +            Ok(vm.new_bool(res))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
         }
     
    -    let elements = if let Some(iterable) = iterable {
    -        vm.extract_elements(iterable)?
    -    } else {
    -        vec![]
    -    };
    +    fn le(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.tuple_type()) {
    +            let zelf = self.elements.borrow();
    +            let other = get_elements(&other);
    +            let res = seq_le(vm, &zelf, &other)?;
    +            Ok(vm.new_bool(res))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -    Ok(PyObject::new(
    -        PyObjectPayload::Sequence { elements },
    -        cls.clone(),
    -    ))
    -}
    +    fn add(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.tuple_type()) {
    +            let e1 = self.elements.borrow();
    +            let e2 = get_elements(&other);
    +            let elements = e1.iter().chain(e2.iter()).cloned().collect();
    +            Ok(vm.ctx.new_tuple(elements))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -fn tuple_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(zelf, Some(vm.ctx.tuple_type()))]);
    +    fn count(self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<usize> {
    +        let mut count: usize = 0;
    +        for element in self.elements.borrow().iter() {
    +            if element.is(&needle) {
    +                count += 1;
    +            } else {
    +                let is_eq = vm._eq(element.clone(), needle.clone())?;
    +                if objbool::boolval(vm, is_eq)? {
    +                    count += 1;
    +                }
    +            }
    +        }
    +        Ok(count)
    +    }
     
    -    let s = if let Some(_guard) = ReprGuard::enter(zelf) {
    -        let elements = get_elements(zelf);
    +    fn eq(self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        if objtype::isinstance(&other, &vm.ctx.tuple_type()) {
    +            let zelf = &self.elements.borrow();
    +            let other = get_elements(&other);
    +            let res = seq_equal(vm, &zelf, &other)?;
    +            Ok(vm.new_bool(res))
    +        } else {
    +            Ok(vm.ctx.not_implemented())
    +        }
    +    }
     
    -        let mut str_parts = vec![];
    -        for elem in elements.iter() {
    -            let s = vm.to_repr(elem)?;
    -            str_parts.push(objstr::get_value(&s));
    +    fn hash(self, vm: &VirtualMachine) -> PyResult<u64> {
    +        let mut hasher = std::collections::hash_map::DefaultHasher::new();
    +        for element in self.elements.borrow().iter() {
    +            let hash_result = vm.call_method(element, "__hash__", vec![])?;
    +            let element_hash = objint::get_value(&hash_result);
    +            element_hash.hash(&mut hasher);
             }
    +        Ok(hasher.finish())
    +    }
     
    -        if str_parts.len() == 1 {
    -            format!("({},)", str_parts[0])
    -        } else {
    -            format!("({})", str_parts.join(", "))
    +    fn iter(self, _vm: &VirtualMachine) -> PyIteratorValue {
    +        PyIteratorValue {
    +            position: Cell::new(0),
    +            iterated_obj: self.into_object(),
             }
    -    } else {
    -        "(...)".to_string()
    -    };
    -    Ok(vm.new_str(s))
    -}
    +    }
     
    -fn tuple_mul(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (zelf, Some(vm.ctx.tuple_type())),
    -            (product, Some(vm.ctx.int_type()))
    -        ]
    -    );
    +    fn len(self, _vm: &VirtualMachine) -> usize {
    +        self.elements.borrow().len()
    +    }
     
    -    let new_elements = seq_mul(&get_elements(zelf), product);
    +    fn repr(self, vm: &VirtualMachine) -> PyResult<String> {
    +        let s = if let Some(_guard) = ReprGuard::enter(self.as_object()) {
    +            let mut str_parts = vec![];
    +            for elem in self.elements.borrow().iter() {
    +                let s = vm.to_repr(elem)?;
    +                str_parts.push(s.value.clone());
    +            }
     
    -    Ok(vm.ctx.new_tuple(new_elements))
    -}
    +            if str_parts.len() == 1 {
    +                format!("({},)", str_parts[0])
    +            } else {
    +                format!("({})", str_parts.join(", "))
    +            }
    +        } else {
    +            "(...)".to_string()
    +        };
    +        Ok(s)
    +    }
     
    -fn tuple_getitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(tuple, Some(vm.ctx.tuple_type())), (needle, None)]
    -    );
    -    get_item(vm, tuple, &get_elements(&tuple), needle.clone())
    -}
    +    fn mul(self, counter: isize, vm: &VirtualMachine) -> PyObjectRef {
    +        let new_elements = seq_mul(&self.elements.borrow(), counter);
    +        vm.ctx.new_tuple(new_elements)
    +    }
     
    -pub fn tuple_index(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(tuple, Some(vm.ctx.tuple_type())), (needle, None)]
    -    );
    -    for (index, element) in get_elements(tuple).iter().enumerate() {
    -        let py_equal = vm._eq(needle.clone(), element.clone())?;
    -        if objbool::get_value(&py_equal) {
    -            return Ok(vm.context().new_int(index));
    +    fn getitem(self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        get_item(
    +            vm,
    +            self.as_object(),
    +            &self.elements.borrow(),
    +            needle.clone(),
    +        )
    +    }
    +
    +    fn index(self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<usize> {
    +        for (index, element) in self.elements.borrow().iter().enumerate() {
    +            if element.is(&needle) {
    +                return Ok(index);
    +            }
    +            let is_eq = vm._eq(needle.clone(), element.clone())?;
    +            if objbool::boolval(vm, is_eq)? {
    +                return Ok(index);
    +            }
             }
    +        Err(vm.new_value_error("tuple.index(x): x not in tuple".to_string()))
         }
    -    Err(vm.new_value_error("tuple.index(x): x not in tuple".to_string()))
    -}
     
    -pub fn tuple_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [(tuple, Some(vm.ctx.tuple_type())), (needle, None)]
    -    );
    -    for element in get_elements(tuple).iter() {
    -        match vm._eq(needle.clone(), element.clone()) {
    -            Ok(value) => {
    -                if objbool::get_value(&value) {
    -                    return Ok(vm.new_bool(true));
    -                }
    +    fn contains(self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<bool> {
    +        for element in self.elements.borrow().iter() {
    +            if element.is(&needle) {
    +                return Ok(true);
    +            }
    +            let is_eq = vm._eq(needle.clone(), element.clone())?;
    +            if objbool::boolval(vm, is_eq)? {
    +                return Ok(true);
                 }
    -            Err(_) => return Err(vm.new_type_error("".to_string())),
             }
    +        Ok(false)
         }
    +}
    +
    +fn tuple_new(
    +    cls: PyClassRef,
    +    iterable: OptionalArg<PyObjectRef>,
    +    vm: &VirtualMachine,
    +) -> PyResult<PyTupleRef> {
    +    if !objtype::issubclass(cls.as_object(), &vm.ctx.tuple_type()) {
    +        return Err(vm.new_type_error(format!("{} is not a subtype of tuple", cls)));
    +    }
    +
    +    let elements = if let OptionalArg::Present(iterable) = iterable {
    +        vm.extract_elements(&iterable)?
    +    } else {
    +        vec![]
    +    };
     
    -    Ok(vm.new_bool(false))
    +    PyTuple::from(elements).into_ref_with_type(vm, cls)
     }
     
    +#[rustfmt::skip] // to avoid line splitting
     pub fn init(context: &PyContext) {
         let tuple_type = &context.tuple_type;
         let tuple_doc = "tuple() -> empty tuple
     tuple(iterable) -> tuple initialized from iterable's items
     
     If the argument is a tuple, the return value is the same object.";
    -    context.set_attr(&tuple_type, "__add__", context.new_rustfunc(tuple_add));
    -    context.set_attr(&tuple_type, "__eq__", context.new_rustfunc(tuple_eq));
    -    context.set_attr(
    -        &tuple_type,
    -        "__contains__",
    -        context.new_rustfunc(tuple_contains),
    -    );
    -    context.set_attr(
    -        &tuple_type,
    -        "__getitem__",
    -        context.new_rustfunc(tuple_getitem),
    -    );
    -    context.set_attr(&tuple_type, "__hash__", context.new_rustfunc(tuple_hash));
    -    context.set_attr(&tuple_type, "__iter__", context.new_rustfunc(tuple_iter));
    -    context.set_attr(&tuple_type, "__len__", context.new_rustfunc(tuple_len));
    +    context.set_attr(&tuple_type, "__add__", context.new_rustfunc(PyTupleRef::add));
    +    context.set_attr(&tuple_type, "__eq__", context.new_rustfunc(PyTupleRef::eq));
    +    context.set_attr(&tuple_type,"__contains__",context.new_rustfunc(PyTupleRef::contains));
    +    context.set_attr(&tuple_type,"__getitem__",context.new_rustfunc(PyTupleRef::getitem));
    +    context.set_attr(&tuple_type, "__hash__", context.new_rustfunc(PyTupleRef::hash));
    +    context.set_attr(&tuple_type, "__iter__", context.new_rustfunc(PyTupleRef::iter));
    +    context.set_attr(&tuple_type, "__len__", context.new_rustfunc(PyTupleRef::len));
         context.set_attr(&tuple_type, "__new__", context.new_rustfunc(tuple_new));
    -    context.set_attr(&tuple_type, "__mul__", context.new_rustfunc(tuple_mul));
    -    context.set_attr(&tuple_type, "__repr__", context.new_rustfunc(tuple_repr));
    -    context.set_attr(&tuple_type, "count", context.new_rustfunc(tuple_count));
    -    context.set_attr(&tuple_type, "__lt__", context.new_rustfunc(tuple_lt));
    -    context.set_attr(&tuple_type, "__le__", context.new_rustfunc(tuple_le));
    -    context.set_attr(&tuple_type, "__gt__", context.new_rustfunc(tuple_gt));
    -    context.set_attr(&tuple_type, "__ge__", context.new_rustfunc(tuple_ge));
    -    context.set_attr(
    -        &tuple_type,
    -        "__doc__",
    -        context.new_str(tuple_doc.to_string()),
    -    );
    -    context.set_attr(&tuple_type, "index", context.new_rustfunc(tuple_index));
    +    context.set_attr(&tuple_type, "__mul__", context.new_rustfunc(PyTupleRef::mul));
    +    context.set_attr(&tuple_type, "__repr__", context.new_rustfunc(PyTupleRef::repr));
    +    context.set_attr(&tuple_type, "count", context.new_rustfunc(PyTupleRef::count));
    +    context.set_attr(&tuple_type, "__lt__", context.new_rustfunc(PyTupleRef::lt));
    +    context.set_attr(&tuple_type, "__le__", context.new_rustfunc(PyTupleRef::le));
    +    context.set_attr(&tuple_type, "__gt__", context.new_rustfunc(PyTupleRef::gt));
    +    context.set_attr(&tuple_type, "__ge__", context.new_rustfunc(PyTupleRef::ge));
    +    context.set_attr(&tuple_type,"__doc__",context.new_str(tuple_doc.to_string()));
    +    context.set_attr(&tuple_type, "index", context.new_rustfunc(PyTupleRef::index));
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objtype.rs.html b/src/rustpython_vm/obj/objtype.rs.html index 54b8a15..3d06671 100644 --- a/src/rustpython_vm/obj/objtype.rs.html +++ b/src/rustpython_vm/obj/objtype.rs.html @@ -1,4 +1,4 @@ -objtype.rs.html -- source
      1
    +objtype.rs.html -- source
      1
       2
       3
       4
    @@ -352,113 +352,226 @@
     352
     353
     354
    +355
    +356
    +357
    +358
    +359
    +360
    +361
    +362
    +363
    +364
    +365
    +366
    +367
    +368
    +369
    +370
    +371
    +372
    +373
    +374
    +375
    +376
    +377
    +378
    +379
    +380
    +381
    +382
    +383
    +384
    +385
    +386
    +387
    +388
    +389
    +390
    +391
    +392
    +393
    +394
    +395
    +396
    +397
    +398
    +399
    +400
     
    -use super::objdict;
    -use super::objstr;
    -use super::objtype; // Required for arg_check! to use isinstance
    +use std::cell::RefCell;
    +use std::collections::HashMap;
    +use std::fmt;
    +
    +use crate::function::PyFuncArgs;
     use crate::pyobject::{
    -    AttributeProtocol, IdProtocol, PyAttributes, PyContext, PyFuncArgs, PyObject, PyObjectPayload,
    -    PyObjectRef, PyResult, TypeProtocol,
    +    AttributeProtocol, FromPyObjectRef, IdProtocol, PyAttributes, PyContext, PyObject, PyObjectRef,
    +    PyRef, PyResult, PyValue, TypeProtocol,
     };
     use crate::vm::VirtualMachine;
    -use std::cell::RefCell;
    -use std::collections::HashMap;
     
    -/*
    - * The magical type type
    - */
    +use super::objdict;
    +use super::objlist::PyList;
    +use super::objproperty::PropertyBuilder;
    +use super::objstr::{self, PyStringRef};
    +use super::objtuple::PyTuple;
    +
    +#[derive(Clone, Debug)]
    +pub struct PyClass {
    +    pub name: String,
    +    pub mro: Vec<PyClassRef>,
    +}
     
    -pub fn create_type(type_type: PyObjectRef, object_type: PyObjectRef, _dict_type: PyObjectRef) {
    -    (*type_type.borrow_mut()).payload = PyObjectPayload::Class {
    -        name: String::from("type"),
    -        dict: RefCell::new(PyAttributes::new()),
    -        mro: vec![object_type],
    -    };
    -    (*type_type.borrow_mut()).typ = Some(type_type.clone());
    +impl fmt::Display for PyClass {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +        fmt::Display::fmt(&self.name, f)
    +    }
     }
     
    -pub fn init(context: &PyContext) {
    -    let type_type = &context.type_type;
    +pub type PyClassRef = PyRef<PyClass>;
     
    -    let type_doc = "type(object_or_name, bases, dict)\n\
    -                    type(object) -> the object's type\n\
    -                    type(name, bases, dict) -> a new type";
    +impl PyValue for PyClass {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.type_type()
    +    }
    +}
     
    -    context.set_attr(&type_type, "__call__", context.new_rustfunc(type_call));
    -    context.set_attr(&type_type, "__new__", context.new_rustfunc(type_new));
    -    context.set_attr(
    -        &type_type,
    -        "__mro__",
    -        context.new_member_descriptor(type_mro),
    -    );
    -    context.set_attr(
    -        &type_type,
    -        "__class__",
    -        context.new_member_descriptor(type_new),
    -    );
    -    context.set_attr(&type_type, "__repr__", context.new_rustfunc(type_repr));
    -    context.set_attr(
    -        &type_type,
    -        "__prepare__",
    -        context.new_rustfunc(type_prepare),
    -    );
    -    context.set_attr(
    -        &type_type,
    -        "__getattribute__",
    -        context.new_rustfunc(type_getattribute),
    -    );
    -    context.set_attr(&type_type, "__doc__", context.new_str(type_doc.to_string()));
    +impl IdProtocol for PyClassRef {
    +    fn get_id(&self) -> usize {
    +        self.as_object().get_id()
    +    }
     }
     
    -fn type_mro(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(
    -        vm,
    -        args,
    -        required = [
    -            (cls, Some(vm.ctx.type_type())),
    -            (_typ, Some(vm.ctx.type_type()))
    -        ]
    -    );
    -    match _mro(cls.clone()) {
    -        Some(mro) => Ok(vm.context().new_tuple(mro)),
    -        None => Err(vm.new_type_error("Only classes have an MRO.".to_string())),
    +impl TypeProtocol for PyClassRef {
    +    fn type_ref(&self) -> &PyObjectRef {
    +        &self.as_object().type_ref()
         }
     }
     
    -fn _mro(cls: PyObjectRef) -> Option<Vec<PyObjectRef>> {
    -    match cls.borrow().payload {
    -        PyObjectPayload::Class { ref mro, .. } => {
    -            let mut mro = mro.clone();
    -            mro.insert(0, cls.clone());
    -            Some(mro)
    +struct IterMro<'a> {
    +    cls: &'a PyClassRef,
    +    offset: Option<usize>,
    +}
    +
    +impl<'a> Iterator for IterMro<'a> {
    +    type Item = &'a PyClassRef;
    +
    +    fn next(&mut self) -> Option<Self::Item> {
    +        match self.offset {
    +            None => {
    +                self.offset = Some(0);
    +                Some(&self.cls)
    +            }
    +            Some(offset) => {
    +                if offset < self.cls.mro.len() {
    +                    self.offset = Some(offset + 1);
    +                    Some(&self.cls.mro[offset])
    +                } else {
    +                    None
    +                }
    +            }
             }
    -        _ => None,
         }
     }
     
    -pub fn base_classes(obj: &PyObjectRef) -> Vec<PyObjectRef> {
    -    _mro(obj.typ()).unwrap()
    +impl PyClassRef {
    +    fn iter_mro(&self) -> IterMro {
    +        IterMro {
    +            cls: self,
    +            offset: None,
    +        }
    +    }
    +
    +    fn mro(self, _vm: &VirtualMachine) -> PyTuple {
    +        let elements: Vec<PyObjectRef> =
    +            _mro(&self).iter().map(|x| x.as_object().clone()).collect();
    +        PyTuple::from(elements)
    +    }
    +
    +    fn set_mro(self, _value: PyObjectRef, vm: &VirtualMachine) -> PyResult {
    +        Err(vm.new_attribute_error("read-only attribute".to_string()))
    +    }
    +
    +    fn dir(self, vm: &VirtualMachine) -> PyList {
    +        let attributes = get_attributes(self);
    +        let attributes: Vec<PyObjectRef> = attributes
    +            .keys()
    +            .map(|k| vm.ctx.new_str(k.to_string()))
    +            .collect();
    +        PyList::from(attributes)
    +    }
    +
    +    fn instance_check(self, obj: PyObjectRef, _vm: &VirtualMachine) -> bool {
    +        isinstance(&obj, self.as_object())
    +    }
    +
    +    fn subclass_check(self, subclass: PyObjectRef, _vm: &VirtualMachine) -> bool {
    +        issubclass(&subclass, self.as_object())
    +    }
    +
    +    fn repr(self, _vm: &VirtualMachine) -> String {
    +        format!("<class '{}'>", self.name)
    +    }
    +
    +    fn prepare(_name: PyStringRef, _bases: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
    +        vm.new_dict()
    +    }
    +}
    +
    +/*
    + * The magical type type
    + */
    +
    +pub fn init(ctx: &PyContext) {
    +    let type_doc = "type(object_or_name, bases, dict)\n\
    +                    type(object) -> the object's type\n\
    +                    type(name, bases, dict) -> a new type";
    +
    +    extend_class!(&ctx, &ctx.type_type, {
    +        "__call__" => ctx.new_rustfunc(type_call),
    +        "__new__" => ctx.new_rustfunc(type_new),
    +        "__mro__" =>
    +            PropertyBuilder::new(ctx)
    +                .add_getter(PyClassRef::mro)
    +                .add_setter(PyClassRef::set_mro)
    +                .create(),
    +        "__repr__" => ctx.new_rustfunc(PyClassRef::repr),
    +        "__prepare__" => ctx.new_rustfunc(PyClassRef::prepare),
    +        "__getattribute__" => ctx.new_rustfunc(type_getattribute),
    +        "__instancecheck__" => ctx.new_rustfunc(PyClassRef::instance_check),
    +        "__subclasscheck__" => ctx.new_rustfunc(PyClassRef::subclass_check),
    +        "__doc__" => ctx.new_str(type_doc.to_string()),
    +        "__dir__" => ctx.new_rustfunc(PyClassRef::dir),
    +    });
     }
     
    +fn _mro(cls: &PyClassRef) -> Vec<PyClassRef> {
    +    cls.iter_mro().cloned().collect()
    +}
    +
    +/// Determines if `obj` actually an instance of `cls`, this doesn't call __instancecheck__, so only
    +/// use this if `cls` is known to have not overridden the base __instancecheck__ magic method.
     pub fn isinstance(obj: &PyObjectRef, cls: &PyObjectRef) -> bool {
    -    let mro = _mro(obj.typ()).unwrap();
    -    mro.into_iter().any(|c| c.is(&cls))
    +    issubclass(obj.type_ref(), &cls)
     }
     
    -pub fn issubclass(typ: &PyObjectRef, cls: &PyObjectRef) -> bool {
    -    let mro = _mro(typ.clone()).unwrap();
    -    mro.into_iter().any(|c| c.is(&cls))
    +/// Determines if `subclass` is actually a subclass of `cls`, this doesn't call __subclasscheck__,
    +/// so only use this if `cls` is known to have not overridden the base __subclasscheck__ magic
    +/// method.
    +pub fn issubclass(subclass: &PyObjectRef, cls: &PyObjectRef) -> bool {
    +    let mro = &subclass.payload::<PyClass>().unwrap().mro;
    +    subclass.is(cls) || mro.iter().any(|c| c.is(cls))
     }
     
     pub fn get_type_name(typ: &PyObjectRef) -> String {
    -    if let PyObjectPayload::Class { name, .. } = &typ.borrow().payload {
    +    if let Some(PyClass { name, .. }) = &typ.payload::<PyClass>() {
             name.clone()
         } else {
             panic!("Cannot get type_name of non-type type {:?}", typ);
         }
     }
     
    -pub fn type_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +pub fn type_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         debug!("type.__new__ {:?}", args);
         if args.args.len() == 2 {
             arg_check!(
    @@ -478,21 +591,35 @@
                     (dict, Some(vm.ctx.dict_type()))
                 ]
             );
    -        let mut bases = vm.extract_elements(bases)?;
    -        bases.push(vm.context().object());
    -        let name = objstr::get_value(name);
    -        new(
    -            typ.clone(),
    -            &name,
    -            bases,
    -            objdict::py_dict_to_attributes(dict),
    -        )
    +        type_new_class(vm, typ, name, bases, dict)
         } else {
             Err(vm.new_type_error(format!(": type_new: {:?}", args)))
         }
     }
     
    -pub fn type_call(vm: &mut VirtualMachine, mut args: PyFuncArgs) -> PyResult {
    +pub fn type_new_class(
    +    vm: &VirtualMachine,
    +    typ: &PyObjectRef,
    +    name: &PyObjectRef,
    +    bases: &PyObjectRef,
    +    dict: &PyObjectRef,
    +) -> PyResult {
    +    let mut bases: Vec<PyClassRef> = vm
    +        .extract_elements(bases)?
    +        .iter()
    +        .map(|x| FromPyObjectRef::from_pyobj(x))
    +        .collect();
    +    bases.push(FromPyObjectRef::from_pyobj(&vm.ctx.object()));
    +    let name = objstr::get_value(name);
    +    new(
    +        typ.clone(),
    +        &name,
    +        bases,
    +        objdict::py_dict_to_attributes(dict),
    +    )
    +}
    +
    +pub fn type_call(vm: &VirtualMachine, mut args: PyFuncArgs) -> PyResult {
         debug!("type_call: {:?}", args);
         let cls = args.shift();
         let new = cls.get_attr("__new__").unwrap();
    @@ -508,7 +635,7 @@
         Ok(obj)
     }
     
    -pub fn type_getattribute(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +pub fn type_getattribute(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -525,13 +652,7 @@
             let attr_class = attr.typ();
             if attr_class.has_attr("__set__") {
                 if let Some(descriptor) = attr_class.get_attr("__get__") {
    -                return vm.invoke(
    -                    descriptor,
    -                    PyFuncArgs {
    -                        args: vec![attr, cls.clone(), mcl],
    -                        kwargs: vec![],
    -                    },
    -                );
    +                return vm.invoke(descriptor, vec![attr, cls.clone(), mcl]);
                 }
             }
         }
    @@ -540,13 +661,7 @@
             let attr_class = attr.typ();
             if let Some(descriptor) = attr_class.get_attr("__get__") {
                 let none = vm.get_none();
    -            return vm.invoke(
    -                descriptor,
    -                PyFuncArgs {
    -                    args: vec![attr, none, cls.clone()],
    -                    kwargs: vec![],
    -                },
    -            );
    +            return vm.invoke(descriptor, vec![attr, none, cls.clone()]);
             }
         }
     
    @@ -555,49 +670,31 @@
         } else if let Some(attr) = mcl.get_attr(&name) {
             vm.call_get_descriptor(attr, cls.clone())
         } else if let Some(getter) = cls.get_attr("__getattr__") {
    -        vm.invoke(
    -            getter,
    -            PyFuncArgs {
    -                args: vec![mcl, name_str.clone()],
    -                kwargs: vec![],
    -            },
    -        )
    +        vm.invoke(getter, vec![mcl, name_str.clone()])
         } else {
    -        let attribute_error = vm.context().exceptions.attribute_error.clone();
    -        Err(vm.new_exception(
    -            attribute_error,
    -            format!("{} has no attribute '{}'", cls.borrow(), name),
    -        ))
    +        Err(vm.new_attribute_error(format!("{} has no attribute '{}'", cls, name)))
         }
     }
     
    -pub fn get_attributes(obj: &PyObjectRef) -> PyAttributes {
    +pub fn get_attributes(cls: PyClassRef) -> PyAttributes {
         // Gather all members here:
         let mut attributes = PyAttributes::new();
     
    -    // Get class attributes:
    -    let mut base_classes = objtype::base_classes(obj);
    +    let mut base_classes: Vec<&PyClassRef> = cls.iter_mro().collect();
         base_classes.reverse();
    +
         for bc in base_classes {
    -        if let PyObjectPayload::Class { dict, .. } = &bc.borrow().payload {
    +        if let Some(ref dict) = &bc.as_object().dict {
                 for (name, value) in dict.borrow().iter() {
                     attributes.insert(name.to_string(), value.clone());
                 }
             }
         }
     
    -    // Get instance attributes:
    -    if let PyObjectPayload::Instance { dict } = &obj.borrow().payload {
    -        for (name, value) in dict.borrow().iter() {
    -            attributes.insert(name.to_string(), value.clone());
    -        }
    -    }
         attributes
     }
     
    -fn take_next_base(
    -    mut bases: Vec<Vec<PyObjectRef>>,
    -) -> Option<(PyObjectRef, Vec<Vec<PyObjectRef>>)> {
    +fn take_next_base(mut bases: Vec<Vec<PyClassRef>>) -> Option<(PyClassRef, Vec<Vec<PyClassRef>>)> {
         let mut next = None;
     
         bases = bases.into_iter().filter(|x| !x.is_empty()).collect();
    @@ -624,11 +721,11 @@
         None
     }
     
    -fn linearise_mro(mut bases: Vec<Vec<PyObjectRef>>) -> Option<Vec<PyObjectRef>> {
    +fn linearise_mro(mut bases: Vec<Vec<PyClassRef>>) -> Option<Vec<PyClassRef>> {
         debug!("Linearising MRO: {:?}", bases);
         let mut result = vec![];
         loop {
    -        if (&bases).iter().all(|x| x.is_empty()) {
    +        if (&bases).iter().all(Vec::is_empty) {
                 break;
             }
             match take_next_base(bases) {
    @@ -645,37 +742,29 @@
     pub fn new(
         typ: PyObjectRef,
         name: &str,
    -    bases: Vec<PyObjectRef>,
    +    bases: Vec<PyClassRef>,
         dict: HashMap<String, PyObjectRef>,
     ) -> PyResult {
    -    let mros = bases.into_iter().map(|x| _mro(x).unwrap()).collect();
    +    let mros = bases.into_iter().map(|x| _mro(&x)).collect();
         let mro = linearise_mro(mros).unwrap();
    -    Ok(PyObject::new(
    -        PyObjectPayload::Class {
    +    Ok(PyObject {
    +        payload: Box::new(PyClass {
                 name: String::from(name),
    -            dict: RefCell::new(dict),
                 mro,
    -        },
    +        }),
    +        dict: Some(RefCell::new(dict)),
             typ,
    -    ))
    -}
    -
    -fn type_repr(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args, required = [(obj, Some(vm.ctx.type_type()))]);
    -    let type_name = get_type_name(&obj);
    -    Ok(vm.new_str(format!("<class '{}'>", type_name)))
    -}
    -
    -fn type_prepare(vm: &mut VirtualMachine, _args: PyFuncArgs) -> PyResult {
    -    Ok(vm.new_dict())
    +    }
    +    .into_ref())
     }
     
     #[cfg(test)]
     mod tests {
    +    use super::FromPyObjectRef;
         use super::{linearise_mro, new};
    -    use super::{HashMap, IdProtocol, PyContext, PyObjectRef};
    +    use super::{HashMap, IdProtocol, PyClassRef, PyContext};
     
    -    fn map_ids(obj: Option<Vec<PyObjectRef>>) -> Option<Vec<usize>> {
    +    fn map_ids(obj: Option<Vec<PyClassRef>>) -> Option<Vec<usize>> {
             match obj {
                 Some(vec) => Some(vec.into_iter().map(|x| x.get_id()).collect()),
                 None => None,
    @@ -685,12 +774,15 @@
         #[test]
         fn test_linearise() {
             let context = PyContext::new();
    -        let object = context.object;
    -        let type_type = context.type_type;
    +        let object: PyClassRef = FromPyObjectRef::from_pyobj(&context.object);
    +        let type_type = &context.type_type;
     
             let a = new(type_type.clone(), "A", vec![object.clone()], HashMap::new()).unwrap();
             let b = new(type_type.clone(), "B", vec![object.clone()], HashMap::new()).unwrap();
     
    +        let a: PyClassRef = FromPyObjectRef::from_pyobj(&a);
    +        let b: PyClassRef = FromPyObjectRef::from_pyobj(&b);
    +
             assert_eq!(
                 map_ids(linearise_mro(vec![
                     vec![object.clone()],
    @@ -708,4 +800,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objweakref.rs.html b/src/rustpython_vm/obj/objweakref.rs.html new file mode 100644 index 0000000..f61b0e8 --- /dev/null +++ b/src/rustpython_vm/obj/objweakref.rs.html @@ -0,0 +1,101 @@ +objweakref.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +
    +use crate::obj::objtype::PyClassRef;
    +use crate::pyobject::PyValue;
    +use crate::pyobject::{PyContext, PyObject, PyObjectRef, PyRef, PyResult};
    +use crate::vm::VirtualMachine;
    +
    +use std::rc::{Rc, Weak};
    +
    +#[derive(Debug)]
    +pub struct PyWeak {
    +    referent: Weak<PyObject>,
    +}
    +
    +impl PyWeak {
    +    pub fn downgrade(obj: PyObjectRef) -> PyWeak {
    +        PyWeak {
    +            referent: Rc::downgrade(&obj),
    +        }
    +    }
    +
    +    pub fn upgrade(&self) -> Option<PyObjectRef> {
    +        self.referent.upgrade()
    +    }
    +}
    +
    +impl PyValue for PyWeak {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.weakref_type()
    +    }
    +}
    +
    +pub type PyWeakRef = PyRef<PyWeak>;
    +
    +impl PyWeakRef {
    +    // TODO callbacks
    +    fn create(cls: PyClassRef, referent: PyObjectRef, vm: &VirtualMachine) -> PyResult<Self> {
    +        PyWeak::downgrade(referent).into_ref_with_type(vm, cls)
    +    }
    +
    +    fn call(self, vm: &VirtualMachine) -> PyObjectRef {
    +        self.referent.upgrade().unwrap_or_else(|| vm.get_none())
    +    }
    +}
    +
    +pub fn init(context: &PyContext) {
    +    extend_class!(context, &context.weakref_type, {
    +        "__new__" => context.new_rustfunc(PyWeakRef::create),
    +        "__call__" => context.new_rustfunc(PyWeakRef::call)
    +    });
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_vm/obj/objzip.rs.html b/src/rustpython_vm/obj/objzip.rs.html index 6c44ac5..1d04c51 100644 --- a/src/rustpython_vm/obj/objzip.rs.html +++ b/src/rustpython_vm/obj/objzip.rs.html @@ -1,4 +1,4 @@ -objzip.rs.html -- source
     1
    +objzip.rs.html -- source
     1
      2
      3
      4
    @@ -41,12 +41,37 @@
     41
     42
     43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
     
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{PyContext, PyObject, PyObjectRef, PyResult, PyValue, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
     use super::objiter;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyResult, TypeProtocol};
    -use crate::vm::VirtualMachine; // Required for arg_check! to use isinstance
     
    -fn zip_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +#[derive(Debug)]
    +pub struct PyZip {
    +    iterators: Vec<PyObjectRef>,
    +}
    +
    +impl PyValue for PyZip {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.zip_type()
    +    }
    +}
    +
    +fn zip_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         no_kwargs!(vm, args);
         let cls = &args.args[0];
         let iterables = &args.args[1..];
    @@ -54,16 +79,13 @@
             .iter()
             .map(|iterable| objiter::get_iter(vm, iterable))
             .collect::<Result<Vec<_>, _>>()?;
    -    Ok(PyObject::new(
    -        PyObjectPayload::ZipIterator { iterators },
    -        cls.clone(),
    -    ))
    +    Ok(PyObject::new(PyZip { iterators }, cls.clone()))
     }
     
    -fn zip_next(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn zip_next(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(zip, Some(vm.ctx.zip_type()))]);
     
    -    if let PyObjectPayload::ZipIterator { ref mut iterators } = zip.borrow_mut().payload {
    +    if let Some(PyZip { ref iterators }) = zip.payload() {
             if iterators.is_empty() {
                 Err(objiter::new_stop_iteration(vm))
             } else {
    @@ -82,8 +104,10 @@
     pub fn init(context: &PyContext) {
         let zip_type = &context.zip_type;
         objiter::iter_type_init(context, zip_type);
    -    context.set_attr(zip_type, "__new__", context.new_rustfunc(zip_new));
    -    context.set_attr(zip_type, "__next__", context.new_rustfunc(zip_next));
    +    extend_class!(context, zip_type, {
    +        "__new__" => context.new_rustfunc(zip_new),
    +        "__next__" => context.new_rustfunc(zip_next)
    +    });
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/pyobject.rs.html b/src/rustpython_vm/pyobject.rs.html index 0f59adb..e2c4e24 100644 --- a/src/rustpython_vm/pyobject.rs.html +++ b/src/rustpython_vm/pyobject.rs.html @@ -1,4 +1,4 @@ -pyobject.rs.html -- source
       1
    +pyobject.rs.html -- source
       1
        2
        3
        4
    @@ -1092,47 +1092,190 @@
     1092
     1093
     1094
    +1095
    +1096
    +1097
    +1098
    +1099
    +1100
    +1101
    +1102
    +1103
    +1104
    +1105
    +1106
    +1107
    +1108
    +1109
    +1110
    +1111
    +1112
    +1113
    +1114
    +1115
    +1116
    +1117
    +1118
    +1119
    +1120
    +1121
    +1122
    +1123
    +1124
    +1125
    +1126
    +1127
    +1128
    +1129
    +1130
    +1131
    +1132
    +1133
    +1134
    +1135
    +1136
    +1137
    +1138
    +1139
    +1140
    +1141
    +1142
    +1143
    +1144
    +1145
    +1146
    +1147
    +1148
    +1149
    +1150
    +1151
    +1152
    +1153
    +1154
    +1155
    +1156
    +1157
    +1158
    +1159
    +1160
    +1161
    +1162
    +1163
    +1164
    +1165
    +1166
    +1167
    +1168
    +1169
    +1170
    +1171
    +1172
    +1173
    +1174
    +1175
    +1176
    +1177
    +1178
    +1179
    +1180
    +1181
    +1182
    +1183
    +1184
    +1185
    +1186
    +1187
    +1188
    +1189
    +1190
    +1191
    +1192
    +1193
    +1194
    +1195
    +1196
    +1197
    +1198
    +1199
    +1200
    +1201
    +1202
    +1203
    +1204
    +1205
    +1206
    +1207
    +1208
    +1209
    +1210
    +1211
    +1212
    +1213
    +1214
    +1215
    +1216
    +1217
    +1218
    +1219
    +1220
    +1221
    +1222
    +1223
     
    +use std::any::Any;
    +use std::cell::{Cell, RefCell};
    +use std::collections::HashMap;
    +use std::fmt;
    +use std::marker::PhantomData;
    +use std::mem;
    +use std::ops::Deref;
    +use std::ptr;
    +use std::rc::Rc;
    +
    +use num_bigint::BigInt;
    +use num_complex::Complex64;
    +use num_traits::{One, Zero};
    +
     use crate::bytecode;
     use crate::exceptions;
    -use crate::frame::Frame;
    +use crate::frame::{Frame, Scope};
    +use crate::function::{IntoPyNativeFunc, PyFuncArgs};
     use crate::obj::objbool;
    +use crate::obj::objbuiltinfunc::PyBuiltinFunction;
     use crate::obj::objbytearray;
     use crate::obj::objbytes;
    +use crate::obj::objclassmethod;
     use crate::obj::objcode;
    -use crate::obj::objcomplex;
    -use crate::obj::objdict;
    +use crate::obj::objcomplex::{self, PyComplex};
    +use crate::obj::objdict::{self, PyDict};
    +use crate::obj::objellipsis;
     use crate::obj::objenumerate;
     use crate::obj::objfilter;
    -use crate::obj::objfloat;
    +use crate::obj::objfloat::{self, PyFloat};
     use crate::obj::objframe;
    -use crate::obj::objfunction;
    +use crate::obj::objfunction::{self, PyFunction, PyMethod};
     use crate::obj::objgenerator;
    -use crate::obj::objint;
    +use crate::obj::objint::{self, PyInt};
     use crate::obj::objiter;
    -use crate::obj::objlist;
    +use crate::obj::objlist::{self, PyList};
     use crate::obj::objmap;
     use crate::obj::objmemory;
    +use crate::obj::objmodule::{self, PyModule};
     use crate::obj::objnone;
     use crate::obj::objobject;
     use crate::obj::objproperty;
    +use crate::obj::objproperty::PropertyBuilder;
     use crate::obj::objrange;
    -use crate::obj::objset;
    +use crate::obj::objset::{self, PySet};
     use crate::obj::objslice;
    +use crate::obj::objstaticmethod;
     use crate::obj::objstr;
     use crate::obj::objsuper;
    -use crate::obj::objtuple;
    -use crate::obj::objtype;
    +use crate::obj::objtuple::{self, PyTuple};
    +use crate::obj::objtype::{self, PyClass, PyClassRef};
    +use crate::obj::objweakref;
     use crate::obj::objzip;
     use crate::vm::VirtualMachine;
    -use num_bigint::BigInt;
    -use num_bigint::ToBigInt;
    -use num_complex::Complex64;
    -use num_traits::{One, Zero};
    -use std::cell::RefCell;
    -use std::collections::HashMap;
    -use std::fmt;
    -use std::rc::{Rc, Weak};
     
     /* Python objects and references.
     
    @@ -1148,26 +1291,17 @@
      * Good reference: https://github.com/ProgVal/pythonvm-rust/blob/master/src/objects/mod.rs
      */
     
    -/*
    -The PyRef type implements
    -https://doc.rust-lang.org/std/cell/index.html#introducing-mutability-inside-of-something-immutable
    -*/
    -pub type PyRef<T> = Rc<RefCell<T>>;
    -
     /// The `PyObjectRef` is one of the most used types. It is a reference to a
     /// python object. A single python object can have multiple references, and
     /// this reference counting is accounted for by this type. Use the `.clone()`
     /// method to create a new reference and increment the amount of references
     /// to the python object by 1.
    -pub type PyObjectRef = PyRef<PyObject>;
    -
    -/// Same as PyObjectRef, except for being a weak reference.
    -pub type PyObjectWeakRef = Weak<RefCell<PyObject>>;
    +pub type PyObjectRef = Rc<PyObject>;
     
     /// Use this type for function which return a python object or and exception.
     /// Both the python object and the python exception are `PyObjectRef` types
     /// since exceptions are also python objects.
    -pub type PyResult = Result<PyObjectRef, PyObjectRef>; // A valid value, or an exception
    +pub type PyResult<T = PyObjectRef> = Result<T, PyObjectRef>; // A valid value, or an exception
     
     /// For attributes we do not use a dict, but a hashmap. This is probably
     /// faster, unordered, and only supports strings as keys.
    @@ -1176,33 +1310,23 @@
     impl fmt::Display for PyObject {
         fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
             use self::TypeProtocol;
    -        match &self.payload {
    -            PyObjectPayload::Module { name, .. } => write!(f, "module '{}'", name),
    -            PyObjectPayload::Class { name, .. } => {
    -                let type_name = objtype::get_type_name(&self.typ());
    -                // We don't have access to a vm, so just assume that if its parent's name
    -                // is type, it's a type
    -                if type_name == "type" {
    -                    write!(f, "type object '{}'", name)
    -                } else {
    -                    write!(f, "'{}' object", type_name)
    -                }
    +        if let Some(PyClass { ref name, .. }) = self.payload::<PyClass>() {
    +            let type_name = objtype::get_type_name(&self.typ());
    +            // We don't have access to a vm, so just assume that if its parent's name
    +            // is type, it's a type
    +            if type_name == "type" {
    +                return write!(f, "type object '{}'", name);
    +            } else {
    +                return write!(f, "'{}' object", type_name);
                 }
    -            _ => write!(f, "'{}' object", objtype::get_type_name(&self.typ())),
             }
    -    }
    -}
     
    -/*
    - // Idea: implement the iterator trait upon PyObjectRef
    -impl Iterator for (VirtualMachine, PyObjectRef) {
    -    type Item = char;
    -
    -    fn next(&mut self) -> Option<Self::Item> {
    -        // call method ("_next__")
    +        if let Some(PyModule { ref name, .. }) = self.payload::<PyModule>() {
    +            return write!(f, "module '{}'", name);
    +        }
    +        write!(f, "'{}' object", objtype::get_type_name(&self.typ()))
         }
     }
    -*/
     
     #[derive(Debug)]
     pub struct PyContext {
    @@ -1212,6 +1336,7 @@
         pub classmethod_type: PyObjectRef,
         pub code_type: PyObjectRef,
         pub dict_type: PyObjectRef,
    +    pub ellipsis_type: PyObjectRef,
         pub enumerate_type: PyObjectRef,
         pub filter_type: PyObjectRef,
         pub float_type: PyObjectRef,
    @@ -1227,6 +1352,7 @@
         pub map_type: PyObjectRef,
         pub memoryview_type: PyObjectRef,
         pub none: PyObjectRef,
    +    pub ellipsis: PyObjectRef,
         pub not_implemented: PyObjectRef,
         pub tuple_type: PyObjectRef,
         pub set_type: PyObjectRef,
    @@ -1240,112 +1366,134 @@
         pub function_type: PyObjectRef,
         pub builtin_function_or_method_type: PyObjectRef,
         pub property_type: PyObjectRef,
    +    pub readonly_property_type: PyObjectRef,
         pub module_type: PyObjectRef,
         pub bound_method_type: PyObjectRef,
    -    pub member_descriptor_type: PyObjectRef,
    +    pub weakref_type: PyObjectRef,
         pub object: PyObjectRef,
         pub exceptions: exceptions::ExceptionZoo,
     }
     
    -/*
    - * So a scope is a linked list of scopes.
    - * When a name is looked up, it is check in its scope.
    - */
    +pub fn create_type(name: &str, type_type: &PyObjectRef, base: &PyObjectRef) -> PyObjectRef {
    +    let dict = PyAttributes::new();
    +    objtype::new(
    +        type_type.clone(),
    +        name,
    +        vec![FromPyObjectRef::from_pyobj(base)],
    +        dict,
    +    )
    +    .unwrap()
    +}
    +
     #[derive(Debug)]
    -pub struct Scope {
    -    pub locals: PyObjectRef, // Variables
    -    // TODO: pub locals: RefCell<PyAttributes>,         // Variables
    -    pub parent: Option<PyObjectRef>, // Parent scope
    +pub struct PyNotImplemented;
    +
    +impl PyValue for PyNotImplemented {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.not_implemented().typ()
    +    }
     }
     
    -fn _nothing() -> PyObjectRef {
    -    PyObject {
    -        payload: PyObjectPayload::None,
    -        typ: None,
    +#[derive(Debug)]
    +pub struct PyEllipsis;
    +
    +impl PyValue for PyEllipsis {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.ellipsis_type.clone()
         }
    -    .into_ref()
     }
     
    -pub fn create_type(
    -    name: &str,
    -    type_type: &PyObjectRef,
    -    base: &PyObjectRef,
    -    _dict_type: &PyObjectRef,
    -) -> PyObjectRef {
    -    let dict = PyAttributes::new();
    -    objtype::new(type_type.clone(), name, vec![base.clone()], dict).unwrap()
    +fn init_type_hierarchy() -> (PyObjectRef, PyObjectRef) {
    +    // `type` inherits from `object`
    +    // and both `type` and `object are instances of `type`.
    +    // to produce this circular dependency, we need an unsafe block.
    +    // (and yes, this will never get dropped. TODO?)
    +    unsafe {
    +        let object_type = PyObject {
    +            typ: mem::uninitialized(), // !
    +            dict: Some(RefCell::new(PyAttributes::new())),
    +            payload: Box::new(PyClass {
    +                name: String::from("object"),
    +                mro: vec![],
    +            }),
    +        }
    +        .into_ref();
    +
    +        let type_type = PyObject {
    +            typ: mem::uninitialized(), // !
    +            dict: Some(RefCell::new(PyAttributes::new())),
    +            payload: Box::new(PyClass {
    +                name: String::from("type"),
    +                mro: vec![FromPyObjectRef::from_pyobj(&object_type)],
    +            }),
    +        }
    +        .into_ref();
    +
    +        let object_type_ptr = PyObjectRef::into_raw(object_type.clone()) as *mut PyObject;
    +        let type_type_ptr = PyObjectRef::into_raw(type_type.clone()) as *mut PyObject;
    +        ptr::write(&mut (*object_type_ptr).typ, type_type.clone());
    +        ptr::write(&mut (*type_type_ptr).typ, type_type.clone());
    +
    +        (type_type, object_type)
    +    }
     }
     
     // Basic objects:
     impl PyContext {
         pub fn new() -> Self {
    -        let type_type = _nothing();
    -        let object_type = _nothing();
    -        let dict_type = _nothing();
    -
    -        objtype::create_type(type_type.clone(), object_type.clone(), dict_type.clone());
    -        objobject::create_object(type_type.clone(), object_type.clone(), dict_type.clone());
    -        objdict::create_type(type_type.clone(), object_type.clone(), dict_type.clone());
    -
    -        let module_type = create_type("module", &type_type, &object_type, &dict_type);
    -        let classmethod_type = create_type("classmethod", &type_type, &object_type, &dict_type);
    -        let staticmethod_type = create_type("staticmethod", &type_type, &object_type, &dict_type);
    -        let function_type = create_type("function", &type_type, &object_type, &dict_type);
    -        let builtin_function_or_method_type = create_type(
    -            "builtin_function_or_method",
    -            &type_type,
    -            &object_type,
    -            &dict_type,
    -        );
    -        let property_type = create_type("property", &type_type, &object_type, &dict_type);
    -        let super_type = create_type("super", &type_type, &object_type, &dict_type);
    -        let generator_type = create_type("generator", &type_type, &object_type, &dict_type);
    -        let bound_method_type = create_type("method", &type_type, &object_type, &dict_type);
    -        let member_descriptor_type =
    -            create_type("member_descriptor", &type_type, &object_type, &dict_type);
    -        let str_type = create_type("str", &type_type, &object_type, &dict_type);
    -        let list_type = create_type("list", &type_type, &object_type, &dict_type);
    -        let set_type = create_type("set", &type_type, &object_type, &dict_type);
    -        let frozenset_type = create_type("frozenset", &type_type, &object_type, &dict_type);
    -        let int_type = create_type("int", &type_type, &object_type, &dict_type);
    -        let float_type = create_type("float", &type_type, &object_type, &dict_type);
    -        let frame_type = create_type("frame", &type_type, &object_type, &dict_type);
    -        let complex_type = create_type("complex", &type_type, &object_type, &dict_type);
    -        let bytes_type = create_type("bytes", &type_type, &object_type, &dict_type);
    -        let bytearray_type = create_type("bytearray", &type_type, &object_type, &dict_type);
    -        let tuple_type = create_type("tuple", &type_type, &object_type, &dict_type);
    -        let iter_type = create_type("iter", &type_type, &object_type, &dict_type);
    -        let enumerate_type = create_type("enumerate", &type_type, &object_type, &dict_type);
    -        let filter_type = create_type("filter", &type_type, &object_type, &dict_type);
    -        let map_type = create_type("map", &type_type, &object_type, &dict_type);
    -        let zip_type = create_type("zip", &type_type, &object_type, &dict_type);
    -        let bool_type = create_type("bool", &type_type, &int_type, &dict_type);
    -        let memoryview_type = create_type("memoryview", &type_type, &object_type, &dict_type);
    -        let code_type = create_type("code", &type_type, &int_type, &dict_type);
    -        let range_type = create_type("range", &type_type, &object_type, &dict_type);
    -        let slice_type = create_type("slice", &type_type, &object_type, &dict_type);
    -        let exceptions = exceptions::ExceptionZoo::new(&type_type, &object_type, &dict_type);
    +        let (type_type, object_type) = init_type_hierarchy();
    +
    +        let dict_type = create_type("dict", &type_type, &object_type);
    +        let module_type = create_type("module", &type_type, &object_type);
    +        let classmethod_type = create_type("classmethod", &type_type, &object_type);
    +        let staticmethod_type = create_type("staticmethod", &type_type, &object_type);
    +        let function_type = create_type("function", &type_type, &object_type);
    +        let builtin_function_or_method_type =
    +            create_type("builtin_function_or_method", &type_type, &object_type);
    +        let property_type = create_type("property", &type_type, &object_type);
    +        let readonly_property_type = create_type("readonly_property", &type_type, &object_type);
    +        let super_type = create_type("super", &type_type, &object_type);
    +        let weakref_type = create_type("ref", &type_type, &object_type);
    +        let generator_type = create_type("generator", &type_type, &object_type);
    +        let bound_method_type = create_type("method", &type_type, &object_type);
    +        let str_type = create_type("str", &type_type, &object_type);
    +        let list_type = create_type("list", &type_type, &object_type);
    +        let set_type = create_type("set", &type_type, &object_type);
    +        let frozenset_type = create_type("frozenset", &type_type, &object_type);
    +        let int_type = create_type("int", &type_type, &object_type);
    +        let float_type = create_type("float", &type_type, &object_type);
    +        let frame_type = create_type("frame", &type_type, &object_type);
    +        let complex_type = create_type("complex", &type_type, &object_type);
    +        let bytes_type = create_type("bytes", &type_type, &object_type);
    +        let bytearray_type = create_type("bytearray", &type_type, &object_type);
    +        let tuple_type = create_type("tuple", &type_type, &object_type);
    +        let iter_type = create_type("iter", &type_type, &object_type);
    +        let ellipsis_type = create_type("EllipsisType", &type_type, &object_type);
    +        let enumerate_type = create_type("enumerate", &type_type, &object_type);
    +        let filter_type = create_type("filter", &type_type, &object_type);
    +        let map_type = create_type("map", &type_type, &object_type);
    +        let zip_type = create_type("zip", &type_type, &object_type);
    +        let bool_type = create_type("bool", &type_type, &int_type);
    +        let memoryview_type = create_type("memoryview", &type_type, &object_type);
    +        let code_type = create_type("code", &type_type, &int_type);
    +        let range_type = create_type("range", &type_type, &object_type);
    +        let slice_type = create_type("slice", &type_type, &object_type);
    +        let exceptions = exceptions::ExceptionZoo::new(&type_type, &object_type);
     
             let none = PyObject::new(
    -            PyObjectPayload::None,
    -            create_type("NoneType", &type_type, &object_type, &dict_type),
    +            objnone::PyNone,
    +            create_type("NoneType", &type_type, &object_type),
             );
     
    +        let ellipsis = PyObject::new(PyEllipsis, ellipsis_type.clone());
    +
             let not_implemented = PyObject::new(
    -            PyObjectPayload::NotImplemented,
    -            create_type("NotImplementedType", &type_type, &object_type, &dict_type),
    +            PyNotImplemented,
    +            create_type("NotImplementedType", &type_type, &object_type),
             );
     
    -        let true_value = PyObject::new(
    -            PyObjectPayload::Integer { value: One::one() },
    -            bool_type.clone(),
    -        );
    -        let false_value = PyObject::new(
    -            PyObjectPayload::Integer {
    -                value: Zero::zero(),
    -            },
    -            bool_type.clone(),
    -        );
    +        let true_value = PyObject::new(PyInt::new(BigInt::one()), bool_type.clone());
    +        let false_value = PyObject::new(PyInt::new(BigInt::zero()), bool_type.clone());
             let context = PyContext {
                 bool_type,
                 memoryview_type,
    @@ -1365,12 +1513,14 @@
                 false_value,
                 tuple_type,
                 iter_type,
    +            ellipsis_type,
                 enumerate_type,
                 filter_type,
                 map_type,
                 zip_type,
                 dict_type,
                 none,
    +            ellipsis,
                 not_implemented,
                 str_type,
                 range_type,
    @@ -1380,10 +1530,11 @@
                 builtin_function_or_method_type,
                 super_type,
                 property_type,
    +            readonly_property_type,
                 generator_type,
                 module_type,
                 bound_method_type,
    -            member_descriptor_type,
    +            weakref_type,
                 type_type,
                 exceptions,
             };
    @@ -1394,6 +1545,8 @@
             objobject::init(&context);
             objdict::init(&context);
             objfunction::init(&context);
    +        objstaticmethod::init(&context);
    +        objclassmethod::init(&context);
             objgenerator::init(&context);
             objint::init(&context);
             objfloat::init(&context);
    @@ -1408,6 +1561,7 @@
             objsuper::init(&context);
             objtuple::init(&context);
             objiter::init(&context);
    +        objellipsis::init(&context);
             objenumerate::init(&context);
             objfilter::init(&context);
             objmap::init(&context);
    @@ -1415,7 +1569,9 @@
             objbool::init(&context);
             objcode::init(&context);
             objframe::init(&context);
    +        objweakref::init(&context);
             objnone::init(&context);
    +        objmodule::init(&context);
             exceptions::init(&context);
             context
         }
    @@ -1456,6 +1612,10 @@
             self.list_type.clone()
         }
     
    +    pub fn module_type(&self) -> PyObjectRef {
    +        self.module_type.clone()
    +    }
    +
         pub fn set_type(&self) -> PyObjectRef {
             self.set_type.clone()
         }
    @@ -1524,6 +1684,10 @@
             self.property_type.clone()
         }
     
    +    pub fn readonly_property_type(&self) -> PyObjectRef {
    +        self.readonly_property_type.clone()
    +    }
    +
         pub fn classmethod_type(&self) -> PyObjectRef {
             self.classmethod_type.clone()
         }
    @@ -1539,9 +1703,11 @@
         pub fn bound_method_type(&self) -> PyObjectRef {
             self.bound_method_type.clone()
         }
    -    pub fn member_descriptor_type(&self) -> PyObjectRef {
    -        self.member_descriptor_type.clone()
    +
    +    pub fn weakref_type(&self) -> PyObjectRef {
    +        self.weakref_type.clone()
         }
    +
         pub fn type_type(&self) -> PyObjectRef {
             self.type_type.clone()
         }
    @@ -1549,9 +1715,15 @@
         pub fn none(&self) -> PyObjectRef {
             self.none.clone()
         }
    +
    +    pub fn ellipsis(&self) -> PyObjectRef {
    +        self.ellipsis.clone()
    +    }
    +
         pub fn not_implemented(&self) -> PyObjectRef {
             self.not_implemented.clone()
         }
    +
         pub fn object(&self) -> PyObjectRef {
             self.object.clone()
         }
    @@ -1560,36 +1732,28 @@
             self.new_instance(self.object(), None)
         }
     
    -    pub fn new_int<T: ToBigInt>(&self, i: T) -> PyObjectRef {
    -        PyObject::new(
    -            PyObjectPayload::Integer {
    -                value: i.to_bigint().unwrap(),
    -            },
    -            self.int_type(),
    -        )
    +    pub fn new_int<T: Into<BigInt>>(&self, i: T) -> PyObjectRef {
    +        PyObject::new(PyInt::new(i), self.int_type())
         }
     
    -    pub fn new_float(&self, i: f64) -> PyObjectRef {
    -        PyObject::new(PyObjectPayload::Float { value: i }, self.float_type())
    +    pub fn new_float(&self, value: f64) -> PyObjectRef {
    +        PyObject::new(PyFloat::from(value), self.float_type())
         }
     
    -    pub fn new_complex(&self, i: Complex64) -> PyObjectRef {
    -        PyObject::new(PyObjectPayload::Complex { value: i }, self.complex_type())
    +    pub fn new_complex(&self, value: Complex64) -> PyObjectRef {
    +        PyObject::new(PyComplex::from(value), self.complex_type())
         }
     
         pub fn new_str(&self, s: String) -> PyObjectRef {
    -        PyObject::new(PyObjectPayload::String { value: s }, self.str_type())
    +        PyObject::new(objstr::PyString { value: s }, self.str_type())
         }
     
         pub fn new_bytes(&self, data: Vec<u8>) -> PyObjectRef {
    -        PyObject::new(PyObjectPayload::Bytes { value: data }, self.bytes_type())
    +        PyObject::new(objbytes::PyBytes::new(data), self.bytes_type())
         }
     
         pub fn new_bytearray(&self, data: Vec<u8>) -> PyObjectRef {
    -        PyObject::new(
    -            PyObjectPayload::Bytes { value: data },
    -            self.bytearray_type(),
    -        )
    +        PyObject::new(objbytearray::PyByteArray::new(data), self.bytearray_type())
         }
     
         pub fn new_bool(&self, b: bool) -> PyObjectRef {
    @@ -1601,147 +1765,105 @@
         }
     
         pub fn new_tuple(&self, elements: Vec<PyObjectRef>) -> PyObjectRef {
    -        PyObject::new(PyObjectPayload::Sequence { elements }, self.tuple_type())
    +        PyObject::new(PyTuple::from(elements), self.tuple_type())
         }
     
         pub fn new_list(&self, elements: Vec<PyObjectRef>) -> PyObjectRef {
    -        PyObject::new(PyObjectPayload::Sequence { elements }, self.list_type())
    +        PyObject::new(PyList::from(elements), self.list_type())
         }
     
         pub fn new_set(&self) -> PyObjectRef {
             // Initialized empty, as calling __hash__ is required for adding each object to the set
             // which requires a VM context - this is done in the objset code itself.
    -        let elements: HashMap<u64, PyObjectRef> = HashMap::new();
    -        PyObject::new(PyObjectPayload::Set { elements }, self.set_type())
    +        PyObject::new(PySet::default(), self.set_type())
         }
     
         pub fn new_dict(&self) -> PyObjectRef {
    -        PyObject::new(
    -            PyObjectPayload::Dict {
    -                elements: HashMap::new(),
    -            },
    -            self.dict_type(),
    -        )
    +        PyObject::new(PyDict::default(), self.dict_type())
         }
     
         pub fn new_class(&self, name: &str, base: PyObjectRef) -> PyObjectRef {
    -        objtype::new(self.type_type(), name, vec![base], PyAttributes::new()).unwrap()
    +        objtype::new(
    +            self.type_type(),
    +            name,
    +            vec![FromPyObjectRef::from_pyobj(&base)],
    +            PyAttributes::new(),
    +        )
    +        .unwrap()
         }
     
    -    pub fn new_scope(&self, parent: Option<PyObjectRef>) -> PyObjectRef {
    -        let locals = self.new_dict();
    -        let scope = Scope { locals, parent };
    -        PyObject {
    -            payload: PyObjectPayload::Scope { scope },
    -            typ: None,
    -        }
    -        .into_ref()
    +    pub fn new_scope(&self) -> Scope {
    +        Scope::new(None, self.new_dict())
         }
     
    -    pub fn new_module(&self, name: &str, scope: PyObjectRef) -> PyObjectRef {
    +    pub fn new_module(&self, name: &str, dict: PyObjectRef) -> PyObjectRef {
             PyObject::new(
    -            PyObjectPayload::Module {
    +            PyModule {
                     name: name.to_string(),
    -                dict: scope.clone(),
    +                dict,
                 },
                 self.module_type.clone(),
             )
         }
     
    -    pub fn new_rustfunc<F: 'static + Fn(&mut VirtualMachine, PyFuncArgs) -> PyResult>(
    -        &self,
    -        function: F,
    -    ) -> PyObjectRef {
    +    pub fn new_rustfunc<F, T, R>(&self, f: F) -> PyObjectRef
    +    where
    +        F: IntoPyNativeFunc<T, R>,
    +    {
             PyObject::new(
    -            PyObjectPayload::RustFunction {
    -                function: Box::new(function),
    -            },
    +            PyBuiltinFunction::new(f.into_func()),
                 self.builtin_function_or_method_type(),
             )
         }
     
    -    pub fn new_rustfunc_from_box(
    -        &self,
    -        function: Box<Fn(&mut VirtualMachine, PyFuncArgs) -> PyResult>,
    -    ) -> PyObjectRef {
    -        PyObject::new(
    -            PyObjectPayload::RustFunction { function },
    -            self.builtin_function_or_method_type(),
    -        )
    +    pub fn new_frame(&self, code: PyObjectRef, scope: Scope) -> PyObjectRef {
    +        PyObject::new(Frame::new(code, scope), self.frame_type())
         }
     
    -    pub fn new_frame(&self, frame: Frame) -> PyObjectRef {
    -        PyObject::new(PyObjectPayload::Frame { frame }, self.frame_type())
    -    }
    -
    -    pub fn new_property<F: 'static + Fn(&mut VirtualMachine, PyFuncArgs) -> PyResult>(
    -        &self,
    -        function: F,
    -    ) -> PyObjectRef {
    -        let fget = self.new_rustfunc(function);
    -        let py_obj = self.new_instance(self.property_type(), None);
    -        self.set_attr(&py_obj, "fget", fget.clone());
    -        py_obj
    +    pub fn new_property<F, I, V>(&self, f: F) -> PyObjectRef
    +    where
    +        F: IntoPyNativeFunc<I, V>,
    +    {
    +        PropertyBuilder::new(self).add_getter(f).create()
         }
     
         pub fn new_code_object(&self, code: bytecode::CodeObject) -> PyObjectRef {
    -        PyObject::new(PyObjectPayload::Code { code }, self.code_type())
    +        PyObject::new(objcode::PyCode::new(code), self.code_type())
         }
     
         pub fn new_function(
             &self,
             code_obj: PyObjectRef,
    -        scope: PyObjectRef,
    +        scope: Scope,
             defaults: PyObjectRef,
         ) -> PyObjectRef {
             PyObject::new(
    -            PyObjectPayload::Function {
    -                code: code_obj,
    -                scope,
    -                defaults,
    -            },
    +            PyFunction::new(code_obj, scope, defaults),
                 self.function_type(),
             )
         }
     
         pub fn new_bound_method(&self, function: PyObjectRef, object: PyObjectRef) -> PyObjectRef {
    -        PyObject::new(
    -            PyObjectPayload::BoundMethod { function, object },
    -            self.bound_method_type(),
    -        )
    -    }
    -
    -    pub fn new_member_descriptor<F: 'static + Fn(&mut VirtualMachine, PyFuncArgs) -> PyResult>(
    -        &self,
    -        function: F,
    -    ) -> PyObjectRef {
    -        let mut dict = PyAttributes::new();
    -        dict.insert("function".to_string(), self.new_rustfunc(function));
    -        self.new_instance(self.member_descriptor_type(), Some(dict))
    +        PyObject::new(PyMethod::new(object, function), self.bound_method_type())
         }
     
         pub fn new_instance(&self, class: PyObjectRef, dict: Option<PyAttributes>) -> PyObjectRef {
    -        let dict = if let Some(dict) = dict {
    -            dict
    -        } else {
    -            PyAttributes::new()
    -        };
    -        PyObject::new(
    -            PyObjectPayload::Instance {
    -                dict: RefCell::new(dict),
    -            },
    -            class,
    -        )
    +        let dict = dict.unwrap_or_default();
    +        PyObject {
    +            typ: class,
    +            dict: Some(RefCell::new(dict)),
    +            payload: Box::new(objobject::PyInstance),
    +        }
    +        .into_ref()
         }
     
         // Item set/get:
         pub fn set_item(&self, obj: &PyObjectRef, key: &str, v: PyObjectRef) {
    -        match obj.borrow_mut().payload {
    -            PyObjectPayload::Dict { ref mut elements } => {
    -                let key = self.new_str(key.to_string());
    -                objdict::set_item_in_content(elements, &key, &v);
    -            }
    -            ref k => panic!("TODO {:?}", k),
    +        if let Some(dict) = obj.payload::<PyDict>() {
    +            let key = self.new_str(key.to_string());
    +            objdict::set_item_in_content(&mut dict.entries.borrow_mut(), &key, &v);
    +        } else {
    +            unimplemented!()
             };
         }
     
    @@ -1753,19 +1875,16 @@
         }
     
         pub fn set_attr(&self, obj: &PyObjectRef, attr_name: &str, value: PyObjectRef) {
    -        match obj.borrow().payload {
    -            PyObjectPayload::Module { ref dict, .. } => self.set_attr(dict, attr_name, value),
    -            PyObjectPayload::Instance { ref dict } | PyObjectPayload::Class { ref dict, .. } => {
    -                dict.borrow_mut().insert(attr_name.to_string(), value);
    -            }
    -            PyObjectPayload::Scope { ref scope } => {
    -                self.set_item(&scope.locals, attr_name, value);
    -            }
    -            ref payload => unimplemented!("set_attr unimplemented for: {:?}", payload),
    +        if let Some(PyModule { ref dict, .. }) = obj.payload::<PyModule>() {
    +            dict.set_item(self, attr_name, value)
    +        } else if let Some(ref dict) = obj.dict {
    +            dict.borrow_mut().insert(attr_name.to_string(), value);
    +        } else {
    +            unimplemented!("set_attr unimplemented for: {:?}", obj);
             };
         }
     
    -    pub fn unwrap_constant(&mut self, value: &bytecode::Constant) -> PyObjectRef {
    +    pub fn unwrap_constant(&self, value: &bytecode::Constant) -> PyObjectRef {
             match *value {
                 bytecode::Constant::Integer { ref value } => self.new_int(value.clone()),
                 bytecode::Constant::Float { ref value } => self.new_float(*value),
    @@ -1773,7 +1892,7 @@
                 bytecode::Constant::String { ref value } => self.new_str(value.clone()),
                 bytecode::Constant::Bytes { ref value } => self.new_bytes(value.clone()),
                 bytecode::Constant::Boolean { ref value } => self.new_bool(value.clone()),
    -            bytecode::Constant::Code { ref code } => self.new_code_object(code.clone()),
    +            bytecode::Constant::Code { ref code } => self.new_code_object(*code.clone()),
                 bytecode::Constant::Tuple { ref elements } => {
                     let elements = elements
                         .iter()
    @@ -1782,78 +1901,146 @@
                     self.new_tuple(elements)
                 }
                 bytecode::Constant::None => self.none(),
    +            bytecode::Constant::Ellipsis => self.ellipsis(),
             }
         }
     }
     
    +impl Default for PyContext {
    +    fn default() -> Self {
    +        PyContext::new()
    +    }
    +}
    +
     /// This is an actual python object. It consists of a `typ` which is the
     /// python class, and carries some rust payload optionally. This rust
     /// payload can be a rust float or rust int in case of float and int objects.
     pub struct PyObject {
    -    pub payload: PyObjectPayload,
    -    pub typ: Option<PyObjectRef>,
    -    // pub dict: HashMap<String, PyObjectRef>, // __dict__ member
    +    pub typ: PyObjectRef,
    +    pub dict: Option<RefCell<PyAttributes>>, // __dict__ member
    +    pub payload: Box<dyn PyObjectPayload>,
     }
     
    -pub trait IdProtocol {
    -    fn get_id(&self) -> usize;
    -    fn is(&self, other: &PyObjectRef) -> bool;
    +/// A reference to a Python object.
    +///
    +/// Note that a `PyRef<T>` can only deref to a shared / immutable reference.
    +/// It is the payload type's responsibility to handle (possibly concurrent)
    +/// mutability with locks or concurrent data structures if required.
    +///
    +/// A `PyRef<T>` can be directly returned from a built-in function to handle
    +/// situations (such as when implementing in-place methods such as `__iadd__`)
    +/// where a reference to the same object must be returned.
    +#[derive(Clone, Debug)]
    +pub struct PyRef<T> {
    +    // invariant: this obj must always have payload of type T
    +    obj: PyObjectRef,
    +    _payload: PhantomData<T>,
     }
     
    -impl IdProtocol for PyObjectRef {
    -    fn get_id(&self) -> usize {
    -        self.as_ptr() as usize
    +impl<T: PyValue> PyRef<T> {
    +    pub fn as_object(&self) -> &PyObjectRef {
    +        &self.obj
    +    }
    +    pub fn into_object(self) -> PyObjectRef {
    +        self.obj
         }
     
    -    fn is(&self, other: &PyObjectRef) -> bool {
    -        self.get_id() == other.get_id()
    +    pub fn typ(&self) -> PyClassRef {
    +        PyRef {
    +            obj: self.obj.typ(),
    +            _payload: PhantomData,
    +        }
         }
     }
     
    -pub trait FromPyObjectRef {
    -    fn from_pyobj(obj: &PyObjectRef) -> Self;
    +impl<T> Deref for PyRef<T>
    +where
    +    T: PyValue,
    +{
    +    type Target = T;
    +
    +    fn deref(&self) -> &T {
    +        self.obj.payload().expect("unexpected payload for type")
    +    }
     }
     
    -pub trait TypeProtocol {
    -    fn typ(&self) -> PyObjectRef;
    +impl<T> TryFromObject for PyRef<T>
    +where
    +    T: PyValue,
    +{
    +    fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self> {
    +        if objtype::isinstance(&obj, &T::class(vm)) {
    +            Ok(PyRef {
    +                obj,
    +                _payload: PhantomData,
    +            })
    +        } else {
    +            let class = T::class(vm);
    +            let expected_type = vm.to_pystr(&class)?;
    +            let actual_type = vm.to_pystr(&obj.typ())?;
    +            Err(vm.new_type_error(format!(
    +                "Expected type {}, not {}",
    +                expected_type, actual_type,
    +            )))
    +        }
    +    }
     }
     
    -impl TypeProtocol for PyObjectRef {
    -    fn typ(&self) -> PyObjectRef {
    -        self.borrow().typ()
    +impl<T> IntoPyObject for PyRef<T> {
    +    fn into_pyobject(self, _vm: &VirtualMachine) -> PyResult {
    +        Ok(self.obj)
         }
     }
     
    -impl TypeProtocol for PyObject {
    -    fn typ(&self) -> PyObjectRef {
    -        match self.typ {
    -            Some(ref typ) => typ.clone(),
    -            None => panic!("Object {:?} doesn't have a type!", self),
    -        }
    +impl<T: fmt::Display> fmt::Display for PyRef<T>
    +where
    +    T: PyValue + fmt::Display,
    +{
    +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    +        let value: &T = self.obj.payload().expect("unexpected payload for type");
    +        fmt::Display::fmt(value, f)
         }
     }
     
    -pub trait ParentProtocol {
    -    fn has_parent(&self) -> bool;
    -    fn get_parent(&self) -> PyObjectRef;
    +pub trait IdProtocol {
    +    fn get_id(&self) -> usize;
    +    fn is<T>(&self, other: &T) -> bool
    +    where
    +        T: IdProtocol,
    +    {
    +        self.get_id() == other.get_id()
    +    }
     }
     
    -impl ParentProtocol for PyObjectRef {
    -    fn has_parent(&self) -> bool {
    -        match self.borrow().payload {
    -            PyObjectPayload::Scope { ref scope } => scope.parent.is_some(),
    -            _ => panic!("Only scopes have parent (not {:?}", self),
    -        }
    +impl IdProtocol for PyObjectRef {
    +    fn get_id(&self) -> usize {
    +        &*self as &PyObject as *const PyObject as usize
         }
    +}
     
    -    fn get_parent(&self) -> PyObjectRef {
    -        match self.borrow().payload {
    -            PyObjectPayload::Scope { ref scope } => match scope.parent {
    -                Some(ref value) => value.clone(),
    -                None => panic!("OMG"),
    -            },
    -            _ => panic!("TODO"),
    -        }
    +pub trait FromPyObjectRef {
    +    fn from_pyobj(obj: &PyObjectRef) -> Self;
    +}
    +
    +pub trait TypeProtocol {
    +    fn typ(&self) -> PyObjectRef {
    +        self.type_ref().clone()
    +    }
    +    fn type_pyref(&self) -> PyClassRef {
    +        FromPyObjectRef::from_pyobj(self.type_ref())
    +    }
    +    fn type_ref(&self) -> &PyObjectRef;
    +}
    +
    +impl TypeProtocol for PyObjectRef {
    +    fn type_ref(&self) -> &PyObjectRef {
    +        (**self).type_ref()
    +    }
    +}
    +
    +impl TypeProtocol for PyObject {
    +    fn type_ref(&self) -> &PyObjectRef {
    +        &self.typ
         }
     }
     
    @@ -1863,51 +2050,60 @@
     }
     
     fn class_get_item(class: &PyObjectRef, attr_name: &str) -> Option<PyObjectRef> {
    -    let class = class.borrow();
    -    match class.payload {
    -        PyObjectPayload::Class { ref dict, .. } => dict.borrow().get(attr_name).cloned(),
    -        _ => panic!("Only classes should be in MRO!"),
    +    if let Some(ref dict) = class.dict {
    +        dict.borrow().get(attr_name).cloned()
    +    } else {
    +        panic!("Only classes should be in MRO!");
         }
     }
     
     fn class_has_item(class: &PyObjectRef, attr_name: &str) -> bool {
    -    let class = class.borrow();
    -    match class.payload {
    -        PyObjectPayload::Class { ref dict, .. } => dict.borrow().contains_key(attr_name),
    -        _ => panic!("Only classes should be in MRO!"),
    +    if let Some(ref dict) = class.dict {
    +        dict.borrow().contains_key(attr_name)
    +    } else {
    +        panic!("Only classes should be in MRO!");
         }
     }
     
     impl AttributeProtocol for PyObjectRef {
         fn get_attr(&self, attr_name: &str) -> Option<PyObjectRef> {
    -        let obj = self.borrow();
    -        match obj.payload {
    -            PyObjectPayload::Module { ref dict, .. } => dict.get_item(attr_name),
    -            PyObjectPayload::Class { ref mro, .. } => {
    -                if let Some(item) = class_get_item(self, attr_name) {
    +        if let Some(PyClass { ref mro, .. }) = self.payload::<PyClass>() {
    +            if let Some(item) = class_get_item(self, attr_name) {
    +                return Some(item);
    +            }
    +            for class in mro {
    +                if let Some(item) = class_get_item(class.as_object(), attr_name) {
                         return Some(item);
                     }
    -                for class in mro {
    -                    if let Some(item) = class_get_item(class, attr_name) {
    -                        return Some(item);
    -                    }
    -                }
    -                None
                 }
    -            PyObjectPayload::Instance { ref dict } => dict.borrow().get(attr_name).cloned(),
    -            _ => None,
    +            return None;
    +        }
    +
    +        if let Some(PyModule { ref dict, .. }) = self.payload::<PyModule>() {
    +            return dict.get_item(attr_name);
    +        }
    +
    +        if let Some(ref dict) = self.dict {
    +            dict.borrow().get(attr_name).cloned()
    +        } else {
    +            None
             }
         }
     
         fn has_attr(&self, attr_name: &str) -> bool {
    -        let obj = self.borrow();
    -        match obj.payload {
    -            PyObjectPayload::Module { ref dict, .. } => dict.contains_key(attr_name),
    -            PyObjectPayload::Class { ref mro, .. } => {
    -                class_has_item(self, attr_name) || mro.iter().any(|d| class_has_item(d, attr_name))
    -            }
    -            PyObjectPayload::Instance { ref dict } => dict.borrow().contains_key(attr_name),
    -            _ => false,
    +        if let Some(PyClass { ref mro, .. }) = self.payload::<PyClass>() {
    +            return class_has_item(self, attr_name)
    +                || mro.iter().any(|d| class_has_item(d.as_object(), attr_name));
    +        }
    +
    +        if let Some(PyModule { ref dict, .. }) = self.payload::<PyModule>() {
    +            return dict.contains_key(attr_name);
    +        }
    +
    +        if let Some(ref dict) = self.dict {
    +            dict.borrow().contains_key(attr_name)
    +        } else {
    +            false
             }
         }
     }
    @@ -1916,35 +2112,55 @@
         fn contains_key(&self, k: &str) -> bool;
         fn get_item(&self, k: &str) -> Option<PyObjectRef>;
         fn get_key_value_pairs(&self) -> Vec<(PyObjectRef, PyObjectRef)>;
    +    fn set_item(&self, ctx: &PyContext, key: &str, v: PyObjectRef);
    +    fn del_item(&self, key: &str);
     }
     
     impl DictProtocol for PyObjectRef {
         fn contains_key(&self, k: &str) -> bool {
    -        match self.borrow().payload {
    -            PyObjectPayload::Dict { ref elements } => {
    -                objdict::content_contains_key_str(elements, k)
    -            }
    -            PyObjectPayload::Scope { ref scope } => scope.locals.contains_key(k),
    -            ref payload => unimplemented!("TODO {:?}", payload),
    +        if let Some(dict) = self.payload::<PyDict>() {
    +            objdict::content_contains_key_str(&dict.entries.borrow(), k)
    +        } else {
    +            unimplemented!()
             }
         }
     
         fn get_item(&self, k: &str) -> Option<PyObjectRef> {
    -        match self.borrow().payload {
    -            PyObjectPayload::Dict { ref elements } => objdict::content_get_key_str(elements, k),
    -            PyObjectPayload::Scope { ref scope } => scope.locals.get_item(k),
    -            _ => panic!("TODO"),
    +        if let Some(dict) = self.payload::<PyDict>() {
    +            objdict::content_get_key_str(&dict.entries.borrow(), k)
    +        } else if let Some(PyModule { ref dict, .. }) = self.payload::<PyModule>() {
    +            dict.get_item(k)
    +        } else {
    +            panic!("TODO {:?}", k)
             }
         }
     
         fn get_key_value_pairs(&self) -> Vec<(PyObjectRef, PyObjectRef)> {
    -        match self.borrow().payload {
    -            PyObjectPayload::Dict { .. } => objdict::get_key_value_pairs(self),
    -            PyObjectPayload::Module { ref dict, .. } => dict.get_key_value_pairs(),
    -            PyObjectPayload::Scope { ref scope } => scope.locals.get_key_value_pairs(),
    -            _ => panic!("TODO"),
    +        if self.payload_is::<PyDict>() {
    +            objdict::get_key_value_pairs(self)
    +        } else if let Some(PyModule { ref dict, .. }) = self.payload::<PyModule>() {
    +            dict.get_key_value_pairs()
    +        } else {
    +            panic!("TODO")
    +        }
    +    }
    +
    +    // Item set/get:
    +    fn set_item(&self, ctx: &PyContext, key: &str, v: PyObjectRef) {
    +        if let Some(dict) = self.payload::<PyDict>() {
    +            let key = ctx.new_str(key.to_string());
    +            objdict::set_item_in_content(&mut dict.entries.borrow_mut(), &key, &v);
    +        } else if let Some(PyModule { ref dict, .. }) = self.payload::<PyModule>() {
    +            dict.set_item(ctx, key, v);
    +        } else {
    +            panic!("TODO {:?}", self);
             }
         }
    +
    +    fn del_item(&self, key: &str) {
    +        let mut elements = objdict::get_mut_elements(self);
    +        elements.remove(key).unwrap();
    +    }
     }
     
     pub trait BufferProtocol {
    @@ -1967,213 +2183,255 @@
         }
     }
     
    -/// The `PyFuncArgs` struct is one of the most used structs then creating
    -/// a rust function that can be called from python. It holds both positional
    -/// arguments, as well as keyword arguments passed to the function.
    -#[derive(Debug, Default, Clone)]
    -pub struct PyFuncArgs {
    -    pub args: Vec<PyObjectRef>,
    -    pub kwargs: Vec<(String, PyObjectRef)>,
    +/// An iterable Python object.
    +///
    +/// `PyIterable` implements `FromArgs` so that a built-in function can accept
    +/// an object that is required to conform to the Python iterator protocol.
    +///
    +/// PyIterable can optionally perform type checking and conversions on iterated
    +/// objects using a generic type parameter that implements `TryFromObject`.
    +pub struct PyIterable<T = PyObjectRef> {
    +    method: PyObjectRef,
    +    _item: std::marker::PhantomData<T>,
     }
     
    -impl PyFuncArgs {
    -    pub fn new(mut args: Vec<PyObjectRef>, kwarg_names: Vec<String>) -> PyFuncArgs {
    -        let mut kwargs = vec![];
    -        for name in kwarg_names.iter().rev() {
    -            kwargs.push((name.clone(), args.pop().unwrap()));
    +impl<T> PyIterable<T> {
    +    /// Returns an iterator over this sequence of objects.
    +    ///
    +    /// This operation may fail if an exception is raised while invoking the
    +    /// `__iter__` method of the iterable object.
    +    pub fn iter<'a>(&self, vm: &'a VirtualMachine) -> PyResult<PyIterator<'a, T>> {
    +        let iter_obj = vm.invoke(
    +            self.method.clone(),
    +            PyFuncArgs {
    +                args: vec![],
    +                kwargs: vec![],
    +            },
    +        )?;
    +
    +        Ok(PyIterator {
    +            vm,
    +            obj: iter_obj,
    +            _item: std::marker::PhantomData,
    +        })
    +    }
    +}
    +
    +pub struct PyIterator<'a, T> {
    +    vm: &'a VirtualMachine,
    +    obj: PyObjectRef,
    +    _item: std::marker::PhantomData<T>,
    +}
    +
    +impl<'a, T> Iterator for PyIterator<'a, T>
    +where
    +    T: TryFromObject,
    +{
    +    type Item = PyResult<T>;
    +
    +    fn next(&mut self) -> Option<Self::Item> {
    +        match self.vm.call_method(&self.obj, "__next__", vec![]) {
    +            Ok(value) => Some(T::try_from_object(self.vm, value)),
    +            Err(err) => {
    +                let stop_ex = self.vm.ctx.exceptions.stop_iteration.clone();
    +                if objtype::isinstance(&err, &stop_ex) {
    +                    None
    +                } else {
    +                    Some(Err(err))
    +                }
    +            }
             }
    -        PyFuncArgs { args, kwargs }
         }
    +}
     
    -    pub fn insert(&self, item: PyObjectRef) -> PyFuncArgs {
    -        let mut args = PyFuncArgs {
    -            args: self.args.clone(),
    -            kwargs: self.kwargs.clone(),
    -        };
    -        args.args.insert(0, item);
    -        args
    +impl<T> TryFromObject for PyIterable<T>
    +where
    +    T: TryFromObject,
    +{
    +    fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self> {
    +        Ok(PyIterable {
    +            method: vm.get_method(obj, "__iter__")?,
    +            _item: std::marker::PhantomData,
    +        })
         }
    +}
     
    -    pub fn shift(&mut self) -> PyObjectRef {
    -        self.args.remove(0)
    +impl TryFromObject for PyObjectRef {
    +    fn try_from_object(_vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self> {
    +        Ok(obj)
         }
    +}
     
    -    pub fn get_kwarg(&self, key: &str, default: PyObjectRef) -> PyObjectRef {
    -        for (arg_name, arg_value) in self.kwargs.iter() {
    -            if arg_name == key {
    -                return arg_value.clone();
    -            }
    +impl<T: TryFromObject> TryFromObject for Option<T> {
    +    fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self> {
    +        if vm.get_none().is(&obj) {
    +            Ok(None)
    +        } else {
    +            T::try_from_object(vm, obj).map(Some)
             }
    -        default.clone()
         }
    +}
     
    -    pub fn get_optional_kwarg(&self, key: &str) -> Option<PyObjectRef> {
    -        for (arg_name, arg_value) in self.kwargs.iter() {
    -            if arg_name == key {
    -                return Some(arg_value.clone());
    -            }
    -        }
    -        None
    +/// Allows coercion of a types into PyRefs, so that we can write functions that can take
    +/// refs, pyobject refs or basic types.
    +pub trait TryIntoRef<T> {
    +    fn try_into_ref(self, vm: &VirtualMachine) -> PyResult<PyRef<T>>;
    +}
    +
    +impl<T> TryIntoRef<T> for PyRef<T> {
    +    fn try_into_ref(self, _vm: &VirtualMachine) -> PyResult<PyRef<T>> {
    +        Ok(self)
         }
     }
     
    -/// Rather than determining the type of a python object, this enum is more
    -/// a holder for the rust payload of a python object. It is more a carrier
    -/// of rust data for a particular python object. Determine the python type
    -/// by using for example the `.typ()` method on a python object.
    -pub enum PyObjectPayload {
    -    String {
    -        value: String,
    -    },
    -    Integer {
    -        value: BigInt,
    -    },
    -    Float {
    -        value: f64,
    -    },
    -    Complex {
    -        value: Complex64,
    -    },
    -    Bytes {
    -        value: Vec<u8>,
    -    },
    -    Sequence {
    -        elements: Vec<PyObjectRef>,
    -    },
    -    Dict {
    -        elements: objdict::DictContentType,
    -    },
    -    Set {
    -        elements: HashMap<u64, PyObjectRef>,
    -    },
    -    Iterator {
    -        position: usize,
    -        iterated_obj: PyObjectRef,
    -    },
    -    EnumerateIterator {
    -        counter: BigInt,
    -        iterator: PyObjectRef,
    -    },
    -    FilterIterator {
    -        predicate: PyObjectRef,
    -        iterator: PyObjectRef,
    -    },
    -    MapIterator {
    -        mapper: PyObjectRef,
    -        iterators: Vec<PyObjectRef>,
    -    },
    -    ZipIterator {
    -        iterators: Vec<PyObjectRef>,
    -    },
    -    Slice {
    -        start: Option<BigInt>,
    -        stop: Option<BigInt>,
    -        step: Option<BigInt>,
    -    },
    -    Range {
    -        range: objrange::RangeType,
    -    },
    -    MemoryView {
    -        obj: PyObjectRef,
    -    },
    -    Code {
    -        code: bytecode::CodeObject,
    -    },
    -    Frame {
    -        frame: Frame,
    -    },
    -    Function {
    -        code: PyObjectRef,
    -        scope: PyObjectRef,
    -        defaults: PyObjectRef,
    -    },
    -    Generator {
    -        frame: Frame,
    -    },
    -    BoundMethod {
    -        function: PyObjectRef,
    -        object: PyObjectRef,
    -    },
    -    Scope {
    -        scope: Scope,
    -    },
    -    Module {
    -        name: String,
    -        dict: PyObjectRef,
    -    },
    -    None,
    -    NotImplemented,
    -    Class {
    -        name: String,
    -        dict: RefCell<PyAttributes>,
    -        mro: Vec<PyObjectRef>,
    -    },
    -    WeakRef {
    -        referent: PyObjectWeakRef,
    -    },
    -    Instance {
    -        dict: RefCell<PyAttributes>,
    -    },
    -    RustFunction {
    -        function: Box<Fn(&mut VirtualMachine, PyFuncArgs) -> PyResult>,
    -    },
    +impl<T> TryIntoRef<T> for PyObjectRef
    +where
    +    T: PyValue,
    +{
    +    fn try_into_ref(self, vm: &VirtualMachine) -> PyResult<PyRef<T>> {
    +        TryFromObject::try_from_object(vm, self)
    +    }
     }
     
    -impl fmt::Debug for PyObjectPayload {
    -    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    -        match self {
    -            PyObjectPayload::String { ref value } => write!(f, "str \"{}\"", value),
    -            PyObjectPayload::Integer { ref value } => write!(f, "int {}", value),
    -            PyObjectPayload::Float { ref value } => write!(f, "float {}", value),
    -            PyObjectPayload::Complex { ref value } => write!(f, "complex {}", value),
    -            PyObjectPayload::Bytes { ref value } => write!(f, "bytes/bytearray {:?}", value),
    -            PyObjectPayload::MemoryView { ref obj } => write!(f, "bytes/bytearray {:?}", obj),
    -            PyObjectPayload::Sequence { .. } => write!(f, "list or tuple"),
    -            PyObjectPayload::Dict { .. } => write!(f, "dict"),
    -            PyObjectPayload::Set { .. } => write!(f, "set"),
    -            PyObjectPayload::WeakRef { .. } => write!(f, "weakref"),
    -            PyObjectPayload::Range { .. } => write!(f, "range"),
    -            PyObjectPayload::Iterator { .. } => write!(f, "iterator"),
    -            PyObjectPayload::EnumerateIterator { .. } => write!(f, "enumerate"),
    -            PyObjectPayload::FilterIterator { .. } => write!(f, "filter"),
    -            PyObjectPayload::MapIterator { .. } => write!(f, "map"),
    -            PyObjectPayload::ZipIterator { .. } => write!(f, "zip"),
    -            PyObjectPayload::Slice { .. } => write!(f, "slice"),
    -            PyObjectPayload::Code { ref code } => write!(f, "code: {:?}", code),
    -            PyObjectPayload::Function { .. } => write!(f, "function"),
    -            PyObjectPayload::Generator { .. } => write!(f, "generator"),
    -            PyObjectPayload::BoundMethod {
    -                ref function,
    -                ref object,
    -            } => write!(f, "bound-method: {:?} of {:?}", function, object),
    -            PyObjectPayload::Module { .. } => write!(f, "module"),
    -            PyObjectPayload::Scope { .. } => write!(f, "scope"),
    -            PyObjectPayload::None => write!(f, "None"),
    -            PyObjectPayload::NotImplemented => write!(f, "NotImplemented"),
    -            PyObjectPayload::Class { ref name, .. } => write!(f, "class {:?}", name),
    -            PyObjectPayload::Instance { .. } => write!(f, "instance"),
    -            PyObjectPayload::RustFunction { .. } => write!(f, "rust function"),
    -            PyObjectPayload::Frame { .. } => write!(f, "frame"),
    -        }
    +/// Implemented by any type that can be created from a Python object.
    +///
    +/// Any type that implements `TryFromObject` is automatically `FromArgs`, and
    +/// so can be accepted as a argument to a built-in function.
    +pub trait TryFromObject: Sized {
    +    /// Attempt to convert a Python object to a value of this type.
    +    fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self>;
    +}
    +
    +/// Implemented by any type that can be returned from a built-in Python function.
    +///
    +/// `IntoPyObject` has a blanket implementation for any built-in object payload,
    +/// and should be implemented by many primitive Rust types, allowing a built-in
    +/// function to simply return a `bool` or a `usize` for example.
    +pub trait IntoPyObject {
    +    fn into_pyobject(self, vm: &VirtualMachine) -> PyResult;
    +}
    +
    +impl IntoPyObject for PyObjectRef {
    +    fn into_pyobject(self, _vm: &VirtualMachine) -> PyResult {
    +        Ok(self)
    +    }
    +}
    +
    +impl<T> IntoPyObject for PyResult<T>
    +where
    +    T: IntoPyObject,
    +{
    +    fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
    +        self.and_then(|res| T::into_pyobject(res, vm))
    +    }
    +}
    +
    +// Allows a built-in function to return any built-in object payload without
    +// explicitly implementing `IntoPyObject`.
    +impl<T> IntoPyObject for T
    +where
    +    T: PyValue + Sized,
    +{
    +    fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
    +        Ok(PyObject::new(self, T::class(vm)))
    +    }
    +}
    +
    +// TODO: This is a workaround and shouldn't exist.
    +//       Each iterable type should have its own distinct iterator type.
    +#[derive(Debug)]
    +pub struct PyIteratorValue {
    +    pub position: Cell<usize>,
    +    pub iterated_obj: PyObjectRef,
    +}
    +
    +impl PyValue for PyIteratorValue {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.ctx.iter_type()
         }
     }
     
     impl PyObject {
    -    pub fn new(
    -        payload: PyObjectPayload,
    -        /* dict: PyObjectRef,*/ typ: PyObjectRef,
    -    ) -> PyObjectRef {
    +    pub fn new<T: PyObjectPayload>(payload: T, typ: PyObjectRef) -> PyObjectRef {
    +        PyObject {
    +            typ,
    +            dict: Some(RefCell::new(PyAttributes::new())),
    +            payload: Box::new(payload),
    +        }
    +        .into_ref()
    +    }
    +
    +    pub fn new_without_dict<T: PyObjectPayload>(payload: T, typ: PyObjectRef) -> PyObjectRef {
             PyObject {
    -            payload,
    -            typ: Some(typ),
    -            // dict: HashMap::new(),  // dict,
    +            typ,
    +            dict: None,
    +            payload: Box::new(payload),
             }
             .into_ref()
         }
     
         // Move this object into a reference object, transferring ownership.
         pub fn into_ref(self) -> PyObjectRef {
    -        Rc::new(RefCell::new(self))
    +        Rc::new(self)
    +    }
    +
    +    #[inline]
    +    pub fn payload<T: PyObjectPayload>(&self) -> Option<&T> {
    +        self.payload.as_any().downcast_ref()
    +    }
    +
    +    #[inline]
    +    pub fn payload_is<T: PyObjectPayload>(&self) -> bool {
    +        self.payload.as_any().is::<T>()
    +    }
    +}
    +
    +pub trait PyValue: fmt::Debug + Sized + 'static {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef;
    +
    +    fn into_ref(self, vm: &VirtualMachine) -> PyRef<Self> {
    +        PyRef {
    +            obj: PyObject::new(self, Self::class(vm)),
    +            _payload: PhantomData,
    +        }
    +    }
    +
    +    fn into_ref_with_type(self, vm: &VirtualMachine, cls: PyClassRef) -> PyResult<PyRef<Self>> {
    +        let class = Self::class(vm);
    +        if objtype::issubclass(&cls.obj, &class) {
    +            Ok(PyRef {
    +                obj: PyObject::new(self, cls.obj),
    +                _payload: PhantomData,
    +            })
    +        } else {
    +            let subtype = vm.to_pystr(&cls.obj)?;
    +            let basetype = vm.to_pystr(&class)?;
    +            Err(vm.new_type_error(format!("{} is not a subtype of {}", subtype, basetype)))
    +        }
    +    }
    +}
    +
    +pub trait PyObjectPayload: Any + fmt::Debug + 'static {
    +    fn as_any(&self) -> &dyn Any;
    +}
    +
    +impl<T: PyValue + 'static> PyObjectPayload for T {
    +    #[inline]
    +    fn as_any(&self) -> &dyn Any {
    +        self
    +    }
    +}
    +
    +impl FromPyObjectRef for PyRef<PyClass> {
    +    fn from_pyobj(obj: &PyObjectRef) -> Self {
    +        if obj.payload_is::<PyClass>() {
    +            PyRef {
    +                obj: obj.clone(),
    +                _payload: PhantomData,
    +            }
    +        } else {
    +            panic!("Error getting inner type: {:?}", obj.typ)
    +        }
         }
     }
     
    @@ -2188,4 +2446,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/ast.rs.html b/src/rustpython_vm/stdlib/ast.rs.html index 9d69979..b4ad92c 100644 --- a/src/rustpython_vm/stdlib/ast.rs.html +++ b/src/rustpython_vm/stdlib/ast.rs.html @@ -1,4 +1,4 @@ -ast.rs.html -- source
      1
    +ast.rs.html -- source
      1
       2
       3
       4
    @@ -622,20 +622,31 @@
     622
     623
     624
    +625
    +626
    +627
    +628
    +629
    +630
    +631
    +632
    +633
     
     //! `ast` standard module for abstract syntax trees.
     //!
     //! This module makes use of the parser logic, and translates all ast nodes
     //! into python ast.AST objects.
     
    -extern crate rustpython_parser;
    +use std::ops::Deref;
     
    -use self::rustpython_parser::{ast, parser};
    -use crate::obj::objstr;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    -use crate::VirtualMachine;
     use num_complex::Complex64;
    -use std::ops::Deref;
    +
    +use rustpython_parser::{ast, parser};
    +
    +use crate::function::PyFuncArgs;
    +use crate::obj::objstr;
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
    +use crate::vm::VirtualMachine;
     
     /*
      * Idea: maybe we can create a sort of struct with some helper functions?
    @@ -707,6 +718,7 @@
                 args,
                 body,
                 decorator_list,
    +            returns,
             } => {
                 let node = create_node(ctx, "FunctionDef");
     
    @@ -721,6 +733,13 @@
     
                 let py_decorator_list = expressions_to_ast(ctx, decorator_list);
                 ctx.set_attr(&node, "decorator_list", py_decorator_list);
    +
    +            let py_returns = if let Some(hint) = returns {
    +                expression_to_ast(ctx, hint)
    +            } else {
    +                ctx.none()
    +            };
    +            ctx.set_attr(&node, "returns", py_returns);
                 node
             }
             ast::Statement::Continue => create_node(ctx, "Continue"),
    @@ -1020,6 +1039,7 @@
     
                 node
             }
    +        ast::Expression::Ellipsis => create_node(ctx, "Ellipsis"),
             ast::Expression::List { elements } => {
                 let node = create_node(ctx, "List");
     
    @@ -1162,17 +1182,28 @@
         ctx.set_attr(
             &node,
             "args",
    -        ctx.new_list(
    -            args.args
    -                .iter()
    -                .map(|a| ctx.new_str(a.to_string()))
    -                .collect(),
    -        ),
    +        ctx.new_list(args.args.iter().map(|a| parameter_to_ast(ctx, a)).collect()),
         );
     
         node
     }
     
    +fn parameter_to_ast(ctx: &PyContext, parameter: &ast::Parameter) -> PyObjectRef {
    +    let node = create_node(ctx, "arg");
    +
    +    let py_arg = ctx.new_str(parameter.arg.to_string());
    +    ctx.set_attr(&node, "arg", py_arg);
    +
    +    let py_annotation = if let Some(annotation) = &parameter.annotation {
    +        expression_to_ast(ctx, annotation)
    +    } else {
    +        ctx.none()
    +    };
    +    ctx.set_attr(&node, "annotation", py_annotation);
    +
    +    node
    +}
    +
     fn comprehension_to_ast(ctx: &PyContext, comprehension: &ast::Comprehension) -> PyObjectRef {
         let node = create_node(ctx, "comprehension");
     
    @@ -1215,7 +1246,7 @@
         }
     }
     
    -fn ast_parse(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn ast_parse(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(source, Some(vm.ctx.str_type()))]);
     
         let source_string = objstr::get_value(source);
    @@ -1226,26 +1257,13 @@
         Ok(ast_node)
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    // TODO: maybe we can use some clever macro to generate this?
    -    let ast_mod = ctx.new_module("ast", ctx.new_scope(None));
    -
    -    ctx.set_attr(&ast_mod, "parse", ctx.new_rustfunc(ast_parse));
    -
    -    ctx.set_attr(
    -        &ast_mod,
    -        "Module",
    -        ctx.new_class("_ast.Module", ctx.object()),
    -    );
    -
    -    ctx.set_attr(
    -        &ast_mod,
    -        "FunctionDef",
    -        ctx.new_class("_ast.FunctionDef", ctx.object()),
    -    );
    -    ctx.set_attr(&ast_mod, "Call", ctx.new_class("_ast.Call", ctx.object()));
    -
    -    ast_mod
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    py_module!(ctx, "ast", {
    +        "parse" => ctx.new_rustfunc(ast_parse),
    +        "Module" => py_class!(ctx, "_ast.Module", ctx.object(), {}),
    +        "FunctionDef" => py_class!(ctx, "_ast.FunctionDef", ctx.object(), {}),
    +        "Call" => py_class!(ctx, "_ast.Call", ctx.object(), {})
    +    })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/dis.rs.html b/src/rustpython_vm/stdlib/dis.rs.html index 43201da..6f7e82c 100644 --- a/src/rustpython_vm/stdlib/dis.rs.html +++ b/src/rustpython_vm/stdlib/dis.rs.html @@ -1,4 +1,4 @@ -dis.rs.html -- source
     1
    +dis.rs.html -- source
     1
      2
      3
      4
    @@ -15,12 +15,37 @@
     15
     16
     17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
     
    +use crate::function::PyFuncArgs;
     use crate::obj::objcode;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
     use crate::vm::VirtualMachine;
     
    -fn dis_disassemble(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn dis_dis(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(obj, None)]);
    +
    +    // Method or function:
    +    if let Ok(co) = vm.get_attribute(obj.clone(), "__code__") {
    +        return dis_disassemble(vm, PyFuncArgs::new(vec![co], vec![]));
    +    }
    +
    +    dis_disassemble(vm, PyFuncArgs::new(vec![obj.clone()], vec![]))
    +}
    +
    +fn dis_disassemble(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(co, Some(vm.ctx.code_type()))]);
     
         let code = objcode::get_value(co);
    @@ -28,10 +53,11 @@
         Ok(vm.get_none())
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
         py_module!(ctx, "dis", {
    +        "dis" => ctx.new_rustfunc(dis_dis),
             "disassemble" => ctx.new_rustfunc(dis_disassemble)
         })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/io.rs.html b/src/rustpython_vm/stdlib/io.rs.html index cbec4d5..80dbe5a 100644 --- a/src/rustpython_vm/stdlib/io.rs.html +++ b/src/rustpython_vm/stdlib/io.rs.html @@ -1,4 +1,4 @@ -io.rs.html -- source
      1
    +io.rs.html -- source
      1
       2
       3
       4
    @@ -437,35 +437,31 @@
     437
     438
     439
    -440
    -441
    -442
     
     /*
      * I/O core tools.
      */
     
    -//library imports
    +use std::cell::RefCell;
     use std::collections::HashSet;
     use std::fs::File;
     use std::io::prelude::*;
     use std::io::BufReader;
    +use std::path::PathBuf;
     
    -//3rd party imports
     use num_bigint::ToBigInt;
     use num_traits::ToPrimitive;
     
    -//custom imports
     use super::os;
    +use crate::function::PyFuncArgs;
    +use crate::import;
    +use crate::obj::objbytearray::PyByteArray;
     use crate::obj::objbytes;
     use crate::obj::objint;
     use crate::obj::objstr;
    -
     use crate::pyobject::{
    -    AttributeProtocol, BufferProtocol, PyContext, PyFuncArgs, PyObjectPayload, PyObjectRef,
    -    PyResult, TypeProtocol,
    +    BufferProtocol, PyContext, PyObject, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol,
     };
    -
     use crate::vm::VirtualMachine;
     
     fn compute_c_flag(mode: &str) -> u16 {
    @@ -478,36 +474,79 @@
         }
     }
     
    -fn string_io_init(vm: &mut VirtualMachine, _args: PyFuncArgs) -> PyResult {
    -    // arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
    +#[derive(Debug)]
    +struct PyStringIO {
    +    data: RefCell<String>,
    +}
    +
    +type PyStringIORef = PyRef<PyStringIO>;
    +
    +impl PyValue for PyStringIO {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.class("io", "StringIO")
    +    }
    +}
    +
    +impl PyStringIORef {
    +    fn write(self, data: objstr::PyStringRef, _vm: &VirtualMachine) {
    +        let data = data.value.clone();
    +        self.data.borrow_mut().push_str(&data);
    +    }
    +
    +    fn getvalue(self, _vm: &VirtualMachine) -> String {
    +        self.data.borrow().clone()
    +    }
    +}
    +
    +fn string_io_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(cls, None)]);
    +
    +    Ok(PyObject::new(
    +        PyStringIO {
    +            data: RefCell::new(String::default()),
    +        },
    +        cls.clone(),
    +    ))
    +}
    +
    +fn bytes_io_init(vm: &VirtualMachine, _args: PyFuncArgs) -> PyResult {
         // TODO
         Ok(vm.get_none())
     }
     
    -fn string_io_getvalue(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn bytes_io_getvalue(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args);
         // TODO
         Ok(vm.get_none())
     }
     
    -fn bytes_io_init(vm: &mut VirtualMachine, _args: PyFuncArgs) -> PyResult {
    -    // TODO
    -    Ok(vm.get_none())
    +fn io_base_cm_enter(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(instance, None)]);
    +    Ok(instance.clone())
     }
     
    -fn bytes_io_getvalue(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    arg_check!(vm, args);
    -    // TODO
    +fn io_base_cm_exit(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        // The context manager protocol requires these, but we don't use them
    +        required = [
    +            (_instance, None),
    +            (_exception_type, None),
    +            (_exception_value, None),
    +            (_traceback, None)
    +        ]
    +    );
         Ok(vm.get_none())
     }
     
    -fn buffered_io_base_init(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn buffered_io_base_init(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(buffered, None), (raw, None)]);
         vm.ctx.set_attr(&buffered, "raw", raw.clone());
         Ok(vm.get_none())
     }
     
    -fn buffered_reader_read(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn buffered_reader_read(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(buffered, None)]);
         let buff_size = 8 * 1024;
         let buffer = vm.ctx.new_bytearray(vec![0; buff_size]);
    @@ -522,24 +561,22 @@
         //to obtain buff_size many bytes. Exit when less than buff_size many
         //bytes are returned (when the end of the file is reached).
         while length == buff_size {
    -        let raw_read = vm.get_method(raw.clone(), &"readinto".to_string()).unwrap();
    -        vm.invoke(raw_read, PyFuncArgs::new(vec![buffer.clone()], vec![]))
    +        vm.call_method(&raw, "readinto", vec![buffer.clone()])
                 .map_err(|_| vm.new_value_error("IO Error".to_string()))?;
     
             //Copy bytes from the buffer vector into the results vector
    -        if let PyObjectPayload::Bytes { ref mut value } = buffer.borrow_mut().payload {
    -            result.extend(value.iter().cloned());
    +        if let Some(bytes) = buffer.payload::<PyByteArray>() {
    +            result.extend_from_slice(&bytes.value.borrow());
             };
     
    -        let len = vm.get_method(buffer.clone(), &"__len__".to_string());
    -        let py_len = vm.invoke(len.unwrap(), PyFuncArgs::default());
    -        length = objint::get_value(&py_len.unwrap()).to_usize().unwrap();
    +        let py_len = vm.call_method(&buffer, "__len__", PyFuncArgs::default())?;
    +        length = objint::get_value(&py_len).to_usize().unwrap();
         }
     
         Ok(vm.ctx.new_bytes(result))
     }
     
    -fn file_io_init(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn file_io_init(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -565,9 +602,9 @@
         }
     }
     
    -fn file_io_read(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn file_io_read(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(file_io, None)]);
    -    let py_name = file_io.get_attr("name").unwrap();
    +    let py_name = vm.get_attribute(file_io.clone(), "name")?;
         let f = match File::open(objstr::get_value(&py_name)) {
             Ok(v) => Ok(v),
             Err(_) => Err(vm.new_type_error("Error opening file".to_string())),
    @@ -589,7 +626,7 @@
         Ok(vm.ctx.new_bytes(bytes))
     }
     
    -fn file_io_readinto(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn file_io_readinto(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(file_io, None), (obj, None)]);
     
         if !obj.readonly() {
    @@ -599,22 +636,22 @@
         }
     
         //extract length of buffer
    -    let len_method = vm.get_method(obj.clone(), &"__len__".to_string());
    -    let py_length = vm.invoke(len_method.unwrap(), PyFuncArgs::default());
    -    let length = objint::get_value(&py_length.unwrap()).to_u64().unwrap();
    +    let py_length = vm.call_method(obj, "__len__", PyFuncArgs::default())?;
    +    let length = objint::get_value(&py_length).to_u64().unwrap();
     
    -    let file_no = file_io.get_attr("fileno").unwrap();
    +    let file_no = vm.get_attribute(file_io.clone(), "fileno")?;
         let raw_fd = objint::get_value(&file_no).to_i64().unwrap();
     
         //extract unix file descriptor.
         let handle = os::rust_file(raw_fd);
     
         let mut f = handle.take(length);
    -    if let PyObjectPayload::Bytes { ref mut value } = obj.borrow_mut().payload {
    +    if let Some(bytes) = obj.payload::<PyByteArray>() {
             //TODO: Implement for MemoryView
     
    -        value.clear();
    -        match f.read_to_end(&mut *value) {
    +        let mut value_mut = bytes.value.borrow_mut();
    +        value_mut.clear();
    +        match f.read_to_end(&mut value_mut) {
                 Ok(_) => {}
                 Err(_) => return Err(vm.new_value_error("Error reading from Take".to_string())),
             }
    @@ -625,14 +662,14 @@
         Ok(vm.get_none())
     }
     
    -fn file_io_write(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn file_io_write(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
             required = [(file_io, None), (obj, Some(vm.ctx.bytes_type()))]
         );
     
    -    let file_no = file_io.get_attr("fileno").unwrap();
    +    let file_no = vm.get_attribute(file_io.clone(), "fileno")?;
         let raw_fd = objint::get_value(&file_no).to_i64().unwrap();
     
         //unsafe block - creates file handle from the UNIX file descriptor
    @@ -640,9 +677,10 @@
         //to support windows - i.e. raw file_handles
         let mut handle = os::rust_file(raw_fd);
     
    -    match obj.borrow_mut().payload {
    -        PyObjectPayload::Bytes { ref mut value } => {
    -            match handle.write(&value[..]) {
    +    match obj.payload::<PyByteArray>() {
    +        Some(bytes) => {
    +            let value_mut = bytes.value.borrow();
    +            match handle.write(&value_mut[..]) {
                     Ok(len) => {
                         //reset raw fd on the FileIO object
                         let updated = os::raw_file_number(handle);
    @@ -654,11 +692,11 @@
                     Err(_) => Err(vm.new_value_error("Error Writing Bytes to Handle".to_string())),
                 }
             }
    -        _ => Err(vm.new_value_error("Expected Bytes Object".to_string())),
    +        None => Err(vm.new_value_error("Expected Bytes Object".to_string())),
         }
     }
     
    -fn buffered_writer_write(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn buffered_writer_write(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -666,13 +704,12 @@
         );
     
         let raw = vm.ctx.get_attr(&buffered, "raw").unwrap();
    -    let raw_write = vm.get_method(raw.clone(), &"write".to_string()).unwrap();
     
         //This should be replaced with a more appropriate chunking implementation
    -    vm.invoke(raw_write, PyFuncArgs::new(vec![obj.clone()], vec![]))
    +    vm.call_method(&raw, "write", vec![obj.clone()])
     }
     
    -fn text_io_wrapper_init(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn text_io_wrapper_init(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -683,13 +720,12 @@
         Ok(vm.get_none())
     }
     
    -fn text_io_base_read(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn text_io_base_read(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(text_io_base, None)]);
     
         let raw = vm.ctx.get_attr(&text_io_base, "buffer").unwrap();
    -    let read = vm.get_method(raw.clone(), &"read".to_string());
     
    -    if let Ok(bytes) = vm.invoke(read.unwrap(), PyFuncArgs::default()) {
    +    if let Ok(bytes) = vm.call_method(&raw, "read", PyFuncArgs::default()) {
             let value = objbytes::get_value(&bytes).to_vec();
     
             //format bytes into string
    @@ -700,7 +736,7 @@
         }
     }
     
    -pub fn io_open(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +pub fn io_open(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -708,7 +744,7 @@
             optional = [(mode, Some(vm.ctx.str_type()))]
         );
     
    -    let module = mk_module(&vm.ctx);
    +    let module = import::import_module(vm, PathBuf::default(), "io").unwrap();
     
         //mode is optional: 'rt' is the default mode (open from reading text)
         let rust_mode = mode.map_or("rt".to_string(), |m| objstr::get_value(m));
    @@ -745,10 +781,7 @@
     
         //Construct a FileIO (subclass of RawIOBase)
         //This is subsequently consumed by a Buffered Class.
    -    let file_args = PyFuncArgs::new(
    -        vec![file.clone(), vm.ctx.new_str(modes[0].to_string())],
    -        vec![],
    -    );
    +    let file_args = vec![file.clone(), vm.ctx.new_str(modes[0].to_string())];
         let file_io = vm.invoke(file_io_class, file_args)?;
     
         //Create Buffered class to consume FileIO. The type of buffered class depends on
    @@ -756,26 +789,17 @@
         //There are 3 possible classes here, each inheriting from the RawBaseIO
         // creating || writing || appending => BufferedWriter
         let buffered = if rust_mode.contains('w') {
    -        vm.invoke(
    -            buffered_writer_class,
    -            PyFuncArgs::new(vec![file_io.clone()], vec![]),
    -        )
    +        vm.invoke(buffered_writer_class, vec![file_io.clone()])
         // reading => BufferedReader
         } else {
    -        vm.invoke(
    -            buffered_reader_class,
    -            PyFuncArgs::new(vec![file_io.clone()], vec![]),
    -        )
    +        vm.invoke(buffered_reader_class, vec![file_io.clone()])
             //TODO: updating => PyBufferedRandom
         };
     
         if rust_mode.contains('t') {
             //If the mode is text this buffer type is consumed on construction of
             //a TextIOWrapper which is subsequently returned.
    -        vm.invoke(
    -            text_io_wrapper_class,
    -            PyFuncArgs::new(vec![buffered.unwrap()], vec![]),
    -        )
    +        vm.invoke(text_io_wrapper_class, vec![buffered.unwrap()])
         } else {
             // If the mode is binary this Buffered class is returned directly at
             // this point.
    @@ -784,104 +808,74 @@
         }
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let py_mod = ctx.new_module(&"io".to_string(), ctx.new_scope(None));
    -
    -    ctx.set_attr(&py_mod, "open", ctx.new_rustfunc(io_open));
    -
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
         //IOBase the abstract base class of the IO Module
    -    let io_base = ctx.new_class("IOBase", ctx.object());
    -    ctx.set_attr(&py_mod, "IOBase", io_base.clone());
    +    let io_base = py_class!(ctx, "IOBase", ctx.object(), {
    +        "__enter__" => ctx.new_rustfunc(io_base_cm_enter),
    +        "__exit__" => ctx.new_rustfunc(io_base_cm_exit)
    +    });
     
         // IOBase Subclasses
    -    let raw_io_base = ctx.new_class("RawIOBase", ctx.object());
    -    ctx.set_attr(&py_mod, "RawIOBase", raw_io_base.clone());
    -
    -    let buffered_io_base = {
    -        let buffered_io_base = ctx.new_class("BufferedIOBase", io_base.clone());
    -        ctx.set_attr(
    -            &buffered_io_base,
    -            "__init__",
    -            ctx.new_rustfunc(buffered_io_base_init),
    -        );
    -        buffered_io_base
    -    };
    -    ctx.set_attr(&py_mod, "BufferedIOBase", buffered_io_base.clone());
    +    let raw_io_base = py_class!(ctx, "RawIOBase", ctx.object(), {});
    +
    +    let buffered_io_base = py_class!(ctx, "BufferedIOBase", io_base.clone(), {
    +        "__init__" => ctx.new_rustfunc(buffered_io_base_init)
    +    });
     
         //TextIO Base has no public constructor
    -    let text_io_base = {
    -        let text_io_base = ctx.new_class("TextIOBase", io_base.clone());
    -        ctx.set_attr(&text_io_base, "read", ctx.new_rustfunc(text_io_base_read));
    -        text_io_base
    -    };
    -    ctx.set_attr(&py_mod, "TextIOBase", text_io_base.clone());
    +    let text_io_base = py_class!(ctx, "TextIOBase", io_base.clone(), {
    +        "read" => ctx.new_rustfunc(text_io_base_read)
    +    });
     
         // RawBaseIO Subclasses
    -    let file_io = {
    -        let file_io = ctx.new_class("FileIO", raw_io_base.clone());
    -        ctx.set_attr(&file_io, "__init__", ctx.new_rustfunc(file_io_init));
    -        ctx.set_attr(&file_io, "name", ctx.str_type());
    -        ctx.set_attr(&file_io, "read", ctx.new_rustfunc(file_io_read));
    -        ctx.set_attr(&file_io, "readinto", ctx.new_rustfunc(file_io_readinto));
    -        ctx.set_attr(&file_io, "write", ctx.new_rustfunc(file_io_write));
    -        file_io
    -    };
    -    ctx.set_attr(&py_mod, "FileIO", file_io.clone());
    +    let file_io = py_class!(ctx, "FileIO", raw_io_base.clone(), {
    +        "__init__" => ctx.new_rustfunc(file_io_init),
    +        "name" => ctx.str_type(),
    +        "read" => ctx.new_rustfunc(file_io_read),
    +        "readinto" => ctx.new_rustfunc(file_io_readinto),
    +        "write" => ctx.new_rustfunc(file_io_write)
    +    });
     
         // BufferedIOBase Subclasses
    -    let buffered_reader = {
    -        let buffered_reader = ctx.new_class("BufferedReader", buffered_io_base.clone());
    -        ctx.set_attr(
    -            &buffered_reader,
    -            "read",
    -            ctx.new_rustfunc(buffered_reader_read),
    -        );
    -        buffered_reader
    -    };
    -    ctx.set_attr(&py_mod, "BufferedReader", buffered_reader.clone());
    -
    -    let buffered_writer = {
    -        let buffered_writer = ctx.new_class("BufferedWriter", buffered_io_base.clone());
    -        ctx.set_attr(
    -            &buffered_writer,
    -            "write",
    -            ctx.new_rustfunc(buffered_writer_write),
    -        );
    -        buffered_writer
    -    };
    -    ctx.set_attr(&py_mod, "BufferedWriter", buffered_writer.clone());
    +    let buffered_reader = py_class!(ctx, "BufferedReader", buffered_io_base.clone(), {
    +        "read" => ctx.new_rustfunc(buffered_reader_read)
    +    });
    +
    +    let buffered_writer = py_class!(ctx, "BufferedWriter", buffered_io_base.clone(), {
    +        "write" => ctx.new_rustfunc(buffered_writer_write)
    +    });
     
         //TextIOBase Subclass
    -    let text_io_wrapper = {
    -        let text_io_wrapper = ctx.new_class("TextIOWrapper", text_io_base.clone());
    -        ctx.set_attr(
    -            &text_io_wrapper,
    -            "__init__",
    -            ctx.new_rustfunc(text_io_wrapper_init),
    -        );
    -        text_io_wrapper
    -    };
    -    ctx.set_attr(&py_mod, "TextIOWrapper", text_io_wrapper.clone());
    +    let text_io_wrapper = py_class!(ctx, "TextIOWrapper", text_io_base.clone(), {
    +        "__init__" => ctx.new_rustfunc(text_io_wrapper_init)
    +    });
     
         //StringIO: in-memory text
    -    let string_io = {
    -        let string_io = ctx.new_class("StringIO", text_io_base.clone());
    -        ctx.set_attr(&string_io, "__init__", ctx.new_rustfunc(string_io_init));
    -        ctx.set_attr(&string_io, "getvalue", ctx.new_rustfunc(string_io_getvalue));
    -        string_io
    -    };
    -    ctx.set_attr(&py_mod, "StringIO", string_io);
    +    let string_io = py_class!(ctx, "StringIO", text_io_base.clone(), {
    +        "__new__" => ctx.new_rustfunc(string_io_new),
    +        "write" => ctx.new_rustfunc(PyStringIORef::write),
    +        "getvalue" => ctx.new_rustfunc(PyStringIORef::getvalue)
    +    });
     
         //BytesIO: in-memory bytes
    -    let bytes_io = {
    -        let bytes_io = ctx.new_class("BytesIO", buffered_io_base.clone());
    -        ctx.set_attr(&bytes_io, "__init__", ctx.new_rustfunc(bytes_io_init));
    -        ctx.set_attr(&bytes_io, "getvalue", ctx.new_rustfunc(bytes_io_getvalue));
    -        bytes_io
    -    };
    -    ctx.set_attr(&py_mod, "BytesIO", bytes_io);
    -
    -    py_mod
    +    let bytes_io = py_class!(ctx, "BytesIO", buffered_io_base.clone(), {
    +        "__init__" => ctx.new_rustfunc(bytes_io_init),
    +        "getvalue" => ctx.new_rustfunc(bytes_io_getvalue)
    +    });
    +
    +    py_module!(ctx, "io", {
    +        "open" => ctx.new_rustfunc(io_open),
    +        "IOBase" => io_base.clone(),
    +        "RawIOBase" => raw_io_base.clone(),
    +        "BufferedIOBase" => buffered_io_base.clone(),
    +        "TextIOBase" => text_io_base.clone(),
    +        "FileIO" => file_io.clone(),
    +        "BufferedReader" => buffered_reader.clone(),
    +        "BufferedWriter" => buffered_writer.clone(),
    +        "TextIOWrapper" => text_io_wrapper.clone(),
    +        "StringIO" => string_io,
    +        "BytesIO" => bytes_io,
    +    })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/json.rs.html b/src/rustpython_vm/stdlib/json.rs.html index 0a5e176..5226f65 100644 --- a/src/rustpython_vm/stdlib/json.rs.html +++ b/src/rustpython_vm/stdlib/json.rs.html @@ -1,4 +1,4 @@ -json.rs.html -- source
      1
    +json.rs.html -- source
      1
       2
       3
       4
    @@ -241,6 +241,8 @@
     241
     242
     243
    +244
    +245
     
     use std::fmt;
     
    @@ -249,10 +251,14 @@
     use serde::ser::{SerializeMap, SerializeSeq};
     use serde_json;
     
    -use crate::obj::{objbool, objdict, objfloat, objint, objsequence, objstr, objtype};
    +use crate::function::PyFuncArgs;
    +use crate::obj::{
    +    objbool, objdict, objfloat, objint, objsequence,
    +    objstr::{self, PyString},
    +    objtype,
    +};
     use crate::pyobject::{
    -    create_type, DictProtocol, PyContext, PyFuncArgs, PyObjectPayload, PyObjectRef, PyResult,
    -    TypeProtocol,
    +    create_type, DictProtocol, IdProtocol, PyContext, PyObjectRef, PyResult, TypeProtocol,
     };
     use crate::VirtualMachine;
     use num_traits::cast::ToPrimitive;
    @@ -309,7 +315,7 @@
                     map.serialize_entry(&key, &self.clone_with_object(&e.1))?;
                 }
                 map.end()
    -        } else if let PyObjectPayload::None = self.pyobject.borrow().payload {
    +        } else if self.pyobject.is(&self.vm.get_none()) {
                 serializer.serialize_none()
             } else {
                 Err(serde::ser::Error::custom(format!(
    @@ -411,11 +417,11 @@
             // than wrapping the given object up and then unwrapping it to determine whether or
             // not it is a string
             while let Some((key_obj, value)) = access.next_entry_seed(self.clone(), self.clone())? {
    -            let key = match key_obj.borrow().payload {
    -                PyObjectPayload::String { ref value } => value.clone(),
    +            let key: String = match key_obj.payload::<PyString>() {
    +                Some(PyString { ref value }) => value.clone(),
                     _ => unimplemented!("map keys must be strings"),
                 };
    -            self.vm.ctx.set_item(&dict, &key, value);
    +            dict.set_item(&self.vm.ctx, &key, value);
             }
             Ok(dict)
         }
    @@ -428,62 +434,60 @@
         }
     }
     
    +pub fn ser_pyobject(vm: &VirtualMachine, obj: &PyObjectRef) -> PyResult<String> {
    +    let serializer = PyObjectSerializer { pyobject: obj, vm };
    +    serde_json::to_string(&serializer).map_err(|err| vm.new_type_error(err.to_string()))
    +}
    +
    +pub fn de_pyobject(vm: &VirtualMachine, s: &str) -> PyResult {
    +    let de = PyObjectDeserializer { vm };
    +    // TODO: Support deserializing string sub-classes
    +    de.deserialize(&mut serde_json::Deserializer::from_str(s))
    +        .map_err(|err| {
    +            let json_decode_error = vm
    +                .sys_module
    +                .get_item("modules")
    +                .unwrap()
    +                .get_item("json")
    +                .unwrap()
    +                .get_item("JSONDecodeError")
    +                .unwrap();
    +            let exc = vm.new_exception(json_decode_error, format!("{}", err));
    +            vm.ctx.set_attr(&exc, "lineno", vm.ctx.new_int(err.line()));
    +            vm.ctx.set_attr(&exc, "colno", vm.ctx.new_int(err.column()));
    +            exc
    +        })
    +}
    +
     /// Implement json.dumps
    -fn json_dumps(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn json_dumps(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         // TODO: Implement non-trivial serialisation case
         arg_check!(vm, args, required = [(obj, None)]);
    -    let res = {
    -        let serializer = PyObjectSerializer { pyobject: obj, vm };
    -        serde_json::to_string(&serializer)
    -    };
    -    let string = res.map_err(|err| vm.new_type_error(format!("{}", err)))?;
    +    let string = ser_pyobject(vm, obj)?;
         Ok(vm.context().new_str(string))
     }
     
     /// Implement json.loads
    -fn json_loads(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn json_loads(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         // TODO: Implement non-trivial deserialization case
         arg_check!(vm, args, required = [(string, Some(vm.ctx.str_type()))]);
    -    let res = {
    -        let de = PyObjectDeserializer { vm };
    -        // TODO: Support deserializing string sub-classes
    -        de.deserialize(&mut serde_json::Deserializer::from_str(&objstr::get_value(
    -            &string,
    -        )))
    -    };
     
    -    res.map_err(|err| {
    -        let json_decode_error = vm
    -            .sys_module
    -            .get_item("modules")
    -            .unwrap()
    -            .get_item("json")
    -            .unwrap()
    -            .get_item("JSONDecodeError")
    -            .unwrap();
    -        let exc = vm.new_exception(json_decode_error, format!("{}", err));
    -        vm.ctx.set_attr(&exc, "lineno", vm.ctx.new_int(err.line()));
    -        vm.ctx.set_attr(&exc, "colno", vm.ctx.new_int(err.column()));
    -        exc
    -    })
    +    de_pyobject(vm, &objstr::get_value(&string))
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let json_mod = ctx.new_module("json", ctx.new_scope(None));
    -
    -    ctx.set_attr(&json_mod, "dumps", ctx.new_rustfunc(json_dumps));
    -    ctx.set_attr(&json_mod, "loads", ctx.new_rustfunc(json_loads));
    -
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
         // TODO: Make this a proper type with a constructor
         let json_decode_error = create_type(
             "JSONDecodeError",
             &ctx.type_type,
             &ctx.exceptions.exception_type,
    -        &ctx.dict_type,
         );
    -    ctx.set_attr(&json_mod, "JSONDecodeError", json_decode_error);
     
    -    json_mod
    +    py_module!(ctx, "json", {
    +        "dumps" => ctx.new_rustfunc(json_dumps),
    +        "loads" => ctx.new_rustfunc(json_loads),
    +        "JSONDecodeError" => json_decode_error
    +    })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/keyword.rs.html b/src/rustpython_vm/stdlib/keyword.rs.html index dad4ac9..97cb785 100644 --- a/src/rustpython_vm/stdlib/keyword.rs.html +++ b/src/rustpython_vm/stdlib/keyword.rs.html @@ -1,4 +1,4 @@ -keyword.rs.html -- source
     1
    +keyword.rs.html -- source
     1
      2
      3
      4
    @@ -31,19 +31,19 @@
     31
     32
     33
    -34
     
     /*
      * Testing if a string is a keyword.
      */
     
    -extern crate rustpython_parser;
    -use self::rustpython_parser::lexer;
    +use rustpython_parser::lexer;
    +
    +use crate::function::PyFuncArgs;
     use crate::obj::objstr;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    -use crate::VirtualMachine;
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
    +use crate::vm::VirtualMachine;
     
    -fn keyword_iskeyword(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn keyword_iskeyword(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(s, Some(vm.ctx.str_type()))]);
         let s = objstr::get_value(s);
         let keywords = lexer::get_keywords();
    @@ -52,20 +52,18 @@
         Ok(value)
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let py_mod = ctx.new_module("keyword", ctx.new_scope(None));
    -
    -    ctx.set_attr(&py_mod, "iskeyword", ctx.new_rustfunc(keyword_iskeyword));
    -
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
         let keyword_kwlist = ctx.new_list(
             lexer::get_keywords()
                 .keys()
                 .map(|k| ctx.new_str(k.to_string()))
                 .collect(),
         );
    -    ctx.set_attr(&py_mod, "kwlist", keyword_kwlist);
     
    -    py_mod
    +    py_module!(ctx, "keyword", {
    +        "iskeyword" => ctx.new_rustfunc(keyword_iskeyword),
    +        "kwlist" => keyword_kwlist
    +    })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/math.rs.html b/src/rustpython_vm/stdlib/math.rs.html index 7c50611..afc8b5e 100644 --- a/src/rustpython_vm/stdlib/math.rs.html +++ b/src/rustpython_vm/stdlib/math.rs.html @@ -1,4 +1,4 @@ -math.rs.html -- source
      1
    +math.rs.html -- source
      1
       2
       3
       4
    @@ -224,23 +224,25 @@
     224
     225
     226
    +227
     
     /* Math builtin module
      *
      *
      */
     
    -use crate::obj::objfloat;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    -use crate::VirtualMachine;
     use statrs::function::erf::{erf, erfc};
     use statrs::function::gamma::{gamma, ln_gamma};
    -use std;
    +
    +use crate::function::PyFuncArgs;
    +use crate::obj::objfloat;
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
    +use crate::vm::VirtualMachine;
     
     // Helper macro:
     macro_rules! make_math_func {
         ( $fname:ident, $fun:ident ) => {
    -        fn $fname(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +        fn $fname(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
                 arg_check!(vm, args, required = [(value, None)]);
                 let value = objfloat::make_float(vm, value)?;
                 let value = value.$fun();
    @@ -253,19 +255,19 @@
     // Number theory functions:
     make_math_func!(math_fabs, abs);
     
    -fn math_isfinite(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_isfinite(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(value, None)]);
         let value = objfloat::make_float(vm, value)?.is_finite();
         Ok(vm.ctx.new_bool(value))
     }
     
    -fn math_isinf(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_isinf(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(value, None)]);
         let value = objfloat::make_float(vm, value)?.is_infinite();
         Ok(vm.ctx.new_bool(value))
     }
     
    -fn math_isnan(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_isnan(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(value, None)]);
         let value = objfloat::make_float(vm, value)?.is_nan();
         Ok(vm.ctx.new_bool(value))
    @@ -275,7 +277,7 @@
     make_math_func!(math_exp, exp);
     make_math_func!(math_expm1, exp_m1);
     
    -fn math_log(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_log(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(x, None)], optional = [(base, None)]);
         let x = objfloat::make_float(vm, x)?;
         match base {
    @@ -287,7 +289,7 @@
         }
     }
     
    -fn math_log1p(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_log1p(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(x, None)]);
         let x = objfloat::make_float(vm, x)?;
         Ok(vm.ctx.new_float((x + 1.0).ln()))
    @@ -296,7 +298,7 @@
     make_math_func!(math_log2, log2);
     make_math_func!(math_log10, log10);
     
    -fn math_pow(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_pow(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(x, None), (y, None)]);
         let x = objfloat::make_float(vm, x)?;
         let y = objfloat::make_float(vm, y)?;
    @@ -310,7 +312,7 @@
     make_math_func!(math_asin, asin);
     make_math_func!(math_atan, atan);
     
    -fn math_atan2(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_atan2(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(y, None), (x, None)]);
         let y = objfloat::make_float(vm, y)?;
         let x = objfloat::make_float(vm, x)?;
    @@ -319,7 +321,7 @@
     
     make_math_func!(math_cos, cos);
     
    -fn math_hypot(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_hypot(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(x, None), (y, None)]);
         let x = objfloat::make_float(vm, x)?;
         let y = objfloat::make_float(vm, y)?;
    @@ -329,13 +331,13 @@
     make_math_func!(math_sin, sin);
     make_math_func!(math_tan, tan);
     
    -fn math_degrees(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_degrees(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(value, None)]);
         let x = objfloat::make_float(vm, value)?;
         Ok(vm.ctx.new_float(x * (180.0 / std::f64::consts::PI)))
     }
     
    -fn math_radians(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_radians(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(value, None)]);
         let x = objfloat::make_float(vm, value)?;
         Ok(vm.ctx.new_float(x * (std::f64::consts::PI / 180.0)))
    @@ -350,7 +352,7 @@
     make_math_func!(math_tanh, tanh);
     
     // Special functions:
    -fn math_erf(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_erf(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(value, None)]);
         let x = objfloat::make_float(vm, value)?;
     
    @@ -361,7 +363,7 @@
         }
     }
     
    -fn math_erfc(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_erfc(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(value, None)]);
         let x = objfloat::make_float(vm, value)?;
     
    @@ -372,7 +374,7 @@
         }
     }
     
    -fn math_gamma(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_gamma(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(value, None)]);
         let x = objfloat::make_float(vm, value)?;
     
    @@ -385,7 +387,7 @@
         }
     }
     
    -fn math_lgamma(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn math_lgamma(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(value, None)]);
         let x = objfloat::make_float(vm, value)?;
     
    @@ -398,7 +400,7 @@
         }
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
         py_module!(ctx, "math", {
             // Number theory functions:
             "fabs" => ctx.new_rustfunc(math_fabs),
    @@ -452,4 +454,4 @@
         })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/mod.rs.html b/src/rustpython_vm/stdlib/mod.rs.html index bf23212..f72a76f 100644 --- a/src/rustpython_vm/stdlib/mod.rs.html +++ b/src/rustpython_vm/stdlib/mod.rs.html @@ -1,4 +1,4 @@ -mod.rs.html -- source
     1
    +mod.rs.html -- source
     1
      2
      3
      4
    @@ -50,15 +50,21 @@
     50
     51
     52
    +53
    +54
    +55
    +56
     
     mod ast;
     mod dis;
    -mod json;
    +pub(crate) mod json;
     mod keyword;
     mod math;
    +mod platform;
     mod pystruct;
     mod random;
     mod re;
    +pub mod socket;
     mod string;
     mod time_module;
     mod tokenize;
    @@ -73,35 +79,37 @@
     
     use crate::pyobject::{PyContext, PyObjectRef};
     
    -pub type StdlibInitFunc = fn(&PyContext) -> PyObjectRef;
    +pub type StdlibInitFunc = Box<dyn Fn(&PyContext) -> PyObjectRef>;
     
     pub fn get_module_inits() -> HashMap<String, StdlibInitFunc> {
         let mut modules = HashMap::new();
    -    modules.insert("ast".to_string(), ast::mk_module as StdlibInitFunc);
    -    modules.insert("dis".to_string(), dis::mk_module as StdlibInitFunc);
    -    modules.insert("json".to_string(), json::mk_module as StdlibInitFunc);
    -    modules.insert("keyword".to_string(), keyword::mk_module as StdlibInitFunc);
    -    modules.insert("math".to_string(), math::mk_module as StdlibInitFunc);
    -    modules.insert("re".to_string(), re::mk_module as StdlibInitFunc);
    -    modules.insert("random".to_string(), random::mk_module as StdlibInitFunc);
    -    modules.insert("string".to_string(), string::mk_module as StdlibInitFunc);
    -    modules.insert("struct".to_string(), pystruct::mk_module as StdlibInitFunc);
    -    modules.insert("time".to_string(), time_module::mk_module as StdlibInitFunc);
         modules.insert(
    -        "tokenize".to_string(),
    -        tokenize::mk_module as StdlibInitFunc,
    +        "ast".to_string(),
    +        Box::new(ast::make_module) as StdlibInitFunc,
         );
    -    modules.insert("types".to_string(), types::mk_module as StdlibInitFunc);
    -    modules.insert("_weakref".to_string(), weakref::mk_module as StdlibInitFunc);
    +    modules.insert("dis".to_string(), Box::new(dis::make_module));
    +    modules.insert("json".to_string(), Box::new(json::make_module));
    +    modules.insert("keyword".to_string(), Box::new(keyword::make_module));
    +    modules.insert("math".to_string(), Box::new(math::make_module));
    +    modules.insert("platform".to_string(), Box::new(platform::make_module));
    +    modules.insert("re".to_string(), Box::new(re::make_module));
    +    modules.insert("random".to_string(), Box::new(random::make_module));
    +    modules.insert("string".to_string(), Box::new(string::make_module));
    +    modules.insert("struct".to_string(), Box::new(pystruct::make_module));
    +    modules.insert("time".to_string(), Box::new(time_module::make_module));
    +    modules.insert("tokenize".to_string(), Box::new(tokenize::make_module));
    +    modules.insert("types".to_string(), Box::new(types::make_module));
    +    modules.insert("_weakref".to_string(), Box::new(weakref::make_module));
     
         // disable some modules on WASM
         #[cfg(not(target_arch = "wasm32"))]
         {
    -        modules.insert("io".to_string(), io::mk_module as StdlibInitFunc);
    -        modules.insert("os".to_string(), os::mk_module as StdlibInitFunc);
    +        modules.insert("io".to_string(), Box::new(io::make_module));
    +        modules.insert("os".to_string(), Box::new(os::make_module));
    +        modules.insert("socket".to_string(), Box::new(socket::make_module));
         }
     
         modules
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/os.rs.html b/src/rustpython_vm/stdlib/os.rs.html index 23dd049..2348131 100644 --- a/src/rustpython_vm/stdlib/os.rs.html +++ b/src/rustpython_vm/stdlib/os.rs.html @@ -1,4 +1,4 @@ -os.rs.html -- source
      1
    +os.rs.html -- source
      1
       2
       3
       4
    @@ -135,27 +135,17 @@
     135
     136
     137
    -138
    -139
    -140
    -141
    -142
     
    -//library imports
     use std::fs::File;
     use std::fs::OpenOptions;
     use std::io::ErrorKind;
    -// use std::env;
     
    -//3rd party imports
     use num_traits::cast::ToPrimitive;
     
    -//custom imports
    +use crate::function::PyFuncArgs;
     use crate::obj::objint;
     use crate::obj::objstr;
    -// use crate::obj::objdict;
    -
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
     use crate::vm::VirtualMachine;
     
     #[cfg(unix)]
    @@ -198,7 +188,7 @@
         unimplemented!();
     }
     
    -pub fn os_close(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +pub fn os_close(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(fileno, Some(vm.ctx.int_type()))]);
     
         let raw_fileno = objint::get_value(&fileno);
    @@ -211,7 +201,7 @@
         Ok(vm.get_none())
     }
     
    -pub fn os_open(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +pub fn os_open(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -244,7 +234,7 @@
         Ok(vm.ctx.new_int(raw_file_number(handle)))
     }
     
    -fn os_error(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn os_error(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -261,18 +251,18 @@
         Err(vm.new_os_error(msg))
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let py_mod = ctx.new_module(&"os".to_string(), ctx.new_scope(None));
    -    ctx.set_attr(&py_mod, "open", ctx.new_rustfunc(os_open));
    -    ctx.set_attr(&py_mod, "close", ctx.new_rustfunc(os_close));
    -    ctx.set_attr(&py_mod, "error", ctx.new_rustfunc(os_error));
    -
    -    ctx.set_attr(&py_mod, "O_RDONLY", ctx.new_int(0));
    -    ctx.set_attr(&py_mod, "O_WRONLY", ctx.new_int(1));
    -    ctx.set_attr(&py_mod, "O_RDWR", ctx.new_int(2));
    -    ctx.set_attr(&py_mod, "O_NONBLOCK", ctx.new_int(4));
    -    ctx.set_attr(&py_mod, "O_APPEND", ctx.new_int(8));
    -    ctx.set_attr(&py_mod, "O_CREAT", ctx.new_int(512));
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    let py_mod = py_module!(ctx, "os", {
    +        "open" => ctx.new_rustfunc(os_open),
    +        "close" => ctx.new_rustfunc(os_close),
    +        "error" => ctx.new_rustfunc(os_error),
    +        "O_RDONLY" => ctx.new_int(0),
    +        "O_WRONLY" => ctx.new_int(1),
    +        "O_RDWR" => ctx.new_int(2),
    +        "O_NONBLOCK" => ctx.new_int(4),
    +        "O_APPEND" => ctx.new_int(8),
    +        "O_CREAT" => ctx.new_int(512)
    +    });
     
         if cfg!(windows) {
             ctx.set_attr(&py_mod, "name", ctx.new_str("nt".to_string()));
    @@ -284,4 +274,4 @@
         py_mod
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/platform.rs.html b/src/rustpython_vm/stdlib/platform.rs.html new file mode 100644 index 0000000..2bc5e3d --- /dev/null +++ b/src/rustpython_vm/stdlib/platform.rs.html @@ -0,0 +1,59 @@ +platform.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +
    +use crate::function::PyFuncArgs;
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult};
    +use crate::vm::VirtualMachine;
    +
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    py_module!(ctx, "platform", {
    +        "python_compiler" => ctx.new_rustfunc(platform_python_compiler),
    +        "python_implementation" => ctx.new_rustfunc(platform_python_implementation),
    +        "python_version" => ctx.new_rustfunc(platform_python_version),
    +    })
    +}
    +
    +fn platform_python_implementation(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args);
    +    Ok(vm.new_str("RustPython".to_string()))
    +}
    +
    +fn platform_python_version(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args);
    +    // TODO: fetch version from somewhere.
    +    Ok(vm.new_str("4.0.0".to_string()))
    +}
    +
    +fn platform_python_compiler(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args);
    +    let version = rustc_version_runtime::version_meta();
    +    Ok(vm.new_str(format!("rustc {}", version.semver)))
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/pystruct.rs.html b/src/rustpython_vm/stdlib/pystruct.rs.html index e1ea585..6abdd72 100644 --- a/src/rustpython_vm/stdlib/pystruct.rs.html +++ b/src/rustpython_vm/stdlib/pystruct.rs.html @@ -1,4 +1,4 @@ -pystruct.rs.html -- source
      1
    +pystruct.rs.html -- source
      1
       2
       3
       4
    @@ -303,51 +303,6 @@
     303
     304
     305
    -306
    -307
    -308
    -309
    -310
    -311
    -312
    -313
    -314
    -315
    -316
    -317
    -318
    -319
    -320
    -321
    -322
    -323
    -324
    -325
    -326
    -327
    -328
    -329
    -330
    -331
    -332
    -333
    -334
    -335
    -336
    -337
    -338
    -339
    -340
    -341
    -342
    -343
    -344
    -345
    -346
    -347
    -348
    -349
    -350
     
     /*
      * Python struct module.
    @@ -358,15 +313,16 @@
      * https://docs.rs/byteorder/1.2.6/byteorder/
      */
     
    -extern crate byteorder;
    -use self::byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
    +use std::io::{Cursor, Read, Write};
     
    -use crate::obj::{objbool, objbytes, objfloat, objint, objstr, objtype};
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    -use crate::VirtualMachine;
    +use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
     use num_bigint::BigInt;
     use num_traits::ToPrimitive;
    -use std::io::{Cursor, Read, Write};
    +
    +use crate::function::PyFuncArgs;
    +use crate::obj::{objbool, objbytes, objfloat, objint, objstr, objtype};
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
    +use crate::VirtualMachine;
     
     #[derive(Debug)]
     struct FormatCode {
    @@ -393,35 +349,23 @@
         codes
     }
     
    -fn get_int(vm: &mut VirtualMachine, arg: &PyObjectRef) -> Result<BigInt, PyObjectRef> {
    +fn get_int(vm: &VirtualMachine, arg: &PyObjectRef) -> PyResult<BigInt> {
         objint::to_int(vm, arg, 10)
     }
     
    -fn pack_i8(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_i8(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         let v = get_int(vm, arg)?.to_i8().unwrap();
         data.write_i8(v).unwrap();
         Ok(())
     }
     
    -fn pack_u8(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_u8(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         let v = get_int(vm, arg)?.to_u8().unwrap();
         data.write_u8(v).unwrap();
         Ok(())
     }
     
    -fn pack_bool(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_bool(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         if objtype::isinstance(&arg, &vm.ctx.bool_type()) {
             let v = if objbool::get_value(arg) { 1 } else { 0 };
             data.write_u8(v).unwrap();
    @@ -431,71 +375,43 @@
         }
     }
     
    -fn pack_i16(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_i16(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         let v = get_int(vm, arg)?.to_i16().unwrap();
         data.write_i16::<LittleEndian>(v).unwrap();
         Ok(())
     }
     
    -fn pack_u16(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_u16(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         let v = get_int(vm, arg)?.to_u16().unwrap();
         data.write_u16::<LittleEndian>(v).unwrap();
         Ok(())
     }
     
    -fn pack_i32(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_i32(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         let v = get_int(vm, arg)?.to_i32().unwrap();
         data.write_i32::<LittleEndian>(v).unwrap();
         Ok(())
     }
     
    -fn pack_u32(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_u32(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         let v = get_int(vm, arg)?.to_u32().unwrap();
         data.write_u32::<LittleEndian>(v).unwrap();
         Ok(())
     }
     
    -fn pack_i64(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_i64(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         let v = get_int(vm, arg)?.to_i64().unwrap();
         data.write_i64::<LittleEndian>(v).unwrap();
         Ok(())
     }
     
    -fn pack_u64(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_u64(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         let v = get_int(vm, arg)?.to_u64().unwrap();
         data.write_u64::<LittleEndian>(v).unwrap();
         Ok(())
     }
     
    -fn pack_f32(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_f32(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         if objtype::isinstance(&arg, &vm.ctx.float_type()) {
             let v = objfloat::get_value(arg) as f32;
             data.write_f32::<LittleEndian>(v).unwrap();
    @@ -505,11 +421,7 @@
         }
     }
     
    -fn pack_f64(
    -    vm: &mut VirtualMachine,
    -    arg: &PyObjectRef,
    -    data: &mut Write,
    -) -> Result<(), PyObjectRef> {
    +fn pack_f64(vm: &VirtualMachine, arg: &PyObjectRef, data: &mut Write) -> PyResult<()> {
         if objtype::isinstance(&arg, &vm.ctx.float_type()) {
             let v = objfloat::get_value(arg) as f64;
             data.write_f64::<LittleEndian>(v).unwrap();
    @@ -519,7 +431,7 @@
         }
     }
     
    -fn struct_pack(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn struct_pack(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         if args.args.is_empty() {
             Err(vm.new_type_error(format!(
                 "Expected at least 1 argument (got: {})",
    @@ -572,84 +484,84 @@
         }
     }
     
    -fn unpack_i8(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_i8(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_i8() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_int(v)),
         }
     }
     
    -fn unpack_u8(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_u8(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_u8() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_int(v)),
         }
     }
     
    -fn unpack_bool(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_bool(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_u8() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_bool(v > 0)),
         }
     }
     
    -fn unpack_i16(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_i16(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_i16::<LittleEndian>() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_int(v)),
         }
     }
     
    -fn unpack_u16(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_u16(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_u16::<LittleEndian>() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_int(v)),
         }
     }
     
    -fn unpack_i32(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_i32(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_i32::<LittleEndian>() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_int(v)),
         }
     }
     
    -fn unpack_u32(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_u32(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_u32::<LittleEndian>() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_int(v)),
         }
     }
     
    -fn unpack_i64(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_i64(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_i64::<LittleEndian>() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_int(v)),
         }
     }
     
    -fn unpack_u64(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_u64(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_u64::<LittleEndian>() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_int(v)),
         }
     }
     
    -fn unpack_f32(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_f32(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_f32::<LittleEndian>() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_float(f64::from(v))),
         }
     }
     
    -fn unpack_f64(vm: &mut VirtualMachine, rdr: &mut Read) -> PyResult {
    +fn unpack_f64(vm: &VirtualMachine, rdr: &mut Read) -> PyResult {
         match rdr.read_f64::<LittleEndian>() {
             Err(err) => panic!("Error in reading {:?}", err),
             Ok(v) => Ok(vm.ctx.new_float(v)),
         }
     }
     
    -fn struct_unpack(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn struct_unpack(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -691,13 +603,11 @@
         Ok(vm.ctx.new_tuple(items))
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let py_mod = ctx.new_module(&"struct".to_string(), ctx.new_scope(None));
    -
    -    ctx.set_attr(&py_mod, "pack", ctx.new_rustfunc(struct_pack));
    -    ctx.set_attr(&py_mod, "unpack", ctx.new_rustfunc(struct_unpack));
    -
    -    py_mod
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    py_module!(ctx, "struct", {
    +        "pack" => ctx.new_rustfunc(struct_pack),
    +        "unpack" => ctx.new_rustfunc(struct_unpack)
    +    })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/random.rs.html b/src/rustpython_vm/stdlib/random.rs.html index 2eb94f4..9c99fb4 100644 --- a/src/rustpython_vm/stdlib/random.rs.html +++ b/src/rustpython_vm/stdlib/random.rs.html @@ -1,4 +1,4 @@ -random.rs.html -- source
     1
    +random.rs.html -- source
     1
      2
      3
      4
    @@ -60,14 +60,14 @@
     
     //! Random module.
     
    -extern crate rand;
    +use rand::distributions::{Distribution, Normal};
     
    +use crate::function::PyFuncArgs;
     use crate::obj::objfloat;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    -use crate::stdlib::random::rand::distributions::{Distribution, Normal};
    -use crate::VirtualMachine;
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
    +use crate::vm::VirtualMachine;
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
         py_module!(ctx, "random", {
             "guass" => ctx.new_rustfunc(random_gauss),
             "normalvariate" => ctx.new_rustfunc(random_normalvariate),
    @@ -76,12 +76,12 @@
         })
     }
     
    -fn random_gauss(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn random_gauss(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         // TODO: is this the same?
         random_normalvariate(vm, args)
     }
     
    -fn random_normalvariate(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn random_normalvariate(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -98,7 +98,7 @@
         Ok(py_value)
     }
     
    -fn random_random(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn random_random(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args);
         let value = rand::random::<f64>();
         let py_value = vm.ctx.new_float(value);
    @@ -107,7 +107,7 @@
     
     /*
      * TODO: enable this function:
    -fn random_weibullvariate(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn random_weibullvariate(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(alpha, Some(vm.ctx.float_type())), (beta, Some(vm.ctx.float_type()))]);
         let alpha = objfloat::get_value(alpha);
         let beta = objfloat::get_value(beta);
    @@ -118,4 +118,4 @@
     }
     */
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/re.rs.html b/src/rustpython_vm/stdlib/re.rs.html index 62ffb02..57f1977 100644 --- a/src/rustpython_vm/stdlib/re.rs.html +++ b/src/rustpython_vm/stdlib/re.rs.html @@ -1,65 +1,212 @@ -re.rs.html -- source
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    +re.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    +175
    +176
    +177
    +178
    +179
    +180
    +181
    +182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
     
     /*
      * Regular expressions.
    @@ -68,20 +215,47 @@
      * system.
      */
     
    -extern crate regex;
    -use self::regex::Regex;
    +use std::path::PathBuf;
     
    +use regex::{Match, Regex};
    +
    +use crate::function::PyFuncArgs;
    +use crate::import;
     use crate::obj::objstr;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    -use crate::VirtualMachine;
    +use crate::pyobject::{PyContext, PyObject, PyObjectRef, PyResult, PyValue, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
    +impl PyValue for Regex {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.class("re", "Pattern")
    +    }
    +}
     
    -fn re_match(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    // TODO:
    -    error!("TODO: implement match");
    -    re_search(vm, args)
    +/// Create the python `re` module with all its members.
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    let match_type = py_class!(ctx, "Match", ctx.object(), {
    +        "start" => ctx.new_rustfunc(match_start),
    +        "end" => ctx.new_rustfunc(match_end)
    +    });
    +
    +    let pattern_type = py_class!(ctx, "Pattern", ctx.object(), {
    +        "match" => ctx.new_rustfunc(pattern_match),
    +        "search" => ctx.new_rustfunc(pattern_search)
    +    });
    +
    +    py_module!(ctx, "re", {
    +        "compile" => ctx.new_rustfunc(re_compile),
    +        "Match" => match_type,
    +        "match" => ctx.new_rustfunc(re_match),
    +        "Pattern" => pattern_type,
    +        "search" => ctx.new_rustfunc(re_search)
    +    })
     }
     
    -fn re_search(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +/// Implement re.match
    +/// See also:
    +/// https://docs.python.org/3/library/re.html#re.match
    +fn re_match(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -90,38 +264,158 @@
                 (string, Some(vm.ctx.str_type()))
             ]
         );
    +    let regex = make_regex(vm, pattern)?;
    +    let search_text = objstr::get_value(string);
    +
    +    do_match(vm, &regex, search_text)
    +}
     
    -    let pattern_str = objstr::get_value(&pattern);
    -    let search_text = objstr::get_value(&string);
    +/// Implement re.search
    +/// See also:
    +/// https://docs.python.org/3/library/re.html#re.search
    +fn re_search(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [
    +            (pattern, Some(vm.ctx.str_type())),
    +            (string, Some(vm.ctx.str_type()))
    +        ]
    +    );
    +
    +    // let pattern_str = objstr::get_value(&pattern);
    +    let regex = make_regex(vm, pattern)?;
    +    let search_text = objstr::get_value(string);
    +
    +    do_search(vm, &regex, search_text)
    +}
    +
    +fn do_match(vm: &VirtualMachine, regex: &Regex, search_text: String) -> PyResult {
    +    // TODO: implement match!
    +    do_search(vm, regex, search_text)
    +}
    +
    +fn do_search(vm: &VirtualMachine, regex: &Regex, search_text: String) -> PyResult {
    +    match regex.find(&search_text) {
    +        None => Ok(vm.get_none()),
    +        Some(result) => create_match(vm, &result),
    +    }
    +}
    +
    +fn make_regex(vm: &VirtualMachine, pattern: &PyObjectRef) -> PyResult<Regex> {
    +    let pattern_str = objstr::get_value(pattern);
     
         match Regex::new(&pattern_str) {
    -        Ok(regex) => {
    -            // Now use regex to search:
    -            match regex.find(&search_text) {
    -                None => Ok(vm.get_none()),
    -                Some(result) => {
    -                    // Return match object:
    -                    // TODO: implement match object
    -                    // TODO: how to refer to match object defined in this
    -                    // module?
    -                    Ok(vm.ctx.new_str(result.as_str().to_string()))
    -                }
    -            }
    -        }
    +        Ok(regex) => Ok(regex),
             Err(err) => Err(vm.new_value_error(format!("Error in regex: {:?}", err))),
         }
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let py_mod = ctx.new_module("re", ctx.new_scope(None));
    +/// Inner data for a match object.
    +#[derive(Debug)]
    +struct PyMatch {
    +    start: usize,
    +    end: usize,
    +}
     
    -    let match_type = ctx.new_class("Match", ctx.object());
    -    ctx.set_attr(&py_mod, "Match", match_type);
    +impl PyValue for PyMatch {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.class("re", "Match")
    +    }
    +}
     
    -    ctx.set_attr(&py_mod, "match", ctx.new_rustfunc(re_match));
    -    ctx.set_attr(&py_mod, "search", ctx.new_rustfunc(re_search));
    +/// Take a found regular expression and convert it to proper match object.
    +fn create_match(vm: &VirtualMachine, match_value: &Match) -> PyResult {
    +    // Return match object:
    +    // TODO: implement match object
    +    // TODO: how to refer to match object defined in this
    +    let module = import::import_module(vm, PathBuf::default(), "re").unwrap();
    +    let match_class = vm.ctx.get_attr(&module, "Match").unwrap();
    +
    +    // let mo = vm.invoke(match_class, PyFuncArgs::default())?;
    +    // let txt = vm.ctx.new_str(result.as_str().to_string());
    +    // vm.ctx.set_attr(&mo, "str", txt);
    +    let match_value = PyMatch {
    +        start: match_value.start(),
    +        end: match_value.end(),
    +    };
    +
    +    Ok(PyObject::new(match_value, match_class.clone()))
    +}
     
    -    py_mod
    +/// Compile a regular expression into a Pattern object.
    +/// See also:
    +/// https://docs.python.org/3/library/re.html#re.compile
    +fn re_compile(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(pattern, Some(vm.ctx.str_type()))] // TODO: flags=0
    +    );
    +
    +    let regex = make_regex(vm, pattern)?;
    +    // TODO: retrieval of this module is akward:
    +    let module = import::import_module(vm, PathBuf::default(), "re").unwrap();
    +    let pattern_class = vm.ctx.get_attr(&module, "Pattern").unwrap();
    +
    +    Ok(PyObject::new(regex, pattern_class.clone()))
    +}
    +
    +fn pattern_match(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(zelf, None), (text, Some(vm.ctx.str_type()))]
    +    );
    +
    +    let regex = get_regex(zelf);
    +    let search_text = objstr::get_value(text);
    +    do_match(vm, &regex, search_text)
    +}
    +
    +fn pattern_search(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(zelf, None), (text, Some(vm.ctx.str_type()))]
    +    );
    +
    +    let regex = get_regex(zelf);
    +    let search_text = objstr::get_value(text);
    +    do_search(vm, &regex, search_text)
    +}
    +
    +/// Returns start of match
    +/// see: https://docs.python.org/3/library/re.html#re.Match.start
    +fn match_start(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(zelf, None)]);
    +    // TODO: implement groups
    +    let m = get_match(zelf);
    +    Ok(vm.new_int(m.start))
    +}
    +
    +fn match_end(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(zelf, None)]);
    +    // TODO: implement groups
    +    let m = get_match(zelf);
    +    Ok(vm.new_int(m.end))
    +}
    +
    +/// Retrieve inner rust regex from python object:
    +fn get_regex(obj: &PyObjectRef) -> &Regex {
    +    // TODO: Regex shouldn't be stored in payload directly, create newtype wrapper
    +    if let Some(regex) = obj.payload::<Regex>() {
    +        return regex;
    +    }
    +    panic!("Inner error getting regex {:?}", obj);
    +}
    +
    +/// Retrieve inner rust match from python object:
    +fn get_match(obj: &PyObjectRef) -> &PyMatch {
    +    if let Some(value) = obj.payload::<PyMatch>() {
    +        return value;
    +    }
    +    panic!("Inner error getting match {:?}", obj);
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/socket.rs.html b/src/rustpython_vm/stdlib/socket.rs.html new file mode 100644 index 0000000..0352608 --- /dev/null +++ b/src/rustpython_vm/stdlib/socket.rs.html @@ -0,0 +1,891 @@ +socket.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    +175
    +176
    +177
    +178
    +179
    +180
    +181
    +182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    +217
    +218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +246
    +247
    +248
    +249
    +250
    +251
    +252
    +253
    +254
    +255
    +256
    +257
    +258
    +259
    +260
    +261
    +262
    +263
    +264
    +265
    +266
    +267
    +268
    +269
    +270
    +271
    +272
    +273
    +274
    +275
    +276
    +277
    +278
    +279
    +280
    +281
    +282
    +283
    +284
    +285
    +286
    +287
    +288
    +289
    +290
    +291
    +292
    +293
    +294
    +295
    +296
    +297
    +298
    +299
    +300
    +301
    +302
    +303
    +304
    +305
    +306
    +307
    +308
    +309
    +310
    +311
    +312
    +313
    +314
    +315
    +316
    +317
    +318
    +319
    +320
    +321
    +322
    +323
    +324
    +325
    +326
    +327
    +328
    +329
    +330
    +331
    +332
    +333
    +334
    +335
    +336
    +337
    +338
    +339
    +340
    +341
    +342
    +343
    +344
    +345
    +346
    +347
    +348
    +349
    +350
    +351
    +352
    +353
    +354
    +355
    +356
    +357
    +358
    +359
    +360
    +361
    +362
    +363
    +364
    +365
    +366
    +367
    +368
    +369
    +370
    +371
    +372
    +373
    +374
    +375
    +376
    +377
    +378
    +379
    +380
    +381
    +382
    +383
    +384
    +385
    +386
    +387
    +388
    +389
    +390
    +391
    +392
    +393
    +394
    +395
    +396
    +397
    +398
    +399
    +400
    +401
    +402
    +403
    +404
    +405
    +406
    +407
    +408
    +409
    +410
    +411
    +412
    +413
    +414
    +415
    +416
    +417
    +418
    +419
    +420
    +421
    +422
    +423
    +424
    +425
    +426
    +427
    +428
    +429
    +430
    +431
    +432
    +433
    +434
    +435
    +436
    +437
    +438
    +439
    +440
    +441
    +442
    +443
    +444
    +
    +use std::cell::RefCell;
    +use std::io;
    +use std::io::Read;
    +use std::io::Write;
    +use std::net::{SocketAddr, TcpListener, TcpStream, ToSocketAddrs, UdpSocket};
    +use std::ops::Deref;
    +
    +use crate::function::PyFuncArgs;
    +use crate::obj::objbytes;
    +use crate::obj::objint;
    +use crate::obj::objsequence::get_elements;
    +use crate::obj::objstr;
    +use crate::pyobject::{PyContext, PyObject, PyObjectRef, PyResult, PyValue, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
    +use num_traits::ToPrimitive;
    +
    +#[derive(Debug, Copy, Clone)]
    +enum AddressFamily {
    +    Unix = 1,
    +    Inet = 2,
    +    Inet6 = 3,
    +}
    +
    +impl AddressFamily {
    +    fn from_i32(vm: &VirtualMachine, value: i32) -> Result<AddressFamily, PyObjectRef> {
    +        match value {
    +            1 => Ok(AddressFamily::Unix),
    +            2 => Ok(AddressFamily::Inet),
    +            3 => Ok(AddressFamily::Inet6),
    +            _ => Err(vm.new_os_error(format!("Unknown address family value: {}", value))),
    +        }
    +    }
    +}
    +
    +#[derive(Debug, Copy, Clone)]
    +enum SocketKind {
    +    Stream = 1,
    +    Dgram = 2,
    +}
    +
    +impl SocketKind {
    +    fn from_i32(vm: &VirtualMachine, value: i32) -> Result<SocketKind, PyObjectRef> {
    +        match value {
    +            1 => Ok(SocketKind::Stream),
    +            2 => Ok(SocketKind::Dgram),
    +            _ => Err(vm.new_os_error(format!("Unknown socket kind value: {}", value))),
    +        }
    +    }
    +}
    +
    +#[derive(Debug)]
    +enum Connection {
    +    TcpListener(TcpListener),
    +    TcpStream(TcpStream),
    +    UdpSocket(UdpSocket),
    +}
    +
    +impl Connection {
    +    fn accept(&mut self) -> io::Result<(TcpStream, SocketAddr)> {
    +        match self {
    +            Connection::TcpListener(con) => con.accept(),
    +            _ => Err(io::Error::new(io::ErrorKind::Other, "oh no!")),
    +        }
    +    }
    +
    +    fn local_addr(&self) -> io::Result<SocketAddr> {
    +        match self {
    +            Connection::TcpListener(con) => con.local_addr(),
    +            Connection::UdpSocket(con) => con.local_addr(),
    +            Connection::TcpStream(con) => con.local_addr(),
    +        }
    +    }
    +
    +    fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
    +        match self {
    +            Connection::UdpSocket(con) => con.recv_from(buf),
    +            _ => Err(io::Error::new(io::ErrorKind::Other, "oh no!")),
    +        }
    +    }
    +
    +    fn send_to<A: ToSocketAddrs>(&self, buf: &[u8], addr: A) -> io::Result<usize> {
    +        match self {
    +            Connection::UdpSocket(con) => con.send_to(buf, addr),
    +            _ => Err(io::Error::new(io::ErrorKind::Other, "oh no!")),
    +        }
    +    }
    +}
    +
    +impl Read for Connection {
    +    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
    +        match self {
    +            Connection::TcpStream(con) => con.read(buf),
    +            Connection::UdpSocket(con) => con.recv(buf),
    +            _ => Err(io::Error::new(io::ErrorKind::Other, "oh no!")),
    +        }
    +    }
    +}
    +
    +impl Write for Connection {
    +    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
    +        match self {
    +            Connection::TcpStream(con) => con.write(buf),
    +            Connection::UdpSocket(con) => con.send(buf),
    +            _ => Err(io::Error::new(io::ErrorKind::Other, "oh no!")),
    +        }
    +    }
    +    fn flush(&mut self) -> io::Result<()> {
    +        Ok(())
    +    }
    +}
    +
    +#[derive(Debug)]
    +pub struct Socket {
    +    address_family: AddressFamily,
    +    socket_kind: SocketKind,
    +    con: RefCell<Option<Connection>>,
    +}
    +
    +impl PyValue for Socket {
    +    fn class(_vm: &VirtualMachine) -> PyObjectRef {
    +        // TODO
    +        unimplemented!()
    +    }
    +}
    +
    +impl Socket {
    +    fn new(address_family: AddressFamily, socket_kind: SocketKind) -> Socket {
    +        Socket {
    +            address_family,
    +            socket_kind,
    +            con: RefCell::new(None),
    +        }
    +    }
    +}
    +
    +fn get_socket<'a>(obj: &'a PyObjectRef) -> impl Deref<Target = Socket> + 'a {
    +    obj.payload::<Socket>().unwrap()
    +}
    +
    +fn socket_new(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [
    +            (cls, None),
    +            (family_int, Some(vm.ctx.int_type())),
    +            (kind_int, Some(vm.ctx.int_type()))
    +        ]
    +    );
    +
    +    let address_family =
    +        AddressFamily::from_i32(vm, objint::get_value(family_int).to_i32().unwrap())?;
    +    let kind = SocketKind::from_i32(vm, objint::get_value(kind_int).to_i32().unwrap())?;
    +
    +    Ok(PyObject::new(
    +        Socket::new(address_family, kind),
    +        cls.clone(),
    +    ))
    +}
    +
    +fn socket_connect(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(zelf, None), (address, Some(vm.ctx.tuple_type()))]
    +    );
    +
    +    let address_string = get_address_string(vm, address)?;
    +
    +    let socket = get_socket(zelf);
    +
    +    match socket.socket_kind {
    +        SocketKind::Stream => match TcpStream::connect(address_string) {
    +            Ok(stream) => {
    +                socket
    +                    .con
    +                    .borrow_mut()
    +                    .replace(Connection::TcpStream(stream));
    +                Ok(vm.get_none())
    +            }
    +            Err(s) => Err(vm.new_os_error(s.to_string())),
    +        },
    +        SocketKind::Dgram => {
    +            if let Some(Connection::UdpSocket(con)) = socket.con.borrow().as_ref() {
    +                match con.connect(address_string) {
    +                    Ok(_) => Ok(vm.get_none()),
    +                    Err(s) => Err(vm.new_os_error(s.to_string())),
    +                }
    +            } else {
    +                Err(vm.new_type_error("".to_string()))
    +            }
    +        }
    +    }
    +}
    +
    +fn socket_bind(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(zelf, None), (address, Some(vm.ctx.tuple_type()))]
    +    );
    +
    +    let address_string = get_address_string(vm, address)?;
    +
    +    let socket = get_socket(zelf);
    +
    +    match socket.socket_kind {
    +        SocketKind::Stream => match TcpListener::bind(address_string) {
    +            Ok(stream) => {
    +                socket
    +                    .con
    +                    .borrow_mut()
    +                    .replace(Connection::TcpListener(stream));
    +                Ok(vm.get_none())
    +            }
    +            Err(s) => Err(vm.new_os_error(s.to_string())),
    +        },
    +        SocketKind::Dgram => match UdpSocket::bind(address_string) {
    +            Ok(dgram) => {
    +                socket
    +                    .con
    +                    .borrow_mut()
    +                    .replace(Connection::UdpSocket(dgram));
    +                Ok(vm.get_none())
    +            }
    +            Err(s) => Err(vm.new_os_error(s.to_string())),
    +        },
    +    }
    +}
    +
    +fn get_address_string(vm: &VirtualMachine, address: &PyObjectRef) -> Result<String, PyObjectRef> {
    +    let args = PyFuncArgs {
    +        args: get_elements(address).to_vec(),
    +        kwargs: vec![],
    +    };
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [
    +            (host, Some(vm.ctx.str_type())),
    +            (port, Some(vm.ctx.int_type()))
    +        ]
    +    );
    +
    +    Ok(format!(
    +        "{}:{}",
    +        objstr::get_value(host),
    +        objint::get_value(port).to_string()
    +    ))
    +}
    +
    +fn socket_listen(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(_zelf, None), (_num, Some(vm.ctx.int_type()))]
    +    );
    +    Ok(vm.get_none())
    +}
    +
    +fn socket_accept(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(zelf, None)]);
    +
    +    let socket = get_socket(zelf);
    +
    +    let ret = match socket.con.borrow_mut().as_mut() {
    +        Some(v) => v.accept(),
    +        None => return Err(vm.new_type_error("".to_string())),
    +    };
    +
    +    let (tcp_stream, addr) = match ret {
    +        Ok((socket, addr)) => (socket, addr),
    +        Err(s) => return Err(vm.new_os_error(s.to_string())),
    +    };
    +
    +    let socket = Socket {
    +        address_family: socket.address_family,
    +        socket_kind: socket.socket_kind,
    +        con: RefCell::new(Some(Connection::TcpStream(tcp_stream))),
    +    };
    +
    +    let sock_obj = PyObject::new(socket, zelf.typ());
    +
    +    let addr_tuple = get_addr_tuple(vm, addr)?;
    +
    +    Ok(vm.ctx.new_tuple(vec![sock_obj, addr_tuple]))
    +}
    +
    +fn socket_recv(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(zelf, None), (bufsize, Some(vm.ctx.int_type()))]
    +    );
    +    let socket = get_socket(zelf);
    +
    +    let mut buffer = vec![0u8; objint::get_value(bufsize).to_usize().unwrap()];
    +    match socket.con.borrow_mut().as_mut() {
    +        Some(v) => match v.read_exact(&mut buffer) {
    +            Ok(_) => (),
    +            Err(s) => return Err(vm.new_os_error(s.to_string())),
    +        },
    +        None => return Err(vm.new_type_error("".to_string())),
    +    };
    +    Ok(vm.ctx.new_bytes(buffer))
    +}
    +
    +fn socket_recvfrom(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(zelf, None), (bufsize, Some(vm.ctx.int_type()))]
    +    );
    +
    +    let socket = get_socket(zelf);
    +
    +    let mut buffer = vec![0u8; objint::get_value(bufsize).to_usize().unwrap()];
    +    let ret = match socket.con.borrow().as_ref() {
    +        Some(v) => v.recv_from(&mut buffer),
    +        None => return Err(vm.new_type_error("".to_string())),
    +    };
    +
    +    let addr = match ret {
    +        Ok((_size, addr)) => addr,
    +        Err(s) => return Err(vm.new_os_error(s.to_string())),
    +    };
    +
    +    let addr_tuple = get_addr_tuple(vm, addr)?;
    +
    +    Ok(vm.ctx.new_tuple(vec![vm.ctx.new_bytes(buffer), addr_tuple]))
    +}
    +
    +fn socket_send(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(zelf, None), (bytes, Some(vm.ctx.bytes_type()))]
    +    );
    +    let socket = get_socket(zelf);
    +
    +    match socket.con.borrow_mut().as_mut() {
    +        Some(v) => match v.write(&objbytes::get_value(&bytes)) {
    +            Ok(_) => (),
    +            Err(s) => return Err(vm.new_os_error(s.to_string())),
    +        },
    +        None => return Err(vm.new_type_error("".to_string())),
    +    };
    +    Ok(vm.get_none())
    +}
    +
    +fn socket_sendto(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [
    +            (zelf, None),
    +            (bytes, Some(vm.ctx.bytes_type())),
    +            (address, Some(vm.ctx.tuple_type()))
    +        ]
    +    );
    +    let address_string = get_address_string(vm, address)?;
    +
    +    let socket = get_socket(zelf);
    +
    +    match socket.socket_kind {
    +        SocketKind::Dgram => {
    +            if let Some(v) = socket.con.borrow().as_ref() {
    +                return match v.send_to(&objbytes::get_value(&bytes), address_string) {
    +                    Ok(_) => Ok(vm.get_none()),
    +                    Err(s) => Err(vm.new_os_error(s.to_string())),
    +                };
    +            }
    +            // Doing implicit bind
    +            match UdpSocket::bind("0.0.0.0:0") {
    +                Ok(dgram) => match dgram.send_to(&objbytes::get_value(&bytes), address_string) {
    +                    Ok(_) => {
    +                        socket
    +                            .con
    +                            .borrow_mut()
    +                            .replace(Connection::UdpSocket(dgram));
    +                        Ok(vm.get_none())
    +                    }
    +                    Err(s) => Err(vm.new_os_error(s.to_string())),
    +                },
    +                Err(s) => Err(vm.new_os_error(s.to_string())),
    +            }
    +        }
    +        _ => Err(vm.new_not_implemented_error("".to_string())),
    +    }
    +}
    +
    +fn socket_close(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(zelf, None)]);
    +
    +    let socket = get_socket(zelf);
    +    socket.con.borrow_mut().take();
    +    Ok(vm.get_none())
    +}
    +
    +fn socket_getsockname(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(zelf, None)]);
    +    let socket = get_socket(zelf);
    +
    +    let addr = match socket.con.borrow().as_ref() {
    +        Some(v) => v.local_addr(),
    +        None => return Err(vm.new_type_error("".to_string())),
    +    };
    +
    +    match addr {
    +        Ok(addr) => get_addr_tuple(vm, addr),
    +        Err(s) => Err(vm.new_os_error(s.to_string())),
    +    }
    +}
    +
    +fn get_addr_tuple(vm: &VirtualMachine, addr: SocketAddr) -> PyResult {
    +    let port = vm.ctx.new_int(addr.port());
    +    let ip = vm.ctx.new_str(addr.ip().to_string());
    +
    +    Ok(vm.ctx.new_tuple(vec![ip, port]))
    +}
    +
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    let socket = py_class!(ctx, "socket", ctx.object(), {
    +         "__new__" => ctx.new_rustfunc(socket_new),
    +         "connect" => ctx.new_rustfunc(socket_connect),
    +         "recv" => ctx.new_rustfunc(socket_recv),
    +         "send" => ctx.new_rustfunc(socket_send),
    +         "bind" => ctx.new_rustfunc(socket_bind),
    +         "accept" => ctx.new_rustfunc(socket_accept),
    +         "listen" => ctx.new_rustfunc(socket_listen),
    +         "close" => ctx.new_rustfunc(socket_close),
    +         "getsockname" => ctx.new_rustfunc(socket_getsockname),
    +         "sendto" => ctx.new_rustfunc(socket_sendto),
    +         "recvfrom" => ctx.new_rustfunc(socket_recvfrom),
    +    });
    +
    +    py_module!(ctx, "socket", {
    +        "AF_INET" => ctx.new_int(AddressFamily::Inet as i32),
    +        "SOCK_STREAM" => ctx.new_int(SocketKind::Stream as i32),
    +         "SOCK_DGRAM" => ctx.new_int(SocketKind::Dgram as i32),
    +         "socket" => socket.clone(),
    +    })
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/string.rs.html b/src/rustpython_vm/stdlib/string.rs.html index b0f595d..15a7481 100644 --- a/src/rustpython_vm/stdlib/string.rs.html +++ b/src/rustpython_vm/stdlib/string.rs.html @@ -1,4 +1,4 @@ -string.rs.html -- source
     1
    +string.rs.html -- source
     1
      2
      3
      4
    @@ -31,8 +31,6 @@
     31
     32
     33
    -34
    -35
     
     /* String builtin module
      *
    @@ -41,9 +39,7 @@
     
     use crate::pyobject::{PyContext, PyObjectRef};
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let py_mod = ctx.new_module(&"string".to_string(), ctx.new_scope(None));
    -
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
         let ascii_lowercase = "abcdefghijklmnopqrstuvwxyz".to_string();
         let ascii_uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".to_string();
         let ascii_letters = format!("{}{}", ascii_lowercase, ascii_uppercase);
    @@ -57,17 +53,17 @@
         */
     
         // Constants:
    -    ctx.set_attr(&py_mod, "ascii_letters", ctx.new_str(ascii_letters));
    -    ctx.set_attr(&py_mod, "ascii_lowercase", ctx.new_str(ascii_lowercase));
    -    ctx.set_attr(&py_mod, "ascii_uppercase", ctx.new_str(ascii_uppercase));
    -    ctx.set_attr(&py_mod, "digits", ctx.new_str(digits));
    -    ctx.set_attr(&py_mod, "hexdigits", ctx.new_str(hexdigits));
    -    ctx.set_attr(&py_mod, "octdigits", ctx.new_str(octdigits));
    -    // ctx.set_attr(&py_mod, "printable", ctx.new_str(printable));
    -    ctx.set_attr(&py_mod, "punctuation", ctx.new_str(punctuation));
    -    // ctx.set_attr(&py_mod, "whitespace", ctx.new_str(whitespace));
    -
    -    py_mod
    +    py_module!(ctx, "string", {
    +        "ascii_letters" => ctx.new_str(ascii_letters),
    +        "ascii_lowercase" => ctx.new_str(ascii_lowercase),
    +        "ascii_uppercase" => ctx.new_str(ascii_uppercase),
    +        "digits" => ctx.new_str(digits),
    +        "hexdigits" => ctx.new_str(hexdigits),
    +        "octdigits" => ctx.new_str(octdigits),
    +        // "printable", ctx.new_str(printable)
    +        "punctuation" => ctx.new_str(punctuation)
    +        // "whitespace", ctx.new_str(whitespace)
    +    })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/time_module.rs.html b/src/rustpython_vm/stdlib/time_module.rs.html index 72114b5..b4eeaec 100644 --- a/src/rustpython_vm/stdlib/time_module.rs.html +++ b/src/rustpython_vm/stdlib/time_module.rs.html @@ -1,4 +1,4 @@ -time_module.rs.html -- source
     1
    +time_module.rs.html -- source
     1
      2
      3
      4
    @@ -41,13 +41,15 @@
     
     //! The python `time` module.
     
    -use crate::obj::objfloat;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    -use crate::VirtualMachine;
     use std::thread;
     use std::time::{Duration, SystemTime, UNIX_EPOCH};
     
    -fn time_sleep(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +use crate::function::PyFuncArgs;
    +use crate::obj::objfloat;
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
    +fn time_sleep(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(seconds, Some(vm.ctx.float_type()))]);
         let seconds = objfloat::get_value(seconds);
         let secs: u64 = seconds.trunc() as u64;
    @@ -61,7 +63,7 @@
         (d.as_secs() as f64) + (f64::from(d.subsec_nanos()) / 1e9)
     }
     
    -fn time_time(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn time_time(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args);
         let x = match SystemTime::now().duration_since(UNIX_EPOCH) {
             Ok(v) => duration_to_f64(v),
    @@ -71,13 +73,11 @@
         Ok(value)
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let py_mod = ctx.new_module("time", ctx.new_scope(None));
    -
    -    ctx.set_attr(&py_mod, "sleep", ctx.new_rustfunc(time_sleep));
    -    ctx.set_attr(&py_mod, "time", ctx.new_rustfunc(time_time));
    -
    -    py_mod
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    py_module!(ctx, "time", {
    +        "sleep" => ctx.new_rustfunc(time_sleep),
    +        "time" => ctx.new_rustfunc(time_time)
    +    })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/tokenize.rs.html b/src/rustpython_vm/stdlib/tokenize.rs.html index 8b43d4e..793306d 100644 --- a/src/rustpython_vm/stdlib/tokenize.rs.html +++ b/src/rustpython_vm/stdlib/tokenize.rs.html @@ -1,4 +1,4 @@ -tokenize.rs.html -- source
     1
    +tokenize.rs.html -- source
     1
      2
      3
      4
    @@ -30,24 +30,21 @@
     30
     31
     32
    -33
    -34
    -35
     
     /*
      * python tokenize module.
      */
     
    -extern crate rustpython_parser;
     use std::iter::FromIterator;
     
    -use self::rustpython_parser::lexer;
    +use rustpython_parser::lexer;
     
    +use crate::function::PyFuncArgs;
     use crate::obj::objstr;
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    -use crate::VirtualMachine;
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
    +use crate::vm::VirtualMachine;
     
    -fn tokenize_tokenize(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn tokenize_tokenize(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(readline, Some(vm.ctx.str_type()))]);
         let source = objstr::get_value(readline);
     
    @@ -61,13 +58,10 @@
     
     // TODO: create main function when called with -m
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let py_mod = ctx.new_module("tokenize", ctx.new_scope(None));
    -
    -    // Number theory functions:
    -    ctx.set_attr(&py_mod, "tokenize", ctx.new_rustfunc(tokenize_tokenize));
    -
    -    py_mod
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    py_module!(ctx, "tokenize", {
    +        "tokenize" => ctx.new_rustfunc(tokenize_tokenize)
    +    })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/types.rs.html b/src/rustpython_vm/stdlib/types.rs.html index af327d9..d55bc26 100644 --- a/src/rustpython_vm/stdlib/types.rs.html +++ b/src/rustpython_vm/stdlib/types.rs.html @@ -1,4 +1,4 @@ -types.rs.html -- source
     1
    +types.rs.html -- source
     1
      2
      3
      4
    @@ -32,26 +32,17 @@
     32
     33
     34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
     
     /*
      * Dynamic type creation and names for built in types.
      */
     
    -use crate::obj::{objsequence, objstr, objtype};
    -use crate::pyobject::{PyAttributes, PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    +use crate::function::PyFuncArgs;
    +use crate::obj::objtype;
    +use crate::pyobject::{PyContext, PyObjectRef, PyResult, TypeProtocol};
     use crate::VirtualMachine;
     
    -fn types_new_class(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn types_new_class(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(
             vm,
             args,
    @@ -59,33 +50,22 @@
             optional = [(bases, None), (_kwds, None), (_exec_body, None)]
         );
     
    -    let name = objstr::get_value(name);
    -
    -    let bases = match bases {
    -        Some(b) => {
    -            if objtype::isinstance(b, &vm.ctx.tuple_type()) {
    -                objsequence::get_elements(b).to_vec()
    -            } else {
    -                return Err(vm.new_type_error("Bases must be a tuple".to_string()));
    -            }
    -        }
    -        None => vec![vm.ctx.object()],
    +    let bases: PyObjectRef = match bases {
    +        Some(bases) => bases.clone(),
    +        None => vm.ctx.new_tuple(vec![]),
         };
    -
    -    objtype::new(vm.ctx.type_type(), &name, bases, PyAttributes::new())
    +    let dict = vm.ctx.new_dict();
    +    objtype::type_new_class(vm, &vm.ctx.type_type(), name, &bases, &dict)
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let py_mod = ctx.new_module("types", ctx.new_scope(None));
    -
    -    // Number theory functions:
    -    ctx.set_attr(&py_mod, "new_class", ctx.new_rustfunc(types_new_class));
    -    ctx.set_attr(&py_mod, "FunctionType", ctx.function_type());
    -    ctx.set_attr(&py_mod, "LambdaType", ctx.function_type());
    -    ctx.set_attr(&py_mod, "CodeType", ctx.code_type());
    -    ctx.set_attr(&py_mod, "FrameType", ctx.frame_type());
    -
    -    py_mod
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    py_module!(ctx, "types", {
    +        "new_class" => ctx.new_rustfunc(types_new_class),
    +        "FunctionType" => ctx.function_type(),
    +        "LambdaType" => ctx.function_type(),
    +        "CodeType" => ctx.code_type(),
    +        "FrameType" => ctx.frame_type()
    +    })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/stdlib/weakref.rs.html b/src/rustpython_vm/stdlib/weakref.rs.html index 988997d..9e7060a 100644 --- a/src/rustpython_vm/stdlib/weakref.rs.html +++ b/src/rustpython_vm/stdlib/weakref.rs.html @@ -1,4 +1,4 @@ -weakref.rs.html -- source
     1
    +weakref.rs.html -- source
     1
      2
      3
      4
    @@ -12,46 +12,6 @@
     12
     13
     14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
     
     //! Implementation in line with the python `weakref` module.
     //!
    @@ -60,52 +20,12 @@
     //! - [rust weak struct](https://doc.rust-lang.org/std/rc/struct.Weak.html)
     //!
     
    -use crate::pyobject::{
    -    PyContext, PyFuncArgs, PyObject, PyObjectPayload, PyObjectRef, PyObjectWeakRef, PyResult,
    -    TypeProtocol,
    -};
    -use crate::VirtualMachine;
    -use std::rc::Rc;
    +use super::super::pyobject::{PyContext, PyObjectRef};
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    -    let py_mod = ctx.new_module("_weakref", ctx.new_scope(None));
    -
    -    let py_ref_class = ctx.new_class("ref", ctx.object());
    -    ctx.set_attr(&py_ref_class, "__new__", ctx.new_rustfunc(ref_new));
    -    ctx.set_attr(&py_ref_class, "__call__", ctx.new_rustfunc(ref_call));
    -    ctx.set_attr(&py_mod, "ref", py_ref_class);
    -    py_mod
    -}
    -
    -fn ref_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    // TODO: check first argument for subclass of `ref`.
    -    arg_check!(vm, args, required = [(cls, None), (referent, None)]);
    -    let referent = Rc::downgrade(referent);
    -    Ok(PyObject::new(
    -        PyObjectPayload::WeakRef { referent },
    -        cls.clone(),
    -    ))
    -}
    -
    -/// Dereference the weakref, and check if we still refer something.
    -fn ref_call(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    -    // TODO: check first argument for subclass of `ref`.
    -    arg_check!(vm, args, required = [(cls, None)]);
    -    let referent = get_value(cls);
    -    let py_obj = if let Some(obj) = referent.upgrade() {
    -        obj
    -    } else {
    -        vm.get_none()
    -    };
    -    Ok(py_obj)
    -}
    -
    -fn get_value(obj: &PyObjectRef) -> PyObjectWeakRef {
    -    if let PyObjectPayload::WeakRef { referent } = &obj.borrow().payload {
    -        referent.clone()
    -    } else {
    -        panic!("Inner error getting weak ref {:?}", obj);
    -    }
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    py_module!(ctx, "_weakref", {
    +        "ref" => ctx.weakref_type()
    +    })
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/sysmodule.rs.html b/src/rustpython_vm/sysmodule.rs.html index f236284..6661da5 100644 --- a/src/rustpython_vm/sysmodule.rs.html +++ b/src/rustpython_vm/sysmodule.rs.html @@ -1,4 +1,4 @@ -sysmodule.rs.html -- source
      1
    +sysmodule.rs.html -- source
      1
       2
       3
       4
    @@ -137,12 +137,41 @@
     137
     138
     139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
     
    -use crate::pyobject::{PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    -use crate::vm::VirtualMachine;
     use std::rc::Rc;
     use std::{env, mem};
     
    +use num_traits::ToPrimitive;
    +
    +use crate::function::PyFuncArgs;
    +use crate::obj::objint;
    +use crate::pyobject::{DictProtocol, PyContext, PyObjectRef, PyResult, TypeProtocol};
    +use crate::vm::VirtualMachine;
    +
     /*
      * The magic sys module.
      */
    @@ -153,28 +182,46 @@
         ctx.new_list(argv)
     }
     
    -fn getframe(vm: &mut VirtualMachine, _args: PyFuncArgs) -> PyResult {
    -    if let Some(frame) = &vm.current_frame {
    -        Ok(frame.clone())
    -    } else {
    -        panic!("Current frame is undefined!")
    +fn frame_idx(vm: &VirtualMachine, offset: Option<&PyObjectRef>) -> Result<usize, PyObjectRef> {
    +    if let Some(int) = offset {
    +        if let Some(offset) = objint::get_value(&int).to_usize() {
    +            if offset > vm.frames.borrow().len() - 1 {
    +                return Err(vm.new_value_error("call stack is not deep enough".to_string()));
    +            }
    +            return Ok(offset);
    +        }
         }
    +    Ok(0)
    +}
    +
    +fn getframe(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [],
    +        optional = [(offset, Some(vm.ctx.int_type()))]
    +    );
    +
    +    let idx = frame_idx(vm, offset)?;
    +    let idx = vm.frames.borrow().len() - idx - 1;
    +    let frame = &vm.frames.borrow()[idx];
    +    Ok(frame.clone())
     }
     
    -fn sys_getrefcount(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn sys_getrefcount(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(object, None)]);
         let size = Rc::strong_count(&object);
         Ok(vm.ctx.new_int(size))
     }
     
    -fn sys_getsizeof(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +fn sys_getsizeof(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         arg_check!(vm, args, required = [(object, None)]);
         // TODO: implement default optional argument.
    -    let size = mem::size_of_val(&object.borrow());
    +    let size = mem::size_of_val(&object);
         Ok(vm.ctx.new_int(size))
     }
     
    -pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
    +pub fn make_module(ctx: &PyContext, builtins: PyObjectRef) -> PyObjectRef {
         let path_list = match env::var_os("PYTHONPATH") {
             Some(paths) => env::split_paths(&paths)
                 .map(|path| {
    @@ -272,10 +319,11 @@
           "_getframe" => ctx.new_rustfunc(getframe),
         });
     
    -    ctx.set_item(&modules, sys_name, sys_mod.clone());
    +    modules.set_item(&ctx, sys_name, sys_mod.clone());
    +    modules.set_item(&ctx, "builtins", builtins);
         ctx.set_attr(&sys_mod, "modules", modules);
     
         sys_mod
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/traceback.rs.html b/src/rustpython_vm/traceback.rs.html index 87996f0..7e03168 100644 --- a/src/rustpython_vm/traceback.rs.html +++ b/src/rustpython_vm/traceback.rs.html @@ -1,7 +1,7 @@ -traceback.rs.html -- source
    1
    +traceback.rs.html -- source
    1
     2
     
     // python tracebacks
     //
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/util.rs.html b/src/rustpython_vm/util.rs.html index 8620b27..502e389 100644 --- a/src/rustpython_vm/util.rs.html +++ b/src/rustpython_vm/util.rs.html @@ -1,4 +1,4 @@ -util.rs.html -- source
     1
    +util.rs.html -- source
     1
      2
      3
      4
    @@ -26,4 +26,4 @@
         Ok(buffer)
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_vm/vm.rs.html b/src/rustpython_vm/vm.rs.html index f8404e8..5d7e651 100644 --- a/src/rustpython_vm/vm.rs.html +++ b/src/rustpython_vm/vm.rs.html @@ -1,4 +1,4 @@ -vm.rs.html -- source
      1
    +vm.rs.html -- source
      1
       2
       3
       4
    @@ -838,6 +838,95 @@
     838
     839
     840
    +841
    +842
    +843
    +844
    +845
    +846
    +847
    +848
    +849
    +850
    +851
    +852
    +853
    +854
    +855
    +856
    +857
    +858
    +859
    +860
    +861
    +862
    +863
    +864
    +865
    +866
    +867
    +868
    +869
    +870
    +871
    +872
    +873
    +874
    +875
    +876
    +877
    +878
    +879
    +880
    +881
    +882
    +883
    +884
    +885
    +886
    +887
    +888
    +889
    +890
    +891
    +892
    +893
    +894
    +895
    +896
    +897
    +898
    +899
    +900
    +901
    +902
    +903
    +904
    +905
    +906
    +907
    +908
    +909
    +910
    +911
    +912
    +913
    +914
    +915
    +916
    +917
    +918
    +919
    +920
    +921
    +922
    +923
    +924
    +925
    +926
    +927
    +928
    +929
     
     //! Implement virtual machine to run instructions.
     //!
    @@ -847,26 +936,35 @@
     
     extern crate rustpython_parser;
     
    +use std::cell::{Ref, RefCell};
     use std::collections::hash_map::HashMap;
     use std::collections::hash_set::HashSet;
    +use std::rc::Rc;
     use std::sync::{Mutex, MutexGuard};
     
     use crate::builtins;
     use crate::bytecode;
    -use crate::frame::Frame;
    +use crate::frame::{ExecutionResult, Frame, Scope};
    +use crate::function::PyFuncArgs;
     use crate::obj::objbool;
    +use crate::obj::objbuiltinfunc::PyBuiltinFunction;
     use crate::obj::objcode;
    +use crate::obj::objframe;
    +use crate::obj::objfunction::{PyFunction, PyMethod};
     use crate::obj::objgenerator;
     use crate::obj::objiter;
    +use crate::obj::objlist::PyList;
     use crate::obj::objsequence;
    -use crate::obj::objstr;
    +use crate::obj::objstr::{PyString, PyStringRef};
    +use crate::obj::objtuple::PyTuple;
     use crate::obj::objtype;
     use crate::pyobject::{
    -    AttributeProtocol, DictProtocol, IdProtocol, PyContext, PyFuncArgs, PyObjectPayload,
    -    PyObjectRef, PyResult, TypeProtocol,
    +    AttributeProtocol, DictProtocol, IdProtocol, PyContext, PyObjectRef, PyResult, TryFromObject,
    +    TryIntoRef, TypeProtocol,
     };
     use crate::stdlib;
     use crate::sysmodule;
    +use num_bigint::BigInt;
     
     // use objects::objects;
     
    @@ -877,9 +975,9 @@
     pub struct VirtualMachine {
         pub builtins: PyObjectRef,
         pub sys_module: PyObjectRef,
    -    pub stdlib_inits: HashMap<String, stdlib::StdlibInitFunc>,
    +    pub stdlib_inits: RefCell<HashMap<String, stdlib::StdlibInitFunc>>,
         pub ctx: PyContext,
    -    pub current_frame: Option<PyObjectRef>,
    +    pub frames: RefCell<Vec<PyObjectRef>>,
         pub wasm_id: Option<String>,
     }
     
    @@ -890,26 +988,58 @@
     
             // Hard-core modules:
             let builtins = builtins::make_module(&ctx);
    -        let sysmod = sysmodule::mk_module(&ctx);
    +        let sysmod = sysmodule::make_module(&ctx, builtins.clone());
     
    -        // Add builtins as builtins module:
    -        let modules = sysmod.get_attr("modules").unwrap();
    -        ctx.set_item(&modules, "builtins", builtins.clone());
    -
    -        let stdlib_inits = stdlib::get_module_inits();
    +        let stdlib_inits = RefCell::new(stdlib::get_module_inits());
             VirtualMachine {
                 builtins,
                 sys_module: sysmod,
                 stdlib_inits,
                 ctx,
    -            current_frame: None,
    +            frames: RefCell::new(vec![]),
                 wasm_id: None,
             }
         }
     
    -    pub fn run_code_obj(&mut self, code: PyObjectRef, scope: PyObjectRef) -> PyResult {
    -        let mut frame = Frame::new(code, scope);
    -        frame.run_frame_full(self)
    +    pub fn run_code_obj(&self, code: PyObjectRef, scope: Scope) -> PyResult {
    +        let frame = self.ctx.new_frame(code, scope);
    +        self.run_frame_full(frame)
    +    }
    +
    +    pub fn run_frame_full(&self, frame: PyObjectRef) -> PyResult {
    +        match self.run_frame(frame)? {
    +            ExecutionResult::Return(value) => Ok(value),
    +            _ => panic!("Got unexpected result from function"),
    +        }
    +    }
    +
    +    pub fn run_frame(&self, frame: PyObjectRef) -> PyResult<ExecutionResult> {
    +        self.frames.borrow_mut().push(frame.clone());
    +        let frame = objframe::get_value(&frame);
    +        let result = frame.run(self);
    +        self.frames.borrow_mut().pop();
    +        result
    +    }
    +
    +    pub fn current_frame(&self) -> Ref<Frame> {
    +        Ref::map(self.frames.borrow(), |frames| {
    +            let index = frames.len() - 1;
    +            let current_frame = &frames[index];
    +            objframe::get_value(current_frame)
    +        })
    +    }
    +
    +    pub fn current_scope(&self) -> Ref<Scope> {
    +        let frame = self.current_frame();
    +        Ref::map(frame, |f| &f.scope)
    +    }
    +
    +    pub fn class(&self, module: &str, class: &str) -> PyObjectRef {
    +        let module = self
    +            .import(module)
    +            .unwrap_or_else(|_| panic!("unable to import {}", module));
    +        self.get_attribute(module.clone(), class)
    +            .unwrap_or_else(|_| panic!("module {} has no class {}", module, class))
         }
     
         /// Create a new python string object.
    @@ -917,6 +1047,11 @@
             self.ctx.new_str(s)
         }
     
    +    /// Create a new python int object.
    +    pub fn new_int<T: Into<BigInt>>(&self, i: T) -> PyObjectRef {
    +        self.ctx.new_int(i)
    +    }
    +
         /// Create a new python bool object.
         pub fn new_bool(&self, b: bool) -> PyObjectRef {
             self.ctx.new_bool(b)
    @@ -926,27 +1061,35 @@
             self.ctx.new_dict()
         }
     
    -    pub fn new_exception(&mut self, exc_type: PyObjectRef, msg: String) -> PyObjectRef {
    +    pub fn new_empty_exception(&self, exc_type: PyObjectRef) -> PyResult {
    +        info!("New exception created: no msg");
    +        let args = PyFuncArgs::default();
    +        self.invoke(exc_type, args)
    +    }
    +
    +    pub fn new_exception(&self, exc_type: PyObjectRef, msg: String) -> PyObjectRef {
    +        // TODO: exc_type may be user-defined exception, so we should return PyResult
             // TODO: maybe there is a clearer way to create an instance:
             info!("New exception created: {}", msg);
             let pymsg = self.new_str(msg);
             let args: Vec<PyObjectRef> = vec![pymsg];
    -        let args = PyFuncArgs {
    -            args,
    -            kwargs: vec![],
    -        };
     
             // Call function:
             self.invoke(exc_type, args).unwrap()
         }
     
    -    pub fn new_type_error(&mut self, msg: String) -> PyObjectRef {
    +    pub fn new_attribute_error(&self, msg: String) -> PyObjectRef {
    +        let attribute_error = self.ctx.exceptions.attribute_error.clone();
    +        self.new_exception(attribute_error, msg)
    +    }
    +
    +    pub fn new_type_error(&self, msg: String) -> PyObjectRef {
             let type_error = self.ctx.exceptions.type_error.clone();
             self.new_exception(type_error, msg)
         }
     
         pub fn new_unsupported_operand_error(
    -        &mut self,
    +        &self,
             a: PyObjectRef,
             b: PyObjectRef,
             op: &str,
    @@ -959,48 +1102,43 @@
             ))
         }
     
    -    pub fn new_os_error(&mut self, msg: String) -> PyObjectRef {
    +    pub fn new_os_error(&self, msg: String) -> PyObjectRef {
             let os_error = self.ctx.exceptions.os_error.clone();
             self.new_exception(os_error, msg)
         }
     
         /// Create a new python ValueError object. Useful for raising errors from
         /// python functions implemented in rust.
    -    pub fn new_value_error(&mut self, msg: String) -> PyObjectRef {
    +    pub fn new_value_error(&self, msg: String) -> PyObjectRef {
             let value_error = self.ctx.exceptions.value_error.clone();
             self.new_exception(value_error, msg)
         }
     
    -    pub fn new_key_error(&mut self, msg: String) -> PyObjectRef {
    +    pub fn new_key_error(&self, msg: String) -> PyObjectRef {
             let key_error = self.ctx.exceptions.key_error.clone();
             self.new_exception(key_error, msg)
         }
     
    -    pub fn new_index_error(&mut self, msg: String) -> PyObjectRef {
    +    pub fn new_index_error(&self, msg: String) -> PyObjectRef {
             let index_error = self.ctx.exceptions.index_error.clone();
             self.new_exception(index_error, msg)
         }
     
    -    pub fn new_not_implemented_error(&mut self, msg: String) -> PyObjectRef {
    +    pub fn new_not_implemented_error(&self, msg: String) -> PyObjectRef {
             let not_implemented_error = self.ctx.exceptions.not_implemented_error.clone();
             self.new_exception(not_implemented_error, msg)
         }
     
    -    pub fn new_zero_division_error(&mut self, msg: String) -> PyObjectRef {
    +    pub fn new_zero_division_error(&self, msg: String) -> PyObjectRef {
             let zero_division_error = self.ctx.exceptions.zero_division_error.clone();
             self.new_exception(zero_division_error, msg)
         }
     
    -    pub fn new_overflow_error(&mut self, msg: String) -> PyObjectRef {
    +    pub fn new_overflow_error(&self, msg: String) -> PyObjectRef {
             let overflow_error = self.ctx.exceptions.overflow_error.clone();
             self.new_exception(overflow_error, msg)
         }
     
    -    pub fn new_scope(&mut self, parent_scope: Option<PyObjectRef>) -> PyObjectRef {
    -        // let parent_scope = self.current_frame_mut().locals.clone();
    -        self.ctx.new_scope(parent_scope)
    -    }
    -
         pub fn get_none(&self) -> PyObjectRef {
             self.ctx.none()
         }
    @@ -1014,84 +1152,74 @@
         }
     
         pub fn get_locals(&self) -> PyObjectRef {
    -        // let scope = &self.frames.last().unwrap().locals;
    -        // scope.clone()
    -        // TODO: fix this!
    -        self.get_none()
    -        /*
    -        match (*scope).payload {
    -            PyObjectPayload::Scope { scope } => { scope.locals.clone() },
    -            _ => { panic!("Should be scope") },
    -        } // .clone()
    -        */
    +        self.current_scope().get_locals().clone()
         }
     
         pub fn context(&self) -> &PyContext {
             &self.ctx
         }
     
    -    pub fn get_builtin_scope(&mut self) -> PyObjectRef {
    -        let a2 = &*self.builtins.borrow();
    -        match a2.payload {
    -            PyObjectPayload::Module { ref dict, .. } => dict.clone(),
    -            _ => {
    -                panic!("OMG");
    -            }
    -        }
    -    }
    -
         // Container of the virtual machine state:
    -    pub fn to_str(&mut self, obj: &PyObjectRef) -> PyResult {
    -        self.call_method(&obj, "__str__", vec![])
    +    pub fn to_str(&self, obj: &PyObjectRef) -> PyResult<PyStringRef> {
    +        let str = self.call_method(&obj, "__str__", vec![])?;
    +        TryFromObject::try_from_object(self, str)
         }
     
    -    pub fn to_pystr(&mut self, obj: &PyObjectRef) -> Result<String, PyObjectRef> {
    +    pub fn to_pystr(&self, obj: &PyObjectRef) -> Result<String, PyObjectRef> {
             let py_str_obj = self.to_str(obj)?;
    -        Ok(objstr::get_value(&py_str_obj))
    +        Ok(py_str_obj.value.clone())
         }
     
    -    pub fn to_repr(&mut self, obj: &PyObjectRef) -> PyResult {
    -        self.call_method(obj, "__repr__", vec![])
    +    pub fn to_repr(&self, obj: &PyObjectRef) -> PyResult<PyStringRef> {
    +        let repr = self.call_method(obj, "__repr__", vec![])?;
    +        TryFromObject::try_from_object(self, repr)
         }
     
    -    pub fn call_get_descriptor(&mut self, attr: PyObjectRef, obj: PyObjectRef) -> PyResult {
    +    pub fn import(&self, module: &str) -> PyResult {
    +        let builtins_import = self.builtins.get_item("__import__");
    +        match builtins_import {
    +            Some(func) => self.invoke(func, vec![self.ctx.new_str(module.to_string())]),
    +            None => Err(self.new_exception(
    +                self.ctx.exceptions.import_error.clone(),
    +                "__import__ not found".to_string(),
    +            )),
    +        }
    +    }
    +
    +    /// Determines if `obj` is an instance of `cls`, either directly, indirectly or virtually via
    +    /// the __instancecheck__ magic method.
    +    pub fn isinstance(&self, obj: &PyObjectRef, cls: &PyObjectRef) -> PyResult<bool> {
    +        // cpython first does an exact check on the type, although documentation doesn't state that
    +        // https://github.com/python/cpython/blob/a24107b04c1277e3c1105f98aff5bfa3a98b33a0/Objects/abstract.c#L2408
    +        if Rc::ptr_eq(&obj.typ(), cls) {
    +            Ok(true)
    +        } else {
    +            let ret = self.call_method(cls, "__instancecheck__", vec![obj.clone()])?;
    +            objbool::boolval(self, ret)
    +        }
    +    }
    +
    +    /// Determines if `subclass` is a subclass of `cls`, either directly, indirectly or virtually
    +    /// via the __subclasscheck__ magic method.
    +    pub fn issubclass(&self, subclass: &PyObjectRef, cls: &PyObjectRef) -> PyResult<bool> {
    +        let ret = self.call_method(cls, "__subclasscheck__", vec![subclass.clone()])?;
    +        objbool::boolval(self, ret)
    +    }
    +
    +    pub fn call_get_descriptor(&self, attr: PyObjectRef, obj: PyObjectRef) -> PyResult {
             let attr_class = attr.typ();
             if let Some(descriptor) = attr_class.get_attr("__get__") {
                 let cls = obj.typ();
    -            self.invoke(
    -                descriptor,
    -                PyFuncArgs {
    -                    args: vec![attr, obj.clone(), cls],
    -                    kwargs: vec![],
    -                },
    -            )
    +            self.invoke(descriptor, vec![attr, obj.clone(), cls])
             } else {
                 Ok(attr)
             }
         }
     
    -    pub fn call_method(
    -        &mut self,
    -        obj: &PyObjectRef,
    -        method_name: &str,
    -        args: Vec<PyObjectRef>,
    -    ) -> PyResult {
    -        self.call_method_pyargs(
    -            obj,
    -            method_name,
    -            PyFuncArgs {
    -                args,
    -                kwargs: vec![],
    -            },
    -        )
    -    }
    -
    -    pub fn call_method_pyargs(
    -        &mut self,
    -        obj: &PyObjectRef,
    -        method_name: &str,
    -        args: PyFuncArgs,
    -    ) -> PyResult {
    +    pub fn call_method<T>(&self, obj: &PyObjectRef, method_name: &str, args: T) -> PyResult
    +    where
    +        T: Into<PyFuncArgs>,
    +    {
             // This is only used in the vm for magic methods, which use a greatly simplified attribute lookup.
             let cls = obj.typ();
             match cls.get_attr(method_name) {
    @@ -1110,60 +1238,89 @@
             }
         }
     
    -    pub fn invoke(&mut self, func_ref: PyObjectRef, args: PyFuncArgs) -> PyResult {
    +    pub fn invoke<T>(&self, func_ref: PyObjectRef, args: T) -> PyResult
    +    where
    +        T: Into<PyFuncArgs>,
    +    {
    +        let args = args.into();
             trace!("Invoke: {:?} {:?}", func_ref, args);
    -        match func_ref.borrow().payload {
    -            PyObjectPayload::RustFunction { ref function } => function(self, args),
    -            PyObjectPayload::Function {
    -                ref code,
    -                ref scope,
    -                ref defaults,
    -            } => self.invoke_python_function(code, scope, defaults, args),
    -            PyObjectPayload::Class { .. } => self.call_method_pyargs(&func_ref, "__call__", args),
    -            PyObjectPayload::BoundMethod {
    -                ref function,
    -                ref object,
    -            } => self.invoke(function.clone(), args.insert(object.clone())),
    -            PyObjectPayload::Instance { .. } => {
    -                self.call_method_pyargs(&func_ref, "__call__", args)
    -            }
    -            ref payload => {
    -                // TODO: is it safe to just invoke __call__ otherwise?
    -                trace!("invoke __call__ for: {:?}", payload);
    -                self.call_method_pyargs(&func_ref, "__call__", args)
    -            }
    +        if let Some(PyFunction {
    +            ref code,
    +            ref scope,
    +            ref defaults,
    +        }) = func_ref.payload()
    +        {
    +            return self.invoke_python_function(code, scope, defaults, args);
             }
    +        if let Some(PyMethod {
    +            ref function,
    +            ref object,
    +        }) = func_ref.payload()
    +        {
    +            return self.invoke(function.clone(), args.insert(object.clone()));
    +        }
    +        if let Some(PyBuiltinFunction { ref value }) = func_ref.payload() {
    +            return value(self, args);
    +        }
    +
    +        // TODO: is it safe to just invoke __call__ otherwise?
    +        trace!("invoke __call__ for: {:?}", func_ref.payload);
    +        self.call_method(&func_ref, "__call__", args)
         }
     
         fn invoke_python_function(
    -        &mut self,
    +        &self,
             code: &PyObjectRef,
    -        scope: &PyObjectRef,
    +        scope: &Scope,
             defaults: &PyObjectRef,
             args: PyFuncArgs,
         ) -> PyResult {
             let code_object = objcode::get_value(code);
    -        let scope = self.ctx.new_scope(Some(scope.clone()));
    -        self.fill_scope_from_args(&code_object, &scope, args, defaults)?;
    +        let scope = scope.child_scope(&self.ctx);
    +        self.fill_locals_from_args(&code_object, &scope.get_locals(), args, defaults)?;
     
             // Construct frame:
    -        let mut frame = Frame::new(code.clone(), scope);
    +        let frame = self.ctx.new_frame(code.clone(), scope);
     
             // If we have a generator, create a new generator
             if code_object.is_generator {
    -            objgenerator::new_generator(self, frame)
    +            Ok(objgenerator::new_generator(frame, self).into_object())
             } else {
    -            frame.run_frame_full(self)
    +            self.run_frame_full(frame)
             }
         }
     
    -    fn fill_scope_from_args(
    -        &mut self,
    +    pub fn invoke_with_locals(
    +        &self,
    +        function: PyObjectRef,
    +        cells: PyObjectRef,
    +        locals: PyObjectRef,
    +    ) -> PyResult {
    +        if let Some(PyFunction {
    +            code,
    +            scope,
    +            defaults: _,
    +        }) = &function.payload()
    +        {
    +            let scope = scope
    +                .child_scope_with_locals(cells)
    +                .child_scope_with_locals(locals);
    +            let frame = self.ctx.new_frame(code.clone(), scope);
    +            return self.run_frame_full(frame);
    +        }
    +        panic!(
    +            "invoke_with_locals: expected python function, got: {:?}",
    +            function
    +        );
    +    }
    +
    +    fn fill_locals_from_args(
    +        &self,
             code_object: &bytecode::CodeObject,
    -        scope: &PyObjectRef,
    +        locals: &PyObjectRef,
             args: PyFuncArgs,
             defaults: &PyObjectRef,
    -    ) -> Result<(), PyObjectRef> {
    +    ) -> PyResult<()> {
             let nargs = args.args.len();
             let nexpected_args = code_object.arg_names.len();
     
    @@ -1183,44 +1340,44 @@
             for i in 0..n {
                 let arg_name = &code_object.arg_names[i];
                 let arg = &args.args[i];
    -            self.ctx.set_attr(scope, arg_name, arg.clone());
    +            locals.set_item(&self.ctx, arg_name, arg.clone());
             }
     
             // Pack other positional arguments in to *args:
    -        if let Some(vararg) = &code_object.varargs {
    -            let mut last_args = vec![];
    -            for i in n..nargs {
    -                let arg = &args.args[i];
    -                last_args.push(arg.clone());
    -            }
    -            let vararg_value = self.ctx.new_tuple(last_args);
    +        match code_object.varargs {
    +            bytecode::Varargs::Named(ref vararg_name) => {
    +                let mut last_args = vec![];
    +                for i in n..nargs {
    +                    let arg = &args.args[i];
    +                    last_args.push(arg.clone());
    +                }
    +                let vararg_value = self.ctx.new_tuple(last_args);
     
    -            // If we have a name (not '*' only) then store it:
    -            if let Some(vararg_name) = vararg {
    -                self.ctx.set_attr(scope, vararg_name, vararg_value);
    +                locals.set_item(&self.ctx, vararg_name, vararg_value);
                 }
    -        } else {
    -            // Check the number of positional arguments
    -            if nargs > nexpected_args {
    -                return Err(self.new_type_error(format!(
    -                    "Expected {} arguments (got: {})",
    -                    nexpected_args, nargs
    -                )));
    +            bytecode::Varargs::Unnamed => {
    +                // just ignore the rest of the args
    +            }
    +            bytecode::Varargs::None => {
    +                // Check the number of positional arguments
    +                if nargs > nexpected_args {
    +                    return Err(self.new_type_error(format!(
    +                        "Expected {} arguments (got: {})",
    +                        nexpected_args, nargs
    +                    )));
    +                }
                 }
             }
     
             // Do we support `**kwargs` ?
    -        let kwargs = if let Some(kwargs) = &code_object.varkeywords {
    -            let d = self.new_dict();
    -
    -            // Store when we have a name:
    -            if let Some(kwargs_name) = kwargs {
    -                self.ctx.set_attr(scope, &kwargs_name, d.clone());
    +        let kwargs = match code_object.varkeywords {
    +            bytecode::Varargs::Named(ref kwargs_name) => {
    +                let d = self.new_dict();
    +                locals.set_item(&self.ctx, kwargs_name, d.clone());
    +                Some(d)
                 }
    -
    -            Some(d)
    -        } else {
    -            None
    +            bytecode::Varargs::Unnamed => Some(self.new_dict()),
    +            bytecode::Varargs::None => None,
             };
     
             // Handle keyword arguments
    @@ -1228,15 +1385,15 @@
                 // Check if we have a parameter with this name:
                 if code_object.arg_names.contains(&name) || code_object.kwonlyarg_names.contains(&name)
                 {
    -                if scope.contains_key(&name) {
    +                if locals.contains_key(&name) {
                         return Err(
                             self.new_type_error(format!("Got multiple values for argument '{}'", name))
                         );
                     }
     
    -                self.ctx.set_attr(scope, &name, value);
    +                locals.set_item(&self.ctx, &name, value);
                 } else if let Some(d) = &kwargs {
    -                self.ctx.set_item(d, &name, value);
    +                d.set_item(&self.ctx, &name, value);
                 } else {
                     return Err(
                         self.new_type_error(format!("Got an unexpected keyword argument '{}'", name))
    @@ -1247,10 +1404,14 @@
             // Add missing positional arguments, if we have fewer positional arguments than the
             // function definition calls for
             if nargs < nexpected_args {
    -            let available_defaults = match defaults.borrow().payload {
    -                PyObjectPayload::Sequence { ref elements } => elements.clone(),
    -                PyObjectPayload::None => vec![],
    -                _ => panic!("function defaults not tuple or None"),
    +            let available_defaults = if defaults.is(&self.get_none()) {
    +                vec![]
    +            } else if let Some(list) = defaults.payload::<PyList>() {
    +                list.elements.borrow().clone()
    +            } else if let Some(tuple) = defaults.payload::<PyTuple>() {
    +                tuple.elements.borrow().clone()
    +            } else {
    +                panic!("function defaults not tuple or None");
                 };
     
                 // Given the number of defaults available, check all the arguments for which we
    @@ -1259,7 +1420,7 @@
                 let mut missing = vec![];
                 for i in 0..required_args {
                     let variable_name = &code_object.arg_names[i];
    -                if !scope.contains_key(variable_name) {
    +                if !locals.contains_key(variable_name) {
                         missing.push(variable_name)
                     }
                 }
    @@ -1275,9 +1436,12 @@
                 // the default if we don't already have a value
                 for (default_index, i) in (required_args..nexpected_args).enumerate() {
                     let arg_name = &code_object.arg_names[i];
    -                if !scope.contains_key(arg_name) {
    -                    self.ctx
    -                        .set_attr(scope, arg_name, available_defaults[default_index].clone());
    +                if !locals.contains_key(arg_name) {
    +                    locals.set_item(
    +                        &self.ctx,
    +                        arg_name,
    +                        available_defaults[default_index].clone(),
    +                    );
                     }
                 }
             };
    @@ -1285,7 +1449,7 @@
             // Check if kw only arguments are all present:
             let kwdefs: HashMap<String, String> = HashMap::new();
             for arg_name in &code_object.kwonlyarg_names {
    -            if !scope.contains_key(arg_name) {
    +            if !locals.contains_key(arg_name) {
                     if kwdefs.contains_key(arg_name) {
                         // If not yet specified, take the default value
                         unimplemented!();
    @@ -1302,10 +1466,7 @@
             Ok(())
         }
     
    -    pub fn extract_elements(
    -        &mut self,
    -        value: &PyObjectRef,
    -    ) -> Result<Vec<PyObjectRef>, PyObjectRef> {
    +    pub fn extract_elements(&self, value: &PyObjectRef) -> PyResult<Vec<PyObjectRef>> {
             // Extract elements from item, if possible:
             let elements = if objtype::isinstance(value, &self.ctx.tuple_type())
                 || objtype::isinstance(value, &self.ctx.list_type())
    @@ -1319,26 +1480,35 @@
         }
     
         // get_attribute should be used for full attribute access (usually from user code).
    -    pub fn get_attribute(&mut self, obj: PyObjectRef, attr_name: PyObjectRef) -> PyResult {
    +    pub fn get_attribute<T>(&self, obj: PyObjectRef, attr_name: T) -> PyResult
    +    where
    +        T: TryIntoRef<PyString>,
    +    {
    +        let attr_name = attr_name.try_into_ref(self)?;
             trace!("vm.__getattribute__: {:?} {:?}", obj, attr_name);
    -        self.call_method(&obj, "__getattribute__", vec![attr_name])
    +        self.call_method(&obj, "__getattribute__", vec![attr_name.into_object()])
    +    }
    +
    +    pub fn set_attr(
    +        &self,
    +        obj: &PyObjectRef,
    +        attr_name: PyObjectRef,
    +        attr_value: PyObjectRef,
    +    ) -> PyResult {
    +        self.call_method(&obj, "__setattr__", vec![attr_name, attr_value])
         }
     
    -    pub fn del_attr(&mut self, obj: &PyObjectRef, attr_name: PyObjectRef) -> PyResult {
    +    pub fn del_attr(&self, obj: &PyObjectRef, attr_name: PyObjectRef) -> PyResult {
             self.call_method(&obj, "__delattr__", vec![attr_name])
         }
     
         // get_method should be used for internal access to magic methods (by-passing
         // the full getattribute look-up.
    -    pub fn get_method(&mut self, obj: PyObjectRef, method_name: &str) -> PyResult {
    +    pub fn get_method(&self, obj: PyObjectRef, method_name: &str) -> PyResult {
             let cls = obj.typ();
             match cls.get_attr(method_name) {
                 Some(method) => self.call_get_descriptor(method, obj.clone()),
    -            None => Err(self.new_type_error(format!(
    -                "{} has no method {:?}",
    -                obj.borrow(),
    -                method_name
    -            ))),
    +            None => Err(self.new_type_error(format!("{} has no method {:?}", obj, method_name))),
             }
         }
     
    @@ -1347,23 +1517,17 @@
         /// Otherwise, or if the result is the special `NotImplemented` built-in constant,
         /// calls `unsupported` to determine fallback value.
         pub fn call_or_unsupported<F>(
    -        &mut self,
    +        &self,
             obj: PyObjectRef,
             arg: PyObjectRef,
             method: &str,
             unsupported: F,
         ) -> PyResult
         where
    -        F: Fn(&mut VirtualMachine, PyObjectRef, PyObjectRef) -> PyResult,
    +        F: Fn(&VirtualMachine, PyObjectRef, PyObjectRef) -> PyResult,
         {
             if let Ok(method) = self.get_method(obj.clone(), method) {
    -            let result = self.invoke(
    -                method,
    -                PyFuncArgs {
    -                    args: vec![arg.clone()],
    -                    kwargs: vec![],
    -                },
    -            )?;
    +            let result = self.invoke(method, vec![arg.clone()])?;
                 if !result.is(&self.ctx.not_implemented()) {
                     return Ok(result);
                 }
    @@ -1383,12 +1547,12 @@
         /// 2. If above is not implemented, calls `__rand__` with `rhs` and `lhs`.
         /// 3. If above is not implemented, invokes `unsupported` for the result.
         pub fn call_or_reflection(
    -        &mut self,
    +        &self,
             lhs: PyObjectRef,
             rhs: PyObjectRef,
             default: &str,
             reflection: &str,
    -        unsupported: fn(&mut VirtualMachine, PyObjectRef, PyObjectRef) -> PyResult,
    +        unsupported: fn(&VirtualMachine, PyObjectRef, PyObjectRef) -> PyResult,
         ) -> PyResult {
             // Try to call the default method
             self.call_or_unsupported(lhs, rhs, default, move |vm, lhs, rhs| {
    @@ -1397,13 +1561,21 @@
             })
         }
     
    -    pub fn _sub(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn serialize(&self, obj: &PyObjectRef) -> PyResult<String> {
    +        crate::stdlib::json::ser_pyobject(self, obj)
    +    }
    +
    +    pub fn deserialize(&self, s: &str) -> PyResult {
    +        crate::stdlib::json::de_pyobject(self, s)
    +    }
    +
    +    pub fn _sub(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__sub__", "__rsub__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "-"))
             })
         }
     
    -    pub fn _isub(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _isub(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__isub__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__sub__", "__rsub__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "-="))
    @@ -1411,13 +1583,13 @@
             })
         }
     
    -    pub fn _add(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _add(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__add__", "__radd__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "+"))
             })
         }
     
    -    pub fn _iadd(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _iadd(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__iadd__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__add__", "__radd__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "+="))
    @@ -1425,13 +1597,13 @@
             })
         }
     
    -    pub fn _mul(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _mul(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__mul__", "__rmul__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "*"))
             })
         }
     
    -    pub fn _imul(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _imul(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__imul__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__mul__", "__rmul__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "*="))
    @@ -1439,13 +1611,13 @@
             })
         }
     
    -    pub fn _matmul(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _matmul(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__matmul__", "__rmatmul__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "@"))
             })
         }
     
    -    pub fn _imatmul(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _imatmul(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__imatmul__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__matmul__", "__rmatmul__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "@="))
    @@ -1453,13 +1625,13 @@
             })
         }
     
    -    pub fn _truediv(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _truediv(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__truediv__", "__rtruediv__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "/"))
             })
         }
     
    -    pub fn _itruediv(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _itruediv(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__itruediv__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__truediv__", "__rtruediv__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "/="))
    @@ -1467,13 +1639,13 @@
             })
         }
     
    -    pub fn _floordiv(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _floordiv(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__floordiv__", "__rfloordiv__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "//"))
             })
         }
     
    -    pub fn _ifloordiv(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _ifloordiv(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__ifloordiv__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__floordiv__", "__rfloordiv__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "//="))
    @@ -1481,13 +1653,13 @@
             })
         }
     
    -    pub fn _pow(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _pow(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__pow__", "__rpow__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "**"))
             })
         }
     
    -    pub fn _ipow(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _ipow(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__ipow__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__pow__", "__rpow__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "**="))
    @@ -1495,13 +1667,13 @@
             })
         }
     
    -    pub fn _mod(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _mod(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__mod__", "__rmod__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "%"))
             })
         }
     
    -    pub fn _imod(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _imod(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__imod__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__mod__", "__rmod__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "%="))
    @@ -1509,13 +1681,13 @@
             })
         }
     
    -    pub fn _lshift(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _lshift(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__lshift__", "__rlshift__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "<<"))
             })
         }
     
    -    pub fn _ilshift(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _ilshift(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__ilshift__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__lshift__", "__rlshift__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "<<="))
    @@ -1523,13 +1695,13 @@
             })
         }
     
    -    pub fn _rshift(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _rshift(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__rshift__", "__rrshift__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, ">>"))
             })
         }
     
    -    pub fn _irshift(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _irshift(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__irshift__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__rshift__", "__rrshift__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, ">>="))
    @@ -1537,13 +1709,13 @@
             })
         }
     
    -    pub fn _xor(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _xor(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__xor__", "__rxor__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "^"))
             })
         }
     
    -    pub fn _ixor(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _ixor(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__ixor__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__xor__", "__rxor__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "^="))
    @@ -1551,13 +1723,13 @@
             })
         }
     
    -    pub fn _or(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _or(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__or__", "__ror__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "|"))
             })
         }
     
    -    pub fn _ior(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _ior(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__ior__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__or__", "__ror__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "|="))
    @@ -1565,13 +1737,13 @@
             })
         }
     
    -    pub fn _and(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _and(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__and__", "__rand__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "&"))
             })
         }
     
    -    pub fn _iand(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _iand(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_unsupported(a, b, "__iand__", |vm, a, b| {
                 vm.call_or_reflection(a, b, "__and__", "__rand__", |vm, a, b| {
                     Err(vm.new_unsupported_operand_error(a, b, "&="))
    @@ -1579,44 +1751,50 @@
             })
         }
     
    -    pub fn _eq(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _eq(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__eq__", "__eq__", |vm, a, b| {
                 Ok(vm.new_bool(a.is(&b)))
             })
         }
     
    -    pub fn _ne(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _ne(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__ne__", "__ne__", |vm, a, b| {
                 let eq = vm._eq(a, b)?;
                 objbool::not(vm, &eq)
             })
         }
     
    -    pub fn _lt(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _lt(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__lt__", "__gt__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "<"))
             })
         }
     
    -    pub fn _le(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _le(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__le__", "__ge__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, "<="))
             })
         }
     
    -    pub fn _gt(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _gt(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__gt__", "__lt__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, ">"))
             })
         }
     
    -    pub fn _ge(&mut self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
    +    pub fn _ge(&self, a: PyObjectRef, b: PyObjectRef) -> PyResult {
             self.call_or_reflection(a, b, "__ge__", "__le__", |vm, a, b| {
                 Err(vm.new_unsupported_operand_error(a, b, ">="))
             })
         }
     }
     
    +impl Default for VirtualMachine {
    +    fn default() -> Self {
    +        VirtualMachine::new()
    +    }
    +}
    +
     lazy_static! {
         static ref REPR_GUARDS: Mutex<HashSet<usize>> = { Mutex::new(HashSet::new()) };
     }
    @@ -1666,7 +1844,7 @@
             let b = vm.ctx.new_int(12_i32);
             let res = vm._add(a, b).unwrap();
             let value = objint::get_value(&res);
    -        assert_eq!(value, 45_i32.to_bigint().unwrap());
    +        assert_eq!(*value, 45_i32.to_bigint().unwrap());
         }
     
         #[test]
    @@ -1680,4 +1858,4 @@
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_wasm/browser_module.rs.html b/src/rustpython_wasm/browser_module.rs.html new file mode 100644 index 0000000..ebb4d53 --- /dev/null +++ b/src/rustpython_wasm/browser_module.rs.html @@ -0,0 +1,685 @@ +browser_module.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    +175
    +176
    +177
    +178
    +179
    +180
    +181
    +182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    +217
    +218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +246
    +247
    +248
    +249
    +250
    +251
    +252
    +253
    +254
    +255
    +256
    +257
    +258
    +259
    +260
    +261
    +262
    +263
    +264
    +265
    +266
    +267
    +268
    +269
    +270
    +271
    +272
    +273
    +274
    +275
    +276
    +277
    +278
    +279
    +280
    +281
    +282
    +283
    +284
    +285
    +286
    +287
    +288
    +289
    +290
    +291
    +292
    +293
    +294
    +295
    +296
    +297
    +298
    +299
    +300
    +301
    +302
    +303
    +304
    +305
    +306
    +307
    +308
    +309
    +310
    +311
    +312
    +313
    +314
    +315
    +316
    +317
    +318
    +319
    +320
    +321
    +322
    +323
    +324
    +325
    +326
    +327
    +328
    +329
    +330
    +331
    +332
    +333
    +334
    +335
    +336
    +337
    +338
    +339
    +340
    +341
    +
    +use std::path::PathBuf;
    +
    +use futures::Future;
    +use js_sys::Promise;
    +use num_traits::cast::ToPrimitive;
    +use wasm_bindgen::prelude::*;
    +use wasm_bindgen::JsCast;
    +use wasm_bindgen_futures::{future_to_promise, JsFuture};
    +
    +use rustpython_vm::function::PyFuncArgs;
    +use rustpython_vm::import::import_module;
    +use rustpython_vm::obj::{objint, objstr};
    +use rustpython_vm::pyobject::{
    +    AttributeProtocol, PyContext, PyObject, PyObjectRef, PyResult, PyValue, TypeProtocol,
    +};
    +use rustpython_vm::VirtualMachine;
    +
    +use crate::{convert, vm_class::AccessibleVM, wasm_builtins::window};
    +
    +enum FetchResponseFormat {
    +    Json,
    +    Text,
    +    ArrayBuffer,
    +}
    +
    +impl FetchResponseFormat {
    +    fn from_str(vm: &VirtualMachine, s: &str) -> Result<Self, PyObjectRef> {
    +        match s {
    +            "json" => Ok(FetchResponseFormat::Json),
    +            "text" => Ok(FetchResponseFormat::Text),
    +            "array_buffer" => Ok(FetchResponseFormat::ArrayBuffer),
    +            _ => Err(vm.new_type_error("Unkown fetch response_format".into())),
    +        }
    +    }
    +    fn get_response(&self, response: &web_sys::Response) -> Result<Promise, JsValue> {
    +        match self {
    +            FetchResponseFormat::Json => response.json(),
    +            FetchResponseFormat::Text => response.text(),
    +            FetchResponseFormat::ArrayBuffer => response.array_buffer(),
    +        }
    +    }
    +}
    +
    +fn browser_fetch(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(url, Some(vm.ctx.str_type()))]);
    +
    +    let promise_type = import_promise_type(vm)?;
    +
    +    let response_format =
    +        args.get_optional_kwarg_with_type("response_format", vm.ctx.str_type(), vm)?;
    +    let method = args.get_optional_kwarg_with_type("method", vm.ctx.str_type(), vm)?;
    +    let headers = args.get_optional_kwarg_with_type("headers", vm.ctx.dict_type(), vm)?;
    +    let body = args.get_optional_kwarg("body");
    +    let content_type = args.get_optional_kwarg_with_type("content_type", vm.ctx.str_type(), vm)?;
    +
    +    let response_format = match response_format {
    +        Some(s) => FetchResponseFormat::from_str(vm, &objstr::get_value(&s))?,
    +        None => FetchResponseFormat::Text,
    +    };
    +
    +    let mut opts = web_sys::RequestInit::new();
    +
    +    match method {
    +        Some(s) => opts.method(&objstr::get_value(&s)),
    +        None => opts.method("GET"),
    +    };
    +
    +    if let Some(body) = body {
    +        opts.body(Some(&convert::py_to_js(vm, body)));
    +    }
    +
    +    let request = web_sys::Request::new_with_str_and_init(&objstr::get_value(url), &opts)
    +        .map_err(|err| convert::js_py_typeerror(vm, err))?;
    +
    +    if let Some(headers) = headers {
    +        let h = request.headers();
    +        for (key, value) in rustpython_vm::obj::objdict::get_key_value_pairs(&headers) {
    +            let key = &vm.to_str(&key)?.value;
    +            let value = &vm.to_str(&value)?.value;
    +            h.set(key, value)
    +                .map_err(|err| convert::js_py_typeerror(vm, err))?;
    +        }
    +    }
    +
    +    if let Some(content_type) = content_type {
    +        request
    +            .headers()
    +            .set("Content-Type", &objstr::get_value(&content_type))
    +            .map_err(|err| convert::js_py_typeerror(vm, err))?;
    +    }
    +
    +    let window = window();
    +    let request_prom = window.fetch_with_request(&request);
    +
    +    let future = JsFuture::from(request_prom)
    +        .and_then(move |val| {
    +            let response = val
    +                .dyn_into::<web_sys::Response>()
    +                .expect("val to be of type Response");
    +            response_format.get_response(&response)
    +        })
    +        .and_then(JsFuture::from);
    +
    +    Ok(PyPromise::new_obj(promise_type, future_to_promise(future)))
    +}
    +
    +fn browser_request_animation_frame(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(func, Some(vm.ctx.function_type()))]);
    +
    +    use std::{cell::RefCell, rc::Rc};
    +
    +    // this basic setup for request_animation_frame taken from:
    +    // https://rustwasm.github.io/wasm-bindgen/examples/request-animation-frame.html
    +
    +    let f = Rc::new(RefCell::new(None));
    +    let g = f.clone();
    +
    +    let func = func.clone();
    +
    +    let acc_vm = AccessibleVM::from(vm);
    +
    +    *g.borrow_mut() = Some(Closure::wrap(Box::new(move |time: f64| {
    +        let stored_vm = acc_vm
    +            .upgrade()
    +            .expect("that the vm is valid from inside of request_animation_frame");
    +        let vm = &stored_vm.vm;
    +        let func = func.clone();
    +        let args = vec![vm.ctx.new_float(time)];
    +        let _ = vm.invoke(func, args);
    +
    +        let closure = f.borrow_mut().take();
    +        drop(closure);
    +    }) as Box<Fn(f64)>));
    +
    +    let id = window()
    +        .request_animation_frame(&js_sys::Function::from(
    +            g.borrow().as_ref().unwrap().as_ref().clone(),
    +        ))
    +        .map_err(|err| convert::js_py_typeerror(vm, err))?;
    +
    +    Ok(vm.ctx.new_int(id))
    +}
    +
    +fn browser_cancel_animation_frame(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(id, Some(vm.ctx.int_type()))]);
    +
    +    let id = objint::get_value(id).to_i32().ok_or_else(|| {
    +        vm.new_exception(
    +            vm.ctx.exceptions.value_error.clone(),
    +            "Integer too large to convert to i32 for animationFrame id".into(),
    +        )
    +    })?;
    +
    +    window()
    +        .cancel_animation_frame(id)
    +        .map_err(|err| convert::js_py_typeerror(vm, err))?;
    +
    +    Ok(vm.get_none())
    +}
    +
    +#[derive(Debug)]
    +pub struct PyPromise {
    +    value: Promise,
    +}
    +
    +impl PyValue for PyPromise {
    +    fn class(vm: &VirtualMachine) -> PyObjectRef {
    +        vm.class(BROWSER_NAME, "Promise")
    +    }
    +}
    +
    +impl PyPromise {
    +    pub fn new_obj(promise_type: PyObjectRef, value: Promise) -> PyObjectRef {
    +        PyObject::new(PyPromise { value }, promise_type)
    +    }
    +}
    +
    +pub fn get_promise_value(obj: &PyObjectRef) -> Promise {
    +    if let Some(promise) = obj.payload::<PyPromise>() {
    +        return promise.value.clone();
    +    }
    +    panic!("Inner error getting promise")
    +}
    +
    +pub fn import_promise_type(vm: &VirtualMachine) -> PyResult {
    +    match import_module(vm, PathBuf::default(), BROWSER_NAME)?.get_attr("Promise") {
    +        Some(promise) => Ok(promise),
    +        None => Err(vm.new_not_implemented_error("No Promise".to_string())),
    +    }
    +}
    +
    +fn promise_then(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    let promise_type = import_promise_type(vm)?;
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [
    +            (zelf, Some(promise_type.clone())),
    +            (on_fulfill, Some(vm.ctx.function_type()))
    +        ],
    +        optional = [(on_reject, Some(vm.ctx.function_type()))]
    +    );
    +
    +    let on_fulfill = on_fulfill.clone();
    +    let on_reject = on_reject.cloned();
    +
    +    let acc_vm = AccessibleVM::from(vm);
    +
    +    let promise = get_promise_value(zelf);
    +
    +    let ret_future = JsFuture::from(promise).then(move |res| {
    +        let stored_vm = &acc_vm
    +            .upgrade()
    +            .expect("that the vm is valid when the promise resolves");
    +        let vm = &stored_vm.vm;
    +        let ret = match res {
    +            Ok(val) => {
    +                let val = convert::js_to_py(vm, val);
    +                vm.invoke(on_fulfill, PyFuncArgs::new(vec![val], vec![]))
    +            }
    +            Err(err) => {
    +                if let Some(on_reject) = on_reject {
    +                    let err = convert::js_to_py(vm, err);
    +                    vm.invoke(on_reject, PyFuncArgs::new(vec![err], vec![]))
    +                } else {
    +                    return Err(err);
    +                }
    +            }
    +        };
    +        convert::pyresult_to_jsresult(vm, ret)
    +    });
    +
    +    let ret_promise = future_to_promise(ret_future);
    +
    +    Ok(PyPromise::new_obj(promise_type, ret_promise))
    +}
    +
    +fn promise_catch(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    let promise_type = import_promise_type(vm)?;
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [
    +            (zelf, Some(promise_type.clone())),
    +            (on_reject, Some(vm.ctx.function_type()))
    +        ]
    +    );
    +
    +    let on_reject = on_reject.clone();
    +
    +    let acc_vm = AccessibleVM::from(vm);
    +
    +    let promise = get_promise_value(zelf);
    +
    +    let ret_future = JsFuture::from(promise).then(move |res| match res {
    +        Ok(val) => Ok(val),
    +        Err(err) => {
    +            let stored_vm = acc_vm
    +                .upgrade()
    +                .expect("that the vm is valid when the promise resolves");
    +            let vm = &stored_vm.vm;
    +            let err = convert::js_to_py(vm, err);
    +            let res = vm.invoke(on_reject, PyFuncArgs::new(vec![err], vec![]));
    +            convert::pyresult_to_jsresult(vm, res)
    +        }
    +    });
    +
    +    let ret_promise = future_to_promise(ret_future);
    +
    +    Ok(PyPromise::new_obj(promise_type, ret_promise))
    +}
    +
    +fn browser_alert(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(message, Some(vm.ctx.str_type()))]);
    +
    +    window()
    +        .alert_with_message(&objstr::get_value(message))
    +        .expect("alert() not to fail");
    +
    +    Ok(vm.get_none())
    +}
    +
    +fn browser_confirm(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(vm, args, required = [(message, Some(vm.ctx.str_type()))]);
    +
    +    let result = window()
    +        .confirm_with_message(&objstr::get_value(message))
    +        .expect("confirm() not to fail");
    +
    +    Ok(vm.new_bool(result))
    +}
    +
    +fn browser_prompt(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
    +    arg_check!(
    +        vm,
    +        args,
    +        required = [(message, Some(vm.ctx.str_type()))],
    +        optional = [(default, Some(vm.ctx.str_type()))]
    +    );
    +
    +    let result = if let Some(default) = default {
    +        window().prompt_with_message_and_default(
    +            &objstr::get_value(message),
    +            &objstr::get_value(default),
    +        )
    +    } else {
    +        window().prompt_with_message(&objstr::get_value(message))
    +    };
    +
    +    let result = match result.expect("prompt() not to fail") {
    +        Some(result) => vm.new_str(result),
    +        None => vm.get_none(),
    +    };
    +
    +    Ok(result)
    +}
    +
    +const BROWSER_NAME: &str = "browser";
    +
    +pub fn make_module(ctx: &PyContext) -> PyObjectRef {
    +    let promise = py_class!(ctx, "Promise", ctx.object(), {
    +        "then" => ctx.new_rustfunc(promise_then),
    +        "catch" => ctx.new_rustfunc(promise_catch)
    +    });
    +
    +    py_module!(ctx, BROWSER_NAME, {
    +        "fetch" => ctx.new_rustfunc(browser_fetch),
    +        "request_animation_frame" => ctx.new_rustfunc(browser_request_animation_frame),
    +        "cancel_animation_frame" => ctx.new_rustfunc(browser_cancel_animation_frame),
    +        "Promise" => promise,
    +        "alert" => ctx.new_rustfunc(browser_alert),
    +        "confirm" => ctx.new_rustfunc(browser_confirm),
    +        "prompt" => ctx.new_rustfunc(browser_prompt),
    +    })
    +}
    +
    +pub fn setup_browser_module(vm: &VirtualMachine) {
    +    vm.stdlib_inits
    +        .borrow_mut()
    +        .insert(BROWSER_NAME.to_string(), Box::new(make_module));
    +}
    +
    +
    \ No newline at end of file diff --git a/src/rustpython_wasm/convert.rs.html b/src/rustpython_wasm/convert.rs.html index 99e38f0..51ad436 100644 --- a/src/rustpython_wasm/convert.rs.html +++ b/src/rustpython_wasm/convert.rs.html @@ -1,4 +1,4 @@ -convert.rs.html -- source
      1
    +convert.rs.html -- source
      1
       2
       3
       4
    @@ -190,45 +190,135 @@
     190
     191
     192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    +217
    +218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
     
    -use crate::vm_class::{AccessibleVM, WASMVirtualMachine};
    -use js_sys::{Array, ArrayBuffer, Object, Reflect, Uint8Array};
    -use rustpython_vm::obj::{objbytes, objtype};
    -use rustpython_vm::pyobject::{self, PyFuncArgs, PyObjectRef, PyResult};
    -use rustpython_vm::VirtualMachine;
    +use js_sys::{Array, ArrayBuffer, Object, Promise, Reflect, Uint8Array};
    +use num_traits::cast::ToPrimitive;
     use wasm_bindgen::{closure::Closure, prelude::*, JsCast};
     
    -pub fn py_str_err(vm: &mut VirtualMachine, py_err: &PyObjectRef) -> String {
    -    vm.to_pystr(&py_err)
    -        .unwrap_or_else(|_| "Error, and error getting error message".into())
    +use rustpython_vm::function::PyFuncArgs;
    +use rustpython_vm::obj::{objbytes, objint, objsequence, objtype};
    +use rustpython_vm::pyobject::{AttributeProtocol, DictProtocol, PyObjectRef, PyResult};
    +use rustpython_vm::VirtualMachine;
    +
    +use crate::browser_module;
    +use crate::vm_class::{AccessibleVM, WASMVirtualMachine};
    +
    +pub fn py_err_to_js_err(vm: &VirtualMachine, py_err: &PyObjectRef) -> JsValue {
    +    macro_rules! map_exceptions {
    +        ($py_exc:ident, $msg:expr, { $($py_exc_ty:expr => $js_err_new:expr),*$(,)? }) => {
    +            $(if objtype::isinstance($py_exc, $py_exc_ty) {
    +                JsValue::from($js_err_new($msg))
    +            } else)* {
    +                JsValue::from(js_sys::Error::new($msg))
    +            }
    +        };
    +    }
    +    let msg = match py_err
    +        .get_attr("msg")
    +        .and_then(|msg| vm.to_pystr(&msg).ok())
    +    {
    +        Some(msg) => msg,
    +        None => return js_sys::Error::new("error getting error").into(),
    +    };
    +    let js_err = map_exceptions!(py_err,& msg, {
    +        // TypeError is sort of a catch-all for "this value isn't what I thought it was like"
    +        &vm.ctx.exceptions.type_error => js_sys::TypeError::new,
    +        &vm.ctx.exceptions.value_error => js_sys::TypeError::new,
    +        &vm.ctx.exceptions.index_error => js_sys::TypeError::new,
    +        &vm.ctx.exceptions.key_error => js_sys::TypeError::new,
    +        &vm.ctx.exceptions.attribute_error => js_sys::TypeError::new,
    +        &vm.ctx.exceptions.name_error => js_sys::ReferenceError::new,
    +        &vm.ctx.exceptions.syntax_error => js_sys::SyntaxError::new,
    +    });
    +    if let Some(tb) = py_err.get_attr("__traceback__") {
    +        if objtype::isinstance(&tb, &vm.ctx.list_type()) {
    +            let elements = objsequence::get_elements(&tb).to_vec();
    +            if let Some(top) = elements.get(0) {
    +                if objtype::isinstance(&top, &vm.ctx.tuple_type()) {
    +                    let element = objsequence::get_elements(&top);
    +
    +                    if let Some(lineno) = objint::to_int(vm, &element[1], 10)
    +                        .ok()
    +                        .and_then(|lineno| lineno.to_u32())
    +                    {
    +                        let _ = Reflect::set(&js_err, &"row".into(), &lineno.into());
    +                    }
    +                }
    +            }
    +        }
    +    }
    +    js_err
     }
     
    -pub fn js_py_typeerror(vm: &mut VirtualMachine, js_err: JsValue) -> PyObjectRef {
    +pub fn js_py_typeerror(vm: &VirtualMachine, js_err: JsValue) -> PyObjectRef {
         let msg = js_err.unchecked_into::<js_sys::Error>().to_string();
         vm.new_type_error(msg.into())
     }
     
    -pub fn py_to_js(vm: &mut VirtualMachine, py_obj: PyObjectRef) -> JsValue {
    +pub fn py_to_js(vm: &VirtualMachine, py_obj: PyObjectRef) -> JsValue {
         if let Some(ref wasm_id) = vm.wasm_id {
             if objtype::isinstance(&py_obj, &vm.ctx.function_type()) {
                 let wasm_vm = WASMVirtualMachine {
                     id: wasm_id.clone(),
                 };
    -            let mut py_obj = Some(py_obj);
    +            let weak_py_obj = wasm_vm.push_held_rc(py_obj).unwrap();
    +
                 let closure =
                     move |args: Option<Array>, kwargs: Option<Object>| -> Result<JsValue, JsValue> {
                         let py_obj = match wasm_vm.assert_valid() {
    -                        Ok(_) => py_obj.clone().expect("py_obj to be valid if VM is valid"),
    +                        Ok(_) => weak_py_obj
    +                            .upgrade()
    +                            .expect("weak_py_obj to be valid if VM is valid"),
                             Err(err) => {
    -                            py_obj = None;
                                 return Err(err);
                             }
                         };
                         let acc_vm = AccessibleVM::from(wasm_vm.clone());
    -                    let vm = &mut acc_vm
    +                    let stored_vm = acc_vm
                             .upgrade()
                             .expect("acc. VM to be invalid when WASM vm is valid");
    -                    let mut py_func_args = rustpython_vm::pyobject::PyFuncArgs::default();
    +                    let vm = &stored_vm.vm;
    +                    let mut py_func_args = PyFuncArgs::default();
                         if let Some(ref args) = args {
                             for arg in args.values() {
                                 py_func_args.args.push(js_to_py(vm, arg?));
    @@ -249,12 +339,20 @@
                     as Box<dyn FnMut(Option<Array>, Option<Object>) -> Result<JsValue, JsValue>>);
                 let func = closure.as_ref().clone();
     
    -            // TODO: Come up with a way of managing closure handles
    +            // stores pretty much nothing, it's fine to leak this because if it gets dropped
    +            // the error message is worse
                 closure.forget();
     
                 return func;
             }
         }
    +    // the browser module might not be injected
    +    if let Ok(promise_type) = browser_module::import_promise_type(vm) {
    +        if objtype::isinstance(&py_obj, &promise_type) {
    +            return browser_module::get_promise_value(&py_obj).into();
    +        }
    +    }
    +
         if objtype::isinstance(&py_obj, &vm.ctx.bytes_type())
             || objtype::isinstance(&py_obj, &vm.ctx.bytearray_type())
         {
    @@ -266,18 +364,8 @@
             }
             arr.into()
         } else {
    -        let dumps = rustpython_vm::import::import(
    -            vm,
    -            std::path::PathBuf::default(),
    -            "json",
    -            &Some("dumps".into()),
    -        )
    -        .expect("Couldn't get json.dumps function");
    -        match vm.invoke(dumps, pyobject::PyFuncArgs::new(vec![py_obj], vec![])) {
    -            Ok(value) => {
    -                let json = vm.to_pystr(&value).unwrap();
    -                js_sys::JSON::parse(&json).unwrap_or(JsValue::UNDEFINED)
    -            }
    +        match vm.serialize(&py_obj) {
    +            Ok(json) => js_sys::JSON::parse(&json).unwrap_or(JsValue::UNDEFINED),
                 Err(_) => JsValue::UNDEFINED,
             }
         }
    @@ -293,14 +381,20 @@
         })
     }
     
    -pub fn pyresult_to_jsresult(vm: &mut VirtualMachine, result: PyResult) -> Result<JsValue, JsValue> {
    +pub fn pyresult_to_jsresult(vm: &VirtualMachine, result: PyResult) -> Result<JsValue, JsValue> {
         result
             .map(|value| py_to_js(vm, value))
    -        .map_err(|err| py_str_err(vm, &err).into())
    +        .map_err(|err| py_err_to_js_err(vm, &err))
     }
     
    -pub fn js_to_py(vm: &mut VirtualMachine, js_val: JsValue) -> PyObjectRef {
    +pub fn js_to_py(vm: &VirtualMachine, js_val: JsValue) -> PyObjectRef {
         if js_val.is_object() {
    +        if let Some(promise) = js_val.dyn_ref::<Promise>() {
    +            // the browser module might not be injected
    +            if let Ok(promise_type) = browser_module::import_promise_type(vm) {
    +                return browser_module::PyPromise::new_obj(promise_type, promise.clone());
    +            }
    +        }
             if Array::is_array(&js_val) {
                 let js_arr: Array = js_val.into();
                 let elems = js_arr
    @@ -327,15 +421,14 @@
                 for pair in object_entries(&Object::from(js_val)) {
                     let (key, val) = pair.expect("iteration over object to not fail");
                     let py_val = js_to_py(vm, val);
    -                vm.ctx
    -                    .set_item(&dict, &String::from(js_sys::JsString::from(key)), py_val);
    +                dict.set_item(&vm.ctx, &String::from(js_sys::JsString::from(key)), py_val);
                 }
                 dict
             }
         } else if js_val.is_function() {
             let func = js_sys::Function::from(js_val);
    -        vm.ctx.new_rustfunc(
    -            move |vm: &mut VirtualMachine, args: PyFuncArgs| -> PyResult {
    +        vm.ctx
    +            .new_rustfunc(move |vm: &VirtualMachine, args: PyFuncArgs| -> PyResult {
                     let func = func.clone();
                     let this = Object::new();
                     for (k, v) in args.kwargs {
    @@ -349,8 +442,7 @@
                     func.apply(&this, &js_args)
                         .map(|val| js_to_py(vm, val))
                         .map_err(|err| js_to_py(vm, err))
    -            },
    -        )
    +            })
         } else if let Some(err) = js_val.dyn_ref::<js_sys::Error>() {
             let exc_type = match String::from(err.name()).as_str() {
                 "TypeError" => &vm.ctx.exceptions.type_error,
    @@ -364,24 +456,12 @@
             // Because `JSON.stringify(undefined)` returns undefined
             vm.get_none()
         } else {
    -        let loads = rustpython_vm::import::import(
    -            vm,
    -            std::path::PathBuf::default(),
    -            "json",
    -            &Some("loads".into()),
    -        )
    -        .expect("json.loads function to be available");
    -
             let json = match js_sys::JSON::stringify(&js_val) {
                 Ok(json) => String::from(json),
                 Err(_) => return vm.get_none(),
             };
    -        let py_json = vm.new_str(json);
    -
    -        vm.invoke(loads, pyobject::PyFuncArgs::new(vec![py_json], vec![]))
    -            // can safely unwrap because we know it's valid JSON
    -            .unwrap()
    +        vm.deserialize(&json).unwrap_or_else(|_| vm.get_none())
         }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_wasm/lib.rs.html b/src/rustpython_wasm/lib.rs.html index 6972ddc..ea14d68 100644 --- a/src/rustpython_wasm/lib.rs.html +++ b/src/rustpython_wasm/lib.rs.html @@ -1,112 +1,152 @@ -lib.rs.html -- source
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    +lib.rs.html -- source
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
     
    +pub mod browser_module;
     pub mod convert;
     pub mod vm_class;
     pub mod wasm_builtins;
     
     extern crate futures;
     extern crate js_sys;
    +#[macro_use]
     extern crate rustpython_vm;
     extern crate wasm_bindgen;
    +extern crate wasm_bindgen_futures;
     extern crate web_sys;
     
     use js_sys::{Object, Reflect, TypeError};
    +use std::panic;
     use wasm_bindgen::prelude::*;
     
     pub use crate::vm_class::*;
     
     const PY_EVAL_VM_ID: &str = "__py_eval_vm";
     
    -extern crate console_error_panic_hook;
    +fn panic_hook(info: &panic::PanicInfo) {
    +    // If something errors, just ignore it; we don't want to panic in the panic hook
    +    use js_sys::WebAssembly::RuntimeError;
    +    let window = match web_sys::window() {
    +        Some(win) => win,
    +        None => return,
    +    };
    +    let msg = &info.to_string();
    +    let _ = Reflect::set(&window, &"__RUSTPYTHON_ERROR_MSG".into(), &msg.into());
    +    let error = RuntimeError::new(&msg);
    +    let _ = Reflect::set(&window, &"__RUSTPYTHON_ERROR".into(), &error);
    +    let stack = match Reflect::get(&error, &"stack".into()) {
    +        Ok(stack) => stack,
    +        Err(_) => return,
    +    };
    +    let _ = Reflect::set(&window, &"__RUSTPYTHON_ERROR_STACK".into(), &stack);
    +}
     
     #[wasm_bindgen(start)]
     pub fn setup_console_error() {
    -    std::panic::set_hook(Box::new(console_error_panic_hook::hook));
    +    std::panic::set_hook(Box::new(panic_hook));
     }
     
     // Hack to comment out wasm-bindgen's generated typescript definitons
    @@ -172,4 +212,4 @@
     export function pyEval(code: string, options?: PyEvalOptions): any;
     "#;
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_wasm/vm_class.rs.html b/src/rustpython_wasm/vm_class.rs.html index 817f054..02b0bd0 100644 --- a/src/rustpython_wasm/vm_class.rs.html +++ b/src/rustpython_wasm/vm_class.rs.html @@ -1,4 +1,4 @@ -vm_class.rs.html -- source
      1
    +vm_class.rs.html -- source
      1
       2
       3
       4
    @@ -307,44 +307,99 @@
     307
     308
     309
    +310
    +311
    +312
    +313
    +314
    +315
    +316
    +317
    +318
    +319
    +320
    +321
    +322
    +323
    +324
    +325
    +326
    +327
    +328
    +329
    +330
    +331
    +332
    +333
    +334
    +335
    +336
    +337
    +338
    +339
    +340
    +341
    +342
    +343
    +344
    +345
    +346
    +347
    +348
    +349
     
    -use crate::convert;
    -use crate::wasm_builtins::{self, setup_wasm_builtins};
    -use js_sys::{SyntaxError, TypeError};
    -use rustpython_vm::{
    -    compile,
    -    pyobject::{PyFuncArgs, PyObjectRef, PyRef, PyResult},
    -    VirtualMachine,
    -};
     use std::cell::RefCell;
     use std::collections::HashMap;
     use std::rc::{Rc, Weak};
    +
    +use js_sys::{Object, Reflect, SyntaxError, TypeError};
     use wasm_bindgen::prelude::*;
     
    +use rustpython_vm::compile;
    +use rustpython_vm::frame::{NameProtocol, Scope};
    +use rustpython_vm::function::PyFuncArgs;
    +use rustpython_vm::pyobject::{PyContext, PyObjectRef, PyResult};
    +use rustpython_vm::VirtualMachine;
    +
    +use crate::browser_module::setup_browser_module;
    +use crate::convert;
    +use crate::wasm_builtins;
    +
    +pub trait HeldRcInner {}
    +
    +impl<T> HeldRcInner for T {}
    +
     pub(crate) struct StoredVirtualMachine {
         pub vm: VirtualMachine,
    -    pub scope: PyObjectRef,
    +    pub scope: RefCell<Scope>,
    +    /// you can put a Rc in here, keep it as a Weak, and it'll be held only for
    +    /// as long as the StoredVM is alive
    +    held_rcs: RefCell<Vec<Rc<dyn HeldRcInner>>>,
     }
     
     impl StoredVirtualMachine {
    -    fn new(id: String, inject_builtins: bool) -> StoredVirtualMachine {
    +    fn new(id: String, inject_browser_module: bool) -> StoredVirtualMachine {
             let mut vm = VirtualMachine::new();
    -        let builtin = vm.get_builtin_scope();
    -        let scope = vm.context().new_scope(Some(builtin));
    -        if inject_builtins {
    -            setup_wasm_builtins(&mut vm, &scope);
    +        let scope = vm.ctx.new_scope();
    +        if inject_browser_module {
    +            setup_browser_module(&vm);
             }
             vm.wasm_id = Some(id);
    -        StoredVirtualMachine { vm, scope }
    +        StoredVirtualMachine {
    +            vm,
    +            scope: RefCell::new(scope),
    +            held_rcs: RefCell::new(Vec::new()),
    +        }
         }
     }
     
    -// It's fine that it's thread local, since WASM doesn't even have threads yet. thread_local! probably
    -// gets compiled down to a normal-ish static varible, like Atomic* types:
    +// It's fine that it's thread local, since WASM doesn't even have threads yet. thread_local!
    +// probably gets compiled down to a normal-ish static varible, like Atomic* types do:
     // https://rustwasm.github.io/2018/10/24/multithreading-rust-and-wasm.html#atomic-instructions
     thread_local! {
    -    static STORED_VMS: PyRef<HashMap<String, PyRef<StoredVirtualMachine>>> = Rc::default();
    -    static ACTIVE_VMS: PyRef<HashMap<String, *mut VirtualMachine>> = Rc::default();
    +    static STORED_VMS: RefCell<HashMap<String, Rc<StoredVirtualMachine>>> =
    +        RefCell::default();
    +    static ACTIVE_VMS: RefCell<HashMap<String, *const VirtualMachine>> = RefCell::default();
     }
     
     #[wasm_bindgen(js_name = vmStore)]
    @@ -352,13 +407,13 @@
     
     #[wasm_bindgen(js_class = vmStore)]
     impl VMStore {
    -    pub fn init(id: String, inject_builtins: Option<bool>) -> WASMVirtualMachine {
    +    pub fn init(id: String, inject_browser_module: Option<bool>) -> WASMVirtualMachine {
             STORED_VMS.with(|cell| {
                 let mut vms = cell.borrow_mut();
                 if !vms.contains_key(&id) {
                     let stored_vm =
    -                    StoredVirtualMachine::new(id.clone(), inject_builtins.unwrap_or(true));
    -                vms.insert(id.clone(), Rc::new(RefCell::new(stored_vm)));
    +                    StoredVirtualMachine::new(id.clone(), inject_browser_module.unwrap_or(true));
    +                vms.insert(id.clone(), Rc::new(stored_vm));
                 }
             });
             WASMVirtualMachine { id }
    @@ -405,8 +460,8 @@
     }
     
     #[derive(Clone)]
    -pub struct AccessibleVM {
    -    weak: Weak<RefCell<StoredVirtualMachine>>,
    +pub(crate) struct AccessibleVM {
    +    weak: Weak<StoredVirtualMachine>,
         id: String,
     }
     
    @@ -417,35 +472,8 @@
             AccessibleVM { weak, id }
         }
     
    -    pub fn from_vm(vm: &VirtualMachine) -> AccessibleVM {
    -        AccessibleVM::from_id(
    -            vm.wasm_id
    -                .clone()
    -                .expect("VM passed to from_vm to have wasm_id be Some()"),
    -        )
    -    }
    -
    -    pub fn upgrade(&self) -> Option<AccessibleVMPtr> {
    -        let vm_cell = self.weak.upgrade()?;
    -        let top_level = match vm_cell.try_borrow_mut() {
    -            Ok(mut vm) => {
    -                ACTIVE_VMS.with(|cell| {
    -                    cell.borrow_mut().insert(self.id.clone(), &mut vm.vm);
    -                });
    -                true
    -            }
    -            Err(_) => false,
    -        };
    -        Some(ACTIVE_VMS.with(|cell| {
    -            let vms = cell.borrow();
    -            let ptr = vms.get(&self.id).expect("id to be in ACTIVE_VMS");
    -            let vm = unsafe { &mut **ptr };
    -            AccessibleVMPtr {
    -                id: self.id.clone(),
    -                top_level,
    -                inner: vm,
    -            }
    -        }))
    +    pub fn upgrade(&self) -> Option<Rc<StoredVirtualMachine>> {
    +        self.weak.upgrade()
         }
     }
     
    @@ -459,31 +487,13 @@
             AccessibleVM::from_id(vm.id.clone())
         }
     }
    -
    -pub struct AccessibleVMPtr<'a> {
    -    id: String,
    -    top_level: bool,
    -    inner: &'a mut VirtualMachine,
    -}
    -
    -impl std::ops::Deref for AccessibleVMPtr<'_> {
    -    type Target = VirtualMachine;
    -    fn deref(&self) -> &VirtualMachine {
    -        &self.inner
    -    }
    -}
    -impl std::ops::DerefMut for AccessibleVMPtr<'_> {
    -    fn deref_mut(&mut self) -> &mut VirtualMachine {
    -        &mut self.inner
    -    }
    -}
    -
    -impl Drop for AccessibleVMPtr<'_> {
    -    fn drop(&mut self) {
    -        if self.top_level {
    -            // remove the (now invalid) pointer from the map
    -            ACTIVE_VMS.with(|cell| cell.borrow_mut().remove(&self.id));
    -        }
    +impl From<&VirtualMachine> for AccessibleVM {
    +    fn from(vm: &VirtualMachine) -> AccessibleVM {
    +        AccessibleVM::from_id(
    +            vm.wasm_id
    +                .clone()
    +                .expect("VM passed to from::<VirtualMachine>() to have wasm_id be Some()"),
    +        )
         }
     }
     
    @@ -497,19 +507,18 @@
     impl WASMVirtualMachine {
         pub(crate) fn with_unchecked<F, R>(&self, f: F) -> R
         where
    -        F: FnOnce(&mut StoredVirtualMachine) -> R,
    +        F: FnOnce(&StoredVirtualMachine) -> R,
         {
             let stored_vm = STORED_VMS.with(|cell| {
                 let mut vms = cell.borrow_mut();
                 vms.get_mut(&self.id).unwrap().clone()
             });
    -        let mut stored_vm = stored_vm.borrow_mut();
    -        f(&mut stored_vm)
    +        f(&stored_vm)
         }
     
         pub(crate) fn with<F, R>(&self, f: F) -> Result<R, JsValue>
         where
    -        F: FnOnce(&mut StoredVirtualMachine) -> R,
    +        F: FnOnce(&StoredVirtualMachine) -> R,
         {
             self.assert_valid()?;
             Ok(self.with_unchecked(f))
    @@ -519,6 +528,17 @@
             STORED_VMS.with(|cell| cell.borrow().contains_key(&self.id))
         }
     
    +    pub(crate) fn push_held_rc<T: HeldRcInner + 'static>(
    +        &self,
    +        rc: Rc<T>,
    +    ) -> Result<Weak<T>, JsValue> {
    +        self.with(|stored_vm| {
    +            let weak = Rc::downgrade(&rc);
    +            stored_vm.held_rcs.borrow_mut().push(rc);
    +            weak
    +        })
    +    }
    +
         pub fn assert_valid(&self) -> Result<(), JsValue> {
             if self.valid() {
                 Ok(())
    @@ -540,70 +560,125 @@
         pub fn add_to_scope(&self, name: String, value: JsValue) -> Result<(), JsValue> {
             self.with(
                 move |StoredVirtualMachine {
    -                      ref mut vm,
    -                      ref mut scope,
    +                      ref vm, ref scope, ..
                       }| {
                     let value = convert::js_to_py(vm, value);
    -                vm.ctx.set_attr(scope, &name, value);
    +                scope.borrow_mut().store_name(&vm, &name, value);
                 },
             )
         }
     
         #[wasm_bindgen(js_name = setStdout)]
         pub fn set_stdout(&self, stdout: JsValue) -> Result<(), JsValue> {
    -        self.with(
    -            move |StoredVirtualMachine {
    -                      ref mut vm,
    -                      ref mut scope,
    -                  }| {
    -                let print_fn: Box<Fn(&mut VirtualMachine, PyFuncArgs) -> PyResult> =
    -                    if let Some(selector) = stdout.as_string() {
    -                        Box::new(
    -                            move |vm: &mut VirtualMachine, args: PyFuncArgs| -> PyResult {
    -                                wasm_builtins::builtin_print_html(vm, args, &selector)
    -                            },
    -                        )
    -                    } else if stdout.is_function() {
    -                        let func = js_sys::Function::from(stdout);
    -                        Box::new(
    -                            move |vm: &mut VirtualMachine, args: PyFuncArgs| -> PyResult {
    -                                func.call1(
    -                                    &JsValue::UNDEFINED,
    -                                    &wasm_builtins::format_print_args(vm, args)?.into(),
    -                                )
    -                                .map_err(|err| convert::js_to_py(vm, err))?;
    -                                Ok(vm.get_none())
    -                            },
    -                        )
    -                    } else if stdout.is_undefined() || stdout.is_null() {
    -                        Box::new(wasm_builtins::builtin_print_console)
    -                    } else {
    -                        return Err(TypeError::new(
    -                            "stdout must be null, a function or a css selector",
    +        self.with(move |StoredVirtualMachine { ref vm, .. }| {
    +            fn error() -> JsValue {
    +                TypeError::new("Unknown stdout option, please pass a function or 'console'").into()
    +            }
    +            let print_fn: Box<Fn(&VirtualMachine, PyFuncArgs) -> PyResult> =
    +                if let Some(s) = stdout.as_string() {
    +                    match s.as_str() {
    +                        "console" => Box::new(wasm_builtins::builtin_print_console),
    +                        _ => return Err(error()),
    +                    }
    +                } else if stdout.is_function() {
    +                    let func = js_sys::Function::from(stdout);
    +                    Box::new(move |vm: &VirtualMachine, args: PyFuncArgs| -> PyResult {
    +                        func.call1(
    +                            &JsValue::UNDEFINED,
    +                            &wasm_builtins::format_print_args(vm, args)?.into(),
                             )
    -                        .into());
    -                    };
    -                vm.ctx
    -                    .set_attr(scope, "print", vm.ctx.new_rustfunc_from_box(print_fn));
    -                Ok(())
    -            },
    -        )?
    +                        .map_err(|err| convert::js_to_py(vm, err))?;
    +                        Ok(vm.get_none())
    +                    })
    +                } else if stdout.is_undefined() || stdout.is_null() {
    +                    fn noop(vm: &VirtualMachine, _args: PyFuncArgs) -> PyResult {
    +                        Ok(vm.get_none())
    +                    }
    +                    Box::new(noop)
    +                } else {
    +                    return Err(error());
    +                };
    +            let rustfunc = vm.ctx.new_rustfunc(print_fn);
    +            vm.ctx.set_attr(&vm.builtins, "print", rustfunc);
    +            Ok(())
    +        })?
    +    }
    +
    +    #[wasm_bindgen(js_name = injectModule)]
    +    pub fn inject_module(&self, name: String, module: Object) -> Result<(), JsValue> {
    +        self.with(|StoredVirtualMachine { ref vm, .. }| {
    +            let mut module_items: HashMap<String, PyObjectRef> = HashMap::new();
    +            for entry in convert::object_entries(&module) {
    +                let (key, value) = entry?;
    +                let key = Object::from(key).to_string();
    +                module_items.insert(key.into(), convert::js_to_py(vm, value));
    +            }
    +
    +            let mod_name = name.clone();
    +
    +            let stdlib_init_fn = move |ctx: &PyContext| {
    +                let py_mod = ctx.new_module(&name, ctx.new_dict());
    +                for (key, value) in module_items.clone() {
    +                    ctx.set_attr(&py_mod, &key, value);
    +                }
    +                py_mod
    +            };
    +
    +            vm.stdlib_inits
    +                .borrow_mut()
    +                .insert(mod_name, Box::new(stdlib_init_fn));
    +
    +            Ok(())
    +        })?
         }
     
         fn run(&self, mut source: String, mode: compile::Mode) -> Result<JsValue, JsValue> {
             self.assert_valid()?;
             self.with_unchecked(
                 |StoredVirtualMachine {
    -                 ref mut vm,
    -                 ref mut scope,
    +                 ref vm, ref scope, ..
                  }| {
                     source.push('\n');
                     let code =
    -                    compile::compile(&source, &mode, "<wasm>".to_string(), vm.ctx.code_type())
    -                        .map_err(|err| {
    -                            SyntaxError::new(&format!("Error parsing Python code: {}", err))
    -                        })?;
    -                let result = vm.run_code_obj(code, scope.clone());
    +                    compile::compile(&source, &mode, "<wasm>".to_string(), vm.ctx.code_type());
    +                let code = code.map_err(|err| {
    +                    let js_err = SyntaxError::new(&format!("Error parsing Python code: {}", err));
    +                    if let rustpython_vm::error::CompileError::Parse(ref parse_error) = err {
    +                        use rustpython_parser::error::ParseError;
    +                        if let ParseError::EOF(Some(ref loc))
    +                        | ParseError::ExtraToken((ref loc, ..))
    +                        | ParseError::InvalidToken(ref loc)
    +                        | ParseError::UnrecognizedToken((ref loc, ..), _) = parse_error
    +                        {
    +                            let _ = Reflect::set(
    +                                &js_err,
    +                                &"row".into(),
    +                                &(loc.get_row() as u32).into(),
    +                            );
    +                            let _ = Reflect::set(
    +                                &js_err,
    +                                &"col".into(),
    +                                &(loc.get_column() as u32).into(),
    +                            );
    +                        }
    +                        if let ParseError::ExtraToken((_, _, ref loc))
    +                        | ParseError::UnrecognizedToken((_, _, ref loc), _) = parse_error
    +                        {
    +                            let _ = Reflect::set(
    +                                &js_err,
    +                                &"endrow".into(),
    +                                &(loc.get_row() as u32).into(),
    +                            );
    +                            let _ = Reflect::set(
    +                                &js_err,
    +                                &"endcol".into(),
    +                                &(loc.get_column() as u32).into(),
    +                            );
    +                        }
    +                    }
    +                    js_err
    +                })?;
    +                let result = vm.run_code_obj(code, scope.borrow().clone());
                     convert::pyresult_to_jsresult(vm, result)
                 },
             )
    @@ -616,6 +691,11 @@
         pub fn eval(&self, source: String) -> Result<JsValue, JsValue> {
             self.run(source, compile::Mode::Eval)
         }
    +
    +    #[wasm_bindgen(js_name = execSingle)]
    +    pub fn exec_single(&self, source: String) -> Result<JsValue, JsValue> {
    +        self.run(source, compile::Mode::Single)
    +    }
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/rustpython_wasm/wasm_builtins.rs.html b/src/rustpython_wasm/wasm_builtins.rs.html index 763f3e9..50fb479 100644 --- a/src/rustpython_wasm/wasm_builtins.rs.html +++ b/src/rustpython_wasm/wasm_builtins.rs.html @@ -1,154 +1,101 @@ -wasm_builtins.rs.html -- source
      1
    -  2
    -  3
    -  4
    -  5
    -  6
    -  7
    -  8
    -  9
    - 10
    - 11
    - 12
    - 13
    - 14
    - 15
    - 16
    - 17
    - 18
    - 19
    - 20
    - 21
    - 22
    - 23
    - 24
    - 25
    - 26
    - 27
    - 28
    - 29
    - 30
    - 31
    - 32
    - 33
    - 34
    - 35
    - 36
    - 37
    - 38
    - 39
    - 40
    - 41
    - 42
    - 43
    - 44
    - 45
    - 46
    - 47
    - 48
    - 49
    - 50
    - 51
    - 52
    - 53
    - 54
    - 55
    - 56
    - 57
    - 58
    - 59
    - 60
    - 61
    - 62
    - 63
    - 64
    - 65
    - 66
    - 67
    - 68
    - 69
    - 70
    - 71
    - 72
    - 73
    - 74
    - 75
    - 76
    - 77
    - 78
    - 79
    - 80
    - 81
    - 82
    - 83
    - 84
    - 85
    - 86
    - 87
    - 88
    - 89
    - 90
    - 91
    - 92
    - 93
    - 94
    - 95
    - 96
    - 97
    - 98
    - 99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    +wasm_builtins.rs.html -- source
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    +62
    +63
    +64
    +65
    +66
    +67
    +68
    +69
    +70
    +71
    +72
    +73
    +74
    +75
    +76
    +77
    +78
     
     //! Builtin function specific to WASM build.
     //!
     //! This is required because some feature like I/O works differently in the browser comparing to
     //! desktop.
    -//! Implements functions listed here: https://docs.python.org/3/library/builtins.html and some
    -//! others.
    +//! Implements functions listed here: https://docs.python.org/3/library/builtins.html.
     
    -extern crate futures;
    -extern crate js_sys;
    -extern crate wasm_bindgen;
    -extern crate web_sys;
    +use js_sys::{self, Array};
    +use web_sys::{self, console};
     
    -use crate::convert;
    -use js_sys::Array;
    +use rustpython_vm::function::PyFuncArgs;
     use rustpython_vm::obj::{objstr, objtype};
    -use rustpython_vm::pyobject::{IdProtocol, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol};
    +use rustpython_vm::pyobject::{IdProtocol, PyObjectRef, PyResult, TypeProtocol};
     use rustpython_vm::VirtualMachine;
    -use wasm_bindgen::{prelude::*, JsCast};
    -use web_sys::{console, HtmlTextAreaElement};
     
    -fn window() -> web_sys::Window {
    +pub(crate) fn window() -> web_sys::Window {
         web_sys::window().expect("Window to be available")
     }
     
    -// The HTML id of the textarea element that act as our STDOUT
    -
    -pub fn print_to_html(text: &str, selector: &str) -> Result<(), JsValue> {
    -    let document = window().document().expect("Document to be available");
    -    let element = document
    -        .query_selector(selector)?
    -        .ok_or_else(|| js_sys::TypeError::new("Couldn't get element"))?;
    -    let textarea = element
    -        .dyn_ref::<HtmlTextAreaElement>()
    -        .ok_or_else(|| js_sys::TypeError::new("Element must be a textarea"))?;
    -    let value = textarea.value();
    -    textarea.set_value(&format!("{}{}", value, text));
    -    Ok(())
    -}
    -
    -pub fn format_print_args(vm: &mut VirtualMachine, args: PyFuncArgs) -> Result<String, PyObjectRef> {
    +pub fn format_print_args(vm: &VirtualMachine, args: PyFuncArgs) -> Result<String, PyObjectRef> {
         // Handle 'sep' kwarg:
         let sep_arg = args
             .get_optional_kwarg("sep")
    @@ -200,13 +147,7 @@
         Ok(output)
     }
     
    -pub fn builtin_print_html(vm: &mut VirtualMachine, args: PyFuncArgs, selector: &str) -> PyResult {
    -    let output = format_print_args(vm, args)?;
    -    print_to_html(&output, selector).map_err(|err| convert::js_to_py(vm, err))?;
    -    Ok(vm.get_none())
    -}
    -
    -pub fn builtin_print_console(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
    +pub fn builtin_print_console(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
         let arr = Array::new();
         for arg in args.args {
             arr.push(&vm.to_pystr(&arg)?.into());
    @@ -214,10 +155,5 @@
         console::log(&arr);
         Ok(vm.get_none())
     }
    -
    -pub fn setup_wasm_builtins(vm: &mut VirtualMachine, scope: &PyObjectRef) {
    -    let ctx = vm.context();
    -    ctx.set_attr(scope, "print", ctx.new_rustfunc(builtin_print_console));
    -}
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/storage.js b/storage.js index 55551f9..33632ba 100644 --- a/storage.js +++ b/storage.js @@ -1,11 +1 @@ -var resourcesSuffix="";/*! - * Copyright 2018 The Rust Project Developers. See the COPYRIGHT - * file at the top-level directory of this distribution and at - * http://rust-lang.org/COPYRIGHT. - * - * Licensed under the Apache License, Version 2.0 or the MIT license - * , at your - * option. This file may not be copied, modified, or distributed - * except according to those terms. - */var currentTheme=document.getElementById("themeStyle");var mainTheme=document.getElementById("mainThemeStyle");var savedHref=[];function hasClass(elem,className){if(elem&&className&&elem.className){var elemClass=elem.className;var start=elemClass.indexOf(className);if(start===-1){return false;}else if(elemClass.length===className.length){return true;}else{if(start>0&&elemClass[start-1]!==' '){return false;}var end=start+className.length;return!(end0){elem.className+=' '+className;}else{elem.className=className;}}}function removeClass(elem,className){if(elem&&className&&elem.className){elem.className=(" "+elem.className+" ").replace(" "+className+" "," ").trim();}}function isHidden(elem){return(elem.offsetParent===null)}function onEach(arr,func,reversed){if(arr&&arr.length>0&&func){if(reversed!==true){for(var i=0;i=0;--i){if(func(arr[i])===true){return true;}}}}return false;}function usableLocalStorage(){if(typeof(Storage)==="undefined"){return false;}try{window.localStorage;}catch(err){return false;}return true;}function updateLocalStorage(name,value){if(usableLocalStorage()){localStorage[name]=value;}else{}}function getCurrentValue(name){if(usableLocalStorage()&&localStorage[name]!==undefined){return localStorage[name];}return null;}function switchTheme(styleElem,mainStyleElem,newTheme){var fullBasicCss="rustdoc"+resourcesSuffix+".css";var fullNewTheme=newTheme+resourcesSuffix+".css";var newHref=mainStyleElem.href.replace(fullBasicCss,fullNewTheme);if(styleElem.href===newHref){return;}var found=false;if(savedHref.length===0){onEach(document.getElementsByTagName("link"),function(el){savedHref.push(el.href);});}onEach(savedHref,function(el){if(el===newHref){found=true;return true;}});if(found===true){styleElem.href=newHref;updateLocalStorage('rustdoc-theme',newTheme);}}switchTheme(currentTheme,mainTheme,getCurrentValue('rustdoc-theme')||'light'); \ No newline at end of file +var resourcesSuffix="";var currentTheme=document.getElementById("themeStyle");var mainTheme=document.getElementById("mainThemeStyle");var savedHref=[];function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className);}function addClass(elem,className){if(!elem||!elem.classList){return;}elem.classList.add(className);}function removeClass(elem,className){if(!elem||!elem.classList){return;}elem.classList.remove(className);}function isHidden(elem){return elem.offsetParent===null;}function onEach(arr,func,reversed){if(arr&&arr.length>0&&func){var length=arr.length;if(reversed!==true){for(var i=0;i=0;--i){if(func(arr[i])===true){return true;}}}}return false;}function onEachLazy(lazyArray,func,reversed){return onEach(Array.prototype.slice.call(lazyArray),func,reversed);}function usableLocalStorage(){if(typeof(Storage)==="undefined"){return false;}try{window.localStorage;}catch(err){return false;}return true;}function updateLocalStorage(name,value){if(usableLocalStorage()){localStorage[name]=value;}else{}}function getCurrentValue(name){if(usableLocalStorage()&&localStorage[name]!==undefined){return localStorage[name];}return null;}function switchTheme(styleElem,mainStyleElem,newTheme){var fullBasicCss="rustdoc"+resourcesSuffix+".css";var fullNewTheme=newTheme+resourcesSuffix+".css";var newHref=mainStyleElem.href.replace(fullBasicCss,fullNewTheme);if(styleElem.href===newHref){return;}var found=false;if(savedHref.length===0){onEachLazy(document.getElementsByTagName("link"),function(el){savedHref.push(el.href);});}onEach(savedHref,function(el){if(el===newHref){found=true;return true;}});if(found===true){styleElem.href=newHref;updateLocalStorage("rustdoc-theme",newTheme);}}switchTheme(currentTheme,mainTheme,getCurrentValue("rustdoc-theme")||"light"); \ No newline at end of file